{
  "version": 3,
  "sources": ["bun-bundle-shim:bun:bundle", "../src/utils/crypto.ts", "../src/utils/settings/settingsCache.ts", "../src/utils/signal.ts", "../src/bootstrap/state.ts", "../src/utils/envUtils.ts", "../src/constants/keys.ts", "../src/utils/bufferedWriter.ts", "../src/utils/cleanupRegistry.ts", "../src/utils/debugFilter.ts", "../src/utils/errors.ts", "../src/utils/slowOperations.ts", "../src/utils/fsOperations.ts", "../src/utils/process.ts", "../src/utils/debug.ts", "../src/constants/oauth.ts", "../src/services/analytics/index.ts", "../src/constants/xml.ts", "../src/types/logs.ts", "../src/utils/hash.ts", "../src/utils/cachePaths.ts", "../src/utils/displayTags.ts", "../src/utils/privacyLevel.ts", "../src/utils/log.ts", "../src/utils/sequential.ts", "../src/utils/fileRead.ts", "../src/utils/jsonRead.ts", "../src/services/remoteManagedSettings/syncCacheState.ts", "../src/utils/array.ts", "../src/utils/diagLogs.ts", "../src/utils/cwd.ts", "../src/utils/fileReadCache.ts", "../src/utils/platform.ts", "../src/utils/execSyncWrapper.ts", "../src/utils/memoize.ts", "../src/utils/windowsPaths.ts", "../src/utils/getWorktreePathsPortable.ts", "../src/utils/sessionStoragePortable.ts", "../src/utils/path.ts", "../src/utils/file.ts", "../src/utils/execFileNoThrowPortable.ts", "../src/utils/execFileNoThrow.ts", "../src/constants/files.ts", "../src/utils/git/gitConfigParser.ts", "../src/utils/git/gitFilesystem.ts", "../src/utils/which.ts", "../src/utils/git.ts", "../src/utils/git/gitignore.ts", "../src/utils/json.ts", "../src/utils/intl.ts", "../src/ink/stringWidth.ts", "../src/utils/truncate.ts", "../src/utils/format.ts", "../src/utils/profilerBase.ts", "../src/utils/startupProfiler.ts", "../src/utils/settings/constants.ts", "../src/utils/settings/internalWrites.ts", "../src/utils/settings/managedPath.ts", "../src/utils/lazySchema.ts", "../src/entrypoints/sandboxTypes.ts", "../src/utils/bundledMode.ts", "../src/utils/findExecutable.ts", "../src/utils/env.ts", "../src/constants/figures.ts", "../src/types/permissions.ts", "../src/utils/permissions/PermissionMode.ts", "shim.js", "../src/entrypoints/sdk/coreTypes.ts", "../src/entrypoints/agentSdkTypes.ts", "../src/utils/shell/shellProvider.ts", "../src/schemas/hooks.ts", "../src/services/mcp/types.ts", "../src/utils/plugins/schemas.ts", "../src/services/mcp/normalization.ts", "../src/services/mcp/mcpStringUtils.ts", "../src/tools/AgentTool/constants.ts", "../src/tools/TaskOutputTool/constants.ts", "../src/tools/TaskStopTool/prompt.ts", "../src/tools/BriefTool/prompt.ts", "../src/utils/permissions/permissionRuleParser.ts", "../src/utils/stringUtils.ts", "../src/utils/settings/toolValidationConfig.ts", "../src/utils/settings/permissionValidation.ts", "../src/utils/settings/types.ts", "../src/utils/settings/schemaOutput.ts", "../src/utils/settings/validationTips.ts", "../src/utils/settings/validation.ts", "../src/utils/settings/mdm/constants.ts", "../src/utils/settings/mdm/rawRead.ts", "../src/utils/settings/mdm/settings.ts", "../src/utils/settings/settings.ts", "../src/utils/caCerts.ts", "../src/utils/mtls.ts", "../node_modules/@smithy/types/dist-cjs/index.js", "../node_modules/@smithy/protocol-http/dist-cjs/index.js", "../node_modules/@smithy/util-uri-escape/dist-cjs/index.js", "../node_modules/@smithy/querystring-builder/dist-cjs/index.js", "../node_modules/@smithy/node-http-handler/dist-cjs/index.js", "../node_modules/@aws-sdk/core/dist-es/submodules/client/emitWarningIfUnsupportedVersion.js", "../node_modules/@aws-sdk/core/dist-es/submodules/client/longPollMiddleware.js", "../node_modules/@aws-sdk/core/dist-es/submodules/client/setCredentialFeature.js", "../node_modules/@smithy/service-error-classification/dist-cjs/index.js", "../node_modules/@smithy/util-retry/dist-cjs/index.js", "../node_modules/@aws-sdk/core/dist-es/submodules/client/setFeature.js", "../node_modules/@aws-sdk/core/dist-es/submodules/client/setTokenFeature.js", "../node_modules/@aws-sdk/core/dist-es/submodules/client/index.js", "../node_modules/@smithy/property-provider/dist-cjs/index.js", "../node_modules/@aws-sdk/credential-provider-env/dist-cjs/index.js", "../node_modules/@smithy/shared-ini-file-loader/dist-cjs/getHomeDir.js", "../node_modules/@smithy/shared-ini-file-loader/dist-cjs/getSSOTokenFilepath.js", "../node_modules/@smithy/shared-ini-file-loader/dist-cjs/getSSOTokenFromFile.js", "../node_modules/@smithy/shared-ini-file-loader/dist-cjs/readFile.js", "../node_modules/@smithy/shared-ini-file-loader/dist-cjs/index.js", "../node_modules/@smithy/node-config-provider/dist-cjs/index.js", "../node_modules/@smithy/querystring-parser/dist-cjs/index.js", "../node_modules/@smithy/url-parser/dist-cjs/index.js", "../node_modules/@smithy/credential-provider-imds/dist-cjs/index.js", "../node_modules/tslib/tslib.es6.mjs", "../node_modules/@aws-sdk/credential-provider-http/dist-cjs/fromHttp/checkUrl.js", "../node_modules/@smithy/middleware-stack/dist-cjs/index.js", "../node_modules/@smithy/core/dist-es/submodules/schema/deref.js", "../node_modules/@smithy/util-middleware/dist-cjs/index.js", "../node_modules/@smithy/core/dist-es/submodules/schema/schemas/operation.js", "../node_modules/@smithy/core/dist-es/submodules/schema/middleware/schemaDeserializationMiddleware.js", "../node_modules/@smithy/core/dist-es/submodules/endpoints/toEndpointV1.js", "../node_modules/@smithy/core/dist-es/submodules/endpoints/index.js", "../node_modules/@smithy/core/dist-es/submodules/schema/middleware/schemaSerializationMiddleware.js", "../node_modules/@smithy/core/dist-es/submodules/schema/middleware/getSchemaSerdePlugin.js", "../node_modules/@smithy/core/dist-es/submodules/schema/schemas/Schema.js", "../node_modules/@smithy/core/dist-es/submodules/schema/schemas/ListSchema.js", "../node_modules/@smithy/core/dist-es/submodules/schema/schemas/MapSchema.js", "../node_modules/@smithy/core/dist-es/submodules/schema/schemas/OperationSchema.js", "../node_modules/@smithy/core/dist-es/submodules/schema/schemas/StructureSchema.js", "../node_modules/@smithy/core/dist-es/submodules/schema/schemas/ErrorSchema.js", "../node_modules/@smithy/core/dist-es/submodules/schema/schemas/translateTraits.js", "../node_modules/@smithy/core/dist-es/submodules/schema/schemas/NormalizedSchema.js", "../node_modules/@smithy/core/dist-es/submodules/schema/schemas/SimpleSchema.js", "../node_modules/@smithy/core/dist-es/submodules/schema/schemas/sentinels.js", "../node_modules/@smithy/core/dist-es/submodules/schema/TypeRegistry.js", "../node_modules/@smithy/core/dist-es/submodules/schema/index.js", "../node_modules/@smithy/core/dist-es/submodules/serde/copyDocumentWithTransform.js", "../node_modules/@smithy/core/dist-es/submodules/serde/parse-utils.js", "../node_modules/@smithy/core/dist-es/submodules/serde/date-utils.js", "../node_modules/@smithy/uuid/dist-cjs/randomUUID.js", "../node_modules/@smithy/uuid/dist-cjs/index.js", "../node_modules/@smithy/core/dist-es/submodules/serde/generateIdempotencyToken.js", "../node_modules/@smithy/core/dist-es/submodules/serde/lazy-json.js", "../node_modules/@smithy/core/dist-es/submodules/serde/quote-header.js", "../node_modules/@smithy/core/dist-es/submodules/serde/schema-serde-lib/schema-date-utils.js", "../node_modules/@smithy/core/dist-es/submodules/serde/split-every.js", "../node_modules/@smithy/core/dist-es/submodules/serde/split-header.js", "../node_modules/@smithy/core/dist-es/submodules/serde/value/NumericValue.js", "../node_modules/@smithy/core/dist-es/submodules/serde/index.js", "../node_modules/@smithy/is-array-buffer/dist-cjs/index.js", "../node_modules/@smithy/util-buffer-from/dist-cjs/index.js", "../node_modules/@smithy/util-base64/dist-cjs/fromBase64.js", "../node_modules/@smithy/util-utf8/dist-cjs/index.js", "../node_modules/@smithy/util-base64/dist-cjs/toBase64.js", "../node_modules/@smithy/util-base64/dist-cjs/index.js", "../node_modules/@smithy/util-stream/dist-cjs/checksum/ChecksumStream.js", "../node_modules/@smithy/util-stream/dist-cjs/stream-type-check.js", "../node_modules/@smithy/util-stream/dist-cjs/checksum/ChecksumStream.browser.js", "../node_modules/@smithy/util-stream/dist-cjs/checksum/createChecksumStream.browser.js", "../node_modules/@smithy/util-stream/dist-cjs/checksum/createChecksumStream.js", "../node_modules/@smithy/util-stream/dist-cjs/ByteArrayCollector.js", "../node_modules/@smithy/util-stream/dist-cjs/createBufferedReadableStream.js", "../node_modules/@smithy/util-stream/dist-cjs/createBufferedReadable.js", "../node_modules/@smithy/util-stream/dist-cjs/getAwsChunkedEncodingStream.browser.js", "../node_modules/@smithy/util-stream/dist-cjs/getAwsChunkedEncodingStream.js", "../node_modules/@smithy/util-stream/dist-cjs/headStream.browser.js", "../node_modules/@smithy/util-stream/dist-cjs/headStream.js", "../node_modules/@smithy/fetch-http-handler/dist-cjs/index.js", "../node_modules/@smithy/util-hex-encoding/dist-cjs/index.js", "../node_modules/@smithy/util-stream/dist-cjs/sdk-stream-mixin.browser.js", "../node_modules/@smithy/util-stream/dist-cjs/sdk-stream-mixin.js", "../node_modules/@smithy/util-stream/dist-cjs/splitStream.browser.js", "../node_modules/@smithy/util-stream/dist-cjs/splitStream.js", "../node_modules/@smithy/util-stream/dist-cjs/index.js", "../node_modules/@smithy/core/dist-es/submodules/protocols/collect-stream-body.js", "../node_modules/@smithy/core/dist-es/submodules/protocols/extended-encode-uri-component.js", "../node_modules/@smithy/core/dist-es/submodules/protocols/SerdeContext.js", "../node_modules/@smithy/core/dist-es/submodules/event-streams/EventStreamSerde.js", "../node_modules/@smithy/core/dist-es/submodules/event-streams/index.js", "../node_modules/@smithy/core/dist-es/submodules/protocols/HttpProtocol.js", "../node_modules/@smithy/core/dist-es/submodules/protocols/HttpBindingProtocol.js", "../node_modules/@smithy/core/dist-es/submodules/protocols/RpcProtocol.js", "../node_modules/@smithy/core/dist-es/submodules/protocols/resolve-path.js", "../node_modules/@smithy/core/dist-es/submodules/protocols/requestBuilder.js", "../node_modules/@smithy/core/dist-es/submodules/protocols/serde/determineTimestampFormat.js", "../node_modules/@smithy/core/dist-es/submodules/protocols/serde/FromStringShapeDeserializer.js", "../node_modules/@smithy/core/dist-es/submodules/protocols/serde/HttpInterceptingShapeDeserializer.js", "../node_modules/@smithy/core/dist-es/submodules/protocols/serde/ToStringShapeSerializer.js", "../node_modules/@smithy/core/dist-es/submodules/protocols/serde/HttpInterceptingShapeSerializer.js", "../node_modules/@smithy/core/dist-es/submodules/protocols/index.js", "../node_modules/@smithy/smithy-client/dist-cjs/index.js", "../node_modules/@aws-sdk/credential-provider-http/dist-cjs/fromHttp/requestHelpers.js", "../node_modules/@aws-sdk/credential-provider-http/dist-cjs/fromHttp/retry-wrapper.js", "../node_modules/@aws-sdk/credential-provider-http/dist-cjs/fromHttp/fromHttp.js", "../node_modules/@aws-sdk/credential-provider-http/dist-cjs/index.js", "../node_modules/@aws-sdk/core/dist-es/submodules/httpAuthSchemes/utils/getDateHeader.js", "../node_modules/@aws-sdk/core/dist-es/submodules/httpAuthSchemes/utils/getSkewCorrectedDate.js", "../node_modules/@aws-sdk/core/dist-es/submodules/httpAuthSchemes/utils/isClockSkewed.js", "../node_modules/@aws-sdk/core/dist-es/submodules/httpAuthSchemes/utils/getUpdatedSystemClockOffset.js", "../node_modules/@aws-sdk/core/dist-es/submodules/httpAuthSchemes/utils/index.js", "../node_modules/@aws-sdk/core/dist-es/submodules/httpAuthSchemes/aws_sdk/AwsSdkSigV4Signer.js", "../node_modules/@aws-sdk/core/dist-es/submodules/httpAuthSchemes/aws_sdk/AwsSdkSigV4ASigner.js", "../node_modules/@aws-sdk/core/dist-es/submodules/httpAuthSchemes/utils/getArrayForCommaSeparatedString.js", "../node_modules/@aws-sdk/core/dist-es/submodules/httpAuthSchemes/utils/getBearerTokenEnvKey.js", "../node_modules/@aws-sdk/core/dist-es/submodules/httpAuthSchemes/aws_sdk/NODE_AUTH_SCHEME_PREFERENCE_OPTIONS.js", "../node_modules/@smithy/core/dist-es/getSmithyContext.js", "../node_modules/@smithy/core/dist-es/middleware-http-auth-scheme/resolveAuthOptions.js", "../node_modules/@smithy/core/dist-es/middleware-http-auth-scheme/httpAuthSchemeMiddleware.js", "../node_modules/@smithy/core/dist-es/middleware-http-auth-scheme/getHttpAuthSchemeEndpointRuleSetPlugin.js", "../node_modules/@smithy/core/dist-es/middleware-http-auth-scheme/getHttpAuthSchemePlugin.js", "../node_modules/@smithy/core/dist-es/middleware-http-auth-scheme/index.js", "../node_modules/@smithy/core/dist-es/middleware-http-signing/httpSigningMiddleware.js", "../node_modules/@smithy/core/dist-es/middleware-http-signing/getHttpSigningMiddleware.js", "../node_modules/@smithy/core/dist-es/middleware-http-signing/index.js", "../node_modules/@smithy/core/dist-es/normalizeProvider.js", "../node_modules/@smithy/core/dist-es/pagination/createPaginator.js", "../node_modules/@smithy/core/dist-es/request-builder/requestBuilder.js", "../node_modules/@smithy/core/dist-es/setFeature.js", "../node_modules/@smithy/core/dist-es/util-identity-and-auth/DefaultIdentityProviderConfig.js", "../node_modules/@smithy/core/dist-es/util-identity-and-auth/httpAuthSchemes/httpApiKeyAuth.js", "../node_modules/@smithy/core/dist-es/util-identity-and-auth/httpAuthSchemes/httpBearerAuth.js", "../node_modules/@smithy/core/dist-es/util-identity-and-auth/httpAuthSchemes/noAuth.js", "../node_modules/@smithy/core/dist-es/util-identity-and-auth/httpAuthSchemes/index.js", "../node_modules/@smithy/core/dist-es/util-identity-and-auth/memoizeIdentityProvider.js", "../node_modules/@smithy/core/dist-es/util-identity-and-auth/index.js", "../node_modules/@smithy/core/dist-es/index.js", "../node_modules/@aws-sdk/core/dist-es/submodules/httpAuthSchemes/aws_sdk/resolveAwsSdkSigV4AConfig.js", "../node_modules/@smithy/signature-v4/dist-cjs/index.js", "../node_modules/@aws-sdk/core/dist-es/submodules/httpAuthSchemes/aws_sdk/resolveAwsSdkSigV4Config.js", "../node_modules/@aws-sdk/core/dist-es/submodules/httpAuthSchemes/aws_sdk/index.js", "../node_modules/@aws-sdk/core/dist-es/submodules/httpAuthSchemes/index.js", "../node_modules/@aws-sdk/middleware-host-header/dist-cjs/index.js", "../node_modules/@aws-sdk/middleware-logger/dist-cjs/index.js", "../node_modules/@aws/lambda-invoke-store/dist-es/invoke-store.js", "../node_modules/@aws-sdk/middleware-recursion-detection/dist-cjs/recursionDetectionMiddleware.js", "../node_modules/@aws-sdk/middleware-recursion-detection/dist-cjs/index.js", "../node_modules/@smithy/util-endpoints/dist-cjs/index.js", "../node_modules/@aws-sdk/util-endpoints/dist-cjs/index.js", "../node_modules/@aws-sdk/middleware-user-agent/dist-cjs/index.js", "../node_modules/@smithy/util-config-provider/dist-cjs/index.js", "../node_modules/@smithy/config-resolver/dist-cjs/index.js", "../node_modules/@smithy/middleware-content-length/dist-cjs/index.js", "../node_modules/@smithy/middleware-endpoint/dist-cjs/adaptors/getEndpointUrlConfig.js", "../node_modules/@smithy/middleware-endpoint/dist-cjs/adaptors/getEndpointFromConfig.js", "../node_modules/@smithy/middleware-serde/dist-cjs/index.js", "../node_modules/@smithy/middleware-endpoint/dist-cjs/index.js", "../node_modules/@smithy/middleware-retry/dist-cjs/isStreamingPayload/isStreamingPayload.js", "../node_modules/@smithy/middleware-retry/dist-cjs/index.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso-oidc/auth/httpAuthSchemeProvider.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso-oidc/endpoint/EndpointParameters.js", "../node_modules/@aws-sdk/nested-clients/package.json", "../node_modules/@aws-sdk/util-user-agent-node/dist-cjs/index.js", "../node_modules/@smithy/hash-node/dist-cjs/index.js", "../node_modules/@smithy/util-body-length-node/dist-cjs/index.js", "../node_modules/@smithy/util-defaults-mode-node/dist-cjs/index.js", "../node_modules/@smithy/core/dist-es/submodules/cbor/cbor-types.js", "../node_modules/@smithy/core/dist-es/submodules/cbor/cbor-decode.js", "../node_modules/@smithy/core/dist-es/submodules/cbor/cbor-encode.js", "../node_modules/@smithy/core/dist-es/submodules/cbor/cbor.js", "../node_modules/@smithy/core/dist-es/submodules/cbor/parseCborBody.js", "../node_modules/@smithy/core/dist-es/submodules/cbor/CborCodec.js", "../node_modules/@smithy/core/dist-es/submodules/cbor/SmithyRpcV2CborProtocol.js", "../node_modules/@smithy/core/dist-es/submodules/cbor/index.js", "../node_modules/@aws-sdk/core/dist-es/submodules/protocols/ProtocolLib.js", "../node_modules/@aws-sdk/core/dist-es/submodules/protocols/cbor/AwsSmithyRpcV2CborProtocol.js", "../node_modules/@aws-sdk/core/dist-es/submodules/protocols/coercing-serializers.js", "../node_modules/@aws-sdk/core/dist-es/submodules/protocols/ConfigurableSerdeContext.js", "../node_modules/@aws-sdk/core/dist-es/submodules/protocols/UnionSerde.js", "../node_modules/@aws-sdk/core/dist-es/submodules/protocols/json/jsonReviver.js", "../node_modules/@aws-sdk/core/dist-es/submodules/protocols/common.js", "../node_modules/@aws-sdk/core/dist-es/submodules/protocols/json/parseJsonBody.js", "../node_modules/@aws-sdk/core/dist-es/submodules/protocols/json/JsonShapeDeserializer.js", "../node_modules/@aws-sdk/core/dist-es/submodules/protocols/json/jsonReplacer.js", "../node_modules/@aws-sdk/core/dist-es/submodules/protocols/json/JsonShapeSerializer.js", "../node_modules/@aws-sdk/core/dist-es/submodules/protocols/json/JsonCodec.js", "../node_modules/@aws-sdk/core/dist-es/submodules/protocols/json/AwsJsonRpcProtocol.js", "../node_modules/@aws-sdk/core/dist-es/submodules/protocols/json/AwsJson1_0Protocol.js", "../node_modules/@aws-sdk/core/dist-es/submodules/protocols/json/AwsJson1_1Protocol.js", "../node_modules/@aws-sdk/core/dist-es/submodules/protocols/json/AwsRestJsonProtocol.js", "../node_modules/@aws-sdk/core/dist-es/submodules/protocols/json/awsExpectUnion.js", "../node_modules/fast-xml-parser/lib/fxp.cjs", "../node_modules/@aws-sdk/xml-builder/dist-cjs/xml-parser.js", "../node_modules/@aws-sdk/xml-builder/dist-cjs/index.js", "../node_modules/@aws-sdk/core/dist-es/submodules/protocols/xml/XmlShapeDeserializer.js", "../node_modules/@aws-sdk/core/dist-es/submodules/protocols/query/QueryShapeSerializer.js", "../node_modules/@aws-sdk/core/dist-es/submodules/protocols/query/AwsQueryProtocol.js", "../node_modules/@aws-sdk/core/dist-es/submodules/protocols/query/AwsEc2QueryProtocol.js", "../node_modules/@aws-sdk/core/dist-es/submodules/protocols/query/QuerySerializerSettings.js", "../node_modules/@aws-sdk/core/dist-es/submodules/protocols/xml/parseXmlBody.js", "../node_modules/@aws-sdk/core/dist-es/submodules/protocols/xml/XmlShapeSerializer.js", "../node_modules/@aws-sdk/core/dist-es/submodules/protocols/xml/XmlCodec.js", "../node_modules/@aws-sdk/core/dist-es/submodules/protocols/xml/AwsRestXmlProtocol.js", "../node_modules/@aws-sdk/core/dist-es/submodules/protocols/index.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso-oidc/endpoint/bdd.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso-oidc/endpoint/endpointResolver.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso-oidc/models/SSOOIDCServiceException.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso-oidc/models/errors.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso-oidc/schemas/schemas_0.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso-oidc/runtimeConfig.shared.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso-oidc/runtimeConfig.js", "../node_modules/@aws-sdk/region-config-resolver/dist-cjs/regionConfig/stsRegionDefaultResolver.js", "../node_modules/@aws-sdk/region-config-resolver/dist-cjs/index.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso-oidc/auth/httpAuthExtensionConfiguration.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso-oidc/runtimeExtensions.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso-oidc/SSOOIDCClient.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso-oidc/commands/CreateTokenCommand.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso-oidc/SSOOIDC.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso-oidc/commands/index.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso-oidc/models/enums.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso-oidc/models/models_0.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso-oidc/index.js", "../node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/token-providers/dist-cjs/index.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/auth/httpAuthSchemeProvider.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/endpoint/EndpointParameters.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/endpoint/bdd.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/endpoint/endpointResolver.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/models/SSOServiceException.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/models/errors.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/schemas/schemas_0.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/runtimeConfig.shared.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/runtimeConfig.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/auth/httpAuthExtensionConfiguration.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/runtimeExtensions.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/SSOClient.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/commands/GetRoleCredentialsCommand.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/SSO.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/commands/index.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/models/models_0.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/index.js", "../node_modules/@aws-sdk/credential-provider-sso/dist-cjs/loadSso-BKDNrsal.js", "../node_modules/@aws-sdk/credential-provider-sso/dist-cjs/index.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/signin/auth/httpAuthSchemeProvider.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/signin/endpoint/EndpointParameters.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/signin/endpoint/bdd.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/signin/endpoint/endpointResolver.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/signin/models/SigninServiceException.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/signin/models/errors.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/signin/schemas/schemas_0.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/signin/runtimeConfig.shared.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/signin/runtimeConfig.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/signin/auth/httpAuthExtensionConfiguration.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/signin/runtimeExtensions.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/signin/SigninClient.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/signin/commands/CreateOAuth2TokenCommand.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/signin/Signin.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/signin/commands/index.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/signin/models/enums.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/signin/models/models_0.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/signin/index.js", "../node_modules/@aws-sdk/credential-provider-login/dist-cjs/index.js", "../node_modules/@aws-sdk/middleware-sdk-s3/dist-cjs/toStream.js", "../node_modules/@aws-sdk/util-arn-parser/dist-cjs/index.js", "../node_modules/@aws-sdk/middleware-sdk-s3/dist-cjs/index.js", "../node_modules/@aws-sdk/signature-v4-multi-region/dist-cjs/index.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sts/endpoint/bdd.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sts/endpoint/endpointResolver.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sts/auth/httpAuthSchemeProvider.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sts/endpoint/EndpointParameters.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sts/models/STSServiceException.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sts/models/errors.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sts/schemas/schemas_0.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sts/runtimeConfig.shared.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sts/runtimeConfig.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sts/auth/httpAuthExtensionConfiguration.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sts/runtimeExtensions.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sts/STSClient.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sts/commands/AssumeRoleCommand.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sts/commands/AssumeRoleWithWebIdentityCommand.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sts/STS.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sts/commands/index.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sts/models/models_0.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sts/defaultStsRoleAssumers.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sts/defaultRoleAssumers.js", "../node_modules/@aws-sdk/nested-clients/dist-es/submodules/sts/index.js", "../node_modules/@aws-sdk/credential-provider-process/dist-cjs/index.js", "../node_modules/@aws-sdk/credential-provider-web-identity/dist-cjs/fromWebToken.js", "../node_modules/@aws-sdk/credential-provider-web-identity/dist-cjs/fromTokenFile.js", "../node_modules/@aws-sdk/credential-provider-web-identity/dist-cjs/index.js", "../node_modules/@aws-sdk/credential-provider-ini/dist-cjs/index.js", "../node_modules/@aws-sdk/credential-provider-node/dist-cjs/index.js", "../src/utils/proxy.ts", "../src/utils/model/bedrock.ts", "../src/utils/opencodeAuth.ts", "../src/utils/browser.ts", "../src/services/api/auth/openai_oauth.ts", "../src/services/api/auth/oauth_services.ts", "../src/services/api/providers/base_provider.ts", "../src/services/api/adapters/tool_schema_cache.ts", "../src/services/api/adapters/anthropic_to_openai.ts", "../src/services/api/adapters/openai_to_anthropic.ts", "../src/services/api/adapters/openai_responses.ts", "../src/utils/model/openaiReasoning.ts", "../src/services/api/providers/openai_provider.ts", "../src/utils/model/commandCodeThinking.ts", "../src/services/api/providers/commandcode_provider.ts", "../src/services/api/adapters/gemini_thought_cache.ts", "../src/services/api/adapters/anthropic_to_gemini.ts", "../src/services/api/adapters/gemini_to_anthropic.ts", "../src/constants/antigravity.ts", "../src/services/api/providers/gemini_code_assist.ts", "../src/services/api/providers/gemini_cache.ts", "../src/services/api/providers/gemini_provider.ts", "../src/utils/model/openrouterCatalog.ts", "../src/services/api/providers/openrouter_provider.ts", "../src/services/api/providers/groq_provider.ts", "../src/utils/model/nim_catalog.ts", "../src/services/api/providers/nim_provider.ts", "../src/services/api/providers/deepseek_provider.ts", "../src/services/api/providers/glm_provider.ts", "../src/utils/model/moonshotCatalog.ts", "../src/services/api/providers/moonshot_provider.ts", "../src/services/api/providers/minimax_provider.ts", "../src/utils/model/ollamaCatalog.ts", "../src/services/api/providers/ollama_provider.ts", "../src/services/api/providers/sanitizeProviderMessages.ts", "../src/lanes/dispatcher.ts", "../src/lanes/bridge.ts", "../src/lanes/provider-bridge.ts", "../src/constants/common.ts", "../src/tools/WebSearchTool/prompt.ts", "../src/lanes/gemini/tools.ts", "../src/lanes/gemini/quota.ts", "../src/lanes/shared/health_score.ts", "../src/lanes/gemini/rotation.ts", "../src/lanes/gemini/api_sse.ts", "../src/lanes/shared/antigravity_auth.ts", "../src/services/api/auth/google_oauth.ts", "../src/lanes/gemini/api.ts", "../src/lanes/shared/mcp_bridge.ts", "../src/lanes/gemini/loop.ts", "../src/lanes/shared/system_slots.ts", "../src/lanes/gemini/prompt.ts", "../src/lanes/gemini/index.ts", "../src/lanes/shared/apply_patch.ts", "../src/lanes/codex/tools.ts", "../src/lanes/codex/api.ts", "../src/lanes/codex/loop.ts", "../src/lanes/codex/prompt.ts", "../src/lanes/codex/index.ts", "../src/lanes/openai-compat/tools.ts", "../src/lanes/openai-compat/shell_descriptions.ts", "../src/lanes/openai-compat/single_shell.ts", "../src/utils/shell/powershellDetection.ts", "../src/utils/model/deepseekThinking.ts", "../src/lanes/openai-compat/transformers/deepseek.ts", "../src/lanes/openai-compat/transformers/groq.ts", "../src/utils/model/glmThinking.ts", "../src/lanes/openai-compat/transformers/glm.ts", "../src/lanes/openai-compat/transformers/moonshot.ts", "../src/lanes/openai-compat/transformers/minimax.ts", "../src/lanes/openai-compat/transformers/mistral.ts", "../src/lanes/openai-compat/transformers/nim.ts", "../src/lanes/openai-compat/transformers/ollama.ts", "../src/lanes/openai-compat/transformers/lmstudio.ts", "../src/lanes/openai-compat/transformers/openrouter.ts", "../src/lanes/openai-compat/transformers/agentrouter.ts", "../src/lanes/openai-compat/transformers/modelrouter.ts", "../src/lanes/openai-compat/transformers/vercel.ts", "../src/lanes/openai-compat/transformers/requesty.ts", "../src/utils/model/opencodeThinking.ts", "../src/lanes/openai-compat/transformers/opencode.ts", "../src/utils/model/clineThinking.ts", "../src/lanes/openai-compat/transformers/cline.ts", "../src/lanes/openai-compat/transformers/iflow.ts", "../src/lanes/openai-compat/transformers/kilocode.ts", "../src/utils/model/copilotAccount.ts", "../src/lanes/openai-compat/transformers/copilot.ts", "../src/lanes/openai-compat/transformers/generic.ts", "../src/lanes/openai-compat/transformers/index.ts", "../src/utils/model/contextWindows.ts", "../src/lanes/openai-compat/loop.ts", "../src/lanes/openai-compat/prompt.ts", "../src/lanes/openai-compat/index.ts", "../src/lanes/qwen/tools.ts", "../src/lanes/qwen/oauth.ts", "../src/lanes/qwen/token_manager.ts", "../src/lanes/qwen/api.ts", "../src/lanes/qwen/loop.ts", "../src/lanes/qwen/prompt.ts", "../src/lanes/qwen/index.ts", "../src/lanes/claude/loop.ts", "../src/lanes/claude/index.ts", "../src/lanes/kiro/eventstream.ts", "../src/lanes/kiro/catalog.ts", "../src/lanes/kiro/tool_names.ts", "../src/lanes/kiro/payload_guards.ts", "../src/lanes/kiro/request.ts", "../src/lanes/kiro/loop.ts", "../src/lanes/kiro/index.ts", "../src/lanes/cursor/protobuf.ts", "../src/lanes/cursor/tools.ts", "../src/lanes/cursor/request.ts", "../src/lanes/cursor/checksum.ts", "../src/lanes/cursor/catalog.ts", "../src/lanes/cursor/loop.ts", "../src/lanes/cursor/index.ts", "../src/lanes/cline/loop.ts", "../src/lanes/cline/index.ts", "../src/lanes/kilo/catalog.ts", "../src/lanes/kilo/cache.ts", "../src/lanes/kilo/tool_args.ts", "../src/lanes/kilo/loop.ts", "../src/lanes/kilo/index.ts", "../src/lanes/index.ts", "../src/services/api/providers/providerShim.ts", "../src/services/api/auth/api_key_manager.ts", "../src/utils/model/configs.ts", "../src/utils/forcedProvider.ts", "../src/constants/betas.ts", "../src/services/api/client.ts", "../src/utils/model/modelCapabilities.ts", "../src/utils/context.ts", "../src/utils/fastMode.ts", "../src/utils/modelCost.ts", "../src/utils/model/aliases.ts", "../src/utils/model/modelAllowlist.ts", "../src/utils/model/model.ts", "../src/utils/model/providerDisplayNames.ts", "../src/utils/model/display.ts", "../src/utils/teamMode/state.ts", "../src/utils/model/providers.ts", "../src/utils/model/modelStrings.ts", "../src/utils/billing.ts", "../src/services/mockRateLimits.ts", "../src/services/oauth/getOauthProfile.ts", "../src/services/oauth/client.ts", "../src/utils/authFileDescriptor.ts", "../src/utils/secureStorage/macOsKeychainHelpers.ts", "../src/utils/authPortable.ts", "../src/utils/aws.ts", "../src/utils/awsAuthStatusManager.ts", "../src/utils/model/modelSupportOverrides.ts", "../src/utils/betas.ts", "../src/utils/lockfile.ts", "../src/utils/secureStorage/fallbackStorage.ts", "../src/utils/secureStorage/macOsKeychainStorage.ts", "../src/utils/secureStorage/plainTextStorage.ts", "../src/utils/secureStorage/index.ts", "../src/utils/secureStorage/keychainPrefetch.ts", "../src/utils/sleep.ts", "../src/utils/toolSchemaCache.ts", "../node_modules/extend/index.js", "../node_modules/webidl-conversions/lib/index.js", "../node_modules/whatwg-url/lib/utils.js", "../node_modules/tr46/lib/mappingTable.json", "../node_modules/tr46/index.js", "../node_modules/whatwg-url/lib/url-state-machine.js", "../node_modules/whatwg-url/lib/URL-impl.js", "../node_modules/whatwg-url/lib/URL.js", "../node_modules/whatwg-url/lib/public-api.js", "../node_modules/node-fetch/lib/index.js", "../node_modules/gaxios/node_modules/is-stream/index.js", "../node_modules/gaxios/package.json", "../node_modules/gaxios/src/util.ts", "../node_modules/gaxios/src/common.ts", "../node_modules/gaxios/src/retry.ts", "../node_modules/uuid/dist/cjs/max.js", "../node_modules/uuid/dist/cjs/nil.js", "../node_modules/uuid/dist/cjs/regex.js", "../node_modules/uuid/dist/cjs/validate.js", "../node_modules/uuid/dist/cjs/parse.js", "../node_modules/uuid/dist/cjs/stringify.js", "../node_modules/uuid/dist/cjs/rng.js", "../node_modules/uuid/dist/cjs/v1.js", "../node_modules/uuid/dist/cjs/v1ToV6.js", "../node_modules/uuid/dist/cjs/md5.js", "../node_modules/uuid/dist/cjs/v35.js", "../node_modules/uuid/dist/cjs/v3.js", "../node_modules/uuid/dist/cjs/native.js", "../node_modules/uuid/dist/cjs/v4.js", "../node_modules/uuid/dist/cjs/sha1.js", "../node_modules/uuid/dist/cjs/v5.js", "../node_modules/uuid/dist/cjs/v6.js", "../node_modules/uuid/dist/cjs/v6ToV1.js", "../node_modules/uuid/dist/cjs/v7.js", "../node_modules/uuid/dist/cjs/version.js", "../node_modules/uuid/dist/cjs/index.js", "../node_modules/gaxios/src/interceptor.ts", "../node_modules/gaxios/src/gaxios.ts", "../node_modules/gaxios/src/index.ts", "../node_modules/bignumber.js/bignumber.js", "../node_modules/json-bigint/lib/stringify.js", "../node_modules/json-bigint/lib/parse.js", "../node_modules/json-bigint/index.js", "../node_modules/gcp-metadata/src/gcp-residency.ts", "../node_modules/google-logging-utils/src/colours.ts", "../node_modules/google-logging-utils/src/logging-utils.ts", "../node_modules/google-logging-utils/src/index.ts", "../node_modules/gcp-metadata/src/index.ts", "../node_modules/base64-js/index.js", "../node_modules/google-auth-library/build/src/crypto/browser/crypto.js", "../node_modules/google-auth-library/build/src/crypto/node/crypto.js", "../node_modules/google-auth-library/build/src/crypto/crypto.js", "../node_modules/google-auth-library/build/src/options.js", "../node_modules/google-auth-library/package.json", "../node_modules/google-auth-library/build/src/transporters.js", "../node_modules/safe-buffer/index.js", "../node_modules/ecdsa-sig-formatter/src/param-bytes-for-alg.js", "../node_modules/ecdsa-sig-formatter/src/ecdsa-sig-formatter.js", "../node_modules/google-auth-library/build/src/util.js", "../node_modules/google-auth-library/build/src/auth/authclient.js", "../node_modules/google-auth-library/build/src/auth/loginticket.js", "../node_modules/google-auth-library/build/src/auth/oauth2client.js", "../node_modules/google-auth-library/build/src/auth/computeclient.js", "../node_modules/google-auth-library/build/src/auth/idtokenclient.js", "../node_modules/google-auth-library/build/src/auth/envDetect.js", "../node_modules/jws/lib/data-stream.js", "../node_modules/buffer-equal-constant-time/index.js", "../node_modules/jwa/index.js", "../node_modules/jws/lib/tostring.js", "../node_modules/jws/lib/sign-stream.js", "../node_modules/jws/lib/verify-stream.js", "../node_modules/jws/index.js", "../node_modules/gtoken/build/src/index.js", "../node_modules/google-auth-library/build/src/auth/jwtaccess.js", "../node_modules/google-auth-library/build/src/auth/jwtclient.js", "../node_modules/google-auth-library/build/src/auth/refreshclient.js", "../node_modules/google-auth-library/build/src/auth/impersonated.js", "../node_modules/google-auth-library/build/src/auth/oauth2common.js", "../node_modules/google-auth-library/build/src/auth/stscredentials.js", "../node_modules/google-auth-library/build/src/auth/baseexternalclient.js", "../node_modules/google-auth-library/build/src/auth/filesubjecttokensupplier.js", "../node_modules/google-auth-library/build/src/auth/urlsubjecttokensupplier.js", "../node_modules/google-auth-library/build/src/auth/identitypoolclient.js", "../node_modules/google-auth-library/build/src/auth/awsrequestsigner.js", "../node_modules/google-auth-library/build/src/auth/defaultawssecuritycredentialssupplier.js", "../node_modules/google-auth-library/build/src/auth/awsclient.js", "../node_modules/google-auth-library/build/src/auth/executable-response.js", "../node_modules/google-auth-library/build/src/auth/pluggable-auth-handler.js", "../node_modules/google-auth-library/build/src/auth/pluggable-auth-client.js", "../node_modules/google-auth-library/build/src/auth/externalclient.js", "../node_modules/google-auth-library/build/src/auth/externalAccountAuthorizedUserClient.js", "../node_modules/google-auth-library/build/src/auth/googleauth.js", "../node_modules/google-auth-library/build/src/auth/iam.js", "../node_modules/google-auth-library/build/src/auth/downscopedclient.js", "../node_modules/google-auth-library/build/src/auth/passthrough.js", "../node_modules/google-auth-library/build/src/index.js", "../src/utils/auth.ts", "../src/utils/userAgent.ts", "../src/utils/workloadContext.ts", "../src/utils/http.ts", "../src/utils/user.ts", "../src/services/analytics/config.ts", "../src/types/generated/google/protobuf/timestamp.ts", "../src/types/generated/events_mono/common/v1/auth.ts", "../src/types/generated/events_mono/claude_code/v1/claude_code_internal_event.ts", "../src/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.ts", "../src/utils/genericProcessUtils.ts", "../src/utils/envDynamic.ts", "../src/services/mcp/officialRegistry.ts", "../src/utils/agentSwarmsEnabled.ts", "../src/utils/agentContext.ts", "../src/utils/teammateContext.ts", "../src/utils/teammate.ts", "../src/utils/computerUse/common.ts", "../src/services/analytics/metadata.ts", "../src/services/analytics/firstPartyEventLoggingExporter.ts", "../src/services/analytics/sinkKillswitch.ts", "../src/services/analytics/firstPartyEventLogger.ts", "../src/services/analytics/growthbook.ts", "../src/memdir/paths.ts", "../src/utils/configConstants.ts", "../src/memdir/teamMemPaths.ts", "../src/utils/semver.ts", "../src/bridge/bridgeEnabled.ts", "../src/utils/config.ts", "../src/office/server.ts", "../src/office/dashboardHtml.ts", "../src/office/state.ts", "../src/utils/teamMode/runtime.ts", "../src/entrypoints/tau-office.ts"],
  "sourcesContent": ["export function feature(_name) { return false; }", "// Indirection point for the package.json \"browser\" field. When bun builds\n// browser-sdk.js with --target browser, this file is swapped for\n// crypto.browser.ts \u2014 avoiding a ~500KB crypto-browserify polyfill that Bun\n// would otherwise inline for `import ... from 'crypto'`. Node/bun builds use\n// this file unchanged.\n//\n// NOTE: `export { randomUUID } from 'crypto'` (re-export syntax) breaks under\n// bun-internal's bytecode compilation \u2014 the generated bytecode shows the\n// import but the binding doesn't link (`ReferenceError: randomUUID is not\n// defined`). The explicit import-then-export below produces a correct live\n// binding. See integration-tests-ant-native failure on PR #20957/#21178.\nimport { randomUUID } from 'crypto'\nexport { randomUUID }\n", "import type { SettingSource } from './constants.js'\nimport type { SettingsJson } from './types.js'\nimport type { SettingsWithErrors, ValidationError } from './validation.js'\n\nlet sessionSettingsCache: SettingsWithErrors | null = null\n\nexport function getSessionSettingsCache(): SettingsWithErrors | null {\n  return sessionSettingsCache\n}\n\nexport function setSessionSettingsCache(value: SettingsWithErrors): void {\n  sessionSettingsCache = value\n}\n\n/**\n * Per-source cache for getSettingsForSource. Invalidated alongside the\n * merged sessionSettingsCache \u2014 same resetSettingsCache() triggers\n * (settings write, --add-dir, plugin init, hooks refresh).\n */\nconst perSourceCache = new Map<SettingSource, SettingsJson | null>()\n\nexport function getCachedSettingsForSource(\n  source: SettingSource,\n): SettingsJson | null | undefined {\n  // undefined = cache miss; null = cached \"no settings for this source\"\n  return perSourceCache.has(source) ? perSourceCache.get(source) : undefined\n}\n\nexport function setCachedSettingsForSource(\n  source: SettingSource,\n  value: SettingsJson | null,\n): void {\n  perSourceCache.set(source, value)\n}\n\n/**\n * Path-keyed cache for parseSettingsFile. Both getSettingsForSource and\n * loadSettingsFromDisk call parseSettingsFile on the same paths during\n * startup \u2014 this dedupes the disk read + zod parse.\n */\ntype ParsedSettings = {\n  settings: SettingsJson | null\n  errors: ValidationError[]\n}\nconst parseFileCache = new Map<string, ParsedSettings>()\n\nexport function getCachedParsedFile(path: string): ParsedSettings | undefined {\n  return parseFileCache.get(path)\n}\n\nexport function setCachedParsedFile(path: string, value: ParsedSettings): void {\n  parseFileCache.set(path, value)\n}\n\nexport function resetSettingsCache(): void {\n  sessionSettingsCache = null\n  perSourceCache.clear()\n  parseFileCache.clear()\n}\n\n/**\n * Plugin settings base layer for the settings cascade.\n * pluginLoader writes here after loading plugins;\n * loadSettingsFromDisk reads it as the lowest-priority base.\n */\nlet pluginSettingsBase: Record<string, unknown> | undefined\n\nexport function getPluginSettingsBase(): Record<string, unknown> | undefined {\n  return pluginSettingsBase\n}\n\nexport function setPluginSettingsBase(\n  settings: Record<string, unknown> | undefined,\n): void {\n  pluginSettingsBase = settings\n}\n\nexport function clearPluginSettingsBase(): void {\n  pluginSettingsBase = undefined\n}\n", "/**\n * Tiny listener-set primitive for pure event signals (no stored state).\n *\n * Collapses the ~8-line `const listeners = new Set(); function subscribe(){\u2026};\n * function notify(){for(const l of listeners) l()}` boilerplate that was\n * duplicated ~15\u00D7 across the codebase into a one-liner.\n *\n * Distinct from a store (AppState, createStore) \u2014 there is no snapshot, no\n * getState. Use this when subscribers only need to know \"something happened\",\n * optionally with event args, not \"what is the current value\".\n *\n * Usage:\n *   const changed = createSignal<[SettingSource]>()\n *   export const subscribe = changed.subscribe\n *   // later: changed.emit('userSettings')\n */\n\nexport type Signal<Args extends unknown[] = []> = {\n  /** Subscribe a listener. Returns an unsubscribe function. */\n  subscribe: (listener: (...args: Args) => void) => () => void\n  /** Call all subscribed listeners with the given arguments. */\n  emit: (...args: Args) => void\n  /** Remove all listeners. Useful in dispose/reset paths. */\n  clear: () => void\n}\n\nexport function createSignal<Args extends unknown[] = []>(): Signal<Args> {\n  const listeners = new Set<(...args: Args) => void>()\n  return {\n    subscribe(listener) {\n      listeners.add(listener)\n      return () => {\n        listeners.delete(listener)\n      }\n    },\n    emit(...args) {\n      for (const listener of listeners) listener(...args)\n    },\n    clear() {\n      listeners.clear()\n    },\n  }\n}\n", "import type { BetaMessageStreamParams } from '@anthropic-ai/sdk/resources/beta/messages/messages.mjs'\nimport type { Attributes, Meter, MetricOptions } from '@opentelemetry/api'\nimport type { logs } from '@opentelemetry/api-logs'\nimport type { LoggerProvider } from '@opentelemetry/sdk-logs'\nimport type { MeterProvider } from '@opentelemetry/sdk-metrics'\nimport type { BasicTracerProvider } from '@opentelemetry/sdk-trace-base'\nimport { realpathSync } from 'fs'\nimport sumBy from 'lodash-es/sumBy.js'\nimport { cwd } from 'process'\nimport type { HookEvent, ModelUsage } from 'src/entrypoints/agentSdkTypes.js'\nimport type { AgentColorName } from 'src/tools/AgentTool/agentColorManager.js'\nimport type { HookCallbackMatcher } from 'src/types/hooks.js'\n// Indirection for browser-sdk build (package.json \"browser\" field swaps\n// crypto.ts for crypto.browser.ts). Pure leaf re-export of node:crypto \u2014\n// zero circular-dep risk. Path-alias import bypasses bootstrap-isolation\n// (rule only checks ./ and / prefixes); explicit disable documents intent.\n// eslint-disable-next-line custom-rules/bootstrap-isolation\nimport { randomUUID } from 'src/utils/crypto.js'\nimport type { ModelSetting } from 'src/utils/model/model.js'\nimport type { ModelStrings } from 'src/utils/model/modelStrings.js'\nimport type { SettingSource } from 'src/utils/settings/constants.js'\nimport { resetSettingsCache } from 'src/utils/settings/settingsCache.js'\nimport type { PluginHookMatcher } from 'src/utils/settings/types.js'\nimport { createSignal } from 'src/utils/signal.js'\n\n// Union type for registered hooks - can be SDK callbacks or native plugin hooks\ntype RegisteredHookMatcher = HookCallbackMatcher | PluginHookMatcher\n\nimport type { SessionId } from 'src/types/ids.js'\n\n// DO NOT ADD MORE STATE HERE - BE JUDICIOUS WITH GLOBAL STATE\n\n// dev: true on entries that came via --dangerously-load-development-channels.\n// The allowlist gate checks this per-entry (not the session-wide\n// hasDevChannels bit) so passing both flags doesn't let the dev dialog's\n// acceptance leak allowlist-bypass to the --channels entries.\nexport type ChannelEntry =\n  | { kind: 'plugin'; name: string; marketplace: string; dev?: boolean }\n  | { kind: 'server'; name: string; dev?: boolean }\n\nexport type AttributedCounter = {\n  add(value: number, additionalAttributes?: Attributes): void\n}\n\n/**\n * Stub for upstream's REPL bridge (inter-Tau messaging). Tau does\n * not implement this feature \u2014 always returns false so callers fall\n * back to the non-bridged code path. Kept so strict-ESM bundlers\n * (esbuild) resolve the import at build time.\n */\nexport function isReplBridgeActive(): boolean {\n  return false\n}\n\ntype State = {\n  originalCwd: string\n  // Stable project root - set once at startup (including by --worktree flag),\n  // never updated by mid-session EnterWorktreeTool.\n  // Use for project identity (history, skills, sessions) not file operations.\n  projectRoot: string\n  totalCostUSD: number\n  totalAPIDuration: number\n  totalAPIDurationWithoutRetries: number\n  totalToolDuration: number\n  turnHookDurationMs: number\n  turnToolDurationMs: number\n  turnClassifierDurationMs: number\n  turnToolCount: number\n  turnHookCount: number\n  turnClassifierCount: number\n  startTime: number\n  lastInteractionTime: number\n  totalLinesAdded: number\n  totalLinesRemoved: number\n  hasUnknownModelCost: boolean\n  cwd: string\n  modelUsage: { [modelName: string]: ModelUsage }\n  mainLoopModelOverride: ModelSetting | undefined\n  initialMainLoopModel: ModelSetting\n  modelStrings: ModelStrings | null\n  isInteractive: boolean\n  kairosActive: boolean\n  // When true, ensureToolResultPairing throws on mismatch instead of\n  // repairing with synthetic placeholders. HFI opts in at startup so\n  // trajectories fail fast rather than conditioning the model on fake\n  // tool_results.\n  strictToolResultPairing: boolean\n  sdkAgentProgressSummariesEnabled: boolean\n  userMsgOptIn: boolean\n  clientType: string\n  sessionSource: string | undefined\n  questionPreviewFormat: 'markdown' | 'html' | undefined\n  flagSettingsPath: string | undefined\n  flagSettingsInline: Record<string, unknown> | null\n  allowedSettingSources: SettingSource[]\n  sessionIngressToken: string | null | undefined\n  oauthTokenFromFd: string | null | undefined\n  apiKeyFromFd: string | null | undefined\n  // Telemetry state\n  meter: Meter | null\n  sessionCounter: AttributedCounter | null\n  locCounter: AttributedCounter | null\n  prCounter: AttributedCounter | null\n  commitCounter: AttributedCounter | null\n  costCounter: AttributedCounter | null\n  tokenCounter: AttributedCounter | null\n  codeEditToolDecisionCounter: AttributedCounter | null\n  activeTimeCounter: AttributedCounter | null\n  statsStore: { observe(name: string, value: number): void } | null\n  sessionId: SessionId\n  // Parent session ID for tracking session lineage (e.g., plan mode -> implementation)\n  parentSessionId: SessionId | undefined\n  // Logger state\n  loggerProvider: LoggerProvider | null\n  eventLogger: ReturnType<typeof logs.getLogger> | null\n  // Meter provider state\n  meterProvider: MeterProvider | null\n  // Tracer provider state\n  tracerProvider: BasicTracerProvider | null\n  // Agent color state\n  agentColorMap: Map<string, AgentColorName>\n  agentColorIndex: number\n  // Last API request for bug reports\n  lastAPIRequest: Omit<BetaMessageStreamParams, 'messages'> | null\n  // Messages from the last API request (ant-only; reference, not clone).\n  // Captures the exact post-compaction, CLAUDE.md-injected message set sent\n  // to the API so /share's serialized_conversation.json reflects reality.\n  lastAPIRequestMessages: BetaMessageStreamParams['messages'] | null\n  // Last auto-mode classifier request(s) for /share transcript\n  lastClassifierRequests: unknown[] | null\n  // CLAUDE.md content cached by context.ts for the auto-mode classifier.\n  // Breaks the yoloClassifier \u2192 claudemd \u2192 filesystem \u2192 permissions cycle.\n  cachedClaudeMdContent: string | null\n  // In-memory error log for recent errors\n  inMemoryErrorLog: Array<{ error: string; timestamp: string }>\n  // Session-only plugins from --plugin-dir flag\n  inlinePlugins: Array<string>\n  // Explicit --chrome / --no-chrome flag value (undefined = not set on CLI)\n  chromeFlagOverride: boolean | undefined\n  // Use cowork_plugins directory instead of plugins (--cowork flag or env var)\n  useCoworkPlugins: boolean\n  // Session-only bypass permissions mode flag (not persisted)\n  sessionBypassPermissionsMode: boolean\n  // Session-only flag gating the .claude/scheduled_tasks.json watcher\n  // (useScheduledTasks). Set by cronScheduler.start() when the JSON has\n  // entries, or by CronCreateTool. Not persisted.\n  scheduledTasksEnabled: boolean\n  // Session-only cron tasks created via CronCreate with durable: false.\n  // Fire on schedule like file-backed tasks but are never written to\n  // .claude/scheduled_tasks.json \u2014 they die with the process. Typed via\n  // SessionCronTask below (not importing from cronTasks.ts keeps\n  // bootstrap a leaf of the import DAG).\n  sessionCronTasks: SessionCronTask[]\n  // Teams created this session via TeamCreate. cleanupSessionTeams()\n  // removes these on gracefulShutdown so subagent-created teams don't\n  // persist on disk forever (gh-32730). TeamDelete removes entries to\n  // avoid double-cleanup. Lives here (not teamHelpers.ts) so\n  // resetStateForTests() clears it between tests.\n  sessionCreatedTeams: Set<string>\n  // Session-only trust flag for home directory (not persisted to disk)\n  // When running from home dir, trust dialog is shown but not saved to disk.\n  // This flag allows features requiring trust to work during the session.\n  sessionTrustAccepted: boolean\n  // Session-only flag to disable session persistence to disk\n  sessionPersistenceDisabled: boolean\n  // Track if user has exited plan mode in this session (for re-entry guidance)\n  hasExitedPlanMode: boolean\n  // Track if we need to show the plan mode exit attachment (one-time notification)\n  needsPlanModeExitAttachment: boolean\n  // Track if we need to show the auto mode exit attachment (one-time notification)\n  needsAutoModeExitAttachment: boolean\n  // Track if LSP plugin recommendation has been shown this session (only show once)\n  lspRecommendationShownThisSession: boolean\n  // SDK init event state - jsonSchema for structured output\n  initJsonSchema: Record<string, unknown> | null\n  // Registered hooks - SDK callbacks and plugin native hooks\n  registeredHooks: Partial<Record<HookEvent, RegisteredHookMatcher[]>> | null\n  // Cache for plan slugs: sessionId -> wordSlug\n  planSlugCache: Map<string, string>\n  // Track teleported session for reliability logging\n  teleportedSessionInfo: {\n    isTeleported: boolean\n    hasLoggedFirstMessage: boolean\n    sessionId: string | null\n  } | null\n  // Track invoked skills for preservation across compaction\n  // Keys are composite: `${agentId ?? ''}:${skillName}` to prevent cross-agent overwrites\n  invokedSkills: Map<\n    string,\n    {\n      skillName: string\n      skillPath: string\n      content: string\n      invokedAt: number\n      agentId: string | null\n    }\n  >\n  // Track slow operations for dev bar display (ant-only)\n  slowOperations: Array<{\n    operation: string\n    durationMs: number\n    timestamp: number\n  }>\n  // SDK-provided betas (e.g., context-1m-2025-08-07)\n  sdkBetas: string[] | undefined\n  // Main thread agent type (from --agent flag or settings)\n  mainThreadAgentType: string | undefined\n  // Remote mode (--remote flag)\n  isRemoteMode: boolean\n  // Direct connect server URL (for display in header)\n  directConnectServerUrl: string | undefined\n  // System prompt section cache state\n  systemPromptSectionCache: Map<string, string | null>\n  // Last date emitted to the model (for detecting midnight date changes)\n  lastEmittedDate: string | null\n  // Additional directories from --add-dir flag (for CLAUDE.md loading)\n  additionalDirectoriesForClaudeMd: string[]\n  // Channel server allowlist from --channels flag (servers whose channel\n  // notifications should register this session). Parsed once in main.tsx \u2014\n  // the tag decides trust model: 'plugin' \u2192 marketplace verification +\n  // allowlist, 'server' \u2192 allowlist always fails (schema is plugin-only).\n  // Either kind needs entry.dev to bypass allowlist.\n  allowedChannels: ChannelEntry[]\n  // True if any entry in allowedChannels came from\n  // --dangerously-load-development-channels (so ChannelsNotice can name the\n  // right flag in policy-blocked messages)\n  hasDevChannels: boolean\n  // Dir containing the session's `.jsonl`; null = derive from originalCwd.\n  sessionProjectDir: string | null\n  // Cached prompt cache 1h TTL allowlist from GrowthBook (session-stable)\n  promptCache1hAllowlist: string[] | null\n  // Cached 1h TTL user eligibility (session-stable). Latched on first\n  // evaluation so mid-session overage flips don't change the cache_control\n  // TTL, which would bust the server-side prompt cache.\n  promptCache1hEligible: boolean | null\n  // Sticky-on latch for AFK_MODE_BETA_HEADER. Once auto mode is first\n  // activated, keep sending the header for the rest of the session so\n  // Shift+Tab toggles don't bust the ~50-70K token prompt cache.\n  afkModeHeaderLatched: boolean | null\n  // Sticky-on latch for FAST_MODE_BETA_HEADER. Once fast mode is first\n  // enabled, keep sending the header so cooldown enter/exit doesn't\n  // double-bust the prompt cache. The `speed` body param stays dynamic.\n  fastModeHeaderLatched: boolean | null\n  // Sticky-on latch for the cache-editing beta header. Once cached\n  // microcompact is first enabled, keep sending the header so mid-session\n  // GrowthBook/settings toggles don't bust the prompt cache.\n  cacheEditingHeaderLatched: boolean | null\n  // Sticky-on latch for clearing thinking from prior tool loops. Triggered\n  // when >1h since last API call (confirmed cache miss \u2014 no cache-hit\n  // benefit to keeping thinking). Once latched, stays on so the newly-warmed\n  // thinking-cleared cache isn't busted by flipping back to keep:'all'.\n  thinkingClearLatched: boolean | null\n  // Current prompt ID (UUID) correlating a user prompt with subsequent OTel events\n  promptId: string | null\n  // Last API requestId for the main conversation chain (not subagents).\n  // Updated after each successful API response for main-session queries.\n  // Read at shutdown to send cache eviction hints to inference.\n  lastMainRequestId: string | undefined\n  // Timestamp (Date.now()) of the last successful API call completion.\n  // Used to compute timeSinceLastApiCallMs in tengu_api_success for\n  // correlating cache misses with idle time (cache TTL is ~5min).\n  lastApiCompletionTimestamp: number | null\n  // Set to true after compaction (auto or manual /compact). Consumed by\n  // logAPISuccess to tag the first post-compaction API call so we can\n  // distinguish compaction-induced cache misses from TTL expiry.\n  pendingPostCompaction: boolean\n}\n\n// ALSO HERE - THINK THRICE BEFORE MODIFYING\nfunction getInitialState(): State {\n  // Resolve symlinks in cwd to match behavior of shell.ts setCwd\n  // This ensures consistency with how paths are sanitized for session storage\n  let resolvedCwd = ''\n  if (\n    typeof process !== 'undefined' &&\n    typeof process.cwd === 'function' &&\n    typeof realpathSync === 'function'\n  ) {\n    const rawCwd = cwd()\n    try {\n      resolvedCwd = realpathSync(rawCwd).normalize('NFC')\n    } catch {\n      // File Provider EPERM on CloudStorage mounts (lstat per path component).\n      resolvedCwd = rawCwd.normalize('NFC')\n    }\n  }\n  const state: State = {\n    originalCwd: resolvedCwd,\n    projectRoot: resolvedCwd,\n    totalCostUSD: 0,\n    totalAPIDuration: 0,\n    totalAPIDurationWithoutRetries: 0,\n    totalToolDuration: 0,\n    turnHookDurationMs: 0,\n    turnToolDurationMs: 0,\n    turnClassifierDurationMs: 0,\n    turnToolCount: 0,\n    turnHookCount: 0,\n    turnClassifierCount: 0,\n    startTime: Date.now(),\n    lastInteractionTime: Date.now(),\n    totalLinesAdded: 0,\n    totalLinesRemoved: 0,\n    hasUnknownModelCost: false,\n    cwd: resolvedCwd,\n    modelUsage: {},\n    mainLoopModelOverride: undefined,\n    initialMainLoopModel: null,\n    modelStrings: null,\n    isInteractive: false,\n    kairosActive: false,\n    strictToolResultPairing: false,\n    sdkAgentProgressSummariesEnabled: false,\n    userMsgOptIn: false,\n    clientType: 'cli',\n    sessionSource: undefined,\n    questionPreviewFormat: undefined,\n    sessionIngressToken: undefined,\n    oauthTokenFromFd: undefined,\n    apiKeyFromFd: undefined,\n    flagSettingsPath: undefined,\n    flagSettingsInline: null,\n    allowedSettingSources: [\n      'userSettings',\n      'projectSettings',\n      'localSettings',\n      'flagSettings',\n      'policySettings',\n    ],\n    // Telemetry state\n    meter: null,\n    sessionCounter: null,\n    locCounter: null,\n    prCounter: null,\n    commitCounter: null,\n    costCounter: null,\n    tokenCounter: null,\n    codeEditToolDecisionCounter: null,\n    activeTimeCounter: null,\n    statsStore: null,\n    sessionId: randomUUID() as SessionId,\n    parentSessionId: undefined,\n    // Logger state\n    loggerProvider: null,\n    eventLogger: null,\n    // Meter provider state\n    meterProvider: null,\n    tracerProvider: null,\n    // Agent color state\n    agentColorMap: new Map(),\n    agentColorIndex: 0,\n    // Last API request for bug reports\n    lastAPIRequest: null,\n    lastAPIRequestMessages: null,\n    // Last auto-mode classifier request(s) for /share transcript\n    lastClassifierRequests: null,\n    cachedClaudeMdContent: null,\n    // In-memory error log for recent errors\n    inMemoryErrorLog: [],\n    // Session-only plugins from --plugin-dir flag\n    inlinePlugins: [],\n    // Explicit --chrome / --no-chrome flag value (undefined = not set on CLI)\n    chromeFlagOverride: undefined,\n    // Use cowork_plugins directory instead of plugins\n    useCoworkPlugins: false,\n    // Session-only bypass permissions mode flag (not persisted)\n    sessionBypassPermissionsMode: false,\n    // Scheduled tasks disabled until flag or dialog enables them\n    scheduledTasksEnabled: false,\n    sessionCronTasks: [],\n    sessionCreatedTeams: new Set(),\n    // Session-only trust flag (not persisted to disk)\n    sessionTrustAccepted: false,\n    // Session-only flag to disable session persistence to disk\n    sessionPersistenceDisabled: false,\n    // Track if user has exited plan mode in this session\n    hasExitedPlanMode: false,\n    // Track if we need to show the plan mode exit attachment\n    needsPlanModeExitAttachment: false,\n    // Track if we need to show the auto mode exit attachment\n    needsAutoModeExitAttachment: false,\n    // Track if LSP plugin recommendation has been shown this session\n    lspRecommendationShownThisSession: false,\n    // SDK init event state\n    initJsonSchema: null,\n    registeredHooks: null,\n    // Cache for plan slugs\n    planSlugCache: new Map(),\n    // Track teleported session for reliability logging\n    teleportedSessionInfo: null,\n    // Track invoked skills for preservation across compaction\n    invokedSkills: new Map(),\n    // Track slow operations for dev bar display\n    slowOperations: [],\n    // SDK-provided betas\n    sdkBetas: undefined,\n    // Main thread agent type\n    mainThreadAgentType: undefined,\n    // Remote mode\n    isRemoteMode: false,\n    ...(process.env.USER_TYPE === 'ant'\n      ? {\n          replBridgeActive: false,\n        }\n      : {}),\n    // Direct connect server URL\n    directConnectServerUrl: undefined,\n    // System prompt section cache state\n    systemPromptSectionCache: new Map(),\n    // Last date emitted to the model\n    lastEmittedDate: null,\n    // Additional directories from --add-dir flag (for CLAUDE.md loading)\n    additionalDirectoriesForClaudeMd: [],\n    // Channel server allowlist from --channels flag\n    allowedChannels: [],\n    hasDevChannels: false,\n    // Session project dir (null = derive from originalCwd)\n    sessionProjectDir: null,\n    // Prompt cache 1h allowlist (null = not yet fetched from GrowthBook)\n    promptCache1hAllowlist: null,\n    // Prompt cache 1h eligibility (null = not yet evaluated)\n    promptCache1hEligible: null,\n    // Beta header latches (null = not yet triggered)\n    afkModeHeaderLatched: null,\n    fastModeHeaderLatched: null,\n    cacheEditingHeaderLatched: null,\n    thinkingClearLatched: null,\n    // Current prompt ID\n    promptId: null,\n    lastMainRequestId: undefined,\n    lastApiCompletionTimestamp: null,\n    pendingPostCompaction: false,\n  }\n\n  return state\n}\n\n// AND ESPECIALLY HERE\nconst STATE: State = getInitialState()\n\nexport function getSessionId(): SessionId {\n  return STATE.sessionId\n}\n\nexport function regenerateSessionId(\n  options: { setCurrentAsParent?: boolean } = {},\n): SessionId {\n  if (options.setCurrentAsParent) {\n    STATE.parentSessionId = STATE.sessionId\n  }\n  // Drop the outgoing session's plan-slug entry so the Map doesn't\n  // accumulate stale keys. Callers that need to carry the slug across\n  // (REPL.tsx clearContext) read it before calling clearConversation.\n  STATE.planSlugCache.delete(STATE.sessionId)\n  // Regenerated sessions live in the current project: reset projectDir to\n  // null so getTranscriptPath() derives from originalCwd.\n  STATE.sessionId = randomUUID() as SessionId\n  STATE.sessionProjectDir = null\n  return STATE.sessionId\n}\n\nexport function getParentSessionId(): SessionId | undefined {\n  return STATE.parentSessionId\n}\n\n/**\n * Atomically switch the active session. `sessionId` and `sessionProjectDir`\n * always change together \u2014 there is no separate setter for either, so they\n * cannot drift out of sync (CC-34).\n *\n * @param projectDir \u2014 directory containing `<sessionId>.jsonl`. Omit (or\n *   pass `null`) for sessions in the current project \u2014 the path will derive\n *   from originalCwd at read time. Pass `dirname(transcriptPath)` when the\n *   session lives in a different project directory (git worktrees,\n *   cross-project resume). Every call resets the project dir; it never\n *   carries over from the previous session.\n */\nexport function switchSession(\n  sessionId: SessionId,\n  projectDir: string | null = null,\n): void {\n  // Drop the outgoing session's plan-slug entry so the Map stays bounded\n  // across repeated /resume. Only the current session's slug is ever read\n  // (plans.ts getPlanSlug defaults to getSessionId()).\n  STATE.planSlugCache.delete(STATE.sessionId)\n  STATE.sessionId = sessionId\n  STATE.sessionProjectDir = projectDir\n  sessionSwitched.emit(sessionId)\n}\n\nconst sessionSwitched = createSignal<[id: SessionId]>()\n\n/**\n * Register a callback that fires when switchSession changes the active\n * sessionId. bootstrap can't import listeners directly (DAG leaf), so\n * callers register themselves. concurrentSessions.ts uses this to keep the\n * PID file's sessionId in sync with --resume.\n */\nexport const onSessionSwitch = sessionSwitched.subscribe\n\n/**\n * Project directory the current session's transcript lives in, or `null` if\n * the session was created in the current project (common case \u2014 derive from\n * originalCwd). See `switchSession()`.\n */\nexport function getSessionProjectDir(): string | null {\n  return STATE.sessionProjectDir\n}\n\nexport function getOriginalCwd(): string {\n  return STATE.originalCwd\n}\n\n/**\n * Get the stable project root directory.\n * Unlike getOriginalCwd(), this is never updated by mid-session EnterWorktreeTool\n * (so skills/history stay stable when entering a throwaway worktree).\n * It IS set at startup by --worktree, since that worktree is the session's project.\n * Use for project identity (history, skills, sessions) not file operations.\n */\nexport function getProjectRoot(): string {\n  return STATE.projectRoot\n}\n\nexport function setOriginalCwd(cwd: string): void {\n  STATE.originalCwd = cwd.normalize('NFC')\n}\n\n/**\n * Only for --worktree startup flag. Mid-session EnterWorktreeTool must NOT\n * call this \u2014 skills/history should stay anchored to where the session started.\n */\nexport function setProjectRoot(cwd: string): void {\n  STATE.projectRoot = cwd.normalize('NFC')\n}\n\nexport function getCwdState(): string {\n  return STATE.cwd\n}\n\nexport function setCwdState(cwd: string): void {\n  STATE.cwd = cwd.normalize('NFC')\n}\n\nexport function getDirectConnectServerUrl(): string | undefined {\n  return STATE.directConnectServerUrl\n}\n\nexport function setDirectConnectServerUrl(url: string): void {\n  STATE.directConnectServerUrl = url\n}\n\nexport function addToTotalDurationState(\n  duration: number,\n  durationWithoutRetries: number,\n): void {\n  STATE.totalAPIDuration += duration\n  STATE.totalAPIDurationWithoutRetries += durationWithoutRetries\n}\n\nexport function resetTotalDurationStateAndCost_FOR_TESTS_ONLY(): void {\n  STATE.totalAPIDuration = 0\n  STATE.totalAPIDurationWithoutRetries = 0\n  STATE.totalCostUSD = 0\n}\n\nexport function addToTotalCostState(\n  cost: number,\n  modelUsage: ModelUsage,\n  model: string,\n): void {\n  STATE.modelUsage[model] = modelUsage\n  STATE.totalCostUSD += cost\n}\n\nexport function getTotalCostUSD(): number {\n  return STATE.totalCostUSD\n}\n\nexport function getTotalAPIDuration(): number {\n  return STATE.totalAPIDuration\n}\n\nexport function getTotalDuration(): number {\n  return Date.now() - STATE.startTime\n}\n\nexport function getTotalAPIDurationWithoutRetries(): number {\n  return STATE.totalAPIDurationWithoutRetries\n}\n\nexport function getTotalToolDuration(): number {\n  return STATE.totalToolDuration\n}\n\nexport function addToToolDuration(duration: number): void {\n  STATE.totalToolDuration += duration\n  STATE.turnToolDurationMs += duration\n  STATE.turnToolCount++\n}\n\nexport function getTurnHookDurationMs(): number {\n  return STATE.turnHookDurationMs\n}\n\nexport function addToTurnHookDuration(duration: number): void {\n  STATE.turnHookDurationMs += duration\n  STATE.turnHookCount++\n}\n\nexport function resetTurnHookDuration(): void {\n  STATE.turnHookDurationMs = 0\n  STATE.turnHookCount = 0\n}\n\nexport function getTurnHookCount(): number {\n  return STATE.turnHookCount\n}\n\nexport function getTurnToolDurationMs(): number {\n  return STATE.turnToolDurationMs\n}\n\nexport function resetTurnToolDuration(): void {\n  STATE.turnToolDurationMs = 0\n  STATE.turnToolCount = 0\n}\n\nexport function getTurnToolCount(): number {\n  return STATE.turnToolCount\n}\n\nexport function getTurnClassifierDurationMs(): number {\n  return STATE.turnClassifierDurationMs\n}\n\nexport function addToTurnClassifierDuration(duration: number): void {\n  STATE.turnClassifierDurationMs += duration\n  STATE.turnClassifierCount++\n}\n\nexport function resetTurnClassifierDuration(): void {\n  STATE.turnClassifierDurationMs = 0\n  STATE.turnClassifierCount = 0\n}\n\nexport function getTurnClassifierCount(): number {\n  return STATE.turnClassifierCount\n}\n\nexport function getStatsStore(): {\n  observe(name: string, value: number): void\n} | null {\n  return STATE.statsStore\n}\n\nexport function setStatsStore(\n  store: { observe(name: string, value: number): void } | null,\n): void {\n  STATE.statsStore = store\n}\n\n/**\n * Marks that an interaction occurred.\n *\n * By default the actual Date.now() call is deferred until the next Ink render\n * frame (via flushInteractionTime()) so we avoid calling Date.now() on every\n * single keypress.\n *\n * Pass `immediate = true` when calling from React useEffect callbacks or\n * other code that runs *after* the Ink render cycle has already flushed.\n * Without it the timestamp stays stale until the next render, which may never\n * come if the user is idle (e.g. permission dialog waiting for input).\n */\nlet interactionTimeDirty = false\n\nexport function updateLastInteractionTime(immediate?: boolean): void {\n  if (immediate) {\n    flushInteractionTime_inner()\n  } else {\n    interactionTimeDirty = true\n  }\n}\n\n/**\n * If an interaction was recorded since the last flush, update the timestamp\n * now. Called by Ink before each render cycle so we batch many keypresses into\n * a single Date.now() call.\n */\nexport function flushInteractionTime(): void {\n  if (interactionTimeDirty) {\n    flushInteractionTime_inner()\n  }\n}\n\nfunction flushInteractionTime_inner(): void {\n  STATE.lastInteractionTime = Date.now()\n  interactionTimeDirty = false\n}\n\nexport function addToTotalLinesChanged(added: number, removed: number): void {\n  STATE.totalLinesAdded += added\n  STATE.totalLinesRemoved += removed\n}\n\nexport function getTotalLinesAdded(): number {\n  return STATE.totalLinesAdded\n}\n\nexport function getTotalLinesRemoved(): number {\n  return STATE.totalLinesRemoved\n}\n\nexport function getTotalInputTokens(): number {\n  return sumBy(Object.values(STATE.modelUsage), 'inputTokens')\n}\n\nexport function getTotalOutputTokens(): number {\n  return sumBy(Object.values(STATE.modelUsage), 'outputTokens')\n}\n\nexport function getTotalCacheReadInputTokens(): number {\n  return sumBy(Object.values(STATE.modelUsage), 'cacheReadInputTokens')\n}\n\nexport function getTotalCacheCreationInputTokens(): number {\n  return sumBy(Object.values(STATE.modelUsage), 'cacheCreationInputTokens')\n}\n\nexport function getTotalWebSearchRequests(): number {\n  return sumBy(Object.values(STATE.modelUsage), 'webSearchRequests')\n}\n\nlet outputTokensAtTurnStart = 0\nlet currentTurnTokenBudget: number | null = null\nexport function getTurnOutputTokens(): number {\n  return getTotalOutputTokens() - outputTokensAtTurnStart\n}\nexport function getCurrentTurnTokenBudget(): number | null {\n  return currentTurnTokenBudget\n}\nlet budgetContinuationCount = 0\nexport function snapshotOutputTokensForTurn(budget: number | null): void {\n  outputTokensAtTurnStart = getTotalOutputTokens()\n  currentTurnTokenBudget = budget\n  budgetContinuationCount = 0\n}\nexport function getBudgetContinuationCount(): number {\n  return budgetContinuationCount\n}\nexport function incrementBudgetContinuationCount(): void {\n  budgetContinuationCount++\n}\n\nexport function setHasUnknownModelCost(): void {\n  STATE.hasUnknownModelCost = true\n}\n\nexport function hasUnknownModelCost(): boolean {\n  return STATE.hasUnknownModelCost\n}\n\nexport function getLastMainRequestId(): string | undefined {\n  return STATE.lastMainRequestId\n}\n\nexport function setLastMainRequestId(requestId: string): void {\n  STATE.lastMainRequestId = requestId\n}\n\nexport function getLastApiCompletionTimestamp(): number | null {\n  return STATE.lastApiCompletionTimestamp\n}\n\nexport function setLastApiCompletionTimestamp(timestamp: number): void {\n  STATE.lastApiCompletionTimestamp = timestamp\n}\n\n/** Mark that a compaction just occurred. The next API success event will\n *  include isPostCompaction=true, then the flag auto-resets. */\nexport function markPostCompaction(): void {\n  STATE.pendingPostCompaction = true\n}\n\n/** Consume the post-compaction flag. Returns true once after compaction,\n *  then returns false until the next compaction. */\nexport function consumePostCompaction(): boolean {\n  const was = STATE.pendingPostCompaction\n  STATE.pendingPostCompaction = false\n  return was\n}\n\nexport function getLastInteractionTime(): number {\n  return STATE.lastInteractionTime\n}\n\n// Scroll drain suspension \u2014 background intervals check this before doing work\n// so they don't compete with scroll frames for the event loop. Set by\n// ScrollBox scrollBy/scrollTo, cleared SCROLL_DRAIN_IDLE_MS after the last\n// scroll event. Module-scope (not in STATE) \u2014 ephemeral hot-path flag, no\n// test-reset needed since the debounce timer self-clears.\nlet scrollDraining = false\nlet scrollDrainTimer: ReturnType<typeof setTimeout> | undefined\nconst SCROLL_DRAIN_IDLE_MS = 150\n\n/** Mark that a scroll event just happened. Background intervals gate on\n *  getIsScrollDraining() and skip their work until the debounce clears. */\nexport function markScrollActivity(): void {\n  scrollDraining = true\n  if (scrollDrainTimer) clearTimeout(scrollDrainTimer)\n  scrollDrainTimer = setTimeout(() => {\n    scrollDraining = false\n    scrollDrainTimer = undefined\n  }, SCROLL_DRAIN_IDLE_MS)\n  scrollDrainTimer.unref?.()\n}\n\n/** True while scroll is actively draining (within 150ms of last event).\n *  Intervals should early-return when this is set \u2014 the work picks up next\n *  tick after scroll settles. */\nexport function getIsScrollDraining(): boolean {\n  return scrollDraining\n}\n\n/** Await this before expensive one-shot work (network, subprocess) that could\n *  coincide with scroll. Resolves immediately if not scrolling; otherwise\n *  polls at the idle interval until the flag clears. */\nexport async function waitForScrollIdle(): Promise<void> {\n  while (scrollDraining) {\n    // bootstrap-isolation forbids importing sleep() from src/utils/\n    // eslint-disable-next-line no-restricted-syntax\n    await new Promise(r => setTimeout(r, SCROLL_DRAIN_IDLE_MS).unref?.())\n  }\n}\n\nexport function getModelUsage(): { [modelName: string]: ModelUsage } {\n  return STATE.modelUsage\n}\n\nexport function getUsageForModel(model: string): ModelUsage | undefined {\n  return STATE.modelUsage[model]\n}\n\n/**\n * Gets the model override set from the --model CLI flag or after the user\n * updates their configured model.\n */\nexport function getMainLoopModelOverride(): ModelSetting | undefined {\n  return STATE.mainLoopModelOverride\n}\n\nexport function getInitialMainLoopModel(): ModelSetting {\n  return STATE.initialMainLoopModel\n}\n\nexport function setMainLoopModelOverride(\n  model: ModelSetting | undefined,\n): void {\n  STATE.mainLoopModelOverride = model\n}\n\nexport function setInitialMainLoopModel(model: ModelSetting): void {\n  STATE.initialMainLoopModel = model\n}\n\nexport function getSdkBetas(): string[] | undefined {\n  return STATE.sdkBetas\n}\n\nexport function setSdkBetas(betas: string[] | undefined): void {\n  STATE.sdkBetas = betas\n}\n\nexport function resetCostState(): void {\n  STATE.totalCostUSD = 0\n  STATE.totalAPIDuration = 0\n  STATE.totalAPIDurationWithoutRetries = 0\n  STATE.totalToolDuration = 0\n  STATE.startTime = Date.now()\n  STATE.totalLinesAdded = 0\n  STATE.totalLinesRemoved = 0\n  STATE.hasUnknownModelCost = false\n  STATE.modelUsage = {}\n  STATE.promptId = null\n}\n\n/**\n * Sets cost state values for session restore.\n * Called by restoreCostStateForSession in cost-tracker.ts.\n */\nexport function setCostStateForRestore({\n  totalCostUSD,\n  totalAPIDuration,\n  totalAPIDurationWithoutRetries,\n  totalToolDuration,\n  totalLinesAdded,\n  totalLinesRemoved,\n  lastDuration,\n  modelUsage,\n}: {\n  totalCostUSD: number\n  totalAPIDuration: number\n  totalAPIDurationWithoutRetries: number\n  totalToolDuration: number\n  totalLinesAdded: number\n  totalLinesRemoved: number\n  lastDuration: number | undefined\n  modelUsage: { [modelName: string]: ModelUsage } | undefined\n}): void {\n  STATE.totalCostUSD = totalCostUSD\n  STATE.totalAPIDuration = totalAPIDuration\n  STATE.totalAPIDurationWithoutRetries = totalAPIDurationWithoutRetries\n  STATE.totalToolDuration = totalToolDuration\n  STATE.totalLinesAdded = totalLinesAdded\n  STATE.totalLinesRemoved = totalLinesRemoved\n\n  // Restore per-model usage breakdown\n  if (modelUsage) {\n    STATE.modelUsage = modelUsage\n  }\n\n  // Adjust startTime to make wall duration accumulate\n  if (lastDuration) {\n    STATE.startTime = Date.now() - lastDuration\n  }\n}\n\n// Only used in tests\nexport function resetStateForTests(): void {\n  if (process.env.NODE_ENV !== 'test') {\n    throw new Error('resetStateForTests can only be called in tests')\n  }\n  Object.entries(getInitialState()).forEach(([key, value]) => {\n    STATE[key as keyof State] = value as never\n  })\n  outputTokensAtTurnStart = 0\n  currentTurnTokenBudget = null\n  budgetContinuationCount = 0\n  sessionSwitched.clear()\n}\n\n// You shouldn't use this directly. See src/utils/model/modelStrings.ts::getModelStrings()\nexport function getModelStrings(): ModelStrings | null {\n  return STATE.modelStrings\n}\n\n// You shouldn't use this directly. See src/utils/model/modelStrings.ts\nexport function setModelStrings(modelStrings: ModelStrings): void {\n  STATE.modelStrings = modelStrings\n}\n\n// Test utility function to reset model strings for re-initialization.\n// Separate from setModelStrings because we only want to accept 'null' in tests.\nexport function resetModelStringsForTestingOnly() {\n  STATE.modelStrings = null\n}\n\nexport function setMeter(\n  meter: Meter,\n  createCounter: (name: string, options: MetricOptions) => AttributedCounter,\n): void {\n  STATE.meter = meter\n\n  // Initialize all counters using the provided factory\n  STATE.sessionCounter = createCounter('claude_code.session.count', {\n    description: 'Count of CLI sessions started',\n  })\n  STATE.locCounter = createCounter('claude_code.lines_of_code.count', {\n    description:\n      \"Count of lines of code modified, with the 'type' attribute indicating whether lines were added or removed\",\n  })\n  STATE.prCounter = createCounter('claude_code.pull_request.count', {\n    description: 'Number of pull requests created',\n  })\n  STATE.commitCounter = createCounter('claude_code.commit.count', {\n    description: 'Number of git commits created',\n  })\n  STATE.costCounter = createCounter('claude_code.cost.usage', {\n    description: 'Cost of the Tau session',\n    unit: 'USD',\n  })\n  STATE.tokenCounter = createCounter('claude_code.token.usage', {\n    description: 'Number of tokens used',\n    unit: 'tokens',\n  })\n  STATE.codeEditToolDecisionCounter = createCounter(\n    'claude_code.code_edit_tool.decision',\n    {\n      description:\n        'Count of code editing tool permission decisions (accept/reject) for Edit, Write, and NotebookEdit tools',\n    },\n  )\n  STATE.activeTimeCounter = createCounter('claude_code.active_time.total', {\n    description: 'Total active time in seconds',\n    unit: 's',\n  })\n}\n\nexport function getMeter(): Meter | null {\n  return STATE.meter\n}\n\nexport function getSessionCounter(): AttributedCounter | null {\n  return STATE.sessionCounter\n}\n\nexport function getLocCounter(): AttributedCounter | null {\n  return STATE.locCounter\n}\n\nexport function getPrCounter(): AttributedCounter | null {\n  return STATE.prCounter\n}\n\nexport function getCommitCounter(): AttributedCounter | null {\n  return STATE.commitCounter\n}\n\nexport function getCostCounter(): AttributedCounter | null {\n  return STATE.costCounter\n}\n\nexport function getTokenCounter(): AttributedCounter | null {\n  return STATE.tokenCounter\n}\n\nexport function getCodeEditToolDecisionCounter(): AttributedCounter | null {\n  return STATE.codeEditToolDecisionCounter\n}\n\nexport function getActiveTimeCounter(): AttributedCounter | null {\n  return STATE.activeTimeCounter\n}\n\nexport function getLoggerProvider(): LoggerProvider | null {\n  return STATE.loggerProvider\n}\n\nexport function setLoggerProvider(provider: LoggerProvider | null): void {\n  STATE.loggerProvider = provider\n}\n\nexport function getEventLogger(): ReturnType<typeof logs.getLogger> | null {\n  return STATE.eventLogger\n}\n\nexport function setEventLogger(\n  logger: ReturnType<typeof logs.getLogger> | null,\n): void {\n  STATE.eventLogger = logger\n}\n\nexport function getMeterProvider(): MeterProvider | null {\n  return STATE.meterProvider\n}\n\nexport function setMeterProvider(provider: MeterProvider | null): void {\n  STATE.meterProvider = provider\n}\nexport function getTracerProvider(): BasicTracerProvider | null {\n  return STATE.tracerProvider\n}\nexport function setTracerProvider(provider: BasicTracerProvider | null): void {\n  STATE.tracerProvider = provider\n}\n\nexport function getIsNonInteractiveSession(): boolean {\n  return !STATE.isInteractive\n}\n\nexport function getIsInteractive(): boolean {\n  return STATE.isInteractive\n}\n\nexport function setIsInteractive(value: boolean): void {\n  STATE.isInteractive = value\n}\n\nexport function getClientType(): string {\n  return STATE.clientType\n}\n\nexport function setClientType(type: string): void {\n  STATE.clientType = type\n}\n\nexport function getSdkAgentProgressSummariesEnabled(): boolean {\n  return STATE.sdkAgentProgressSummariesEnabled\n}\n\nexport function setSdkAgentProgressSummariesEnabled(value: boolean): void {\n  STATE.sdkAgentProgressSummariesEnabled = value\n}\n\nexport function getKairosActive(): boolean {\n  return STATE.kairosActive\n}\n\nexport function setKairosActive(value: boolean): void {\n  STATE.kairosActive = value\n}\n\nexport function getStrictToolResultPairing(): boolean {\n  return STATE.strictToolResultPairing\n}\n\nexport function setStrictToolResultPairing(value: boolean): void {\n  STATE.strictToolResultPairing = value\n}\n\n// Field name 'userMsgOptIn' avoids excluded-string substrings ('BriefTool',\n// 'SendUserMessage' \u2014 case-insensitive). All callers are inside feature()\n// guards so these accessors don't need their own (matches getKairosActive).\nexport function getUserMsgOptIn(): boolean {\n  return STATE.userMsgOptIn\n}\n\nexport function setUserMsgOptIn(value: boolean): void {\n  STATE.userMsgOptIn = value\n}\n\nexport function getSessionSource(): string | undefined {\n  return STATE.sessionSource\n}\n\nexport function setSessionSource(source: string): void {\n  STATE.sessionSource = source\n}\n\nexport function getQuestionPreviewFormat(): 'markdown' | 'html' | undefined {\n  return STATE.questionPreviewFormat\n}\n\nexport function setQuestionPreviewFormat(format: 'markdown' | 'html'): void {\n  STATE.questionPreviewFormat = format\n}\n\nexport function getAgentColorMap(): Map<string, AgentColorName> {\n  return STATE.agentColorMap\n}\n\nexport function getFlagSettingsPath(): string | undefined {\n  return STATE.flagSettingsPath\n}\n\nexport function setFlagSettingsPath(path: string | undefined): void {\n  STATE.flagSettingsPath = path\n}\n\nexport function getFlagSettingsInline(): Record<string, unknown> | null {\n  return STATE.flagSettingsInline\n}\n\nexport function setFlagSettingsInline(\n  settings: Record<string, unknown> | null,\n): void {\n  STATE.flagSettingsInline = settings\n}\n\nexport function getSessionIngressToken(): string | null | undefined {\n  return STATE.sessionIngressToken\n}\n\nexport function setSessionIngressToken(token: string | null): void {\n  STATE.sessionIngressToken = token\n}\n\nexport function getOauthTokenFromFd(): string | null | undefined {\n  return STATE.oauthTokenFromFd\n}\n\nexport function setOauthTokenFromFd(token: string | null): void {\n  STATE.oauthTokenFromFd = token\n}\n\nexport function getApiKeyFromFd(): string | null | undefined {\n  return STATE.apiKeyFromFd\n}\n\nexport function setApiKeyFromFd(key: string | null): void {\n  STATE.apiKeyFromFd = key\n}\n\nexport function setLastAPIRequest(\n  params: Omit<BetaMessageStreamParams, 'messages'> | null,\n): void {\n  STATE.lastAPIRequest = params\n}\n\nexport function getLastAPIRequest(): Omit<\n  BetaMessageStreamParams,\n  'messages'\n> | null {\n  return STATE.lastAPIRequest\n}\n\nexport function setLastAPIRequestMessages(\n  messages: BetaMessageStreamParams['messages'] | null,\n): void {\n  STATE.lastAPIRequestMessages = messages\n}\n\nexport function getLastAPIRequestMessages():\n  | BetaMessageStreamParams['messages']\n  | null {\n  return STATE.lastAPIRequestMessages\n}\n\nexport function setLastClassifierRequests(requests: unknown[] | null): void {\n  STATE.lastClassifierRequests = requests\n}\n\nexport function getLastClassifierRequests(): unknown[] | null {\n  return STATE.lastClassifierRequests\n}\n\nexport function setCachedClaudeMdContent(content: string | null): void {\n  STATE.cachedClaudeMdContent = content\n}\n\nexport function getCachedClaudeMdContent(): string | null {\n  return STATE.cachedClaudeMdContent\n}\n\nexport function addToInMemoryErrorLog(errorInfo: {\n  error: string\n  timestamp: string\n}): void {\n  const MAX_IN_MEMORY_ERRORS = 100\n  if (STATE.inMemoryErrorLog.length >= MAX_IN_MEMORY_ERRORS) {\n    STATE.inMemoryErrorLog.shift() // Remove oldest error\n  }\n  STATE.inMemoryErrorLog.push(errorInfo)\n}\n\nexport function getAllowedSettingSources(): SettingSource[] {\n  return STATE.allowedSettingSources\n}\n\nexport function setAllowedSettingSources(sources: SettingSource[]): void {\n  STATE.allowedSettingSources = sources\n}\n\nexport function preferThirdPartyAuthentication(): boolean {\n  // IDE extension should behave as 1P for authentication reasons.\n  return getIsNonInteractiveSession() && STATE.clientType !== 'claude-vscode'\n}\n\nexport function setInlinePlugins(plugins: Array<string>): void {\n  STATE.inlinePlugins = plugins\n}\n\nexport function getInlinePlugins(): Array<string> {\n  return STATE.inlinePlugins\n}\n\nexport function setChromeFlagOverride(value: boolean | undefined): void {\n  STATE.chromeFlagOverride = value\n}\n\nexport function getChromeFlagOverride(): boolean | undefined {\n  return STATE.chromeFlagOverride\n}\n\nexport function setUseCoworkPlugins(value: boolean): void {\n  STATE.useCoworkPlugins = value\n  resetSettingsCache()\n}\n\nexport function getUseCoworkPlugins(): boolean {\n  return STATE.useCoworkPlugins\n}\n\nexport function setSessionBypassPermissionsMode(enabled: boolean): void {\n  STATE.sessionBypassPermissionsMode = enabled\n}\n\nexport function getSessionBypassPermissionsMode(): boolean {\n  return STATE.sessionBypassPermissionsMode\n}\n\nexport function setScheduledTasksEnabled(enabled: boolean): void {\n  STATE.scheduledTasksEnabled = enabled\n}\n\nexport function getScheduledTasksEnabled(): boolean {\n  return STATE.scheduledTasksEnabled\n}\n\nexport type SessionCronTask = {\n  id: string\n  cron: string\n  prompt: string\n  createdAt: number\n  recurring?: boolean\n  /**\n   * When set, the task was created by an in-process teammate (not the team lead).\n   * The scheduler routes fires to that teammate's pendingUserMessages queue\n   * instead of the main REPL command queue. Session-only \u2014 never written to disk.\n   */\n  agentId?: string\n}\n\nexport function getSessionCronTasks(): SessionCronTask[] {\n  return STATE.sessionCronTasks\n}\n\nexport function addSessionCronTask(task: SessionCronTask): void {\n  STATE.sessionCronTasks.push(task)\n}\n\n/**\n * Returns the number of tasks actually removed. Callers use this to skip\n * downstream work (e.g. the disk read in removeCronTasks) when all ids\n * were accounted for here.\n */\nexport function removeSessionCronTasks(ids: readonly string[]): number {\n  if (ids.length === 0) return 0\n  const idSet = new Set(ids)\n  const remaining = STATE.sessionCronTasks.filter(t => !idSet.has(t.id))\n  const removed = STATE.sessionCronTasks.length - remaining.length\n  if (removed === 0) return 0\n  STATE.sessionCronTasks = remaining\n  return removed\n}\n\nexport function setSessionTrustAccepted(accepted: boolean): void {\n  STATE.sessionTrustAccepted = accepted\n}\n\nexport function getSessionTrustAccepted(): boolean {\n  return STATE.sessionTrustAccepted\n}\n\nexport function setSessionPersistenceDisabled(disabled: boolean): void {\n  STATE.sessionPersistenceDisabled = disabled\n}\n\nexport function isSessionPersistenceDisabled(): boolean {\n  return STATE.sessionPersistenceDisabled\n}\n\nexport function hasExitedPlanModeInSession(): boolean {\n  return STATE.hasExitedPlanMode\n}\n\nexport function setHasExitedPlanMode(value: boolean): void {\n  STATE.hasExitedPlanMode = value\n}\n\nexport function needsPlanModeExitAttachment(): boolean {\n  return STATE.needsPlanModeExitAttachment\n}\n\nexport function setNeedsPlanModeExitAttachment(value: boolean): void {\n  STATE.needsPlanModeExitAttachment = value\n}\n\nexport function handlePlanModeTransition(\n  fromMode: string,\n  toMode: string,\n): void {\n  // If switching TO plan mode, clear any pending exit attachment\n  // This prevents sending both plan_mode and plan_mode_exit when user toggles quickly\n  if (toMode === 'plan' && fromMode !== 'plan') {\n    STATE.needsPlanModeExitAttachment = false\n  }\n\n  // If switching out of plan mode, trigger the plan_mode_exit attachment\n  if (fromMode === 'plan' && toMode !== 'plan') {\n    STATE.needsPlanModeExitAttachment = true\n  }\n}\n\nexport function needsAutoModeExitAttachment(): boolean {\n  return STATE.needsAutoModeExitAttachment\n}\n\nexport function setNeedsAutoModeExitAttachment(value: boolean): void {\n  STATE.needsAutoModeExitAttachment = value\n}\n\nexport function handleAutoModeTransition(\n  fromMode: string,\n  toMode: string,\n): void {\n  // Auto\u2194plan transitions are handled by prepareContextForPlanMode (auto may\n  // stay active through plan if opted in) and ExitPlanMode (restores mode).\n  // Skip both directions so this function only handles direct auto transitions.\n  if (\n    (fromMode === 'auto' && toMode === 'plan') ||\n    (fromMode === 'plan' && toMode === 'auto')\n  ) {\n    return\n  }\n  const fromIsAuto = fromMode === 'auto'\n  const toIsAuto = toMode === 'auto'\n\n  // If switching TO auto mode, clear any pending exit attachment\n  // This prevents sending both auto_mode and auto_mode_exit when user toggles quickly\n  if (toIsAuto && !fromIsAuto) {\n    STATE.needsAutoModeExitAttachment = false\n  }\n\n  // If switching out of auto mode, trigger the auto_mode_exit attachment\n  if (fromIsAuto && !toIsAuto) {\n    STATE.needsAutoModeExitAttachment = true\n  }\n}\n\n// LSP plugin recommendation session tracking\nexport function hasShownLspRecommendationThisSession(): boolean {\n  return STATE.lspRecommendationShownThisSession\n}\n\nexport function setLspRecommendationShownThisSession(value: boolean): void {\n  STATE.lspRecommendationShownThisSession = value\n}\n\n// SDK init event state\nexport function setInitJsonSchema(schema: Record<string, unknown>): void {\n  STATE.initJsonSchema = schema\n}\n\nexport function getInitJsonSchema(): Record<string, unknown> | null {\n  return STATE.initJsonSchema\n}\n\nexport function registerHookCallbacks(\n  hooks: Partial<Record<HookEvent, RegisteredHookMatcher[]>>,\n): void {\n  if (!STATE.registeredHooks) {\n    STATE.registeredHooks = {}\n  }\n\n  // `registerHookCallbacks` may be called multiple times, so we need to merge (not overwrite)\n  for (const [event, matchers] of Object.entries(hooks)) {\n    const eventKey = event as HookEvent\n    if (!STATE.registeredHooks[eventKey]) {\n      STATE.registeredHooks[eventKey] = []\n    }\n    STATE.registeredHooks[eventKey]!.push(...matchers)\n  }\n}\n\nexport function getRegisteredHooks(): Partial<\n  Record<HookEvent, RegisteredHookMatcher[]>\n> | null {\n  return STATE.registeredHooks\n}\n\nexport function clearRegisteredHooks(): void {\n  STATE.registeredHooks = null\n}\n\nexport function clearRegisteredPluginHooks(): void {\n  if (!STATE.registeredHooks) {\n    return\n  }\n\n  const filtered: Partial<Record<HookEvent, RegisteredHookMatcher[]>> = {}\n  for (const [event, matchers] of Object.entries(STATE.registeredHooks)) {\n    // Keep only callback hooks (those without pluginRoot)\n    const callbackHooks = matchers.filter(m => !('pluginRoot' in m))\n    if (callbackHooks.length > 0) {\n      filtered[event as HookEvent] = callbackHooks\n    }\n  }\n\n  STATE.registeredHooks = Object.keys(filtered).length > 0 ? filtered : null\n}\n\nexport function resetSdkInitState(): void {\n  STATE.initJsonSchema = null\n  STATE.registeredHooks = null\n}\n\nexport function getPlanSlugCache(): Map<string, string> {\n  return STATE.planSlugCache\n}\n\nexport function getSessionCreatedTeams(): Set<string> {\n  return STATE.sessionCreatedTeams\n}\n\n// Teleported session tracking for reliability logging\nexport function setTeleportedSessionInfo(info: {\n  sessionId: string | null\n}): void {\n  STATE.teleportedSessionInfo = {\n    isTeleported: true,\n    hasLoggedFirstMessage: false,\n    sessionId: info.sessionId,\n  }\n}\n\nexport function getTeleportedSessionInfo(): {\n  isTeleported: boolean\n  hasLoggedFirstMessage: boolean\n  sessionId: string | null\n} | null {\n  return STATE.teleportedSessionInfo\n}\n\nexport function markFirstTeleportMessageLogged(): void {\n  if (STATE.teleportedSessionInfo) {\n    STATE.teleportedSessionInfo.hasLoggedFirstMessage = true\n  }\n}\n\n// Invoked skills tracking for preservation across compaction\nexport type InvokedSkillInfo = {\n  skillName: string\n  skillPath: string\n  content: string\n  invokedAt: number\n  agentId: string | null\n}\n\nexport function addInvokedSkill(\n  skillName: string,\n  skillPath: string,\n  content: string,\n  agentId: string | null = null,\n): void {\n  const key = `${agentId ?? ''}:${skillName}`\n  STATE.invokedSkills.set(key, {\n    skillName,\n    skillPath,\n    content,\n    invokedAt: Date.now(),\n    agentId,\n  })\n}\n\nexport function getInvokedSkills(): Map<string, InvokedSkillInfo> {\n  return STATE.invokedSkills\n}\n\nexport function getInvokedSkillsForAgent(\n  agentId: string | undefined | null,\n): Map<string, InvokedSkillInfo> {\n  const normalizedId = agentId ?? null\n  const filtered = new Map<string, InvokedSkillInfo>()\n  for (const [key, skill] of STATE.invokedSkills) {\n    if (skill.agentId === normalizedId) {\n      filtered.set(key, skill)\n    }\n  }\n  return filtered\n}\n\nexport function clearInvokedSkills(\n  preservedAgentIds?: ReadonlySet<string>,\n): void {\n  if (!preservedAgentIds || preservedAgentIds.size === 0) {\n    STATE.invokedSkills.clear()\n    return\n  }\n  for (const [key, skill] of STATE.invokedSkills) {\n    if (skill.agentId === null || !preservedAgentIds.has(skill.agentId)) {\n      STATE.invokedSkills.delete(key)\n    }\n  }\n}\n\nexport function clearInvokedSkillsForAgent(agentId: string): void {\n  for (const [key, skill] of STATE.invokedSkills) {\n    if (skill.agentId === agentId) {\n      STATE.invokedSkills.delete(key)\n    }\n  }\n}\n\n// Slow operations tracking for dev bar\nconst MAX_SLOW_OPERATIONS = 10\nconst SLOW_OPERATION_TTL_MS = 10000\n\nexport function addSlowOperation(operation: string, durationMs: number): void {\n  if (process.env.USER_TYPE !== 'ant') return\n  // Skip tracking for editor sessions (user editing a prompt file in $EDITOR)\n  // These are intentionally slow since the user is drafting text\n  if (operation.includes('exec') && operation.includes('claude-prompt-')) {\n    return\n  }\n  const now = Date.now()\n  // Remove stale operations\n  STATE.slowOperations = STATE.slowOperations.filter(\n    op => now - op.timestamp < SLOW_OPERATION_TTL_MS,\n  )\n  // Add new operation\n  STATE.slowOperations.push({ operation, durationMs, timestamp: now })\n  // Keep only the most recent operations\n  if (STATE.slowOperations.length > MAX_SLOW_OPERATIONS) {\n    STATE.slowOperations = STATE.slowOperations.slice(-MAX_SLOW_OPERATIONS)\n  }\n}\n\nconst EMPTY_SLOW_OPERATIONS: ReadonlyArray<{\n  operation: string\n  durationMs: number\n  timestamp: number\n}> = []\n\nexport function getSlowOperations(): ReadonlyArray<{\n  operation: string\n  durationMs: number\n  timestamp: number\n}> {\n  // Most common case: nothing tracked. Return a stable reference so the\n  // caller's setState() can bail via Object.is instead of re-rendering at 2fps.\n  if (STATE.slowOperations.length === 0) {\n    return EMPTY_SLOW_OPERATIONS\n  }\n  const now = Date.now()\n  // Only allocate a new array when something actually expired; otherwise keep\n  // the reference stable across polls while ops are still fresh.\n  if (\n    STATE.slowOperations.some(op => now - op.timestamp >= SLOW_OPERATION_TTL_MS)\n  ) {\n    STATE.slowOperations = STATE.slowOperations.filter(\n      op => now - op.timestamp < SLOW_OPERATION_TTL_MS,\n    )\n    if (STATE.slowOperations.length === 0) {\n      return EMPTY_SLOW_OPERATIONS\n    }\n  }\n  // Safe to return directly: addSlowOperation() reassigns STATE.slowOperations\n  // before pushing, so the array held in React state is never mutated.\n  return STATE.slowOperations\n}\n\nexport function getMainThreadAgentType(): string | undefined {\n  return STATE.mainThreadAgentType\n}\n\nexport function setMainThreadAgentType(agentType: string | undefined): void {\n  STATE.mainThreadAgentType = agentType\n}\n\nexport function getIsRemoteMode(): boolean {\n  return STATE.isRemoteMode\n}\n\nexport function setIsRemoteMode(value: boolean): void {\n  STATE.isRemoteMode = value\n}\n\n// System prompt section accessors\n\nexport function getSystemPromptSectionCache(): Map<string, string | null> {\n  return STATE.systemPromptSectionCache\n}\n\nexport function setSystemPromptSectionCacheEntry(\n  name: string,\n  value: string | null,\n): void {\n  STATE.systemPromptSectionCache.set(name, value)\n}\n\nexport function clearSystemPromptSectionState(): void {\n  STATE.systemPromptSectionCache.clear()\n}\n\n// Last emitted date accessors (for detecting midnight date changes)\n\nexport function getLastEmittedDate(): string | null {\n  return STATE.lastEmittedDate\n}\n\nexport function setLastEmittedDate(date: string | null): void {\n  STATE.lastEmittedDate = date\n}\n\nexport function getAdditionalDirectoriesForClaudeMd(): string[] {\n  return STATE.additionalDirectoriesForClaudeMd\n}\n\nexport function setAdditionalDirectoriesForClaudeMd(\n  directories: string[],\n): void {\n  STATE.additionalDirectoriesForClaudeMd = directories\n}\n\nexport function getAllowedChannels(): ChannelEntry[] {\n  return STATE.allowedChannels\n}\n\nexport function setAllowedChannels(entries: ChannelEntry[]): void {\n  STATE.allowedChannels = entries\n}\n\nexport function getHasDevChannels(): boolean {\n  return STATE.hasDevChannels\n}\n\nexport function setHasDevChannels(value: boolean): void {\n  STATE.hasDevChannels = value\n}\n\nexport function getPromptCache1hAllowlist(): string[] | null {\n  return STATE.promptCache1hAllowlist\n}\n\nexport function setPromptCache1hAllowlist(allowlist: string[] | null): void {\n  STATE.promptCache1hAllowlist = allowlist\n}\n\nexport function getPromptCache1hEligible(): boolean | null {\n  return STATE.promptCache1hEligible\n}\n\nexport function setPromptCache1hEligible(eligible: boolean | null): void {\n  STATE.promptCache1hEligible = eligible\n}\n\nexport function getAfkModeHeaderLatched(): boolean | null {\n  return STATE.afkModeHeaderLatched\n}\n\nexport function setAfkModeHeaderLatched(v: boolean): void {\n  STATE.afkModeHeaderLatched = v\n}\n\nexport function getFastModeHeaderLatched(): boolean | null {\n  return STATE.fastModeHeaderLatched\n}\n\nexport function setFastModeHeaderLatched(v: boolean): void {\n  STATE.fastModeHeaderLatched = v\n}\n\nexport function getCacheEditingHeaderLatched(): boolean | null {\n  return STATE.cacheEditingHeaderLatched\n}\n\nexport function setCacheEditingHeaderLatched(v: boolean): void {\n  STATE.cacheEditingHeaderLatched = v\n}\n\nexport function getThinkingClearLatched(): boolean | null {\n  return STATE.thinkingClearLatched\n}\n\nexport function setThinkingClearLatched(v: boolean): void {\n  STATE.thinkingClearLatched = v\n}\n\n/**\n * Reset beta header latches to null. Called on /clear and /compact so a\n * fresh conversation gets fresh header evaluation.\n */\nexport function clearBetaHeaderLatches(): void {\n  STATE.afkModeHeaderLatched = null\n  STATE.fastModeHeaderLatched = null\n  STATE.cacheEditingHeaderLatched = null\n  STATE.thinkingClearLatched = null\n}\n\nexport function getPromptId(): string | null {\n  return STATE.promptId\n}\n\nexport function setPromptId(id: string | null): void {\n  STATE.promptId = id\n}\n\n", "import memoize from 'lodash-es/memoize.js'\nimport { homedir } from 'os'\nimport { join } from 'path'\n\n// Memoized: 150+ callers, many on hot paths. Keyed off CLAUDE_CONFIG_DIR so\n// tests that change the env var get a fresh value without explicit cache.clear.\nexport const getClaudeConfigHomeDir = memoize(\n  (): string => {\n    return (\n      process.env.CLAUDE_CONFIG_DIR ?? join(homedir(), '.claude')\n    ).normalize('NFC')\n  },\n  () => process.env.CLAUDE_CONFIG_DIR,\n)\n\nexport function getTeamsDir(): string {\n  return join(getClaudeConfigHomeDir(), 'teams')\n}\n\n/**\n * Check if NODE_OPTIONS contains a specific flag.\n * Splits on whitespace and checks for exact match to avoid false positives.\n */\nexport function hasNodeOption(flag: string): boolean {\n  const nodeOptions = process.env.NODE_OPTIONS\n  if (!nodeOptions) {\n    return false\n  }\n  return nodeOptions.split(/\\s+/).includes(flag)\n}\n\nexport function isEnvTruthy(envVar: string | boolean | undefined): boolean {\n  if (!envVar) return false\n  if (typeof envVar === 'boolean') return envVar\n  const normalizedValue = envVar.toLowerCase().trim()\n  return ['1', 'true', 'yes', 'on'].includes(normalizedValue)\n}\n\nexport function isEnvDefinedFalsy(\n  envVar: string | boolean | undefined,\n): boolean {\n  if (envVar === undefined) return false\n  if (typeof envVar === 'boolean') return !envVar\n  if (!envVar) return false\n  const normalizedValue = envVar.toLowerCase().trim()\n  return ['0', 'false', 'no', 'off'].includes(normalizedValue)\n}\n\n/**\n * --bare / CLAUDE_CODE_SIMPLE \u2014 skip hooks, LSP, plugin sync, skill dir-walk,\n * attribution, background prefetches, and ALL keychain/credential reads.\n * Auth is strictly ANTHROPIC_API_KEY env or apiKeyHelper from --settings.\n * Explicit CLI flags (--plugin-dir, --add-dir, --mcp-config) still honored.\n * ~30 gates across the codebase.\n *\n * Checks argv directly (in addition to the env var) because several gates\n * run before main.tsx's action handler sets CLAUDE_CODE_SIMPLE=1 from --bare\n * \u2014 notably startKeychainPrefetch() at main.tsx top-level.\n */\nexport function isBareMode(): boolean {\n  return (\n    isEnvTruthy(process.env.CLAUDE_CODE_SIMPLE) ||\n    process.argv.includes('--bare')\n  )\n}\n\n/**\n * Parses an array of environment variable strings into a key-value object\n * @param envVars Array of strings in KEY=VALUE format\n * @returns Object with key-value pairs\n */\nexport function parseEnvVars(\n  rawEnvArgs: string[] | undefined,\n): Record<string, string> {\n  const parsedEnv: Record<string, string> = {}\n\n  // Parse individual env vars\n  if (rawEnvArgs) {\n    for (const envStr of rawEnvArgs) {\n      const [key, ...valueParts] = envStr.split('=')\n      if (!key || valueParts.length === 0) {\n        throw new Error(\n          `Invalid environment variable format: ${envStr}, environment variables should be added as: -e KEY1=value1 -e KEY2=value2`,\n        )\n      }\n      parsedEnv[key] = valueParts.join('=')\n    }\n  }\n  return parsedEnv\n}\n\n/**\n * Get the AWS region with fallback to default\n * Matches the Anthropic Bedrock SDK's region behavior\n */\nexport function getAWSRegion(): string {\n  return process.env.AWS_REGION || process.env.AWS_DEFAULT_REGION || 'us-east-1'\n}\n\n/**\n * Get the default Vertex AI region\n */\nexport function getDefaultVertexRegion(): string {\n  return process.env.CLOUD_ML_REGION || 'us-east5'\n}\n\n/**\n * Check if bash commands should maintain project working directory (reset to original after each command)\n * @returns true if CLAUDE_BASH_MAINTAIN_PROJECT_WORKING_DIR is set to a truthy value\n */\nexport function shouldMaintainProjectWorkingDir(): boolean {\n  return isEnvTruthy(process.env.CLAUDE_BASH_MAINTAIN_PROJECT_WORKING_DIR)\n}\n\n/**\n * Check if running on Homespace (ant-internal cloud environment)\n */\nexport function isRunningOnHomespace(): boolean {\n  return (\n    process.env.USER_TYPE === 'ant' &&\n    isEnvTruthy(process.env.COO_RUNNING_ON_HOMESPACE)\n  )\n}\n\n/**\n * Conservative check for whether Tau is running inside a protected\n * (privileged or ASL3+) COO namespace or cluster.\n *\n * Conservative means: when signals are ambiguous, assume protected. We would\n * rather over-report protected usage than miss it. Unprotected environments\n * are homespace, namespaces on the open allowlist, and no k8s/COO signals\n * at all (laptop/local dev).\n *\n * Used for telemetry to measure auto-mode usage in sensitive environments.\n */\nexport function isInProtectedNamespace(): boolean {\n  // USER_TYPE is build-time --define'd; in external builds this block is\n  // DCE'd so the require() and namespace allowlist never appear in the bundle.\n  if (process.env.USER_TYPE === 'ant') {\n    /* eslint-disable @typescript-eslint/no-require-imports */\n    return (\n      require('./protectedNamespace.js') as typeof import('./protectedNamespace.js')\n    ).checkProtectedNamespace()\n    /* eslint-enable @typescript-eslint/no-require-imports */\n  }\n  return false\n}\n\n// @[MODEL LAUNCH]: Add a Vertex region override env var for the new model.\n/**\n * Model prefix \u2192 env var for Vertex region overrides.\n * Order matters: more specific prefixes must come before less specific ones\n * (e.g., 'claude-opus-4-1' before 'claude-opus-4').\n */\nconst VERTEX_REGION_OVERRIDES: ReadonlyArray<[string, string]> = [\n  ['claude-haiku-4-5', 'VERTEX_REGION_CLAUDE_HAIKU_4_5'],\n  ['claude-3-5-haiku', 'VERTEX_REGION_CLAUDE_3_5_HAIKU'],\n  ['claude-3-5-sonnet', 'VERTEX_REGION_CLAUDE_3_5_SONNET'],\n  ['claude-3-7-sonnet', 'VERTEX_REGION_CLAUDE_3_7_SONNET'],\n  ['claude-opus-4-1', 'VERTEX_REGION_CLAUDE_4_1_OPUS'],\n  ['claude-opus-4', 'VERTEX_REGION_CLAUDE_4_0_OPUS'],\n  ['claude-sonnet-4-6', 'VERTEX_REGION_CLAUDE_4_6_SONNET'],\n  ['claude-sonnet-4-5', 'VERTEX_REGION_CLAUDE_4_5_SONNET'],\n  ['claude-sonnet-4', 'VERTEX_REGION_CLAUDE_4_0_SONNET'],\n]\n\n/**\n * Get the Vertex AI region for a specific model.\n * Different models may be available in different regions.\n */\nexport function getVertexRegionForModel(\n  model: string | undefined,\n): string | undefined {\n  if (model) {\n    const match = VERTEX_REGION_OVERRIDES.find(([prefix]) =>\n      model.startsWith(prefix),\n    )\n    if (match) {\n      return process.env[match[1]] || getDefaultVertexRegion()\n    }\n  }\n  return getDefaultVertexRegion()\n}\n", "import { isEnvTruthy } from '../utils/envUtils.js'\n\n// Lazy read so ENABLE_GROWTHBOOK_DEV from globalSettings.env (applied after\n// module load) is picked up. USER_TYPE is a build-time define so it's safe.\nexport function getGrowthBookClientKey(): string {\n  return process.env.USER_TYPE === 'ant'\n    ? isEnvTruthy(process.env.ENABLE_GROWTHBOOK_DEV)\n      ? 'sdk-yZQvlplybuXjYh6L'\n      : 'sdk-xRVcrliHIlrg4og4'\n    : 'sdk-zAZezfDKGoZuXXKe'\n}\n", "type WriteFn = (content: string) => void\n\nexport type BufferedWriter = {\n  write: (content: string) => void\n  flush: () => void\n  dispose: () => void\n}\n\nexport function createBufferedWriter({\n  writeFn,\n  flushIntervalMs = 1000,\n  maxBufferSize = 100,\n  maxBufferBytes = Infinity,\n  immediateMode = false,\n}: {\n  writeFn: WriteFn\n  flushIntervalMs?: number\n  maxBufferSize?: number\n  maxBufferBytes?: number\n  immediateMode?: boolean\n}): BufferedWriter {\n  let buffer: string[] = []\n  let bufferBytes = 0\n  let flushTimer: NodeJS.Timeout | null = null\n  // Batch detached by overflow that hasn't been written yet. Tracked so\n  // flush()/dispose() can drain it synchronously if the process exits\n  // before the setImmediate fires.\n  let pendingOverflow: string[] | null = null\n\n  function clearTimer(): void {\n    if (flushTimer) {\n      clearTimeout(flushTimer)\n      flushTimer = null\n    }\n  }\n\n  function flush(): void {\n    if (pendingOverflow) {\n      writeFn(pendingOverflow.join(''))\n      pendingOverflow = null\n    }\n    if (buffer.length === 0) return\n    writeFn(buffer.join(''))\n    buffer = []\n    bufferBytes = 0\n    clearTimer()\n  }\n\n  function scheduleFlush(): void {\n    if (!flushTimer) {\n      flushTimer = setTimeout(flush, flushIntervalMs)\n    }\n  }\n\n  // Detach the buffer synchronously so the caller never waits on writeFn.\n  // writeFn may block (e.g. errorLogSink.ts appendFileSync) \u2014 if overflow fires\n  // mid-render or mid-keystroke, deferring the write keeps the current tick\n  // short. Timer-based flushes already run outside user code paths so they\n  // stay synchronous.\n  function flushDeferred(): void {\n    if (pendingOverflow) {\n      // A previous overflow write is still queued. Coalesce into it to\n      // preserve ordering \u2014 writes land in a single setImmediate-ordered batch.\n      pendingOverflow.push(...buffer)\n      buffer = []\n      bufferBytes = 0\n      clearTimer()\n      return\n    }\n    const detached = buffer\n    buffer = []\n    bufferBytes = 0\n    clearTimer()\n    pendingOverflow = detached\n    setImmediate(() => {\n      const toWrite = pendingOverflow\n      pendingOverflow = null\n      if (toWrite) writeFn(toWrite.join(''))\n    })\n  }\n\n  return {\n    write(content: string): void {\n      if (immediateMode) {\n        writeFn(content)\n        return\n      }\n      buffer.push(content)\n      bufferBytes += content.length\n      scheduleFlush()\n      if (buffer.length >= maxBufferSize || bufferBytes >= maxBufferBytes) {\n        flushDeferred()\n      }\n    },\n    flush,\n    dispose(): void {\n      flush()\n    },\n  }\n}\n", "/**\n * Global registry for cleanup functions that should run during graceful shutdown.\n * This module is separate from gracefulShutdown.ts to avoid circular dependencies.\n */\n\n// Global registry for cleanup functions\nconst cleanupFunctions = new Set<() => Promise<void>>()\n\n/**\n * Register a cleanup function to run during graceful shutdown.\n * @param cleanupFn - Function to run during cleanup (can be sync or async)\n * @returns Unregister function that removes the cleanup handler\n */\nexport function registerCleanup(cleanupFn: () => Promise<void>): () => void {\n  cleanupFunctions.add(cleanupFn)\n  return () => cleanupFunctions.delete(cleanupFn) // Return unregister function\n}\n\n/**\n * Run all registered cleanup functions.\n * Used internally by gracefulShutdown.\n */\nexport async function runCleanupFunctions(): Promise<void> {\n  await Promise.all(Array.from(cleanupFunctions).map(fn => fn()))\n}\n", "import memoize from 'lodash-es/memoize.js'\n\nexport type DebugFilter = {\n  include: string[]\n  exclude: string[]\n  isExclusive: boolean\n}\n\n/**\n * Parse debug filter string into a filter configuration\n * Examples:\n * - \"api,hooks\" -> include only api and hooks categories\n * - \"!1p,!file\" -> exclude logging and file categories\n * - undefined/empty -> no filtering (show all)\n */\nexport const parseDebugFilter = memoize(\n  (filterString?: string): DebugFilter | null => {\n    if (!filterString || filterString.trim() === '') {\n      return null\n    }\n\n    const filters = filterString\n      .split(',')\n      .map(f => f.trim())\n      .filter(Boolean)\n\n    // If no valid filters remain, return null\n    if (filters.length === 0) {\n      return null\n    }\n\n    // Check for mixed inclusive/exclusive filters\n    const hasExclusive = filters.some(f => f.startsWith('!'))\n    const hasInclusive = filters.some(f => !f.startsWith('!'))\n\n    if (hasExclusive && hasInclusive) {\n      // For now, we'll treat this as an error case and show all messages\n      // Log error using logForDebugging to avoid console.error lint rule\n      // We'll import and use it later when the circular dependency is resolved\n      // For now, just return null silently\n      return null\n    }\n\n    // Clean up filters (remove ! prefix) and normalize\n    const cleanFilters = filters.map(f => f.replace(/^!/, '').toLowerCase())\n\n    return {\n      include: hasExclusive ? [] : cleanFilters,\n      exclude: hasExclusive ? cleanFilters : [],\n      isExclusive: hasExclusive,\n    }\n  },\n)\n\n/**\n * Extract debug categories from a message\n * Supports multiple patterns:\n * - \"category: message\" -> [\"category\"]\n * - \"[CATEGORY] message\" -> [\"category\"]\n * - \"MCP server \\\"name\\\": message\" -> [\"mcp\", \"name\"]\n * - \"[ANT-ONLY] 1P event: tengu_timer\" -> [\"ant-only\", \"1p\"]\n *\n * Returns lowercase categories for case-insensitive matching\n */\nexport function extractDebugCategories(message: string): string[] {\n  const categories: string[] = []\n\n  // Pattern 3: MCP server \"servername\" - Check this first to avoid false positives\n  const mcpMatch = message.match(/^MCP server [\"']([^\"']+)[\"']/)\n  if (mcpMatch && mcpMatch[1]) {\n    categories.push('mcp')\n    categories.push(mcpMatch[1].toLowerCase())\n  } else {\n    // Pattern 1: \"category: message\" (simple prefix) - only if not MCP pattern\n    const prefixMatch = message.match(/^([^:[]+):/)\n    if (prefixMatch && prefixMatch[1]) {\n      categories.push(prefixMatch[1].trim().toLowerCase())\n    }\n  }\n\n  // Pattern 2: [CATEGORY] at the start\n  const bracketMatch = message.match(/^\\[([^\\]]+)]/)\n  if (bracketMatch && bracketMatch[1]) {\n    categories.push(bracketMatch[1].trim().toLowerCase())\n  }\n\n  // Pattern 4: Check for additional categories in the message\n  // e.g., \"[ANT-ONLY] 1P event: tengu_timer\" should match both \"ant-only\" and \"1p\"\n  if (message.toLowerCase().includes('1p event:')) {\n    categories.push('1p')\n  }\n\n  // Pattern 5: Look for secondary categories after the first pattern\n  // e.g., \"AutoUpdaterWrapper: Installation type: development\"\n  const secondaryMatch = message.match(\n    /:\\s*([^:]+?)(?:\\s+(?:type|mode|status|event))?:/,\n  )\n  if (secondaryMatch && secondaryMatch[1]) {\n    const secondary = secondaryMatch[1].trim().toLowerCase()\n    // Only add if it's a reasonable category name (not too long, no spaces)\n    if (secondary.length < 30 && !secondary.includes(' ')) {\n      categories.push(secondary)\n    }\n  }\n\n  // If no categories found, return empty array (uncategorized)\n  return Array.from(new Set(categories)) // Remove duplicates\n}\n\n/**\n * Check if debug message should be shown based on filter\n * @param categories - Categories extracted from the message\n * @param filter - Parsed filter configuration\n * @returns true if message should be shown\n */\nexport function shouldShowDebugCategories(\n  categories: string[],\n  filter: DebugFilter | null,\n): boolean {\n  // No filter means show everything\n  if (!filter) {\n    return true\n  }\n\n  // If no categories found, handle based on filter mode\n  if (categories.length === 0) {\n    // In exclusive mode, uncategorized messages are excluded by default for security\n    // In inclusive mode, uncategorized messages are excluded (must match a category)\n    return false\n  }\n\n  if (filter.isExclusive) {\n    // Exclusive mode: show if none of the categories are in the exclude list\n    return !categories.some(cat => filter.exclude.includes(cat))\n  } else {\n    // Inclusive mode: show if any of the categories are in the include list\n    return categories.some(cat => filter.include.includes(cat))\n  }\n}\n\n/**\n * Main function to check if a debug message should be shown\n * Combines extraction and filtering\n */\nexport function shouldShowDebugMessage(\n  message: string,\n  filter: DebugFilter | null,\n): boolean {\n  // Fast path: no filter means show everything\n  if (!filter) {\n    return true\n  }\n\n  // Only extract categories if we have a filter\n  const categories = extractDebugCategories(message)\n  return shouldShowDebugCategories(categories, filter)\n}\n", "import { APIUserAbortError } from '@anthropic-ai/sdk'\n\nexport class ClaudeError extends Error {\n  constructor(message: string) {\n    super(message)\n    this.name = this.constructor.name\n  }\n}\n\nexport class MalformedCommandError extends Error {}\n\nexport class AbortError extends Error {\n  constructor(message?: string) {\n    super(message)\n    this.name = 'AbortError'\n  }\n}\n\n/**\n * True iff `e` is any of the abort-shaped errors the codebase encounters:\n * our AbortError class, a DOMException from AbortController.abort()\n * (.name === 'AbortError'), or the SDK's APIUserAbortError. The SDK class\n * is checked via instanceof because minified builds mangle class names \u2014\n * constructor.name becomes something like 'nJT' and the SDK never sets\n * this.name, so string matching silently fails in production.\n */\nexport function isAbortError(e: unknown): boolean {\n  return (\n    e instanceof AbortError ||\n    e instanceof APIUserAbortError ||\n    (e instanceof Error && e.name === 'AbortError')\n  )\n}\n\n/**\n * Custom error class for configuration file parsing errors\n * Includes the file path and the default configuration that should be used\n */\nexport class ConfigParseError extends Error {\n  filePath: string\n  defaultConfig: unknown\n\n  constructor(message: string, filePath: string, defaultConfig: unknown) {\n    super(message)\n    this.name = 'ConfigParseError'\n    this.filePath = filePath\n    this.defaultConfig = defaultConfig\n  }\n}\n\nexport class ShellError extends Error {\n  constructor(\n    public readonly stdout: string,\n    public readonly stderr: string,\n    public readonly code: number,\n    public readonly interrupted: boolean,\n  ) {\n    super('Shell command failed')\n    this.name = 'ShellError'\n  }\n}\n\nexport class TeleportOperationError extends Error {\n  constructor(\n    message: string,\n    public readonly formattedMessage: string,\n  ) {\n    super(message)\n    this.name = 'TeleportOperationError'\n  }\n}\n\n/**\n * Error with a message that is safe to log to telemetry.\n * Use the long name to confirm you've verified the message contains no\n * sensitive data (file paths, URLs, code snippets).\n *\n * Single-arg: same message for user and telemetry\n * Two-arg: different messages (e.g., full message has file path, telemetry doesn't)\n *\n * @example\n * // Same message for both\n * throw new TelemetrySafeError_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS(\n *   'MCP server \"slack\" connection timed out'\n * )\n *\n * // Different messages\n * throw new TelemetrySafeError_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS(\n *   `MCP tool timed out after ${ms}ms`,  // Full message for logs/user\n *   'MCP tool timed out'                  // Telemetry message\n * )\n */\nexport class TelemetrySafeError_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS extends Error {\n  readonly telemetryMessage: string\n\n  constructor(message: string, telemetryMessage?: string) {\n    super(message)\n    this.name = 'TelemetrySafeError'\n    this.telemetryMessage = telemetryMessage ?? message\n  }\n}\n\nexport function hasExactErrorMessage(error: unknown, message: string): boolean {\n  return error instanceof Error && error.message === message\n}\n\n/**\n * Normalize an unknown value into an Error.\n * Use at catch-site boundaries when you need an Error instance.\n */\nexport function toError(e: unknown): Error {\n  return e instanceof Error ? e : new Error(String(e))\n}\n\n/**\n * Extract a string message from an unknown error-like value.\n * Use when you only need the message (e.g., for logging or display).\n */\nexport function errorMessage(e: unknown): string {\n  return e instanceof Error ? e.message : String(e)\n}\n\n/**\n * Extract the errno code (e.g., 'ENOENT', 'EACCES') from a caught error.\n * Returns undefined if the error has no code or is not an ErrnoException.\n * Replaces the `(e as NodeJS.ErrnoException).code` cast pattern.\n */\nexport function getErrnoCode(e: unknown): string | undefined {\n  if (e && typeof e === 'object' && 'code' in e && typeof e.code === 'string') {\n    return e.code\n  }\n  return undefined\n}\n\n/**\n * True if the error is ENOENT (file or directory does not exist).\n * Replaces `(e as NodeJS.ErrnoException).code === 'ENOENT'`.\n */\nexport function isENOENT(e: unknown): boolean {\n  return getErrnoCode(e) === 'ENOENT'\n}\n\n/**\n * Extract the errno path (the filesystem path that triggered the error)\n * from a caught error. Returns undefined if the error has no path.\n * Replaces the `(e as NodeJS.ErrnoException).path` cast pattern.\n */\nexport function getErrnoPath(e: unknown): string | undefined {\n  if (e && typeof e === 'object' && 'path' in e && typeof e.path === 'string') {\n    return e.path\n  }\n  return undefined\n}\n\n/**\n * Extract error message + top N stack frames from an unknown error.\n * Use when the error flows to the model as a tool_result \u2014 full stack\n * traces are ~500-2000 chars of mostly-irrelevant internal frames and\n * waste context tokens. Keep the full stack in debug logs instead.\n */\nexport function shortErrorStack(e: unknown, maxFrames = 5): string {\n  if (!(e instanceof Error)) return String(e)\n  if (!e.stack) return e.message\n  // V8/Bun stack format: \"Name: message\\n    at frame1\\n    at frame2...\"\n  // First line is the message; subsequent \"    at \" lines are frames.\n  const lines = e.stack.split('\\n')\n  const header = lines[0] ?? e.message\n  const frames = lines.slice(1).filter(l => l.trim().startsWith('at '))\n  if (frames.length <= maxFrames) return e.stack\n  return [header, ...frames.slice(0, maxFrames)].join('\\n')\n}\n\n/**\n * True if the error means the path is missing, inaccessible, or\n * structurally unreachable \u2014 use in catch blocks after fs operations to\n * distinguish expected \"nothing there / no access\" from unexpected errors.\n *\n * Covers:\n *  ENOENT    \u2014 path does not exist\n *  EACCES    \u2014 permission denied\n *  EPERM     \u2014 operation not permitted\n *  ENOTDIR   \u2014 a path component is not a directory (e.g. a file named\n *              `.claude` exists where a directory is expected)\n *  ELOOP     \u2014 too many symlink levels (circular symlinks)\n */\nexport function isFsInaccessible(e: unknown): e is NodeJS.ErrnoException {\n  const code = getErrnoCode(e)\n  return (\n    code === 'ENOENT' ||\n    code === 'EACCES' ||\n    code === 'EPERM' ||\n    code === 'ENOTDIR' ||\n    code === 'ELOOP'\n  )\n}\n\nexport type AxiosErrorKind =\n  | 'auth' // 401/403 \u2014 caller typically sets skipRetry\n  | 'timeout' // ECONNABORTED\n  | 'network' // ECONNREFUSED/ENOTFOUND\n  | 'http' // other axios error (may have status)\n  | 'other' // not an axios error\n\n/**\n * Classify a caught error from an axios request into one of a few buckets.\n * Replaces the ~20-line isAxiosError \u2192 401/403 \u2192 ECONNABORTED \u2192 ECONNREFUSED\n * chain duplicated across sync-style services (settingsSync, policyLimits,\n * remoteManagedSettings, teamMemorySync).\n *\n * Checks the `.isAxiosError` marker property directly (same as\n * axios.isAxiosError()) to keep this module dependency-free.\n */\nexport function classifyAxiosError(e: unknown): {\n  kind: AxiosErrorKind\n  status?: number\n  message: string\n} {\n  const message = errorMessage(e)\n  if (\n    !e ||\n    typeof e !== 'object' ||\n    !('isAxiosError' in e) ||\n    !e.isAxiosError\n  ) {\n    return { kind: 'other', message }\n  }\n  const err = e as {\n    response?: { status?: number }\n    code?: string\n  }\n  const status = err.response?.status\n  if (status === 401 || status === 403) return { kind: 'auth', status, message }\n  if (err.code === 'ECONNABORTED') return { kind: 'timeout', status, message }\n  if (err.code === 'ECONNREFUSED' || err.code === 'ENOTFOUND') {\n    return { kind: 'network', status, message }\n  }\n  return { kind: 'http', status, message }\n}\n", "import { feature } from 'bun:bundle'\nimport type { WriteFileOptions } from 'fs'\nimport {\n  closeSync,\n  writeFileSync as fsWriteFileSync,\n  fsyncSync,\n  openSync,\n} from 'fs'\n// biome-ignore lint: This file IS the cloneDeep wrapper - it must import the original\nimport lodashCloneDeep from 'lodash-es/cloneDeep.js'\nimport { addSlowOperation } from '../bootstrap/state.js'\nimport { logForDebugging } from './debug.js'\n\n// Extended WriteFileOptions to include 'flush' which is available in Node.js 20.1.0+\n// but not yet in @types/node\ntype WriteFileOptionsWithFlush =\n  | WriteFileOptions\n  | (WriteFileOptions & { flush?: boolean })\n\n// --- Slow operation logging infrastructure ---\n\n/**\n * Threshold in milliseconds for logging slow JSON/clone operations.\n * Operations taking longer than this will be logged for debugging.\n * - Override: set CLAUDE_CODE_SLOW_OPERATION_THRESHOLD_MS to a number\n * - Dev builds: 20ms (lower threshold for development)\n * - Ants: 300ms (enabled for all internal users)\n */\nconst SLOW_OPERATION_THRESHOLD_MS = (() => {\n  const envValue = process.env.CLAUDE_CODE_SLOW_OPERATION_THRESHOLD_MS\n  if (envValue !== undefined) {\n    const parsed = Number(envValue)\n    if (!Number.isNaN(parsed) && parsed >= 0) {\n      return parsed\n    }\n  }\n  if (process.env.NODE_ENV === 'development') {\n    return 20\n  }\n  if (process.env.USER_TYPE === 'ant') {\n    return 300\n  }\n  return Infinity\n})()\n\n// Re-export for callers that still need the threshold value directly\nexport { SLOW_OPERATION_THRESHOLD_MS }\n\n// Module-level re-entrancy guard. logForDebugging writes to a debug file via\n// appendFileSync, which goes through slowLogging again. Without this guard,\n// a slow appendFileSync \u2192 dispose \u2192 logForDebugging \u2192 appendFileSync \u2192 dispose \u2192 ...\nlet isLogging = false\n\n/**\n * Extract the first stack frame outside this file, so the DevBar warning\n * points at the actual caller instead of a useless `Object{N keys}`.\n * Only called when an operation was actually slow \u2014 never on the fast path.\n */\nexport function callerFrame(stack: string | undefined): string {\n  if (!stack) return ''\n  for (const line of stack.split('\\n')) {\n    if (line.includes('slowOperations')) continue\n    const m = line.match(/([^/\\\\]+?):(\\d+):\\d+\\)?$/)\n    if (m) return ` @ ${m[1]}:${m[2]}`\n  }\n  return ''\n}\n\n/**\n * Builds a human-readable description from tagged template arguments.\n * Only called when an operation was actually slow \u2014 never on the fast path.\n *\n * args[0] = TemplateStringsArray, args[1..n] = interpolated values\n */\nfunction buildDescription(args: IArguments): string {\n  const strings = args[0] as TemplateStringsArray\n  let result = ''\n  for (let i = 0; i < strings.length; i++) {\n    result += strings[i]\n    if (i + 1 < args.length) {\n      const v = args[i + 1]\n      if (Array.isArray(v)) {\n        result += `Array[${(v as unknown[]).length}]`\n      } else if (v !== null && typeof v === 'object') {\n        result += `Object{${Object.keys(v as Record<string, unknown>).length} keys}`\n      } else if (typeof v === 'string') {\n        result += v.length > 80 ? `${v.slice(0, 80)}\u2026` : v\n      } else {\n        result += String(v)\n      }\n    }\n  }\n  return result\n}\n\nclass AntSlowLogger {\n  startTime: number\n  args: IArguments\n  err: Error\n\n  constructor(args: IArguments) {\n    this.startTime = performance.now()\n    this.args = args\n    // V8/JSC capture the stack at construction but defer the expensive string\n    // formatting until .stack is read \u2014 so this stays off the fast path.\n    this.err = new Error()\n  }\n\n  [Symbol.dispose](): void {\n    const duration = performance.now() - this.startTime\n    if (duration > SLOW_OPERATION_THRESHOLD_MS && !isLogging) {\n      isLogging = true\n      try {\n        const description =\n          buildDescription(this.args) + callerFrame(this.err.stack)\n        logForDebugging(\n          `[SLOW OPERATION DETECTED] ${description} (${duration.toFixed(1)}ms)`,\n        )\n        addSlowOperation(description, duration)\n      } finally {\n        isLogging = false\n      }\n    }\n  }\n}\n\nconst NOOP_LOGGER: Disposable = { [Symbol.dispose]() {} }\n\n// Must be regular functions (not arrows) to access `arguments`\nfunction slowLoggingAnt(\n  _strings: TemplateStringsArray,\n  ..._values: unknown[]\n): AntSlowLogger {\n  // eslint-disable-next-line prefer-rest-params\n  return new AntSlowLogger(arguments)\n}\n\nfunction slowLoggingExternal(): Disposable {\n  return NOOP_LOGGER\n}\n\n/**\n * Tagged template for slow operation logging.\n *\n * In ANT builds: creates an AntSlowLogger that times the operation and logs\n * if it exceeds the threshold. Description is built lazily only when slow.\n *\n * In external builds: returns a singleton no-op disposable. Zero allocations,\n * zero timing. AntSlowLogger and buildDescription are dead-code-eliminated.\n *\n * @example\n * using _ = slowLogging`structuredClone(${value})`\n * const result = structuredClone(value)\n */\nexport const slowLogging: {\n  (strings: TemplateStringsArray, ...values: unknown[]): Disposable\n} = feature('SLOW_OPERATION_LOGGING') ? slowLoggingAnt : slowLoggingExternal\n\n// --- Wrapped operations ---\n\n/**\n * Wrapped JSON.stringify with slow operation logging.\n * Use this instead of JSON.stringify directly to detect performance issues.\n *\n * @example\n * import { jsonStringify } from './slowOperations.js'\n * const json = jsonStringify(data)\n * const prettyJson = jsonStringify(data, null, 2)\n */\nexport function jsonStringify(\n  value: unknown,\n  replacer?: (this: unknown, key: string, value: unknown) => unknown,\n  space?: string | number,\n): string\nexport function jsonStringify(\n  value: unknown,\n  replacer?: (number | string)[] | null,\n  space?: string | number,\n): string\nexport function jsonStringify(\n  value: unknown,\n  replacer?:\n    | ((this: unknown, key: string, value: unknown) => unknown)\n    | (number | string)[]\n    | null,\n  space?: string | number,\n): string {\n  using _ = slowLogging`JSON.stringify(${value})`\n  return JSON.stringify(\n    value,\n    replacer as Parameters<typeof JSON.stringify>[1],\n    space,\n  )\n}\n\n/**\n * Wrapped JSON.parse with slow operation logging.\n * Use this instead of JSON.parse directly to detect performance issues.\n *\n * @example\n * import { jsonParse } from './slowOperations.js'\n * const data = jsonParse(jsonString)\n */\nexport const jsonParse: typeof JSON.parse = (text, reviver) => {\n  using _ = slowLogging`JSON.parse(${text})`\n  // V8 de-opts JSON.parse when a second argument is passed, even if undefined.\n  // Branch explicitly so the common (no-reviver) path stays on the fast path.\n  return typeof reviver === 'undefined'\n    ? JSON.parse(text)\n    : JSON.parse(text, reviver)\n}\n\n/**\n * Wrapped structuredClone with slow operation logging.\n * Use this instead of structuredClone directly to detect performance issues.\n *\n * @example\n * import { clone } from './slowOperations.js'\n * const copy = clone(originalObject)\n */\nexport function clone<T>(value: T, options?: StructuredSerializeOptions): T {\n  using _ = slowLogging`structuredClone(${value})`\n  return structuredClone(value, options)\n}\n\n/**\n * Wrapped cloneDeep with slow operation logging.\n * Use this instead of lodash cloneDeep directly to detect performance issues.\n *\n * @example\n * import { cloneDeep } from './slowOperations.js'\n * const copy = cloneDeep(originalObject)\n */\nexport function cloneDeep<T>(value: T): T {\n  using _ = slowLogging`cloneDeep(${value})`\n  return lodashCloneDeep(value)\n}\n\n/**\n * Wrapper around fs.writeFileSync with slow operation logging.\n * Supports flush option to ensure data is written to disk before returning.\n * @param filePath The path to the file to write to\n * @param data The data to write (string or Buffer)\n * @param options Optional write options (encoding, mode, flag, flush)\n * @deprecated Use `fs.promises.writeFile` instead for non-blocking writes.\n * Sync file writes block the event loop and cause performance issues.\n */\nexport function writeFileSync_DEPRECATED(\n  filePath: string,\n  data: string | NodeJS.ArrayBufferView,\n  options?: WriteFileOptionsWithFlush,\n): void {\n  using _ = slowLogging`fs.writeFileSync(${filePath}, ${data})`\n\n  // Check if flush is requested (for object-style options)\n  const needsFlush =\n    options !== null &&\n    typeof options === 'object' &&\n    'flush' in options &&\n    options.flush === true\n\n  if (needsFlush) {\n    // Manual flush: open file, write, fsync, close\n    const encoding =\n      typeof options === 'object' && 'encoding' in options\n        ? options.encoding\n        : undefined\n    const mode =\n      typeof options === 'object' && 'mode' in options\n        ? options.mode\n        : undefined\n    let fd: number | undefined\n    try {\n      fd = openSync(filePath, 'w', mode)\n      fsWriteFileSync(fd, data, { encoding: encoding ?? undefined })\n      fsyncSync(fd)\n    } finally {\n      if (fd !== undefined) {\n        closeSync(fd)\n      }\n    }\n  } else {\n    // No flush needed, use standard writeFileSync\n    fsWriteFileSync(filePath, data, options as WriteFileOptions)\n  }\n}\n", "import * as fs from 'fs'\nimport {\n  mkdir as mkdirPromise,\n  open,\n  readdir as readdirPromise,\n  readFile as readFilePromise,\n  rename as renamePromise,\n  rmdir as rmdirPromise,\n  rm as rmPromise,\n  stat as statPromise,\n  unlink as unlinkPromise,\n} from 'fs/promises'\nimport { homedir } from 'os'\nimport * as nodePath from 'path'\nimport { getErrnoCode } from './errors.js'\nimport { slowLogging } from './slowOperations.js'\n\n/**\n * Simplified filesystem operations interface based on Node.js fs module.\n * Provides a subset of commonly used sync operations with type safety.\n * Allows abstraction for alternative implementations (e.g., mock, virtual).\n */\nexport type FsOperations = {\n  // File access and information operations\n  /** Gets the current working directory */\n  cwd(): string\n  /** Checks if a file or directory exists */\n  existsSync(path: string): boolean\n  /** Gets file stats asynchronously */\n  stat(path: string): Promise<fs.Stats>\n  /** Lists directory contents with file type information asynchronously */\n  readdir(path: string): Promise<fs.Dirent[]>\n  /** Deletes file asynchronously */\n  unlink(path: string): Promise<void>\n  /** Removes an empty directory asynchronously */\n  rmdir(path: string): Promise<void>\n  /** Removes files and directories asynchronously (with recursive option) */\n  rm(\n    path: string,\n    options?: { recursive?: boolean; force?: boolean },\n  ): Promise<void>\n  /** Creates directory recursively asynchronously. */\n  mkdir(path: string, options?: { mode?: number }): Promise<void>\n  /** Reads file content as string asynchronously */\n  readFile(path: string, options: { encoding: BufferEncoding }): Promise<string>\n  /** Renames/moves file asynchronously */\n  rename(oldPath: string, newPath: string): Promise<void>\n  /** Gets file stats */\n  statSync(path: string): fs.Stats\n  /** Gets file stats without following symlinks */\n  lstatSync(path: string): fs.Stats\n\n  // File content operations\n  /** Reads file content as string with specified encoding */\n  readFileSync(\n    path: string,\n    options: {\n      encoding: BufferEncoding\n    },\n  ): string\n  /** Reads raw file bytes as Buffer */\n  readFileBytesSync(path: string): Buffer\n  /** Reads specified number of bytes from file start */\n  readSync(\n    path: string,\n    options: {\n      length: number\n    },\n  ): {\n    buffer: Buffer\n    bytesRead: number\n  }\n  /** Appends string to file */\n  appendFileSync(path: string, data: string, options?: { mode?: number }): void\n  /** Copies file from source to destination */\n  copyFileSync(src: string, dest: string): void\n  /** Deletes file */\n  unlinkSync(path: string): void\n  /** Renames/moves file */\n  renameSync(oldPath: string, newPath: string): void\n  /** Creates hard link */\n  linkSync(target: string, path: string): void\n  /** Creates symbolic link */\n  symlinkSync(\n    target: string,\n    path: string,\n    type?: 'dir' | 'file' | 'junction',\n  ): void\n  /** Reads symbolic link */\n  readlinkSync(path: string): string\n  /** Resolves symbolic links and returns the canonical pathname */\n  realpathSync(path: string): string\n\n  // Directory operations\n  /** Creates directory recursively. Mode defaults to 0o777 & ~umask if not specified. */\n  mkdirSync(\n    path: string,\n    options?: {\n      mode?: number\n    },\n  ): void\n  /** Lists directory contents with file type information */\n  readdirSync(path: string): fs.Dirent[]\n  /** Lists directory contents as strings */\n  readdirStringSync(path: string): string[]\n  /** Checks if the directory is empty */\n  isDirEmptySync(path: string): boolean\n  /** Removes an empty directory */\n  rmdirSync(path: string): void\n  /** Removes files and directories (with recursive option) */\n  rmSync(\n    path: string,\n    options?: {\n      recursive?: boolean\n      force?: boolean\n    },\n  ): void\n  /** Create a writable stream for writing data to a file. */\n  createWriteStream(path: string): fs.WriteStream\n  /** Reads raw file bytes as Buffer asynchronously.\n   *  When maxBytes is set, only reads up to that many bytes. */\n  readFileBytes(path: string, maxBytes?: number): Promise<Buffer>\n}\n\n/**\n * Safely resolves a file path, handling symlinks and errors gracefully.\n *\n * Error handling strategy:\n * - If the file doesn't exist, returns the original path (allows for file creation)\n * - If symlink resolution fails (broken symlink, permission denied, circular links),\n *   returns the original path and marks it as not a symlink\n * - This ensures operations can continue with the original path rather than failing\n *\n * @param fs The filesystem implementation to use\n * @param filePath The path to resolve\n * @returns Object containing the resolved path and whether it was a symlink\n */\nexport function safeResolvePath(\n  fs: FsOperations,\n  filePath: string,\n): { resolvedPath: string; isSymlink: boolean; isCanonical: boolean } {\n  // Block UNC paths before any filesystem access to prevent network\n  // requests (DNS/SMB) during validation on Windows\n  if (filePath.startsWith('//') || filePath.startsWith('\\\\\\\\')) {\n    return { resolvedPath: filePath, isSymlink: false, isCanonical: false }\n  }\n\n  try {\n    // Check for special file types (FIFOs, sockets, devices) before calling realpathSync.\n    // realpathSync can block on FIFOs waiting for a writer, causing hangs.\n    // If the file doesn't exist, lstatSync throws ENOENT which the catch\n    // below handles by returning the original path (allows file creation).\n    const stats = fs.lstatSync(filePath)\n    if (\n      stats.isFIFO() ||\n      stats.isSocket() ||\n      stats.isCharacterDevice() ||\n      stats.isBlockDevice()\n    ) {\n      return { resolvedPath: filePath, isSymlink: false, isCanonical: false }\n    }\n\n    const resolvedPath = fs.realpathSync(filePath)\n    return {\n      resolvedPath,\n      isSymlink: resolvedPath !== filePath,\n      // realpathSync returned: resolvedPath is canonical (all symlinks in\n      // all path components resolved). Callers can skip further symlink\n      // resolution on this path.\n      isCanonical: true,\n    }\n  } catch (_error) {\n    // If lstat/realpath fails for any reason (ENOENT, broken symlink,\n    // EACCES, ELOOP, etc.), return the original path to allow operations\n    // to proceed\n    return { resolvedPath: filePath, isSymlink: false, isCanonical: false }\n  }\n}\n\n/**\n * Check if a file path is a duplicate and should be skipped.\n * Resolves symlinks to detect duplicates pointing to the same file.\n * If not a duplicate, adds the resolved path to loadedPaths.\n *\n * @returns true if the file should be skipped (is duplicate)\n */\nexport function isDuplicatePath(\n  fs: FsOperations,\n  filePath: string,\n  loadedPaths: Set<string>,\n): boolean {\n  const { resolvedPath } = safeResolvePath(fs, filePath)\n  if (loadedPaths.has(resolvedPath)) {\n    return true\n  }\n  loadedPaths.add(resolvedPath)\n  return false\n}\n\n/**\n * Resolve the deepest existing ancestor of a path via realpathSync, walking\n * up until it succeeds. Detects dangling symlinks (link entry exists, target\n * doesn't) via lstat and resolves them via readlink.\n *\n * Use when the input path may not exist (new file writes) and you need to\n * know where the write would ACTUALLY land after the OS follows symlinks.\n *\n * Returns the resolved absolute path with non-existent tail segments\n * rejoined, or undefined if no symlink was found in any existing ancestor\n * (the path's existing ancestors all resolve to themselves).\n *\n * Handles: live parent symlinks, dangling file symlinks, dangling parent\n * symlinks. Same core algorithm as teamMemPaths.ts:realpathDeepestExisting.\n */\nexport function resolveDeepestExistingAncestorSync(\n  fs: FsOperations,\n  absolutePath: string,\n): string | undefined {\n  let dir = absolutePath\n  const segments: string[] = []\n  // Walk up using lstat (cheap, O(1)) to find the first existing component.\n  // lstat does not follow symlinks, so dangling symlinks are detected here.\n  // Only call realpathSync (expensive, O(depth)) once at the end.\n  while (dir !== nodePath.dirname(dir)) {\n    let st: fs.Stats\n    try {\n      st = fs.lstatSync(dir)\n    } catch {\n      // lstat failed: truly non-existent. Walk up.\n      segments.unshift(nodePath.basename(dir))\n      dir = nodePath.dirname(dir)\n      continue\n    }\n    if (st.isSymbolicLink()) {\n      // Found a symlink (live or dangling). Try realpath first (resolves\n      // chained symlinks); fall back to readlink for dangling symlinks.\n      try {\n        const resolved = fs.realpathSync(dir)\n        return segments.length === 0\n          ? resolved\n          : nodePath.join(resolved, ...segments)\n      } catch {\n        // Dangling: realpath failed but lstat saw the link entry.\n        const target = fs.readlinkSync(dir)\n        const absTarget = nodePath.isAbsolute(target)\n          ? target\n          : nodePath.resolve(nodePath.dirname(dir), target)\n        return segments.length === 0\n          ? absTarget\n          : nodePath.join(absTarget, ...segments)\n      }\n    }\n    // Existing non-symlink component. One realpath call resolves any\n    // symlinks in its ancestors. If none, return undefined (no symlink).\n    try {\n      const resolved = fs.realpathSync(dir)\n      if (resolved !== dir) {\n        return segments.length === 0\n          ? resolved\n          : nodePath.join(resolved, ...segments)\n      }\n    } catch {\n      // realpath can still fail (e.g. EACCES in ancestors). Return\n      // undefined \u2014 we can't resolve, and the logical path is already\n      // in pathSet for the caller.\n    }\n    return undefined\n  }\n  return undefined\n}\n\n/**\n * Gets all paths that should be checked for permissions.\n * This includes the original path, all intermediate symlink targets in the chain,\n * and the final resolved path.\n *\n * For example, if test.txt -> /etc/passwd -> /private/etc/passwd:\n * - test.txt (original path)\n * - /etc/passwd (intermediate symlink target)\n * - /private/etc/passwd (final resolved path)\n *\n * This is important for security: a deny rule for /etc/passwd should block\n * access even if the file is actually at /private/etc/passwd (as on macOS).\n *\n * @param path - The path to check (will be converted to absolute)\n * @returns An array of absolute paths to check permissions for\n */\nexport function getPathsForPermissionCheck(inputPath: string): string[] {\n  // Expand tilde notation defensively - tools should do this in getPath(),\n  // but we normalize here as defense in depth for permission checking\n  let path = inputPath\n  if (path === '~') {\n    path = homedir().normalize('NFC')\n  } else if (path.startsWith('~/')) {\n    path = nodePath.join(homedir().normalize('NFC'), path.slice(2))\n  }\n\n  const pathSet = new Set<string>()\n  const fsImpl = getFsImplementation()\n\n  // Always check the original path\n  pathSet.add(path)\n\n  // Block UNC paths before any filesystem access to prevent network\n  // requests (DNS/SMB) during validation on Windows\n  if (path.startsWith('//') || path.startsWith('\\\\\\\\')) {\n    return Array.from(pathSet)\n  }\n\n  // Follow the symlink chain, collecting ALL intermediate targets\n  // This handles cases like: test.txt -> /etc/passwd -> /private/etc/passwd\n  // We want to check all three paths, not just test.txt and /private/etc/passwd\n  try {\n    let currentPath = path\n    const visited = new Set<string>()\n    const maxDepth = 40 // Prevent runaway loops, matches typical SYMLOOP_MAX\n\n    for (let depth = 0; depth < maxDepth; depth++) {\n      // Prevent infinite loops from circular symlinks\n      if (visited.has(currentPath)) {\n        break\n      }\n      visited.add(currentPath)\n\n      if (!fsImpl.existsSync(currentPath)) {\n        // Path doesn't exist (new file case). existsSync follows symlinks,\n        // so this is also reached for DANGLING symlinks (link entry exists,\n        // target doesn't). Resolve symlinks in the path and its ancestors\n        // so permission checks see the real destination. Without this,\n        // `./data -> /etc/cron.d/` (live parent symlink) or\n        // `./evil.txt -> ~/.ssh/authorized_keys2` (dangling file symlink)\n        // would allow writes that escape the working directory.\n        if (currentPath === path) {\n          const resolved = resolveDeepestExistingAncestorSync(fsImpl, path)\n          if (resolved !== undefined) {\n            pathSet.add(resolved)\n          }\n        }\n        break\n      }\n\n      const stats = fsImpl.lstatSync(currentPath)\n\n      // Skip special file types that can cause issues\n      if (\n        stats.isFIFO() ||\n        stats.isSocket() ||\n        stats.isCharacterDevice() ||\n        stats.isBlockDevice()\n      ) {\n        break\n      }\n\n      if (!stats.isSymbolicLink()) {\n        break\n      }\n\n      // Get the immediate symlink target\n      const target = fsImpl.readlinkSync(currentPath)\n\n      // If target is relative, resolve it relative to the symlink's directory\n      const absoluteTarget = nodePath.isAbsolute(target)\n        ? target\n        : nodePath.resolve(nodePath.dirname(currentPath), target)\n\n      // Add this intermediate target to the set\n      pathSet.add(absoluteTarget)\n      currentPath = absoluteTarget\n    }\n  } catch {\n    // If anything fails during chain traversal, continue with what we have\n  }\n\n  // Also add the final resolved path using realpathSync for completeness\n  // This handles any remaining symlinks in directory components\n  const { resolvedPath, isSymlink } = safeResolvePath(fsImpl, path)\n  if (isSymlink && resolvedPath !== path) {\n    pathSet.add(resolvedPath)\n  }\n\n  return Array.from(pathSet)\n}\n\nexport const NodeFsOperations: FsOperations = {\n  cwd() {\n    return process.cwd()\n  },\n\n  existsSync(fsPath) {\n    using _ = slowLogging`fs.existsSync(${fsPath})`\n    return fs.existsSync(fsPath)\n  },\n\n  async stat(fsPath) {\n    return statPromise(fsPath)\n  },\n\n  async readdir(fsPath) {\n    return readdirPromise(fsPath, { withFileTypes: true })\n  },\n\n  async unlink(fsPath) {\n    return unlinkPromise(fsPath)\n  },\n\n  async rmdir(fsPath) {\n    return rmdirPromise(fsPath)\n  },\n\n  async rm(fsPath, options) {\n    return rmPromise(fsPath, options)\n  },\n\n  async mkdir(dirPath, options) {\n    try {\n      await mkdirPromise(dirPath, { recursive: true, ...options })\n    } catch (e) {\n      // Bun/Windows: recursive:true throws EEXIST on directories with the\n      // FILE_ATTRIBUTE_READONLY bit set (Group Policy, OneDrive, desktop.ini).\n      // Bun's directoryExistsAt misclassifies DIRECTORY+READONLY as not-a-dir\n      // (bun-internal src/sys.zig existsAtType). The dir exists; ignore.\n      // https://github.com/anthropics/claude-code/issues/30924\n      if (getErrnoCode(e) !== 'EEXIST') throw e\n    }\n  },\n\n  async readFile(fsPath, options) {\n    return readFilePromise(fsPath, { encoding: options.encoding })\n  },\n\n  async rename(oldPath, newPath) {\n    return renamePromise(oldPath, newPath)\n  },\n\n  statSync(fsPath) {\n    using _ = slowLogging`fs.statSync(${fsPath})`\n    return fs.statSync(fsPath)\n  },\n\n  lstatSync(fsPath) {\n    using _ = slowLogging`fs.lstatSync(${fsPath})`\n    return fs.lstatSync(fsPath)\n  },\n\n  readFileSync(fsPath, options) {\n    using _ = slowLogging`fs.readFileSync(${fsPath})`\n    return fs.readFileSync(fsPath, { encoding: options.encoding })\n  },\n\n  readFileBytesSync(fsPath) {\n    using _ = slowLogging`fs.readFileBytesSync(${fsPath})`\n    return fs.readFileSync(fsPath)\n  },\n\n  readSync(fsPath, options) {\n    using _ = slowLogging`fs.readSync(${fsPath}, ${options.length} bytes)`\n    let fd: number | undefined = undefined\n    try {\n      fd = fs.openSync(fsPath, 'r')\n      const buffer = Buffer.alloc(options.length)\n      const bytesRead = fs.readSync(fd, buffer, 0, options.length, 0)\n      return { buffer, bytesRead }\n    } finally {\n      if (fd) fs.closeSync(fd)\n    }\n  },\n\n  appendFileSync(path, data, options) {\n    using _ = slowLogging`fs.appendFileSync(${path}, ${data.length} chars)`\n    // For new files with explicit mode, use 'ax' (atomic create-with-mode) to avoid\n    // TOCTOU race between existence check and open. Fall back to normal append if exists.\n    if (options?.mode !== undefined) {\n      try {\n        const fd = fs.openSync(path, 'ax', options.mode)\n        try {\n          fs.appendFileSync(fd, data)\n        } finally {\n          fs.closeSync(fd)\n        }\n        return\n      } catch (e) {\n        if (getErrnoCode(e) !== 'EEXIST') throw e\n        // File exists \u2014 fall through to normal append\n      }\n    }\n    fs.appendFileSync(path, data)\n  },\n\n  copyFileSync(src, dest) {\n    using _ = slowLogging`fs.copyFileSync(${src} \u2192 ${dest})`\n    fs.copyFileSync(src, dest)\n  },\n\n  unlinkSync(path: string) {\n    using _ = slowLogging`fs.unlinkSync(${path})`\n    fs.unlinkSync(path)\n  },\n\n  renameSync(oldPath: string, newPath: string) {\n    using _ = slowLogging`fs.renameSync(${oldPath} \u2192 ${newPath})`\n    fs.renameSync(oldPath, newPath)\n  },\n\n  linkSync(target: string, path: string) {\n    using _ = slowLogging`fs.linkSync(${target} \u2192 ${path})`\n    fs.linkSync(target, path)\n  },\n\n  symlinkSync(\n    target: string,\n    path: string,\n    type?: 'dir' | 'file' | 'junction',\n  ) {\n    using _ = slowLogging`fs.symlinkSync(${target} \u2192 ${path})`\n    fs.symlinkSync(target, path, type)\n  },\n\n  readlinkSync(path: string) {\n    using _ = slowLogging`fs.readlinkSync(${path})`\n    return fs.readlinkSync(path)\n  },\n\n  realpathSync(path: string) {\n    using _ = slowLogging`fs.realpathSync(${path})`\n    return fs.realpathSync(path).normalize('NFC')\n  },\n\n  mkdirSync(dirPath, options) {\n    using _ = slowLogging`fs.mkdirSync(${dirPath})`\n    const mkdirOptions: { recursive: boolean; mode?: number } = {\n      recursive: true,\n    }\n    if (options?.mode !== undefined) {\n      mkdirOptions.mode = options.mode\n    }\n    try {\n      fs.mkdirSync(dirPath, mkdirOptions)\n    } catch (e) {\n      // Bun/Windows: recursive:true throws EEXIST on directories with the\n      // FILE_ATTRIBUTE_READONLY bit set (Group Policy, OneDrive, desktop.ini).\n      // Bun's directoryExistsAt misclassifies DIRECTORY+READONLY as not-a-dir\n      // (bun-internal src/sys.zig existsAtType). The dir exists; ignore.\n      // https://github.com/anthropics/claude-code/issues/30924\n      if (getErrnoCode(e) !== 'EEXIST') throw e\n    }\n  },\n\n  readdirSync(dirPath) {\n    using _ = slowLogging`fs.readdirSync(${dirPath})`\n    return fs.readdirSync(dirPath, { withFileTypes: true })\n  },\n\n  readdirStringSync(dirPath) {\n    using _ = slowLogging`fs.readdirStringSync(${dirPath})`\n    return fs.readdirSync(dirPath)\n  },\n\n  isDirEmptySync(dirPath) {\n    using _ = slowLogging`fs.isDirEmptySync(${dirPath})`\n    const files = this.readdirSync(dirPath)\n    return files.length === 0\n  },\n\n  rmdirSync(dirPath) {\n    using _ = slowLogging`fs.rmdirSync(${dirPath})`\n    fs.rmdirSync(dirPath)\n  },\n\n  rmSync(path, options) {\n    using _ = slowLogging`fs.rmSync(${path})`\n    fs.rmSync(path, options)\n  },\n\n  createWriteStream(path: string) {\n    return fs.createWriteStream(path)\n  },\n\n  async readFileBytes(fsPath: string, maxBytes?: number) {\n    if (maxBytes === undefined) {\n      return readFilePromise(fsPath)\n    }\n    const handle = await open(fsPath, 'r')\n    try {\n      const { size } = await handle.stat()\n      const readSize = Math.min(size, maxBytes)\n      const buffer = Buffer.allocUnsafe(readSize)\n      let offset = 0\n      while (offset < readSize) {\n        const { bytesRead } = await handle.read(\n          buffer,\n          offset,\n          readSize - offset,\n          offset,\n        )\n        if (bytesRead === 0) break\n        offset += bytesRead\n      }\n      return offset < readSize ? buffer.subarray(0, offset) : buffer\n    } finally {\n      await handle.close()\n    }\n  },\n}\n\n// The currently active filesystem implementation\nlet activeFs: FsOperations = NodeFsOperations\n\n/**\n * Overrides the filesystem implementation. Note: This function does not\n * automatically update cwd.\n * @param implementation The filesystem implementation to use\n */\nexport function setFsImplementation(implementation: FsOperations): void {\n  activeFs = implementation\n}\n\n/**\n * Gets the currently active filesystem implementation\n * @returns The currently active filesystem implementation\n */\nexport function getFsImplementation(): FsOperations {\n  return activeFs\n}\n\n/**\n * Resets the filesystem implementation to the default Node.js implementation.\n * Note: This function does not automatically update cwd.\n */\nexport function setOriginalFsImplementation(): void {\n  activeFs = NodeFsOperations\n}\n\nexport type ReadFileRangeResult = {\n  content: string\n  bytesRead: number\n  bytesTotal: number\n}\n\n/**\n * Read up to `maxBytes` from a file starting at `offset`.\n * Returns a flat string from Buffer \u2014 no sliced string references to a\n * larger parent. Returns null if the file is smaller than the offset.\n */\nexport async function readFileRange(\n  path: string,\n  offset: number,\n  maxBytes: number,\n): Promise<ReadFileRangeResult | null> {\n  await using fh = await open(path, 'r')\n  const size = (await fh.stat()).size\n  if (size <= offset) {\n    return null\n  }\n  const bytesToRead = Math.min(size - offset, maxBytes)\n  const buffer = Buffer.allocUnsafe(bytesToRead)\n\n  let totalRead = 0\n  while (totalRead < bytesToRead) {\n    const { bytesRead } = await fh.read(\n      buffer,\n      totalRead,\n      bytesToRead - totalRead,\n      offset + totalRead,\n    )\n    if (bytesRead === 0) {\n      break\n    }\n    totalRead += bytesRead\n  }\n\n  return {\n    content: buffer.toString('utf8', 0, totalRead),\n    bytesRead: totalRead,\n    bytesTotal: size,\n  }\n}\n\n/**\n * Read the last `maxBytes` of a file.\n * Returns the whole file if it's smaller than maxBytes.\n */\nexport async function tailFile(\n  path: string,\n  maxBytes: number,\n): Promise<ReadFileRangeResult> {\n  await using fh = await open(path, 'r')\n  const size = (await fh.stat()).size\n  if (size === 0) {\n    return { content: '', bytesRead: 0, bytesTotal: 0 }\n  }\n  const offset = Math.max(0, size - maxBytes)\n  const bytesToRead = size - offset\n  const buffer = Buffer.allocUnsafe(bytesToRead)\n\n  let totalRead = 0\n  while (totalRead < bytesToRead) {\n    const { bytesRead } = await fh.read(\n      buffer,\n      totalRead,\n      bytesToRead - totalRead,\n      offset + totalRead,\n    )\n    if (bytesRead === 0) {\n      break\n    }\n    totalRead += bytesRead\n  }\n\n  return {\n    content: buffer.toString('utf8', 0, totalRead),\n    bytesRead: totalRead,\n    bytesTotal: size,\n  }\n}\n\n/**\n * Async generator that yields lines from a file in reverse order.\n * Reads the file backwards in chunks to avoid loading the entire file into memory.\n * @param path - The path to the file to read\n * @returns An async generator that yields lines in reverse order\n */\nexport async function* readLinesReverse(\n  path: string,\n): AsyncGenerator<string, void, undefined> {\n  const CHUNK_SIZE = 1024 * 4\n  const fileHandle = await open(path, 'r')\n  try {\n    const stats = await fileHandle.stat()\n    let position = stats.size\n    // Carry raw bytes (not a decoded string) across chunk boundaries so that\n    // multi-byte UTF-8 sequences split by the 4KB boundary are not corrupted.\n    // Decoding per-chunk would turn a split sequence into U+FFFD on both sides,\n    // which for history.jsonl means JSON.parse throws and the entry is dropped.\n    let remainder = Buffer.alloc(0)\n    const buffer = Buffer.alloc(CHUNK_SIZE)\n\n    while (position > 0) {\n      const currentChunkSize = Math.min(CHUNK_SIZE, position)\n      position -= currentChunkSize\n\n      await fileHandle.read(buffer, 0, currentChunkSize, position)\n      const combined = Buffer.concat([\n        buffer.subarray(0, currentChunkSize),\n        remainder,\n      ])\n\n      const firstNewline = combined.indexOf(0x0a)\n      if (firstNewline === -1) {\n        remainder = combined\n        continue\n      }\n\n      remainder = Buffer.from(combined.subarray(0, firstNewline))\n      const lines = combined.toString('utf8', firstNewline + 1).split('\\n')\n\n      for (let i = lines.length - 1; i >= 0; i--) {\n        const line = lines[i]!\n        if (line) {\n          yield line\n        }\n      }\n    }\n\n    if (remainder.length > 0) {\n      yield remainder.toString('utf8')\n    }\n  } finally {\n    await fileHandle.close()\n  }\n}\n", "function handleEPIPE(\n  stream: NodeJS.WriteStream,\n): (err: NodeJS.ErrnoException) => void {\n  return (err: NodeJS.ErrnoException) => {\n    if (err.code === 'EPIPE') {\n      stream.destroy()\n    }\n  }\n}\n\n// Prevents memory leak when pipe is broken (e.g., `claude -p | head -1`)\nexport function registerProcessOutputErrorHandlers(): void {\n  process.stdout.on('error', handleEPIPE(process.stdout))\n  process.stderr.on('error', handleEPIPE(process.stderr))\n}\n\nfunction writeOut(stream: NodeJS.WriteStream, data: string): void {\n  if (stream.destroyed) {\n    return\n  }\n\n  // Note: we don't handle backpressure (write() returning false).\n  //\n  // We should consider handling the callback to ensure we wait for data to flush.\n  stream.write(data /* callback to handle here */)\n}\n\nexport function writeToStdout(data: string): void {\n  writeOut(process.stdout, data)\n}\n\nexport function writeToStderr(data: string): void {\n  writeOut(process.stderr, data)\n}\n\n// Write error to stderr and exit with code 1. Consolidates the\n// console.error + process.exit(1) pattern used in entrypoint fast-paths.\nexport function exitWithError(message: string): never {\n  // biome-ignore lint/suspicious/noConsole:: intentional console output\n  console.error(message)\n  // eslint-disable-next-line custom-rules/no-process-exit\n  process.exit(1)\n}\n\n// Wait for a stdin-like stream to close, but give up after ms if no data ever\n// arrives. First data chunk cancels the timeout \u2014 after that, wait for end\n// unconditionally (caller's accumulator needs all chunks, not just the first).\n// Returns true on timeout, false on end. Used by -p mode to distinguish a\n// real pipe producer from an inherited-but-idle parent stdin.\nexport function peekForStdinData(\n  stream: NodeJS.EventEmitter,\n  ms: number,\n): Promise<boolean> {\n  return new Promise<boolean>(resolve => {\n    const done = (timedOut: boolean) => {\n      clearTimeout(peek)\n      stream.off('end', onEnd)\n      stream.off('data', onFirstData)\n      void resolve(timedOut)\n    }\n    const onEnd = () => done(false)\n    const onFirstData = () => clearTimeout(peek)\n    // eslint-disable-next-line no-restricted-syntax -- not a sleep: races timeout against stream end/data events\n    const peek = setTimeout(done, ms, true)\n    stream.once('end', onEnd)\n    stream.once('data', onFirstData)\n  })\n}\n", "import { appendFile, mkdir, symlink, unlink } from 'fs/promises'\nimport memoize from 'lodash-es/memoize.js'\nimport { dirname, join } from 'path'\nimport { getSessionId } from 'src/bootstrap/state.js'\n\nimport { type BufferedWriter, createBufferedWriter } from './bufferedWriter.js'\nimport { registerCleanup } from './cleanupRegistry.js'\nimport {\n  type DebugFilter,\n  parseDebugFilter,\n  shouldShowDebugMessage,\n} from './debugFilter.js'\nimport { getClaudeConfigHomeDir, isEnvTruthy } from './envUtils.js'\nimport { getFsImplementation } from './fsOperations.js'\nimport { writeToStderr } from './process.js'\nimport { jsonStringify } from './slowOperations.js'\n\nexport type DebugLogLevel = 'verbose' | 'debug' | 'info' | 'warn' | 'error'\n\nconst LEVEL_ORDER: Record<DebugLogLevel, number> = {\n  verbose: 0,\n  debug: 1,\n  info: 2,\n  warn: 3,\n  error: 4,\n}\n\n/**\n * Minimum log level to include in debug output. Defaults to 'debug', which\n * filters out 'verbose' messages. Set CLAUDE_CODE_DEBUG_LOG_LEVEL=verbose to\n * include high-volume diagnostics (e.g. full statusLine command, shell, cwd,\n * stdout/stderr) that would otherwise drown out useful debug output.\n */\nexport const getMinDebugLogLevel = memoize((): DebugLogLevel => {\n  const raw = process.env.CLAUDE_CODE_DEBUG_LOG_LEVEL?.toLowerCase().trim()\n  if (raw && Object.hasOwn(LEVEL_ORDER, raw)) {\n    return raw as DebugLogLevel\n  }\n  return 'debug'\n})\n\nlet runtimeDebugEnabled = false\n\nexport const isDebugMode = memoize((): boolean => {\n  return (\n    runtimeDebugEnabled ||\n    isEnvTruthy(process.env.DEBUG) ||\n    isEnvTruthy(process.env.DEBUG_SDK) ||\n    process.argv.includes('--debug') ||\n    process.argv.includes('-d') ||\n    isDebugToStdErr() ||\n    // Also check for --debug=pattern syntax\n    process.argv.some(arg => arg.startsWith('--debug=')) ||\n    // --debug-file implicitly enables debug mode\n    getDebugFilePath() !== null\n  )\n})\n\n/**\n * Enables debug logging mid-session (e.g. via /debug). Non-ants don't write\n * debug logs by default, so this lets them start capturing without restarting\n * with --debug. Returns true if logging was already active.\n */\nexport function enableDebugLogging(): boolean {\n  const wasActive = isDebugMode() || process.env.USER_TYPE === 'ant'\n  runtimeDebugEnabled = true\n  isDebugMode.cache.clear?.()\n  return wasActive\n}\n\n// Extract and parse debug filter from command line arguments\n// Exported for testing purposes\nexport const getDebugFilter = memoize((): DebugFilter | null => {\n  // Look for --debug=pattern in argv\n  const debugArg = process.argv.find(arg => arg.startsWith('--debug='))\n  if (!debugArg) {\n    return null\n  }\n\n  // Extract the pattern after the equals sign\n  const filterPattern = debugArg.substring('--debug='.length)\n  return parseDebugFilter(filterPattern)\n})\n\nexport const isDebugToStdErr = memoize((): boolean => {\n  return (\n    process.argv.includes('--debug-to-stderr') || process.argv.includes('-d2e')\n  )\n})\n\nexport const getDebugFilePath = memoize((): string | null => {\n  for (let i = 0; i < process.argv.length; i++) {\n    const arg = process.argv[i]!\n    if (arg.startsWith('--debug-file=')) {\n      return arg.substring('--debug-file='.length)\n    }\n    if (arg === '--debug-file' && i + 1 < process.argv.length) {\n      return process.argv[i + 1]!\n    }\n  }\n  return null\n})\n\nfunction shouldLogDebugMessage(message: string): boolean {\n  if (process.env.NODE_ENV === 'test' && !isDebugToStdErr()) {\n    return false\n  }\n\n  // Non-ants only write debug logs when debug mode is active (via --debug at\n  // startup or /debug mid-session). Ants always log for /share, bug reports.\n  if (process.env.USER_TYPE !== 'ant' && !isDebugMode()) {\n    return false\n  }\n\n  if (\n    typeof process === 'undefined' ||\n    typeof process.versions === 'undefined' ||\n    typeof process.versions.node === 'undefined'\n  ) {\n    return false\n  }\n\n  const filter = getDebugFilter()\n  return shouldShowDebugMessage(message, filter)\n}\n\nlet hasFormattedOutput = false\nexport function setHasFormattedOutput(value: boolean): void {\n  hasFormattedOutput = value\n}\nexport function getHasFormattedOutput(): boolean {\n  return hasFormattedOutput\n}\n\nlet debugWriter: BufferedWriter | null = null\nlet pendingWrite: Promise<void> = Promise.resolve()\n\n// Module-level so .bind captures only its explicit args, not the\n// writeFn closure's parent scope (Jarred, #22257).\nasync function appendAsync(\n  needMkdir: boolean,\n  dir: string,\n  path: string,\n  content: string,\n): Promise<void> {\n  if (needMkdir) {\n    await mkdir(dir, { recursive: true }).catch(() => {})\n  }\n  await appendFile(path, content)\n  void updateLatestDebugLogSymlink()\n}\n\nfunction noop(): void {}\n\nfunction getDebugWriter(): BufferedWriter {\n  if (!debugWriter) {\n    let ensuredDir: string | null = null\n    debugWriter = createBufferedWriter({\n      writeFn: content => {\n        const path = getDebugLogPath()\n        const dir = dirname(path)\n        const needMkdir = ensuredDir !== dir\n        ensuredDir = dir\n        if (isDebugMode()) {\n          // immediateMode: must stay sync. Async writes are lost on direct\n          // process.exit() and keep the event loop alive in beforeExit\n          // handlers (infinite loop with Perfetto tracing). See #22257.\n          if (needMkdir) {\n            try {\n              getFsImplementation().mkdirSync(dir)\n            } catch {\n              // Directory already exists\n            }\n          }\n          getFsImplementation().appendFileSync(path, content)\n          void updateLatestDebugLogSymlink()\n          return\n        }\n        // Buffered path (ants without --debug): flushes ~1/sec so chain\n        // depth stays ~1. .bind over a closure so only the bound args are\n        // retained, not this scope.\n        pendingWrite = pendingWrite\n          .then(appendAsync.bind(null, needMkdir, dir, path, content))\n          .catch(noop)\n      },\n      flushIntervalMs: 1000,\n      maxBufferSize: 100,\n      immediateMode: isDebugMode(),\n    })\n    registerCleanup(async () => {\n      debugWriter?.dispose()\n      await pendingWrite\n    })\n  }\n  return debugWriter\n}\n\nexport async function flushDebugLogs(): Promise<void> {\n  debugWriter?.flush()\n  await pendingWrite\n}\n\nexport function logForDebugging(\n  message: string,\n  { level }: { level: DebugLogLevel } = {\n    level: 'debug',\n  },\n): void {\n  if (LEVEL_ORDER[level] < LEVEL_ORDER[getMinDebugLogLevel()]) {\n    return\n  }\n  if (!shouldLogDebugMessage(message)) {\n    return\n  }\n\n  // Multiline messages break the jsonl output format, so make any multiline messages JSON.\n  if (hasFormattedOutput && message.includes('\\n')) {\n    message = jsonStringify(message)\n  }\n  const timestamp = new Date().toISOString()\n  const output = `${timestamp} [${level.toUpperCase()}] ${message.trim()}\\n`\n  if (isDebugToStdErr()) {\n    writeToStderr(output)\n    return\n  }\n\n  getDebugWriter().write(output)\n}\n\nexport function getDebugLogPath(): string {\n  return (\n    getDebugFilePath() ??\n    process.env.CLAUDE_CODE_DEBUG_LOGS_DIR ??\n    join(getClaudeConfigHomeDir(), 'debug', `${getSessionId()}.txt`)\n  )\n}\n\n/**\n * Updates the latest debug log symlink to point to the current debug log file.\n * Creates or updates a symlink at ~/.claude/debug/latest\n */\nconst updateLatestDebugLogSymlink = memoize(async (): Promise<void> => {\n  try {\n    const debugLogPath = getDebugLogPath()\n    const debugLogsDir = dirname(debugLogPath)\n    const latestSymlinkPath = join(debugLogsDir, 'latest')\n\n    await unlink(latestSymlinkPath).catch(() => {})\n    await symlink(debugLogPath, latestSymlinkPath)\n  } catch {\n    // Silently fail if symlink creation fails\n  }\n})\n\n/**\n * Logs errors for Ants only, always visible in production.\n */\nexport function logAntError(context: string, error: unknown): void {\n  if (process.env.USER_TYPE !== 'ant') {\n    return\n  }\n\n  if (error instanceof Error && error.stack) {\n    logForDebugging(`[ANT-ONLY] ${context} stack trace:\\n${error.stack}`, {\n      level: 'error',\n    })\n  }\n}\n", "import { isEnvTruthy } from 'src/utils/envUtils.js'\n\n// Default to prod config, override with test/staging if enabled\ntype OauthConfigType = 'prod' | 'staging' | 'local'\n\nfunction getOauthConfigType(): OauthConfigType {\n  if (process.env.USER_TYPE === 'ant') {\n    if (isEnvTruthy(process.env.USE_LOCAL_OAUTH)) {\n      return 'local'\n    }\n    if (isEnvTruthy(process.env.USE_STAGING_OAUTH)) {\n      return 'staging'\n    }\n  }\n  return 'prod'\n}\n\nexport function fileSuffixForOauthConfig(): string {\n  if (process.env.CLAUDE_CODE_CUSTOM_OAUTH_URL) {\n    return '-custom-oauth'\n  }\n  switch (getOauthConfigType()) {\n    case 'local':\n      return '-local-oauth'\n    case 'staging':\n      return '-staging-oauth'\n    case 'prod':\n      // No suffix for production config\n      return ''\n  }\n}\n\nexport const CLAUDE_AI_INFERENCE_SCOPE = 'user:inference' as const\nexport const CLAUDE_AI_PROFILE_SCOPE = 'user:profile' as const\nconst CONSOLE_SCOPE = 'org:create_api_key' as const\nexport const OAUTH_BETA_HEADER = 'oauth-2025-04-20' as const\n\n// Console OAuth scopes - for API key creation via Console\nexport const CONSOLE_OAUTH_SCOPES = [\n  CONSOLE_SCOPE,\n  CLAUDE_AI_PROFILE_SCOPE,\n] as const\n\n// Claude.ai OAuth scopes - for Claude.ai subscribers (Pro/Max/Team/Enterprise)\nexport const CLAUDE_AI_OAUTH_SCOPES = [\n  CLAUDE_AI_PROFILE_SCOPE,\n  CLAUDE_AI_INFERENCE_SCOPE,\n  'user:sessions:claude_code',\n  'user:mcp_servers',\n  'user:file_upload',\n] as const\n\n// All OAuth scopes - union of all scopes used in Claude CLI\n// When logging in, request all scopes in order to handle both Console -> Claude.ai redirect\n// Ensure that `OAuthConsentPage` in apps repo is kept in sync with this list.\nexport const ALL_OAUTH_SCOPES = Array.from(\n  new Set([...CONSOLE_OAUTH_SCOPES, ...CLAUDE_AI_OAUTH_SCOPES]),\n)\n\ntype OauthConfig = {\n  BASE_API_URL: string\n  CONSOLE_AUTHORIZE_URL: string\n  CLAUDE_AI_AUTHORIZE_URL: string\n  /**\n   * The claude.ai web origin. Separate from CLAUDE_AI_AUTHORIZE_URL because\n   * that now routes through claude.com/cai/* for attribution \u2014 deriving\n   * .origin from it would give claude.com, breaking links to /code,\n   * /settings/connectors, and other claude.ai web pages.\n   */\n  CLAUDE_AI_ORIGIN: string\n  TOKEN_URL: string\n  API_KEY_URL: string\n  ROLES_URL: string\n  CONSOLE_SUCCESS_URL: string\n  CLAUDEAI_SUCCESS_URL: string\n  MANUAL_REDIRECT_URL: string\n  CLIENT_ID: string\n  OAUTH_FILE_SUFFIX: string\n  MCP_PROXY_URL: string\n  MCP_PROXY_PATH: string\n}\n\n// Production OAuth configuration - Used in normal operation\nconst PROD_OAUTH_CONFIG = {\n  BASE_API_URL: 'https://api.anthropic.com',\n  CONSOLE_AUTHORIZE_URL: 'https://platform.claude.com/oauth/authorize',\n  // Bounces through claude.com/cai/* so CLI sign-ins connect to claude.com\n  // visits for attribution. 307s to claude.ai/oauth/authorize in two hops.\n  CLAUDE_AI_AUTHORIZE_URL: 'https://claude.com/cai/oauth/authorize',\n  CLAUDE_AI_ORIGIN: 'https://claude.ai',\n  TOKEN_URL: 'https://platform.claude.com/v1/oauth/token',\n  API_KEY_URL: 'https://api.anthropic.com/api/oauth/claude_cli/create_api_key',\n  ROLES_URL: 'https://api.anthropic.com/api/oauth/claude_cli/roles',\n  CONSOLE_SUCCESS_URL:\n    'https://platform.claude.com/buy_credits?returnUrl=/oauth/code/success%3Fapp%3Dclaude-code',\n  CLAUDEAI_SUCCESS_URL:\n    'https://platform.claude.com/oauth/code/success?app=claude-code',\n  MANUAL_REDIRECT_URL: 'https://platform.claude.com/oauth/code/callback',\n  CLIENT_ID: '9d1c250a-e61b-44d9-88ed-5944d1962f5e',\n  // No suffix for production config\n  OAUTH_FILE_SUFFIX: '',\n  MCP_PROXY_URL: 'https://mcp-proxy.anthropic.com',\n  MCP_PROXY_PATH: '/v1/mcp/{server_id}',\n} as const\n\n/**\n * Client ID Metadata Document URL for MCP OAuth (CIMD / SEP-991).\n * When an MCP auth server advertises client_id_metadata_document_supported: true,\n * Tau uses this URL as its client_id instead of Dynamic Client Registration.\n * The URL must point to a JSON document hosted by Anthropic.\n * See: https://datatracker.ietf.org/doc/html/draft-ietf-oauth-client-id-metadata-document-00\n */\nexport const MCP_CLIENT_METADATA_URL =\n  'https://claude.ai/oauth/claude-code-client-metadata'\n\n// Staging OAuth configuration - only included in ant builds with staging flag\n// Uses literal check for dead code elimination\nconst STAGING_OAUTH_CONFIG =\n  process.env.USER_TYPE === 'ant'\n    ? ({\n        BASE_API_URL: 'https://api-staging.anthropic.com',\n        CONSOLE_AUTHORIZE_URL:\n          'https://platform.staging.ant.dev/oauth/authorize',\n        CLAUDE_AI_AUTHORIZE_URL:\n          'https://claude-ai.staging.ant.dev/oauth/authorize',\n        CLAUDE_AI_ORIGIN: 'https://claude-ai.staging.ant.dev',\n        TOKEN_URL: 'https://platform.staging.ant.dev/v1/oauth/token',\n        API_KEY_URL:\n          'https://api-staging.anthropic.com/api/oauth/claude_cli/create_api_key',\n        ROLES_URL:\n          'https://api-staging.anthropic.com/api/oauth/claude_cli/roles',\n        CONSOLE_SUCCESS_URL:\n          'https://platform.staging.ant.dev/buy_credits?returnUrl=/oauth/code/success%3Fapp%3Dclaude-code',\n        CLAUDEAI_SUCCESS_URL:\n          'https://platform.staging.ant.dev/oauth/code/success?app=claude-code',\n        MANUAL_REDIRECT_URL:\n          'https://platform.staging.ant.dev/oauth/code/callback',\n        CLIENT_ID: '22422756-60c9-4084-8eb7-27705fd5cf9a',\n        OAUTH_FILE_SUFFIX: '-staging-oauth',\n        MCP_PROXY_URL: 'https://mcp-proxy-staging.anthropic.com',\n        MCP_PROXY_PATH: '/v1/mcp/{server_id}',\n      } as const)\n    : undefined\n\n// Three local dev servers: :8000 api-proxy (`api dev start -g ccr`),\n// :4000 claude-ai frontend, :3000 Console frontend. Env vars let\n// scripts/claude-localhost override if your layout differs.\nfunction getLocalOauthConfig(): OauthConfig {\n  const api =\n    process.env.CLAUDE_LOCAL_OAUTH_API_BASE?.replace(/\\/$/, '') ??\n    'http://localhost:8000'\n  const apps =\n    process.env.CLAUDE_LOCAL_OAUTH_APPS_BASE?.replace(/\\/$/, '') ??\n    'http://localhost:4000'\n  const consoleBase =\n    process.env.CLAUDE_LOCAL_OAUTH_CONSOLE_BASE?.replace(/\\/$/, '') ??\n    'http://localhost:3000'\n  return {\n    BASE_API_URL: api,\n    CONSOLE_AUTHORIZE_URL: `${consoleBase}/oauth/authorize`,\n    CLAUDE_AI_AUTHORIZE_URL: `${apps}/oauth/authorize`,\n    CLAUDE_AI_ORIGIN: apps,\n    TOKEN_URL: `${api}/v1/oauth/token`,\n    API_KEY_URL: `${api}/api/oauth/claude_cli/create_api_key`,\n    ROLES_URL: `${api}/api/oauth/claude_cli/roles`,\n    CONSOLE_SUCCESS_URL: `${consoleBase}/buy_credits?returnUrl=/oauth/code/success%3Fapp%3Dclaude-code`,\n    CLAUDEAI_SUCCESS_URL: `${consoleBase}/oauth/code/success?app=claude-code`,\n    MANUAL_REDIRECT_URL: `${consoleBase}/oauth/code/callback`,\n    CLIENT_ID: '22422756-60c9-4084-8eb7-27705fd5cf9a',\n    OAUTH_FILE_SUFFIX: '-local-oauth',\n    MCP_PROXY_URL: 'http://localhost:8205',\n    MCP_PROXY_PATH: '/v1/toolbox/shttp/mcp/{server_id}',\n  }\n}\n\n// Allowed base URLs for CLAUDE_CODE_CUSTOM_OAUTH_URL override.\n// Only FedStart/PubSec deployments are permitted to prevent OAuth tokens\n// from being sent to arbitrary endpoints.\nconst ALLOWED_OAUTH_BASE_URLS = [\n  'https://beacon.claude-ai.staging.ant.dev',\n  'https://claude.fedstart.com',\n  'https://claude-staging.fedstart.com',\n]\n\n// Default to prod config, override with test/staging if enabled\nexport function getOauthConfig(): OauthConfig {\n  let config: OauthConfig = (() => {\n    switch (getOauthConfigType()) {\n      case 'local':\n        return getLocalOauthConfig()\n      case 'staging':\n        return STAGING_OAUTH_CONFIG ?? PROD_OAUTH_CONFIG\n      case 'prod':\n        return PROD_OAUTH_CONFIG\n    }\n  })()\n\n  // Allow overriding all OAuth URLs to point to an approved FedStart deployment.\n  // Only allowlisted base URLs are accepted to prevent credential leakage.\n  const oauthBaseUrl = process.env.CLAUDE_CODE_CUSTOM_OAUTH_URL\n  if (oauthBaseUrl) {\n    const base = oauthBaseUrl.replace(/\\/$/, '')\n    if (!ALLOWED_OAUTH_BASE_URLS.includes(base)) {\n      throw new Error(\n        'CLAUDE_CODE_CUSTOM_OAUTH_URL is not an approved endpoint.',\n      )\n    }\n    config = {\n      ...config,\n      BASE_API_URL: base,\n      CONSOLE_AUTHORIZE_URL: `${base}/oauth/authorize`,\n      CLAUDE_AI_AUTHORIZE_URL: `${base}/oauth/authorize`,\n      CLAUDE_AI_ORIGIN: base,\n      TOKEN_URL: `${base}/v1/oauth/token`,\n      API_KEY_URL: `${base}/api/oauth/claude_cli/create_api_key`,\n      ROLES_URL: `${base}/api/oauth/claude_cli/roles`,\n      CONSOLE_SUCCESS_URL: `${base}/oauth/code/success?app=claude-code`,\n      CLAUDEAI_SUCCESS_URL: `${base}/oauth/code/success?app=claude-code`,\n      MANUAL_REDIRECT_URL: `${base}/oauth/code/callback`,\n      OAUTH_FILE_SUFFIX: '-custom-oauth',\n    }\n  }\n\n  // Allow CLIENT_ID override via environment variable (e.g., for Xcode integration)\n  const clientIdOverride = process.env.CLAUDE_CODE_OAUTH_CLIENT_ID\n  if (clientIdOverride) {\n    config = {\n      ...config,\n      CLIENT_ID: clientIdOverride,\n    }\n  }\n\n  return config\n}\n", "/**\n * Analytics service - public API for event logging\n *\n * This module serves as the main entry point for analytics events in Claude CLI.\n *\n * DESIGN: This module has NO dependencies to avoid import cycles.\n * Events are queued until attachAnalyticsSink() is called during app initialization.\n * The sink handles routing to Datadog and 1P event logging.\n */\n\n/**\n * Marker type for verifying analytics metadata doesn't contain sensitive data\n *\n * This type forces explicit verification that string values being logged\n * don't contain code snippets, file paths, or other sensitive information.\n *\n * Usage: `myString as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS`\n */\nexport type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS = never\n\n/**\n * Marker type for values routed to PII-tagged proto columns via `_PROTO_*`\n * payload keys. The destination BQ column has privileged access controls,\n * so unredacted values are acceptable \u2014 unlike general-access backends.\n *\n * sink.ts strips `_PROTO_*` keys before Datadog fanout; only the 1P\n * exporter (firstPartyEventLoggingExporter) sees them and hoists them to the\n * top-level proto field. A single stripProtoFields call guards all non-1P\n * sinks \u2014 no per-sink filtering to forget.\n *\n * Usage: `rawName as AnalyticsMetadata_I_VERIFIED_THIS_IS_PII_TAGGED`\n */\nexport type AnalyticsMetadata_I_VERIFIED_THIS_IS_PII_TAGGED = never\n\n/**\n * Strip `_PROTO_*` keys from a payload destined for general-access storage.\n * Used by:\n *   - sink.ts: before Datadog fanout (never sees PII-tagged values)\n *   - firstPartyEventLoggingExporter: defensive strip of additional_metadata\n *     after hoisting known _PROTO_* keys to proto fields \u2014 prevents a future\n *     unrecognized _PROTO_foo from silently landing in the BQ JSON blob.\n *\n * Returns the input unchanged (same reference) when no _PROTO_ keys present.\n */\nexport function stripProtoFields<V>(\n  metadata: Record<string, V>,\n): Record<string, V> {\n  let result: Record<string, V> | undefined\n  for (const key in metadata) {\n    if (key.startsWith('_PROTO_')) {\n      if (result === undefined) {\n        result = { ...metadata }\n      }\n      delete result[key]\n    }\n  }\n  return result ?? metadata\n}\n\n// Internal type for logEvent metadata - different from the enriched EventMetadata in metadata.ts\ntype LogEventMetadata = { [key: string]: boolean | number | undefined }\n\ntype QueuedEvent = {\n  eventName: string\n  metadata: LogEventMetadata\n  async: boolean\n}\n\n/**\n * Sink interface for the analytics backend\n */\nexport type AnalyticsSink = {\n  logEvent: (eventName: string, metadata: LogEventMetadata) => void\n  logEventAsync: (\n    eventName: string,\n    metadata: LogEventMetadata,\n  ) => Promise<void>\n}\n\n// Event queue for events logged before sink is attached\nconst eventQueue: QueuedEvent[] = []\n\n// Sink - initialized during app startup\nlet sink: AnalyticsSink | null = null\n\n/**\n * Attach the analytics sink that will receive all events.\n * Queued events are drained asynchronously via queueMicrotask to avoid\n * adding latency to the startup path.\n *\n * Idempotent: if a sink is already attached, this is a no-op. This allows\n * calling from both the preAction hook (for subcommands) and setup() (for\n * the default command) without coordination.\n */\nexport function attachAnalyticsSink(newSink: AnalyticsSink): void {\n  if (sink !== null) {\n    return\n  }\n  sink = newSink\n\n  // Drain the queue asynchronously to avoid blocking startup\n  if (eventQueue.length > 0) {\n    const queuedEvents = [...eventQueue]\n    eventQueue.length = 0\n\n    // Log queue size for ants to help debug analytics initialization timing\n    if (process.env.USER_TYPE === 'ant') {\n      sink.logEvent('analytics_sink_attached', {\n        queued_event_count: queuedEvents.length,\n      })\n    }\n\n    queueMicrotask(() => {\n      for (const event of queuedEvents) {\n        if (event.async) {\n          void sink!.logEventAsync(event.eventName, event.metadata)\n        } else {\n          sink!.logEvent(event.eventName, event.metadata)\n        }\n      }\n    })\n  }\n}\n\n/**\n * Log an event to analytics backends (synchronous)\n *\n * Events may be sampled based on the 'tengu_event_sampling_config' dynamic config.\n * When sampled, the sample_rate is added to the event metadata.\n *\n * If no sink is attached, events are queued and drained when the sink attaches.\n */\nexport function logEvent(\n  eventName: string,\n  // intentionally no strings unless AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,\n  // to avoid accidentally logging code/filepaths\n  metadata: LogEventMetadata,\n): void {\n  if (sink === null) {\n    eventQueue.push({ eventName, metadata, async: false })\n    return\n  }\n  sink.logEvent(eventName, metadata)\n}\n\n/**\n * Log an event to analytics backends (asynchronous)\n *\n * Events may be sampled based on the 'tengu_event_sampling_config' dynamic config.\n * When sampled, the sample_rate is added to the event metadata.\n *\n * If no sink is attached, events are queued and drained when the sink attaches.\n */\nexport async function logEventAsync(\n  eventName: string,\n  // intentionally no strings, to avoid accidentally logging code/filepaths\n  metadata: LogEventMetadata,\n): Promise<void> {\n  if (sink === null) {\n    eventQueue.push({ eventName, metadata, async: true })\n    return\n  }\n  await sink.logEventAsync(eventName, metadata)\n}\n\n/**\n * Reset analytics state for testing purposes only.\n * @internal\n */\nexport function _resetForTesting(): void {\n  sink = null\n  eventQueue.length = 0\n}\n", "// XML tag names used to mark skill/command metadata in messages\nexport const COMMAND_NAME_TAG = 'command-name'\nexport const COMMAND_MESSAGE_TAG = 'command-message'\nexport const COMMAND_ARGS_TAG = 'command-args'\n\n// XML tag names for terminal/bash command input and output in user messages\n// These wrap content that represents terminal activity, not actual user prompts\nexport const BASH_INPUT_TAG = 'bash-input'\nexport const BASH_STDOUT_TAG = 'bash-stdout'\nexport const BASH_STDERR_TAG = 'bash-stderr'\nexport const LOCAL_COMMAND_STDOUT_TAG = 'local-command-stdout'\nexport const LOCAL_COMMAND_STDERR_TAG = 'local-command-stderr'\nexport const LOCAL_COMMAND_CAVEAT_TAG = 'local-command-caveat'\n\n// All terminal-related tags that indicate a message is terminal output, not a user prompt\nexport const TERMINAL_OUTPUT_TAGS = [\n  BASH_INPUT_TAG,\n  BASH_STDOUT_TAG,\n  BASH_STDERR_TAG,\n  LOCAL_COMMAND_STDOUT_TAG,\n  LOCAL_COMMAND_STDERR_TAG,\n  LOCAL_COMMAND_CAVEAT_TAG,\n] as const\n\nexport const TICK_TAG = 'tick'\n\n// XML tag names for task notifications (background task completions)\nexport const TASK_NOTIFICATION_TAG = 'task-notification'\nexport const TASK_ID_TAG = 'task-id'\nexport const TOOL_USE_ID_TAG = 'tool-use-id'\nexport const TASK_TYPE_TAG = 'task-type'\nexport const OUTPUT_FILE_TAG = 'output-file'\nexport const STATUS_TAG = 'status'\nexport const SUMMARY_TAG = 'summary'\nexport const REASON_TAG = 'reason'\nexport const WORKTREE_TAG = 'worktree'\nexport const WORKTREE_PATH_TAG = 'worktreePath'\nexport const WORKTREE_BRANCH_TAG = 'worktreeBranch'\n\n// XML tag names for ultraplan mode (remote parallel planning sessions)\nexport const ULTRAPLAN_TAG = 'ultraplan'\n\n// XML tag name for remote /review results (teleported review session output).\n// Remote session wraps its final review in this tag; local poller extracts it.\nexport const REMOTE_REVIEW_TAG = 'remote-review'\n\n// run_hunt.sh's heartbeat echoes the orchestrator's progress.json inside this\n// tag every ~10s. Local poller parses the latest for the task-status line.\nexport const REMOTE_REVIEW_PROGRESS_TAG = 'remote-review-progress'\n\n// XML tag name for teammate messages (swarm inter-agent communication)\nexport const TEAMMATE_MESSAGE_TAG = 'teammate-message'\n\n// XML tag name for external channel messages\nexport const CHANNEL_MESSAGE_TAG = 'channel-message'\nexport const CHANNEL_TAG = 'channel'\n\n// XML tag name for cross-session UDS messages (another Claude session's inbox)\nexport const CROSS_SESSION_MESSAGE_TAG = 'cross-session-message'\n\n// XML tag wrapping the rules/format boilerplate in a fork child's first message.\n// Lets the transcript renderer collapse the boilerplate and show only the directive.\nexport const FORK_BOILERPLATE_TAG = 'fork-boilerplate'\n// Prefix before the directive text, stripped by the renderer. Keep in sync\n// across buildChildMessage (generates) and UserForkBoilerplateMessage (parses).\nexport const FORK_DIRECTIVE_PREFIX = 'Your directive: '\n\n// Common argument patterns for slash commands that request help\nexport const COMMON_HELP_ARGS = ['help', '-h', '--help']\n\n// Common argument patterns for slash commands that request current state/info\nexport const COMMON_INFO_ARGS = [\n  'list',\n  'show',\n  'display',\n  'current',\n  'view',\n  'get',\n  'check',\n  'describe',\n  'print',\n  'version',\n  'about',\n  'status',\n  '?',\n]\n", "import type { UUID } from 'crypto'\nimport type { FileHistorySnapshot } from 'src/utils/fileHistory.js'\nimport type { ContentReplacementRecord } from 'src/utils/toolResultStorage.js'\nimport type { AgentId } from './ids.js'\nimport type { Message } from './message.js'\nimport type { QueueOperationMessage } from './messageQueueTypes.js'\n\nexport type SerializedMessage = Message & {\n  cwd: string\n  userType: string\n  entrypoint?: string // CLAUDE_CODE_ENTRYPOINT \u2014 distinguishes cli/sdk-ts/sdk-py/etc.\n  sessionId: string\n  timestamp: string\n  version: string\n  gitBranch?: string\n  slug?: string // Session slug for files like plans (used for resume)\n}\n\nexport type LogOption = {\n  date: string\n  messages: SerializedMessage[]\n  fullPath?: string\n  value: number\n  created: Date\n  modified: Date\n  firstPrompt: string\n  messageCount: number\n  fileSize?: number // File size in bytes (for display)\n  isSidechain: boolean\n  isLite?: boolean // True for lite logs (messages not loaded)\n  sessionId?: string // Session ID for lite logs\n  teamName?: string // Team name if this is a spawned agent session\n  agentName?: string // Agent's custom name (from /rename or swarm)\n  agentColor?: string // Agent's color (from /rename or swarm)\n  agentSetting?: string // Agent definition used (from --agent flag or settings.agent)\n  isTeammate?: boolean // Whether this session was created by a swarm teammate\n  leafUuid?: UUID // If given, this uuid must appear in the DB\n  summary?: string // Optional conversation summary\n  customTitle?: string // Optional user-set custom title\n  tag?: string // Optional tag for the session (searchable in /resume)\n  fileHistorySnapshots?: FileHistorySnapshot[] // Optional file history snapshots\n  attributionSnapshots?: AttributionSnapshotMessage[] // Optional attribution snapshots\n  contextCollapseCommits?: ContextCollapseCommitEntry[] // Ordered \u2014 commit B may reference commit A's summary\n  contextCollapseSnapshot?: ContextCollapseSnapshotEntry // Last-wins \u2014 staged queue + spawn state\n  gitBranch?: string // Git branch at the end of the session\n  projectPath?: string // Original project directory path\n  prNumber?: number // GitHub PR number linked to this session\n  prUrl?: string // Full URL to the linked PR\n  prRepository?: string // Repository in \"owner/repo\" format\n  mode?: 'coordinator' | 'normal' // Session mode for coordinator/normal detection\n  worktreeSession?: PersistedWorktreeSession | null // Worktree state at session end (null = exited, undefined = never entered)\n  contentReplacements?: ContentReplacementRecord[] // Replacement decisions for resume reconstruction\n}\n\nexport type SummaryMessage = {\n  type: 'summary'\n  leafUuid: UUID\n  summary: string\n}\n\nexport type CustomTitleMessage = {\n  type: 'custom-title'\n  sessionId: UUID\n  customTitle: string\n}\n\n/**\n * AI-generated session title. Distinct from CustomTitleMessage so that:\n * - User renames (custom-title) always win over AI titles in read preference\n * - reAppendSessionMetadata never re-appends AI titles (they're ephemeral/\n *   regeneratable; re-appending would clobber user renames on resume)\n * - VS Code's onlyIfNoCustomTitle CAS check only matches user titles,\n *   allowing AI to overwrite its own previous AI title but not user titles\n */\nexport type AiTitleMessage = {\n  type: 'ai-title'\n  sessionId: UUID\n  aiTitle: string\n}\n\nexport type LastPromptMessage = {\n  type: 'last-prompt'\n  sessionId: UUID\n  lastPrompt: string\n}\n\n/**\n * Periodic fork-generated summary of what the agent is currently doing.\n * Written every min(5 steps, 2min) by forking the main thread mid-turn so\n * `claude ps` can show something more useful than the last user prompt\n * (which is often \"ok go\" or \"fix it\").\n */\nexport type TaskSummaryMessage = {\n  type: 'task-summary'\n  sessionId: UUID\n  summary: string\n  timestamp: string\n}\n\nexport type TagMessage = {\n  type: 'tag'\n  sessionId: UUID\n  tag: string\n}\n\nexport type AgentNameMessage = {\n  type: 'agent-name'\n  sessionId: UUID\n  agentName: string\n}\n\nexport type AgentColorMessage = {\n  type: 'agent-color'\n  sessionId: UUID\n  agentColor: string\n}\n\nexport type AgentSettingMessage = {\n  type: 'agent-setting'\n  sessionId: UUID\n  agentSetting: string\n}\n\n/**\n * PR link message stored in session transcript.\n * Links a session to a GitHub pull request for tracking and navigation.\n */\nexport type PRLinkMessage = {\n  type: 'pr-link'\n  sessionId: UUID\n  prNumber: number\n  prUrl: string\n  prRepository: string // e.g., \"owner/repo\"\n  timestamp: string // ISO timestamp when linked\n}\n\nexport type ModeEntry = {\n  type: 'mode'\n  sessionId: UUID\n  mode: 'coordinator' | 'normal'\n}\n\n/**\n * Worktree session state persisted to the transcript for resume.\n * Subset of WorktreeSession from utils/worktree.ts \u2014 excludes ephemeral\n * fields (creationDurationMs, usedSparsePaths) that are only used for\n * first-run analytics.\n */\nexport type PersistedWorktreeSession = {\n  originalCwd: string\n  worktreePath: string\n  worktreeName: string\n  worktreeBranch?: string\n  originalBranch?: string\n  originalHeadCommit?: string\n  sessionId: string\n  tmuxSessionName?: string\n  hookBased?: boolean\n}\n\n/**\n * Records whether the session is currently inside a worktree created by\n * EnterWorktree or --worktree. Last-wins: an enter writes the session,\n * an exit writes null. On --resume, restored only if the worktreePath\n * still exists on disk (the /exit dialog may have removed it).\n */\nexport type WorktreeStateEntry = {\n  type: 'worktree-state'\n  sessionId: UUID\n  worktreeSession: PersistedWorktreeSession | null\n}\n\n/**\n * Records content blocks whose in-context representation was replaced with a\n * smaller stub (the full content was persisted elsewhere). Replayed on resume\n * for prompt cache stability. Written once per enforcement pass that replaces\n * at least one block. When agentId is set, the record belongs to a subagent\n * sidechain (AgentTool resume reads these); when absent, it's main-thread\n * (/resume reads these).\n */\nexport type ContentReplacementEntry = {\n  type: 'content-replacement'\n  sessionId: UUID\n  agentId?: AgentId\n  replacements: ContentReplacementRecord[]\n}\n\nexport type FileHistorySnapshotMessage = {\n  type: 'file-history-snapshot'\n  messageId: UUID\n  snapshot: FileHistorySnapshot\n  isSnapshotUpdate: boolean\n}\n\n/**\n * Per-file attribution state tracking Claude's character contributions.\n */\nexport type FileAttributionState = {\n  contentHash: string // SHA-256 hash of file content\n  claudeContribution: number // Characters written by Claude\n  mtime: number // File modification time\n}\n\n/**\n * Attribution snapshot message stored in session transcript.\n * Tracks character-level contributions by Claude for commit attribution.\n */\nexport type AttributionSnapshotMessage = {\n  type: 'attribution-snapshot'\n  messageId: UUID\n  surface: string // Client surface (cli, ide, web, api)\n  fileStates: Record<string, FileAttributionState>\n  promptCount?: number // Total prompts in session\n  promptCountAtLastCommit?: number // Prompts at last commit\n  permissionPromptCount?: number // Total permission prompts shown\n  permissionPromptCountAtLastCommit?: number // Permission prompts at last commit\n  escapeCount?: number // Total ESC presses (cancelled permission prompts)\n  escapeCountAtLastCommit?: number // ESC presses at last commit\n}\n\nexport type TranscriptMessage = SerializedMessage & {\n  parentUuid: UUID | null\n  logicalParentUuid?: UUID | null // Preserves logical parent when parentUuid is nullified for session breaks\n  isSidechain: boolean\n  gitBranch?: string\n  agentId?: string // Agent ID for sidechain transcripts to enable resuming agents\n  teamName?: string // Team name if this is a spawned agent session\n  agentName?: string // Agent's custom name (from /rename or swarm)\n  agentColor?: string // Agent's color (from /rename or swarm)\n  promptId?: string // Correlates with OTel prompt.id for user prompt messages\n}\n\nexport type SpeculationAcceptMessage = {\n  type: 'speculation-accept'\n  timestamp: string\n  timeSavedMs: number\n}\n\n/**\n * Persisted context-collapse commit. The archived messages themselves are\n * NOT persisted \u2014 they're already in the transcript as ordinary user/\n * assistant messages. We only persist enough to reconstruct the splice\n * instruction (boundary uuids) and the summary placeholder (which is NOT\n * in the transcript because it's never yielded to the REPL).\n *\n * On restore, the store reconstructs CommittedCollapse with archived=[];\n * projectView lazily fills the archive the first time it finds the span.\n *\n * Discriminator is obfuscated to match the gate name. sessionStorage.ts\n * isn't feature-gated (it's the generic transcript plumbing used by every\n * entry type), so a descriptive string here would leak into external builds\n * via the appendEntry dispatch / loadTranscriptFile parser even though\n * nothing in an external build ever writes or reads this entry.\n */\nexport type ContextCollapseCommitEntry = {\n  type: 'marble-origami-commit'\n  sessionId: UUID\n  /** 16-digit collapse ID. Max across entries reseeds the ID counter. */\n  collapseId: string\n  /** The summary placeholder's uuid \u2014 registerSummary() needs it. */\n  summaryUuid: string\n  /** Full <collapsed id=\"...\">text</collapsed> string for the placeholder. */\n  summaryContent: string\n  /** Plain summary text for ctx_inspect. */\n  summary: string\n  /** Span boundaries \u2014 projectView finds these in the resumed Message[]. */\n  firstArchivedUuid: string\n  lastArchivedUuid: string\n}\n\n/**\n * Snapshot of the staged queue and spawn trigger state. Unlike commits\n * (append-only, replay-all), snapshots are last-wins \u2014 only the most\n * recent snapshot entry is applied on restore. Written after every\n * ctx-agent spawn resolves (when staged contents may have changed).\n *\n * Staged boundaries are UUIDs (session-stable), not collapse IDs (which\n * reset with the uuidToId bimap). Restoring a staged span issues fresh\n * collapse IDs for those messages on the next decorate/display, but the\n * span itself resolves correctly.\n */\nexport type ContextCollapseSnapshotEntry = {\n  type: 'marble-origami-snapshot'\n  sessionId: UUID\n  staged: Array<{\n    startUuid: string\n    endUuid: string\n    summary: string\n    risk: number\n    stagedAt: number\n  }>\n  /** Spawn trigger state \u2014 so the +interval clock picks up where it left off. */\n  armed: boolean\n  lastSpawnTokens: number\n}\n\nexport type Entry =\n  | TranscriptMessage\n  | SummaryMessage\n  | CustomTitleMessage\n  | AiTitleMessage\n  | LastPromptMessage\n  | TaskSummaryMessage\n  | TagMessage\n  | AgentNameMessage\n  | AgentColorMessage\n  | AgentSettingMessage\n  | PRLinkMessage\n  | FileHistorySnapshotMessage\n  | AttributionSnapshotMessage\n  | QueueOperationMessage\n  | SpeculationAcceptMessage\n  | ModeEntry\n  | WorktreeStateEntry\n  | ContentReplacementEntry\n  | ContextCollapseCommitEntry\n  | ContextCollapseSnapshotEntry\n\nexport function sortLogs(logs: LogOption[]): LogOption[] {\n  return logs.sort((a, b) => {\n    // Sort by modified date (newest first)\n    const modifiedDiff = b.modified.getTime() - a.modified.getTime()\n    if (modifiedDiff !== 0) {\n      return modifiedDiff\n    }\n\n    // If modified dates are equal, sort by created date (newest first)\n    return b.created.getTime() - a.created.getTime()\n  })\n}\n", "/**\n * djb2 string hash \u2014 fast non-cryptographic hash returning a signed 32-bit int.\n * Deterministic across runtimes (unlike Bun.hash which uses wyhash). Use as a\n * fallback when Bun.hash isn't available, or when you need on-disk-stable\n * output (e.g. cache directory names that must survive runtime upgrades).\n */\nexport function djb2Hash(str: string): number {\n  let hash = 0\n  for (let i = 0; i < str.length; i++) {\n    hash = ((hash << 5) - hash + str.charCodeAt(i)) | 0\n  }\n  return hash\n}\n\n/**\n * Hash arbitrary content for change detection. Bun.hash is ~100x faster than\n * sha256 and collision-resistant enough for diff detection (not crypto-safe).\n */\nexport function hashContent(content: string): string {\n  if (typeof Bun !== 'undefined') {\n    return Bun.hash(content).toString()\n  }\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  const crypto = require('crypto') as typeof import('crypto')\n  return crypto.createHash('sha256').update(content).digest('hex')\n}\n\n/**\n * Hash two strings without allocating a concatenated temp string. Bun path\n * seed-chains wyhash (hash(a) feeds as seed to hash(b)); Node path uses\n * incremental SHA-256 update. Seed-chaining naturally disambiguates\n * (\"ts\",\"code\") vs (\"tsc\",\"ode\") so no separator is needed under Bun.\n */\nexport function hashPair(a: string, b: string): string {\n  if (typeof Bun !== 'undefined') {\n    return Bun.hash(b, Bun.hash(a)).toString()\n  }\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  const crypto = require('crypto') as typeof import('crypto')\n  return crypto\n    .createHash('sha256')\n    .update(a)\n    .update('\\0')\n    .update(b)\n    .digest('hex')\n}\n", "import envPaths from 'env-paths'\nimport { join } from 'path'\nimport { getFsImplementation } from './fsOperations.js'\nimport { djb2Hash } from './hash.js'\n\nconst paths = envPaths('claude-cli')\n\n// Local sanitizePath using djb2Hash \u2014 NOT the shared version from\n// sessionStoragePortable.ts which uses Bun.hash (wyhash) when available.\n// Cache directory names must remain stable across upgrades so existing cache\n// data (error logs, MCP logs) is not orphaned.\nconst MAX_SANITIZED_LENGTH = 200\nfunction sanitizePath(name: string): string {\n  const sanitized = name.replace(/[^a-zA-Z0-9]/g, '-')\n  if (sanitized.length <= MAX_SANITIZED_LENGTH) {\n    return sanitized\n  }\n  return `${sanitized.slice(0, MAX_SANITIZED_LENGTH)}-${Math.abs(djb2Hash(name)).toString(36)}`\n}\n\nfunction getProjectDir(cwd: string): string {\n  return sanitizePath(cwd)\n}\n\nexport const CACHE_PATHS = {\n  baseLogs: () => join(paths.cache, getProjectDir(getFsImplementation().cwd())),\n  errors: () =>\n    join(paths.cache, getProjectDir(getFsImplementation().cwd()), 'errors'),\n  messages: () =>\n    join(paths.cache, getProjectDir(getFsImplementation().cwd()), 'messages'),\n  mcpLogs: (serverName: string) =>\n    join(\n      paths.cache,\n      getProjectDir(getFsImplementation().cwd()),\n      // Sanitize server name for Windows compatibility (colons are reserved for drive letters)\n      `mcp-logs-${sanitizePath(serverName)}`,\n    ),\n}\n", "/**\n * Matches any XML-like `<tag>\u2026</tag>` block (lowercase tag names, optional\n * attributes, multi-line content). Used to strip system-injected wrapper tags\n * from display titles \u2014 IDE context, slash-command markers, hook output,\n * task notifications, channel messages, etc. A generic pattern avoids\n * maintaining an ever-growing allowlist that falls behind as new notification\n * types are added.\n *\n * Only matches lowercase tag names (`[a-z][\\w-]*`) so user prose mentioning\n * JSX/HTML components (\"fix the <Button> layout\", \"<!DOCTYPE html>\") passes\n * through \u2014 those start with uppercase or `!`. The non-greedy body with a\n * backreferenced closing tag keeps adjacent blocks separate; unpaired angle\n * brackets (\"when x < y\") don't match.\n */\nconst XML_TAG_BLOCK_PATTERN = /<([a-z][\\w-]*)(?:\\s[^>]*)?>[\\s\\S]*?<\\/\\1>\\n?/g\n\n/**\n * Strip XML-like tag blocks from text for use in UI titles (/rewind, /resume,\n * bridge session titles). System-injected context \u2014 IDE metadata, hook output,\n * task notifications \u2014 arrives wrapped in tags and should never surface as a\n * title.\n *\n * If stripping would result in empty text, returns the original unchanged\n * (better to show something than nothing).\n */\nexport function stripDisplayTags(text: string): string {\n  const result = text.replace(XML_TAG_BLOCK_PATTERN, '').trim()\n  return result || text\n}\n\n/**\n * Like stripDisplayTags but returns empty string when all content is tags.\n * Used by getLogDisplayTitle to detect command-only prompts (e.g. /clear)\n * so they can fall through to the next title fallback, and by extractTitleText\n * to skip pure-XML messages during bridge title derivation.\n */\nexport function stripDisplayTagsAllowEmpty(text: string): string {\n  return text.replace(XML_TAG_BLOCK_PATTERN, '').trim()\n}\n\nconst IDE_CONTEXT_TAGS_PATTERN =\n  /<(ide_opened_file|ide_selection)(?:\\s[^>]*)?>[\\s\\S]*?<\\/\\1>\\n?/g\n\n/**\n * Strip only IDE-injected context tags (ide_opened_file, ide_selection).\n * Used by textForResubmit so UP-arrow resubmit preserves user-typed content\n * including lowercase HTML like `<code>foo</code>` while dropping IDE noise.\n */\nexport function stripIdeContextTags(text: string): string {\n  return text.replace(IDE_CONTEXT_TAGS_PATTERN, '').trim()\n}\n", "/**\n * Privacy level controls how much nonessential network traffic and telemetry\n * Tau generates.\n *\n * Levels are ordered by restrictiveness:\n *   default < no-telemetry < essential-traffic\n *\n * - default:            Everything enabled.\n * - no-telemetry:       Analytics/telemetry disabled (Datadog, 1P events, feedback survey).\n * - essential-traffic:  ALL nonessential network traffic disabled\n *                       (telemetry + auto-updates, grove, release notes, model capabilities, etc.).\n *\n * The resolved level is the most restrictive signal from:\n *   CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC  \u2192  essential-traffic\n *   DISABLE_TELEMETRY                         \u2192  no-telemetry\n */\n\ntype PrivacyLevel = 'default' | 'no-telemetry' | 'essential-traffic'\n\nexport function getPrivacyLevel(): PrivacyLevel {\n  if (process.env.CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC) {\n    return 'essential-traffic'\n  }\n  if (process.env.DISABLE_TELEMETRY) {\n    return 'no-telemetry'\n  }\n  return 'default'\n}\n\n/**\n * True when all nonessential network traffic should be suppressed.\n * Equivalent to the old `process.env.CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` check.\n */\nexport function isEssentialTrafficOnly(): boolean {\n  return getPrivacyLevel() === 'essential-traffic'\n}\n\n/**\n * True when telemetry/analytics should be suppressed.\n * True at both `no-telemetry` and `essential-traffic` levels.\n */\nexport function isTelemetryDisabled(): boolean {\n  return getPrivacyLevel() !== 'default'\n}\n\n/**\n * Returns the env var name responsible for the current essential-traffic restriction,\n * or null if unrestricted. Used for user-facing \"unset X to re-enable\" messages.\n */\nexport function getEssentialTrafficOnlyReason(): string | null {\n  if (process.env.CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC) {\n    return 'CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC'\n  }\n  return null\n}\n", "import { feature } from 'bun:bundle'\nimport type { BetaMessageStreamParams } from '@anthropic-ai/sdk/resources/beta/messages/messages.mjs'\nimport { readdir, readFile, stat } from 'fs/promises'\nimport memoize from 'lodash-es/memoize.js'\nimport { join } from 'path'\nimport type { QuerySource } from 'src/constants/querySource.js'\nimport {\n  setLastAPIRequest,\n  setLastAPIRequestMessages,\n} from '../bootstrap/state.js'\nimport { TICK_TAG } from '../constants/xml.js'\nimport {\n  type LogOption,\n  type SerializedMessage,\n  sortLogs,\n} from '../types/logs.js'\nimport { CACHE_PATHS } from './cachePaths.js'\nimport { stripDisplayTags, stripDisplayTagsAllowEmpty } from './displayTags.js'\nimport { isEnvTruthy } from './envUtils.js'\nimport { toError } from './errors.js'\nimport { isEssentialTrafficOnly } from './privacyLevel.js'\nimport { jsonParse } from './slowOperations.js'\n\n/**\n * Gets the display title for a log/session with fallback logic.\n * Skips firstPrompt if it starts with a tick/goal tag (autonomous mode auto-prompt).\n * Strips display-unfriendly tags (like <ide_opened_file>) from the result.\n * Falls back to a truncated session ID when no other title is available.\n */\nexport function getLogDisplayTitle(\n  log: LogOption,\n  defaultTitle?: string,\n): string {\n  // Skip firstPrompt if it's a tick/goal message (autonomous mode auto-prompt)\n  const isAutonomousPrompt = log.firstPrompt?.startsWith(`<${TICK_TAG}>`)\n  // Strip display-unfriendly tags (command-name, ide_opened_file, etc.) early\n  // so that command-only prompts (e.g. /clear) become empty and fall through\n  // to the next fallback instead of showing raw XML tags.\n  // Note: stripDisplayTags returns the original when stripping yields empty,\n  // so we call stripDisplayTagsAllowEmpty to detect command-only prompts.\n  const strippedFirstPrompt = log.firstPrompt\n    ? stripDisplayTagsAllowEmpty(log.firstPrompt)\n    : ''\n  const useFirstPrompt = strippedFirstPrompt && !isAutonomousPrompt\n  const title =\n    log.agentName ||\n    log.customTitle ||\n    log.summary ||\n    (useFirstPrompt ? strippedFirstPrompt : undefined) ||\n    defaultTitle ||\n    // For autonomous sessions without other context, show a meaningful label\n    (isAutonomousPrompt ? 'Autonomous session' : undefined) ||\n    // Fall back to truncated session ID for lite logs with no metadata\n    (log.sessionId ? log.sessionId.slice(0, 8) : '') ||\n    ''\n  // Strip display-unfriendly tags (like <ide_opened_file>) for cleaner titles\n  return stripDisplayTags(title).trim()\n}\n\nexport function dateToFilename(date: Date): string {\n  return date.toISOString().replace(/[:.]/g, '-')\n}\n\n// In-memory error log for recent errors\n// Moved from bootstrap/state.ts to break import cycle\nconst MAX_IN_MEMORY_ERRORS = 100\nlet inMemoryErrorLog: Array<{ error: string; timestamp: string }> = []\n\nfunction addToInMemoryErrorLog(errorInfo: {\n  error: string\n  timestamp: string\n}): void {\n  if (inMemoryErrorLog.length >= MAX_IN_MEMORY_ERRORS) {\n    inMemoryErrorLog.shift() // Remove oldest error\n  }\n  inMemoryErrorLog.push(errorInfo)\n}\n\n/**\n * Sink interface for the error logging backend\n */\nexport type ErrorLogSink = {\n  logError: (error: Error) => void\n  logMCPError: (serverName: string, error: unknown) => void\n  logMCPDebug: (serverName: string, message: string) => void\n  getErrorsPath: () => string\n  getMCPLogsPath: (serverName: string) => string\n}\n\n// Queued events for events logged before sink is attached\ntype QueuedErrorEvent =\n  | { type: 'error'; error: Error }\n  | { type: 'mcpError'; serverName: string; error: unknown }\n  | { type: 'mcpDebug'; serverName: string; message: string }\n\nconst errorQueue: QueuedErrorEvent[] = []\n\n// Sink - initialized during app startup\nlet errorLogSink: ErrorLogSink | null = null\n\n/**\n * Attach the error log sink that will receive all error events.\n * Queued events are drained immediately to ensure no errors are lost.\n *\n * Idempotent: if a sink is already attached, this is a no-op. This allows\n * calling from both the preAction hook (for subcommands) and setup() (for\n * the default command) without coordination.\n */\nexport function attachErrorLogSink(newSink: ErrorLogSink): void {\n  if (errorLogSink !== null) {\n    return\n  }\n  errorLogSink = newSink\n\n  // Drain the queue immediately - errors should not be delayed\n  if (errorQueue.length > 0) {\n    const queuedEvents = [...errorQueue]\n    errorQueue.length = 0\n\n    for (const event of queuedEvents) {\n      switch (event.type) {\n        case 'error':\n          errorLogSink.logError(event.error)\n          break\n        case 'mcpError':\n          errorLogSink.logMCPError(event.serverName, event.error)\n          break\n        case 'mcpDebug':\n          errorLogSink.logMCPDebug(event.serverName, event.message)\n          break\n      }\n    }\n  }\n}\n\n/**\n * Logs an error to multiple destinations for debugging and monitoring.\n *\n * This function logs errors to:\n * - Debug logs (visible via `claude --debug` or `tail -f ~/.claude/debug/latest`)\n * - In-memory error log (accessible via `getInMemoryErrors()`, useful for including\n *   in bug reports or displaying recent errors to users)\n * - Persistent error log file (only for internal 'ant' users, stored in ~/.claude/errors/)\n *\n * Usage:\n * ```ts\n * logError(new Error('Failed to connect'))\n * ```\n *\n * To view errors:\n * - Debug: Run `claude --debug` or `tail -f ~/.claude/debug/latest`\n * - In-memory: Call `getInMemoryErrors()` to get recent errors for the current session\n */\nconst isHardFailMode = memoize((): boolean => {\n  return process.argv.includes('--hard-fail')\n})\n\nexport function logError(error: unknown): void {\n  const err = toError(error)\n  if (feature('HARD_FAIL') && isHardFailMode()) {\n    // biome-ignore lint/suspicious/noConsole:: intentional crash output\n    console.error('[HARD FAIL] logError called with:', err.stack || err.message)\n    // eslint-disable-next-line custom-rules/no-process-exit\n    process.exit(1)\n  }\n  try {\n    // Check if error reporting should be disabled\n    if (\n      // Cloud providers (Bedrock/Vertex/Foundry) always disable features\n      isEnvTruthy(process.env.CLAUDE_CODE_USE_BEDROCK) ||\n      isEnvTruthy(process.env.CLAUDE_CODE_USE_VERTEX) ||\n      isEnvTruthy(process.env.CLAUDE_CODE_USE_FOUNDRY) ||\n      process.env.DISABLE_ERROR_REPORTING ||\n      isEssentialTrafficOnly()\n    ) {\n      return\n    }\n\n    const errorStr = err.stack || err.message\n\n    const errorInfo = {\n      error: errorStr,\n      timestamp: new Date().toISOString(),\n    }\n\n    // Always add to in-memory log (no dependencies needed)\n    addToInMemoryErrorLog(errorInfo)\n\n    // If sink not attached, queue the event\n    if (errorLogSink === null) {\n      errorQueue.push({ type: 'error', error: err })\n      return\n    }\n\n    errorLogSink.logError(err)\n  } catch {\n    // pass\n  }\n}\n\nexport function getInMemoryErrors(): { error: string; timestamp: string }[] {\n  return [...inMemoryErrorLog]\n}\n\n/**\n * Loads the list of error logs\n * @returns List of error logs sorted by date\n */\nexport function loadErrorLogs(): Promise<LogOption[]> {\n  return loadLogList(CACHE_PATHS.errors())\n}\n\n/**\n * Gets an error log by its index\n * @param index Index in the sorted list of logs (0-based)\n * @returns Log data or null if not found\n */\nexport async function getErrorLogByIndex(\n  index: number,\n): Promise<LogOption | null> {\n  const logs = await loadErrorLogs()\n  return logs[index] || null\n}\n\n/**\n * Internal function to load and process logs from a specified path\n * @param path Directory containing logs\n * @returns Array of logs sorted by date\n * @private\n */\nasync function loadLogList(path: string): Promise<LogOption[]> {\n  let files: Awaited<ReturnType<typeof readdir>>\n  try {\n    files = await readdir(path, { withFileTypes: true })\n  } catch {\n    logError(new Error(`No logs found at ${path}`))\n    return []\n  }\n  const logData = await Promise.all(\n    files.map(async (file, i) => {\n      const fullPath = join(path, file.name)\n      const content = await readFile(fullPath, { encoding: 'utf8' })\n      const messages = jsonParse(content) as SerializedMessage[]\n      const firstMessage = messages[0]\n      const lastMessage = messages[messages.length - 1]\n      const firstPrompt =\n        firstMessage?.type === 'user' &&\n        typeof firstMessage?.message?.content === 'string'\n          ? firstMessage?.message?.content\n          : 'No prompt'\n\n      // For new random filenames, we'll get stats from the file itself\n      const fileStats = await stat(fullPath)\n\n      // Check if it's a sidechain by looking at filename\n      const isSidechain = fullPath.includes('sidechain')\n\n      // For new files, use the file modified time as date\n      const date = dateToFilename(fileStats.mtime)\n\n      return {\n        date,\n        fullPath,\n        messages,\n        value: i, // hack: overwritten after sorting, right below this\n        created: parseISOString(firstMessage?.timestamp || date),\n        modified: lastMessage?.timestamp\n          ? parseISOString(lastMessage.timestamp)\n          : parseISOString(date),\n        firstPrompt:\n          firstPrompt.split('\\n')[0]?.slice(0, 50) +\n            (firstPrompt.length > 50 ? '\u2026' : '') || 'No prompt',\n        messageCount: messages.length,\n        isSidechain,\n      }\n    }),\n  )\n\n  return sortLogs(logData.filter(_ => _ !== null)).map((_, i) => ({\n    ..._,\n    value: i,\n  }))\n}\n\nfunction parseISOString(s: string): Date {\n  const b = s.split(/\\D+/)\n  return new Date(\n    Date.UTC(\n      parseInt(b[0]!, 10),\n      parseInt(b[1]!, 10) - 1,\n      parseInt(b[2]!, 10),\n      parseInt(b[3]!, 10),\n      parseInt(b[4]!, 10),\n      parseInt(b[5]!, 10),\n      parseInt(b[6]!, 10),\n    ),\n  )\n}\n\nexport function logMCPError(serverName: string, error: unknown): void {\n  try {\n    // If sink not attached, queue the event\n    if (errorLogSink === null) {\n      errorQueue.push({ type: 'mcpError', serverName, error })\n      return\n    }\n\n    errorLogSink.logMCPError(serverName, error)\n  } catch {\n    // Silently fail\n  }\n}\n\nexport function logMCPDebug(serverName: string, message: string): void {\n  try {\n    // If sink not attached, queue the event\n    if (errorLogSink === null) {\n      errorQueue.push({ type: 'mcpDebug', serverName, message })\n      return\n    }\n\n    errorLogSink.logMCPDebug(serverName, message)\n  } catch {\n    // Silently fail\n  }\n}\n\n/**\n * Captures the last API request for inclusion in bug reports.\n */\nexport function captureAPIRequest(\n  params: BetaMessageStreamParams,\n  querySource?: QuerySource,\n): void {\n  // startsWith, not exact match \u2014 users with non-default output styles get\n  // variants like 'repl_main_thread:outputStyle:Explanatory' (querySource.ts).\n  if (!querySource || !querySource.startsWith('repl_main_thread')) {\n    return\n  }\n\n  // Store params WITHOUT messages to avoid retaining the entire conversation\n  // for all users. Messages are already persisted to the transcript file and\n  // available via React state.\n  const { messages, ...paramsWithoutMessages } = params\n  setLastAPIRequest(paramsWithoutMessages)\n  // For ant users only: also keep a reference to the final messages array so\n  // /share's serialized_conversation.json captures the exact post-compaction,\n  // CLAUDE.md-injected payload the API received. Overwritten each turn;\n  // dumpPrompts.ts already holds 5 full request bodies for ants, so this is\n  // not a new retention class.\n  setLastAPIRequestMessages(process.env.USER_TYPE === 'ant' ? messages : null)\n}\n\n/**\n * Reset error log state for testing purposes only.\n * @internal\n */\nexport function _resetErrorLogForTesting(): void {\n  errorLogSink = null\n  errorQueue.length = 0\n  inMemoryErrorLog = []\n}\n", "type QueueItem<T extends unknown[], R> = {\n  args: T\n  resolve: (value: R) => void\n  reject: (reason?: unknown) => void\n  context: unknown\n}\n\n/**\n * Creates a sequential execution wrapper for async functions to prevent race conditions.\n * Ensures that concurrent calls to the wrapped function are executed one at a time\n * in the order they were received, while preserving the correct return values.\n *\n * This is useful for operations that must be performed sequentially, such as\n * file writes or database updates that could cause conflicts if executed concurrently.\n *\n * @param fn - The async function to wrap with sequential execution\n * @returns A wrapped version of the function that executes calls sequentially\n */\nexport function sequential<T extends unknown[], R>(\n  fn: (...args: T) => Promise<R>,\n): (...args: T) => Promise<R> {\n  const queue: QueueItem<T, R>[] = []\n  let processing = false\n\n  async function processQueue(): Promise<void> {\n    if (processing) return\n    if (queue.length === 0) return\n\n    processing = true\n\n    while (queue.length > 0) {\n      const { args, resolve, reject, context } = queue.shift()!\n\n      try {\n        const result = await fn.apply(context, args)\n        resolve(result)\n      } catch (error) {\n        reject(error)\n      }\n    }\n\n    processing = false\n\n    // Check if new items were added while we were processing\n    if (queue.length > 0) {\n      void processQueue()\n    }\n  }\n\n  return function (this: unknown, ...args: T): Promise<R> {\n    return new Promise((resolve, reject) => {\n      queue.push({ args, resolve, reject, context: this })\n      void processQueue()\n    })\n  }\n}\n", "/**\n * Sync file-read path, extracted from file.ts.\n *\n * file.ts sits in the settings SCC via log.ts \u2192 types/logs.ts \u2192 types/message.ts \u2192\n * Tool.ts \u2192 commands.ts \u2192 \u2026 Anything that needs readFileSync from file.ts\n * pulls in the whole chain. This leaf imports only fsOperations and debug,\n * both of which terminate in Node builtins.\n *\n * detectFileEncoding/detectLineEndings stay in file.ts \u2014 they call logError\n * (log.ts \u2192 SCC) on unexpected failures. The -ForResolvedPath/-ForString\n * helpers here are the pure parts; callers who need the logging wrappers\n * import from file.ts.\n */\n\nimport { logForDebugging } from './debug.js'\nimport { getFsImplementation, safeResolvePath } from './fsOperations.js'\n\nexport type LineEndingType = 'CRLF' | 'LF'\n\nexport function detectEncodingForResolvedPath(\n  resolvedPath: string,\n): BufferEncoding {\n  const { buffer, bytesRead } = getFsImplementation().readSync(resolvedPath, {\n    length: 4096,\n  })\n\n  // Empty files should default to utf8, not ascii\n  // This fixes a bug where writing emojis/CJK to empty files caused corruption\n  if (bytesRead === 0) {\n    return 'utf8'\n  }\n\n  if (bytesRead >= 2) {\n    if (buffer[0] === 0xff && buffer[1] === 0xfe) return 'utf16le'\n  }\n\n  if (\n    bytesRead >= 3 &&\n    buffer[0] === 0xef &&\n    buffer[1] === 0xbb &&\n    buffer[2] === 0xbf\n  ) {\n    return 'utf8'\n  }\n\n  // For non-empty files, default to utf8 since it's a superset of ascii\n  // and handles all Unicode characters properly\n  return 'utf8'\n}\n\nexport function detectLineEndingsForString(content: string): LineEndingType {\n  let crlfCount = 0\n  let lfCount = 0\n\n  for (let i = 0; i < content.length; i++) {\n    if (content[i] === '\\n') {\n      if (i > 0 && content[i - 1] === '\\r') {\n        crlfCount++\n      } else {\n        lfCount++\n      }\n    }\n  }\n\n  return crlfCount > lfCount ? 'CRLF' : 'LF'\n}\n\n/**\n * Like readFileSync but also returns the detected encoding and original line\n * ending style in one filesystem pass. Callers writing the file back (e.g.\n * FileEditTool) can reuse these instead of calling detectFileEncoding /\n * detectLineEndings separately, which would each redo safeResolvePath +\n * readSync(4KB).\n */\nexport function readFileSyncWithMetadata(filePath: string): {\n  content: string\n  encoding: BufferEncoding\n  lineEndings: LineEndingType\n} {\n  const fs = getFsImplementation()\n  const { resolvedPath, isSymlink } = safeResolvePath(fs, filePath)\n\n  if (isSymlink) {\n    logForDebugging(`Reading through symlink: ${filePath} -> ${resolvedPath}`)\n  }\n\n  const encoding = detectEncodingForResolvedPath(resolvedPath)\n  const raw = fs.readFileSync(resolvedPath, { encoding })\n  // Detect line endings from the raw head before CRLF normalization erases\n  // the distinction. 4096 code units is \u2265 detectLineEndings's 4096-byte\n  // readSync sample (line endings are ASCII, so the unit mismatch is moot).\n  const lineEndings = detectLineEndingsForString(raw.slice(0, 4096))\n  return {\n    content: raw.replaceAll('\\r\\n', '\\n'),\n    encoding,\n    lineEndings,\n  }\n}\n\nexport function readFileSync(filePath: string): string {\n  return readFileSyncWithMetadata(filePath).content\n}\n", "/**\n * Leaf stripBOM \u2014 extracted from json.ts to break settings \u2192 json \u2192 log \u2192\n * types/logs \u2192 \u2026 \u2192 settings. json.ts imports this for its memoized+logging\n * safeParseJSON; leaf callers that can't import json.ts use stripBOM +\n * jsonParse inline (syncCacheState does this).\n *\n * UTF-8 BOM (U+FEFF): PowerShell 5.x writes UTF-8 with BOM by default\n * (Out-File, Set-Content). We can't control user environments, so strip on\n * read. Without this, JSON.parse fails with \"Unexpected token\".\n */\n\nconst UTF8_BOM = '\\uFEFF'\n\nexport function stripBOM(content: string): string {\n  return content.startsWith(UTF8_BOM) ? content.slice(1) : content\n}\n", "/**\n * Leaf state module for the remote-managed-settings sync cache.\n *\n * Split from syncCache.ts to break the settings.ts \u2192 syncCache.ts \u2192 auth.ts \u2192\n * settings.ts cycle. auth.ts sits inside the large settings SCC; importing it\n * from settings.ts's own dependency chain pulls hundreds of modules into the\n * eagerly-evaluated SCC at startup.\n *\n * This module imports only leaves (path, envUtils, file, json, types,\n * settings/settingsCache \u2014 also a leaf, only type-imports validation). settings.ts\n * reads the cache from here. syncCache.ts keeps isRemoteManagedSettingsEligible\n * (the auth-touching part) and re-exports everything from here for callers that\n * don't care about the cycle.\n *\n * Eligibility is a tri-state here: undefined (not yet determined \u2014 return\n * null), false (ineligible \u2014 return null), true (proceed). managedEnv.ts\n * calls isRemoteManagedSettingsEligible() just before the policySettings\n * read \u2014 after userSettings/flagSettings env vars are applied, so the check\n * sees config-provided CLAUDE_CODE_USE_BEDROCK/ANTHROPIC_BASE_URL. That call\n * computes once and mirrors the result here via setEligibility(). Every\n * subsequent read hits the cached bool instead of re-running the auth chain.\n */\n\nimport { join } from 'path'\nimport { getClaudeConfigHomeDir } from '../../utils/envUtils.js'\nimport { readFileSync } from '../../utils/fileRead.js'\nimport { stripBOM } from '../../utils/jsonRead.js'\nimport { resetSettingsCache } from '../../utils/settings/settingsCache.js'\nimport type { SettingsJson } from '../../utils/settings/types.js'\nimport { jsonParse } from '../../utils/slowOperations.js'\n\nconst SETTINGS_FILENAME = 'remote-settings.json'\n\nlet sessionCache: SettingsJson | null = null\nlet eligible: boolean | undefined\n\nexport function setSessionCache(value: SettingsJson | null): void {\n  sessionCache = value\n}\n\nexport function resetSyncCache(): void {\n  sessionCache = null\n  eligible = undefined\n}\n\nexport function setEligibility(v: boolean): boolean {\n  eligible = v\n  return v\n}\n\nexport function getSettingsPath(): string {\n  return join(getClaudeConfigHomeDir(), SETTINGS_FILENAME)\n}\n\n// sync IO \u2014 settings pipeline is sync. fileRead and jsonRead are leaves;\n// file.ts and json.ts both sit in the settings SCC.\nfunction loadSettings(): SettingsJson | null {\n  try {\n    const content = readFileSync(getSettingsPath())\n    const data: unknown = jsonParse(stripBOM(content))\n    if (!data || typeof data !== 'object' || Array.isArray(data)) {\n      return null\n    }\n    return data as SettingsJson\n  } catch {\n    return null\n  }\n}\n\nexport function getRemoteManagedSettingsSyncFromCache(): SettingsJson | null {\n  if (eligible !== true) return null\n  if (sessionCache) return sessionCache\n  const cachedSettings = loadSettings()\n  if (cachedSettings) {\n    sessionCache = cachedSettings\n    // Remote settings just became available for the first time. Any merged\n    // getSettings_DEPRECATED() result cached before this moment is missing\n    // the policySettings layer (the `eligible !== true` guard above returned\n    // null). Flush so the next merged read re-merges with this layer visible.\n    //\n    // Fires at most once: subsequent calls hit `if (sessionCache)` above.\n    // When called from loadSettingsFromDisk() (settings.ts:546), the merged\n    // cache is still null (setSessionSettingsCache runs at :732 after\n    // loadSettingsFromDisk returns) \u2014 no-op. The async-fetch arm (index.ts\n    // setSessionCache + notifyChange) already handles its own reset.\n    //\n    // gh-23085: isBridgeEnabled() at main.tsx Commander-definition time\n    // (before preAction \u2192 init() \u2192 isRemoteManagedSettingsEligible()) reached\n    // getSettings_DEPRECATED() at auth.ts:115. The try/catch in bridgeEnabled\n    // swallowed the later getGlobalConfig() throw, but the merged settings\n    // cache was already poisoned. See managedSettingsHeadless.int.test.ts.\n    resetSettingsCache()\n    return cachedSettings\n  }\n  return null\n}\n", "export function intersperse<A>(as: A[], separator: (index: number) => A): A[] {\n  return as.flatMap((a, i) => (i ? [separator(i), a] : [a]))\n}\n\nexport function count<T>(arr: readonly T[], pred: (x: T) => unknown): number {\n  let n = 0\n  for (const x of arr) n += +!!pred(x)\n  return n\n}\n\nexport function uniq<T>(xs: Iterable<T>): T[] {\n  return [...new Set(xs)]\n}\n", "import { dirname } from 'path'\nimport { getFsImplementation } from './fsOperations.js'\nimport { jsonStringify } from './slowOperations.js'\n\ntype DiagnosticLogLevel = 'debug' | 'info' | 'warn' | 'error'\n\ntype DiagnosticLogEntry = {\n  timestamp: string\n  level: DiagnosticLogLevel\n  event: string\n  data: Record<string, unknown>\n}\n\n/**\n * Logs diagnostic information to a logfile. This information is sent\n * via the environment manager to session-ingress to monitor issues from\n * within the container.\n *\n * *Important* - this function MUST NOT be called with any PII, including\n * file paths, project names, repo names, prompts, etc.\n *\n * @param level    Log level. Only used for information, not filtering\n * @param event    A specific event: \"started\", \"mcp_connected\", etc.\n * @param data     Optional additional data to log\n */\n// sync IO: called from sync context\nexport function logForDiagnosticsNoPII(\n  level: DiagnosticLogLevel,\n  event: string,\n  data?: Record<string, unknown>,\n): void {\n  const logFile = getDiagnosticLogFile()\n  if (!logFile) {\n    return\n  }\n\n  const entry: DiagnosticLogEntry = {\n    timestamp: new Date().toISOString(),\n    level,\n    event,\n    data: data ?? {},\n  }\n\n  const fs = getFsImplementation()\n  const line = jsonStringify(entry) + '\\n'\n  try {\n    fs.appendFileSync(logFile, line)\n  } catch {\n    // If append fails, try creating the directory first\n    try {\n      fs.mkdirSync(dirname(logFile))\n      fs.appendFileSync(logFile, line)\n    } catch {\n      // Silently fail if logging is not possible\n    }\n  }\n}\n\nfunction getDiagnosticLogFile(): string | undefined {\n  return process.env.CLAUDE_CODE_DIAGNOSTICS_FILE\n}\n\n/**\n * Wraps an async function with diagnostic timing logs.\n * Logs `{event}_started` before execution and `{event}_completed` after with duration_ms.\n *\n * @param event   Event name prefix (e.g., \"git_status\" -> logs \"git_status_started\" and \"git_status_completed\")\n * @param fn      Async function to execute and time\n * @param getData Optional function to extract additional data from the result for the completion log\n * @returns       The result of the wrapped function\n */\nexport async function withDiagnosticsTiming<T>(\n  event: string,\n  fn: () => Promise<T>,\n  getData?: (result: T) => Record<string, unknown>,\n): Promise<T> {\n  const startTime = Date.now()\n  logForDiagnosticsNoPII('info', `${event}_started`)\n\n  try {\n    const result = await fn()\n    const additionalData = getData ? getData(result) : {}\n    logForDiagnosticsNoPII('info', `${event}_completed`, {\n      duration_ms: Date.now() - startTime,\n      ...additionalData,\n    })\n    return result\n  } catch (error) {\n    logForDiagnosticsNoPII('error', `${event}_failed`, {\n      duration_ms: Date.now() - startTime,\n    })\n    throw error\n  }\n}\n", "import { AsyncLocalStorage } from 'async_hooks'\nimport { getCwdState, getOriginalCwd } from '../bootstrap/state.js'\n\nconst cwdOverrideStorage = new AsyncLocalStorage<string>()\n\n/**\n * Run a function with an overridden working directory for the current async context.\n * All calls to pwd()/getCwd() within the function (and its async descendants) will\n * return the overridden cwd instead of the global one. This enables concurrent\n * agents to each see their own working directory without affecting each other.\n */\nexport function runWithCwdOverride<T>(cwd: string, fn: () => T): T {\n  return cwdOverrideStorage.run(cwd, fn)\n}\n\n/**\n * Get the current working directory\n */\nexport function pwd(): string {\n  return cwdOverrideStorage.getStore() ?? getCwdState()\n}\n\n/**\n * Get the current working directory or the original working directory if the current one is not available\n */\nexport function getCwd(): string {\n  try {\n    return pwd()\n  } catch {\n    return getOriginalCwd()\n  }\n}\n", "import { detectFileEncoding } from './file.js'\nimport { getFsImplementation } from './fsOperations.js'\n\ntype CachedFileData = {\n  content: string\n  encoding: BufferEncoding\n  mtime: number\n}\n\n/**\n * A simple in-memory cache for file contents with automatic invalidation based on modification time.\n * This eliminates redundant file reads in FileEditTool operations.\n */\nclass FileReadCache {\n  private cache = new Map<string, CachedFileData>()\n  private readonly maxCacheSize = 1000\n\n  /**\n   * Reads a file with caching. Returns both content and encoding.\n   * Cache key includes file path and modification time for automatic invalidation.\n   */\n  readFile(filePath: string): { content: string; encoding: BufferEncoding } {\n    const fs = getFsImplementation()\n\n    // Get file stats for cache invalidation\n    let stats\n    try {\n      stats = fs.statSync(filePath)\n    } catch (error) {\n      // File was deleted, remove from cache and re-throw\n      this.cache.delete(filePath)\n      throw error\n    }\n\n    const cacheKey = filePath\n    const cachedData = this.cache.get(cacheKey)\n\n    // Check if we have valid cached data\n    if (cachedData && cachedData.mtime === stats.mtimeMs) {\n      return {\n        content: cachedData.content,\n        encoding: cachedData.encoding,\n      }\n    }\n\n    // Cache miss or stale data - read the file\n    const encoding = detectFileEncoding(filePath)\n    const content = fs\n      .readFileSync(filePath, { encoding })\n      .replaceAll('\\r\\n', '\\n')\n\n    // Update cache\n    this.cache.set(cacheKey, {\n      content,\n      encoding,\n      mtime: stats.mtimeMs,\n    })\n\n    // Evict oldest entries if cache is too large\n    if (this.cache.size > this.maxCacheSize) {\n      const firstKey = this.cache.keys().next().value\n      if (firstKey) {\n        this.cache.delete(firstKey)\n      }\n    }\n\n    return { content, encoding }\n  }\n\n  /**\n   * Clears the entire cache. Useful for testing or memory management.\n   */\n  clear(): void {\n    this.cache.clear()\n  }\n\n  /**\n   * Removes a specific file from the cache.\n   */\n  invalidate(filePath: string): void {\n    this.cache.delete(filePath)\n  }\n\n  /**\n   * Gets cache statistics for debugging/monitoring.\n   */\n  getStats(): { size: number; entries: string[] } {\n    return {\n      size: this.cache.size,\n      entries: Array.from(this.cache.keys()),\n    }\n  }\n}\n\n// Export a singleton instance\nexport const fileReadCache = new FileReadCache()\n", "import { readdir, readFile } from 'fs/promises'\nimport memoize from 'lodash-es/memoize.js'\nimport { release as osRelease } from 'os'\nimport { getFsImplementation } from './fsOperations.js'\nimport { logError } from './log.js'\n\nexport type Platform = 'macos' | 'windows' | 'wsl' | 'linux' | 'unknown'\n\nexport const SUPPORTED_PLATFORMS: Platform[] = ['macos', 'wsl']\n\nexport const getPlatform = memoize((): Platform => {\n  try {\n    if (process.platform === 'darwin') {\n      return 'macos'\n    }\n\n    if (process.platform === 'win32') {\n      return 'windows'\n    }\n\n    if (process.platform === 'linux') {\n      // Check if running in WSL (Windows Subsystem for Linux)\n      try {\n        const procVersion = getFsImplementation().readFileSync(\n          '/proc/version',\n          { encoding: 'utf8' },\n        )\n        if (\n          procVersion.toLowerCase().includes('microsoft') ||\n          procVersion.toLowerCase().includes('wsl')\n        ) {\n          return 'wsl'\n        }\n      } catch (error) {\n        // Error reading /proc/version, assume regular Linux\n        logError(error)\n      }\n\n      // Regular Linux\n      return 'linux'\n    }\n\n    // Unknown platform\n    return 'unknown'\n  } catch (error) {\n    logError(error)\n    return 'unknown'\n  }\n})\n\nexport const getWslVersion = memoize((): string | undefined => {\n  // Only check for WSL on Linux systems\n  if (process.platform !== 'linux') {\n    return undefined\n  }\n  try {\n    const procVersion = getFsImplementation().readFileSync('/proc/version', {\n      encoding: 'utf8',\n    })\n\n    // First check for explicit WSL version markers (e.g., \"WSL2\", \"WSL3\", etc.)\n    const wslVersionMatch = procVersion.match(/WSL(\\d+)/i)\n    if (wslVersionMatch && wslVersionMatch[1]) {\n      return wslVersionMatch[1]\n    }\n\n    // If no explicit WSL version but contains Microsoft, assume WSL1\n    // This handles the original WSL1 format: \"4.4.0-19041-Microsoft\"\n    if (procVersion.toLowerCase().includes('microsoft')) {\n      return '1'\n    }\n\n    // Not WSL or unable to determine version\n    return undefined\n  } catch (error) {\n    logError(error)\n    return undefined\n  }\n})\n\nexport type LinuxDistroInfo = {\n  linuxDistroId?: string\n  linuxDistroVersion?: string\n  linuxKernel?: string\n}\n\nexport const getLinuxDistroInfo = memoize(\n  async (): Promise<LinuxDistroInfo | undefined> => {\n    if (process.platform !== 'linux') {\n      return undefined\n    }\n\n    const result: LinuxDistroInfo = {\n      linuxKernel: osRelease(),\n    }\n\n    try {\n      const content = await readFile('/etc/os-release', 'utf8')\n      for (const line of content.split('\\n')) {\n        const match = line.match(/^(ID|VERSION_ID)=(.*)$/)\n        if (match && match[1] && match[2]) {\n          const value = match[2].replace(/^\"|\"$/g, '')\n          if (match[1] === 'ID') {\n            result.linuxDistroId = value\n          } else {\n            result.linuxDistroVersion = value\n          }\n        }\n      }\n    } catch {\n      // /etc/os-release may not exist on all Linux systems\n    }\n\n    return result\n  },\n)\n\nconst VCS_MARKERS: Array<[string, string]> = [\n  ['.git', 'git'],\n  ['.hg', 'mercurial'],\n  ['.svn', 'svn'],\n  ['.p4config', 'perforce'],\n  ['$tf', 'tfs'],\n  ['.tfvc', 'tfs'],\n  ['.jj', 'jujutsu'],\n  ['.sl', 'sapling'],\n]\n\nexport async function detectVcs(dir?: string): Promise<string[]> {\n  const detected = new Set<string>()\n\n  // Check for Perforce via env var\n  if (process.env.P4PORT) {\n    detected.add('perforce')\n  }\n\n  try {\n    const targetDir = dir ?? getFsImplementation().cwd()\n    const entries = new Set(await readdir(targetDir))\n    for (const [marker, vcs] of VCS_MARKERS) {\n      if (entries.has(marker)) {\n        detected.add(vcs)\n      }\n    }\n  } catch {\n    // Directory may not be readable\n  }\n\n  return [...detected]\n}\n", "import {\n  type ExecSyncOptions,\n  type ExecSyncOptionsWithBufferEncoding,\n  type ExecSyncOptionsWithStringEncoding,\n  execSync as nodeExecSync,\n} from 'child_process'\nimport { slowLogging } from './slowOperations.js'\n\n/**\n * @deprecated Use async alternatives when possible. Sync exec calls block the event loop.\n *\n * Wrapped execSync with slow operation logging.\n * Use this instead of child_process execSync directly to detect performance issues.\n *\n * @example\n * import { execSync_DEPRECATED } from './execSyncWrapper.js'\n * const result = execSync_DEPRECATED('git status', { encoding: 'utf8' })\n */\nexport function execSync_DEPRECATED(command: string): Buffer\nexport function execSync_DEPRECATED(\n  command: string,\n  options: ExecSyncOptionsWithStringEncoding,\n): string\nexport function execSync_DEPRECATED(\n  command: string,\n  options: ExecSyncOptionsWithBufferEncoding,\n): Buffer\nexport function execSync_DEPRECATED(\n  command: string,\n  options?: ExecSyncOptions,\n): Buffer | string\nexport function execSync_DEPRECATED(\n  command: string,\n  options?: ExecSyncOptions,\n): Buffer | string {\n  using _ = slowLogging`execSync: ${command.slice(0, 100)}`\n  return nodeExecSync(command, options)\n}\n", "import { LRUCache } from 'lru-cache'\nimport { logError } from './log.js'\nimport { jsonStringify } from './slowOperations.js'\n\ntype CacheEntry<T> = {\n  value: T\n  timestamp: number\n  refreshing: boolean\n}\n\ntype MemoizedFunction<Args extends unknown[], Result> = {\n  (...args: Args): Result\n  cache: {\n    clear: () => void\n  }\n}\n\ntype LRUMemoizedFunction<Args extends unknown[], Result> = {\n  (...args: Args): Result\n  cache: {\n    clear: () => void\n    size: () => number\n    delete: (key: string) => boolean\n    get: (key: string) => Result | undefined\n    has: (key: string) => boolean\n  }\n}\n\n/**\n * Creates a memoized function that returns cached values while refreshing in parallel.\n * This implements a write-through cache pattern:\n * - If cache is fresh, return immediately\n * - If cache is stale, return the stale value but refresh it in the background\n * - If no cache exists, block and compute the value\n *\n * @param f The function to memoize\n * @param cacheLifetimeMs The lifetime of cached values in milliseconds\n * @returns A memoized version of the function\n */\nexport function memoizeWithTTL<Args extends unknown[], Result>(\n  f: (...args: Args) => Result,\n  cacheLifetimeMs: number = 5 * 60 * 1000, // Default 5 minutes\n): MemoizedFunction<Args, Result> {\n  const cache = new Map<string, CacheEntry<Result>>()\n\n  const memoized = (...args: Args): Result => {\n    const key = jsonStringify(args)\n    const cached = cache.get(key)\n    const now = Date.now()\n\n    // Populate cache\n    if (!cached) {\n      const value = f(...args)\n      cache.set(key, {\n        value,\n        timestamp: now,\n        refreshing: false,\n      })\n      return value\n    }\n\n    // If we have a stale cache entry and it's not already refreshing\n    if (\n      cached &&\n      now - cached.timestamp > cacheLifetimeMs &&\n      !cached.refreshing\n    ) {\n      // Mark as refreshing to prevent multiple parallel refreshes\n      cached.refreshing = true\n\n      // Schedule async refresh (non-blocking). Both .then and .catch are\n      // identity-guarded: a concurrent cache.clear() + cold-miss stores a\n      // newer entry while this microtask is queued. .then overwriting with\n      // the stale refresh's result is worse than .catch deleting (persists\n      // wrong data for full TTL vs. self-correcting on next call).\n      Promise.resolve()\n        .then(() => {\n          const newValue = f(...args)\n          if (cache.get(key) === cached) {\n            cache.set(key, {\n              value: newValue,\n              timestamp: Date.now(),\n              refreshing: false,\n            })\n          }\n        })\n        .catch(e => {\n          logError(e)\n          if (cache.get(key) === cached) {\n            cache.delete(key)\n          }\n        })\n\n      // Return the stale value immediately\n      return cached.value\n    }\n\n    return cache.get(key)!.value\n  }\n\n  // Add cache clear method\n  memoized.cache = {\n    clear: () => cache.clear(),\n  }\n\n  return memoized\n}\n\n/**\n * Creates a memoized async function that returns cached values while refreshing in parallel.\n * This implements a write-through cache pattern for async functions:\n * - If cache is fresh, return immediately\n * - If cache is stale, return the stale value but refresh it in the background\n * - If no cache exists, block and compute the value\n *\n * @param f The async function to memoize\n * @param cacheLifetimeMs The lifetime of cached values in milliseconds\n * @returns A memoized version of the async function\n */\nexport function memoizeWithTTLAsync<Args extends unknown[], Result>(\n  f: (...args: Args) => Promise<Result>,\n  cacheLifetimeMs: number = 5 * 60 * 1000, // Default 5 minutes\n): ((...args: Args) => Promise<Result>) & { cache: { clear: () => void } } {\n  const cache = new Map<string, CacheEntry<Result>>()\n  // In-flight cold-miss dedup. The old memoizeWithTTL (sync) accidentally\n  // provided this: it stored the Promise synchronously before the first\n  // await, so concurrent callers shared one f() invocation. This async\n  // variant awaits before cache.set, so concurrent cold-miss callers would\n  // each invoke f() independently without this map. For\n  // refreshAndGetAwsCredentials that means N concurrent `aws sso login`\n  // spawns. Same pattern as pending401Handlers in auth.ts:1171.\n  const inFlight = new Map<string, Promise<Result>>()\n\n  const memoized = async (...args: Args): Promise<Result> => {\n    const key = jsonStringify(args)\n    const cached = cache.get(key)\n    const now = Date.now()\n\n    // Populate cache - if this throws, nothing gets cached\n    if (!cached) {\n      const pending = inFlight.get(key)\n      if (pending) return pending\n      const promise = f(...args)\n      inFlight.set(key, promise)\n      try {\n        const result = await promise\n        // Identity-guard: cache.clear() during the await should discard this\n        // result (clear intent is to invalidate). If we're still in-flight,\n        // store it. clear() wipes inFlight too, so this check catches that.\n        if (inFlight.get(key) === promise) {\n          cache.set(key, {\n            value: result,\n            timestamp: now,\n            refreshing: false,\n          })\n        }\n        return result\n      } finally {\n        if (inFlight.get(key) === promise) {\n          inFlight.delete(key)\n        }\n      }\n    }\n\n    // If we have a stale cache entry and it's not already refreshing\n    if (\n      cached &&\n      now - cached.timestamp > cacheLifetimeMs &&\n      !cached.refreshing\n    ) {\n      // Mark as refreshing to prevent multiple parallel refreshes\n      cached.refreshing = true\n\n      // Schedule async refresh (non-blocking). Both .then and .catch are\n      // identity-guarded against a concurrent cache.clear() + cold-miss\n      // storing a newer entry while this refresh is in flight. .then\n      // overwriting with the stale refresh's result is worse than .catch\n      // deleting - wrong data persists for full TTL (e.g. credentials from\n      // the old awsAuthRefresh command after a settings change).\n      const staleEntry = cached\n      f(...args)\n        .then(newValue => {\n          if (cache.get(key) === staleEntry) {\n            cache.set(key, {\n              value: newValue,\n              timestamp: Date.now(),\n              refreshing: false,\n            })\n          }\n        })\n        .catch(e => {\n          logError(e)\n          if (cache.get(key) === staleEntry) {\n            cache.delete(key)\n          }\n        })\n\n      // Return the stale value immediately\n      return cached.value\n    }\n\n    return cache.get(key)!.value\n  }\n\n  // Add cache clear method. Also clear inFlight: clear() during a cold-miss\n  // await should not let the stale in-flight promise be returned to the next\n  // caller (defeats the purpose of clear). The try/finally above\n  // identity-guards inFlight.delete so the stale promise doesn't delete a\n  // fresh one if clear+cold-miss happens before the finally fires.\n  memoized.cache = {\n    clear: () => {\n      cache.clear()\n      inFlight.clear()\n    },\n  }\n\n  return memoized as ((...args: Args) => Promise<Result>) & {\n    cache: { clear: () => void }\n  }\n}\n\n/**\n * Creates a memoized function with LRU (Least Recently Used) eviction policy.\n * This prevents unbounded memory growth by evicting the least recently used entries\n * when the cache reaches its maximum size.\n *\n * Note: Cache size for memoized message processing functions\n * Chosen to prevent unbounded memory growth (was 300MB+ with lodash memoize)\n * while maintaining good cache hit rates for typical conversations.\n *\n * @param f The function to memoize\n * @returns A memoized version of the function with cache management methods\n */\nexport function memoizeWithLRU<\n  Args extends unknown[],\n  Result extends NonNullable<unknown>,\n>(\n  f: (...args: Args) => Result,\n  cacheFn: (...args: Args) => string,\n  maxCacheSize: number = 100,\n): LRUMemoizedFunction<Args, Result> {\n  const cache = new LRUCache<string, Result>({\n    max: maxCacheSize,\n  })\n\n  const memoized = (...args: Args): Result => {\n    const key = cacheFn(...args)\n    const cached = cache.get(key)\n    if (cached !== undefined) {\n      return cached\n    }\n\n    const result = f(...args)\n    cache.set(key, result)\n    return result\n  }\n\n  // Add cache management methods\n  memoized.cache = {\n    clear: () => cache.clear(),\n    size: () => cache.size,\n    delete: (key: string) => cache.delete(key),\n    // peek() avoids updating recency \u2014 we only want to observe, not promote\n    get: (key: string) => cache.peek(key),\n    has: (key: string) => cache.has(key),\n  }\n\n  return memoized\n}\n", "import memoize from 'lodash-es/memoize.js'\nimport * as path from 'path'\nimport * as pathWin32 from 'path/win32'\nimport { getCwd } from './cwd.js'\nimport { logForDebugging } from './debug.js'\nimport { execSync_DEPRECATED } from './execSyncWrapper.js'\nimport { memoizeWithLRU } from './memoize.js'\nimport { getPlatform } from './platform.js'\n\n/**\n * Check if a file or directory exists on Windows using the dir command\n * @param path - The path to check\n * @returns true if the path exists, false otherwise\n */\nfunction checkPathExists(path: string): boolean {\n  try {\n    execSync_DEPRECATED(`dir \"${path}\"`, { stdio: 'pipe' })\n    return true\n  } catch {\n    return false\n  }\n}\n\n/**\n * Find an executable using where.exe on Windows\n * @param executable - The name of the executable to find\n * @returns The path to the executable or null if not found\n */\nfunction findExecutable(executable: string): string | null {\n  // For git, check common installation locations first\n  if (executable === 'git') {\n    const defaultLocations = [\n      // check 64 bit before 32 bit\n      'C:\\\\Program Files\\\\Git\\\\cmd\\\\git.exe',\n      'C:\\\\Program Files (x86)\\\\Git\\\\cmd\\\\git.exe',\n      // intentionally don't look for C:\\Program Files\\Git\\mingw64\\bin\\git.exe\n      // because that directory is the \"raw\" tools with no environment setup\n    ]\n\n    for (const location of defaultLocations) {\n      if (checkPathExists(location)) {\n        return location\n      }\n    }\n  }\n\n  // Fall back to where.exe\n  try {\n    const result = execSync_DEPRECATED(`where.exe ${executable}`, {\n      stdio: 'pipe',\n      encoding: 'utf8',\n    }).trim()\n\n    // SECURITY: Filter out any results from the current directory\n    // to prevent executing malicious git.bat/cmd/exe files\n    const paths = result.split('\\r\\n').filter(Boolean)\n    const cwd = getCwd().toLowerCase()\n\n    for (const candidatePath of paths) {\n      // Normalize and compare paths to ensure we're not in current directory\n      const normalizedPath = path.resolve(candidatePath).toLowerCase()\n      const pathDir = path.dirname(normalizedPath).toLowerCase()\n\n      // Skip if the executable is in the current working directory\n      if (pathDir === cwd || normalizedPath.startsWith(cwd + path.sep)) {\n        logForDebugging(\n          `Skipping potentially malicious executable in current directory: ${candidatePath}`,\n        )\n        continue\n      }\n\n      // Return the first valid path that's not in the current directory\n      return candidatePath\n    }\n\n    return null\n  } catch {\n    return null\n  }\n}\n\n/**\n * If Windows, set the SHELL environment variable to git-bash path.\n * This is used by BashTool and Shell.ts for user shell commands.\n * COMSPEC is left unchanged for system process execution.\n *\n * Best-effort: if git-bash is not installed, SHELL is left unset. The\n * first-run setup flow is responsible for installing Git Bash.\n */\nexport function setShellIfWindows(): void {\n  if (getPlatform() === 'windows') {\n    const gitBashPath = findGitBashPath()\n    if (gitBashPath) {\n      process.env.SHELL = gitBashPath\n      logForDebugging(`Using bash path: \"${gitBashPath}\"`)\n    } else {\n      logForDebugging('No git-bash found on Windows')\n    }\n  }\n}\n\n/**\n * Find the path where `bash.exe` included with git-bash exists.\n * Returns null if git-bash is not installed.\n */\nexport const findGitBashPath = memoize((): string | null => {\n  if (process.env.CLAUDE_CODE_GIT_BASH_PATH) {\n    if (checkPathExists(process.env.CLAUDE_CODE_GIT_BASH_PATH)) {\n      return process.env.CLAUDE_CODE_GIT_BASH_PATH\n    }\n    logForDebugging(\n      `CLAUDE_CODE_GIT_BASH_PATH=\"${process.env.CLAUDE_CODE_GIT_BASH_PATH}\" does not exist`,\n    )\n  }\n\n  const gitPath = findExecutable('git')\n  if (gitPath) {\n    const bashPath = pathWin32.join(gitPath, '..', '..', 'bin', 'bash.exe')\n    if (checkPathExists(bashPath)) {\n      return bashPath\n    }\n  }\n\n  return null\n})\n\n/** Convert a Windows path to a POSIX path using pure JS. */\nexport const windowsPathToPosixPath = memoizeWithLRU(\n  (windowsPath: string): string => {\n    // Handle UNC paths: \\\\server\\share -> //server/share\n    if (windowsPath.startsWith('\\\\\\\\')) {\n      return windowsPath.replace(/\\\\/g, '/')\n    }\n    // Handle drive letter paths: C:\\Users\\foo -> /c/Users/foo\n    const match = windowsPath.match(/^([A-Za-z]):[/\\\\]/)\n    if (match) {\n      const driveLetter = match[1]!.toLowerCase()\n      return '/' + driveLetter + windowsPath.slice(2).replace(/\\\\/g, '/')\n    }\n    // Already POSIX or relative \u2014 just flip slashes\n    return windowsPath.replace(/\\\\/g, '/')\n  },\n  (p: string) => p,\n  500,\n)\n\n/** Convert a POSIX path to a Windows path using pure JS. */\nexport const posixPathToWindowsPath = memoizeWithLRU(\n  (posixPath: string): string => {\n    // Handle UNC paths: //server/share -> \\\\server\\share\n    if (posixPath.startsWith('//')) {\n      return posixPath.replace(/\\//g, '\\\\')\n    }\n    // Handle /cygdrive/c/... format\n    const cygdriveMatch = posixPath.match(/^\\/cygdrive\\/([A-Za-z])(\\/|$)/)\n    if (cygdriveMatch) {\n      const driveLetter = cygdriveMatch[1]!.toUpperCase()\n      const rest = posixPath.slice(('/cygdrive/' + cygdriveMatch[1]).length)\n      return driveLetter + ':' + (rest || '\\\\').replace(/\\//g, '\\\\')\n    }\n    // Handle /c/... format (MSYS2/Git Bash)\n    const driveMatch = posixPath.match(/^\\/([A-Za-z])(\\/|$)/)\n    if (driveMatch) {\n      const driveLetter = driveMatch[1]!.toUpperCase()\n      const rest = posixPath.slice(2)\n      return driveLetter + ':' + (rest || '\\\\').replace(/\\//g, '\\\\')\n    }\n    // Already Windows or relative \u2014 just flip slashes\n    return posixPath.replace(/\\//g, '\\\\')\n  },\n  (p: string) => p,\n  500,\n)\n", "import { execFile as execFileCb } from 'child_process'\nimport { promisify } from 'util'\n\nconst execFileAsync = promisify(execFileCb)\n\n/**\n * Portable worktree detection using only child_process \u2014 no analytics,\n * no bootstrap deps, no execa. Used by listSessionsImpl.ts (SDK) and\n * anywhere that needs worktree paths without pulling in the CLI\n * dependency chain (execa \u2192 cross-spawn \u2192 which).\n */\nexport async function getWorktreePathsPortable(cwd: string): Promise<string[]> {\n  try {\n    const { stdout } = await execFileAsync(\n      'git',\n      ['worktree', 'list', '--porcelain'],\n      { cwd, timeout: 5000 },\n    )\n    if (!stdout) return []\n    return stdout\n      .split('\\n')\n      .filter(line => line.startsWith('worktree '))\n      .map(line => line.slice('worktree '.length).normalize('NFC'))\n  } catch {\n    return []\n  }\n}\n", "/**\n * Portable session storage utilities.\n *\n * Pure Node.js \u2014 no internal dependencies on logging, experiments, or feature\n * flags. Shared between the CLI (src/utils/sessionStorage.ts) and the VS Code\n * extension (packages/claude-vscode/src/common-host/sessionStorage.ts).\n */\n\nimport type { UUID } from 'crypto'\nimport { open as fsOpen, readdir, realpath, stat } from 'fs/promises'\nimport { join } from 'path'\nimport { getClaudeConfigHomeDir } from './envUtils.js'\nimport { getWorktreePathsPortable } from './getWorktreePathsPortable.js'\nimport { djb2Hash } from './hash.js'\n\n/** Size of the head/tail buffer for lite metadata reads. */\nexport const LITE_READ_BUF_SIZE = 65536\n\n// ---------------------------------------------------------------------------\n// UUID validation\n// ---------------------------------------------------------------------------\n\nconst uuidRegex =\n  /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n\nexport function validateUuid(maybeUuid: unknown): UUID | null {\n  if (typeof maybeUuid !== 'string') return null\n  return uuidRegex.test(maybeUuid) ? (maybeUuid as UUID) : null\n}\n\n// ---------------------------------------------------------------------------\n// JSON string field extraction \u2014 no full parse, works on truncated lines\n// ---------------------------------------------------------------------------\n\n/**\n * Unescape a JSON string value extracted as raw text.\n * Only allocates a new string when escape sequences are present.\n */\nexport function unescapeJsonString(raw: string): string {\n  if (!raw.includes('\\\\')) return raw\n  try {\n    return JSON.parse(`\"${raw}\"`)\n  } catch {\n    return raw\n  }\n}\n\n/**\n * Extracts a simple JSON string field value from raw text without full parsing.\n * Looks for `\"key\":\"value\"` or `\"key\": \"value\"` patterns.\n * Returns the first match, or undefined if not found.\n */\nexport function extractJsonStringField(\n  text: string,\n  key: string,\n): string | undefined {\n  const patterns = [`\"${key}\":\"`, `\"${key}\": \"`]\n  for (const pattern of patterns) {\n    const idx = text.indexOf(pattern)\n    if (idx < 0) continue\n\n    const valueStart = idx + pattern.length\n    let i = valueStart\n    while (i < text.length) {\n      if (text[i] === '\\\\') {\n        i += 2\n        continue\n      }\n      if (text[i] === '\"') {\n        return unescapeJsonString(text.slice(valueStart, i))\n      }\n      i++\n    }\n  }\n  return undefined\n}\n\n/**\n * Like extractJsonStringField but finds the LAST occurrence.\n * Useful for fields that are appended (customTitle, tag, etc.).\n */\nexport function extractLastJsonStringField(\n  text: string,\n  key: string,\n): string | undefined {\n  const patterns = [`\"${key}\":\"`, `\"${key}\": \"`]\n  let lastValue: string | undefined\n  for (const pattern of patterns) {\n    let searchFrom = 0\n    while (true) {\n      const idx = text.indexOf(pattern, searchFrom)\n      if (idx < 0) break\n\n      const valueStart = idx + pattern.length\n      let i = valueStart\n      while (i < text.length) {\n        if (text[i] === '\\\\') {\n          i += 2\n          continue\n        }\n        if (text[i] === '\"') {\n          lastValue = unescapeJsonString(text.slice(valueStart, i))\n          break\n        }\n        i++\n      }\n      searchFrom = i + 1\n    }\n  }\n  return lastValue\n}\n\n// ---------------------------------------------------------------------------\n// First prompt extraction from head chunk\n// ---------------------------------------------------------------------------\n\n/**\n * Pattern matching auto-generated or system messages that should be skipped\n * when looking for the first meaningful user prompt. Matches anything that\n * starts with a lowercase XML-like tag (IDE context, hook output, task\n * notifications, channel messages, etc.) or a synthetic interrupt marker.\n */\nconst SKIP_FIRST_PROMPT_PATTERN =\n  /^(?:\\s*<[a-z][\\w-]*[\\s>]|\\[Request interrupted by user[^\\]]*\\])/\n\nconst COMMAND_NAME_RE = /<command-name>(.*?)<\\/command-name>/\n\n/**\n * Extracts the first meaningful user prompt from a JSONL head chunk.\n *\n * Skips tool_result messages, isMeta, isCompactSummary, command-name messages,\n * and auto-generated patterns (session hooks, tick, IDE metadata, etc.).\n * Truncates to 200 chars.\n */\nexport function extractFirstPromptFromHead(head: string): string {\n  let start = 0\n  let commandFallback = ''\n  while (start < head.length) {\n    const newlineIdx = head.indexOf('\\n', start)\n    const line =\n      newlineIdx >= 0 ? head.slice(start, newlineIdx) : head.slice(start)\n    start = newlineIdx >= 0 ? newlineIdx + 1 : head.length\n\n    if (!line.includes('\"type\":\"user\"') && !line.includes('\"type\": \"user\"'))\n      continue\n    if (line.includes('\"tool_result\"')) continue\n    if (line.includes('\"isMeta\":true') || line.includes('\"isMeta\": true'))\n      continue\n    if (\n      line.includes('\"isCompactSummary\":true') ||\n      line.includes('\"isCompactSummary\": true')\n    )\n      continue\n\n    try {\n      const entry = JSON.parse(line) as Record<string, unknown>\n      if (entry.type !== 'user') continue\n\n      const message = entry.message as Record<string, unknown> | undefined\n      if (!message) continue\n\n      const content = message.content\n      const texts: string[] = []\n      if (typeof content === 'string') {\n        texts.push(content)\n      } else if (Array.isArray(content)) {\n        for (const block of content as Record<string, unknown>[]) {\n          if (block.type === 'text' && typeof block.text === 'string') {\n            texts.push(block.text as string)\n          }\n        }\n      }\n\n      for (const raw of texts) {\n        let result = raw.replace(/\\n/g, ' ').trim()\n        if (!result) continue\n\n        // Skip slash-command messages but remember first as fallback\n        const cmdMatch = COMMAND_NAME_RE.exec(result)\n        if (cmdMatch) {\n          if (!commandFallback) commandFallback = cmdMatch[1]!\n          continue\n        }\n\n        // Format bash input with ! prefix before the generic XML skip\n        const bashMatch = /<bash-input>([\\s\\S]*?)<\\/bash-input>/.exec(result)\n        if (bashMatch) return `! ${bashMatch[1]!.trim()}`\n\n        if (SKIP_FIRST_PROMPT_PATTERN.test(result)) continue\n\n        if (result.length > 200) {\n          result = result.slice(0, 200).trim() + '\\u2026'\n        }\n        return result\n      }\n    } catch {\n      continue\n    }\n  }\n  if (commandFallback) return commandFallback\n  return ''\n}\n\n// ---------------------------------------------------------------------------\n// File I/O \u2014 read head and tail of a file\n// ---------------------------------------------------------------------------\n\n/**\n * Reads the first and last LITE_READ_BUF_SIZE bytes of a file.\n *\n * For small files where head covers tail, `tail === head`.\n * Accepts a shared Buffer to avoid per-file allocation overhead.\n * Returns `{ head: '', tail: '' }` on any error.\n */\nexport async function readHeadAndTail(\n  filePath: string,\n  fileSize: number,\n  buf: Buffer,\n): Promise<{ head: string; tail: string }> {\n  try {\n    const fh = await fsOpen(filePath, 'r')\n    try {\n      const headResult = await fh.read(buf, 0, LITE_READ_BUF_SIZE, 0)\n      if (headResult.bytesRead === 0) return { head: '', tail: '' }\n\n      const head = buf.toString('utf8', 0, headResult.bytesRead)\n\n      const tailOffset = Math.max(0, fileSize - LITE_READ_BUF_SIZE)\n      let tail = head\n      if (tailOffset > 0) {\n        const tailResult = await fh.read(buf, 0, LITE_READ_BUF_SIZE, tailOffset)\n        tail = buf.toString('utf8', 0, tailResult.bytesRead)\n      }\n\n      return { head, tail }\n    } finally {\n      await fh.close()\n    }\n  } catch {\n    return { head: '', tail: '' }\n  }\n}\n\nexport type LiteSessionFile = {\n  mtime: number\n  size: number\n  head: string\n  tail: string\n}\n\n/**\n * Opens a single session file, stats it, and reads head + tail in one fd.\n * Allocates its own buffer \u2014 safe for concurrent use with Promise.all.\n * Returns null on any error.\n */\nexport async function readSessionLite(\n  filePath: string,\n): Promise<LiteSessionFile | null> {\n  try {\n    const fh = await fsOpen(filePath, 'r')\n    try {\n      const stat = await fh.stat()\n      const buf = Buffer.allocUnsafe(LITE_READ_BUF_SIZE)\n      const headResult = await fh.read(buf, 0, LITE_READ_BUF_SIZE, 0)\n      if (headResult.bytesRead === 0) return null\n\n      const head = buf.toString('utf8', 0, headResult.bytesRead)\n      const tailOffset = Math.max(0, stat.size - LITE_READ_BUF_SIZE)\n      let tail = head\n      if (tailOffset > 0) {\n        const tailResult = await fh.read(buf, 0, LITE_READ_BUF_SIZE, tailOffset)\n        tail = buf.toString('utf8', 0, tailResult.bytesRead)\n      }\n\n      return { mtime: stat.mtime.getTime(), size: stat.size, head, tail }\n    } finally {\n      await fh.close()\n    }\n  } catch {\n    return null\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Path sanitization\n// ---------------------------------------------------------------------------\n\n/**\n * Maximum length for a single filesystem path component (directory or file name).\n * Most filesystems (ext4, APFS, NTFS) limit individual components to 255 bytes.\n * We use 200 to leave room for the hash suffix and separator.\n */\nexport const MAX_SANITIZED_LENGTH = 200\n\nfunction simpleHash(str: string): string {\n  return Math.abs(djb2Hash(str)).toString(36)\n}\n\n/**\n * Makes a string safe for use as a directory or file name.\n * Replaces all non-alphanumeric characters with hyphens.\n * This ensures compatibility across all platforms, including Windows\n * where characters like colons are reserved.\n *\n * For deeply nested paths that would exceed filesystem limits (255 bytes),\n * truncates and appends a hash suffix for uniqueness.\n *\n * @param name - The string to make safe (e.g., '/Users/foo/my-project' or 'plugin:name:server')\n * @returns A safe name (e.g., '-Users-foo-my-project' or 'plugin-name-server')\n */\nexport function sanitizePath(name: string): string {\n  const sanitized = name.replace(/[^a-zA-Z0-9]/g, '-')\n  if (sanitized.length <= MAX_SANITIZED_LENGTH) {\n    return sanitized\n  }\n  const hash =\n    typeof Bun !== 'undefined' ? Bun.hash(name).toString(36) : simpleHash(name)\n  return `${sanitized.slice(0, MAX_SANITIZED_LENGTH)}-${hash}`\n}\n\n// ---------------------------------------------------------------------------\n// Project directory discovery (shared by listSessions & getSessionMessages)\n// ---------------------------------------------------------------------------\n\nexport function getProjectsDir(): string {\n  return join(getClaudeConfigHomeDir(), 'projects')\n}\n\nexport function getProjectDir(projectDir: string): string {\n  return join(getProjectsDir(), sanitizePath(projectDir))\n}\n\n/**\n * Resolves a directory path to its canonical form using realpath + NFC\n * normalization. Falls back to NFC-only if realpath fails (e.g., the\n * directory doesn't exist yet). Ensures symlinked paths (e.g.,\n * /tmp \u2192 /private/tmp on macOS) resolve to the same project directory.\n */\nexport async function canonicalizePath(dir: string): Promise<string> {\n  try {\n    return (await realpath(dir)).normalize('NFC')\n  } catch {\n    return dir.normalize('NFC')\n  }\n}\n\n/**\n * Finds the project directory for a given path, tolerating hash mismatches\n * for long paths (>200 chars). The CLI uses Bun.hash while the SDK under\n * Node.js uses simpleHash \u2014 for paths that exceed MAX_SANITIZED_LENGTH,\n * these produce different directory suffixes. This function falls back to\n * prefix-based scanning when the exact match doesn't exist.\n */\nexport async function findProjectDir(\n  projectPath: string,\n): Promise<string | undefined> {\n  const exact = getProjectDir(projectPath)\n  try {\n    await readdir(exact)\n    return exact\n  } catch {\n    // Exact match failed \u2014 for short paths this means no sessions exist.\n    // For long paths, try prefix matching to handle hash mismatches.\n    const sanitized = sanitizePath(projectPath)\n    if (sanitized.length <= MAX_SANITIZED_LENGTH) {\n      return undefined\n    }\n    const prefix = sanitized.slice(0, MAX_SANITIZED_LENGTH)\n    const projectsDir = getProjectsDir()\n    try {\n      const dirents = await readdir(projectsDir, { withFileTypes: true })\n      const match = dirents.find(\n        d => d.isDirectory() && d.name.startsWith(prefix + '-'),\n      )\n      return match ? join(projectsDir, match.name) : undefined\n    } catch {\n      return undefined\n    }\n  }\n}\n\n/**\n * Resolve a sessionId to its on-disk JSONL file path.\n *\n * When `dir` is provided: canonicalize it, look in that project's directory\n * (with findProjectDir fallback for Bun/Node hash mismatches), then fall back\n * to sibling git worktrees. `projectPath` in the result is the canonical\n * user-facing directory the file was found under.\n *\n * When `dir` is omitted: scan all project directories under ~/.claude/projects/.\n * `projectPath` is undefined in this case (no meaningful project path to report).\n *\n * Existence is checked by stat (operate-then-catch-ENOENT, no existsSync).\n * Zero-byte files are treated as not-found so callers continue searching past\n * a truncated copy to find a valid one in a sibling directory.\n *\n * `fileSize` is returned so callers (loadSessionBuffer) don't need to re-stat.\n *\n * Shared by getSessionInfoImpl and getSessionMessagesImpl \u2014 the caller\n * invokes its own reader (readSessionLite / loadSessionBuffer) on the\n * resolved path.\n */\nexport async function resolveSessionFilePath(\n  sessionId: string,\n  dir?: string,\n): Promise<\n  | { filePath: string; projectPath: string | undefined; fileSize: number }\n  | undefined\n> {\n  const fileName = `${sessionId}.jsonl`\n\n  if (dir) {\n    const canonical = await canonicalizePath(dir)\n    const projectDir = await findProjectDir(canonical)\n    if (projectDir) {\n      const filePath = join(projectDir, fileName)\n      try {\n        const s = await stat(filePath)\n        if (s.size > 0)\n          return { filePath, projectPath: canonical, fileSize: s.size }\n      } catch {\n        // ENOENT/EACCES \u2014 keep searching\n      }\n    }\n    // Worktree fallback \u2014 sessions may live under a different worktree root\n    let worktreePaths: string[]\n    try {\n      worktreePaths = await getWorktreePathsPortable(canonical)\n    } catch {\n      worktreePaths = []\n    }\n    for (const wt of worktreePaths) {\n      if (wt === canonical) continue\n      const wtProjectDir = await findProjectDir(wt)\n      if (!wtProjectDir) continue\n      const filePath = join(wtProjectDir, fileName)\n      try {\n        const s = await stat(filePath)\n        if (s.size > 0) return { filePath, projectPath: wt, fileSize: s.size }\n      } catch {\n        // ENOENT/EACCES \u2014 keep searching\n      }\n    }\n    return undefined\n  }\n\n  // No dir \u2014 scan all project directories\n  const projectsDir = getProjectsDir()\n  let dirents: string[]\n  try {\n    dirents = await readdir(projectsDir)\n  } catch {\n    return undefined\n  }\n  for (const name of dirents) {\n    const filePath = join(projectsDir, name, fileName)\n    try {\n      const s = await stat(filePath)\n      if (s.size > 0)\n        return { filePath, projectPath: undefined, fileSize: s.size }\n    } catch {\n      // ENOENT/ENOTDIR \u2014 not in this project, keep scanning\n    }\n  }\n  return undefined\n}\n\n// ---------------------------------------------------------------------------\n// Compact-boundary chunked read (shared by loadTranscriptFile & SDK getSessionMessages)\n// ---------------------------------------------------------------------------\n\n/** Chunk size for the forward transcript reader. 1 MB balances I/O calls vs buffer growth. */\nconst TRANSCRIPT_READ_CHUNK_SIZE = 1024 * 1024\n\n/**\n * File size below which precompact filtering is skipped.\n * Large sessions (>5 MB) almost always have compact boundaries \u2014 they got big\n * because of many turns triggering auto-compact.\n */\nexport const SKIP_PRECOMPACT_THRESHOLD = 5 * 1024 * 1024\n\n/** Marker bytes searched for when locating the boundary. Lazy: allocated on\n * first use, not at module load. Most sessions never resume. */\nlet _compactBoundaryMarker: Buffer | undefined\nfunction compactBoundaryMarker(): Buffer {\n  return (_compactBoundaryMarker ??= Buffer.from('\"compact_boundary\"'))\n}\n\n/**\n * Confirm a byte-matched line is a real compact_boundary (marker can appear\n * inside user content) and check for preservedSegment.\n */\nfunction parseBoundaryLine(\n  line: string,\n): { hasPreservedSegment: boolean } | null {\n  try {\n    const parsed = JSON.parse(line) as {\n      type?: string\n      subtype?: string\n      compactMetadata?: { preservedSegment?: unknown }\n    }\n    if (parsed.type !== 'system' || parsed.subtype !== 'compact_boundary') {\n      return null\n    }\n    return {\n      hasPreservedSegment: Boolean(parsed.compactMetadata?.preservedSegment),\n    }\n  } catch {\n    return null\n  }\n}\n\n/**\n * Single forward chunked read for the --resume load path. Attr-snap lines\n * are skipped at the fd level; compact boundaries truncate in-stream. Peak\n * is the output size, not the file size.\n *\n * The surviving (last) attr-snap is appended at EOF instead of in-place;\n * restoreAttributionStateFromSnapshots only reads [length-1] so position\n * doesn't matter.\n */\n\ntype Sink = { buf: Buffer; len: number; cap: number }\n\nfunction sinkWrite(s: Sink, src: Buffer, start: number, end: number): void {\n  const n = end - start\n  if (n <= 0) return\n  if (s.len + n > s.buf.length) {\n    const grown = Buffer.allocUnsafe(\n      Math.min(Math.max(s.buf.length * 2, s.len + n), s.cap),\n    )\n    s.buf.copy(grown, 0, 0, s.len)\n    s.buf = grown\n  }\n  src.copy(s.buf, s.len, start, end)\n  s.len += n\n}\n\nfunction hasPrefix(\n  src: Buffer,\n  prefix: Buffer,\n  at: number,\n  end: number,\n): boolean {\n  return (\n    end - at >= prefix.length &&\n    src.compare(prefix, 0, prefix.length, at, at + prefix.length) === 0\n  )\n}\n\nconst ATTR_SNAP_PREFIX = Buffer.from('{\"type\":\"attribution-snapshot\"')\nconst SYSTEM_PREFIX = Buffer.from('{\"type\":\"system\"')\nconst LF = 0x0a\nconst LF_BYTE = Buffer.from([LF])\nconst BOUNDARY_SEARCH_BOUND = 256 // marker sits ~28 bytes in; 256 is slack\n\ntype LoadState = {\n  out: Sink\n  boundaryStartOffset: number\n  hasPreservedSegment: boolean\n  lastSnapSrc: Buffer | null // most-recent attr-snap, appended at EOF\n  lastSnapLen: number\n  lastSnapBuf: Buffer | undefined\n  bufFileOff: number // file offset of buf[0]\n  carryLen: number\n  carryBuf: Buffer | undefined\n  straddleSnapCarryLen: number // per-chunk; reset by processStraddle\n  straddleSnapTailEnd: number\n}\n\n// Line spanning the chunk seam. 0 = fall through to concat.\nfunction processStraddle(\n  s: LoadState,\n  chunk: Buffer,\n  bytesRead: number,\n): number {\n  s.straddleSnapCarryLen = 0\n  s.straddleSnapTailEnd = 0\n  if (s.carryLen === 0) return 0\n  const cb = s.carryBuf!\n  const firstNl = chunk.indexOf(LF)\n  if (firstNl === -1 || firstNl >= bytesRead) return 0\n  const tailEnd = firstNl + 1\n  if (hasPrefix(cb, ATTR_SNAP_PREFIX, 0, s.carryLen)) {\n    s.straddleSnapCarryLen = s.carryLen\n    s.straddleSnapTailEnd = tailEnd\n    s.lastSnapSrc = null\n  } else if (s.carryLen < ATTR_SNAP_PREFIX.length) {\n    return 0 // too short to rule out attr-snap\n  } else {\n    if (hasPrefix(cb, SYSTEM_PREFIX, 0, s.carryLen)) {\n      const hit = parseBoundaryLine(\n        cb.toString('utf-8', 0, s.carryLen) +\n          chunk.toString('utf-8', 0, firstNl),\n      )\n      if (hit?.hasPreservedSegment) {\n        s.hasPreservedSegment = true\n      } else if (hit) {\n        s.out.len = 0\n        s.boundaryStartOffset = s.bufFileOff\n        s.hasPreservedSegment = false\n        s.lastSnapSrc = null\n      }\n    }\n    sinkWrite(s.out, cb, 0, s.carryLen)\n    sinkWrite(s.out, chunk, 0, tailEnd)\n  }\n  s.bufFileOff += s.carryLen + tailEnd\n  s.carryLen = 0\n  return tailEnd\n}\n\n// Strip attr-snaps, truncate on boundaries. Kept lines write as runs.\nfunction scanChunkLines(\n  s: LoadState,\n  buf: Buffer,\n  boundaryMarker: Buffer,\n): { lastSnapStart: number; lastSnapEnd: number; trailStart: number } {\n  let boundaryAt = buf.indexOf(boundaryMarker)\n  let runStart = 0\n  let lineStart = 0\n  let lastSnapStart = -1\n  let lastSnapEnd = -1\n  let nl = buf.indexOf(LF)\n  while (nl !== -1) {\n    const lineEnd = nl + 1\n    if (boundaryAt !== -1 && boundaryAt < lineStart) {\n      boundaryAt = buf.indexOf(boundaryMarker, lineStart)\n    }\n    if (hasPrefix(buf, ATTR_SNAP_PREFIX, lineStart, lineEnd)) {\n      sinkWrite(s.out, buf, runStart, lineStart)\n      lastSnapStart = lineStart\n      lastSnapEnd = lineEnd\n      runStart = lineEnd\n    } else if (\n      boundaryAt >= lineStart &&\n      boundaryAt < Math.min(lineStart + BOUNDARY_SEARCH_BOUND, lineEnd)\n    ) {\n      const hit = parseBoundaryLine(buf.toString('utf-8', lineStart, nl))\n      if (hit?.hasPreservedSegment) {\n        s.hasPreservedSegment = true // don't truncate; preserved msgs already in output\n      } else if (hit) {\n        s.out.len = 0\n        s.boundaryStartOffset = s.bufFileOff + lineStart\n        s.hasPreservedSegment = false\n        s.lastSnapSrc = null\n        lastSnapStart = -1\n        s.straddleSnapCarryLen = 0\n        runStart = lineStart\n      }\n      boundaryAt = buf.indexOf(\n        boundaryMarker,\n        boundaryAt + boundaryMarker.length,\n      )\n    }\n    lineStart = lineEnd\n    nl = buf.indexOf(LF, lineStart)\n  }\n  sinkWrite(s.out, buf, runStart, lineStart)\n  return { lastSnapStart, lastSnapEnd, trailStart: lineStart }\n}\n\n// In-buf snap wins over straddle (later in file). carryBuf still valid here.\nfunction captureSnap(\n  s: LoadState,\n  buf: Buffer,\n  chunk: Buffer,\n  lastSnapStart: number,\n  lastSnapEnd: number,\n): void {\n  if (lastSnapStart !== -1) {\n    s.lastSnapLen = lastSnapEnd - lastSnapStart\n    if (s.lastSnapBuf === undefined || s.lastSnapLen > s.lastSnapBuf.length) {\n      s.lastSnapBuf = Buffer.allocUnsafe(s.lastSnapLen)\n    }\n    buf.copy(s.lastSnapBuf, 0, lastSnapStart, lastSnapEnd)\n    s.lastSnapSrc = s.lastSnapBuf\n  } else if (s.straddleSnapCarryLen > 0) {\n    s.lastSnapLen = s.straddleSnapCarryLen + s.straddleSnapTailEnd\n    if (s.lastSnapBuf === undefined || s.lastSnapLen > s.lastSnapBuf.length) {\n      s.lastSnapBuf = Buffer.allocUnsafe(s.lastSnapLen)\n    }\n    s.carryBuf!.copy(s.lastSnapBuf, 0, 0, s.straddleSnapCarryLen)\n    chunk.copy(s.lastSnapBuf, s.straddleSnapCarryLen, 0, s.straddleSnapTailEnd)\n    s.lastSnapSrc = s.lastSnapBuf\n  }\n}\n\nfunction captureCarry(s: LoadState, buf: Buffer, trailStart: number): void {\n  s.carryLen = buf.length - trailStart\n  if (s.carryLen > 0) {\n    if (s.carryBuf === undefined || s.carryLen > s.carryBuf.length) {\n      s.carryBuf = Buffer.allocUnsafe(s.carryLen)\n    }\n    buf.copy(s.carryBuf, 0, trailStart, buf.length)\n  }\n}\n\nfunction finalizeOutput(s: LoadState): void {\n  if (s.carryLen > 0) {\n    const cb = s.carryBuf!\n    if (hasPrefix(cb, ATTR_SNAP_PREFIX, 0, s.carryLen)) {\n      s.lastSnapSrc = cb\n      s.lastSnapLen = s.carryLen\n    } else {\n      sinkWrite(s.out, cb, 0, s.carryLen)\n    }\n  }\n  if (s.lastSnapSrc) {\n    if (s.out.len > 0 && s.out.buf[s.out.len - 1] !== LF) {\n      sinkWrite(s.out, LF_BYTE, 0, 1)\n    }\n    sinkWrite(s.out, s.lastSnapSrc, 0, s.lastSnapLen)\n  }\n}\n\nexport async function readTranscriptForLoad(\n  filePath: string,\n  fileSize: number,\n): Promise<{\n  boundaryStartOffset: number\n  postBoundaryBuf: Buffer\n  hasPreservedSegment: boolean\n}> {\n  const boundaryMarker = compactBoundaryMarker()\n  const CHUNK_SIZE = TRANSCRIPT_READ_CHUNK_SIZE\n\n  const s: LoadState = {\n    out: {\n      // Gated callers enter with fileSize > 5MB, so min(fileSize, 8MB) lands\n      // in [5, 8]MB; large boundaryless sessions (24-31MB output) take 2\n      // grows. Ungated callers (attribution.ts) pass small files too \u2014 the\n      // min just right-sizes the initial buf, no grows.\n      buf: Buffer.allocUnsafe(Math.min(fileSize, 8 * 1024 * 1024)),\n      len: 0,\n      // +1: finalizeOutput may insert one LF between a non-LF-terminated\n      // carry and the reordered last attr-snap (crash-truncated file).\n      cap: fileSize + 1,\n    },\n    boundaryStartOffset: 0,\n    hasPreservedSegment: false,\n    lastSnapSrc: null,\n    lastSnapLen: 0,\n    lastSnapBuf: undefined,\n    bufFileOff: 0,\n    carryLen: 0,\n    carryBuf: undefined,\n    straddleSnapCarryLen: 0,\n    straddleSnapTailEnd: 0,\n  }\n\n  const chunk = Buffer.allocUnsafe(CHUNK_SIZE)\n  const fd = await fsOpen(filePath, 'r')\n  try {\n    let filePos = 0\n    while (filePos < fileSize) {\n      const { bytesRead } = await fd.read(\n        chunk,\n        0,\n        Math.min(CHUNK_SIZE, fileSize - filePos),\n        filePos,\n      )\n      if (bytesRead === 0) break\n      filePos += bytesRead\n\n      const chunkOff = processStraddle(s, chunk, bytesRead)\n\n      let buf: Buffer\n      if (s.carryLen > 0) {\n        const bufLen = s.carryLen + (bytesRead - chunkOff)\n        buf = Buffer.allocUnsafe(bufLen)\n        s.carryBuf!.copy(buf, 0, 0, s.carryLen)\n        chunk.copy(buf, s.carryLen, chunkOff, bytesRead)\n      } else {\n        buf = chunk.subarray(chunkOff, bytesRead)\n      }\n\n      const r = scanChunkLines(s, buf, boundaryMarker)\n      captureSnap(s, buf, chunk, r.lastSnapStart, r.lastSnapEnd)\n      captureCarry(s, buf, r.trailStart)\n      s.bufFileOff += r.trailStart\n    }\n    finalizeOutput(s)\n  } finally {\n    await fd.close()\n  }\n\n  return {\n    boundaryStartOffset: s.boundaryStartOffset,\n    postBoundaryBuf: s.out.buf.subarray(0, s.out.len),\n    hasPreservedSegment: s.hasPreservedSegment,\n  }\n}\n", "import { homedir } from 'os'\nimport { dirname, isAbsolute, join, normalize, relative, resolve } from 'path'\nimport { getCwd } from './cwd.js'\nimport { getFsImplementation } from './fsOperations.js'\nimport { getPlatform } from './platform.js'\nimport { posixPathToWindowsPath } from './windowsPaths.js'\n\n/**\n * Expands a path that may contain tilde notation (~) to an absolute path.\n *\n * On Windows, POSIX-style paths (e.g., `/c/Users/...`) are automatically converted\n * to Windows format (e.g., `C:\\Users\\...`). The function always returns paths in\n * the native format for the current platform.\n *\n * @param path - The path to expand, may contain:\n *   - `~` - expands to user's home directory\n *   - `~/path` - expands to path within user's home directory\n *   - absolute paths - returned normalized\n *   - relative paths - resolved relative to baseDir\n *   - POSIX paths on Windows - converted to Windows format\n * @param baseDir - The base directory for resolving relative paths (defaults to current working directory)\n * @returns The expanded absolute path in the native format for the current platform\n *\n * @throws {Error} If path is invalid\n *\n * @example\n * expandPath('~') // '/home/user'\n * expandPath('~/Documents') // '/home/user/Documents'\n * expandPath('./src', '/project') // '/project/src'\n * expandPath('/absolute/path') // '/absolute/path'\n */\nexport function expandPath(path: string, baseDir?: string): string {\n  // Set default baseDir to getCwd() if not provided\n  const actualBaseDir = baseDir ?? getCwd() ?? getFsImplementation().cwd()\n\n  // Input validation\n  if (typeof path !== 'string') {\n    throw new TypeError(`Path must be a string, received ${typeof path}`)\n  }\n\n  if (typeof actualBaseDir !== 'string') {\n    throw new TypeError(\n      `Base directory must be a string, received ${typeof actualBaseDir}`,\n    )\n  }\n\n  // Security: Check for null bytes\n  if (path.includes('\\0') || actualBaseDir.includes('\\0')) {\n    throw new Error('Path contains null bytes')\n  }\n\n  // Handle empty or whitespace-only paths\n  const trimmedPath = path.trim()\n  if (!trimmedPath) {\n    return normalize(actualBaseDir).normalize('NFC')\n  }\n\n  // Handle home directory notation\n  if (trimmedPath === '~') {\n    return homedir().normalize('NFC')\n  }\n\n  if (trimmedPath.startsWith('~/')) {\n    return join(homedir(), trimmedPath.slice(2)).normalize('NFC')\n  }\n\n  // On Windows, convert POSIX-style paths (e.g., /c/Users/...) to Windows format\n  let processedPath = trimmedPath\n  if (getPlatform() === 'windows' && trimmedPath.match(/^\\/[a-z]\\//i)) {\n    try {\n      processedPath = posixPathToWindowsPath(trimmedPath)\n    } catch {\n      // If conversion fails, use original path\n      processedPath = trimmedPath\n    }\n  }\n\n  // Handle absolute paths\n  if (isAbsolute(processedPath)) {\n    return normalize(processedPath).normalize('NFC')\n  }\n\n  // Handle relative paths\n  return resolve(actualBaseDir, processedPath).normalize('NFC')\n}\n\n/**\n * Converts an absolute path to a relative path from cwd, to save tokens in\n * tool output. If the path is outside cwd (relative path would start with ..),\n * returns the absolute path unchanged so it stays unambiguous.\n *\n * @param absolutePath - The absolute path to relativize\n * @returns Relative path if under cwd, otherwise the original absolute path\n */\nexport function toRelativePath(absolutePath: string): string {\n  const relativePath = relative(getCwd(), absolutePath)\n  // If the relative path would go outside cwd (starts with ..), keep absolute\n  return relativePath.startsWith('..') ? absolutePath : relativePath\n}\n\n/**\n * Gets the directory path for a given file or directory path.\n * If the path is a directory, returns the path itself.\n * If the path is a file or doesn't exist, returns the parent directory.\n *\n * @param path - The file or directory path\n * @returns The directory path\n */\nexport function getDirectoryForPath(path: string): string {\n  const absolutePath = expandPath(path)\n  // SECURITY: Skip filesystem operations for UNC paths to prevent NTLM credential leaks.\n  if (absolutePath.startsWith('\\\\\\\\') || absolutePath.startsWith('//')) {\n    return dirname(absolutePath)\n  }\n  try {\n    const stats = getFsImplementation().statSync(absolutePath)\n    if (stats.isDirectory()) {\n      return absolutePath\n    }\n  } catch {\n    // Path doesn't exist or can't be accessed\n  }\n  // If it's not a directory or doesn't exist, return the parent directory\n  return dirname(absolutePath)\n}\n\n/**\n * Checks if a path contains directory traversal patterns that navigate to parent directories.\n *\n * @param path - The path to check for traversal patterns\n * @returns true if the path contains traversal (e.g., '../', '..\\', or ends with '..')\n */\nexport function containsPathTraversal(path: string): boolean {\n  return /(?:^|[\\\\/])\\.\\.(?:[\\\\/]|$)/.test(path)\n}\n\n// Re-export from the shared zero-dep source.\nexport { sanitizePath } from './sessionStoragePortable.js'\n\n/**\n * Normalizes a path for use as a JSON config key.\n * On Windows, paths can have inconsistent separators (C:\\path vs C:/path)\n * depending on whether they come from git, Node.js APIs, or user input.\n * This normalizes to forward slashes for consistent JSON serialization.\n *\n * @param path - The path to normalize\n * @returns The normalized path with consistent forward slashes\n */\nexport function normalizePathForConfigKey(path: string): string {\n  // First use Node's normalize to resolve . and .. segments\n  const normalized = normalize(path)\n  // Then convert all backslashes to forward slashes for consistent JSON keys\n  // This is safe because forward slashes work in Windows paths for most operations\n  return normalized.replace(/\\\\/g, '/')\n}\n", "import { chmodSync, writeFileSync as fsWriteFileSync } from 'fs'\nimport { realpath, stat } from 'fs/promises'\nimport { homedir } from 'os'\nimport {\n  basename,\n  dirname,\n  extname,\n  isAbsolute,\n  join,\n  normalize,\n  relative,\n  resolve,\n  sep,\n} from 'path'\nimport { logEvent } from 'src/services/analytics/index.js'\nimport { getFeatureValue_CACHED_MAY_BE_STALE } from '../services/analytics/growthbook.js'\nimport { getCwd } from '../utils/cwd.js'\nimport { logForDebugging } from './debug.js'\nimport { isENOENT, isFsInaccessible } from './errors.js'\nimport {\n  detectEncodingForResolvedPath,\n  detectLineEndingsForString,\n  type LineEndingType,\n} from './fileRead.js'\nimport { fileReadCache } from './fileReadCache.js'\nimport { getFsImplementation, safeResolvePath } from './fsOperations.js'\nimport { logError } from './log.js'\nimport { expandPath } from './path.js'\nimport { getPlatform } from './platform.js'\n\nexport type File = {\n  filename: string\n  content: string\n}\n\n/**\n * Check if a path exists asynchronously.\n */\nexport async function pathExists(path: string): Promise<boolean> {\n  try {\n    await stat(path)\n    return true\n  } catch {\n    return false\n  }\n}\n\nexport const MAX_OUTPUT_SIZE = 0.25 * 1024 * 1024 // 0.25MB in bytes\n\nexport function readFileSafe(filepath: string): string | null {\n  try {\n    const fs = getFsImplementation()\n    return fs.readFileSync(filepath, { encoding: 'utf8' })\n  } catch (error) {\n    logError(error)\n    return null\n  }\n}\n\n/**\n * Get the normalized modification time of a file in milliseconds.\n * Uses Math.floor to ensure consistent timestamp comparisons across file operations,\n * reducing false positives from sub-millisecond precision changes (e.g., from IDE\n * file watchers that touch files without changing content).\n */\nexport function getFileModificationTime(filePath: string): number {\n  const fs = getFsImplementation()\n  return Math.floor(fs.statSync(filePath).mtimeMs)\n}\n\n/**\n * Async variant of getFileModificationTime. Same floor semantics.\n * Use this in async paths (getChangedFiles runs every turn on every readFileState\n * entry \u2014 sync statSync there triggers the slow-operation indicator on network/\n * slow disks).\n */\nexport async function getFileModificationTimeAsync(\n  filePath: string,\n): Promise<number> {\n  const s = await getFsImplementation().stat(filePath)\n  return Math.floor(s.mtimeMs)\n}\n\nexport function writeTextContent(\n  filePath: string,\n  content: string,\n  encoding: BufferEncoding,\n  endings: LineEndingType,\n): void {\n  let toWrite = content\n  if (endings === 'CRLF') {\n    // Normalize any existing CRLF to LF first so a new_string that already\n    // contains \\r\\n (raw model output) doesn't become \\r\\r\\n after the join.\n    toWrite = content.replaceAll('\\r\\n', '\\n').split('\\n').join('\\r\\n')\n  }\n\n  writeFileSyncAndFlush_DEPRECATED(filePath, toWrite, { encoding })\n}\n\nexport function detectFileEncoding(filePath: string): BufferEncoding {\n  try {\n    const fs = getFsImplementation()\n    const { resolvedPath } = safeResolvePath(fs, filePath)\n    return detectEncodingForResolvedPath(resolvedPath)\n  } catch (error) {\n    if (isFsInaccessible(error)) {\n      logForDebugging(\n        `detectFileEncoding failed for expected reason: ${error.code}`,\n        {\n          level: 'debug',\n        },\n      )\n    } else {\n      logError(error)\n    }\n    return 'utf8'\n  }\n}\n\nexport function detectLineEndings(\n  filePath: string,\n  encoding: BufferEncoding = 'utf8',\n): LineEndingType {\n  try {\n    const fs = getFsImplementation()\n    const { resolvedPath } = safeResolvePath(fs, filePath)\n    const { buffer, bytesRead } = fs.readSync(resolvedPath, { length: 4096 })\n\n    const content = buffer.toString(encoding, 0, bytesRead)\n    return detectLineEndingsForString(content)\n  } catch (error) {\n    logError(error)\n    return 'LF'\n  }\n}\n\nexport function convertLeadingTabsToSpaces(content: string): string {\n  // The /gm regex scans every line even on no-match; skip it entirely\n  // for the common tab-free case.\n  if (!content.includes('\\t')) return content\n  return content.replace(/^\\t+/gm, _ => '  '.repeat(_.length))\n}\n\nexport function getAbsoluteAndRelativePaths(path: string | undefined): {\n  absolutePath: string | undefined\n  relativePath: string | undefined\n} {\n  const absolutePath = path ? expandPath(path) : undefined\n  const relativePath = absolutePath\n    ? relative(getCwd(), absolutePath)\n    : undefined\n  return { absolutePath, relativePath }\n}\n\nexport function getDisplayPath(filePath: string): string {\n  // Use relative path if file is in the current working directory\n  const { relativePath } = getAbsoluteAndRelativePaths(filePath)\n  if (relativePath && !relativePath.startsWith('..')) {\n    return relativePath\n  }\n\n  // Use tilde notation for files in home directory\n  const homeDir = homedir()\n  if (filePath.startsWith(homeDir + sep)) {\n    return '~' + filePath.slice(homeDir.length)\n  }\n\n  // Otherwise return the absolute path\n  return filePath\n}\n\n/**\n * Find files with the same name but different extensions in the same directory\n * @param filePath The path to the file that doesn't exist\n * @returns The found file with a different extension, or undefined if none found\n */\n\nexport function findSimilarFile(filePath: string): string | undefined {\n  const fs = getFsImplementation()\n  try {\n    const dir = dirname(filePath)\n    const fileBaseName = basename(filePath, extname(filePath))\n\n    // Get all files in the directory\n    const files = fs.readdirSync(dir)\n\n    // Find files with the same base name but different extension\n    const similarFiles = files.filter(\n      file =>\n        basename(file.name, extname(file.name)) === fileBaseName &&\n        join(dir, file.name) !== filePath,\n    )\n\n    // Return just the filename of the first match if found\n    const firstMatch = similarFiles[0]\n    if (firstMatch) {\n      return firstMatch.name\n    }\n    return undefined\n  } catch (error) {\n    // Missing dir (ENOENT) is expected; for other errors log and return undefined\n    if (!isENOENT(error)) {\n      logError(error)\n    }\n    return undefined\n  }\n}\n\n/**\n * Marker included in file-not-found error messages that contain a cwd note.\n * UI renderers check for this to show a short \"File not found\" message.\n */\nexport const FILE_NOT_FOUND_CWD_NOTE = 'Note: your current working directory is'\n\n/**\n * Suggests a corrected path under the current working directory when a file/directory\n * is not found. Detects the \"dropped repo folder\" pattern where the model constructs\n * an absolute path missing the repo directory component.\n *\n * Example:\n *   cwd = /Users/zeeg/src/currentRepo\n *   requestedPath = /Users/zeeg/src/foobar           (doesn't exist)\n *   returns        /Users/zeeg/src/currentRepo/foobar (if it exists)\n *\n * @param requestedPath - The absolute path that was not found\n * @returns The corrected path if found under cwd, undefined otherwise\n */\nexport async function suggestPathUnderCwd(\n  requestedPath: string,\n): Promise<string | undefined> {\n  const cwd = getCwd()\n  const cwdParent = dirname(cwd)\n\n  // Resolve symlinks in the requested path's parent directory (e.g., /tmp -> /private/tmp on macOS)\n  // so the prefix comparison works correctly against the cwd (which is already realpath-resolved).\n  let resolvedPath = requestedPath\n  try {\n    const resolvedDir = await realpath(dirname(requestedPath))\n    resolvedPath = join(resolvedDir, basename(requestedPath))\n  } catch {\n    // Parent directory doesn't exist, use the original path\n  }\n\n  // Only check if the requested path is under cwd's parent but not under cwd itself.\n  // When cwdParent is the root directory (e.g., '/'), use it directly as the prefix\n  // to avoid a double-separator '//' that would never match.\n  const cwdParentPrefix = cwdParent === sep ? sep : cwdParent + sep\n  if (\n    !resolvedPath.startsWith(cwdParentPrefix) ||\n    resolvedPath.startsWith(cwd + sep) ||\n    resolvedPath === cwd\n  ) {\n    return undefined\n  }\n\n  // Get the relative path from the parent directory\n  const relFromParent = relative(cwdParent, resolvedPath)\n\n  // Check if the same relative path exists under cwd\n  const correctedPath = join(cwd, relFromParent)\n  try {\n    await stat(correctedPath)\n    return correctedPath\n  } catch {\n    return undefined\n  }\n}\n\n/**\n * Whether to use the compact line-number prefix format (`N\\t` instead of\n * `     N\u2192`). The padded-arrow format costs 9 bytes/line overhead; at\n * 1.35B Read calls \u00D7 132 lines avg this is 2.18% of fleet uncached input\n * (bq-queries/read_line_prefix_overhead_verify.sql).\n *\n * Ant soak validated no Edit error regression (6.29% vs 6.86% baseline).\n * Killswitch pattern: GB can disable if issues surface externally.\n */\nexport function isCompactLinePrefixEnabled(): boolean {\n  // 3P default: killswitch off = compact format enabled. Client-side only \u2014\n  // no server support needed, safe for Bedrock/Vertex/Foundry.\n  return !getFeatureValue_CACHED_MAY_BE_STALE(\n    'tengu_compact_line_prefix_killswitch',\n    false,\n  )\n}\n\n/**\n * Adds cat -n style line numbers to the content.\n */\nexport function addLineNumbers({\n  content,\n  // 1-indexed\n  startLine,\n}: {\n  content: string\n  startLine: number\n}): string {\n  if (!content) {\n    return ''\n  }\n\n  const lines = content.split(/\\r?\\n/)\n\n  if (isCompactLinePrefixEnabled()) {\n    return lines\n      .map((line, index) => `${index + startLine}\\t${line}`)\n      .join('\\n')\n  }\n\n  return lines\n    .map((line, index) => {\n      const numStr = String(index + startLine)\n      if (numStr.length >= 6) {\n        return `${numStr}\u2192${line}`\n      }\n      return `${numStr.padStart(6, ' ')}\u2192${line}`\n    })\n    .join('\\n')\n}\n\n/**\n * Inverse of addLineNumbers \u2014 strips the `N\u2192` or `N\\t` prefix from a single\n * line. Co-located so format changes here and in addLineNumbers stay in sync.\n */\nexport function stripLineNumberPrefix(line: string): string {\n  const match = line.match(/^\\s*\\d+[\\u2192\\t](.*)$/)\n  return match?.[1] ?? line\n}\n\n/**\n * Checks if a directory is empty.\n * @param dirPath The path to the directory to check\n * @returns true if the directory is empty or does not exist, false otherwise\n */\nexport function isDirEmpty(dirPath: string): boolean {\n  try {\n    return getFsImplementation().isDirEmptySync(dirPath)\n  } catch (e) {\n    // ENOENT: directory doesn't exist, consider it empty\n    // Other errors (EPERM on macOS protected folders, etc.): assume not empty\n    return isENOENT(e)\n  }\n}\n\n/**\n * Reads a file with caching to avoid redundant I/O operations.\n * This is the preferred method for FileEditTool operations.\n */\nexport function readFileSyncCached(filePath: string): string {\n  const { content } = fileReadCache.readFile(filePath)\n  return content\n}\n\n/**\n * Writes to a file and flushes the file to disk\n * @param filePath The path to the file to write to\n * @param content The content to write to the file\n * @param options Options for writing the file, including encoding and mode\n * @deprecated Use `fs.promises.writeFile` with flush option instead for non-blocking writes.\n * Sync file writes block the event loop and cause performance issues.\n */\nexport function writeFileSyncAndFlush_DEPRECATED(\n  filePath: string,\n  content: string,\n  options: { encoding: BufferEncoding; mode?: number } = { encoding: 'utf-8' },\n): void {\n  const fs = getFsImplementation()\n\n  // Check if the target file is a symlink to preserve it for all users\n  // Note: We don't use safeResolvePath here because we need to manually handle\n  // symlinks to ensure we write to the target while preserving the symlink itself\n  let targetPath = filePath\n  try {\n    // Try to read the symlink - if successful, it's a symlink\n    const linkTarget = fs.readlinkSync(filePath)\n    // Resolve to absolute path\n    targetPath = isAbsolute(linkTarget)\n      ? linkTarget\n      : resolve(dirname(filePath), linkTarget)\n    logForDebugging(`Writing through symlink: ${filePath} -> ${targetPath}`)\n  } catch {\n    // ENOENT (doesn't exist) or EINVAL (not a symlink) \u2014 keep targetPath = filePath\n  }\n\n  // Try atomic write first\n  const tempPath = `${targetPath}.tmp.${process.pid}.${Date.now()}`\n\n  // Check if target file exists and get its permissions (single stat, reused in both atomic and fallback paths)\n  let targetMode: number | undefined\n  let targetExists = false\n  try {\n    targetMode = fs.statSync(targetPath).mode\n    targetExists = true\n    logForDebugging(`Preserving file permissions: ${targetMode.toString(8)}`)\n  } catch (e) {\n    if (!isENOENT(e)) throw e\n    if (options.mode !== undefined) {\n      // Use provided mode for new files\n      targetMode = options.mode\n      logForDebugging(\n        `Setting permissions for new file: ${targetMode.toString(8)}`,\n      )\n    }\n  }\n\n  try {\n    logForDebugging(`Writing to temp file: ${tempPath}`)\n\n    // Write to temp file with flush and mode (if specified for new file)\n    const writeOptions: {\n      encoding: BufferEncoding\n      flush: boolean\n      mode?: number\n    } = {\n      encoding: options.encoding,\n      flush: true,\n    }\n    // Only set mode in writeFileSync for new files to ensure atomic permission setting\n    if (!targetExists && options.mode !== undefined) {\n      writeOptions.mode = options.mode\n    }\n\n    fsWriteFileSync(tempPath, content, writeOptions)\n    logForDebugging(\n      `Temp file written successfully, size: ${content.length} bytes`,\n    )\n\n    // For existing files or if mode was not set atomically, apply permissions\n    if (targetExists && targetMode !== undefined) {\n      chmodSync(tempPath, targetMode)\n      logForDebugging(`Applied original permissions to temp file`)\n    }\n\n    // Atomic rename (on POSIX systems, this is atomic)\n    // On Windows, this will overwrite the destination if it exists\n    logForDebugging(`Renaming ${tempPath} to ${targetPath}`)\n    fs.renameSync(tempPath, targetPath)\n    logForDebugging(`File ${targetPath} written atomically`)\n  } catch (atomicError) {\n    logForDebugging(`Failed to write file atomically: ${atomicError}`, {\n      level: 'error',\n    })\n    logEvent('tengu_atomic_write_error', {})\n\n    // Clean up temp file on error\n    try {\n      logForDebugging(`Cleaning up temp file: ${tempPath}`)\n      fs.unlinkSync(tempPath)\n    } catch (cleanupError) {\n      logForDebugging(`Failed to clean up temp file: ${cleanupError}`)\n    }\n\n    // Fallback to non-atomic write\n    logForDebugging(`Falling back to non-atomic write for ${targetPath}`)\n    try {\n      const fallbackOptions: {\n        encoding: BufferEncoding\n        flush: boolean\n        mode?: number\n      } = {\n        encoding: options.encoding,\n        flush: true,\n      }\n      // Only set mode for new files\n      if (!targetExists && options.mode !== undefined) {\n        fallbackOptions.mode = options.mode\n      }\n\n      fsWriteFileSync(targetPath, content, fallbackOptions)\n      logForDebugging(\n        `File ${targetPath} written successfully with non-atomic fallback`,\n      )\n    } catch (fallbackError) {\n      logForDebugging(`Non-atomic write also failed: ${fallbackError}`)\n      throw fallbackError\n    }\n  }\n}\n\nexport function getDesktopPath(): string {\n  const platform = getPlatform()\n  const homeDir = homedir()\n\n  if (platform === 'macos') {\n    return join(homeDir, 'Desktop')\n  }\n\n  if (platform === 'windows') {\n    // For WSL, try to access Windows desktop\n    const windowsHome = process.env.USERPROFILE\n      ? process.env.USERPROFILE.replace(/\\\\/g, '/')\n      : null\n\n    if (windowsHome) {\n      const wslPath = windowsHome.replace(/^[A-Z]:/, '')\n      const desktopPath = `/mnt/c${wslPath}/Desktop`\n\n      if (getFsImplementation().existsSync(desktopPath)) {\n        return desktopPath\n      }\n    }\n\n    // Fallback: try to find desktop in typical Windows user location\n    try {\n      const usersDir = '/mnt/c/Users'\n      const userDirs = getFsImplementation().readdirSync(usersDir)\n\n      for (const user of userDirs) {\n        if (\n          user.name === 'Public' ||\n          user.name === 'Default' ||\n          user.name === 'Default User' ||\n          user.name === 'All Users'\n        ) {\n          continue\n        }\n\n        const potentialDesktopPath = join(usersDir, user.name, 'Desktop')\n\n        if (getFsImplementation().existsSync(potentialDesktopPath)) {\n          return potentialDesktopPath\n        }\n      }\n    } catch (error) {\n      logError(error)\n    }\n  }\n\n  // Linux/unknown platform fallback\n  const desktopPath = join(homeDir, 'Desktop')\n  if (getFsImplementation().existsSync(desktopPath)) {\n    return desktopPath\n  }\n\n  // If Desktop folder doesn't exist, fallback to home directory\n  return homeDir\n}\n\n/**\n * Validates that a file size is within the specified limit.\n * Returns true if the file is within the limit, false otherwise.\n *\n * @param filePath The path to the file to validate\n * @param maxSizeBytes The maximum allowed file size in bytes\n * @returns true if file size is within limit, false otherwise\n */\nexport function isFileWithinReadSizeLimit(\n  filePath: string,\n  maxSizeBytes: number = MAX_OUTPUT_SIZE,\n): boolean {\n  try {\n    const stats = getFsImplementation().statSync(filePath)\n    return stats.size <= maxSizeBytes\n  } catch {\n    // If we can't stat the file, return false to indicate validation failure\n    return false\n  }\n}\n\n/**\n * Normalize a file path for comparison, handling platform differences.\n * On Windows, normalizes path separators and converts to lowercase for\n * case-insensitive comparison.\n */\nexport function normalizePathForComparison(filePath: string): string {\n  // Use path.normalize() to clean up redundant separators and resolve . and ..\n  let normalized = normalize(filePath)\n\n  // On Windows, normalize for case-insensitive comparison:\n  // - Convert forward slashes to backslashes (path.normalize only does this on actual Windows)\n  // - Convert to lowercase (Windows paths are case-insensitive)\n  if (getPlatform() === 'windows') {\n    normalized = normalized.replace(/\\//g, '\\\\').toLowerCase()\n  }\n\n  return normalized\n}\n\n/**\n * Compare two file paths for equality, handling Windows case-insensitivity.\n */\nexport function pathsEqual(path1: string, path2: string): boolean {\n  return normalizePathForComparison(path1) === normalizePathForComparison(path2)\n}\n", "import { type Options as ExecaOptions, execaSync } from 'execa'\nimport { getCwd } from '../utils/cwd.js'\nimport { slowLogging } from './slowOperations.js'\n\nconst MS_IN_SECOND = 1000\nconst SECONDS_IN_MINUTE = 60\n\ntype ExecSyncOptions = {\n  abortSignal?: AbortSignal\n  timeout?: number\n  input?: string\n  stdio?: ExecaOptions['stdio']\n}\n\n/**\n * @deprecated Use `execa` directly with `{ shell: true, reject: false }` for non-blocking execution.\n * Sync exec calls block the event loop and cause performance issues.\n */\nexport function execSyncWithDefaults_DEPRECATED(command: string): string | null\n/**\n * @deprecated Use `execa` directly with `{ shell: true, reject: false }` for non-blocking execution.\n * Sync exec calls block the event loop and cause performance issues.\n */\nexport function execSyncWithDefaults_DEPRECATED(\n  command: string,\n  options: ExecSyncOptions,\n): string | null\n/**\n * @deprecated Use `execa` directly with `{ shell: true, reject: false }` for non-blocking execution.\n * Sync exec calls block the event loop and cause performance issues.\n */\nexport function execSyncWithDefaults_DEPRECATED(\n  command: string,\n  abortSignal: AbortSignal,\n  timeout?: number,\n): string | null\n/**\n * @deprecated Use `execa` directly with `{ shell: true, reject: false }` for non-blocking execution.\n * Sync exec calls block the event loop and cause performance issues.\n */\nexport function execSyncWithDefaults_DEPRECATED(\n  command: string,\n  optionsOrAbortSignal?: ExecSyncOptions | AbortSignal,\n  timeout = 10 * SECONDS_IN_MINUTE * MS_IN_SECOND,\n): string | null {\n  let options: ExecSyncOptions\n\n  if (optionsOrAbortSignal === undefined) {\n    // No second argument - use defaults\n    options = {}\n  } else if (optionsOrAbortSignal instanceof AbortSignal) {\n    // Old signature - second argument is AbortSignal\n    options = {\n      abortSignal: optionsOrAbortSignal,\n      timeout,\n    }\n  } else {\n    // New signature - second argument is options object\n    options = optionsOrAbortSignal\n  }\n\n  const {\n    abortSignal,\n    timeout: finalTimeout = 10 * SECONDS_IN_MINUTE * MS_IN_SECOND,\n    input,\n    stdio = ['ignore', 'pipe', 'pipe'],\n  } = options\n\n  abortSignal?.throwIfAborted()\n  using _ = slowLogging`exec: ${command.slice(0, 200)}`\n  try {\n    const result = execaSync(command, {\n      env: process.env,\n      maxBuffer: 1_000_000,\n      timeout: finalTimeout,\n      cwd: getCwd(),\n      stdio,\n      shell: true, // execSync typically runs shell commands\n      reject: false, // Don't throw on non-zero exit codes\n      input,\n    })\n    if (!result.stdout) {\n      return null\n    }\n    return result.stdout.trim() || null\n  } catch {\n    return null\n  }\n}\n", "// This file represents useful wrappers over node:child_process\r\n// These wrappers ease error handling and cross-platform compatbility\r\n// By using execa, Windows automatically gets shell escaping + BAT / CMD handling\r\n\r\nimport { type ExecaError, execa } from 'execa'\r\nimport { getCwd } from '../utils/cwd.js'\r\nimport { logError } from './log.js'\r\n\r\nexport { execSyncWithDefaults_DEPRECATED } from './execFileNoThrowPortable.js'\r\n\r\nconst MS_IN_SECOND = 1000\r\nconst SECONDS_IN_MINUTE = 60\r\n\r\ntype ExecFileOptions = {\r\n  abortSignal?: AbortSignal\r\n  timeout?: number\r\n  preserveOutputOnError?: boolean\r\n  // Setting useCwd=false avoids circular dependencies during initialization\r\n  // getCwd() -> PersistentShell -> logEvent() -> execFileNoThrow\r\n  useCwd?: boolean\r\n  env?: NodeJS.ProcessEnv\r\n  stdin?: 'ignore' | 'inherit' | 'pipe'\r\n  input?: string\r\n}\r\n\r\nexport function execFileNoThrow(\r\n  file: string,\r\n  args: string[],\r\n  options: ExecFileOptions = {\r\n    timeout: 10 * SECONDS_IN_MINUTE * MS_IN_SECOND,\r\n    preserveOutputOnError: true,\r\n    useCwd: true,\r\n  },\r\n): Promise<{ stdout: string; stderr: string; code: number; error?: string }> {\r\n  return execFileNoThrowWithCwd(file, args, {\r\n    abortSignal: options.abortSignal,\r\n    timeout: options.timeout,\r\n    preserveOutputOnError: options.preserveOutputOnError,\r\n    cwd: options.useCwd ? getCwd() : undefined,\r\n    env: options.env,\r\n    stdin: options.stdin,\r\n    input: options.input,\r\n  })\r\n}\r\n\r\ntype ExecFileWithCwdOptions = {\r\n  abortSignal?: AbortSignal\r\n  timeout?: number\r\n  preserveOutputOnError?: boolean\r\n  maxBuffer?: number\r\n  cwd?: string\r\n  env?: NodeJS.ProcessEnv\r\n  shell?: boolean | string | undefined\r\n  stdin?: 'ignore' | 'inherit' | 'pipe'\r\n  input?: string\r\n}\r\n\r\ntype ExecaResultWithError = {\r\n  shortMessage?: string\r\n  signal?: string\r\n}\r\n\r\n/**\r\n * Extracts a human-readable error message from an execa result.\r\n *\r\n * Priority order:\r\n * 1. shortMessage - execa's human-readable error (e.g., \"Command failed with exit code 1: ...\")\r\n *    This is preferred because it already includes signal info when a process is killed,\r\n *    making it more informative than just the signal name.\r\n * 2. signal - the signal that killed the process (e.g., \"SIGTERM\")\r\n * 3. errorCode - fallback to just the numeric exit code\r\n */\r\nfunction getErrorMessage(\r\n  result: ExecaResultWithError,\r\n  errorCode: number,\r\n): string {\r\n  if (result.shortMessage) {\r\n    return result.shortMessage\r\n  }\r\n  if (typeof result.signal === 'string') {\r\n    return result.signal\r\n  }\r\n  return String(errorCode)\r\n}\r\n\r\n/**\r\n * execFile, but always resolves (never throws)\r\n */\r\nexport function execFileNoThrowWithCwd(\r\n  file: string,\r\n  args: string[],\r\n  {\r\n    abortSignal,\r\n    timeout: finalTimeout = 10 * SECONDS_IN_MINUTE * MS_IN_SECOND,\r\n    preserveOutputOnError: finalPreserveOutput = true,\r\n    cwd: finalCwd,\r\n    env: finalEnv,\r\n    maxBuffer,\r\n    shell,\r\n    stdin: finalStdin,\r\n    input: finalInput,\r\n  }: ExecFileWithCwdOptions = {\r\n    timeout: 10 * SECONDS_IN_MINUTE * MS_IN_SECOND,\r\n    preserveOutputOnError: true,\r\n    maxBuffer: 1_000_000,\r\n  },\r\n): Promise<{ stdout: string; stderr: string; code: number; error?: string }> {\r\n  return new Promise(resolve => {\r\n    // Use execa for cross-platform .bat/.cmd compatibility on Windows\r\n    execa(file, args, {\r\n      maxBuffer,\r\n      cancelSignal: abortSignal,\r\n      timeout: finalTimeout,\r\n      cwd: finalCwd,\r\n      env: finalEnv,\r\n      shell,\r\n      stdin: finalStdin,\r\n      input: finalInput,\r\n      reject: false, // Don't throw on non-zero exit codes\r\n    })\r\n      .then(result => {\r\n        if (result.failed) {\r\n          if (finalPreserveOutput) {\r\n            const errorCode = result.exitCode ?? 1\r\n            void resolve({\r\n              stdout: result.stdout || '',\r\n              stderr: result.stderr || '',\r\n              code: errorCode,\r\n              error: getErrorMessage(\r\n                result as unknown as ExecaResultWithError,\r\n                errorCode,\r\n              ),\r\n            })\r\n          } else {\r\n            void resolve({ stdout: '', stderr: '', code: result.exitCode ?? 1 })\r\n          }\r\n        } else {\r\n          void resolve({\r\n            stdout: result.stdout,\r\n            stderr: result.stderr,\r\n            code: 0,\r\n          })\r\n        }\r\n      })\r\n      .catch((error: ExecaError) => {\r\n        logError(error)\r\n        void resolve({ stdout: '', stderr: '', code: 1 })\r\n      })\r\n  })\r\n}\r\n", "/**\n * Binary file extensions to skip for text-based operations.\n * These files can't be meaningfully compared as text and are often large.\n */\nexport const BINARY_EXTENSIONS = new Set([\n  // Images\n  '.png',\n  '.jpg',\n  '.jpeg',\n  '.gif',\n  '.bmp',\n  '.ico',\n  '.webp',\n  '.tiff',\n  '.tif',\n  // Videos\n  '.mp4',\n  '.mov',\n  '.avi',\n  '.mkv',\n  '.webm',\n  '.wmv',\n  '.flv',\n  '.m4v',\n  '.mpeg',\n  '.mpg',\n  // Audio\n  '.mp3',\n  '.wav',\n  '.ogg',\n  '.flac',\n  '.aac',\n  '.m4a',\n  '.wma',\n  '.aiff',\n  '.opus',\n  // Archives\n  '.zip',\n  '.tar',\n  '.gz',\n  '.bz2',\n  '.7z',\n  '.rar',\n  '.xz',\n  '.z',\n  '.tgz',\n  '.iso',\n  // Executables/binaries\n  '.exe',\n  '.dll',\n  '.so',\n  '.dylib',\n  '.bin',\n  '.o',\n  '.a',\n  '.obj',\n  '.lib',\n  '.app',\n  '.msi',\n  '.deb',\n  '.rpm',\n  // Documents (PDF is here; FileReadTool excludes it at the call site)\n  '.pdf',\n  '.doc',\n  '.docx',\n  '.xls',\n  '.xlsx',\n  '.ppt',\n  '.pptx',\n  '.odt',\n  '.ods',\n  '.odp',\n  // Fonts\n  '.ttf',\n  '.otf',\n  '.woff',\n  '.woff2',\n  '.eot',\n  // Bytecode / VM artifacts\n  '.pyc',\n  '.pyo',\n  '.class',\n  '.jar',\n  '.war',\n  '.ear',\n  '.node',\n  '.wasm',\n  '.rlib',\n  // Database files\n  '.sqlite',\n  '.sqlite3',\n  '.db',\n  '.mdb',\n  '.idx',\n  // Design / 3D\n  '.psd',\n  '.ai',\n  '.eps',\n  '.sketch',\n  '.fig',\n  '.xd',\n  '.blend',\n  '.3ds',\n  '.max',\n  // Flash\n  '.swf',\n  '.fla',\n  // Lock/profiling data\n  '.lockb',\n  '.dat',\n  '.data',\n])\n\n/**\n * Check if a file path has a binary extension.\n */\nexport function hasBinaryExtension(filePath: string): boolean {\n  const ext = filePath.slice(filePath.lastIndexOf('.')).toLowerCase()\n  return BINARY_EXTENSIONS.has(ext)\n}\n\n/**\n * Number of bytes to read for binary content detection.\n */\nconst BINARY_CHECK_SIZE = 8192\n\n/**\n * Check if a buffer contains binary content by looking for null bytes\n * or a high proportion of non-printable characters.\n */\nexport function isBinaryContent(buffer: Buffer): boolean {\n  // Check first BINARY_CHECK_SIZE bytes (or full buffer if smaller)\n  const checkSize = Math.min(buffer.length, BINARY_CHECK_SIZE)\n\n  let nonPrintable = 0\n  for (let i = 0; i < checkSize; i++) {\n    const byte = buffer[i]!\n    // Null byte is a strong indicator of binary\n    if (byte === 0) {\n      return true\n    }\n    // Count non-printable, non-whitespace bytes\n    // Printable ASCII is 32-126, plus common whitespace (9, 10, 13)\n    if (\n      byte < 32 &&\n      byte !== 9 && // tab\n      byte !== 10 && // newline\n      byte !== 13 // carriage return\n    ) {\n      nonPrintable++\n    }\n  }\n\n  // If more than 10% non-printable, likely binary\n  return nonPrintable / checkSize > 0.1\n}\n", "/**\n * Lightweight parser for .git/config files.\n *\n * Verified against git's config.c:\n *   - Section names: case-insensitive, alphanumeric + hyphen\n *   - Subsection names (quoted): case-sensitive, backslash escapes (\\\\ and \\\")\n *   - Key names: case-insensitive, alphanumeric + hyphen\n *   - Values: optional quoting, inline comments (# or ;), backslash escapes\n */\n\nimport { readFile } from 'fs/promises'\nimport { join } from 'path'\n\n/**\n * Parse a single value from .git/config.\n * Finds the first matching key under the given section/subsection.\n */\nexport async function parseGitConfigValue(\n  gitDir: string,\n  section: string,\n  subsection: string | null,\n  key: string,\n): Promise<string | null> {\n  try {\n    const config = await readFile(join(gitDir, 'config'), 'utf-8')\n    return parseConfigString(config, section, subsection, key)\n  } catch {\n    return null\n  }\n}\n\n/**\n * Parse a config value from an in-memory config string.\n * Exported for testing.\n */\nexport function parseConfigString(\n  config: string,\n  section: string,\n  subsection: string | null,\n  key: string,\n): string | null {\n  const lines = config.split('\\n')\n  const sectionLower = section.toLowerCase()\n  const keyLower = key.toLowerCase()\n\n  let inSection = false\n  for (const line of lines) {\n    const trimmed = line.trim()\n\n    // Skip empty lines and comment-only lines\n    if (trimmed.length === 0 || trimmed[0] === '#' || trimmed[0] === ';') {\n      continue\n    }\n\n    // Section header\n    if (trimmed[0] === '[') {\n      inSection = matchesSectionHeader(trimmed, sectionLower, subsection)\n      continue\n    }\n\n    if (!inSection) {\n      continue\n    }\n\n    // Key-value line: find the key name\n    const parsed = parseKeyValue(trimmed)\n    if (parsed && parsed.key.toLowerCase() === keyLower) {\n      return parsed.value\n    }\n  }\n\n  return null\n}\n\n/**\n * Parse a key = value line. Returns null if the line doesn't contain a valid key.\n */\nfunction parseKeyValue(line: string): { key: string; value: string } | null {\n  // Read key: alphanumeric + hyphen, starting with alpha\n  let i = 0\n  while (i < line.length && isKeyChar(line[i]!)) {\n    i++\n  }\n  if (i === 0) {\n    return null\n  }\n  const key = line.slice(0, i)\n\n  // Skip whitespace\n  while (i < line.length && (line[i] === ' ' || line[i] === '\\t')) {\n    i++\n  }\n\n  // Must have '='\n  if (i >= line.length || line[i] !== '=') {\n    // Boolean key with no value \u2014 not relevant for our use cases\n    return null\n  }\n  i++ // skip '='\n\n  // Skip whitespace after '='\n  while (i < line.length && (line[i] === ' ' || line[i] === '\\t')) {\n    i++\n  }\n\n  const value = parseValue(line, i)\n  return { key, value }\n}\n\n/**\n * Parse a config value starting at position i.\n * Handles quoted strings, escape sequences, and inline comments.\n */\nfunction parseValue(line: string, start: number): string {\n  let result = ''\n  let inQuote = false\n  let i = start\n\n  while (i < line.length) {\n    const ch = line[i]!\n\n    // Inline comments outside quotes end the value\n    if (!inQuote && (ch === '#' || ch === ';')) {\n      break\n    }\n\n    if (ch === '\"') {\n      inQuote = !inQuote\n      i++\n      continue\n    }\n\n    if (ch === '\\\\' && i + 1 < line.length) {\n      const next = line[i + 1]!\n      if (inQuote) {\n        // Inside quotes: recognize escape sequences\n        switch (next) {\n          case 'n':\n            result += '\\n'\n            break\n          case 't':\n            result += '\\t'\n            break\n          case 'b':\n            result += '\\b'\n            break\n          case '\"':\n            result += '\"'\n            break\n          case '\\\\':\n            result += '\\\\'\n            break\n          default:\n            // Git silently drops the backslash for unknown escapes\n            result += next\n            break\n        }\n        i += 2\n        continue\n      }\n      // Outside quotes: backslash at end of line = continuation (we don't\n      // handle multi-line since we split on \\n, but handle \\\\ and others)\n      if (next === '\\\\') {\n        result += '\\\\'\n        i += 2\n        continue\n      }\n      // Fallthrough \u2014 treat backslash literally outside quotes\n    }\n\n    result += ch\n    i++\n  }\n\n  // Trim trailing whitespace from unquoted portions.\n  // Git trims trailing whitespace that isn't inside quotes, but since we\n  // process char-by-char and quotes toggle, the simplest correct approach\n  // for single-line values is to trim the result when not ending in a quote.\n  if (!inQuote) {\n    result = trimTrailingWhitespace(result)\n  }\n\n  return result\n}\n\nfunction trimTrailingWhitespace(s: string): string {\n  let end = s.length\n  while (end > 0 && (s[end - 1] === ' ' || s[end - 1] === '\\t')) {\n    end--\n  }\n  return s.slice(0, end)\n}\n\n/**\n * Check if a config line like `[remote \"origin\"]` matches the given section/subsection.\n * Section matching is case-insensitive; subsection matching is case-sensitive.\n */\nfunction matchesSectionHeader(\n  line: string,\n  sectionLower: string,\n  subsection: string | null,\n): boolean {\n  // line starts with '['\n  let i = 1\n\n  // Read section name\n  while (\n    i < line.length &&\n    line[i] !== ']' &&\n    line[i] !== ' ' &&\n    line[i] !== '\\t' &&\n    line[i] !== '\"'\n  ) {\n    i++\n  }\n  const foundSection = line.slice(1, i).toLowerCase()\n\n  if (foundSection !== sectionLower) {\n    return false\n  }\n\n  if (subsection === null) {\n    // Simple section: must end with ']'\n    return i < line.length && line[i] === ']'\n  }\n\n  // Skip whitespace before subsection quote\n  while (i < line.length && (line[i] === ' ' || line[i] === '\\t')) {\n    i++\n  }\n\n  // Must have opening quote\n  if (i >= line.length || line[i] !== '\"') {\n    return false\n  }\n  i++ // skip opening quote\n\n  // Read subsection \u2014 case-sensitive, handle \\\\ and \\\" escapes\n  let foundSubsection = ''\n  while (i < line.length && line[i] !== '\"') {\n    if (line[i] === '\\\\' && i + 1 < line.length) {\n      const next = line[i + 1]!\n      if (next === '\\\\' || next === '\"') {\n        foundSubsection += next\n        i += 2\n        continue\n      }\n      // Git drops the backslash for other escapes in subsections\n      foundSubsection += next\n      i += 2\n      continue\n    }\n    foundSubsection += line[i]\n    i++\n  }\n\n  // Must have closing quote followed by ']'\n  if (i >= line.length || line[i] !== '\"') {\n    return false\n  }\n  i++ // skip closing quote\n\n  if (i >= line.length || line[i] !== ']') {\n    return false\n  }\n\n  return foundSubsection === subsection\n}\n\nfunction isKeyChar(ch: string): boolean {\n  return (\n    (ch >= 'a' && ch <= 'z') ||\n    (ch >= 'A' && ch <= 'Z') ||\n    (ch >= '0' && ch <= '9') ||\n    ch === '-'\n  )\n}\n", "/**\n * Filesystem-based git state reading \u2014 avoids spawning git subprocesses.\n *\n * Covers: resolving .git directories (including worktrees/submodules),\n * parsing HEAD, resolving refs via loose files and packed-refs,\n * and the GitHeadWatcher that caches branch/SHA with fs.watchFile.\n *\n * Correctness notes (verified against git source):\n *   - HEAD: `ref: refs/heads/<branch>\\n` or raw SHA (refs/files-backend.c)\n *   - Packed-refs: `<sha> <refname>\\n`, skip `#` and `^` lines (packed-backend.c)\n *   - .git file (worktree): `gitdir: <path>\\n` with optional relative path (setup.c)\n *   - Shallow: mere existence of `<commonDir>/shallow` means shallow (shallow.c)\n */\n\nimport { unwatchFile, watchFile } from 'fs'\nimport { readdir, readFile, stat } from 'fs/promises'\nimport { join, resolve } from 'path'\nimport { waitForScrollIdle } from '../../bootstrap/state.js'\nimport { registerCleanup } from '../cleanupRegistry.js'\nimport { getCwd } from '../cwd.js'\nimport { findGitRoot } from '../git.js'\nimport { parseGitConfigValue } from './gitConfigParser.js'\n\n// ---------------------------------------------------------------------------\n// resolveGitDir \u2014 find the actual .git directory\n// ---------------------------------------------------------------------------\n\nconst resolveGitDirCache = new Map<string, string | null>()\n\n/** Clear cached git dir resolutions. Exported for testing only. */\nexport function clearResolveGitDirCache(): void {\n  resolveGitDirCache.clear()\n}\n\n/**\n * Resolve the actual .git directory for a repo.\n * Handles worktrees/submodules where .git is a file containing `gitdir: <path>`.\n * Memoized per startPath.\n */\nexport async function resolveGitDir(\n  startPath?: string,\n): Promise<string | null> {\n  const cwd = resolve(startPath ?? getCwd())\n  const cached = resolveGitDirCache.get(cwd)\n  if (cached !== undefined) {\n    return cached\n  }\n\n  const root = findGitRoot(cwd)\n  if (!root) {\n    resolveGitDirCache.set(cwd, null)\n    return null\n  }\n\n  const gitPath = join(root, '.git')\n  try {\n    const st = await stat(gitPath)\n    if (st.isFile()) {\n      // Worktree or submodule: .git is a file with `gitdir: <path>`\n      // Git strips trailing \\n and \\r (setup.c read_gitfile_gently).\n      const content = (await readFile(gitPath, 'utf-8')).trim()\n      if (content.startsWith('gitdir:')) {\n        const rawDir = content.slice('gitdir:'.length).trim()\n        const resolved = resolve(root, rawDir)\n        resolveGitDirCache.set(cwd, resolved)\n        return resolved\n      }\n    }\n    // Regular repo: .git is a directory\n    resolveGitDirCache.set(cwd, gitPath)\n    return gitPath\n  } catch {\n    resolveGitDirCache.set(cwd, null)\n    return null\n  }\n}\n\n// ---------------------------------------------------------------------------\n// isSafeRefName \u2014 validate ref/branch names read from .git/\n// ---------------------------------------------------------------------------\n\n/**\n * Validate that a ref/branch name read from .git/ is safe to use in path\n * joins, as git positional arguments, and when interpolated into shell\n * commands (commit-push-pr skill interpolates the branch into shell).\n * An attacker who controls .git/HEAD or a loose ref file could otherwise\n * embed path traversal (`..`), argument injection (leading `-`), or shell\n * metacharacters \u2014 .git/HEAD is a plain text file that can be written\n * without git's own check-ref-format validation.\n *\n * Allowlist: ASCII alphanumerics, `/`, `.`, `_`, `+`, `-`, `@` only. This\n * covers all legitimate git branch names (e.g. `feature/foo`,\n * `release-1.2.3+build`, `dependabot/npm_and_yarn/@types/node-18.0.0`)\n * while rejecting everything that could be dangerous in shell context\n * (newlines, backticks, `$`, `;`, `|`, `&`, `(`, `)`, `<`, `>`, spaces,\n * tabs, quotes, backslash) and path traversal (`..`).\n */\nexport function isSafeRefName(name: string): boolean {\n  if (!name || name.startsWith('-') || name.startsWith('/')) {\n    return false\n  }\n  if (name.includes('..')) {\n    return false\n  }\n  // Reject single-dot and empty path components (`.`, `foo/./bar`, `foo//bar`,\n  // `foo/`). Git-check-ref-format rejects these, and `.` normalizes away in\n  // path joins so a tampered HEAD of `refs/heads/.` would make us watch the\n  // refs/heads directory itself instead of a branch file.\n  if (name.split('/').some(c => c === '.' || c === '')) {\n    return false\n  }\n  // Allowlist-only: alphanumerics, /, ., _, +, -, @. Rejects all shell\n  // metacharacters, whitespace, NUL, and non-ASCII. Git's forbidden @{\n  // sequence is blocked because { is not in the allowlist.\n  if (!/^[a-zA-Z0-9/._+@-]+$/.test(name)) {\n    return false\n  }\n  return true\n}\n\n/**\n * Validate that a string is a git SHA: 40 hex chars (SHA-1) or 64 hex chars\n * (SHA-256). Git never writes abbreviated SHAs to HEAD or ref files, so we\n * only accept full-length hashes.\n *\n * An attacker who controls .git/HEAD when detached, or a loose ref file,\n * could otherwise return arbitrary content that flows into shell contexts.\n */\nexport function isValidGitSha(s: string): boolean {\n  return /^[0-9a-f]{40}$/.test(s) || /^[0-9a-f]{64}$/.test(s)\n}\n\n// ---------------------------------------------------------------------------\n// readGitHead \u2014 parse .git/HEAD\n// ---------------------------------------------------------------------------\n\n/**\n * Parse .git/HEAD to determine current branch or detached SHA.\n *\n * HEAD format (per git source, refs/files-backend.c):\n *   - `ref: refs/heads/<branch>\\n`  \u2014 on a branch\n *   - `ref: <other-ref>\\n`          \u2014 unusual symref (e.g. during bisect)\n *   - `<hex-sha>\\n`                 \u2014 detached HEAD (e.g. during rebase)\n *\n * Git strips trailing whitespace via strbuf_rtrim; .trim() is equivalent.\n * Git allows any whitespace between \"ref:\" and the path; we handle\n * this by trimming after slicing past \"ref:\".\n */\nexport async function readGitHead(\n  gitDir: string,\n): Promise<\n  { type: 'branch'; name: string } | { type: 'detached'; sha: string } | null\n> {\n  try {\n    const content = (await readFile(join(gitDir, 'HEAD'), 'utf-8')).trim()\n    if (content.startsWith('ref:')) {\n      const ref = content.slice('ref:'.length).trim()\n      if (ref.startsWith('refs/heads/')) {\n        const name = ref.slice('refs/heads/'.length)\n        // Reject path traversal and argument injection from a tampered HEAD.\n        if (!isSafeRefName(name)) {\n          return null\n        }\n        return { type: 'branch', name }\n      }\n      // Unusual symref (not a local branch) \u2014 resolve to SHA\n      if (!isSafeRefName(ref)) {\n        return null\n      }\n      const sha = await resolveRef(gitDir, ref)\n      return sha ? { type: 'detached', sha } : { type: 'detached', sha: '' }\n    }\n    // Raw SHA (detached HEAD). Validate: an attacker-controlled HEAD file\n    // could contain shell metacharacters that flow into downstream shell\n    // contexts.\n    if (!isValidGitSha(content)) {\n      return null\n    }\n    return { type: 'detached', sha: content }\n  } catch {\n    return null\n  }\n}\n\n// ---------------------------------------------------------------------------\n// resolveRef \u2014 resolve loose/packed refs to SHAs\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve a git ref (e.g. `refs/heads/main`) to a commit SHA.\n * Checks loose ref files first, then falls back to packed-refs.\n * Follows symrefs (e.g. `ref: refs/remotes/origin/main`).\n *\n * For worktrees, refs live in the common gitdir (pointed to by the\n * `commondir` file), not the worktree-specific gitdir. We check the\n * worktree gitdir first, then fall back to the common dir.\n *\n * Packed-refs format (per packed-backend.c):\n *   - Header: `# pack-refs with: <traits>\\n`\n *   - Entries: `<40-hex-sha> <refname>\\n`\n *   - Peeled:  `^<40-hex-sha>\\n` (after annotated tag entries)\n */\nexport async function resolveRef(\n  gitDir: string,\n  ref: string,\n): Promise<string | null> {\n  const result = await resolveRefInDir(gitDir, ref)\n  if (result) {\n    return result\n  }\n\n  // For worktrees: try the common gitdir where shared refs live\n  const commonDir = await getCommonDir(gitDir)\n  if (commonDir && commonDir !== gitDir) {\n    return resolveRefInDir(commonDir, ref)\n  }\n\n  return null\n}\n\nasync function resolveRefInDir(\n  dir: string,\n  ref: string,\n): Promise<string | null> {\n  // Try loose ref file\n  try {\n    const content = (await readFile(join(dir, ref), 'utf-8')).trim()\n    if (content.startsWith('ref:')) {\n      const target = content.slice('ref:'.length).trim()\n      // Reject path traversal in a tampered symref chain.\n      if (!isSafeRefName(target)) {\n        return null\n      }\n      return resolveRef(dir, target)\n    }\n    // Loose ref content should be a raw SHA. Validate: an attacker-controlled\n    // ref file could contain shell metacharacters.\n    if (!isValidGitSha(content)) {\n      return null\n    }\n    return content\n  } catch {\n    // Loose ref doesn't exist, try packed-refs\n  }\n\n  try {\n    const packed = await readFile(join(dir, 'packed-refs'), 'utf-8')\n    for (const line of packed.split('\\n')) {\n      if (line.startsWith('#') || line.startsWith('^')) {\n        continue\n      }\n      const spaceIdx = line.indexOf(' ')\n      if (spaceIdx === -1) {\n        continue\n      }\n      if (line.slice(spaceIdx + 1) === ref) {\n        const sha = line.slice(0, spaceIdx)\n        return isValidGitSha(sha) ? sha : null\n      }\n    }\n  } catch {\n    // No packed-refs\n  }\n\n  return null\n}\n\n/**\n * Read the `commondir` file to find the shared git directory.\n * In a worktree, this points to the main repo's .git dir.\n * Returns null if no commondir file exists (regular repo).\n */\nexport async function getCommonDir(gitDir: string): Promise<string | null> {\n  try {\n    const content = (await readFile(join(gitDir, 'commondir'), 'utf-8')).trim()\n    return resolve(gitDir, content)\n  } catch {\n    return null\n  }\n}\n\n/**\n * Read a raw symref file and extract the branch name after a known prefix.\n * Returns null if the ref doesn't exist, isn't a symref, or doesn't match the prefix.\n * Checks loose file only \u2014 packed-refs doesn't store symrefs.\n */\nexport async function readRawSymref(\n  gitDir: string,\n  refPath: string,\n  branchPrefix: string,\n): Promise<string | null> {\n  try {\n    const content = (await readFile(join(gitDir, refPath), 'utf-8')).trim()\n    if (content.startsWith('ref:')) {\n      const target = content.slice('ref:'.length).trim()\n      if (target.startsWith(branchPrefix)) {\n        const name = target.slice(branchPrefix.length)\n        // Reject path traversal and argument injection from a tampered symref.\n        if (!isSafeRefName(name)) {\n          return null\n        }\n        return name\n      }\n    }\n  } catch {\n    // Not a loose ref\n  }\n  return null\n}\n\n// ---------------------------------------------------------------------------\n// GitFileWatcher \u2014 watches git files and caches derived values.\n// Lazily initialized on first cache access. Invalidates all cached\n// values when any watched file changes.\n//\n// Watches:\n//   .git/HEAD          \u2014 branch switches, detached HEAD\n//   .git/config        \u2014 remote URL changes\n//   .git/refs/heads/<branch> \u2014 new commits on the current branch\n//\n// When HEAD changes (branch switch), the branch ref watcher is updated\n// to track the new branch's ref file.\n// ---------------------------------------------------------------------------\n\ntype CacheEntry<T> = {\n  value: T\n  dirty: boolean\n  compute: () => Promise<T>\n}\n\nconst WATCH_INTERVAL_MS = process.env.NODE_ENV === 'test' ? 10 : 1000\n\nclass GitFileWatcher {\n  private gitDir: string | null = null\n  private commonDir: string | null = null\n  private initialized = false\n  private initPromise: Promise<void> | null = null\n  private watchedPaths: string[] = []\n  private branchRefPath: string | null = null\n  private cache = new Map<string, CacheEntry<unknown>>()\n\n  async ensureStarted(): Promise<void> {\n    if (this.initialized) {\n      return\n    }\n    if (this.initPromise) {\n      return this.initPromise\n    }\n    this.initPromise = this.start()\n    return this.initPromise\n  }\n\n  private async start(): Promise<void> {\n    this.gitDir = await resolveGitDir()\n    this.initialized = true\n    if (!this.gitDir) {\n      return\n    }\n\n    // In a worktree, branch refs and the main config are shared and live in\n    // commonDir, not the per-worktree gitDir. Resolve once so we don't\n    // re-read the commondir file on every branch switch.\n    this.commonDir = await getCommonDir(this.gitDir)\n\n    // Watch .git/HEAD and .git/config\n    this.watchPath(join(this.gitDir, 'HEAD'), () => {\n      void this.onHeadChanged()\n    })\n    // Config (remote URLs) lives in commonDir for worktrees\n    this.watchPath(join(this.commonDir ?? this.gitDir, 'config'), () => {\n      this.invalidate()\n    })\n\n    // Watch the current branch's ref file for commit changes\n    await this.watchCurrentBranchRef()\n\n    registerCleanup(async () => {\n      this.stopWatching()\n    })\n  }\n\n  private watchPath(path: string, callback: () => void): void {\n    this.watchedPaths.push(path)\n    watchFile(path, { interval: WATCH_INTERVAL_MS }, callback)\n  }\n\n  /**\n   * Watch the loose ref file for the current branch.\n   * Called on startup and whenever HEAD changes (branch switch).\n   */\n  private async watchCurrentBranchRef(): Promise<void> {\n    if (!this.gitDir) {\n      return\n    }\n\n    const head = await readGitHead(this.gitDir)\n    // Branch refs live in commonDir for worktrees (gitDir for regular repos)\n    const refsDir = this.commonDir ?? this.gitDir\n    const refPath =\n      head?.type === 'branch' ? join(refsDir, 'refs', 'heads', head.name) : null\n\n    // Already watching this ref (or already not watching anything)\n    if (refPath === this.branchRefPath) {\n      return\n    }\n\n    // Stop watching old branch ref. Runs for branch\u2192branch AND\n    // branch\u2192detached (checkout --detach, rebase, bisect).\n    if (this.branchRefPath) {\n      unwatchFile(this.branchRefPath)\n      this.watchedPaths = this.watchedPaths.filter(\n        p => p !== this.branchRefPath,\n      )\n    }\n\n    this.branchRefPath = refPath\n\n    if (!refPath) {\n      return\n    }\n\n    // The ref file may not exist yet (new branch before first commit).\n    // watchFile works on nonexistent files \u2014 it fires when the file appears.\n    this.watchPath(refPath, () => {\n      this.invalidate()\n    })\n  }\n\n  private async onHeadChanged(): Promise<void> {\n    // HEAD changed \u2014 could be a branch switch or detach.\n    // Defer file I/O (readGitHead, watchFile setup) until scroll settles so\n    // watchFile callbacks that land mid-scroll don't compete for the event\n    // loop. invalidate() is cheap (just marks dirty) so do it first \u2014 the\n    // cache correctly serves stale-marked values until the watcher updates.\n    this.invalidate()\n    await waitForScrollIdle()\n    await this.watchCurrentBranchRef()\n  }\n\n  private invalidate(): void {\n    for (const entry of this.cache.values()) {\n      entry.dirty = true\n    }\n  }\n\n  private stopWatching(): void {\n    for (const path of this.watchedPaths) {\n      unwatchFile(path)\n    }\n    this.watchedPaths = []\n    this.branchRefPath = null\n  }\n\n  /**\n   * Get a cached value by key. On first call for a key, computes and caches it.\n   * Subsequent calls return the cached value until a watched file changes,\n   * which marks the entry dirty. The next get() re-computes from disk.\n   *\n   * Race condition handling: dirty is cleared BEFORE the async compute starts.\n   * If a file change arrives during compute, it re-sets dirty, so the next\n   * get() will re-read again rather than serving a stale value.\n   */\n  async get<T>(key: string, compute: () => Promise<T>): Promise<T> {\n    await this.ensureStarted()\n    const existing = this.cache.get(key)\n    if (existing && !existing.dirty) {\n      return existing.value as T\n    }\n    // Clear dirty before compute \u2014 if the file changes again during the\n    // async read, invalidate() will re-set dirty and we'll re-read on\n    // the next get() call.\n    if (existing) {\n      existing.dirty = false\n    }\n    const value = await compute()\n    // Only update the cached value if no new invalidation arrived during compute\n    const entry = this.cache.get(key)\n    if (entry && !entry.dirty) {\n      entry.value = value\n    }\n    if (!entry) {\n      this.cache.set(key, { value, dirty: false, compute })\n    }\n    return value\n  }\n\n  /** Reset all state. Stops file watchers. For testing only. */\n  reset(): void {\n    this.stopWatching()\n    this.cache.clear()\n    this.initialized = false\n    this.initPromise = null\n    this.gitDir = null\n    this.commonDir = null\n  }\n}\n\nconst gitWatcher = new GitFileWatcher()\n\nasync function computeBranch(): Promise<string> {\n  const gitDir = await resolveGitDir()\n  if (!gitDir) {\n    return 'HEAD'\n  }\n  const head = await readGitHead(gitDir)\n  if (!head) {\n    return 'HEAD'\n  }\n  return head.type === 'branch' ? head.name : 'HEAD'\n}\n\nasync function computeHead(): Promise<string> {\n  const gitDir = await resolveGitDir()\n  if (!gitDir) {\n    return ''\n  }\n  const head = await readGitHead(gitDir)\n  if (!head) {\n    return ''\n  }\n  if (head.type === 'branch') {\n    return (await resolveRef(gitDir, `refs/heads/${head.name}`)) ?? ''\n  }\n  return head.sha\n}\n\nasync function computeRemoteUrl(): Promise<string | null> {\n  const gitDir = await resolveGitDir()\n  if (!gitDir) {\n    return null\n  }\n  const url = await parseGitConfigValue(gitDir, 'remote', 'origin', 'url')\n  if (url) {\n    return url\n  }\n  // In worktrees, the config with remote URLs is in the common dir\n  const commonDir = await getCommonDir(gitDir)\n  if (commonDir && commonDir !== gitDir) {\n    return parseGitConfigValue(commonDir, 'remote', 'origin', 'url')\n  }\n  return null\n}\n\nasync function computeDefaultBranch(): Promise<string> {\n  const gitDir = await resolveGitDir()\n  if (!gitDir) {\n    return 'main'\n  }\n  // refs/remotes/ lives in commonDir, not the per-worktree gitDir\n  const commonDir = (await getCommonDir(gitDir)) ?? gitDir\n  const branchFromSymref = await readRawSymref(\n    commonDir,\n    'refs/remotes/origin/HEAD',\n    'refs/remotes/origin/',\n  )\n  if (branchFromSymref) {\n    return branchFromSymref\n  }\n  for (const candidate of ['main', 'master']) {\n    const sha = await resolveRef(commonDir, `refs/remotes/origin/${candidate}`)\n    if (sha) {\n      return candidate\n    }\n  }\n  return 'main'\n}\n\nexport function getCachedBranch(): Promise<string> {\n  return gitWatcher.get('branch', computeBranch)\n}\n\nexport function getCachedHead(): Promise<string> {\n  return gitWatcher.get('head', computeHead)\n}\n\nexport function getCachedRemoteUrl(): Promise<string | null> {\n  return gitWatcher.get('remoteUrl', computeRemoteUrl)\n}\n\nexport function getCachedDefaultBranch(): Promise<string> {\n  return gitWatcher.get('defaultBranch', computeDefaultBranch)\n}\n\n/** Reset the git file watcher state. For testing only. */\nexport function resetGitFileWatcher(): void {\n  gitWatcher.reset()\n}\n\n/**\n * Read the HEAD SHA for an arbitrary directory (not using the watcher).\n * Used by plugins that need the HEAD of a specific repo, not the CWD repo.\n */\nexport async function getHeadForDir(cwd: string): Promise<string | null> {\n  const gitDir = await resolveGitDir(cwd)\n  if (!gitDir) {\n    return null\n  }\n  const head = await readGitHead(gitDir)\n  if (!head) {\n    return null\n  }\n  if (head.type === 'branch') {\n    return resolveRef(gitDir, `refs/heads/${head.name}`)\n  }\n  return head.sha\n}\n\n/**\n * Read the HEAD SHA for a git worktree directory (not the main repo).\n *\n * Unlike `getHeadForDir`, this reads `<worktreePath>/.git` directly as a\n * `gitdir:` pointer file, with no upward walk. `getHeadForDir` walks upward\n * via `findGitRoot` and would find the parent repo's `.git` when the\n * worktree path doesn't exist \u2014 misreporting the parent HEAD as the worktree's.\n *\n * Returns null if the worktree doesn't exist (`.git` pointer ENOENT) or is\n * malformed. Caller can treat null as \"not a valid worktree\".\n */\nexport async function readWorktreeHeadSha(\n  worktreePath: string,\n): Promise<string | null> {\n  let gitDir: string\n  try {\n    const ptr = (await readFile(join(worktreePath, '.git'), 'utf-8')).trim()\n    if (!ptr.startsWith('gitdir:')) {\n      return null\n    }\n    gitDir = resolve(worktreePath, ptr.slice('gitdir:'.length).trim())\n  } catch {\n    return null\n  }\n  const head = await readGitHead(gitDir)\n  if (!head) {\n    return null\n  }\n  if (head.type === 'branch') {\n    return resolveRef(gitDir, `refs/heads/${head.name}`)\n  }\n  return head.sha\n}\n\n/**\n * Read the remote origin URL for an arbitrary directory via .git/config.\n */\nexport async function getRemoteUrlForDir(cwd: string): Promise<string | null> {\n  const gitDir = await resolveGitDir(cwd)\n  if (!gitDir) {\n    return null\n  }\n  const url = await parseGitConfigValue(gitDir, 'remote', 'origin', 'url')\n  if (url) {\n    return url\n  }\n  // In worktrees, the config with remote URLs is in the common dir\n  const commonDir = await getCommonDir(gitDir)\n  if (commonDir && commonDir !== gitDir) {\n    return parseGitConfigValue(commonDir, 'remote', 'origin', 'url')\n  }\n  return null\n}\n\n/**\n * Check if we're in a shallow clone by looking for <commonDir>/shallow.\n * Per git's shallow.c, mere existence of the file means shallow.\n * The shallow file lives in commonDir, not the per-worktree gitDir.\n */\nexport async function isShallowClone(): Promise<boolean> {\n  const gitDir = await resolveGitDir()\n  if (!gitDir) {\n    return false\n  }\n  const commonDir = (await getCommonDir(gitDir)) ?? gitDir\n  try {\n    await stat(join(commonDir, 'shallow'))\n    return true\n  } catch {\n    return false\n  }\n}\n\n/**\n * Count worktrees by reading <commonDir>/worktrees/ directory.\n * The worktrees/ directory lives in commonDir, not the per-worktree gitDir.\n * The main worktree is not listed there, so add 1.\n */\nexport async function getWorktreeCountFromFs(): Promise<number> {\n  try {\n    const gitDir = await resolveGitDir()\n    if (!gitDir) {\n      return 0\n    }\n    const commonDir = (await getCommonDir(gitDir)) ?? gitDir\n    const entries = await readdir(join(commonDir, 'worktrees'))\n    return entries.length + 1\n  } catch {\n    // No worktrees directory means only the main worktree\n    return 1\n  }\n}\n", "import { execa } from 'execa'\nimport { execSync_DEPRECATED } from './execSyncWrapper.js'\n\nasync function whichNodeAsync(command: string): Promise<string | null> {\n  if (process.platform === 'win32') {\n    // On Windows, use where.exe and return the first result\n    const result = await execa(`where.exe ${command}`, {\n      shell: true,\n      stderr: 'ignore',\n      reject: false,\n    })\n    if (result.exitCode !== 0 || !result.stdout) {\n      return null\n    }\n    // where.exe returns multiple paths separated by newlines, return the first\n    return result.stdout.trim().split(/\\r?\\n/)[0] || null\n  }\n\n  // On POSIX systems (macOS, Linux, WSL), use which\n  // Cross-platform safe: Windows is handled above\n  // eslint-disable-next-line custom-rules/no-cross-platform-process-issues\n  const result = await execa(`which ${command}`, {\n    shell: true,\n    stderr: 'ignore',\n    reject: false,\n  })\n  if (result.exitCode !== 0 || !result.stdout) {\n    return null\n  }\n  return result.stdout.trim()\n}\n\nfunction whichNodeSync(command: string): string | null {\n  if (process.platform === 'win32') {\n    try {\n      const result = execSync_DEPRECATED(`where.exe ${command}`, {\n        encoding: 'utf-8',\n        stdio: ['ignore', 'pipe', 'ignore'],\n      })\n      const output = result.toString().trim()\n      return output.split(/\\r?\\n/)[0] || null\n    } catch {\n      return null\n    }\n  }\n\n  try {\n    const result = execSync_DEPRECATED(`which ${command}`, {\n      encoding: 'utf-8',\n      stdio: ['ignore', 'pipe', 'ignore'],\n    })\n    return result.toString().trim() || null\n  } catch {\n    return null\n  }\n}\n\nconst bunWhich =\n  typeof Bun !== 'undefined' && typeof Bun.which === 'function'\n    ? Bun.which\n    : null\n\n/**\n * Finds the full path to a command executable.\n * Uses Bun.which when running in Bun (fast, no process spawn),\n * otherwise spawns the platform-appropriate command.\n *\n * @param command - The command name to look up\n * @returns The full path to the command, or null if not found\n */\nexport const which: (command: string) => Promise<string | null> = bunWhich\n  ? async command => bunWhich(command)\n  : whichNodeAsync\n\n/**\n * Synchronous version of `which`.\n *\n * @param command - The command name to look up\n * @returns The full path to the command, or null if not found\n */\nexport const whichSync: (command: string) => string | null =\n  bunWhich ?? whichNodeSync\n", "import { createHash } from 'crypto'\r\nimport { readFileSync, realpathSync, statSync } from 'fs'\r\nimport { open, readFile, realpath, stat } from 'fs/promises'\r\nimport memoize from 'lodash-es/memoize.js'\r\nimport { basename, dirname, join, resolve, sep } from 'path'\r\nimport { hasBinaryExtension, isBinaryContent } from '../constants/files.js'\r\nimport { getCwd } from './cwd.js'\r\nimport { logForDebugging } from './debug.js'\r\nimport { logForDiagnosticsNoPII } from './diagLogs.js'\r\nimport { execFileNoThrow } from './execFileNoThrow.js'\r\nimport { getFsImplementation } from './fsOperations.js'\r\nimport {\r\n  getCachedBranch,\r\n  getCachedDefaultBranch,\r\n  getCachedHead,\r\n  getCachedRemoteUrl,\r\n  getWorktreeCountFromFs,\r\n  isShallowClone as isShallowCloneFs,\r\n  resolveGitDir,\r\n} from './git/gitFilesystem.js'\r\nimport { logError } from './log.js'\r\nimport { memoizeWithLRU } from './memoize.js'\r\nimport { whichSync } from './which.js'\r\n\r\nconst GIT_ROOT_NOT_FOUND = Symbol('git-root-not-found')\r\n\r\nconst findGitRootImpl = memoizeWithLRU(\r\n  (startPath: string): string | typeof GIT_ROOT_NOT_FOUND => {\r\n    const startTime = Date.now()\r\n    logForDiagnosticsNoPII('info', 'find_git_root_started')\r\n\r\n    let current = resolve(startPath)\r\n    const root = current.substring(0, current.indexOf(sep) + 1) || sep\r\n    let statCount = 0\r\n\r\n    while (current !== root) {\r\n      try {\r\n        const gitPath = join(current, '.git')\r\n        statCount++\r\n        const stat = statSync(gitPath)\r\n        // .git can be a directory (regular repo) or file (worktree/submodule)\r\n        if (stat.isDirectory() || stat.isFile()) {\r\n          logForDiagnosticsNoPII('info', 'find_git_root_completed', {\r\n            duration_ms: Date.now() - startTime,\r\n            stat_count: statCount,\r\n            found: true,\r\n          })\r\n          return current.normalize('NFC')\r\n        }\r\n      } catch {\r\n        // .git doesn't exist at this level, continue up\r\n      }\r\n      const parent = dirname(current)\r\n      if (parent === current) {\r\n        break\r\n      }\r\n      current = parent\r\n    }\r\n\r\n    // Check root directory as well\r\n    try {\r\n      const gitPath = join(root, '.git')\r\n      statCount++\r\n      const stat = statSync(gitPath)\r\n      if (stat.isDirectory() || stat.isFile()) {\r\n        logForDiagnosticsNoPII('info', 'find_git_root_completed', {\r\n          duration_ms: Date.now() - startTime,\r\n          stat_count: statCount,\r\n          found: true,\r\n        })\r\n        return root.normalize('NFC')\r\n      }\r\n    } catch {\r\n      // .git doesn't exist at root\r\n    }\r\n\r\n    logForDiagnosticsNoPII('info', 'find_git_root_completed', {\r\n      duration_ms: Date.now() - startTime,\r\n      stat_count: statCount,\r\n      found: false,\r\n    })\r\n    return GIT_ROOT_NOT_FOUND\r\n  },\r\n  path => path,\r\n  50,\r\n)\r\n\r\n/**\r\n * Find the git root by walking up the directory tree.\r\n * Looks for a .git directory or file (worktrees/submodules use a file).\r\n * Returns the directory containing .git, or null if not found.\r\n *\r\n * Memoized per startPath with an LRU cache (max 50 entries) to prevent\r\n * unbounded growth \u2014 gitDiff calls this with dirname(file), so editing many\r\n * files across different directories would otherwise accumulate entries forever.\r\n */\r\nexport const findGitRoot = createFindGitRoot()\r\n\r\nfunction createFindGitRoot(): {\r\n  (startPath: string): string | null\r\n  cache: typeof findGitRootImpl.cache\r\n} {\r\n  function wrapper(startPath: string): string | null {\r\n    const result = findGitRootImpl(startPath)\r\n    return result === GIT_ROOT_NOT_FOUND ? null : result\r\n  }\r\n  wrapper.cache = findGitRootImpl.cache\r\n  return wrapper\r\n}\r\n\r\n/**\r\n * Resolve a git root to the canonical main repository root.\r\n * For a regular repo this is a no-op. For a worktree, follows the\r\n * `.git` file \u2192 `gitdir:` \u2192 `commondir` chain to find the main repo's\r\n * working directory.\r\n *\r\n * Submodules (`.git` is a file but no `commondir`) fall through to the\r\n * input root, which is correct since submodules are separate repos.\r\n *\r\n * Memoized with a small LRU to avoid repeated file reads on the hot\r\n * path (permission checks, prompt building).\r\n */\r\nconst resolveCanonicalRoot = memoizeWithLRU(\r\n  (gitRoot: string): string => {\r\n    try {\r\n      // In a worktree, .git is a file containing: gitdir: <path>\r\n      // In a regular repo, .git is a directory (readFileSync throws EISDIR).\r\n      const gitContent = readFileSync(join(gitRoot, '.git'), 'utf-8').trim()\r\n      if (!gitContent.startsWith('gitdir:')) {\r\n        return gitRoot\r\n      }\r\n      const worktreeGitDir = resolve(\r\n        gitRoot,\r\n        gitContent.slice('gitdir:'.length).trim(),\r\n      )\r\n      // commondir points to the shared .git directory (relative to worktree gitdir).\r\n      // Submodules have no commondir (readFileSync throws ENOENT) \u2192 fall through.\r\n      const commonDir = resolve(\r\n        worktreeGitDir,\r\n        readFileSync(join(worktreeGitDir, 'commondir'), 'utf-8').trim(),\r\n      )\r\n      // SECURITY: The .git file and commondir are attacker-controlled in a\r\n      // cloned/downloaded repo. Without validation, a malicious repo can point\r\n      // commondir at any path the victim has trusted, bypassing the trust\r\n      // dialog and executing hooks from .claude/settings.json on startup.\r\n      //\r\n      // Validate the structure matches what `git worktree add` creates:\r\n      //   1. worktreeGitDir is a direct child of <commonDir>/worktrees/\r\n      //      \u2192 ensures the commondir file we read lives inside the resolved\r\n      //        common dir, not inside the attacker's repo\r\n      //   2. <worktreeGitDir>/gitdir points back to <gitRoot>/.git\r\n      //      \u2192 ensures an attacker can't borrow a victim's existing worktree\r\n      //        entry by guessing its path\r\n      // Both are required: (1) alone fails if victim has a worktree of the\r\n      // trusted repo; (2) alone fails because attacker controls worktreeGitDir.\r\n      if (resolve(dirname(worktreeGitDir)) !== join(commonDir, 'worktrees')) {\r\n        return gitRoot\r\n      }\r\n      // Git writes gitdir with strbuf_realpath() (symlinks resolved), but\r\n      // gitRoot from findGitRoot() is only lexically resolved. Realpath gitRoot\r\n      // so legitimate worktrees accessed via a symlinked path (e.g. macOS\r\n      // /tmp \u2192 /private/tmp) aren't rejected. Realpath the directory then join\r\n      // '.git' \u2014 realpathing the .git file itself would follow a symlinked .git\r\n      // and let an attacker borrow a victim's back-link.\r\n      const backlink = realpathSync(\r\n        readFileSync(join(worktreeGitDir, 'gitdir'), 'utf-8').trim(),\r\n      )\r\n      if (backlink !== join(realpathSync(gitRoot), '.git')) {\r\n        return gitRoot\r\n      }\r\n      // Bare-repo worktrees: the common dir isn't inside a working directory.\r\n      // Use the common dir itself as the stable identity (anthropics/claude-code#27994).\r\n      if (basename(commonDir) !== '.git') {\r\n        return commonDir.normalize('NFC')\r\n      }\r\n      return dirname(commonDir).normalize('NFC')\r\n    } catch {\r\n      return gitRoot\r\n    }\r\n  },\r\n  root => root,\r\n  50,\r\n)\r\n\r\n/**\r\n * Find the canonical git repository root, resolving through worktrees.\r\n *\r\n * Unlike findGitRoot, which returns the worktree directory (where the `.git`\r\n * file lives), this returns the main repository's working directory. This\r\n * ensures all worktrees of the same repo map to the same project identity.\r\n *\r\n * Use this instead of findGitRoot for project-scoped state (auto-memory,\r\n * project config, agent memory) so worktrees share state with the main repo.\r\n */\r\nexport const findCanonicalGitRoot = createFindCanonicalGitRoot()\r\n\r\nfunction createFindCanonicalGitRoot(): {\r\n  (startPath: string): string | null\r\n  cache: typeof resolveCanonicalRoot.cache\r\n} {\r\n  function wrapper(startPath: string): string | null {\r\n    const root = findGitRoot(startPath)\r\n    if (!root) {\r\n      return null\r\n    }\r\n    return resolveCanonicalRoot(root)\r\n  }\r\n  wrapper.cache = resolveCanonicalRoot.cache\r\n  return wrapper\r\n}\r\n\r\nexport const gitExe = memoize((): string => {\r\n  // Every time we spawn a process, we have to lookup the path.\r\n  // Let's instead avoid that lookup so we only do it once.\r\n  return whichSync('git') || 'git'\r\n})\r\n\r\nexport const getIsGit = memoize(async (): Promise<boolean> => {\r\n  const startTime = Date.now()\r\n  logForDiagnosticsNoPII('info', 'is_git_check_started')\r\n\r\n  const isGit = findGitRoot(getCwd()) !== null\r\n\r\n  logForDiagnosticsNoPII('info', 'is_git_check_completed', {\r\n    duration_ms: Date.now() - startTime,\r\n    is_git: isGit,\r\n  })\r\n  return isGit\r\n})\r\n\r\nexport function getGitDir(cwd: string): Promise<string | null> {\r\n  return resolveGitDir(cwd)\r\n}\r\n\r\nexport async function isAtGitRoot(): Promise<boolean> {\r\n  const cwd = getCwd()\r\n  const gitRoot = findGitRoot(cwd)\r\n  if (!gitRoot) {\r\n    return false\r\n  }\r\n  // Resolve symlinks for accurate comparison\r\n  try {\r\n    const [resolvedCwd, resolvedGitRoot] = await Promise.all([\r\n      realpath(cwd),\r\n      realpath(gitRoot),\r\n    ])\r\n    return resolvedCwd === resolvedGitRoot\r\n  } catch {\r\n    return cwd === gitRoot\r\n  }\r\n}\r\n\r\nexport const dirIsInGitRepo = async (cwd: string): Promise<boolean> => {\r\n  return findGitRoot(cwd) !== null\r\n}\r\n\r\nexport const getHead = async (): Promise<string> => {\r\n  return getCachedHead()\r\n}\r\n\r\nexport const getBranch = async (): Promise<string> => {\r\n  return getCachedBranch()\r\n}\r\n\r\nexport const getDefaultBranch = async (): Promise<string> => {\r\n  return getCachedDefaultBranch()\r\n}\r\n\r\nexport const getRemoteUrl = async (): Promise<string | null> => {\r\n  return getCachedRemoteUrl()\r\n}\r\n\r\n/**\r\n * Normalizes a git remote URL to a canonical form for hashing.\r\n * Converts SSH and HTTPS URLs to the same format: host/owner/repo (lowercase, no .git)\r\n *\r\n * Examples:\r\n * - git@github.com:owner/repo.git -> github.com/owner/repo\r\n * - https://github.com/owner/repo.git -> github.com/owner/repo\r\n * - ssh://git@github.com/owner/repo -> github.com/owner/repo\r\n * - http://local_proxy@127.0.0.1:16583/git/owner/repo -> github.com/owner/repo\r\n */\r\nexport function normalizeGitRemoteUrl(url: string): string | null {\r\n  const trimmed = url.trim()\r\n  if (!trimmed) return null\r\n\r\n  // Handle SSH format: git@host:owner/repo.git\r\n  const sshMatch = trimmed.match(/^git@([^:]+):(.+?)(?:\\.git)?$/)\r\n  if (sshMatch && sshMatch[1] && sshMatch[2]) {\r\n    return `${sshMatch[1]}/${sshMatch[2]}`.toLowerCase()\r\n  }\r\n\r\n  // Handle HTTPS/SSH URL format: https://host/owner/repo.git or ssh://git@host/owner/repo\r\n  const urlMatch = trimmed.match(\r\n    /^(?:https?|ssh):\\/\\/(?:[^@]+@)?([^/]+)\\/(.+?)(?:\\.git)?$/,\r\n  )\r\n  if (urlMatch && urlMatch[1] && urlMatch[2]) {\r\n    const host = urlMatch[1]\r\n    const path = urlMatch[2]\r\n\r\n    // CCR git proxy URLs use format:\r\n    //   Legacy:  http://...@127.0.0.1:PORT/git/owner/repo       (github.com assumed)\r\n    //   GHE:     http://...@127.0.0.1:PORT/git/ghe.host/owner/repo (host encoded in path)\r\n    // Strip the /git/ prefix. If the first segment contains a dot, it's a\r\n    // hostname (GitHub org names cannot contain dots). Otherwise assume github.com.\r\n    if (isLocalHost(host) && path.startsWith('git/')) {\r\n      const proxyPath = path.slice(4) // Remove \"git/\" prefix\r\n      const segments = proxyPath.split('/')\r\n      // 3+ segments where first contains a dot \u2192 host/owner/repo (GHE format)\r\n      if (segments.length >= 3 && segments[0]!.includes('.')) {\r\n        return proxyPath.toLowerCase()\r\n      }\r\n      // 2 segments \u2192 owner/repo (legacy format, assume github.com)\r\n      return `github.com/${proxyPath}`.toLowerCase()\r\n    }\r\n\r\n    return `${host}/${path}`.toLowerCase()\r\n  }\r\n\r\n  return null\r\n}\r\n\r\n/**\r\n * Returns a SHA256 hash (first 16 chars) of the normalized git remote URL.\r\n * This provides a globally unique identifier for the repository that:\r\n * - Is the same regardless of SSH vs HTTPS clone\r\n * - Does not expose the actual repository name in logs\r\n */\r\nexport async function getRepoRemoteHash(): Promise<string | null> {\r\n  const remoteUrl = await getRemoteUrl()\r\n  if (!remoteUrl) return null\r\n\r\n  const normalized = normalizeGitRemoteUrl(remoteUrl)\r\n  if (!normalized) return null\r\n\r\n  const hash = createHash('sha256').update(normalized).digest('hex')\r\n  return hash.substring(0, 16)\r\n}\r\n\r\nexport const getIsHeadOnRemote = async (): Promise<boolean> => {\r\n  const { code } = await execFileNoThrow(gitExe(), ['rev-parse', '@{u}'], {\r\n    preserveOutputOnError: false,\r\n  })\r\n  return code === 0\r\n}\r\n\r\nexport const hasUnpushedCommits = async (): Promise<boolean> => {\r\n  const { stdout, code } = await execFileNoThrow(\r\n    gitExe(),\r\n    ['rev-list', '--count', '@{u}..HEAD'],\r\n    { preserveOutputOnError: false },\r\n  )\r\n  return code === 0 && parseInt(stdout.trim(), 10) > 0\r\n}\r\n\r\nexport const getIsClean = async (options?: {\r\n  ignoreUntracked?: boolean\r\n}): Promise<boolean> => {\r\n  const args = ['--no-optional-locks', 'status', '--porcelain']\r\n  if (options?.ignoreUntracked) {\r\n    args.push('-uno')\r\n  }\r\n  const { stdout } = await execFileNoThrow(gitExe(), args, {\r\n    preserveOutputOnError: false,\r\n  })\r\n  return stdout.trim().length === 0\r\n}\r\n\r\nexport const getChangedFiles = async (): Promise<string[]> => {\r\n  const { stdout } = await execFileNoThrow(\r\n    gitExe(),\r\n    ['--no-optional-locks', 'status', '--porcelain'],\r\n    {\r\n      preserveOutputOnError: false,\r\n    },\r\n  )\r\n  return stdout\r\n    .trim()\r\n    .split('\\n')\r\n    .map(line => line.trim().split(' ', 2)[1]?.trim()) // Remove status prefix (e.g., \"M \", \"A \", \"??\")\r\n    .filter(line => typeof line === 'string') // Remove empty entries\r\n}\r\n\r\nexport type GitFileStatus = {\r\n  tracked: string[]\r\n  untracked: string[]\r\n}\r\n\r\nexport const getFileStatus = async (): Promise<GitFileStatus> => {\r\n  const { stdout } = await execFileNoThrow(\r\n    gitExe(),\r\n    ['--no-optional-locks', 'status', '--porcelain'],\r\n    {\r\n      preserveOutputOnError: false,\r\n    },\r\n  )\r\n\r\n  const tracked: string[] = []\r\n  const untracked: string[] = []\r\n\r\n  stdout\r\n    .trim()\r\n    .split('\\n')\r\n    .filter(line => line.length > 0)\r\n    .forEach(line => {\r\n      const status = line.substring(0, 2)\r\n      const filename = line.substring(2).trim()\r\n\r\n      if (status === '??') {\r\n        untracked.push(filename)\r\n      } else if (filename) {\r\n        tracked.push(filename)\r\n      }\r\n    })\r\n\r\n  return { tracked, untracked }\r\n}\r\n\r\nexport const getWorktreeCount = async (): Promise<number> => {\r\n  return getWorktreeCountFromFs()\r\n}\r\n\r\n/**\r\n * Stashes all changes (including untracked files) to return git to a clean porcelain state\r\n * Important: This function stages untracked files before stashing to prevent data loss\r\n * @param message - Optional custom message for the stash\r\n * @returns Promise<boolean> - true if stash was successful, false otherwise\r\n */\r\nexport const stashToCleanState = async (message?: string): Promise<boolean> => {\r\n  try {\r\n    const stashMessage =\r\n      message || `Tau auto-stash - ${new Date().toISOString()}`\r\n\r\n    // First, check if we have untracked files\r\n    const { untracked } = await getFileStatus()\r\n\r\n    // If we have untracked files, add them to the index first\r\n    // This prevents them from being deleted\r\n    if (untracked.length > 0) {\r\n      const { code: addCode } = await execFileNoThrow(\r\n        gitExe(),\r\n        ['add', ...untracked],\r\n        { preserveOutputOnError: false },\r\n      )\r\n\r\n      if (addCode !== 0) {\r\n        return false\r\n      }\r\n    }\r\n\r\n    // Now stash everything (staged and unstaged changes)\r\n    const { code } = await execFileNoThrow(\r\n      gitExe(),\r\n      ['stash', 'push', '--message', stashMessage],\r\n      { preserveOutputOnError: false },\r\n    )\r\n    return code === 0\r\n  } catch (_) {\r\n    return false\r\n  }\r\n}\r\n\r\nexport type GitRepoState = {\r\n  commitHash: string\r\n  branchName: string\r\n  remoteUrl: string | null\r\n  isHeadOnRemote: boolean\r\n  isClean: boolean\r\n  worktreeCount: number\r\n}\r\n\r\nexport async function getGitState(): Promise<GitRepoState | null> {\r\n  try {\r\n    const [\r\n      commitHash,\r\n      branchName,\r\n      remoteUrl,\r\n      isHeadOnRemote,\r\n      isClean,\r\n      worktreeCount,\r\n    ] = await Promise.all([\r\n      getHead(),\r\n      getBranch(),\r\n      getRemoteUrl(),\r\n      getIsHeadOnRemote(),\r\n      getIsClean(),\r\n      getWorktreeCount(),\r\n    ])\r\n\r\n    return {\r\n      commitHash,\r\n      branchName,\r\n      remoteUrl,\r\n      isHeadOnRemote,\r\n      isClean,\r\n      worktreeCount,\r\n    }\r\n  } catch (_) {\r\n    // Fail silently - git state is best effort\r\n    return null\r\n  }\r\n}\r\n\r\nexport async function getGithubRepo(): Promise<string | null> {\r\n  const { parseGitRemote } = await import('./detectRepository.js')\r\n  const remoteUrl = await getRemoteUrl()\r\n  if (!remoteUrl) {\r\n    logForDebugging('Local GitHub repo: unknown')\r\n    return null\r\n  }\r\n  // Only return results for github.com \u2014 callers (e.g. issue submission)\r\n  // assume the result is a github.com repository.\r\n  const parsed = parseGitRemote(remoteUrl)\r\n  if (parsed && parsed.host === 'github.com') {\r\n    const result = `${parsed.owner}/${parsed.name}`\r\n    logForDebugging(`Local GitHub repo: ${result}`)\r\n    return result\r\n  }\r\n  logForDebugging('Local GitHub repo: unknown')\r\n  return null\r\n}\r\n\r\n/**\r\n * Preserved git state for issue submission.\r\n * Uses remote base (e.g., origin/main) which is rarely force-pushed,\r\n * unlike local commits that can be GC'd after force push.\r\n */\r\nexport type PreservedGitState = {\r\n  /** The SHA of the merge-base with the remote branch */\r\n  remote_base_sha: string | null\r\n  /** The remote branch used (e.g., \"origin/main\") */\r\n  remote_base: string | null\r\n  /** Patch from merge-base to current state (includes uncommitted changes) */\r\n  patch: string\r\n  /** Untracked files with their contents */\r\n  untracked_files: Array<{ path: string; content: string }>\r\n  /** git format-patch output for committed changes between merge-base and HEAD.\r\n   *  Used to reconstruct the actual commit chain (author, date, message) in\r\n   *  replay containers. null when there are no commits between merge-base and HEAD. */\r\n  format_patch: string | null\r\n  /** The current HEAD SHA (tip of the feature branch) */\r\n  head_sha: string | null\r\n  /** The current branch name (e.g., \"feat/my-feature\") */\r\n  branch_name: string | null\r\n}\r\n\r\n// Size limits for untracked file capture\r\nconst MAX_FILE_SIZE_BYTES = 500 * 1024 * 1024 // 500MB per file\r\nconst MAX_TOTAL_SIZE_BYTES = 5 * 1024 * 1024 * 1024 // 5GB total\r\nconst MAX_FILE_COUNT = 20000\r\n\r\n// Initial read buffer for binary detection + content reuse. 64KB covers\r\n// most source files in a single read; isBinaryContent() internally scans\r\n// only its first 8KB for the binary heuristic, so the extra bytes are\r\n// purely for avoiding a second read when the file turns out to be text.\r\nconst SNIFF_BUFFER_SIZE = 64 * 1024\r\n\r\n/**\r\n * Find the best remote branch to use as a base.\r\n * Priority: tracking branch > origin/main > origin/staging > origin/master\r\n */\r\nexport async function findRemoteBase(): Promise<string | null> {\r\n  // First try: get the tracking branch for the current branch\r\n  const { stdout: trackingBranch, code: trackingCode } = await execFileNoThrow(\r\n    gitExe(),\r\n    ['rev-parse', '--abbrev-ref', '--symbolic-full-name', '@{u}'],\r\n    { preserveOutputOnError: false },\r\n  )\r\n\r\n  if (trackingCode === 0 && trackingBranch.trim()) {\r\n    return trackingBranch.trim()\r\n  }\r\n\r\n  // Second try: check for common default branch names on origin\r\n  const { stdout: remoteRefs, code: remoteCode } = await execFileNoThrow(\r\n    gitExe(),\r\n    ['remote', 'show', 'origin', '--', 'HEAD'],\r\n    { preserveOutputOnError: false },\r\n  )\r\n\r\n  if (remoteCode === 0) {\r\n    // Parse the default branch from remote show output\r\n    const match = remoteRefs.match(/HEAD branch: (\\S+)/)\r\n    if (match && match[1]) {\r\n      return `origin/${match[1]}`\r\n    }\r\n  }\r\n\r\n  // Third try: check which common branches exist\r\n  const candidates = ['origin/main', 'origin/staging', 'origin/master']\r\n  for (const candidate of candidates) {\r\n    const { code } = await execFileNoThrow(\r\n      gitExe(),\r\n      ['rev-parse', '--verify', candidate],\r\n      { preserveOutputOnError: false },\r\n    )\r\n    if (code === 0) {\r\n      return candidate\r\n    }\r\n  }\r\n\r\n  return null\r\n}\r\n\r\n/**\r\n * Check if we're in a shallow clone by looking for <gitDir>/shallow.\r\n */\r\nfunction isShallowClone(): Promise<boolean> {\r\n  return isShallowCloneFs()\r\n}\r\n\r\n/**\r\n * Capture untracked files (git diff doesn't include them).\r\n * Respects size limits and skips binary files.\r\n */\r\nasync function captureUntrackedFiles(): Promise<\r\n  Array<{ path: string; content: string }>\r\n> {\r\n  const { stdout, code } = await execFileNoThrow(\r\n    gitExe(),\r\n    ['ls-files', '--others', '--exclude-standard'],\r\n    { preserveOutputOnError: false },\r\n  )\r\n\r\n  const trimmed = stdout.trim()\r\n  if (code !== 0 || !trimmed) {\r\n    return []\r\n  }\r\n\r\n  const files = trimmed.split('\\n').filter(Boolean)\r\n  const result: Array<{ path: string; content: string }> = []\r\n  let totalSize = 0\r\n\r\n  for (const filePath of files) {\r\n    // Check file count limit\r\n    if (result.length >= MAX_FILE_COUNT) {\r\n      logForDebugging(\r\n        `Untracked file capture: reached max file count (${MAX_FILE_COUNT})`,\r\n      )\r\n      break\r\n    }\r\n\r\n    // Skip binary files by extension - zero I/O\r\n    if (hasBinaryExtension(filePath)) {\r\n      continue\r\n    }\r\n\r\n    try {\r\n      const stats = await stat(filePath)\r\n      const fileSize = stats.size\r\n\r\n      // Skip files exceeding per-file limit\r\n      if (fileSize > MAX_FILE_SIZE_BYTES) {\r\n        logForDebugging(\r\n          `Untracked file capture: skipping ${filePath} (exceeds ${MAX_FILE_SIZE_BYTES} bytes)`,\r\n        )\r\n        continue\r\n      }\r\n\r\n      // Check total size limit\r\n      if (totalSize + fileSize > MAX_TOTAL_SIZE_BYTES) {\r\n        logForDebugging(\r\n          `Untracked file capture: reached total size limit (${MAX_TOTAL_SIZE_BYTES} bytes)`,\r\n        )\r\n        break\r\n      }\r\n\r\n      // Empty file - no need to open\r\n      if (fileSize === 0) {\r\n        result.push({ path: filePath, content: '' })\r\n        continue\r\n      }\r\n\r\n      // Binary sniff on up to SNIFF_BUFFER_SIZE bytes. Caps binary-file reads\r\n      // at SNIFF_BUFFER_SIZE even though MAX_FILE_SIZE_BYTES allows up to 500MB.\r\n      // If the file fits in the sniff buffer we reuse it as the content; for\r\n      // larger text files we fall back to readFile with encoding so the runtime\r\n      // decodes to a string without materializing a full-size Buffer in JS.\r\n      const sniffSize = Math.min(SNIFF_BUFFER_SIZE, fileSize)\r\n      const fd = await open(filePath, 'r')\r\n      try {\r\n        const sniffBuf = Buffer.alloc(sniffSize)\r\n        const { bytesRead } = await fd.read(sniffBuf, 0, sniffSize, 0)\r\n        const sniff = sniffBuf.subarray(0, bytesRead)\r\n\r\n        if (isBinaryContent(sniff)) {\r\n          continue\r\n        }\r\n\r\n        let content: string\r\n        if (fileSize <= sniffSize) {\r\n          // Sniff already covers the whole file\r\n          content = sniff.toString('utf-8')\r\n        } else {\r\n          // readFile with encoding decodes to string directly, avoiding a\r\n          // full-size Buffer living alongside the decoded string. The extra\r\n          // open/close is cheaper than doubling peak memory for large files.\r\n          content = await readFile(filePath, 'utf-8')\r\n        }\r\n\r\n        result.push({ path: filePath, content })\r\n        totalSize += fileSize\r\n      } finally {\r\n        await fd.close()\r\n      }\r\n    } catch (err) {\r\n      // Skip files we can't read\r\n      logForDebugging(`Failed to read untracked file ${filePath}: ${err}`)\r\n    }\r\n  }\r\n\r\n  return result\r\n}\r\n\r\n/**\r\n * Preserve git state for issue submission.\r\n * Uses remote base for more stable replay capability.\r\n *\r\n * Edge cases handled:\r\n * - Detached HEAD: falls back to merge-base with default branch directly\r\n * - No remote: returns null for remote fields, uses HEAD-only mode\r\n * - Shallow clone: falls back to HEAD-only mode\r\n */\r\nexport async function preserveGitStateForIssue(): Promise<PreservedGitState | null> {\r\n  try {\r\n    const isGit = await getIsGit()\r\n    if (!isGit) {\r\n      return null\r\n    }\r\n\r\n    // Check for shallow clone - fall back to simpler mode\r\n    if (await isShallowClone()) {\r\n      logForDebugging('Shallow clone detected, using HEAD-only mode for issue')\r\n      const [{ stdout: patch }, untrackedFiles] = await Promise.all([\r\n        execFileNoThrow(gitExe(), ['diff', 'HEAD']),\r\n        captureUntrackedFiles(),\r\n      ])\r\n      return {\r\n        remote_base_sha: null,\r\n        remote_base: null,\r\n        patch: patch || '',\r\n        untracked_files: untrackedFiles,\r\n        format_patch: null,\r\n        head_sha: null,\r\n        branch_name: null,\r\n      }\r\n    }\r\n\r\n    // Find the best remote base\r\n    const remoteBase = await findRemoteBase()\r\n\r\n    if (!remoteBase) {\r\n      // No remote found - use HEAD-only mode\r\n      logForDebugging('No remote found, using HEAD-only mode for issue')\r\n      const [{ stdout: patch }, untrackedFiles] = await Promise.all([\r\n        execFileNoThrow(gitExe(), ['diff', 'HEAD']),\r\n        captureUntrackedFiles(),\r\n      ])\r\n      return {\r\n        remote_base_sha: null,\r\n        remote_base: null,\r\n        patch: patch || '',\r\n        untracked_files: untrackedFiles,\r\n        format_patch: null,\r\n        head_sha: null,\r\n        branch_name: null,\r\n      }\r\n    }\r\n\r\n    // Get the merge-base with remote\r\n    const { stdout: mergeBase, code: mergeBaseCode } = await execFileNoThrow(\r\n      gitExe(),\r\n      ['merge-base', 'HEAD', remoteBase],\r\n      { preserveOutputOnError: false },\r\n    )\r\n\r\n    if (mergeBaseCode !== 0 || !mergeBase.trim()) {\r\n      // Merge-base failed - fall back to HEAD-only\r\n      logForDebugging('Merge-base failed, using HEAD-only mode for issue')\r\n      const [{ stdout: patch }, untrackedFiles] = await Promise.all([\r\n        execFileNoThrow(gitExe(), ['diff', 'HEAD']),\r\n        captureUntrackedFiles(),\r\n      ])\r\n      return {\r\n        remote_base_sha: null,\r\n        remote_base: null,\r\n        patch: patch || '',\r\n        untracked_files: untrackedFiles,\r\n        format_patch: null,\r\n        head_sha: null,\r\n        branch_name: null,\r\n      }\r\n    }\r\n\r\n    const remoteBaseSha = mergeBase.trim()\r\n\r\n    // All 5 commands below depend only on remoteBaseSha \u2014 run them in parallel.\r\n    // ~5\u00D790ms serial \u2192 ~90ms parallel on Bun native (used by /issue and /share).\r\n    const [\r\n      { stdout: patch },\r\n      untrackedFiles,\r\n      { stdout: formatPatchOut, code: formatPatchCode },\r\n      { stdout: headSha },\r\n      { stdout: branchName },\r\n    ] = await Promise.all([\r\n      // Patch from merge-base to current state (including staged changes)\r\n      execFileNoThrow(gitExe(), ['diff', remoteBaseSha]),\r\n      // Untracked files captured separately\r\n      captureUntrackedFiles(),\r\n      // format-patch for committed changes between merge-base and HEAD.\r\n      // Preserves the actual commit chain (author, date, message) so replay\r\n      // containers can reconstruct the branch with real commits instead of a\r\n      // squashed diff. Uses --stdout to emit all patches as a single text stream.\r\n      execFileNoThrow(gitExe(), [\r\n        'format-patch',\r\n        `${remoteBaseSha}..HEAD`,\r\n        '--stdout',\r\n      ]),\r\n      // HEAD SHA for replay\r\n      execFileNoThrow(gitExe(), ['rev-parse', 'HEAD']),\r\n      // Branch name for replay\r\n      execFileNoThrow(gitExe(), ['rev-parse', '--abbrev-ref', 'HEAD']),\r\n    ])\r\n\r\n    let formatPatch: string | null = null\r\n    if (formatPatchCode === 0 && formatPatchOut && formatPatchOut.trim()) {\r\n      formatPatch = formatPatchOut\r\n    }\r\n\r\n    const trimmedBranch = branchName?.trim()\r\n    return {\r\n      remote_base_sha: remoteBaseSha,\r\n      remote_base: remoteBase,\r\n      patch: patch || '',\r\n      untracked_files: untrackedFiles,\r\n      format_patch: formatPatch,\r\n      head_sha: headSha?.trim() || null,\r\n      branch_name:\r\n        trimmedBranch && trimmedBranch !== 'HEAD' ? trimmedBranch : null,\r\n    }\r\n  } catch (err) {\r\n    logError(err)\r\n    return null\r\n  }\r\n}\r\n\r\nfunction isLocalHost(host: string): boolean {\r\n  const hostWithoutPort = host.split(':')[0] ?? ''\r\n  return (\r\n    hostWithoutPort === 'localhost' ||\r\n    /^127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/.test(hostWithoutPort)\r\n  )\r\n}\r\n\r\n/**\r\n * Checks if the current working directory appears to be a bare git repository\r\n * or has been manipulated to look like one (sandbox escape attack vector).\r\n *\r\n * SECURITY: Git's is_git_directory() function (setup.c:417-455) checks for:\r\n * 1. HEAD file - Must be a valid ref\r\n * 2. objects/ directory - Must exist and be accessible\r\n * 3. refs/ directory - Must exist and be accessible\r\n *\r\n * If all three exist in the current directory (not in a .git subdirectory),\r\n * Git treats the current directory as a bare repository and will execute\r\n * hooks/pre-commit and other hook scripts from the cwd.\r\n *\r\n * Attack scenario:\r\n * 1. Attacker creates HEAD, objects/, refs/, and hooks/pre-commit in cwd\r\n * 2. Attacker deletes or corrupts .git/HEAD to invalidate the normal git directory\r\n * 3. When user runs 'git status', Git treats cwd as the git dir and runs the hook\r\n *\r\n * @returns true if the cwd looks like a bare/exploited git directory\r\n */\r\n/* eslint-disable custom-rules/no-sync-fs -- sync permission-eval check */\r\nexport function isCurrentDirectoryBareGitRepo(): boolean {\r\n  const fs = getFsImplementation()\r\n  const cwd = getCwd()\r\n\r\n  const gitPath = join(cwd, '.git')\r\n  try {\r\n    const stats = fs.statSync(gitPath)\r\n    if (stats.isFile()) {\r\n      // worktree/submodule \u2014 Git follows the gitdir reference\r\n      return false\r\n    }\r\n    if (stats.isDirectory()) {\r\n      const gitHeadPath = join(gitPath, 'HEAD')\r\n      try {\r\n        // SECURITY: check isFile(). An attacker creating .git/HEAD as a\r\n        // DIRECTORY would pass a bare statSync but Git's setup_git_directory\r\n        // rejects it (not a valid HEAD) and falls back to cwd discovery.\r\n        if (fs.statSync(gitHeadPath).isFile()) {\r\n          // normal repo \u2014 .git/HEAD valid, Git won't fall back to cwd\r\n          return false\r\n        }\r\n        // .git/HEAD exists but is not a regular file \u2014 fall through\r\n      } catch {\r\n        // .git exists but no HEAD \u2014 fall through to bare-repo check\r\n      }\r\n    }\r\n  } catch {\r\n    // no .git \u2014 fall through to bare-repo indicator check\r\n  }\r\n\r\n  // No valid .git/HEAD found. Check if cwd has bare git repo indicators.\r\n  // Be cautious \u2014 flag if ANY of these exist without a valid .git reference.\r\n  // Per-indicator try/catch so an error on one doesn't mask another.\r\n  try {\r\n    if (fs.statSync(join(cwd, 'HEAD')).isFile()) return true\r\n  } catch {\r\n    // no HEAD\r\n  }\r\n  try {\r\n    if (fs.statSync(join(cwd, 'objects')).isDirectory()) return true\r\n  } catch {\r\n    // no objects/\r\n  }\r\n  try {\r\n    if (fs.statSync(join(cwd, 'refs')).isDirectory()) return true\r\n  } catch {\r\n    // no refs/\r\n  }\r\n  return false\r\n}\r\n/* eslint-enable custom-rules/no-sync-fs */\r\n", "import { appendFile, mkdir, readFile, writeFile } from 'fs/promises'\nimport { homedir } from 'os'\nimport { dirname, join } from 'path'\nimport { getCwd } from '../cwd.js'\nimport { getErrnoCode } from '../errors.js'\nimport { execFileNoThrowWithCwd } from '../execFileNoThrow.js'\nimport { dirIsInGitRepo } from '../git.js'\nimport { logError } from '../log.js'\n\n/**\n * Checks if a path is ignored by git (via `git check-ignore`).\n *\n * This consults all applicable gitignore sources: repo `.gitignore` files\n * (nested), `.git/info/exclude`, and the global gitignore \u2014 with correct\n * precedence, because git itself resolves it.\n *\n * Exit codes: 0 = ignored, 1 = not ignored, 128 = not in a git repo.\n * Returns `false` for 128, so callers outside a git repo fail open.\n *\n * @param filePath The path to check (absolute or relative to cwd)\n * @param cwd The working directory to run git from\n */\nexport async function isPathGitignored(\n  filePath: string,\n  cwd: string,\n): Promise<boolean> {\n  const { code } = await execFileNoThrowWithCwd(\n    'git',\n    ['check-ignore', filePath],\n    {\n      preserveOutputOnError: false,\n      cwd,\n    },\n  )\n\n  return code === 0\n}\n\n/**\n * Gets the path to the global gitignore file (.config/git/ignore)\n * @returns The path to the global gitignore file\n */\nexport function getGlobalGitignorePath(): string {\n  return join(homedir(), '.config', 'git', 'ignore')\n}\n\n/**\n * Adds a file pattern to the global gitignore file (.config/git/ignore)\n * if it's not already ignored by existing patterns in any gitignore file\n * @param filename The filename to add to gitignore\n * @param cwd The current working directory (optional)\n */\nexport async function addFileGlobRuleToGitignore(\n  filename: string,\n  cwd: string = getCwd(),\n): Promise<void> {\n  try {\n    if (!(await dirIsInGitRepo(cwd))) {\n      return\n    }\n\n    // First check if the pattern is already ignored by any gitignore file (including global)\n    const gitignoreEntry = `**/${filename}`\n    // For directory patterns (ending with /), check with a sample file inside\n    const testPath = filename.endsWith('/')\n      ? `${filename}sample-file.txt`\n      : filename\n    if (await isPathGitignored(testPath, cwd)) {\n      // File is already ignored by existing patterns (local or global)\n      return\n    }\n\n    // Use the global gitignore file in .config/git/ignore\n    const globalGitignorePath = getGlobalGitignorePath()\n\n    // Create the directory if it doesn't exist\n    const configGitDir = dirname(globalGitignorePath)\n    await mkdir(configGitDir, { recursive: true })\n\n    // Add the entry to the global gitignore\n    try {\n      const content = await readFile(globalGitignorePath, { encoding: 'utf-8' })\n      if (content.includes(gitignoreEntry)) {\n        return // Pattern already exists, don't add again\n      }\n      await appendFile(globalGitignorePath, `\\n${gitignoreEntry}\\n`)\n    } catch (e: unknown) {\n      const code = getErrnoCode(e)\n      if (code === 'ENOENT') {\n        // Create global gitignore with entry\n        await writeFile(globalGitignorePath, `${gitignoreEntry}\\n`, 'utf-8')\n      } else {\n        throw e\n      }\n    }\n  } catch (error) {\n    logError(error)\n  }\n}\n", "import { open, readFile, stat } from 'fs/promises'\nimport {\n  applyEdits,\n  modify,\n  parse as parseJsonc,\n} from 'jsonc-parser/lib/esm/main.js'\nimport { stripBOM } from './jsonRead.js'\nimport { logError } from './log.js'\nimport { memoizeWithLRU } from './memoize.js'\nimport { jsonStringify } from './slowOperations.js'\n\ntype CachedParse = { ok: true; value: unknown } | { ok: false }\n\n// Memoized inner parse. Uses a discriminated-union wrapper because:\n// 1. memoizeWithLRU requires NonNullable<unknown>, but JSON.parse can return\n//    null (e.g. JSON.parse(\"null\")).\n// 2. Invalid JSON must also be cached \u2014 otherwise repeated calls with the same\n//    bad string re-parse and re-log every time (behavioral regression vs the\n//    old lodash memoize which wrapped the entire try/catch).\n// Bounded to 50 entries to prevent unbounded memory growth \u2014 previously this\n// used lodash memoize which cached every unique JSON string forever (settings,\n// .mcp.json, notebooks, tool results), causing a significant memory leak.\n// Note: shouldLogError is intentionally excluded from the cache key (matching\n// lodash memoize default resolver = first arg only).\n// Skip caching above this size \u2014 the LRU stores the full string as the key,\n// so a 200KB config file would pin ~10MB in #keyList across 50 slots. Large\n// inputs like ~/.claude.json also change between reads (numStartups bumps on\n// every CC startup), so the cache never hits anyway.\nconst PARSE_CACHE_MAX_KEY_BYTES = 8 * 1024\n\nfunction parseJSONUncached(json: string, shouldLogError: boolean): CachedParse {\n  try {\n    return { ok: true, value: JSON.parse(stripBOM(json)) }\n  } catch (e) {\n    if (shouldLogError) {\n      logError(e)\n    }\n    return { ok: false }\n  }\n}\n\nconst parseJSONCached = memoizeWithLRU(parseJSONUncached, json => json, 50)\n\n// Important: memoized for performance (LRU-bounded to 50 entries, small inputs only).\nexport const safeParseJSON = Object.assign(\n  function safeParseJSON(\n    json: string | null | undefined,\n    shouldLogError: boolean = true,\n  ): unknown {\n    if (!json) return null\n    const result =\n      json.length > PARSE_CACHE_MAX_KEY_BYTES\n        ? parseJSONUncached(json, shouldLogError)\n        : parseJSONCached(json, shouldLogError)\n    return result.ok ? result.value : null\n  },\n  { cache: parseJSONCached.cache },\n)\n\n/**\n * Safely parse JSON with comments (jsonc).\n * This is useful for VS Code configuration files like keybindings.json\n * which support comments and other jsonc features.\n */\nexport function safeParseJSONC(json: string | null | undefined): unknown {\n  if (!json) {\n    return null\n  }\n  try {\n    // Strip BOM before parsing - PowerShell 5.x adds BOM to UTF-8 files\n    return parseJsonc(stripBOM(json))\n  } catch (e) {\n    logError(e)\n    return null\n  }\n}\n\n/**\n * Modify a jsonc string by adding a new item to an array, preserving comments and formatting.\n * @param content The jsonc string to modify\n * @param newItem The new item to add to the array\n * @returns The modified jsonc string\n */\n/**\n * Bun.JSONL.parseChunk if available, false otherwise.\n * Supports both strings and Buffers, minimizing memory usage and copies.\n * Also handles BOM stripping internally.\n */\ntype BunJSONLParseChunk = (\n  data: string | Buffer,\n  offset?: number,\n) => { values: unknown[]; error: null | Error; read: number; done: boolean }\n\nconst bunJSONLParse: BunJSONLParseChunk | false = (() => {\n  if (typeof Bun === 'undefined') return false\n  const b = Bun as Record<string, unknown>\n  const jsonl = b.JSONL as Record<string, unknown> | undefined\n  if (!jsonl?.parseChunk) return false\n  return jsonl.parseChunk as BunJSONLParseChunk\n})()\n\nfunction parseJSONLBun<T>(data: string | Buffer): T[] {\n  const parse = bunJSONLParse as BunJSONLParseChunk\n  const len = data.length\n  const result = parse(data)\n  if (!result.error || result.done || result.read >= len) {\n    return result.values as T[]\n  }\n  // Had an error mid-stream \u2014 collect what we got and keep going\n  let values = result.values as T[]\n  let offset = result.read\n  while (offset < len) {\n    const newlineIndex =\n      typeof data === 'string'\n        ? data.indexOf('\\n', offset)\n        : data.indexOf(0x0a, offset)\n    if (newlineIndex === -1) break\n    offset = newlineIndex + 1\n    const next = parse(data, offset)\n    if (next.values.length > 0) {\n      values = values.concat(next.values as T[])\n    }\n    if (!next.error || next.done || next.read >= len) break\n    offset = next.read\n  }\n  return values\n}\n\nfunction parseJSONLBuffer<T>(buf: Buffer): T[] {\n  const bufLen = buf.length\n  let start = 0\n\n  // Strip UTF-8 BOM (EF BB BF)\n  if (buf[0] === 0xef && buf[1] === 0xbb && buf[2] === 0xbf) {\n    start = 3\n  }\n\n  const results: T[] = []\n  while (start < bufLen) {\n    let end = buf.indexOf(0x0a, start)\n    if (end === -1) end = bufLen\n\n    const line = buf.toString('utf8', start, end).trim()\n    start = end + 1\n    if (!line) continue\n    try {\n      results.push(JSON.parse(line) as T)\n    } catch {\n      // Skip malformed lines\n    }\n  }\n  return results\n}\n\nfunction parseJSONLString<T>(data: string): T[] {\n  const stripped = stripBOM(data)\n  const len = stripped.length\n  let start = 0\n\n  const results: T[] = []\n  while (start < len) {\n    let end = stripped.indexOf('\\n', start)\n    if (end === -1) end = len\n\n    const line = stripped.substring(start, end).trim()\n    start = end + 1\n    if (!line) continue\n    try {\n      results.push(JSON.parse(line) as T)\n    } catch {\n      // Skip malformed lines\n    }\n  }\n  return results\n}\n\n/**\n * Parses JSONL data from a string or Buffer, skipping malformed lines.\n * Uses Bun.JSONL.parseChunk when available for better performance,\n * falls back to indexOf-based scanning otherwise.\n */\nexport function parseJSONL<T>(data: string | Buffer): T[] {\n  if (bunJSONLParse) {\n    return parseJSONLBun<T>(data)\n  }\n  if (typeof data === 'string') {\n    return parseJSONLString<T>(data)\n  }\n  return parseJSONLBuffer<T>(data)\n}\n\nconst MAX_JSONL_READ_BYTES = 100 * 1024 * 1024\n\n/**\n * Reads and parses a JSONL file, reading at most the last 100 MB.\n * For files larger than 100 MB, reads the tail and skips the first partial line.\n *\n * 100 MB is more than sufficient since the longest context window we support\n * is ~2M tokens, which is well under 100 MB of JSONL.\n */\nexport async function readJSONLFile<T>(filePath: string): Promise<T[]> {\n  const { size } = await stat(filePath)\n  if (size <= MAX_JSONL_READ_BYTES) {\n    return parseJSONL<T>(await readFile(filePath))\n  }\n  await using fd = await open(filePath, 'r')\n  const buf = Buffer.allocUnsafe(MAX_JSONL_READ_BYTES)\n  let totalRead = 0\n  const fileOffset = size - MAX_JSONL_READ_BYTES\n  while (totalRead < MAX_JSONL_READ_BYTES) {\n    const { bytesRead } = await fd.read(\n      buf,\n      totalRead,\n      MAX_JSONL_READ_BYTES - totalRead,\n      fileOffset + totalRead,\n    )\n    if (bytesRead === 0) break\n    totalRead += bytesRead\n  }\n  // Skip the first partial line\n  const newlineIndex = buf.indexOf(0x0a)\n  if (newlineIndex !== -1 && newlineIndex < totalRead - 1) {\n    return parseJSONL<T>(buf.subarray(newlineIndex + 1, totalRead))\n  }\n  return parseJSONL<T>(buf.subarray(0, totalRead))\n}\n\nexport function addItemToJSONCArray(content: string, newItem: unknown): string {\n  try {\n    // If the content is empty or whitespace, create a new JSON file\n    if (!content || content.trim() === '') {\n      return jsonStringify([newItem], null, 4)\n    }\n\n    // Strip BOM before parsing - PowerShell 5.x adds BOM to UTF-8 files\n    const cleanContent = stripBOM(content)\n\n    // Parse the content to check if it's valid JSON\n    const parsedContent = parseJsonc(cleanContent)\n\n    // If the parsed content is a valid array, modify it\n    if (Array.isArray(parsedContent)) {\n      // Get the length of the array\n      const arrayLength = parsedContent.length\n\n      // Determine if we are dealing with an empty array\n      const isEmpty = arrayLength === 0\n\n      // If it's an empty array we want to add at index 0, otherwise append to the end\n      const insertPath = isEmpty ? [0] : [arrayLength]\n\n      // Generate edits - we're using isArrayInsertion to add a new item without overwriting existing ones\n      const edits = modify(cleanContent, insertPath, newItem, {\n        formattingOptions: { insertSpaces: true, tabSize: 4 },\n        isArrayInsertion: true,\n      })\n\n      // If edits could not be generated, fall back to manual JSON string manipulation\n      if (!edits || edits.length === 0) {\n        const copy = [...parsedContent, newItem]\n        return jsonStringify(copy, null, 4)\n      }\n\n      // Apply the edits to preserve comments (use cleanContent without BOM)\n      return applyEdits(cleanContent, edits)\n    }\n    // If it's not an array at all, create a new array with the item\n    else {\n      // If the content exists but is not an array, we'll replace it completely\n      return jsonStringify([newItem], null, 4)\n    }\n  } catch (e) {\n    // If parsing fails for any reason, log the error and fallback to creating a new JSON array\n    logError(e)\n    return jsonStringify([newItem], null, 4)\n  }\n}\n", "/**\n * Shared Intl object instances with lazy initialization.\n *\n * Intl constructors are expensive (~0.05-0.1ms each), so we cache instances\n * for reuse across the codebase instead of creating new ones each time.\n * Lazy initialization ensures we only pay the cost when actually needed.\n */\n\n// Segmenters for Unicode text processing (lazily initialized)\nlet graphemeSegmenter: Intl.Segmenter | null = null\nlet wordSegmenter: Intl.Segmenter | null = null\n\nexport function getGraphemeSegmenter(): Intl.Segmenter {\n  if (!graphemeSegmenter) {\n    graphemeSegmenter = new Intl.Segmenter(undefined, {\n      granularity: 'grapheme',\n    })\n  }\n  return graphemeSegmenter\n}\n\n/**\n * Extract the first grapheme cluster from a string.\n * Returns '' for empty strings.\n */\nexport function firstGrapheme(text: string): string {\n  if (!text) return ''\n  const segments = getGraphemeSegmenter().segment(text)\n  const first = segments[Symbol.iterator]().next().value\n  return first?.segment ?? ''\n}\n\n/**\n * Extract the last grapheme cluster from a string.\n * Returns '' for empty strings.\n */\nexport function lastGrapheme(text: string): string {\n  if (!text) return ''\n  let last = ''\n  for (const { segment } of getGraphemeSegmenter().segment(text)) {\n    last = segment\n  }\n  return last\n}\n\nexport function getWordSegmenter(): Intl.Segmenter {\n  if (!wordSegmenter) {\n    wordSegmenter = new Intl.Segmenter(undefined, { granularity: 'word' })\n  }\n  return wordSegmenter\n}\n\n// RelativeTimeFormat cache (keyed by style:numeric)\nconst rtfCache = new Map<string, Intl.RelativeTimeFormat>()\n\nexport function getRelativeTimeFormat(\n  style: 'long' | 'short' | 'narrow',\n  numeric: 'always' | 'auto',\n): Intl.RelativeTimeFormat {\n  const key = `${style}:${numeric}`\n  let rtf = rtfCache.get(key)\n  if (!rtf) {\n    rtf = new Intl.RelativeTimeFormat('en', { style, numeric })\n    rtfCache.set(key, rtf)\n  }\n  return rtf\n}\n\n// Timezone is constant for the process lifetime\nlet cachedTimeZone: string | null = null\n\nexport function getTimeZone(): string {\n  if (!cachedTimeZone) {\n    cachedTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone\n  }\n  return cachedTimeZone\n}\n\n// System locale language subtag (e.g. 'en', 'ja') is constant for the process\n// lifetime. null = not yet computed; undefined = computed but unavailable (so\n// a stripped-ICU environment fails once instead of retrying on every call).\nlet cachedSystemLocaleLanguage: string | undefined | null = null\n\nexport function getSystemLocaleLanguage(): string | undefined {\n  if (cachedSystemLocaleLanguage === null) {\n    try {\n      const locale = Intl.DateTimeFormat().resolvedOptions().locale\n      cachedSystemLocaleLanguage = new Intl.Locale(locale).language\n    } catch {\n      cachedSystemLocaleLanguage = undefined\n    }\n  }\n  return cachedSystemLocaleLanguage\n}\n", "import emojiRegex from 'emoji-regex'\nimport { eastAsianWidth } from 'get-east-asian-width'\nimport stripAnsi from 'strip-ansi'\nimport { getGraphemeSegmenter } from '../utils/intl.js'\n\nconst EMOJI_REGEX = emojiRegex()\n\n/**\n * Fallback JavaScript implementation of stringWidth when Bun.stringWidth is not available.\n *\n * Get the display width of a string as it would appear in a terminal.\n *\n * This is a more accurate alternative to the string-width package that correctly handles\n * characters like \u26A0 (U+26A0) which string-width incorrectly reports as width 2.\n *\n * The implementation uses eastAsianWidth directly with ambiguousAsWide: false,\n * which correctly treats ambiguous-width characters as narrow (width 1) as\n * recommended by the Unicode standard for Western contexts.\n */\nfunction stringWidthJavaScript(str: string): number {\n  if (typeof str !== 'string' || str.length === 0) {\n    return 0\n  }\n\n  // Fast path: pure ASCII string (no ANSI codes, no wide chars)\n  let isPureAscii = true\n  for (let i = 0; i < str.length; i++) {\n    const code = str.charCodeAt(i)\n    // Check for non-ASCII or ANSI escape (0x1b)\n    if (code >= 127 || code === 0x1b) {\n      isPureAscii = false\n      break\n    }\n  }\n  if (isPureAscii) {\n    // Count printable characters (exclude control chars)\n    let width = 0\n    for (let i = 0; i < str.length; i++) {\n      const code = str.charCodeAt(i)\n      if (code > 0x1f) {\n        width++\n      }\n    }\n    return width\n  }\n\n  // Strip ANSI if escape character is present\n  if (str.includes('\\x1b')) {\n    str = stripAnsi(str)\n    if (str.length === 0) {\n      return 0\n    }\n  }\n\n  // Fast path: simple Unicode (no emoji, variation selectors, or joiners)\n  if (!needsSegmentation(str)) {\n    let width = 0\n    for (const char of str) {\n      const codePoint = char.codePointAt(0)!\n      if (!isZeroWidth(codePoint)) {\n        width += eastAsianWidth(codePoint, { ambiguousAsWide: false })\n      }\n    }\n    return width\n  }\n\n  let width = 0\n\n  for (const { segment: grapheme } of getGraphemeSegmenter().segment(str)) {\n    // Check for emoji first (most emoji sequences are width 2)\n    EMOJI_REGEX.lastIndex = 0\n    if (EMOJI_REGEX.test(grapheme)) {\n      width += getEmojiWidth(grapheme)\n      continue\n    }\n\n    // Calculate width for non-emoji graphemes\n    // For grapheme clusters (like Devanagari conjuncts with virama+ZWJ), only count\n    // the first non-zero-width character's width since the cluster renders as one glyph\n    for (const char of grapheme) {\n      const codePoint = char.codePointAt(0)!\n      if (!isZeroWidth(codePoint)) {\n        width += eastAsianWidth(codePoint, { ambiguousAsWide: false })\n        break\n      }\n    }\n  }\n\n  return width\n}\n\nfunction needsSegmentation(str: string): boolean {\n  for (const char of str) {\n    const cp = char.codePointAt(0)!\n    // Emoji ranges\n    if (cp >= 0x1f300 && cp <= 0x1faff) return true\n    if (cp >= 0x2600 && cp <= 0x27bf) return true\n    if (cp >= 0x1f1e6 && cp <= 0x1f1ff) return true\n    // Variation selectors, ZWJ\n    if (cp >= 0xfe00 && cp <= 0xfe0f) return true\n    if (cp === 0x200d) return true\n  }\n  return false\n}\n\nfunction getEmojiWidth(grapheme: string): number {\n  // Regional indicators: single = 1, pair = 2\n  const first = grapheme.codePointAt(0)!\n  if (first >= 0x1f1e6 && first <= 0x1f1ff) {\n    let count = 0\n    for (const _ of grapheme) count++\n    return count === 1 ? 1 : 2\n  }\n\n  // Incomplete keycap: digit/symbol + VS16 without U+20E3\n  if (grapheme.length === 2) {\n    const second = grapheme.codePointAt(1)\n    if (\n      second === 0xfe0f &&\n      ((first >= 0x30 && first <= 0x39) || first === 0x23 || first === 0x2a)\n    ) {\n      return 1\n    }\n  }\n\n  return 2\n}\n\nfunction isZeroWidth(codePoint: number): boolean {\n  // Fast path for common printable range\n  if (codePoint >= 0x20 && codePoint < 0x7f) return false\n  if (codePoint >= 0xa0 && codePoint < 0x0300) return codePoint === 0x00ad\n\n  // Control characters\n  if (codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f)) return true\n\n  // Zero-width and invisible characters\n  if (\n    (codePoint >= 0x200b && codePoint <= 0x200d) || // ZW space/joiner\n    codePoint === 0xfeff || // BOM\n    (codePoint >= 0x2060 && codePoint <= 0x2064) // Word joiner etc.\n  ) {\n    return true\n  }\n\n  // Variation selectors\n  if (\n    (codePoint >= 0xfe00 && codePoint <= 0xfe0f) ||\n    (codePoint >= 0xe0100 && codePoint <= 0xe01ef)\n  ) {\n    return true\n  }\n\n  // Combining diacritical marks\n  if (\n    (codePoint >= 0x0300 && codePoint <= 0x036f) ||\n    (codePoint >= 0x1ab0 && codePoint <= 0x1aff) ||\n    (codePoint >= 0x1dc0 && codePoint <= 0x1dff) ||\n    (codePoint >= 0x20d0 && codePoint <= 0x20ff) ||\n    (codePoint >= 0xfe20 && codePoint <= 0xfe2f)\n  ) {\n    return true\n  }\n\n  // Indic script combining marks (covers Devanagari through Malayalam)\n  if (codePoint >= 0x0900 && codePoint <= 0x0d4f) {\n    // Signs and vowel marks at start of each script block\n    const offset = codePoint & 0x7f\n    if (offset <= 0x03) return true // Signs at block start\n    if (offset >= 0x3a && offset <= 0x4f) return true // Vowel signs, virama\n    if (offset >= 0x51 && offset <= 0x57) return true // Stress signs\n    if (offset >= 0x62 && offset <= 0x63) return true // Vowel signs\n  }\n\n  // Thai/Lao combining marks\n  // Note: U+0E32 (SARA AA), U+0E33 (SARA AM), U+0EB2, U+0EB3 are spacing vowels (width 1), not combining marks\n  if (\n    codePoint === 0x0e31 || // Thai MAI HAN-AKAT\n    (codePoint >= 0x0e34 && codePoint <= 0x0e3a) || // Thai vowel signs (skip U+0E32, U+0E33)\n    (codePoint >= 0x0e47 && codePoint <= 0x0e4e) || // Thai vowel signs and marks\n    codePoint === 0x0eb1 || // Lao MAI KAN\n    (codePoint >= 0x0eb4 && codePoint <= 0x0ebc) || // Lao vowel signs (skip U+0EB2, U+0EB3)\n    (codePoint >= 0x0ec8 && codePoint <= 0x0ecd) // Lao tone marks\n  ) {\n    return true\n  }\n\n  // Arabic formatting\n  if (\n    (codePoint >= 0x0600 && codePoint <= 0x0605) ||\n    codePoint === 0x06dd ||\n    codePoint === 0x070f ||\n    codePoint === 0x08e2\n  ) {\n    return true\n  }\n\n  // Surrogates, tag characters\n  if (codePoint >= 0xd800 && codePoint <= 0xdfff) return true\n  if (codePoint >= 0xe0000 && codePoint <= 0xe007f) return true\n\n  return false\n}\n\n// Note: complex-script graphemes like Devanagari \u0915\u094D\u0937 (ka+virama+ZWJ+ssa) render\n// as a single ligature glyph but occupy 2 terminal cells (wcwidth sums the base\n// consonants). Bun.stringWidth=2 matches terminal cell allocation, which is what\n// we need for cursor positioning \u2014 the JS fallback's grapheme-cluster width of 1\n// would desync Ink's layout from the terminal.\n//\n// Bun.stringWidth is resolved once at module scope rather than checked on every\n// call \u2014 typeof guards deopt property access and this is a hot path (~100k calls/frame).\nconst bunStringWidth =\n  typeof Bun !== 'undefined' && typeof Bun.stringWidth === 'function'\n    ? Bun.stringWidth\n    : null\n\nconst BUN_STRING_WIDTH_OPTS = { ambiguousIsNarrow: true } as const\n\nexport const stringWidth: (str: string) => number = bunStringWidth\n  ? str => bunStringWidth(str, BUN_STRING_WIDTH_OPTS)\n  : stringWidthJavaScript\n", "// Width-aware truncation/wrapping \u2014 needs ink/stringWidth (not leaf-safe).\n\nimport { stringWidth } from '../ink/stringWidth.js'\nimport { getGraphemeSegmenter } from './intl.js'\n\n/**\n * Truncates a file path in the middle to preserve both directory context and filename.\n * Width-aware: uses stringWidth() for correct CJK/emoji measurement.\n * For example: \"src/components/deeply/nested/folder/MyComponent.tsx\" becomes\n * \"src/components/\u2026/MyComponent.tsx\" when maxLength is 30.\n *\n * @param path The file path to truncate\n * @param maxLength Maximum display width of the result in terminal columns (must be > 0)\n * @returns The truncated path, or original if it fits within maxLength\n */\nexport function truncatePathMiddle(path: string, maxLength: number): string {\n  // No truncation needed\n  if (stringWidth(path) <= maxLength) {\n    return path\n  }\n\n  // Handle edge case of very small or non-positive maxLength\n  if (maxLength <= 0) {\n    return '\u2026'\n  }\n\n  // Need at least room for \"\u2026\" + something meaningful\n  if (maxLength < 5) {\n    return truncateToWidth(path, maxLength)\n  }\n\n  // Find the filename (last path segment)\n  const lastSlash = path.lastIndexOf('/')\n  // Include the leading slash in filename for display\n  const filename = lastSlash >= 0 ? path.slice(lastSlash) : path\n  const directory = lastSlash >= 0 ? path.slice(0, lastSlash) : ''\n  const filenameWidth = stringWidth(filename)\n\n  // If filename alone is too long, truncate from start\n  if (filenameWidth >= maxLength - 1) {\n    return truncateStartToWidth(path, maxLength)\n  }\n\n  // Calculate space available for directory prefix\n  // Result format: directory + \"\u2026\" + filename\n  const availableForDir = maxLength - 1 - filenameWidth // -1 for ellipsis\n\n  if (availableForDir <= 0) {\n    // No room for directory, just show filename (truncated if needed)\n    return truncateStartToWidth(filename, maxLength)\n  }\n\n  // Truncate directory and combine\n  const truncatedDir = truncateToWidthNoEllipsis(directory, availableForDir)\n  return truncatedDir + '\u2026' + filename\n}\n\n/**\n * Truncates a string to fit within a maximum display width, measured in terminal columns.\n * Splits on grapheme boundaries to avoid breaking emoji or surrogate pairs.\n * Appends '\u2026' when truncation occurs.\n */\nexport function truncateToWidth(text: string, maxWidth: number): string {\n  if (stringWidth(text) <= maxWidth) return text\n  if (maxWidth <= 1) return '\u2026'\n  let width = 0\n  let result = ''\n  for (const { segment } of getGraphemeSegmenter().segment(text)) {\n    const segWidth = stringWidth(segment)\n    if (width + segWidth > maxWidth - 1) break\n    result += segment\n    width += segWidth\n  }\n  return result + '\u2026'\n}\n\n/**\n * Truncates from the start of a string, keeping the tail end.\n * Prepends '\u2026' when truncation occurs.\n * Width-aware and grapheme-safe.\n */\nexport function truncateStartToWidth(text: string, maxWidth: number): string {\n  if (stringWidth(text) <= maxWidth) return text\n  if (maxWidth <= 1) return '\u2026'\n  const segments = [...getGraphemeSegmenter().segment(text)]\n  let width = 0\n  let startIdx = segments.length\n  for (let i = segments.length - 1; i >= 0; i--) {\n    const segWidth = stringWidth(segments[i]!.segment)\n    if (width + segWidth > maxWidth - 1) break // -1 for '\u2026'\n    width += segWidth\n    startIdx = i\n  }\n  return (\n    '\u2026' +\n    segments\n      .slice(startIdx)\n      .map(s => s.segment)\n      .join('')\n  )\n}\n\n/**\n * Truncates a string to fit within a maximum display width, without appending an ellipsis.\n * Useful when the caller adds its own separator (e.g. middle-truncation with '\u2026' between parts).\n * Width-aware and grapheme-safe.\n */\nexport function truncateToWidthNoEllipsis(\n  text: string,\n  maxWidth: number,\n): string {\n  if (stringWidth(text) <= maxWidth) return text\n  if (maxWidth <= 0) return ''\n  let width = 0\n  let result = ''\n  for (const { segment } of getGraphemeSegmenter().segment(text)) {\n    const segWidth = stringWidth(segment)\n    if (width + segWidth > maxWidth) break\n    result += segment\n    width += segWidth\n  }\n  return result\n}\n\n/**\n * Truncates a string to fit within a maximum display width (terminal columns),\n * splitting on grapheme boundaries to avoid breaking emoji, CJK, or surrogate pairs.\n * Appends '\u2026' when truncation occurs.\n * @param str The string to truncate\n * @param maxWidth Maximum display width in terminal columns\n * @param singleLine If true, also truncates at the first newline\n * @returns The truncated string with ellipsis if needed\n */\nexport function truncate(\n  str: string,\n  maxWidth: number,\n  singleLine: boolean = false,\n): string {\n  let result = str\n\n  // If singleLine is true, truncate at first newline\n  if (singleLine) {\n    const firstNewline = str.indexOf('\\n')\n    if (firstNewline !== -1) {\n      result = str.substring(0, firstNewline)\n      // Ensure total width including ellipsis doesn't exceed maxWidth\n      if (stringWidth(result) + 1 > maxWidth) {\n        return truncateToWidth(result, maxWidth)\n      }\n      return `${result}\u2026`\n    }\n  }\n\n  if (stringWidth(result) <= maxWidth) {\n    return result\n  }\n  return truncateToWidth(result, maxWidth)\n}\n\nexport function wrapText(text: string, width: number): string[] {\n  const lines: string[] = []\n  let currentLine = ''\n  let currentWidth = 0\n\n  for (const { segment } of getGraphemeSegmenter().segment(text)) {\n    const segWidth = stringWidth(segment)\n    if (currentWidth + segWidth <= width) {\n      currentLine += segment\n      currentWidth += segWidth\n    } else {\n      if (currentLine) lines.push(currentLine)\n      currentLine = segment\n      currentWidth = segWidth\n    }\n  }\n\n  if (currentLine) lines.push(currentLine)\n  return lines\n}\n", "// Pure display formatters \u2014 leaf-safe (no Ink). Width-aware truncation lives in ./truncate.ts.\n\nimport { getRelativeTimeFormat, getTimeZone } from './intl.js'\n\n/**\n * Formats a byte count to a human-readable string (KB, MB, GB).\n * @example formatFileSize(1536) \u2192 \"1.5KB\"\n */\nexport function formatFileSize(sizeInBytes: number): string {\n  const kb = sizeInBytes / 1024\n  if (kb < 1) {\n    return `${sizeInBytes} bytes`\n  }\n  if (kb < 1024) {\n    return `${kb.toFixed(1).replace(/\\.0$/, '')}KB`\n  }\n  const mb = kb / 1024\n  if (mb < 1024) {\n    return `${mb.toFixed(1).replace(/\\.0$/, '')}MB`\n  }\n  const gb = mb / 1024\n  return `${gb.toFixed(1).replace(/\\.0$/, '')}GB`\n}\n\n/**\n * Formats milliseconds as seconds with 1 decimal place (e.g. `1234` \u2192 `\"1.2s\"`).\n * Unlike formatDuration, always keeps the decimal \u2014 use for sub-minute timings\n * where the fractional second is meaningful (TTFT, hook durations, etc.).\n */\nexport function formatSecondsShort(ms: number): string {\n  return `${(ms / 1000).toFixed(1)}s`\n}\n\nexport function formatDuration(\n  ms: number,\n  options?: { hideTrailingZeros?: boolean; mostSignificantOnly?: boolean },\n): string {\n  if (ms < 60000) {\n    // Special case for 0\n    if (ms === 0) {\n      return '0s'\n    }\n    // For durations < 1s, show 1 decimal place (e.g., 0.5s)\n    if (ms < 1) {\n      const s = (ms / 1000).toFixed(1)\n      return `${s}s`\n    }\n    const s = Math.floor(ms / 1000).toString()\n    return `${s}s`\n  }\n\n  let days = Math.floor(ms / 86400000)\n  let hours = Math.floor((ms % 86400000) / 3600000)\n  let minutes = Math.floor((ms % 3600000) / 60000)\n  let seconds = Math.round((ms % 60000) / 1000)\n\n  // Handle rounding carry-over (e.g., 59.5s rounds to 60s)\n  if (seconds === 60) {\n    seconds = 0\n    minutes++\n  }\n  if (minutes === 60) {\n    minutes = 0\n    hours++\n  }\n  if (hours === 24) {\n    hours = 0\n    days++\n  }\n\n  const hide = options?.hideTrailingZeros\n\n  if (options?.mostSignificantOnly) {\n    if (days > 0) return `${days}d`\n    if (hours > 0) return `${hours}h`\n    if (minutes > 0) return `${minutes}m`\n    return `${seconds}s`\n  }\n\n  if (days > 0) {\n    if (hide && hours === 0 && minutes === 0) return `${days}d`\n    if (hide && minutes === 0) return `${days}d ${hours}h`\n    return `${days}d ${hours}h ${minutes}m`\n  }\n  if (hours > 0) {\n    if (hide && minutes === 0 && seconds === 0) return `${hours}h`\n    if (hide && seconds === 0) return `${hours}h ${minutes}m`\n    return `${hours}h ${minutes}m ${seconds}s`\n  }\n  if (minutes > 0) {\n    if (hide && seconds === 0) return `${minutes}m`\n    return `${minutes}m ${seconds}s`\n  }\n  return `${seconds}s`\n}\n\n// `new Intl.NumberFormat` is expensive, so cache formatters for reuse\nlet numberFormatterForConsistentDecimals: Intl.NumberFormat | null = null\nlet numberFormatterForInconsistentDecimals: Intl.NumberFormat | null = null\nconst getNumberFormatter = (\n  useConsistentDecimals: boolean,\n): Intl.NumberFormat => {\n  if (useConsistentDecimals) {\n    if (!numberFormatterForConsistentDecimals) {\n      numberFormatterForConsistentDecimals = new Intl.NumberFormat('en-US', {\n        notation: 'compact',\n        maximumFractionDigits: 1,\n        minimumFractionDigits: 1,\n      })\n    }\n    return numberFormatterForConsistentDecimals\n  } else {\n    if (!numberFormatterForInconsistentDecimals) {\n      numberFormatterForInconsistentDecimals = new Intl.NumberFormat('en-US', {\n        notation: 'compact',\n        maximumFractionDigits: 1,\n        minimumFractionDigits: 0,\n      })\n    }\n    return numberFormatterForInconsistentDecimals\n  }\n}\n\nexport function formatNumber(number: number): string {\n  // Only use minimumFractionDigits for numbers that will be shown in compact notation\n  const shouldUseConsistentDecimals = number >= 1000\n\n  return getNumberFormatter(shouldUseConsistentDecimals)\n    .format(number) // eg. \"1321\" => \"1.3K\", \"900\" => \"900\"\n    .toLowerCase() // eg. \"1.3K\" => \"1.3k\", \"1.0K\" => \"1.0k\"\n}\n\nexport function formatTokens(count: number): string {\n  return formatNumber(count).replace('.0', '')\n}\n\ntype RelativeTimeStyle = 'long' | 'short' | 'narrow'\n\ntype RelativeTimeOptions = {\n  style?: RelativeTimeStyle\n  numeric?: 'always' | 'auto'\n}\n\nexport function formatRelativeTime(\n  date: Date,\n  options: RelativeTimeOptions & { now?: Date } = {},\n): string {\n  const { style = 'narrow', numeric = 'always', now = new Date() } = options\n  const diffInMs = date.getTime() - now.getTime()\n  // Use Math.trunc to truncate towards zero for both positive and negative values\n  const diffInSeconds = Math.trunc(diffInMs / 1000)\n\n  // Define time intervals with custom short units\n  const intervals = [\n    { unit: 'year', seconds: 31536000, shortUnit: 'y' },\n    { unit: 'month', seconds: 2592000, shortUnit: 'mo' },\n    { unit: 'week', seconds: 604800, shortUnit: 'w' },\n    { unit: 'day', seconds: 86400, shortUnit: 'd' },\n    { unit: 'hour', seconds: 3600, shortUnit: 'h' },\n    { unit: 'minute', seconds: 60, shortUnit: 'm' },\n    { unit: 'second', seconds: 1, shortUnit: 's' },\n  ] as const\n\n  // Find the appropriate unit\n  for (const { unit, seconds: intervalSeconds, shortUnit } of intervals) {\n    if (Math.abs(diffInSeconds) >= intervalSeconds) {\n      const value = Math.trunc(diffInSeconds / intervalSeconds)\n      // For short style, use custom format\n      if (style === 'narrow') {\n        return diffInSeconds < 0\n          ? `${Math.abs(value)}${shortUnit} ago`\n          : `in ${value}${shortUnit}`\n      }\n      // For days and longer, use long style regardless of the style parameter\n      return getRelativeTimeFormat('long', numeric).format(value, unit)\n    }\n  }\n\n  // For values less than 1 second\n  if (style === 'narrow') {\n    return diffInSeconds <= 0 ? '0s ago' : 'in 0s'\n  }\n  return getRelativeTimeFormat(style, numeric).format(0, 'second')\n}\n\nexport function formatRelativeTimeAgo(\n  date: Date,\n  options: RelativeTimeOptions & { now?: Date } = {},\n): string {\n  const { now = new Date(), ...restOptions } = options\n  if (date > now) {\n    // For future dates, just return the relative time without \"ago\"\n    return formatRelativeTime(date, { ...restOptions, now })\n  }\n\n  // For past dates, force numeric: 'always' to ensure we get \"X units ago\"\n  return formatRelativeTime(date, { ...restOptions, numeric: 'always', now })\n}\n\n/**\n * Formats log metadata for display (time, size or message count, branch, tag, PR)\n */\nexport function formatLogMetadata(log: {\n  modified: Date\n  messageCount: number\n  fileSize?: number\n  gitBranch?: string\n  tag?: string\n  agentSetting?: string\n  prNumber?: number\n  prRepository?: string\n}): string {\n  const sizeOrCount =\n    log.fileSize !== undefined\n      ? formatFileSize(log.fileSize)\n      : `${log.messageCount} messages`\n  const parts = [\n    formatRelativeTimeAgo(log.modified, { style: 'short' }),\n    ...(log.gitBranch ? [log.gitBranch] : []),\n    sizeOrCount,\n  ]\n  if (log.tag) {\n    parts.push(`#${log.tag}`)\n  }\n  if (log.agentSetting) {\n    parts.push(`@${log.agentSetting}`)\n  }\n  if (log.prNumber) {\n    parts.push(\n      log.prRepository\n        ? `${log.prRepository}#${log.prNumber}`\n        : `#${log.prNumber}`,\n    )\n  }\n  return parts.join(' \u00B7 ')\n}\n\nexport function formatResetTime(\n  timestampInSeconds: number | undefined,\n  showTimezone: boolean = false,\n  showTime: boolean = true,\n): string | undefined {\n  if (!timestampInSeconds) return undefined\n\n  const date = new Date(timestampInSeconds * 1000)\n  const now = new Date()\n  const minutes = date.getMinutes()\n\n  // Calculate hours until reset\n  const hoursUntilReset = (date.getTime() - now.getTime()) / (1000 * 60 * 60)\n\n  // If reset is more than 24 hours away, show the date as well\n  if (hoursUntilReset > 24) {\n    // Show date and time for resets more than a day away\n    const dateOptions: Intl.DateTimeFormatOptions = {\n      month: 'short',\n      day: 'numeric',\n      hour: showTime ? 'numeric' : undefined,\n      minute: !showTime || minutes === 0 ? undefined : '2-digit',\n      hour12: showTime ? true : undefined,\n    }\n\n    // Add year if it's not the current year\n    if (date.getFullYear() !== now.getFullYear()) {\n      dateOptions.year = 'numeric'\n    }\n\n    const dateString = date.toLocaleString('en-US', dateOptions)\n\n    // Remove the space before AM/PM and make it lowercase\n    return (\n      dateString.replace(/ ([AP]M)/i, (_match, ampm) => ampm.toLowerCase()) +\n      (showTimezone ? ` (${getTimeZone()})` : '')\n    )\n  }\n\n  // For resets within 24 hours, show just the time (existing behavior)\n  const timeString = date.toLocaleTimeString('en-US', {\n    hour: 'numeric',\n    minute: minutes === 0 ? undefined : '2-digit',\n    hour12: true,\n  })\n\n  // Remove the space before AM/PM and make it lowercase, then add timezone\n  return (\n    timeString.replace(/ ([AP]M)/i, (_match, ampm) => ampm.toLowerCase()) +\n    (showTimezone ? ` (${getTimeZone()})` : '')\n  )\n}\n\nexport function formatResetText(\n  resetsAt: string,\n  showTimezone: boolean = false,\n  showTime: boolean = true,\n): string {\n  const dt = new Date(resetsAt)\n  return `${formatResetTime(Math.floor(dt.getTime() / 1000), showTimezone, showTime)}`\n}\n\n// Back-compat: truncate helpers moved to ./truncate.ts (needs ink/stringWidth)\nexport {\n  truncate,\n  truncatePathMiddle,\n  truncateStartToWidth,\n  truncateToWidth,\n  truncateToWidthNoEllipsis,\n  wrapText,\n} from './truncate.js'\n", "/**\n * Shared infrastructure for profiler modules (startupProfiler, queryProfiler,\n * headlessProfiler). All three use the same perf_hooks timeline and the same\n * line format for detailed reports.\n */\n\nimport type { performance as PerformanceType } from 'perf_hooks'\nimport { formatFileSize } from './format.js'\n\n// Lazy-load performance API only when profiling is enabled.\n// Shared across all profilers \u2014 perf_hooks.performance is a process-wide singleton.\nlet performance: typeof PerformanceType | null = null\n\nexport function getPerformance(): typeof PerformanceType {\n  if (!performance) {\n    // eslint-disable-next-line @typescript-eslint/no-require-imports\n    performance = require('perf_hooks').performance\n  }\n  return performance!\n}\n\nexport function formatMs(ms: number): string {\n  return ms.toFixed(3)\n}\n\n/**\n * Render a single timeline line in the shared profiler report format:\n *   [+  total.ms] (+  delta.ms) name [extra] [| RSS: .., Heap: ..]\n *\n * totalPad/deltaPad control the padStart width so callers can align columns\n * based on their expected magnitude (startup uses 8/7, query uses 10/9).\n */\nexport function formatTimelineLine(\n  totalMs: number,\n  deltaMs: number,\n  name: string,\n  memory: NodeJS.MemoryUsage | undefined,\n  totalPad: number,\n  deltaPad: number,\n  extra = '',\n): string {\n  const memInfo = memory\n    ? ` | RSS: ${formatFileSize(memory.rss)}, Heap: ${formatFileSize(memory.heapUsed)}`\n    : ''\n  return `[+${formatMs(totalMs).padStart(totalPad)}ms] (+${formatMs(deltaMs).padStart(deltaPad)}ms) ${name}${extra}${memInfo}`\n}\n", "/**\n * Startup profiling utility for measuring and reporting time spent in various\n * initialization phases.\n *\n * Two modes:\n * 1. Sampled logging: 100% of ant users, 0.1% of external users - logs phases to Statsig\n * 2. Detailed profiling: CLAUDE_CODE_PROFILE_STARTUP=1 - full report with memory snapshots\n *\n * Uses Node.js built-in performance hooks API for standard timing measurement.\n */\n\nimport { dirname, join } from 'path'\nimport { getSessionId } from 'src/bootstrap/state.js'\nimport {\n  type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,\n  logEvent,\n} from '../services/analytics/index.js'\nimport { logForDebugging } from './debug.js'\nimport { getClaudeConfigHomeDir, isEnvTruthy } from './envUtils.js'\nimport { getFsImplementation } from './fsOperations.js'\nimport { formatMs, formatTimelineLine, getPerformance } from './profilerBase.js'\nimport { writeFileSync_DEPRECATED } from './slowOperations.js'\n\n// Module-level state - decided once at module load\n// eslint-disable-next-line custom-rules/no-process-env-top-level\nconst DETAILED_PROFILING = isEnvTruthy(process.env.CLAUDE_CODE_PROFILE_STARTUP)\n\n// Sampling for Statsig logging: 100% ant, 0.5% external\n// Decision made once at startup - non-sampled users pay no profiling cost\nconst STATSIG_SAMPLE_RATE = 0.005\n// eslint-disable-next-line custom-rules/no-process-env-top-level\nconst STATSIG_LOGGING_SAMPLED =\n  process.env.USER_TYPE === 'ant' || Math.random() < STATSIG_SAMPLE_RATE\n\n// Enable profiling if either detailed mode OR sampled for Statsig\nconst SHOULD_PROFILE = DETAILED_PROFILING || STATSIG_LOGGING_SAMPLED\n\n// Track memory snapshots separately (perf_hooks doesn't track memory).\n// Only used when DETAILED_PROFILING is enabled.\n// Stored as an array that appends in the same order as perf.mark() calls, so\n// memorySnapshots[i] corresponds to getEntriesByType('mark')[i]. Using a Map\n// keyed by checkpoint name is wrong because some checkpoints fire more than\n// once (e.g. loadSettingsFromDisk_start fires during init and again after\n// plugins reset the settings cache), and the second call would overwrite the\n// first's memory snapshot.\nconst memorySnapshots: NodeJS.MemoryUsage[] = []\n\n// Phase definitions for Statsig logging: [startCheckpoint, endCheckpoint]\nconst PHASE_DEFINITIONS = {\n  import_time: ['cli_entry', 'main_tsx_imports_loaded'],\n  init_time: ['init_function_start', 'init_function_end'],\n  settings_time: ['eagerLoadSettings_start', 'eagerLoadSettings_end'],\n  total_time: ['cli_entry', 'main_after_run'],\n} as const\n\n// Record initial checkpoint if profiling is enabled\nif (SHOULD_PROFILE) {\n  // eslint-disable-next-line custom-rules/no-top-level-side-effects\n  profileCheckpoint('profiler_initialized')\n}\n\n/**\n * Record a checkpoint with the given name\n */\nexport function profileCheckpoint(name: string): void {\n  if (!SHOULD_PROFILE) return\n\n  const perf = getPerformance()\n  perf.mark(name)\n\n  // Only capture memory when detailed profiling enabled (env var)\n  if (DETAILED_PROFILING) {\n    memorySnapshots.push(process.memoryUsage())\n  }\n}\n\n/**\n * Get a formatted report of all checkpoints\n * Only available when DETAILED_PROFILING is enabled\n */\nfunction getReport(): string {\n  if (!DETAILED_PROFILING) {\n    return 'Startup profiling not enabled'\n  }\n\n  const perf = getPerformance()\n  const marks = perf.getEntriesByType('mark')\n  if (marks.length === 0) {\n    return 'No profiling checkpoints recorded'\n  }\n\n  const lines: string[] = []\n  lines.push('='.repeat(80))\n  lines.push('STARTUP PROFILING REPORT')\n  lines.push('='.repeat(80))\n  lines.push('')\n\n  let prevTime = 0\n  for (const [i, mark] of marks.entries()) {\n    lines.push(\n      formatTimelineLine(\n        mark.startTime,\n        mark.startTime - prevTime,\n        mark.name,\n        memorySnapshots[i],\n        8,\n        7,\n      ),\n    )\n    prevTime = mark.startTime\n  }\n\n  const lastMark = marks[marks.length - 1]\n  lines.push('')\n  lines.push(`Total startup time: ${formatMs(lastMark?.startTime ?? 0)}ms`)\n  lines.push('='.repeat(80))\n\n  return lines.join('\\n')\n}\n\nlet reported = false\n\nexport function profileReport(): void {\n  if (reported) return\n  reported = true\n\n  // Log to Statsig (sampled: 100% ant, 0.1% external)\n  logStartupPerf()\n\n  // Output detailed report if CLAUDE_CODE_PROFILE_STARTUP=1\n  if (DETAILED_PROFILING) {\n    // Write to file\n    const path = getStartupPerfLogPath()\n    const dir = dirname(path)\n    const fs = getFsImplementation()\n    fs.mkdirSync(dir)\n    writeFileSync_DEPRECATED(path, getReport(), {\n      encoding: 'utf8',\n      flush: true,\n    })\n\n    logForDebugging('Startup profiling report:')\n    logForDebugging(getReport())\n  }\n}\n\nexport function isDetailedProfilingEnabled(): boolean {\n  return DETAILED_PROFILING\n}\n\nexport function getStartupPerfLogPath(): string {\n  return join(getClaudeConfigHomeDir(), 'startup-perf', `${getSessionId()}.txt`)\n}\n\n/**\n * Log startup performance phases to Statsig.\n * Only logs if this session was sampled at startup.\n */\nexport function logStartupPerf(): void {\n  // Only log if we were sampled (decision made at module load)\n  if (!STATSIG_LOGGING_SAMPLED) return\n\n  const perf = getPerformance()\n  const marks = perf.getEntriesByType('mark')\n  if (marks.length === 0) return\n\n  // Build checkpoint lookup\n  const checkpointTimes = new Map<string, number>()\n  for (const mark of marks) {\n    checkpointTimes.set(mark.name, mark.startTime)\n  }\n\n  // Compute phase durations\n  const metadata: Record<string, number | undefined> = {}\n\n  for (const [phaseName, [startCheckpoint, endCheckpoint]] of Object.entries(\n    PHASE_DEFINITIONS,\n  )) {\n    const startTime = checkpointTimes.get(startCheckpoint)\n    const endTime = checkpointTimes.get(endCheckpoint)\n\n    if (startTime !== undefined && endTime !== undefined) {\n      metadata[`${phaseName}_ms`] = Math.round(endTime - startTime)\n    }\n  }\n\n  // Add checkpoint count for debugging\n  metadata.checkpoint_count = marks.length\n\n  logEvent(\n    'tengu_startup_perf',\n    metadata as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,\n  )\n}\n", "import { getAllowedSettingSources } from '../../bootstrap/state.js'\n\n/**\n * All possible sources where settings can come from\n * Order matters - later sources override earlier ones\n */\nexport const SETTING_SOURCES = [\n  // User settings (global)\n  'userSettings',\n\n  // Project settings (shared per-directory)\n  'projectSettings',\n\n  // Local settings (gitignored)\n  'localSettings',\n\n  // Flag settings (from --settings flag)\n  'flagSettings',\n\n  // Policy settings (managed-settings.json or remote settings from API)\n  'policySettings',\n] as const\n\nexport type SettingSource = (typeof SETTING_SOURCES)[number]\n\nexport function getSettingSourceName(source: SettingSource): string {\n  switch (source) {\n    case 'userSettings':\n      return 'user'\n    case 'projectSettings':\n      return 'project'\n    case 'localSettings':\n      return 'project, gitignored'\n    case 'flagSettings':\n      return 'cli flag'\n    case 'policySettings':\n      return 'managed'\n  }\n}\n\n/**\n * Get short display name for a setting source (capitalized, for context/skills UI)\n * @param source The setting source or 'plugin'/'built-in'\n * @returns Short capitalized display name like 'User', 'Project', 'Plugin'\n */\nexport function getSourceDisplayName(\n  source: SettingSource | 'plugin' | 'built-in',\n): string {\n  switch (source) {\n    case 'userSettings':\n      return 'User'\n    case 'projectSettings':\n      return 'Project'\n    case 'localSettings':\n      return 'Local'\n    case 'flagSettings':\n      return 'Flag'\n    case 'policySettings':\n      return 'Managed'\n    case 'plugin':\n      return 'Plugin'\n    case 'built-in':\n      return 'Built-in'\n  }\n}\n\n/**\n * Get display name for a setting or permission rule source (lowercase, for inline use)\n * @param source The setting source or permission rule source\n * @returns Display name for the source in lowercase\n */\nexport function getSettingSourceDisplayNameLowercase(\n  source: SettingSource | 'cliArg' | 'command' | 'session',\n): string {\n  switch (source) {\n    case 'userSettings':\n      return 'user settings'\n    case 'projectSettings':\n      return 'shared project settings'\n    case 'localSettings':\n      return 'project local settings'\n    case 'flagSettings':\n      return 'command line arguments'\n    case 'policySettings':\n      return 'enterprise managed settings'\n    case 'cliArg':\n      return 'CLI argument'\n    case 'command':\n      return 'command configuration'\n    case 'session':\n      return 'current session'\n  }\n}\n\n/**\n * Get display name for a setting or permission rule source (capitalized, for UI labels)\n * @param source The setting source or permission rule source\n * @returns Display name for the source with first letter capitalized\n */\nexport function getSettingSourceDisplayNameCapitalized(\n  source: SettingSource | 'cliArg' | 'command' | 'session',\n): string {\n  switch (source) {\n    case 'userSettings':\n      return 'User settings'\n    case 'projectSettings':\n      return 'Shared project settings'\n    case 'localSettings':\n      return 'Project local settings'\n    case 'flagSettings':\n      return 'Command line arguments'\n    case 'policySettings':\n      return 'Enterprise managed settings'\n    case 'cliArg':\n      return 'CLI argument'\n    case 'command':\n      return 'Command configuration'\n    case 'session':\n      return 'Current session'\n  }\n}\n\n/**\n * Parse the --setting-sources CLI flag into SettingSource array\n * @param flag Comma-separated string like \"user,project,local\"\n * @returns Array of SettingSource values\n */\nexport function parseSettingSourcesFlag(flag: string): SettingSource[] {\n  if (flag === '') return []\n\n  const names = flag.split(',').map(s => s.trim())\n  const result: SettingSource[] = []\n\n  for (const name of names) {\n    switch (name) {\n      case 'user':\n        result.push('userSettings')\n        break\n      case 'project':\n        result.push('projectSettings')\n        break\n      case 'local':\n        result.push('localSettings')\n        break\n      default:\n        throw new Error(\n          `Invalid setting source: ${name}. Valid options are: user, project, local`,\n        )\n    }\n  }\n\n  return result\n}\n\n/**\n * Get enabled setting sources with policy/flag always included\n * @returns Array of enabled SettingSource values\n */\nexport function getEnabledSettingSources(): SettingSource[] {\n  const allowed = getAllowedSettingSources()\n\n  // Always include policy and flag settings\n  const result = new Set<SettingSource>(allowed)\n  result.add('policySettings')\n  result.add('flagSettings')\n  return Array.from(result)\n}\n\n/**\n * Check if a specific source is enabled\n * @param source The source to check\n * @returns true if the source should be loaded\n */\nexport function isSettingSourceEnabled(source: SettingSource): boolean {\n  const enabled = getEnabledSettingSources()\n  return enabled.includes(source)\n}\n\n/**\n * Editable setting sources (excludes policySettings and flagSettings which are read-only)\n */\nexport type EditableSettingSource = Exclude<\n  SettingSource,\n  'policySettings' | 'flagSettings'\n>\n\n/**\n * List of sources where permission rules can be saved, in display order.\n * Used by permission-rule and hook-save UIs to present source options.\n */\nexport const SOURCES = [\n  'localSettings',\n  'projectSettings',\n  'userSettings',\n] as const satisfies readonly EditableSettingSource[]\n\n/**\n * The JSON Schema URL for Tau settings\n * You can edit the contents at https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/claude-code-settings.json\n */\nexport const CLAUDE_CODE_SETTINGS_SCHEMA_URL =\n  'https://json.schemastore.org/claude-code-settings.json'\n", "/**\n * Tracks timestamps of in-process settings-file writes so the chokidar watcher\n * in changeDetector.ts can ignore its own echoes.\n *\n * Extracted from changeDetector.ts to break the settings.ts \u2192 changeDetector.ts \u2192\n * hooks.ts \u2192 \u2026 \u2192 settings.ts cycle. settings.ts needs to mark \"I'm about to\n * write\" before the write lands; changeDetector needs to read the mark when\n * chokidar fires. The map is the only shared state \u2014 everything else in\n * changeDetector (chokidar, hooks, mdm polling) is irrelevant to settings.ts.\n *\n * Callers pass resolved paths. The path\u2192source resolution (getSettingsFilePathForSource)\n * lives in settings.ts, so settings.ts does it before calling here. No imports.\n */\n\nconst timestamps = new Map<string, number>()\n\nexport function markInternalWrite(path: string): void {\n  timestamps.set(path, Date.now())\n}\n\n/**\n * True if `path` was marked within `windowMs`. Consumes the mark on match \u2014\n * the watcher fires once per write, so a matched mark shouldn't suppress\n * the next (real, external) change to the same file.\n */\nexport function consumeInternalWrite(path: string, windowMs: number): boolean {\n  const ts = timestamps.get(path)\n  if (ts !== undefined && Date.now() - ts < windowMs) {\n    timestamps.delete(path)\n    return true\n  }\n  return false\n}\n\nexport function clearInternalWrites(): void {\n  timestamps.clear()\n}\n", "import memoize from 'lodash-es/memoize.js'\nimport { join } from 'path'\nimport { getPlatform } from '../platform.js'\n\n/**\n * Get the path to the managed settings directory based on the current platform.\n */\nexport const getManagedFilePath = memoize(function (): string {\n  // Allow override for testing/demos (Ant-only, eliminated from external builds)\n  if (\n    process.env.USER_TYPE === 'ant' &&\n    process.env.CLAUDE_CODE_MANAGED_SETTINGS_PATH\n  ) {\n    return process.env.CLAUDE_CODE_MANAGED_SETTINGS_PATH\n  }\n\n  switch (getPlatform()) {\n    case 'macos':\n      return '/Library/Application Support/ClaudeCode'\n    case 'windows':\n      return 'C:\\\\Program Files\\\\ClaudeCode'\n    default:\n      return '/etc/claude-code'\n  }\n})\n\n/**\n * Get the path to the managed-settings.d/ drop-in directory.\n * managed-settings.json is merged first (base), then files in this directory\n * are merged alphabetically on top (drop-ins override base, later files win).\n */\nexport const getManagedSettingsDropInDir = memoize(function (): string {\n  return join(getManagedFilePath(), 'managed-settings.d')\n})\n", "/**\n * Returns a memoized factory function that constructs the value on first call.\n * Used to defer Zod schema construction from module init time to first access.\n */\nexport function lazySchema<T>(factory: () => T): () => T {\n  let cached: T | undefined\n  return () => (cached ??= factory())\n}\n", "/**\n * Sandbox types for the Tau Agent SDK\n *\n * This file is the single source of truth for sandbox configuration types.\n * Both the SDK and the settings validation import from here.\n */\n\nimport { z } from 'zod/v4'\nimport { lazySchema } from '../utils/lazySchema.js'\n\n/**\n * Network configuration schema for sandbox.\n */\nexport const SandboxNetworkConfigSchema = lazySchema(() =>\n  z\n    .object({\n      allowedDomains: z.array(z.string()).optional(),\n      allowManagedDomainsOnly: z\n        .boolean()\n        .optional()\n        .describe(\n          'When true (and set in managed settings), only allowedDomains and WebFetch(domain:...) allow rules from managed settings are respected. ' +\n            'User, project, local, and flag settings domains are ignored. Denied domains are still respected from all sources.',\n        ),\n      allowUnixSockets: z\n        .array(z.string())\n        .optional()\n        .describe(\n          'macOS only: Unix socket paths to allow. Ignored on Linux (seccomp cannot filter by path).',\n        ),\n      allowAllUnixSockets: z\n        .boolean()\n        .optional()\n        .describe(\n          'If true, allow all Unix sockets (disables blocking on both platforms).',\n        ),\n      allowLocalBinding: z.boolean().optional(),\n      httpProxyPort: z.number().optional(),\n      socksProxyPort: z.number().optional(),\n    })\n    .optional(),\n)\n\n/**\n * Filesystem configuration schema for sandbox.\n */\nexport const SandboxFilesystemConfigSchema = lazySchema(() =>\n  z\n    .object({\n      allowWrite: z\n        .array(z.string())\n        .optional()\n        .describe(\n          'Additional paths to allow writing within the sandbox. ' +\n            'Merged with paths from Edit(...) allow permission rules.',\n        ),\n      denyWrite: z\n        .array(z.string())\n        .optional()\n        .describe(\n          'Additional paths to deny writing within the sandbox. ' +\n            'Merged with paths from Edit(...) deny permission rules.',\n        ),\n      denyRead: z\n        .array(z.string())\n        .optional()\n        .describe(\n          'Additional paths to deny reading within the sandbox. ' +\n            'Merged with paths from Read(...) deny permission rules.',\n        ),\n      allowRead: z\n        .array(z.string())\n        .optional()\n        .describe(\n          'Paths to re-allow reading within denyRead regions. ' +\n            'Takes precedence over denyRead for matching paths.',\n        ),\n      allowManagedReadPathsOnly: z\n        .boolean()\n        .optional()\n        .describe(\n          'When true (set in managed settings), only allowRead paths from policySettings are used.',\n        ),\n    })\n    .optional(),\n)\n\n/**\n * Sandbox settings schema.\n */\nexport const SandboxSettingsSchema = lazySchema(() =>\n  z\n    .object({\n      enabled: z.boolean().optional(),\n      failIfUnavailable: z\n        .boolean()\n        .optional()\n        .describe(\n          'Exit with an error at startup if sandbox.enabled is true but the sandbox cannot start ' +\n            '(missing dependencies, unsupported platform, or platform not in enabledPlatforms). ' +\n            'When false (default), a warning is shown and commands run unsandboxed. ' +\n            'Intended for managed-settings deployments that require sandboxing as a hard gate.',\n        ),\n      // Note: enabledPlatforms is an undocumented setting read via .passthrough()\n      // It restricts sandboxing to specific platforms (e.g., [\"macos\"]).\n      //\n      // Added to unblock NVIDIA enterprise rollout: they want to enable\n      // autoAllowBashIfSandboxed but only on macOS initially, since Linux/WSL\n      // sandbox support is newer and less battle-tested. This allows them to\n      // set enabledPlatforms: [\"macos\"] to disable sandbox (and auto-allow)\n      // on other platforms until they're ready to expand.\n      autoAllowBashIfSandboxed: z.boolean().optional(),\n      allowUnsandboxedCommands: z\n        .boolean()\n        .optional()\n        .describe(\n          'Allow commands to run outside the sandbox via the dangerouslyDisableSandbox parameter. ' +\n            'When false, the dangerouslyDisableSandbox parameter is completely ignored and all commands must run sandboxed. ' +\n            'Default: true.',\n        ),\n      network: SandboxNetworkConfigSchema(),\n      filesystem: SandboxFilesystemConfigSchema(),\n      ignoreViolations: z.record(z.string(), z.array(z.string())).optional(),\n      enableWeakerNestedSandbox: z.boolean().optional(),\n      enableWeakerNetworkIsolation: z\n        .boolean()\n        .optional()\n        .describe(\n          'macOS only: Allow access to com.apple.trustd.agent in the sandbox. ' +\n            'Needed for Go-based CLI tools (gh, gcloud, terraform, etc.) to verify TLS certificates ' +\n            'when using httpProxyPort with a MITM proxy and custom CA. ' +\n            '**Reduces security** \u2014 opens a potential data exfiltration vector through the trustd service. Default: false',\n        ),\n      excludedCommands: z.array(z.string()).optional(),\n      ripgrep: z\n        .object({\n          command: z.string(),\n          args: z.array(z.string()).optional(),\n        })\n        .optional()\n        .describe('Custom ripgrep configuration for bundled ripgrep support'),\n    })\n    .passthrough(),\n)\n\n// Inferred types from schemas\nexport type SandboxSettings = z.infer<ReturnType<typeof SandboxSettingsSchema>>\nexport type SandboxNetworkConfig = NonNullable<\n  z.infer<ReturnType<typeof SandboxNetworkConfigSchema>>\n>\nexport type SandboxFilesystemConfig = NonNullable<\n  z.infer<ReturnType<typeof SandboxFilesystemConfigSchema>>\n>\nexport type SandboxIgnoreViolations = NonNullable<\n  SandboxSettings['ignoreViolations']\n>\n", "/**\n * Detects if the current runtime is Bun.\n * Returns true when:\n * - Running a JS file via the `bun` command\n * - Running a Bun-compiled standalone executable\n */\nexport function isRunningWithBun(): boolean {\n  // https://bun.com/guides/util/detect-bun\n  return process.versions.bun !== undefined\n}\n\n/**\n * Detects if running as a Bun-compiled standalone executable.\n * This checks for embedded files which are present in compiled binaries.\n */\nexport function isInBundledMode(): boolean {\n  return (\n    typeof Bun !== 'undefined' &&\n    Array.isArray(Bun.embeddedFiles) &&\n    Bun.embeddedFiles.length > 0\n  )\n}\n", "import { whichSync } from './which.js'\n\n/**\n * Find an executable by searching PATH, similar to `which`.\n * Replaces spawn-rx's findActualExecutable to avoid pulling in rxjs (~313 KB).\n *\n * Returns { cmd, args } to match the spawn-rx API shape.\n * `cmd` is the resolved path if found, or the original name if not.\n * `args` is always the pass-through of the input args.\n */\nexport function findExecutable(\n  exe: string,\n  args: string[],\n): { cmd: string; args: string[] } {\n  const resolved = whichSync(exe)\n  return { cmd: resolved ?? exe, args }\n}\n", "import memoize from 'lodash-es/memoize.js'\nimport { homedir } from 'os'\nimport { join } from 'path'\nimport { fileSuffixForOauthConfig } from '../constants/oauth.js'\nimport { isRunningWithBun } from './bundledMode.js'\nimport { getClaudeConfigHomeDir, isEnvTruthy } from './envUtils.js'\nimport { findExecutable } from './findExecutable.js'\nimport { getFsImplementation } from './fsOperations.js'\nimport { which } from './which.js'\n\ntype Platform = 'win32' | 'darwin' | 'linux'\n\n// Config and data paths\nexport const getGlobalClaudeFile = memoize((): string => {\n  // Legacy fallback for backwards compatibility\n  if (\n    getFsImplementation().existsSync(\n      join(getClaudeConfigHomeDir(), '.config.json'),\n    )\n  ) {\n    return join(getClaudeConfigHomeDir(), '.config.json')\n  }\n\n  const filename = `.claude${fileSuffixForOauthConfig()}.json`\n  return join(process.env.CLAUDE_CONFIG_DIR || homedir(), filename)\n})\n\nconst hasInternetAccess = memoize(async (): Promise<boolean> => {\n  try {\n    const { default: axiosClient } = await import('axios')\n    await axiosClient.head('http://1.1.1.1', {\n      signal: AbortSignal.timeout(1000),\n    })\n    return true\n  } catch {\n    return false\n  }\n})\n\nasync function isCommandAvailable(command: string): Promise<boolean> {\n  try {\n    // which does not execute the file.\n    return !!(await which(command))\n  } catch {\n    return false\n  }\n}\n\nconst detectPackageManagers = memoize(async (): Promise<string[]> => {\n  const packageManagers = []\n\n  if (await isCommandAvailable('npm')) packageManagers.push('npm')\n  if (await isCommandAvailable('yarn')) packageManagers.push('yarn')\n  if (await isCommandAvailable('pnpm')) packageManagers.push('pnpm')\n\n  return packageManagers\n})\n\nconst detectRuntimes = memoize(async (): Promise<string[]> => {\n  const runtimes = []\n\n  if (await isCommandAvailable('bun')) runtimes.push('bun')\n  if (await isCommandAvailable('deno')) runtimes.push('deno')\n  if (await isCommandAvailable('node')) runtimes.push('node')\n\n  return runtimes\n})\n\n/**\n * Checks if we're running in a WSL environment\n * @returns true if running in WSL, false otherwise\n */\nconst isWslEnvironment = memoize((): boolean => {\n  try {\n    // Check for WSLInterop file which is a reliable indicator of WSL\n    return getFsImplementation().existsSync(\n      '/proc/sys/fs/binfmt_misc/WSLInterop',\n    )\n  } catch (_error) {\n    // If there's an error checking, assume not WSL\n    return false\n  }\n})\n\n/**\n * Checks if the npm executable is located in the Windows filesystem within WSL\n * @returns true if npm is from Windows (starts with /mnt/c/), false otherwise\n */\nconst isNpmFromWindowsPath = memoize((): boolean => {\n  try {\n    // Only relevant in WSL environment\n    if (!isWslEnvironment()) {\n      return false\n    }\n\n    // Find the actual npm executable path\n    const { cmd } = findExecutable('npm', [])\n\n    // If npm is in Windows path, it will start with /mnt/c/\n    return cmd.startsWith('/mnt/c/')\n  } catch (_error) {\n    // If there's an error, assume it's not from Windows\n    return false\n  }\n})\n\n/**\n * Checks if we're running via Conductor\n * @returns true if running via Conductor, false otherwise\n */\nfunction isConductor(): boolean {\n  return process.env.__CFBundleIdentifier === 'com.conductor.app'\n}\n\nexport const JETBRAINS_IDES = [\n  'pycharm',\n  'intellij',\n  'webstorm',\n  'phpstorm',\n  'rubymine',\n  'clion',\n  'goland',\n  'rider',\n  'datagrip',\n  'appcode',\n  'dataspell',\n  'aqua',\n  'gateway',\n  'fleet',\n  'jetbrains',\n  'androidstudio',\n]\n\n// Detect terminal type with fallbacks for all platforms\nfunction detectTerminal(): string | null {\n  if (process.env.CURSOR_TRACE_ID) return 'cursor'\n  // Cursor and Windsurf under WSL have TERM_PROGRAM=vscode\n  if (process.env.VSCODE_GIT_ASKPASS_MAIN?.includes('cursor')) {\n    return 'cursor'\n  }\n  if (process.env.VSCODE_GIT_ASKPASS_MAIN?.includes('windsurf')) {\n    return 'windsurf'\n  }\n  if (process.env.VSCODE_GIT_ASKPASS_MAIN?.includes('antigravity')) {\n    return 'antigravity'\n  }\n  const bundleId = process.env.__CFBundleIdentifier?.toLowerCase()\n  if (bundleId?.includes('vscodium')) return 'codium'\n  if (bundleId?.includes('windsurf')) return 'windsurf'\n  if (bundleId?.includes('com.google.android.studio')) return 'androidstudio'\n  // Check for JetBrains IDEs in bundle ID\n  if (bundleId) {\n    for (const ide of JETBRAINS_IDES) {\n      if (bundleId.includes(ide)) return ide\n    }\n  }\n\n  if (process.env.VisualStudioVersion) {\n    // This is desktop Visual Studio, not VS Code\n    return 'visualstudio'\n  }\n\n  // Check for JetBrains terminal on Linux/Windows\n  if (process.env.TERMINAL_EMULATOR === 'JetBrains-JediTerm') {\n    // For macOS, bundle ID detection above already handles JetBrains IDEs\n    if (process.platform === 'darwin') return 'pycharm'\n\n    // For finegrained detection on Linux/Windows use envDynamic.getTerminalWithJetBrainsDetection()\n    return 'pycharm'\n  }\n\n  // Check for specific terminals by TERM before TERM_PROGRAM\n  // This handles cases where TERM and TERM_PROGRAM might be inconsistent\n  if (process.env.TERM === 'xterm-ghostty') {\n    return 'ghostty'\n  }\n  if (process.env.TERM?.includes('kitty')) {\n    return 'kitty'\n  }\n\n  if (process.env.TERM_PROGRAM) {\n    return process.env.TERM_PROGRAM\n  }\n\n  if (process.env.TMUX) return 'tmux'\n  if (process.env.STY) return 'screen'\n\n  // Check for terminal-specific environment variables (common on Linux)\n  if (process.env.KONSOLE_VERSION) return 'konsole'\n  if (process.env.GNOME_TERMINAL_SERVICE) return 'gnome-terminal'\n  if (process.env.XTERM_VERSION) return 'xterm'\n  if (process.env.VTE_VERSION) return 'vte-based'\n  if (process.env.TERMINATOR_UUID) return 'terminator'\n  if (process.env.KITTY_WINDOW_ID) {\n    return 'kitty'\n  }\n  if (process.env.ALACRITTY_LOG) return 'alacritty'\n  if (process.env.TILIX_ID) return 'tilix'\n\n  // Windows-specific detection\n  if (process.env.WT_SESSION) return 'windows-terminal'\n  if (process.env.SESSIONNAME && process.env.TERM === 'cygwin') return 'cygwin'\n  if (process.env.MSYSTEM) return process.env.MSYSTEM.toLowerCase() // MINGW64, MSYS2, etc.\n  if (\n    process.env.ConEmuANSI ||\n    process.env.ConEmuPID ||\n    process.env.ConEmuTask\n  ) {\n    return 'conemu'\n  }\n\n  // WSL detection\n  if (process.env.WSL_DISTRO_NAME) return `wsl-${process.env.WSL_DISTRO_NAME}`\n\n  // SSH session detection\n  if (isSSHSession()) {\n    return 'ssh-session'\n  }\n\n  // Fall back to TERM which is more universally available\n  // Special case for common terminal identifiers in TERM\n  if (process.env.TERM) {\n    const term = process.env.TERM\n    if (term.includes('alacritty')) return 'alacritty'\n    if (term.includes('rxvt')) return 'rxvt'\n    if (term.includes('termite')) return 'termite'\n    return process.env.TERM\n  }\n\n  // Detect non-interactive environment\n  if (!process.stdout.isTTY && process.platform !== 'win32') return 'non-interactive'\n\n  return null\n}\n\n/**\n * Detects the deployment environment/platform based on environment variables\n * @returns The deployment platform name, or 'unknown' if not detected\n */\nexport const detectDeploymentEnvironment = memoize((): string => {\n  // Cloud development environments\n  if (isEnvTruthy(process.env.CODESPACES)) return 'codespaces'\n  if (process.env.GITPOD_WORKSPACE_ID) return 'gitpod'\n  if (process.env.REPL_ID || process.env.REPL_SLUG) return 'replit'\n  if (process.env.PROJECT_DOMAIN) return 'glitch'\n\n  // Cloud platforms\n  if (isEnvTruthy(process.env.VERCEL)) return 'vercel'\n  if (\n    process.env.RAILWAY_ENVIRONMENT_NAME ||\n    process.env.RAILWAY_SERVICE_NAME\n  ) {\n    return 'railway'\n  }\n  if (isEnvTruthy(process.env.RENDER)) return 'render'\n  if (isEnvTruthy(process.env.NETLIFY)) return 'netlify'\n  if (process.env.DYNO) return 'heroku'\n  if (process.env.FLY_APP_NAME || process.env.FLY_MACHINE_ID) return 'fly.io'\n  if (isEnvTruthy(process.env.CF_PAGES)) return 'cloudflare-pages'\n  if (process.env.DENO_DEPLOYMENT_ID) return 'deno-deploy'\n  if (process.env.AWS_LAMBDA_FUNCTION_NAME) return 'aws-lambda'\n  if (process.env.AWS_EXECUTION_ENV === 'AWS_ECS_FARGATE') return 'aws-fargate'\n  if (process.env.AWS_EXECUTION_ENV === 'AWS_ECS_EC2') return 'aws-ecs'\n  // Check for EC2 via hypervisor UUID\n  try {\n    const uuid = getFsImplementation()\n      .readFileSync('/sys/hypervisor/uuid', { encoding: 'utf8' })\n      .trim()\n      .toLowerCase()\n    if (uuid.startsWith('ec2')) return 'aws-ec2'\n  } catch {\n    // Ignore errors reading hypervisor UUID (ENOENT on non-EC2, etc.)\n  }\n  if (process.env.K_SERVICE) return 'gcp-cloud-run'\n  if (process.env.GOOGLE_CLOUD_PROJECT) return 'gcp'\n  if (process.env.WEBSITE_SITE_NAME || process.env.WEBSITE_SKU)\n    return 'azure-app-service'\n  if (process.env.AZURE_FUNCTIONS_ENVIRONMENT) return 'azure-functions'\n  if (process.env.APP_URL?.includes('ondigitalocean.app')) {\n    return 'digitalocean-app-platform'\n  }\n  if (process.env.SPACE_CREATOR_USER_ID) return 'huggingface-spaces'\n\n  // CI/CD platforms\n  if (isEnvTruthy(process.env.GITHUB_ACTIONS)) return 'github-actions'\n  if (isEnvTruthy(process.env.GITLAB_CI)) return 'gitlab-ci'\n  if (process.env.CIRCLECI) return 'circleci'\n  if (process.env.BUILDKITE) return 'buildkite'\n  if (isEnvTruthy(process.env.CI)) return 'ci'\n\n  // Container orchestration\n  if (process.env.KUBERNETES_SERVICE_HOST) return 'kubernetes'\n  try {\n    if (getFsImplementation().existsSync('/.dockerenv')) return 'docker'\n  } catch {\n    // Ignore errors checking for Docker\n  }\n\n  // Platform-specific fallback for undetected environments\n  if (env.platform === 'darwin') return 'unknown-darwin'\n  if (env.platform === 'linux') return 'unknown-linux'\n  if (env.platform === 'win32') return 'unknown-win32'\n\n  return 'unknown'\n})\n\n// all of these should be immutable\nfunction isSSHSession(): boolean {\n  return !!(\n    process.env.SSH_CONNECTION ||\n    process.env.SSH_CLIENT ||\n    process.env.SSH_TTY\n  )\n}\n\nexport const env = {\n  hasInternetAccess,\n  isCI: isEnvTruthy(process.env.CI),\n  platform: (['win32', 'darwin'].includes(process.platform)\n    ? process.platform\n    : 'linux') as Platform,\n  arch: process.arch,\n  nodeVersion: process.version,\n  terminal: detectTerminal(),\n  isSSH: isSSHSession,\n  getPackageManagers: detectPackageManagers,\n  getRuntimes: detectRuntimes,\n  isRunningWithBun: memoize(isRunningWithBun),\n  isWslEnvironment,\n  isNpmFromWindowsPath,\n  isConductor,\n  detectDeploymentEnvironment,\n}\n\n/**\n * Returns the host platform for analytics reporting.\n * If CLAUDE_CODE_HOST_PLATFORM is set to a valid platform value, that overrides\n * the detected platform. This is useful for container/remote environments where\n * process.platform reports the container OS but the actual host platform differs.\n */\nexport function getHostPlatformForAnalytics(): Platform {\n  const override = process.env.CLAUDE_CODE_HOST_PLATFORM\n  if (override === 'win32' || override === 'darwin' || override === 'linux') {\n    return override\n  }\n  return env.platform\n}\n", "import { env } from '../utils/env.js'\n\n// The former is better vertically aligned, but isn't usually supported on Windows/Linux\nexport const BLACK_CIRCLE = env.platform === 'darwin' ? '\u23FA' : '\u25CF'\nexport const BULLET_OPERATOR = '\u2219'\nexport const TEARDROP_ASTERISK = '\u273B'\nexport const UP_ARROW = '\\u2191' // \u2191 - used for opus 1m merge notice\nexport const DOWN_ARROW = '\\u2193' // \u2193 - used for scroll hint\nexport const LIGHTNING_BOLT = '\u21AF' // \\u21af - used for fast mode indicator\nexport const EFFORT_LOW = '\u25CB' // \\u25cb - effort level: low\nexport const EFFORT_MEDIUM = '\u25D0' // \\u25d0 - effort level: medium\nexport const EFFORT_HIGH = '\u25CF' // \\u25cf - effort level: high\nexport const EFFORT_XHIGH = '\u25CD' // \\u25cd - effort level: extra high\nexport const EFFORT_MAX = '\u25C9' // \\u25c9 - effort level: max\n\n// Media/trigger status indicators\nexport const PLAY_ICON = '\\u25b6' // \u25B6\nexport const PAUSE_ICON = '\\u23f8' // \u23F8\n\n// MCP subscription indicators\nexport const REFRESH_ARROW = '\\u21bb' // \u21BB - used for resource update indicator\nexport const CHANNEL_ARROW = '\\u2190' // \u2190 - inbound channel message indicator\nexport const INJECTED_ARROW = '\\u2192' // \u2192 - cross-session injected message indicator\nexport const FORK_GLYPH = '\\u2442' // \u2442 - fork directive indicator\n\n// Review status indicators (ultrareview diamond states)\nexport const DIAMOND_OPEN = '\\u25c7' // \u25C7 - running\nexport const DIAMOND_FILLED = '\\u25c6' // \u25C6 - completed/failed\nexport const REFERENCE_MARK = '\\u203b' // \u203B - komejirushi, away-summary recap marker\n\n// Issue flag indicator\nexport const FLAG_ICON = '\\u2691' // \u2691 - used for issue flag banner\n\n// Blockquote indicator\nexport const BLOCKQUOTE_BAR = '\\u258e' // \u258E - left one-quarter block, used as blockquote line prefix\nexport const HEAVY_HORIZONTAL = '\\u2501' // \u2501 - heavy box-drawing horizontal\n\n// Bridge status indicators\nexport const BRIDGE_SPINNER_FRAMES = [\n  '\\u00b7|\\u00b7',\n  '\\u00b7/\\u00b7',\n  '\\u00b7\\u2014\\u00b7',\n  '\\u00b7\\\\\\u00b7',\n]\nexport const BRIDGE_READY_INDICATOR = '\\u00b7\\u2714\\ufe0e\\u00b7'\nexport const BRIDGE_FAILED_INDICATOR = '\\u00d7'\n", "/**\n * Pure permission type definitions extracted to break import cycles.\n *\n * This file contains only type definitions and constants with no runtime dependencies.\n * Implementation files remain in src/utils/permissions/ but can now import from here\n * to avoid circular dependencies.\n */\n\nimport { feature } from 'bun:bundle'\nimport type { ContentBlockParam } from '@anthropic-ai/sdk/resources/messages.mjs'\n\n// ============================================================================\n// Permission Modes\n// ============================================================================\n\nexport const EXTERNAL_PERMISSION_MODES = [\n  'acceptEdits',\n  'bypassPermissions',\n  'default',\n  'dontAsk',\n  'explore',\n  'plan',\n] as const\n\nexport type ExternalPermissionMode = (typeof EXTERNAL_PERMISSION_MODES)[number]\n\n// Exhaustive mode union for typechecking. The user-addressable runtime set\n// is INTERNAL_PERMISSION_MODES below.\nexport type InternalPermissionMode = ExternalPermissionMode | 'auto' | 'bubble'\nexport type PermissionMode = InternalPermissionMode\n\n// Runtime validation set: modes that are user-addressable (settings.json\n// defaultMode, --permission-mode CLI flag, conversation recovery).\nexport const INTERNAL_PERMISSION_MODES = [\n  ...EXTERNAL_PERMISSION_MODES,\n  ...(feature('TRANSCRIPT_CLASSIFIER') ? (['auto'] as const) : ([] as const)),\n] as const satisfies readonly PermissionMode[]\n\nexport const PERMISSION_MODES = INTERNAL_PERMISSION_MODES\n\n// ============================================================================\n// Permission Behaviors\n// ============================================================================\n\nexport type PermissionBehavior = 'allow' | 'deny' | 'ask'\n\n// ============================================================================\n// Permission Rules\n// ============================================================================\n\n/**\n * Where a permission rule originated from.\n * Includes all SettingSource values plus additional rule-specific sources.\n */\nexport type PermissionRuleSource =\n  | 'userSettings'\n  | 'projectSettings'\n  | 'localSettings'\n  | 'flagSettings'\n  | 'policySettings'\n  | 'cliArg'\n  | 'command'\n  | 'session'\n\n/**\n * The value of a permission rule - specifies which tool and optional content\n */\nexport type PermissionRuleValue = {\n  toolName: string\n  ruleContent?: string\n}\n\n/**\n * A permission rule with its source and behavior\n */\nexport type PermissionRule = {\n  source: PermissionRuleSource\n  ruleBehavior: PermissionBehavior\n  ruleValue: PermissionRuleValue\n}\n\n// ============================================================================\n// Permission Updates\n// ============================================================================\n\n/**\n * Where a permission update should be persisted\n */\nexport type PermissionUpdateDestination =\n  | 'userSettings'\n  | 'projectSettings'\n  | 'localSettings'\n  | 'session'\n  | 'cliArg'\n\n/**\n * Update operations for permission configuration\n */\nexport type PermissionUpdate =\n  | {\n      type: 'addRules'\n      destination: PermissionUpdateDestination\n      rules: PermissionRuleValue[]\n      behavior: PermissionBehavior\n    }\n  | {\n      type: 'replaceRules'\n      destination: PermissionUpdateDestination\n      rules: PermissionRuleValue[]\n      behavior: PermissionBehavior\n    }\n  | {\n      type: 'removeRules'\n      destination: PermissionUpdateDestination\n      rules: PermissionRuleValue[]\n      behavior: PermissionBehavior\n    }\n  | {\n      type: 'setMode'\n      destination: PermissionUpdateDestination\n      mode: ExternalPermissionMode\n    }\n  | {\n      type: 'addDirectories'\n      destination: PermissionUpdateDestination\n      directories: string[]\n    }\n  | {\n      type: 'removeDirectories'\n      destination: PermissionUpdateDestination\n      directories: string[]\n    }\n\n/**\n * Source of an additional working directory permission.\n * Note: This is currently the same as PermissionRuleSource but kept as a\n * separate type for semantic clarity and potential future divergence.\n */\nexport type WorkingDirectorySource = PermissionRuleSource\n\n/**\n * An additional directory included in permission scope\n */\nexport type AdditionalWorkingDirectory = {\n  path: string\n  source: WorkingDirectorySource\n}\n\n// ============================================================================\n// Permission Decisions & Results\n// ============================================================================\n\n/**\n * Minimal command shape for permission metadata.\n * This is intentionally a subset of the full Command type to avoid import cycles.\n * Only includes properties needed by permission-related components.\n */\nexport type PermissionCommandMetadata = {\n  name: string\n  description?: string\n  // Allow additional properties for forward compatibility\n  [key: string]: unknown\n}\n\n/**\n * Metadata attached to permission decisions\n */\nexport type PermissionMetadata =\n  | { command: PermissionCommandMetadata }\n  | undefined\n\n/**\n * Result when permission is granted\n */\nexport type PermissionAllowDecision<\n  Input extends { [key: string]: unknown } = { [key: string]: unknown },\n> = {\n  behavior: 'allow'\n  updatedInput?: Input\n  userModified?: boolean\n  decisionReason?: PermissionDecisionReason\n  toolUseID?: string\n  acceptFeedback?: string\n  contentBlocks?: ContentBlockParam[]\n}\n\n/**\n * Metadata for a pending classifier check that will run asynchronously.\n * Used to enable non-blocking allow classifier evaluation.\n */\nexport type PendingClassifierCheck = {\n  command: string\n  cwd: string\n  descriptions: string[]\n}\n\n/**\n * Result when user should be prompted\n */\nexport type PermissionAskDecision<\n  Input extends { [key: string]: unknown } = { [key: string]: unknown },\n> = {\n  behavior: 'ask'\n  message: string\n  updatedInput?: Input\n  decisionReason?: PermissionDecisionReason\n  suggestions?: PermissionUpdate[]\n  blockedPath?: string\n  metadata?: PermissionMetadata\n  /**\n   * If true, this ask decision was triggered by a bashCommandIsSafe_DEPRECATED security check\n   * for patterns that splitCommand_DEPRECATED could misparse (e.g. line continuations, shell-quote\n   * transformations). Used by bashToolHasPermission to block early before splitCommand_DEPRECATED\n   * transforms the command. Not set for simple newline compound commands.\n   */\n  isBashSecurityCheckForMisparsing?: boolean\n  /**\n   * If set, an allow classifier check should be run asynchronously.\n   * The classifier may auto-approve the permission before the user responds.\n   */\n  pendingClassifierCheck?: PendingClassifierCheck\n  /**\n   * Optional content blocks (e.g., images) to include alongside the rejection\n   * message in the tool result. Used when users paste images as feedback.\n   */\n  contentBlocks?: ContentBlockParam[]\n}\n\n/**\n * Result when permission is denied\n */\nexport type PermissionDenyDecision = {\n  behavior: 'deny'\n  message: string\n  decisionReason: PermissionDecisionReason\n  toolUseID?: string\n}\n\n/**\n * A permission decision - allow, ask, or deny\n */\nexport type PermissionDecision<\n  Input extends { [key: string]: unknown } = { [key: string]: unknown },\n> =\n  | PermissionAllowDecision<Input>\n  | PermissionAskDecision<Input>\n  | PermissionDenyDecision\n\n/**\n * Permission result with additional passthrough option\n */\nexport type PermissionResult<\n  Input extends { [key: string]: unknown } = { [key: string]: unknown },\n> =\n  | PermissionDecision<Input>\n  | {\n      behavior: 'passthrough'\n      message: string\n      decisionReason?: PermissionDecision<Input>['decisionReason']\n      suggestions?: PermissionUpdate[]\n      blockedPath?: string\n      /**\n       * If set, an allow classifier check should be run asynchronously.\n       * The classifier may auto-approve the permission before the user responds.\n       */\n      pendingClassifierCheck?: PendingClassifierCheck\n    }\n\n/**\n * Explanation of why a permission decision was made\n */\nexport type PermissionDecisionReason =\n  | {\n      type: 'rule'\n      rule: PermissionRule\n    }\n  | {\n      type: 'mode'\n      mode: PermissionMode\n    }\n  | {\n      type: 'subcommandResults'\n      reasons: Map<string, PermissionResult>\n    }\n  | {\n      type: 'permissionPromptTool'\n      permissionPromptToolName: string\n      toolResult: unknown\n    }\n  | {\n      type: 'hook'\n      hookName: string\n      hookSource?: string\n      reason?: string\n    }\n  | {\n      type: 'asyncAgent'\n      reason: string\n    }\n  | {\n      type: 'sandboxOverride'\n      reason: 'excludedCommand' | 'dangerouslyDisableSandbox'\n    }\n  | {\n      type: 'classifier'\n      classifier: string\n      reason: string\n    }\n  | {\n      type: 'workingDir'\n      reason: string\n    }\n  | {\n      type: 'safetyCheck'\n      reason: string\n      // When true, auto mode lets the classifier evaluate this instead of\n      // forcing a prompt. True for sensitive-file paths (.claude/, .git/,\n      // shell configs) \u2014 the classifier can see context and decide. False\n      // for Windows path bypass attempts and cross-machine bridge messages.\n      classifierApprovable: boolean\n    }\n  | {\n      type: 'other'\n      reason: string\n    }\n\n// ============================================================================\n// Bash Classifier Types\n// ============================================================================\n\nexport type ClassifierResult = {\n  matches: boolean\n  matchedDescription?: string\n  confidence: 'high' | 'medium' | 'low'\n  reason: string\n}\n\nexport type ClassifierBehavior = 'deny' | 'ask' | 'allow'\n\nexport type ClassifierUsage = {\n  inputTokens: number\n  outputTokens: number\n  cacheReadInputTokens: number\n  cacheCreationInputTokens: number\n}\n\nexport type YoloClassifierResult = {\n  thinking?: string\n  shouldBlock: boolean\n  reason: string\n  unavailable?: boolean\n  /**\n   * API returned \"prompt is too long\" \u2014 the classifier transcript exceeded\n   * the context window. Deterministic (same transcript \u2192 same error), so\n   * callers should fall back to normal prompting rather than retry/fail-closed.\n   */\n  transcriptTooLong?: boolean\n  /** The model used for this classifier call */\n  model: string\n  /** Token usage from the classifier API call (for overhead telemetry) */\n  usage?: ClassifierUsage\n  /** Duration of the classifier API call in ms */\n  durationMs?: number\n  /** Character lengths of the prompt components sent to the classifier */\n  promptLengths?: {\n    systemPrompt: number\n    toolCalls: number\n    userPrompts: number\n  }\n  /** Path where error prompts were dumped (only set when unavailable due to API error) */\n  errorDumpPath?: string\n  /** Which classifier stage produced the final decision (2-stage XML only) */\n  stage?: 'fast' | 'thinking'\n  /** Token usage from stage 1 (fast) when stage 2 was also run */\n  stage1Usage?: ClassifierUsage\n  /** Duration of stage 1 in ms when stage 2 was also run */\n  stage1DurationMs?: number\n  /**\n   * API request_id (req_xxx) for stage 1. Enables joining to server-side\n   * api_usage logs for cache-miss / routing attribution. Also used for the\n   * legacy 1-stage (tool_use) classifier \u2014 the single request goes here.\n   */\n  stage1RequestId?: string\n  /**\n   * API message id (msg_xxx) for stage 1. Enables joining the\n   * tengu_auto_mode_decision analytics event to the classifier's actual\n   * prompt/completion in post-analysis.\n   */\n  stage1MsgId?: string\n  /** Token usage from stage 2 (thinking) when stage 2 was run */\n  stage2Usage?: ClassifierUsage\n  /** Duration of stage 2 in ms when stage 2 was run */\n  stage2DurationMs?: number\n  /** API request_id for stage 2 (set whenever stage 2 ran) */\n  stage2RequestId?: string\n  /** API message id (msg_xxx) for stage 2 (set whenever stage 2 ran) */\n  stage2MsgId?: string\n}\n\n// ============================================================================\n// Permission Explainer Types\n// ============================================================================\n\nexport type RiskLevel = 'LOW' | 'MEDIUM' | 'HIGH'\n\nexport type PermissionExplanation = {\n  riskLevel: RiskLevel\n  explanation: string\n  reasoning: string\n  risk: string\n}\n\n// ============================================================================\n// Tool Permission Context\n// ============================================================================\n\n/**\n * Mapping of permission rules by their source\n */\nexport type ToolPermissionRulesBySource = {\n  [T in PermissionRuleSource]?: string[]\n}\n\n/**\n * Context needed for permission checking in tools\n * Note: Uses a simplified DeepImmutable approximation for this types-only file\n */\nexport type ToolPermissionContext = {\n  readonly mode: PermissionMode\n  readonly additionalWorkingDirectories: ReadonlyMap<\n    string,\n    AdditionalWorkingDirectory\n  >\n  readonly alwaysAllowRules: ToolPermissionRulesBySource\n  readonly alwaysDenyRules: ToolPermissionRulesBySource\n  readonly alwaysAskRules: ToolPermissionRulesBySource\n  readonly isBypassPermissionsModeAvailable: boolean\n  readonly strippedDangerousRules?: ToolPermissionRulesBySource\n  readonly shouldAvoidPermissionPrompts?: boolean\n  readonly awaitAutomatedChecksBeforeDialog?: boolean\n  readonly prePlanMode?: PermissionMode\n}\n", "import { feature } from 'bun:bundle'\nimport z from 'zod/v4'\nimport { PAUSE_ICON } from '../../constants/figures.js'\n// Types extracted to src/types/permissions.ts to break import cycles\nimport {\n  EXTERNAL_PERMISSION_MODES,\n  type ExternalPermissionMode,\n  PERMISSION_MODES,\n  type PermissionMode,\n} from '../../types/permissions.js'\nimport { lazySchema } from '../lazySchema.js'\n\n// Re-export for backwards compatibility\nexport {\n  EXTERNAL_PERMISSION_MODES,\n  PERMISSION_MODES,\n  type ExternalPermissionMode,\n  type PermissionMode,\n}\n\nexport const permissionModeSchema = lazySchema(() => z.enum(PERMISSION_MODES))\nexport const externalPermissionModeSchema = lazySchema(() =>\n  z.enum(EXTERNAL_PERMISSION_MODES),\n)\n\ntype ModeColorKey =\n  | 'text'\n  | 'planMode'\n  | 'permission'\n  | 'autoAccept'\n  | 'error'\n  | 'warning'\n\ntype PermissionModeConfig = {\n  title: string\n  shortTitle: string\n  symbol: string\n  color: ModeColorKey\n  external: ExternalPermissionMode\n}\n\nconst PERMISSION_MODE_CONFIG: Partial<\n  Record<PermissionMode, PermissionModeConfig>\n> = {\n  default: {\n    title: 'Default',\n    shortTitle: 'Default',\n    symbol: '',\n    color: 'text',\n    external: 'default',\n  },\n  plan: {\n    title: 'Plan Mode',\n    shortTitle: 'Plan',\n    symbol: PAUSE_ICON,\n    color: 'planMode',\n    external: 'plan',\n  },\n  explore: {\n    title: 'Explore Mode',\n    shortTitle: 'Explore',\n    symbol: '\u2315',\n    color: 'planMode',\n    external: 'explore',\n  },\n  acceptEdits: {\n    title: 'Accept edits',\n    shortTitle: 'Accept',\n    symbol: '\u23F5\u23F5',\n    color: 'autoAccept',\n    external: 'acceptEdits',\n  },\n  bypassPermissions: {\n    title: 'Dangerously Skipping Permissions',\n    shortTitle: 'Danger',\n    symbol: '\u23F5\u23F5',\n    color: 'error',\n    external: 'bypassPermissions',\n  },\n  dontAsk: {\n    title: \"Don't Ask\",\n    shortTitle: 'DontAsk',\n    symbol: '\u23F5\u23F5',\n    color: 'error',\n    external: 'dontAsk',\n  },\n  ...(feature('TRANSCRIPT_CLASSIFIER')\n    ? {\n        auto: {\n          title: 'Auto mode',\n          shortTitle: 'Auto',\n          symbol: '\u23F5\u23F5',\n          color: 'warning' as ModeColorKey,\n          external: 'default' as ExternalPermissionMode,\n        },\n      }\n    : {}),\n}\n\n/**\n * Type guard to check if a PermissionMode is an ExternalPermissionMode.\n * auto is ant-only and excluded from external modes.\n */\nexport function isExternalPermissionMode(\n  mode: PermissionMode,\n): mode is ExternalPermissionMode {\n  // External users can't have auto, so always true for them\n  if (process.env.USER_TYPE !== 'ant') {\n    return true\n  }\n  return mode !== 'auto' && mode !== 'bubble'\n}\n\nfunction getModeConfig(mode: PermissionMode): PermissionModeConfig {\n  return PERMISSION_MODE_CONFIG[mode] ?? PERMISSION_MODE_CONFIG.default!\n}\n\nexport function toExternalPermissionMode(\n  mode: PermissionMode,\n): ExternalPermissionMode {\n  return getModeConfig(mode).external\n}\n\nexport function permissionModeFromString(str: string): PermissionMode {\n  return (PERMISSION_MODES as readonly string[]).includes(str)\n    ? (str as PermissionMode)\n    : 'default'\n}\n\nexport function permissionModeTitle(mode: PermissionMode): string {\n  return getModeConfig(mode).title\n}\n\nexport function isDefaultMode(mode: PermissionMode | undefined): boolean {\n  return mode === 'default' || mode === undefined\n}\n\nexport function permissionModeShortTitle(mode: PermissionMode): string {\n  return getModeConfig(mode).shortTitle\n}\n\nexport function permissionModeSymbol(mode: PermissionMode): string {\n  return getModeConfig(mode).symbol\n}\n\nexport function getModeColor(mode: PermissionMode): ModeColorKey {\n  return getModeConfig(mode).color\n}\n", "\nexport const checkProtectedNamespace = () => false;\nexport const checkProtectedCluster = () => false;\nexport const checkManagedSettingsSecurity = () => {};\nexport const handleSecurityCheckResult = () => {};\nexport const TungstenTool = null;\nexport const SuggestBackgroundPRTool = null;\nexport const VerifyPlanExecutionTool = null;\nexport const isConnectorTextBlock = () => false;\nexport const AgentTool = null;\nexport const initBundledWorkflows = () => {};\nexport const WorkflowTool = null;\nexport const run = () => {};\nexport const DESCRIPTION = '';\nexport const PROMPT = '';\nexport const getToolUseSummary = () => '';\nexport const renderToolUseMessage = () => null;\nexport const renderToolUseRejectedMessage = () => null;\nexport const renderToolUseErrorMessage = () => null;\nexport const renderToolResultMessage = () => null;\nexport const createClaudeForChromeMcpServer = () => {};\nexport const BROWSER_TOOLS = [];\nexport const COMPUTER_USE_TOOLS = [];\nexport const DEFAULT_UPLOAD_CONCURRENCY = 1;\nexport const FILE_COUNT_LIMIT = 100;\nexport const OUTPUTS_SUBDIR = 'outputs';\nexport const buildComputerUseTools = () => [];\nexport const isCoordinatorMode = () => false;\nexport class SandboxManager {\n  constructor() {}\n  start() {}\n  stop() {}\n  isEnabled() { return false; }\n  getViolations() { return []; }\n  static isSupportedPlatform() { return false; }\n  static checkDependencies() { return { supported: false }; }\n  static wrapWithSandbox(command) { return command; }\n  static async initialize() {}\n  static updateConfig() {}\n  static reset() {}\n  static getFsReadConfig() { return {}; }\n  static getFsWriteConfig() { return {}; }\n  static getNetworkRestrictionConfig() { return {}; }\n  static getIgnoreViolations() { return false; }\n  static getAllowUnixSockets() { return true; }\n  static getAllowLocalBinding() { return true; }\n  static getEnableWeakerNestedSandbox() { return false; }\n  static getProxyPort() { return 0; }\n  static getSocksProxyPort() { return 0; }\n  static getLinuxHttpSocketPath() { return ''; }\n  static getLinuxSocksSocketPath() { return ''; }\n  static async waitForNetworkInitialization() {}\n  static getSandboxViolationStore() { return new SandboxViolationStore(); }\n  static annotateStderrWithSandboxFailures(stderr) { return stderr; }\n  static cleanupAfterCommand() {}\n}\nexport class SandboxViolationStore { constructor() {} getViolations() { return []; } clear() {} }\nexport const SandboxRuntimeConfigSchema = { parse: (v) => v, safeParse: (v) => ({ success: true, data: v }) };\nexport const runChromeNativeHost = () => {};\nexport const runComputerUseMcpServer = () => {};\nexport const runDaemonWorker = () => {};\nexport const daemonMain = () => {};\nexport const templatesMain = () => {};\nexport const environmentRunnerMain = () => {};\nexport const selfHostedRunnerMain = () => {};\n// Additional exports imported by stripped-out features. esbuild requires\n// named exports be statically present; Bun's bundler was more forgiving.\nexport const WORKFLOW_TOOL_NAME = '';\nexport const API_RESIZE_PARAMS = {};\nexport const targetImageSize = () => ({ width: 0, height: 0 });\nexport const getSentinelCategory = () => null;\nexport const DEFAULT_GRANT_FLAGS = {};\nexport const bindSessionContext = (fn) => fn;\nexport const createComputerUseMcpServer = () => null;\nconst proxy = new Proxy({}, { get: () => () => {} });\nexport default proxy;\n", "// SDK Core Types - Common serializable types used by both SDK consumers and SDK builders.\n//\n// Types are generated from Zod schemas in coreSchemas.ts.\n// To modify types:\n// 1. Edit Zod schemas in coreSchemas.ts\n// 2. Run: bun scripts/generate-sdk-types.ts\n//\n// Schemas are available in coreSchemas.ts for runtime validation but are not\n// part of the public API.\n\n// Re-export sandbox types for SDK consumers\nexport type {\n  SandboxFilesystemConfig,\n  SandboxIgnoreViolations,\n  SandboxNetworkConfig,\n  SandboxSettings,\n} from '../sandboxTypes.js'\n// Re-export all generated types\nexport * from './coreTypes.generated.js'\n\n// Re-export utility types that can't be expressed as Zod schemas\nexport type { NonNullableUsage } from './sdkUtilityTypes.js'\n\n// Const arrays for runtime usage\nexport const HOOK_EVENTS = [\n  'PreToolUse',\n  'PostToolUse',\n  'PostToolUseFailure',\n  'Notification',\n  'UserPromptSubmit',\n  'SessionStart',\n  'SessionEnd',\n  'Stop',\n  'StopFailure',\n  'SubagentStart',\n  'SubagentStop',\n  'PreCompact',\n  'PostCompact',\n  'PermissionRequest',\n  'PermissionDenied',\n  'Setup',\n  'TeammateIdle',\n  'TaskCreated',\n  'TaskCompleted',\n  'Elicitation',\n  'ElicitationResult',\n  'ConfigChange',\n  'WorktreeCreate',\n  'WorktreeRemove',\n  'InstructionsLoaded',\n  'CwdChanged',\n  'FileChanged',\n] as const\n\nexport const EXIT_REASONS = [\n  'clear',\n  'resume',\n  'logout',\n  'prompt_input_exit',\n  'other',\n  'bypass_permissions_disabled',\n] as const\n", "/**\n * Main entrypoint for Tau Agent SDK types.\n *\n * This file re-exports the public SDK API from:\n * - sdk/coreTypes.ts - Common serializable types (messages, configs)\n * - sdk/runtimeTypes.ts - Non-serializable types (callbacks, interfaces)\n *\n * SDK builders who need control protocol types should import from\n * sdk/controlTypes.ts directly.\n */\n\nimport type {\n  CallToolResult,\n  ToolAnnotations,\n} from '@modelcontextprotocol/sdk/types.js'\n\n// Control protocol types for SDK builders (bridge subpath consumers)\n/** @alpha */\nexport type {\n  SDKControlRequest,\n  SDKControlResponse,\n} from './sdk/controlTypes.js'\n// Re-export core types (common serializable types)\nexport * from './sdk/coreTypes.js'\n// Re-export runtime types (callbacks, interfaces with methods)\nexport * from './sdk/runtimeTypes.js'\n\n// Re-export settings types (generated from settings JSON schema)\nexport type { Settings } from './sdk/settingsTypes.generated.js'\n// Re-export tool types (all marked @internal until SDK API stabilizes)\nexport * from './sdk/toolTypes.js'\n\n// ============================================================================\n// Functions\n// ============================================================================\n\nimport type {\n  SDKMessage,\n  SDKResultMessage,\n  SDKSessionInfo,\n  SDKUserMessage,\n} from './sdk/coreTypes.js'\n// Import types needed for function signatures\nimport type {\n  AnyZodRawShape,\n  ForkSessionOptions,\n  ForkSessionResult,\n  GetSessionInfoOptions,\n  GetSessionMessagesOptions,\n  InferShape,\n  InternalOptions,\n  InternalQuery,\n  ListSessionsOptions,\n  McpSdkServerConfigWithInstance,\n  Options,\n  Query,\n  SDKSession,\n  SDKSessionOptions,\n  SdkMcpToolDefinition,\n  SessionMessage,\n  SessionMutationOptions,\n} from './sdk/runtimeTypes.js'\n\nexport type {\n  ListSessionsOptions,\n  GetSessionInfoOptions,\n  SessionMutationOptions,\n  ForkSessionOptions,\n  ForkSessionResult,\n  SDKSessionInfo,\n}\n\nexport function tool<Schema extends AnyZodRawShape>(\n  _name: string,\n  _description: string,\n  _inputSchema: Schema,\n  _handler: (\n    args: InferShape<Schema>,\n    extra: unknown,\n  ) => Promise<CallToolResult>,\n  _extras?: {\n    annotations?: ToolAnnotations\n    searchHint?: string\n    alwaysLoad?: boolean\n  },\n): SdkMcpToolDefinition<Schema> {\n  throw new Error('not implemented')\n}\n\ntype CreateSdkMcpServerOptions = {\n  name: string\n  version?: string\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  tools?: Array<SdkMcpToolDefinition<any>>\n}\n\n/**\n * Creates an MCP server instance that can be used with the SDK transport.\n * This allows SDK users to define custom tools that run in the same process.\n *\n * If your SDK MCP calls will run longer than 60s, override CLAUDE_CODE_STREAM_CLOSE_TIMEOUT\n */\nexport function createSdkMcpServer(\n  _options: CreateSdkMcpServerOptions,\n): McpSdkServerConfigWithInstance {\n  throw new Error('not implemented')\n}\n\nexport class AbortError extends Error {}\n\n/** @internal */\nexport function query(_params: {\n  prompt: string | AsyncIterable<SDKUserMessage>\n  options?: InternalOptions\n}): InternalQuery\nexport function query(_params: {\n  prompt: string | AsyncIterable<SDKUserMessage>\n  options?: Options\n}): Query\nexport function query(): Query {\n  throw new Error('query is not implemented in the SDK')\n}\n\n/**\n * V2 API - UNSTABLE\n * Create a persistent session for multi-turn conversations.\n * @alpha\n */\nexport function unstable_v2_createSession(\n  _options: SDKSessionOptions,\n): SDKSession {\n  throw new Error('unstable_v2_createSession is not implemented in the SDK')\n}\n\n/**\n * V2 API - UNSTABLE\n * Resume an existing session by ID.\n * @alpha\n */\nexport function unstable_v2_resumeSession(\n  _sessionId: string,\n  _options: SDKSessionOptions,\n): SDKSession {\n  throw new Error('unstable_v2_resumeSession is not implemented in the SDK')\n}\n\n// @[MODEL LAUNCH]: Update the example model ID in this docstring.\n/**\n * V2 API - UNSTABLE\n * One-shot convenience function for single prompts.\n * @alpha\n *\n * @example\n * ```typescript\n * const result = await unstable_v2_prompt(\"What files are here?\", {\n *   model: 'claude-sonnet-4-6'\n * })\n * ```\n */\nexport async function unstable_v2_prompt(\n  _message: string,\n  _options: SDKSessionOptions,\n): Promise<SDKResultMessage> {\n  throw new Error('unstable_v2_prompt is not implemented in the SDK')\n}\n\n/**\n * Reads a session's conversation messages from its JSONL transcript file.\n *\n * Parses the transcript, builds the conversation chain via parentUuid links,\n * and returns user/assistant messages in chronological order. Set\n * `includeSystemMessages: true` in options to also include system messages.\n *\n * @param sessionId - UUID of the session to read\n * @param options - Optional dir, limit, offset, and includeSystemMessages\n * @returns Array of messages, or empty array if session not found\n */\nexport async function getSessionMessages(\n  _sessionId: string,\n  _options?: GetSessionMessagesOptions,\n): Promise<SessionMessage[]> {\n  throw new Error('getSessionMessages is not implemented in the SDK')\n}\n\n/**\n * List sessions with metadata.\n *\n * When `dir` is provided, returns sessions for that project directory\n * and its git worktrees. When omitted, returns sessions across all\n * projects.\n *\n * Use `limit` and `offset` for pagination.\n *\n * @example\n * ```typescript\n * // List sessions for a specific project\n * const sessions = await listSessions({ dir: '/path/to/project' })\n *\n * // Paginate\n * const page1 = await listSessions({ limit: 50 })\n * const page2 = await listSessions({ limit: 50, offset: 50 })\n * ```\n */\nexport async function listSessions(\n  _options?: ListSessionsOptions,\n): Promise<SDKSessionInfo[]> {\n  throw new Error('listSessions is not implemented in the SDK')\n}\n\n/**\n * Reads metadata for a single session by ID. Unlike `listSessions`, this only\n * reads the single session file rather than every session in the project.\n * Returns undefined if the session file is not found, is a sidechain session,\n * or has no extractable summary.\n *\n * @param sessionId - UUID of the session\n * @param options - `{ dir?: string }` project path; omit to search all project directories\n */\nexport async function getSessionInfo(\n  _sessionId: string,\n  _options?: GetSessionInfoOptions,\n): Promise<SDKSessionInfo | undefined> {\n  throw new Error('getSessionInfo is not implemented in the SDK')\n}\n\n/**\n * Rename a session. Appends a custom-title entry to the session's JSONL file.\n * @param sessionId - UUID of the session\n * @param title - New title\n * @param options - `{ dir?: string }` project path; omit to search all projects\n */\nexport async function renameSession(\n  _sessionId: string,\n  _title: string,\n  _options?: SessionMutationOptions,\n): Promise<void> {\n  throw new Error('renameSession is not implemented in the SDK')\n}\n\n/**\n * Tag a session. Pass null to clear the tag.\n * @param sessionId - UUID of the session\n * @param tag - Tag string, or null to clear\n * @param options - `{ dir?: string }` project path; omit to search all projects\n */\nexport async function tagSession(\n  _sessionId: string,\n  _tag: string | null,\n  _options?: SessionMutationOptions,\n): Promise<void> {\n  throw new Error('tagSession is not implemented in the SDK')\n}\n\n/**\n * Fork a session into a new branch with fresh UUIDs.\n *\n * Copies transcript messages from the source session into a new session file,\n * remapping every message UUID and preserving the parentUuid chain. Supports\n * `upToMessageId` for branching from a specific point in the conversation.\n *\n * Forked sessions start without undo history (file-history snapshots are not\n * copied).\n *\n * @param sessionId - UUID of the source session\n * @param options - `{ dir?, upToMessageId?, title? }`\n * @returns `{ sessionId }` \u2014 UUID of the new forked session\n */\nexport async function forkSession(\n  _sessionId: string,\n  _options?: ForkSessionOptions,\n): Promise<ForkSessionResult> {\n  throw new Error('forkSession is not implemented in the SDK')\n}\n\n// ============================================================================\n// Assistant daemon primitives (internal)\n// ============================================================================\n\n/**\n * A scheduled task from `<dir>/.claude/scheduled_tasks.json`.\n * @internal\n */\nexport type CronTask = {\n  id: string\n  cron: string\n  prompt: string\n  createdAt: number\n  recurring?: boolean\n}\n\n/**\n * Cron scheduler tuning knobs (jitter + expiry). Sourced at runtime from the\n * `tengu_kairos_cron_config` GrowthBook config in CLI sessions; daemon hosts\n * pass this through `watchScheduledTasks({ getJitterConfig })` to get the\n * same tuning.\n * @internal\n */\nexport type CronJitterConfig = {\n  recurringFrac: number\n  recurringCapMs: number\n  oneShotMaxMs: number\n  oneShotFloorMs: number\n  oneShotMinuteMod: number\n  recurringMaxAgeMs: number\n}\n\n/**\n * Event yielded by `watchScheduledTasks()`.\n * @internal\n */\nexport type ScheduledTaskEvent =\n  | { type: 'fire'; task: CronTask }\n  | { type: 'missed'; tasks: CronTask[] }\n\n/**\n * Handle returned by `watchScheduledTasks()`.\n * @internal\n */\nexport type ScheduledTasksHandle = {\n  /** Async stream of fire/missed events. Drain with `for await`. */\n  events(): AsyncGenerator<ScheduledTaskEvent>\n  /**\n   * Epoch ms of the soonest scheduled fire across all loaded tasks, or null\n   * if nothing is scheduled. Useful for deciding whether to tear down an\n   * idle agent subprocess or keep it warm for an imminent fire.\n   */\n  getNextFireTime(): number | null\n}\n\n/**\n * Watch `<dir>/.claude/scheduled_tasks.json` and yield events as tasks fire.\n *\n * Acquires the per-directory scheduler lock (PID-based liveness) so a REPL\n * session in the same dir won't double-fire. Releases the lock and closes\n * the file watcher when the signal aborts.\n *\n * - `fire` \u2014 a task whose cron schedule was met. One-shot tasks are already\n *   deleted from the file when this yields; recurring tasks are rescheduled\n *   (or deleted if aged out).\n * - `missed` \u2014 one-shot tasks whose window passed while the daemon was down.\n *   Yielded once on initial load; a background delete removes them from the\n *   file shortly after.\n *\n * Intended for daemon architectures that own the scheduler externally and\n * spawn the agent via `query()`; the agent subprocess (`-p` mode) does not\n * run its own scheduler.\n *\n * @internal\n */\nexport function watchScheduledTasks(_opts: {\n  dir: string\n  signal: AbortSignal\n  getJitterConfig?: () => CronJitterConfig\n}): ScheduledTasksHandle {\n  throw new Error('not implemented')\n}\n\n/**\n * Format missed one-shot tasks into a prompt that asks the model to confirm\n * with the user (via AskUserQuestion) before executing.\n * @internal\n */\nexport function buildMissedTaskNotification(_missed: CronTask[]): string {\n  throw new Error('not implemented')\n}\n\n/**\n * A user message typed on claude.ai, extracted from the bridge WS.\n * @internal\n */\nexport type InboundPrompt = {\n  content: string | unknown[]\n  uuid?: string\n}\n\n/**\n * Options for connectRemoteControl.\n * @internal\n */\nexport type ConnectRemoteControlOptions = {\n  dir: string\n  name?: string\n  workerType?: string\n  branch?: string\n  gitRepoUrl?: string | null\n  getAccessToken: () => string | undefined\n  baseUrl: string\n  orgUUID: string\n  model: string\n}\n\n/**\n * Handle returned by connectRemoteControl. Write query() yields in,\n * read inbound prompts out. See src/assistant/daemonBridge.ts for full\n * field documentation.\n * @internal\n */\nexport type RemoteControlHandle = {\n  sessionUrl: string\n  environmentId: string\n  bridgeSessionId: string\n  write(msg: SDKMessage): void\n  sendResult(): void\n  sendControlRequest(req: unknown): void\n  sendControlResponse(res: unknown): void\n  sendControlCancelRequest(requestId: string): void\n  inboundPrompts(): AsyncGenerator<InboundPrompt>\n  controlRequests(): AsyncGenerator<unknown>\n  permissionResponses(): AsyncGenerator<unknown>\n  onStateChange(\n    cb: (\n      state: 'ready' | 'connected' | 'reconnecting' | 'failed',\n      detail?: string,\n    ) => void,\n  ): void\n  teardown(): Promise<void>\n}\n\n/**\n * Hold a claude.ai remote-control bridge connection from a daemon process.\n *\n * The daemon owns the WebSocket in the PARENT process \u2014 if the agent\n * subprocess (spawned via `query()`) crashes, the daemon respawns it while\n * claude.ai keeps the same session. Contrast with `query.enableRemoteControl`\n * which puts the WS in the CHILD process (dies with the agent).\n *\n * Pipe `query()` yields through `write()` + `sendResult()`. Read\n * `inboundPrompts()` (user typed on claude.ai) into `query()`'s input\n * stream. Handle `controlRequests()` locally (interrupt \u2192 abort, set_model\n * \u2192 reconfigure).\n *\n * Skips the `tengu_ccr_bridge` gate and policy-limits check \u2014 @internal\n * caller is pre-entitled. OAuth is still required (env var or keychain).\n *\n * Returns null on no-OAuth or registration failure.\n *\n * @internal\n */\nexport async function connectRemoteControl(\n  _opts: ConnectRemoteControlOptions,\n): Promise<RemoteControlHandle | null> {\n  throw new Error('not implemented')\n}\n", "export const SHELL_TYPES = ['bash', 'powershell'] as const\nexport type ShellType = (typeof SHELL_TYPES)[number]\nexport const DEFAULT_HOOK_SHELL: ShellType = 'bash'\n\nexport type ShellProvider = {\n  type: ShellType\n  shellPath: string\n  detached: boolean\n\n  /**\n   * Build the full command string including all shell-specific setup.\n   * For bash: source snapshot, session env, disable extglob, eval-wrap, pwd tracking.\n   */\n  buildExecCommand(\n    command: string,\n    opts: {\n      id: number | string\n      sandboxTmpDir?: string\n      useSandbox: boolean\n    },\n  ): Promise<{ commandString: string; cwdFilePath: string }>\n\n  /**\n   * Shell args for spawn (e.g., ['-l', '-c', cmd] for bash).\n   */\n  getSpawnArgs(commandString: string): string[]\n\n  /**\n   * Extra env vars for this shell type.\n   * May perform async initialization (e.g., tmux socket setup for bash).\n   */\n  getEnvironmentOverrides(command: string): Promise<Record<string, string>>\n}\n", "/**\n * Hook Zod schemas extracted to break import cycles.\n *\n * This file contains hook-related schema definitions that were originally\n * in src/utils/settings/types.ts. By extracting them here, we break the\n * circular dependency between settings/types.ts and plugins/schemas.ts.\n *\n * Both files now import from this shared location instead of each other.\n */\n\nimport { HOOK_EVENTS, type HookEvent } from 'src/entrypoints/agentSdkTypes.js'\nimport { z } from 'zod/v4'\nimport { lazySchema } from '../utils/lazySchema.js'\nimport { SHELL_TYPES } from '../utils/shell/shellProvider.js'\n\n// Shared schema for the `if` condition field.\n// Uses permission rule syntax (e.g., \"Bash(git *)\", \"Read(*.ts)\") to filter hooks\n// before spawning. Evaluated against the hook input's tool_name and tool_input.\nconst IfConditionSchema = lazySchema(() =>\n  z\n    .string()\n    .optional()\n    .describe(\n      'Permission rule syntax to filter when this hook runs (e.g., \"Bash(git *)\"). ' +\n        'Only runs if the tool call matches the pattern. Avoids spawning hooks for non-matching commands.',\n    ),\n)\n\n// Internal factory for individual hook schemas (shared between exported\n// discriminated union members and the HookCommandSchema factory)\nfunction buildHookSchemas() {\n  const BashCommandHookSchema = z.object({\n    type: z.literal('command').describe('Shell command hook type'),\n    command: z.string().describe('Shell command to execute'),\n    if: IfConditionSchema(),\n    shell: z\n      .enum(SHELL_TYPES)\n      .optional()\n      .describe(\n        \"Shell interpreter. 'bash' uses your $SHELL (bash/zsh/sh); 'powershell' uses pwsh. Defaults to bash.\",\n      ),\n    timeout: z\n      .number()\n      .positive()\n      .optional()\n      .describe('Timeout in seconds for this specific command'),\n    statusMessage: z\n      .string()\n      .optional()\n      .describe('Custom status message to display in spinner while hook runs'),\n    once: z\n      .boolean()\n      .optional()\n      .describe('If true, hook runs once and is removed after execution'),\n    async: z\n      .boolean()\n      .optional()\n      .describe('If true, hook runs in background without blocking'),\n    asyncRewake: z\n      .boolean()\n      .optional()\n      .describe(\n        'If true, hook runs in background and wakes the model on exit code 2 (blocking error). Implies async.',\n      ),\n  })\n\n  const PromptHookSchema = z.object({\n    type: z.literal('prompt').describe('LLM prompt hook type'),\n    prompt: z\n      .string()\n      .describe(\n        'Prompt to evaluate with LLM. Use $ARGUMENTS placeholder for hook input JSON.',\n      ),\n    if: IfConditionSchema(),\n    timeout: z\n      .number()\n      .positive()\n      .optional()\n      .describe('Timeout in seconds for this specific prompt evaluation'),\n    // @[MODEL LAUNCH]: Update the example model ID in the .describe() strings below (prompt + agent hooks).\n    model: z\n      .string()\n      .optional()\n      .describe(\n        'Model to use for this prompt hook (e.g., \"claude-sonnet-4-6\"). If not specified, uses the default small fast model.',\n      ),\n    statusMessage: z\n      .string()\n      .optional()\n      .describe('Custom status message to display in spinner while hook runs'),\n    once: z\n      .boolean()\n      .optional()\n      .describe('If true, hook runs once and is removed after execution'),\n  })\n\n  const HttpHookSchema = z.object({\n    type: z.literal('http').describe('HTTP hook type'),\n    url: z.string().url().describe('URL to POST the hook input JSON to'),\n    if: IfConditionSchema(),\n    timeout: z\n      .number()\n      .positive()\n      .optional()\n      .describe('Timeout in seconds for this specific request'),\n    headers: z\n      .record(z.string(), z.string())\n      .optional()\n      .describe(\n        'Additional headers to include in the request. Values may reference environment variables using $VAR_NAME or ${VAR_NAME} syntax (e.g., \"Authorization\": \"Bearer $MY_TOKEN\"). Only variables listed in allowedEnvVars will be interpolated.',\n      ),\n    allowedEnvVars: z\n      .array(z.string())\n      .optional()\n      .describe(\n        'Explicit list of environment variable names that may be interpolated in header values. Only variables listed here will be resolved; all other $VAR references are left as empty strings. Required for env var interpolation to work.',\n      ),\n    statusMessage: z\n      .string()\n      .optional()\n      .describe('Custom status message to display in spinner while hook runs'),\n    once: z\n      .boolean()\n      .optional()\n      .describe('If true, hook runs once and is removed after execution'),\n  })\n\n  const AgentHookSchema = z.object({\n    type: z.literal('agent').describe('Agentic verifier hook type'),\n    // DO NOT add .transform() here. This schema is used by parseSettingsFile,\n    // and updateSettingsForSource round-trips the parsed result through\n    // JSON.stringify \u2014 a transformed function value is silently dropped,\n    // deleting the user's prompt from settings.json (gh-24920, CC-79). The\n    // transform (from #10594) wrapped the string in `(_msgs) => prompt`\n    // for a programmatic-construction use case in ExitPlanModeV2Tool that\n    // has since been refactored into VerifyPlanExecutionTool, which no\n    // longer constructs AgentHook objects at all.\n    prompt: z\n      .string()\n      .describe(\n        'Prompt describing what to verify (e.g. \"Verify that unit tests ran and passed.\"). Use $ARGUMENTS placeholder for hook input JSON.',\n      ),\n    if: IfConditionSchema(),\n    timeout: z\n      .number()\n      .positive()\n      .optional()\n      .describe('Timeout in seconds for agent execution (default 60)'),\n    model: z\n      .string()\n      .optional()\n      .describe(\n        'Model to use for this agent hook (e.g., \"claude-sonnet-4-6\"). If not specified, uses Haiku.',\n      ),\n    statusMessage: z\n      .string()\n      .optional()\n      .describe('Custom status message to display in spinner while hook runs'),\n    once: z\n      .boolean()\n      .optional()\n      .describe('If true, hook runs once and is removed after execution'),\n  })\n\n  return {\n    BashCommandHookSchema,\n    PromptHookSchema,\n    HttpHookSchema,\n    AgentHookSchema,\n  }\n}\n\n/**\n * Schema for hook command (excludes function hooks - they can't be persisted)\n */\nexport const HookCommandSchema = lazySchema(() => {\n  const {\n    BashCommandHookSchema,\n    PromptHookSchema,\n    AgentHookSchema,\n    HttpHookSchema,\n  } = buildHookSchemas()\n  return z.discriminatedUnion('type', [\n    BashCommandHookSchema,\n    PromptHookSchema,\n    AgentHookSchema,\n    HttpHookSchema,\n  ])\n})\n\n/**\n * Schema for matcher configuration with multiple hooks\n */\nexport const HookMatcherSchema = lazySchema(() =>\n  z.object({\n    matcher: z\n      .string()\n      .optional()\n      .describe('String pattern to match (e.g. tool names like \"Write\")'), // String (e.g. Write) to match values related to the hook event, e.g. tool names\n    hooks: z\n      .array(HookCommandSchema())\n      .describe('List of hooks to execute when the matcher matches'),\n  }),\n)\n\n/**\n * Schema for hooks configuration\n * The key is the hook event. The value is an array of matcher configurations.\n * Uses partialRecord since not all hook events need to be defined.\n */\nexport const HooksSchema = lazySchema(() =>\n  z.partialRecord(z.enum(HOOK_EVENTS), z.array(HookMatcherSchema())),\n)\n\n// Inferred types from schemas\nexport type HookCommand = z.infer<ReturnType<typeof HookCommandSchema>>\nexport type BashCommandHook = Extract<HookCommand, { type: 'command' }>\nexport type PromptHook = Extract<HookCommand, { type: 'prompt' }>\nexport type AgentHook = Extract<HookCommand, { type: 'agent' }>\nexport type HttpHook = Extract<HookCommand, { type: 'http' }>\nexport type HookMatcher = z.infer<ReturnType<typeof HookMatcherSchema>>\nexport type HooksSettings = Partial<Record<HookEvent, HookMatcher[]>>\n", "import type { Client } from '@modelcontextprotocol/sdk/client/index.js'\nimport type {\n  Resource,\n  ServerCapabilities,\n} from '@modelcontextprotocol/sdk/types.js'\nimport { z } from 'zod/v4'\nimport { lazySchema } from '../../utils/lazySchema.js'\n\n// Configuration schemas and types\nexport const ConfigScopeSchema = lazySchema(() =>\n  z.enum([\n    'local',\n    'user',\n    'project',\n    'dynamic',\n    'enterprise',\n    'claudeai',\n    'managed',\n  ]),\n)\nexport type ConfigScope = z.infer<ReturnType<typeof ConfigScopeSchema>>\n\nexport const TransportSchema = lazySchema(() =>\n  z.enum(['stdio', 'sse', 'sse-ide', 'http', 'ws', 'sdk']),\n)\nexport type Transport = z.infer<ReturnType<typeof TransportSchema>>\n\nexport const McpStdioServerConfigSchema = lazySchema(() =>\n  z.object({\n    type: z.literal('stdio').optional(), // Optional for backwards compatibility\n    command: z.string().min(1, 'Command cannot be empty'),\n    args: z.array(z.string()).default([]),\n    env: z.record(z.string(), z.string()).optional(),\n  }),\n)\n\n// Cross-App Access (XAA / SEP-990): just a per-server flag. IdP connection\n// details (issuer, clientId, callbackPort) come from settings.xaaIdp \u2014 configured\n// once, shared across all XAA-enabled servers. clientId/clientSecret (parent\n// oauth config + keychain slot) are for the MCP server's AS.\nconst McpXaaConfigSchema = lazySchema(() => z.boolean())\n\nconst McpOAuthConfigSchema = lazySchema(() =>\n  z.object({\n    clientId: z.string().optional(),\n    callbackPort: z.number().int().positive().optional(),\n    authServerMetadataUrl: z\n      .string()\n      .url()\n      .startsWith('https://', {\n        message: 'authServerMetadataUrl must use https://',\n      })\n      .optional(),\n    xaa: McpXaaConfigSchema().optional(),\n  }),\n)\n\nexport const McpSSEServerConfigSchema = lazySchema(() =>\n  z.object({\n    type: z.literal('sse'),\n    url: z.string(),\n    headers: z.record(z.string(), z.string()).optional(),\n    headersHelper: z.string().optional(),\n    oauth: McpOAuthConfigSchema().optional(),\n  }),\n)\n\n// Internal-only server type for IDE extensions\nexport const McpSSEIDEServerConfigSchema = lazySchema(() =>\n  z.object({\n    type: z.literal('sse-ide'),\n    url: z.string(),\n    ideName: z.string(),\n    ideRunningInWindows: z.boolean().optional(),\n  }),\n)\n\n// Internal-only server type for IDE extensions\nexport const McpWebSocketIDEServerConfigSchema = lazySchema(() =>\n  z.object({\n    type: z.literal('ws-ide'),\n    url: z.string(),\n    ideName: z.string(),\n    authToken: z.string().optional(),\n    ideRunningInWindows: z.boolean().optional(),\n  }),\n)\n\nexport const McpHTTPServerConfigSchema = lazySchema(() =>\n  z.object({\n    type: z.literal('http'),\n    url: z.string(),\n    headers: z.record(z.string(), z.string()).optional(),\n    headersHelper: z.string().optional(),\n    oauth: McpOAuthConfigSchema().optional(),\n  }),\n)\n\nexport const McpWebSocketServerConfigSchema = lazySchema(() =>\n  z.object({\n    type: z.literal('ws'),\n    url: z.string(),\n    headers: z.record(z.string(), z.string()).optional(),\n    headersHelper: z.string().optional(),\n  }),\n)\n\nexport const McpSdkServerConfigSchema = lazySchema(() =>\n  z.object({\n    type: z.literal('sdk'),\n    name: z.string(),\n  }),\n)\n\n// Config type for Claude.ai proxy servers\nexport const McpClaudeAIProxyServerConfigSchema = lazySchema(() =>\n  z.object({\n    type: z.literal('claudeai-proxy'),\n    url: z.string(),\n    id: z.string(),\n  }),\n)\n\nexport const McpServerConfigSchema = lazySchema(() =>\n  z.union([\n    McpStdioServerConfigSchema(),\n    McpSSEServerConfigSchema(),\n    McpSSEIDEServerConfigSchema(),\n    McpWebSocketIDEServerConfigSchema(),\n    McpHTTPServerConfigSchema(),\n    McpWebSocketServerConfigSchema(),\n    McpSdkServerConfigSchema(),\n    McpClaudeAIProxyServerConfigSchema(),\n  ]),\n)\n\nexport type McpStdioServerConfig = z.infer<\n  ReturnType<typeof McpStdioServerConfigSchema>\n>\nexport type McpSSEServerConfig = z.infer<\n  ReturnType<typeof McpSSEServerConfigSchema>\n>\nexport type McpSSEIDEServerConfig = z.infer<\n  ReturnType<typeof McpSSEIDEServerConfigSchema>\n>\nexport type McpWebSocketIDEServerConfig = z.infer<\n  ReturnType<typeof McpWebSocketIDEServerConfigSchema>\n>\nexport type McpHTTPServerConfig = z.infer<\n  ReturnType<typeof McpHTTPServerConfigSchema>\n>\nexport type McpWebSocketServerConfig = z.infer<\n  ReturnType<typeof McpWebSocketServerConfigSchema>\n>\nexport type McpSdkServerConfig = z.infer<\n  ReturnType<typeof McpSdkServerConfigSchema>\n>\nexport type McpClaudeAIProxyServerConfig = z.infer<\n  ReturnType<typeof McpClaudeAIProxyServerConfigSchema>\n>\nexport type McpServerConfig = z.infer<ReturnType<typeof McpServerConfigSchema>>\n\nexport type ScopedMcpServerConfig = McpServerConfig & {\n  scope: ConfigScope\n  // For plugin-provided servers: the providing plugin's LoadedPlugin.source\n  // (e.g. 'slack@anthropic'). Stashed at config-build time so the channel\n  // gate doesn't have to race AppState.plugins.enabled hydration.\n  pluginSource?: string\n}\n\nexport const McpJsonConfigSchema = lazySchema(() =>\n  z.object({\n    mcpServers: z.record(z.string(), McpServerConfigSchema()),\n  }),\n)\n\nexport type McpJsonConfig = z.infer<ReturnType<typeof McpJsonConfigSchema>>\n\n// Server connection types\nexport type ConnectedMCPServer = {\n  client: Client\n  name: string\n  type: 'connected'\n  capabilities: ServerCapabilities\n  serverInfo?: {\n    name: string\n    version: string\n  }\n  instructions?: string\n  config: ScopedMcpServerConfig\n  cleanup: () => Promise<void>\n}\n\nexport type FailedMCPServer = {\n  name: string\n  type: 'failed'\n  config: ScopedMcpServerConfig\n  error?: string\n}\n\nexport type NeedsAuthMCPServer = {\n  name: string\n  type: 'needs-auth'\n  config: ScopedMcpServerConfig\n}\n\nexport type PendingMCPServer = {\n  name: string\n  type: 'pending'\n  config: ScopedMcpServerConfig\n  reconnectAttempt?: number\n  maxReconnectAttempts?: number\n}\n\nexport type DisabledMCPServer = {\n  name: string\n  type: 'disabled'\n  config: ScopedMcpServerConfig\n}\n\nexport type MCPServerConnection =\n  | ConnectedMCPServer\n  | FailedMCPServer\n  | NeedsAuthMCPServer\n  | PendingMCPServer\n  | DisabledMCPServer\n\n// Resource types\nexport type ServerResource = Resource & { server: string }\n\n// MCP CLI State types\nexport interface SerializedTool {\n  name: string\n  description: string\n  inputJSONSchema?: {\n    [x: string]: unknown\n    type: 'object'\n    properties?: {\n      [x: string]: unknown\n    }\n  }\n  isMcp?: boolean\n  originalToolName?: string // Original unnormalized tool name from MCP server\n}\n\nexport interface SerializedClient {\n  name: string\n  type: 'connected' | 'failed' | 'needs-auth' | 'pending' | 'disabled'\n  capabilities?: ServerCapabilities\n}\n\nexport interface MCPCliState {\n  clients: SerializedClient[]\n  configs: Record<string, ScopedMcpServerConfig>\n  tools: SerializedTool[]\n  resources: Record<string, ServerResource[]>\n  normalizedNames?: Record<string, string> // Maps normalized names to original names\n}\n", "import { z } from 'zod/v4'\r\nimport { HooksSchema } from '../../schemas/hooks.js'\r\nimport { McpServerConfigSchema } from '../../services/mcp/types.js'\r\nimport { lazySchema } from '../lazySchema.js'\r\n\r\n/**\r\n * First-layer defense against official marketplace impersonation.\r\n *\r\n * This validation blocks direct impersonation attempts like \"anthropic-official\",\r\n * \"claude-marketplace\", etc. Indirect variations (e.g., \"my-claude-marketplace\")\r\n * are not blocked intentionally to avoid false positives on legitimate names.\r\n * Source org verification provides additional protection at registration/install time.\r\n */\r\n\r\n/**\r\n * Official marketplace names that are reserved for Anthropic/Claude official use.\r\n * These names are allowed ONLY for official marketplaces and blocked for third parties.\r\n */\r\nexport const ALLOWED_OFFICIAL_MARKETPLACE_NAMES = new Set([\r\n  'claude-code-marketplace',\r\n  'claude-code-plugins',\r\n  'claude-plugins-official',\r\n  'anthropic-marketplace',\r\n  'anthropic-plugins',\r\n  'agent-skills',\r\n  'life-sciences',\r\n  'knowledge-work-plugins',\r\n])\r\n\r\n/**\r\n * Official marketplaces that should NOT auto-update by default.\r\n * These are still reserved/allowed names, but opt out of the auto-update\r\n * default that other official marketplaces receive.\r\n */\r\nconst NO_AUTO_UPDATE_OFFICIAL_MARKETPLACES = new Set(['knowledge-work-plugins'])\r\n\r\n/**\r\n * Check if auto-update is enabled for a marketplace.\r\n * Uses the stored value if set, otherwise defaults based on whether\r\n * it's an official Anthropic marketplace (true) or not (false).\r\n * Official marketplaces in NO_AUTO_UPDATE_OFFICIAL_MARKETPLACES are excluded\r\n * from the auto-update default.\r\n *\r\n * @param marketplaceName - The name of the marketplace\r\n * @param entry - The marketplace entry (may have autoUpdate set)\r\n * @returns Whether auto-update is enabled for this marketplace\r\n */\r\nexport function isMarketplaceAutoUpdate(\r\n  marketplaceName: string,\r\n  entry: { autoUpdate?: boolean },\r\n): boolean {\r\n  const normalizedName = marketplaceName.toLowerCase()\r\n  return (\r\n    entry.autoUpdate ??\r\n    (ALLOWED_OFFICIAL_MARKETPLACE_NAMES.has(normalizedName) &&\r\n      !NO_AUTO_UPDATE_OFFICIAL_MARKETPLACES.has(normalizedName))\r\n  )\r\n}\r\n\r\n/**\r\n * Pattern to detect names that impersonate official Anthropic/Claude marketplaces.\r\n *\r\n * Matches names containing variations like:\r\n * - \"official\" combined with \"anthropic\" or \"claude\" (e.g., \"official-claude-plugins\")\r\n * - \"anthropic\" or \"claude\" combined with \"official\" (e.g., \"claude-official\")\r\n * - Names starting with \"anthropic\" or \"claude\" followed by official-sounding terms\r\n *   like \"marketplace\", \"plugins\" (e.g., \"anthropic-marketplace-new\", \"claude-plugins-v2\")\r\n *\r\n * The pattern is case-insensitive.\r\n */\r\nexport const BLOCKED_OFFICIAL_NAME_PATTERN =\r\n  /(?:official[^a-z0-9]*(anthropic|claude)|(?:anthropic|claude)[^a-z0-9]*official|^(?:anthropic|claude)[^a-z0-9]*(marketplace|plugins|official))/i\r\n\r\n/**\r\n * Pattern to detect non-ASCII characters that could be used for homograph attacks.\r\n * Marketplace names should only contain ASCII characters to prevent impersonation\r\n * via lookalike Unicode characters (e.g., Cyrillic '\u0430' instead of Latin 'a').\r\n */\r\nconst NON_ASCII_PATTERN = /[^\\u0020-\\u007E]/\r\n\r\n/**\r\n * Check if a marketplace name impersonates an official Anthropic/Claude marketplace.\r\n *\r\n * @param name - The marketplace name to check\r\n * @returns true if the name is blocked (impersonates official), false if allowed\r\n */\r\nexport function isBlockedOfficialName(name: string): boolean {\r\n  // If it's in the allowed list, it's not blocked\r\n  if (ALLOWED_OFFICIAL_MARKETPLACE_NAMES.has(name.toLowerCase())) {\r\n    return false\r\n  }\r\n\r\n  // Block names with non-ASCII characters to prevent homograph attacks\r\n  // (e.g., using Cyrillic '\u0430' to impersonate 'anthropic')\r\n  if (NON_ASCII_PATTERN.test(name)) {\r\n    return true\r\n  }\r\n\r\n  // Check if it matches the blocked pattern\r\n  return BLOCKED_OFFICIAL_NAME_PATTERN.test(name)\r\n}\r\n\r\n/**\r\n * The official GitHub organization for Anthropic marketplaces.\r\n * Reserved names must come from this org.\r\n */\r\nexport const OFFICIAL_GITHUB_ORG = 'anthropics'\r\n\r\n/**\r\n * Validate that a marketplace with a reserved name comes from the official source.\r\n *\r\n * Reserved names (in ALLOWED_OFFICIAL_MARKETPLACE_NAMES) can only be used by\r\n * marketplaces from the official Anthropic GitHub organization.\r\n *\r\n * @param name - The marketplace name\r\n * @param source - The marketplace source configuration\r\n * @returns An error message if validation fails, or null if valid\r\n */\r\nexport function validateOfficialNameSource(\r\n  name: string,\r\n  source: { source: string; repo?: string; url?: string },\r\n): string | null {\r\n  const normalizedName = name.toLowerCase()\r\n\r\n  // Only validate reserved names\r\n  if (!ALLOWED_OFFICIAL_MARKETPLACE_NAMES.has(normalizedName)) {\r\n    return null // Not a reserved name, no source validation needed\r\n  }\r\n\r\n  // Check for GitHub source type\r\n  if (source.source === 'github') {\r\n    // Verify the repo is from the official org\r\n    const repo = source.repo || ''\r\n    if (!repo.toLowerCase().startsWith(`${OFFICIAL_GITHUB_ORG}/`)) {\r\n      return `The name '${name}' is reserved for official Anthropic marketplaces. Only repositories from 'github.com/${OFFICIAL_GITHUB_ORG}/' can use this name.`\r\n    }\r\n    return null // Valid: reserved name from official GitHub source\r\n  }\r\n\r\n  // Check for git URL source type\r\n  if (source.source === 'git' && source.url) {\r\n    const url = source.url.toLowerCase()\r\n    // Check for HTTPS URL format: https://github.com/anthropics/...\r\n    // or SSH format: git@github.com:anthropics/...\r\n    const isHttpsAnthropics = url.includes('github.com/anthropics/')\r\n    const isSshAnthropics = url.includes('git@github.com:anthropics/')\r\n\r\n    if (isHttpsAnthropics || isSshAnthropics) {\r\n      return null // Valid: reserved name from official git URL\r\n    }\r\n\r\n    return `The name '${name}' is reserved for official Anthropic marketplaces. Only repositories from 'github.com/${OFFICIAL_GITHUB_ORG}/' can use this name.`\r\n  }\r\n\r\n  // Reserved names must come from GitHub (either 'github' or 'git' source)\r\n  return `The name '${name}' is reserved for official Anthropic marketplaces and can only be used with GitHub sources from the '${OFFICIAL_GITHUB_ORG}' organization.`\r\n}\r\n\r\n/**\r\n * Schema for relative file paths that must start with './'\r\n */\r\nconst RelativePath = lazySchema(() => z.string().startsWith('./'))\r\n\r\n/**\r\n * Schema for relative paths to JSON files\r\n */\r\nconst RelativeJSONPath = lazySchema(() => RelativePath().endsWith('.json'))\r\n\r\n/**\r\n * Schema for MCPB (MCP Bundle) file paths\r\n * Supports both local relative paths and remote URLs\r\n */\r\nconst McpbPath = lazySchema(() =>\r\n  z.union([\r\n    RelativePath()\r\n      .refine(path => path.endsWith('.mcpb') || path.endsWith('.dxt'), {\r\n        message: 'MCPB file path must end with .mcpb or .dxt',\r\n      })\r\n      .describe('Path to MCPB file relative to plugin root'),\r\n    z\r\n      .string()\r\n      .url()\r\n      .refine(url => url.endsWith('.mcpb') || url.endsWith('.dxt'), {\r\n        message: 'MCPB URL must end with .mcpb or .dxt',\r\n      })\r\n      .describe('URL to MCPB file'),\r\n  ]),\r\n)\r\n\r\n/**\r\n * Schema for relative paths to Markdown files\r\n */\r\nconst RelativeMarkdownPath = lazySchema(() => RelativePath().endsWith('.md'))\r\n\r\n/**\r\n * Schema for relative paths to command sources (markdown files or directories containing SKILL.md)\r\n */\r\nconst RelativeCommandPath = lazySchema(() =>\r\n  z.union([\r\n    RelativeMarkdownPath(),\r\n    RelativePath(), // Allow any relative path, including directories\r\n  ]),\r\n)\r\n\r\n/**\r\n * Shared marketplace-name validation. Used by both PluginMarketplaceSchema\r\n * (validates fetched marketplace.json) and the settings arm of\r\n * MarketplaceSourceSchema (validates inline names in settings.json).\r\n *\r\n * The two must stay in sync: loadAndCacheMarketplace's case 'settings' writes\r\n * to join(cacheDir, source.name) BEFORE the post-write PluginMarketplaceSchema\r\n * validation runs. Any name that passes the settings arm but fails\r\n * PluginMarketplaceSchema leaves orphaned files in the cache (cleanupNeeded=false).\r\n * A single shared schema makes drift impossible.\r\n */\r\nconst MarketplaceNameSchema = lazySchema(() =>\r\n  z\r\n    .string()\r\n    .min(1, 'Marketplace must have a name')\r\n    .refine(name => !name.includes(' '), {\r\n      message:\r\n        'Marketplace name cannot contain spaces. Use kebab-case (e.g., \"my-marketplace\")',\r\n    })\r\n    .refine(\r\n      name =>\r\n        !name.includes('/') &&\r\n        !name.includes('\\\\') &&\r\n        !name.includes('..') &&\r\n        name !== '.',\r\n      {\r\n        message:\r\n          'Marketplace name cannot contain path separators (/ or \\\\), \"..\" sequences, or be \".\"',\r\n      },\r\n    )\r\n    .refine(name => !isBlockedOfficialName(name), {\r\n      message:\r\n        'Marketplace name impersonates an official Anthropic/Claude marketplace',\r\n    })\r\n    .refine(name => name.toLowerCase() !== 'inline', {\r\n      message:\r\n        'Marketplace name \"inline\" is reserved for --plugin-dir session plugins',\r\n    })\r\n    .refine(name => name.toLowerCase() !== 'builtin', {\r\n      message: 'Marketplace name \"builtin\" is reserved for built-in plugins',\r\n    }),\r\n)\r\n\r\n/**\r\n * Schema for plugin author information\r\n */\r\nexport const PluginAuthorSchema = lazySchema(() =>\r\n  z.object({\r\n    name: z\r\n      .string()\r\n      .min(1, 'Author name cannot be empty')\r\n      .describe('Display name of the plugin author or organization'),\r\n    email: z\r\n      .string()\r\n      .optional()\r\n      .describe('Contact email for support or feedback'),\r\n    url: z\r\n      .string()\r\n      .optional()\r\n      .describe('Website, GitHub profile, or organization URL'),\r\n  }),\r\n)\r\n\r\n/**\r\n * Metadata part of the plugin manifest file (plugin.json)\r\n *\r\n * This schema validates the structure of plugin manifests and provides\r\n * runtime type checking when loading plugins from disk.\r\n */\r\nconst PluginManifestMetadataSchema = lazySchema(() =>\r\n  z.object({\r\n    name: z\r\n      .string()\r\n      .min(1, 'Plugin name cannot be empty')\r\n      .refine(name => !name.includes(' '), {\r\n        message:\r\n          'Plugin name cannot contain spaces. Use kebab-case (e.g., \"my-plugin\")',\r\n      })\r\n      .describe(\r\n        'Unique identifier for the plugin, used for namespacing (prefer kebab-case)',\r\n      ),\r\n    version: z\r\n      .string()\r\n      .optional()\r\n      .describe(\r\n        'Semantic version (e.g., 1.2.3) following semver.org specification',\r\n      ),\r\n    description: z\r\n      .string()\r\n      .optional()\r\n      .describe('Brief, user-facing explanation of what the plugin provides'),\r\n    author: PluginAuthorSchema()\r\n      .optional()\r\n      .describe('Information about the plugin creator or maintainer'),\r\n    homepage: z\r\n      .string()\r\n      .url()\r\n      .optional()\r\n      .describe('Plugin homepage or documentation URL'),\r\n    repository: z.string().optional().describe('Source code repository URL'),\r\n    license: z\r\n      .string()\r\n      .optional()\r\n      .describe('SPDX license identifier (e.g., MIT, Apache-2.0)'),\r\n    keywords: z\r\n      .array(z.string())\r\n      .optional()\r\n      .describe('Tags for plugin discovery and categorization'),\r\n    dependencies: z\r\n      .array(DependencyRefSchema())\r\n      .optional()\r\n      .describe(\r\n        'Plugins that must be enabled for this plugin to function. Bare names (no \"@marketplace\") are resolved against the declaring plugin\\'s own marketplace.',\r\n      ),\r\n  }),\r\n)\r\n\r\n/**\r\n * Schema for plugin hooks configuration (hooks.json)\r\n *\r\n * Defines the hooks that a plugin can provide to intercept and modify\r\n * Tau behavior at various lifecycle events.\r\n */\r\nexport const PluginHooksSchema = lazySchema(() =>\r\n  z.object({\r\n    description: z\r\n      .string()\r\n      .optional()\r\n      .describe('Brief, user-facing explanation of what these hooks provide'),\r\n    hooks: z\r\n      .lazy(() => HooksSchema())\r\n      .describe(\r\n        'The hooks provided by the plugin, in the same format as the one used for settings',\r\n      ),\r\n  }),\r\n)\r\n\r\n/**\r\n * Schema for additional hooks configuration in plugin manifest\r\n *\r\n * Allows plugins to specify hooks either inline or via external files,\r\n * supplementing any hooks defined in the standard hooks/hooks.json location.\r\n */\r\nconst PluginManifestHooksSchema = lazySchema(() =>\r\n  z.object({\r\n    hooks: z.union([\r\n      RelativeJSONPath().describe(\r\n        'Path to file with additional hooks (in addition to those in hooks/hooks.json, if it exists), relative to the plugin root',\r\n      ),\r\n      z\r\n        .lazy(() => HooksSchema())\r\n        .describe(\r\n          'Additional hooks (in addition to those in hooks/hooks.json, if it exists)',\r\n        ),\r\n      z.array(\r\n        z.union([\r\n          RelativeJSONPath().describe(\r\n            'Path to file with additional hooks (in addition to those in hooks/hooks.json, if it exists), relative to the plugin root',\r\n          ),\r\n          z\r\n            .lazy(() => HooksSchema())\r\n            .describe(\r\n              'Additional hooks (in addition to those in hooks/hooks.json, if it exists)',\r\n            ),\r\n        ]),\r\n      ),\r\n    ]),\r\n  }),\r\n)\r\n\r\n/**\r\n * Schema for command metadata when using object-mapping format\r\n *\r\n * Allows marketplace entries to provide rich metadata for commands including\r\n * custom descriptions and frontmatter overrides.\r\n *\r\n * Commands can be defined with either:\r\n * - source: Path to a markdown file\r\n * - content: Inline markdown content\r\n */\r\nexport const CommandMetadataSchema = lazySchema(() =>\r\n  z\r\n    .object({\r\n      source: RelativeCommandPath()\r\n        .optional()\r\n        .describe('Path to command markdown file, relative to plugin root'),\r\n      content: z\r\n        .string()\r\n        .optional()\r\n        .describe('Inline markdown content for the command'),\r\n      description: z\r\n        .string()\r\n        .optional()\r\n        .describe('Command description override'),\r\n      argumentHint: z\r\n        .string()\r\n        .optional()\r\n        .describe('Hint for command arguments (e.g., \"[file]\")'),\r\n      model: z.string().optional().describe('Default model for this command'),\r\n      allowedTools: z\r\n        .array(z.string())\r\n        .optional()\r\n        .describe('Tools allowed when command runs'),\r\n    })\r\n    .refine(\r\n      data => (data.source && !data.content) || (!data.source && data.content),\r\n      {\r\n        message:\r\n          'Command must have either \"source\" (file path) or \"content\" (inline markdown), but not both',\r\n      },\r\n    ),\r\n)\r\n\r\n/**\r\n * Schema for additional command definitions in plugin manifest\r\n *\r\n * Allows plugins to specify extra command files or skill directories beyond those\r\n * in the standard commands/ directory.\r\n *\r\n * Supports three formats:\r\n * 1. Single path: \"./README.md\"\r\n * 2. Array of paths: [\"./README.md\", \"./docs/guide.md\"]\r\n * 3. Object mapping: { \"about\": { \"source\": \"./README.md\", \"description\": \"...\" } }\r\n */\r\nconst PluginManifestCommandsSchema = lazySchema(() =>\r\n  z.object({\r\n    commands: z.union([\r\n      // TODO (future work): allow globs?\r\n      RelativeCommandPath().describe(\r\n        'Path to additional command file or skill directory (in addition to those in the commands/ directory, if it exists), relative to the plugin root',\r\n      ),\r\n      z\r\n        .array(\r\n          RelativeCommandPath().describe(\r\n            'Path to additional command file or skill directory (in addition to those in the commands/ directory, if it exists), relative to the plugin root',\r\n          ),\r\n        )\r\n        .describe(\r\n          'List of paths to additional command files or skill directories',\r\n        ),\r\n      z\r\n        .record(z.string(), CommandMetadataSchema())\r\n        .describe(\r\n          'Object mapping of command names to their metadata and source files. Command name becomes the slash command name (e.g., \"about\" \u2192 \"/plugin:about\")',\r\n        ),\r\n    ]),\r\n  }),\r\n)\r\n\r\n/**\r\n * Schema for additional agent definitions in plugin manifest\r\n *\r\n * Allows plugins to specify extra agent files beyond those in the\r\n * standard agents/ directory.\r\n */\r\nconst PluginManifestAgentsSchema = lazySchema(() =>\r\n  z.object({\r\n    agents: z.union([\r\n      // TODO (future work): allow globs?\r\n      RelativeMarkdownPath().describe(\r\n        'Path to additional agent file (in addition to those in the agents/ directory, if it exists), relative to the plugin root',\r\n      ),\r\n      z\r\n        .array(\r\n          RelativeMarkdownPath().describe(\r\n            'Path to additional agent file (in addition to those in the agents/ directory, if it exists), relative to the plugin root',\r\n          ),\r\n        )\r\n        .describe('List of paths to additional agent files'),\r\n    ]),\r\n  }),\r\n)\r\n\r\n/**\r\n * Schema for additional skill definitions in plugin manifest\r\n *\r\n * Allows plugins to specify extra skill directories beyond those in the\r\n * standard skills/ directory.\r\n */\r\nconst PluginManifestSkillsSchema = lazySchema(() =>\r\n  z.object({\r\n    skills: z.union([\r\n      RelativePath().describe(\r\n        'Path to additional skill directory (in addition to those in the skills/ directory, if it exists), relative to the plugin root',\r\n      ),\r\n      z\r\n        .array(\r\n          RelativePath().describe(\r\n            'Path to additional skill directory (in addition to those in the skills/ directory, if it exists), relative to the plugin root',\r\n          ),\r\n        )\r\n        .describe('List of paths to additional skill directories'),\r\n    ]),\r\n  }),\r\n)\r\n\r\n/**\r\n * Schema for additional output style definitions in plugin manifest\r\n *\r\n * Allows plugins to specify extra output style files or directories beyond those in the\r\n * standard output-styles/ directory.\r\n */\r\nconst PluginManifestOutputStylesSchema = lazySchema(() =>\r\n  z.object({\r\n    outputStyles: z.union([\r\n      RelativePath().describe(\r\n        'Path to additional output styles directory or file (in addition to those in the output-styles/ directory, if it exists), relative to the plugin root',\r\n      ),\r\n      z\r\n        .array(\r\n          RelativePath().describe(\r\n            'Path to additional output styles directory or file (in addition to those in the output-styles/ directory, if it exists), relative to the plugin root',\r\n          ),\r\n        )\r\n        .describe(\r\n          'List of paths to additional output styles directories or files',\r\n        ),\r\n    ]),\r\n  }),\r\n)\r\n\r\n// Helper validators for LSP config\r\nconst nonEmptyString = lazySchema(() => z.string().min(1))\r\nconst fileExtension = lazySchema(() =>\r\n  z\r\n    .string()\r\n    .min(2)\r\n    .refine(ext => ext.startsWith('.'), {\r\n      message: 'File extensions must start with dot (e.g., \".ts\", not \"ts\")',\r\n    }),\r\n)\r\n\r\n/**\r\n * Schema for MCP server configurations in plugin manifest\r\n *\r\n * Allows plugins to provide MCP servers either inline or via external\r\n * configuration files, supplementing any servers in .mcp.json.\r\n */\r\nconst PluginManifestMcpServerSchema = lazySchema(() =>\r\n  z.object({\r\n    mcpServers: z.union([\r\n      RelativeJSONPath().describe(\r\n        'MCP servers to include in the plugin (in addition to those in the .mcp.json file, if it exists)',\r\n      ),\r\n      McpbPath().describe(\r\n        'Path or URL to MCPB file containing MCP server configuration',\r\n      ),\r\n      z\r\n        .record(z.string(), McpServerConfigSchema())\r\n        .describe('MCP server configurations keyed by server name'),\r\n      z\r\n        .array(\r\n          z.union([\r\n            RelativeJSONPath().describe(\r\n              'Path to MCP servers configuration file',\r\n            ),\r\n            McpbPath().describe('Path or URL to MCPB file'),\r\n            z\r\n              .record(z.string(), McpServerConfigSchema())\r\n              .describe('Inline MCP server configurations'),\r\n          ]),\r\n        )\r\n        .describe(\r\n          'Array of MCP server configurations (paths, MCPB files, or inline definitions)',\r\n        ),\r\n    ]),\r\n  }),\r\n)\r\n\r\n/**\r\n * Schema for a single user-configurable option in plugin manifest userConfig.\r\n *\r\n * Shape intentionally matches `McpbUserConfigurationOption` from\r\n * `@anthropic-ai/mcpb` so the parsed result is structurally assignable to\r\n * `UserConfigSchema` in mcpbHandler.ts \u2014 this lets us reuse\r\n * `validateUserConfig` and the config dialog without modification.\r\n * `title` and `description` are required (not optional) because the upstream\r\n * type requires them and the config dialog renders them.\r\n *\r\n * Used by both the top-level manifest.userConfig and the per-channel\r\n * channels[].userConfig (assistant-mode channels).\r\n */\r\nconst PluginUserConfigOptionSchema = lazySchema(() =>\r\n  z\r\n    .object({\r\n      type: z\r\n        .enum(['string', 'number', 'boolean', 'directory', 'file'])\r\n        .describe('Type of the configuration value'),\r\n      title: z\r\n        .string()\r\n        .describe('Human-readable label shown in the config dialog'),\r\n      description: z\r\n        .string()\r\n        .describe('Help text shown beneath the field in the config dialog'),\r\n      required: z\r\n        .boolean()\r\n        .optional()\r\n        .describe('If true, validation fails when this field is empty'),\r\n      default: z\r\n        .union([z.string(), z.number(), z.boolean(), z.array(z.string())])\r\n        .optional()\r\n        .describe('Default value used when the user provides nothing'),\r\n      multiple: z\r\n        .boolean()\r\n        .optional()\r\n        .describe('For string type: allow an array of strings'),\r\n      sensitive: z\r\n        .boolean()\r\n        .optional()\r\n        .describe(\r\n          'If true, masks dialog input and stores value in secure storage (keychain/credentials file) instead of settings.json',\r\n        ),\r\n      min: z.number().optional().describe('Minimum value (number type only)'),\r\n      max: z.number().optional().describe('Maximum value (number type only)'),\r\n    })\r\n    .strict(),\r\n)\r\n\r\n/**\r\n * Schema for the top-level userConfig field in plugin manifest.\r\n *\r\n * Declares user-configurable values the plugin needs. Users are prompted at\r\n * enable time. Non-sensitive values go to settings.json\r\n * pluginConfigs[pluginId].options; sensitive values go to secure storage.\r\n * Values are available as ${user_config.KEY} in MCP/LSP server config, hook\r\n * commands, and (non-sensitive only) skill/agent content.\r\n */\r\nconst PluginManifestUserConfigSchema = lazySchema(() =>\r\n  z.object({\r\n    userConfig: z\r\n      .record(\r\n        z\r\n          .string()\r\n          .regex(\r\n            /^[A-Za-z_]\\w*$/,\r\n            'Option keys must be valid identifiers (letters, digits, underscore; no leading digit) \u2014 they become CLAUDE_PLUGIN_OPTION_<KEY> env vars in hooks',\r\n          ),\r\n        PluginUserConfigOptionSchema(),\r\n      )\r\n      .optional()\r\n      .describe(\r\n        'User-configurable values this plugin needs. Prompted at enable time. ' +\r\n          'Non-sensitive values saved to settings.json; sensitive values to secure storage ' +\r\n          '(macOS keychain or .credentials.json). Available as ${user_config.KEY} in ' +\r\n          'MCP/LSP server config, hook commands, and (non-sensitive only) skill/agent content. ' +\r\n          'Note: sensitive values share a single keychain entry with OAuth tokens \u2014 keep ' +\r\n          'secret counts small to stay under the ~2KB stdin-safe limit (see INC-3028).',\r\n      ),\r\n  }),\r\n)\r\n\r\n/**\r\n * Schema for channel declarations in plugin manifest.\r\n *\r\n * A channel is an MCP server that emits `notifications/claude/channel` to\r\n * inject messages into the conversation (Telegram, Slack, Discord, etc.).\r\n * Declaring it here lets the plugin prompt for user config (bot tokens,\r\n * owner IDs) at install time via the PluginOptionsFlow prompt,\r\n * rather than requiring users to hand-edit settings.json.\r\n *\r\n * The `server` field must match a key in the plugin's `mcpServers` \u2014 this is\r\n * not cross-validated at schema parse time (the mcpServers field can be a\r\n * path to a JSON file we haven't read yet), so the check happens at load\r\n * time in mcpPluginIntegration.ts instead.\r\n */\r\nconst PluginManifestChannelsSchema = lazySchema(() =>\r\n  z.object({\r\n    channels: z\r\n      .array(\r\n        z\r\n          .object({\r\n            server: z\r\n              .string()\r\n              .min(1)\r\n              .describe(\r\n                \"Name of the MCP server this channel binds to. Must match a key in this plugin's mcpServers.\",\r\n              ),\r\n            displayName: z\r\n              .string()\r\n              .optional()\r\n              .describe(\r\n                'Human-readable name shown in the config dialog title (e.g., \"Telegram\"). Defaults to the server name.',\r\n              ),\r\n            userConfig: z\r\n              .record(z.string(), PluginUserConfigOptionSchema())\r\n              .optional()\r\n              .describe(\r\n                'Fields to prompt the user for when enabling this plugin in assistant mode. ' +\r\n                  'Saved values are substituted into ${user_config.KEY} references in the mcpServers env.',\r\n              ),\r\n          })\r\n          .strict(),\r\n      )\r\n      .describe(\r\n        'Channels this plugin provides. Each entry declares an MCP server as a message channel ' +\r\n          'and optionally specifies user configuration to prompt for at enable time.',\r\n      ),\r\n  }),\r\n)\r\n\r\n/**\r\n * Schema for individual LSP server configuration.\r\n */\r\nexport const LspServerConfigSchema = lazySchema(() =>\r\n  z.strictObject({\r\n    command: z\r\n      .string()\r\n      .min(1)\r\n      .refine(\r\n        cmd => {\r\n          // Commands with spaces should use args array instead\r\n          if (cmd.includes(' ') && !cmd.startsWith('/')) {\r\n            return false\r\n          }\r\n          return true\r\n        },\r\n        {\r\n          message:\r\n            'Command should not contain spaces. Use args array for arguments.',\r\n        },\r\n      )\r\n      .describe(\r\n        'Command to execute the LSP server (e.g., \"typescript-language-server\")',\r\n      ),\r\n    args: z\r\n      .array(nonEmptyString())\r\n      .optional()\r\n      .describe('Command-line arguments to pass to the server'),\r\n    extensionToLanguage: z\r\n      .record(fileExtension(), nonEmptyString())\r\n      .refine(record => Object.keys(record).length > 0, {\r\n        message: 'extensionToLanguage must have at least one mapping',\r\n      })\r\n      .describe(\r\n        'Mapping from file extension to LSP language ID. File extensions and languages are derived from this mapping.',\r\n      ),\r\n    transport: z\r\n      .enum(['stdio', 'socket'])\r\n      .default('stdio')\r\n      .describe('Communication transport mechanism'),\r\n    env: z\r\n      .record(z.string(), z.string())\r\n      .optional()\r\n      .describe('Environment variables to set when starting the server'),\r\n    initializationOptions: z\r\n      .unknown()\r\n      .optional()\r\n      .describe(\r\n        'Initialization options passed to the server during initialization',\r\n      ),\r\n    settings: z\r\n      .unknown()\r\n      .optional()\r\n      .describe(\r\n        'Settings passed to the server via workspace/didChangeConfiguration',\r\n      ),\r\n    workspaceFolder: z\r\n      .string()\r\n      .optional()\r\n      .describe('Workspace folder path to use for the server'),\r\n    startupTimeout: z\r\n      .number()\r\n      .int()\r\n      .positive()\r\n      .optional()\r\n      .describe('Maximum time to wait for server startup (milliseconds)'),\r\n    shutdownTimeout: z\r\n      .number()\r\n      .int()\r\n      .positive()\r\n      .optional()\r\n      .describe('Maximum time to wait for graceful shutdown (milliseconds)'),\r\n    restartOnCrash: z\r\n      .boolean()\r\n      .optional()\r\n      .describe('Whether to restart the server if it crashes'),\r\n    maxRestarts: z\r\n      .number()\r\n      .int()\r\n      .nonnegative()\r\n      .optional()\r\n      .describe('Maximum number of restart attempts before giving up'),\r\n    alwaysOn: z\r\n      .boolean()\r\n      .optional()\r\n      .describe('Whether to start the server as soon as LSP initializes'),\r\n  }),\r\n)\r\n\r\n/**\r\n * Schema for LSP server declarations in plugin manifest.\r\n * Supports multiple formats:\r\n * - String: path to .lsp.json file\r\n * - Object: inline server configs { \"serverName\": {...} }\r\n * - Array: mix of strings and objects\r\n */\r\nconst PluginManifestLspServerSchema = lazySchema(() =>\r\n  z.object({\r\n    lspServers: z.union([\r\n      RelativeJSONPath().describe(\r\n        'Path to .lsp.json configuration file relative to plugin root',\r\n      ),\r\n      z\r\n        .record(z.string(), LspServerConfigSchema())\r\n        .describe('LSP server configurations keyed by server name'),\r\n      z\r\n        .array(\r\n          z.union([\r\n            RelativeJSONPath().describe('Path to LSP configuration file'),\r\n            z\r\n              .record(z.string(), LspServerConfigSchema())\r\n              .describe('Inline LSP server configurations'),\r\n          ]),\r\n        )\r\n        .describe(\r\n          'Array of LSP server configurations (paths or inline definitions)',\r\n        ),\r\n    ]),\r\n  }),\r\n)\r\n\r\n/**\r\n * Schema for npm package names\r\n *\r\n * Validates npm package names including scoped packages.\r\n * Prevents path traversal attacks by disallowing '..' and '//'.\r\n *\r\n * Valid examples:\r\n * - \"express\"\r\n * - \"@babel/core\"\r\n * - \"lodash.debounce\"\r\n *\r\n * Invalid examples:\r\n * - \"../../../etc/passwd\"\r\n * - \"package//name\"\r\n */\r\nconst NpmPackageNameSchema = lazySchema(() =>\r\n  z\r\n    .string()\r\n    .refine(\r\n      name => !name.includes('..') && !name.includes('//'),\r\n      'Package name cannot contain path traversal patterns',\r\n    )\r\n    .refine(name => {\r\n      // Allow scoped packages (@org/package) and regular packages\r\n      const scopedPackageRegex = /^@[a-z0-9][a-z0-9-._]*\\/[a-z0-9][a-z0-9-._]*$/\r\n      const regularPackageRegex = /^[a-z0-9][a-z0-9-._]*$/\r\n      return scopedPackageRegex.test(name) || regularPackageRegex.test(name)\r\n    }, 'Invalid npm package name format'),\r\n)\r\n\r\n/**\r\n * Schema for plugin settings that get merged into the settings cascade.\r\n * Accepts any record here; filtering to allowlisted keys happens at load time\r\n * in pluginLoader.ts via PluginSettingsSchema (derived from SettingsSchema).\r\n */\r\nconst PluginManifestSettingsSchema = lazySchema(() =>\r\n  z.object({\r\n    settings: z\r\n      .record(z.string(), z.unknown())\r\n      .optional()\r\n      .describe(\r\n        'Settings to merge when plugin is enabled. ' +\r\n          'Only allowlisted keys are kept (currently: agent)',\r\n      ),\r\n  }),\r\n)\r\n\r\n/**\r\n * Plugin manifest file (plugin.json)\r\n *\r\n * This schema validates the structure of plugin manifests and provides\r\n * runtime type checking when loading plugins from disk.\r\n *\r\n * Unknown top-level fields are silently stripped (zod default) rather than\r\n * rejected. This keeps plugin loading resilient to custom/future top-level\r\n * fields that plugin authors may add. Nested config objects (userConfig\r\n * options, channels, lspServers) remain strict \u2014 unknown keys inside those\r\n * still fail, since a typo there is more likely to be an author mistake\r\n * than a vendor extension. Type mismatches and other validation errors\r\n * still fail at all levels. For developer feedback on unknown top-level\r\n * fields, use `claude plugin validate`.\r\n */\r\nexport const PluginManifestSchema = lazySchema(() =>\r\n  z.object({\r\n    ...PluginManifestMetadataSchema().shape,\r\n    ...PluginManifestHooksSchema().partial().shape,\r\n    ...PluginManifestCommandsSchema().partial().shape,\r\n    ...PluginManifestAgentsSchema().partial().shape,\r\n    ...PluginManifestSkillsSchema().partial().shape,\r\n    ...PluginManifestOutputStylesSchema().partial().shape,\r\n    ...PluginManifestChannelsSchema().partial().shape,\r\n    ...PluginManifestMcpServerSchema().partial().shape,\r\n    ...PluginManifestLspServerSchema().partial().shape,\r\n    ...PluginManifestSettingsSchema().partial().shape,\r\n    ...PluginManifestUserConfigSchema().partial().shape,\r\n  }),\r\n)\r\n\r\n/**\r\n * Schema for marketplace source locations\r\n *\r\n * Defines various ways to reference marketplace manifests including\r\n * direct URLs, GitHub repos, git URLs, npm packages, and local paths.\r\n */\r\nexport const MarketplaceSourceSchema = lazySchema(() =>\r\n  z.discriminatedUnion('source', [\r\n    z.object({\r\n      source: z.literal('url'),\r\n      url: z.string().url().describe('Direct URL to marketplace.json file'),\r\n      headers: z\r\n        .record(z.string(), z.string())\r\n        .optional()\r\n        .describe('Custom HTTP headers (e.g., for authentication)'),\r\n    }),\r\n    z.object({\r\n      source: z.literal('github'),\r\n      repo: z.string().describe('GitHub repository in owner/repo format'),\r\n      ref: z\r\n        .string()\r\n        .optional()\r\n        .describe(\r\n          'Git branch or tag to use (e.g., \"main\", \"v1.0.0\"). Defaults to repository default branch.',\r\n        ),\r\n      path: z\r\n        .string()\r\n        .optional()\r\n        .describe(\r\n          'Path to marketplace.json within repo (defaults to .claude-plugin/marketplace.json)',\r\n        ),\r\n      sparsePaths: z\r\n        .array(z.string())\r\n        .optional()\r\n        .describe(\r\n          'Directories to include via git sparse-checkout (cone mode). ' +\r\n            'Use for monorepos where the marketplace lives in a subdirectory. ' +\r\n            'Example: [\".claude-plugin\", \"plugins\"]. ' +\r\n            'If omitted, the full repository is cloned.',\r\n        ),\r\n    }),\r\n    z.object({\r\n      source: z.literal('git'),\r\n      // No .endsWith('.git') here \u2014 that's a GitHub/GitLab/Bitbucket\r\n      // convention, not a git requirement. Azure DevOps uses\r\n      // https://dev.azure.com/{org}/{proj}/_git/{repo} with no suffix, and\r\n      // appending .git makes ADO look for a repo literally named {repo}.git\r\n      // (TF401019). AWS CodeCommit also omits the suffix. If the user\r\n      // explicitly wrote source:'git', they know it's a git repo; a typo'd\r\n      // URL fails at `git clone` with a clearer error anyway. (gh-31256)\r\n      url: z.string().describe('Full git repository URL'),\r\n      ref: z\r\n        .string()\r\n        .optional()\r\n        .describe(\r\n          'Git branch or tag to use (e.g., \"main\", \"v1.0.0\"). Defaults to repository default branch.',\r\n        ),\r\n      path: z\r\n        .string()\r\n        .optional()\r\n        .describe(\r\n          'Path to marketplace.json within repo (defaults to .claude-plugin/marketplace.json)',\r\n        ),\r\n      sparsePaths: z\r\n        .array(z.string())\r\n        .optional()\r\n        .describe(\r\n          'Directories to include via git sparse-checkout (cone mode). ' +\r\n            'Use for monorepos where the marketplace lives in a subdirectory. ' +\r\n            'Example: [\".claude-plugin\", \"plugins\"]. ' +\r\n            'If omitted, the full repository is cloned.',\r\n        ),\r\n    }),\r\n    z.object({\r\n      source: z.literal('npm'),\r\n      package: NpmPackageNameSchema().describe(\r\n        'NPM package containing marketplace.json',\r\n      ),\r\n    }),\r\n    z.object({\r\n      source: z.literal('file'),\r\n      path: z.string().describe('Local file path to marketplace.json'),\r\n    }),\r\n    z.object({\r\n      source: z.literal('directory'),\r\n      path: z\r\n        .string()\r\n        .describe('Local directory containing .claude-plugin/marketplace.json'),\r\n    }),\r\n    z.object({\r\n      source: z.literal('hostPattern'),\r\n      hostPattern: z\r\n        .string()\r\n        .describe(\r\n          'Regex pattern to match the host/domain extracted from any marketplace source type. ' +\r\n            'For github sources, matches against \"github.com\". For git sources (SSH or HTTPS), ' +\r\n            'extracts the hostname from the URL. Use in strictKnownMarketplaces to allow all ' +\r\n            'marketplaces from a specific host (e.g., \"^github\\\\.mycompany\\\\.com$\").',\r\n        ),\r\n    }),\r\n    z.object({\r\n      source: z.literal('pathPattern'),\r\n      pathPattern: z\r\n        .string()\r\n        .describe(\r\n          'Regex pattern matched against the .path field of file and directory sources. ' +\r\n            'Use in strictKnownMarketplaces to allow filesystem-based marketplaces alongside ' +\r\n            'hostPattern restrictions for network sources. Use \".*\" to allow all filesystem ' +\r\n            'paths, or a narrower pattern (e.g., \"^/opt/approved/\") to restrict to specific ' +\r\n            'directories.',\r\n        ),\r\n    }),\r\n    z\r\n      .object({\r\n        source: z.literal('settings'),\r\n        name: MarketplaceNameSchema()\r\n          .refine(\r\n            name => !ALLOWED_OFFICIAL_MARKETPLACE_NAMES.has(name.toLowerCase()),\r\n            {\r\n              message:\r\n                'Reserved official marketplace names cannot be used with settings sources. ' +\r\n                'validateOfficialNameSource only accepts github/git sources from anthropics/* ' +\r\n                'for these names; a settings source would be rejected after ' +\r\n                'loadAndCacheMarketplace has already written to disk with cleanupNeeded=false.',\r\n            },\r\n          )\r\n          .describe(\r\n            'Marketplace name. Must match the extraKnownMarketplaces key (enforced); ' +\r\n              'the synthetic manifest is written under this name. Same validation ' +\r\n              'as PluginMarketplaceSchema plus reserved-name rejection \\u2014 ' +\r\n              'validateOfficialNameSource runs after the disk write, too late to clean up.',\r\n          ),\r\n        plugins: z\r\n          .array(SettingsMarketplacePluginSchema())\r\n          .describe('Plugin entries declared inline in settings.json'),\r\n        owner: PluginAuthorSchema().optional(),\r\n      })\r\n      .describe(\r\n        'Inline marketplace manifest defined directly in settings.json. ' +\r\n          'The reconciler writes a synthetic marketplace.json to the cache; ' +\r\n          'diffMarketplaces detects edits via isEqual on the stored source ' +\r\n          '(the plugins array is inside this object, so edits surface as sourceChanged).',\r\n      ),\r\n  ]),\r\n)\r\n\r\nexport const gitSha = lazySchema(() =>\r\n  z\r\n    .string()\r\n    .length(40)\r\n    .regex(\r\n      /^[a-f0-9]{40}$/,\r\n      'Must be a full 40-character lowercase git commit SHA',\r\n    ),\r\n)\r\n\r\n/**\r\n * Schema for plugin source locations\r\n *\r\n * Defines various ways to reference and install plugins including\r\n * local paths, npm packages, Python packages, git URLs, and GitHub repos.\r\n */\r\nexport const PluginSourceSchema = lazySchema(() =>\r\n  z.union([\r\n    RelativePath().describe(\r\n      'Path to the plugin root, relative to the marketplace root (the directory containing .claude-plugin/, not .claude-plugin/ itself)',\r\n    ),\r\n    z\r\n      .object({\r\n        source: z.literal('npm'),\r\n        package: NpmPackageNameSchema()\r\n          .or(z.string()) // Allow URLs and local paths as well\r\n          .describe(\r\n            'Package name (or url, or local path, or anything else that can be passed to `npm` as a package)',\r\n          ),\r\n        version: z\r\n          .string()\r\n          .optional()\r\n          .describe('Specific version or version range (e.g., ^1.0.0, ~2.1.0)'),\r\n        registry: z\r\n          .string()\r\n          .url()\r\n          .optional()\r\n          .describe(\r\n            'Custom NPM registry URL (defaults to using system default, likely npmjs.org)',\r\n          ),\r\n      })\r\n      .describe('NPM package as plugin source'),\r\n    z\r\n      .object({\r\n        source: z.literal('pip'),\r\n        package: z\r\n          .string()\r\n          .describe('Python package name as it appears on PyPI'),\r\n        version: z\r\n          .string()\r\n          .optional()\r\n          .describe('Version specifier (e.g., ==1.0.0, >=2.0.0, <3.0.0)'),\r\n        registry: z\r\n          .string()\r\n          .url()\r\n          .optional()\r\n          .describe(\r\n            'Custom PyPI registry URL (defaults to using system default, likely pypi.org)',\r\n          ),\r\n      })\r\n      .describe('Python package as plugin source'),\r\n    z.object({\r\n      source: z.literal('url'),\r\n      // See note on MarketplaceSourceSchema source:'git' re: .endsWith('.git')\r\n      // \u2014 dropped to support Azure DevOps / CodeCommit URLs (gh-31256).\r\n      url: z.string().describe('Full git repository URL (https:// or git@)'),\r\n      ref: z\r\n        .string()\r\n        .optional()\r\n        .describe(\r\n          'Git branch or tag to use (e.g., \"main\", \"v1.0.0\"). Defaults to repository default branch.',\r\n        ),\r\n      sha: gitSha().optional().describe('Specific commit SHA to use'),\r\n    }),\r\n    z.object({\r\n      source: z.literal('github'),\r\n      repo: z.string().describe('GitHub repository in owner/repo format'),\r\n      ref: z\r\n        .string()\r\n        .optional()\r\n        .describe(\r\n          'Git branch or tag to use (e.g., \"main\", \"v1.0.0\"). Defaults to repository default branch.',\r\n        ),\r\n      sha: gitSha().optional().describe('Specific commit SHA to use'),\r\n    }),\r\n    z\r\n      .object({\r\n        source: z.literal('git-subdir'),\r\n        url: z\r\n          .string()\r\n          .describe(\r\n            'Git repository: GitHub owner/repo shorthand, https://, or git@ URL',\r\n          ),\r\n        path: z\r\n          .string()\r\n          .min(1)\r\n          .describe(\r\n            'Subdirectory within the repo containing the plugin (e.g., \"tools/claude-plugin\"). ' +\r\n              'Cloned sparsely using partial clone (--filter=tree:0) to minimize bandwidth for monorepos.',\r\n          ),\r\n        ref: z\r\n          .string()\r\n          .optional()\r\n          .describe(\r\n            'Git branch or tag to use (e.g., \"main\", \"v1.0.0\"). Defaults to repository default branch.',\r\n          ),\r\n        sha: gitSha().optional().describe('Specific commit SHA to use'),\r\n      })\r\n      .describe(\r\n        'Plugin located in a subdirectory of a larger repository (monorepo). ' +\r\n          'Only the specified subdirectory is materialized; the rest of the repo is not downloaded.',\r\n      ),\r\n    // TODO (future work) gist\r\n    // TODO (future work) single file?\r\n  ]),\r\n)\r\n\r\n/**\r\n * Narrow plugin entry for settings-sourced marketplaces.\r\n *\r\n * Settings-sourced marketplaces point at remote plugins that have their own\r\n * plugin.json \u2014 there is no reason to inline commands/agents/hooks/mcp/lsp in\r\n * settings.json. This schema carries only what loadPluginFromMarketplaceEntry\r\n * reads (name, source, version, strict) plus description for discoverability.\r\n *\r\n * The synthetic marketplace.json written by loadAndCacheMarketplace is re-parsed\r\n * with the full PluginMarketplaceSchema, which widens these entries back to\r\n * PluginMarketplaceEntry (strict gets its .default(true), everything else stays\r\n * undefined). So this narrowness is settings-surface-only; downstream code sees\r\n * the same shape it would from any sparse marketplace.json entry.\r\n *\r\n * Keeping this narrow prevents PluginManifestSchema().partial() from expanding\r\n * inline in settingsTypes.generated.ts \u2014 that expansion is ~870 lines per\r\n * occurrence, and MarketplaceSource appears three times in the settings schema\r\n * (extraKnownMarketplaces, strictKnownMarketplaces, blockedMarketplaces).\r\n */\r\nconst SettingsMarketplacePluginSchema = lazySchema(() =>\r\n  z\r\n    .object({\r\n      name: z\r\n        .string()\r\n        .min(1, 'Plugin name cannot be empty')\r\n        .refine(name => !name.includes(' '), {\r\n          message:\r\n            'Plugin name cannot contain spaces. Use kebab-case (e.g., \"my-plugin\")',\r\n        })\r\n        .describe('Plugin name as it appears in the target repository'),\r\n      source: PluginSourceSchema().describe(\r\n        'Where to fetch the plugin from. Must be a remote source \u2014 relative ' +\r\n          'paths have no marketplace repository to resolve against.',\r\n      ),\r\n      description: z.string().optional(),\r\n      version: z.string().optional(),\r\n      strict: z.boolean().optional(),\r\n    })\r\n    .refine(p => typeof p.source !== 'string', {\r\n      message:\r\n        'Plugins in a settings-sourced marketplace must use remote sources ' +\r\n        '(github, git-subdir, npm, url, pip). Relative-path sources like \"./foo\" ' +\r\n        'have no marketplace repository to resolve against.',\r\n    }),\r\n)\r\n\r\n/**\r\n * Check if a plugin source is a local path (stored in marketplace directory).\r\n *\r\n * Local plugins have their source as a string starting with './' (relative to marketplace).\r\n * External plugins have their source as an object (npm, pip, git, github, etc.).\r\n *\r\n * This function provides a semantic wrapper around the './' prefix check, making\r\n * the intent clear and centralizing the logic for determining plugin source type.\r\n *\r\n * @param source The plugin source from PluginMarketplaceEntry\r\n * @returns true if the source is a local path, false if it's an external source\r\n */\r\nexport function isLocalPluginSource(source: PluginSource): source is string {\r\n  return typeof source === 'string' && source.startsWith('./')\r\n}\r\n\r\n/**\r\n * Whether a marketplace source points at a user-controlled local filesystem path.\r\n *\r\n * For local sources (`file`/`directory`), `installLocation` IS the user's path \u2014\r\n * it lives outside the plugins cache dir and marketplace operations on it are\r\n * read-only. For remote sources (`github`/`git`/`url`/`npm`), `installLocation`\r\n * is a cache-dir entry managed by Tau and subject to rm/re-clone.\r\n *\r\n * Contrast with isLocalPluginSource, which operates on PluginSource (the\r\n * per-plugin source inside a marketplace entry) and checks for `./` prefix.\r\n */\r\nexport function isLocalMarketplaceSource(\r\n  source: MarketplaceSource,\r\n): source is Extract<MarketplaceSource, { source: 'file' | 'directory' }> {\r\n  return source.source === 'file' || source.source === 'directory'\r\n}\r\n\r\n/**\r\n * Schema for individual plugin entries in a marketplace\r\n *\r\n * When strict=true (default): Plugin.json is required, marketplace fields supplement it\r\n * When strict=false: Plugin.json is optional, marketplace provides full manifest\r\n *\r\n * Unknown fields are silently stripped (zod default) rather than rejected.\r\n * Marketplace entries are validated as an array \u2014 if one entry rejected\r\n * unknown keys, the whole marketplace.json would fail to parse and ALL\r\n * plugins from that marketplace would become unavailable. Stripping keeps\r\n * the blast radius to zero for custom/future fields.\r\n */\r\nexport const PluginMarketplaceEntrySchema = lazySchema(() =>\r\n  PluginManifestSchema()\r\n    .partial()\r\n    .extend({\r\n      name: z\r\n        .string()\r\n        .min(1, 'Plugin name cannot be empty')\r\n        .refine(name => !name.includes(' '), {\r\n          message:\r\n            'Plugin name cannot contain spaces. Use kebab-case (e.g., \"my-plugin\")',\r\n        })\r\n        .describe('Unique identifier matching the plugin name'),\r\n      source: PluginSourceSchema().describe('Where to fetch the plugin from'),\r\n      category: z\r\n        .string()\r\n        .optional()\r\n        .describe(\r\n          'Category for organizing plugins (e.g., \"productivity\", \"development\")',\r\n        ),\r\n      tags: z\r\n        .array(z.string())\r\n        .optional()\r\n        .describe('Tags for searchability and discovery'),\r\n      strict: z\r\n        .boolean()\r\n        .optional()\r\n        .default(true)\r\n        .describe(\r\n          'Require the plugin manifest to be present in the plugin folder. If false, the marketplace entry provides the manifest.',\r\n        ),\r\n    }),\r\n)\r\n\r\n/**\r\n * Schema for plugin marketplace configuration\r\n *\r\n * Defines the structure for curated collections of plugins that can\r\n * be discovered and installed from a central repository.\r\n */\r\nexport const PluginMarketplaceSchema = lazySchema(() =>\r\n  z.object({\r\n    name: MarketplaceNameSchema(),\r\n    owner: PluginAuthorSchema().describe(\r\n      'Marketplace maintainer or curator information',\r\n    ),\r\n    plugins: z\r\n      .array(PluginMarketplaceEntrySchema())\r\n      .describe('Collection of available plugins in this marketplace'),\r\n    forceRemoveDeletedPlugins: z\r\n      .boolean()\r\n      .optional()\r\n      .describe(\r\n        'When true, plugins removed from this marketplace will be automatically uninstalled and flagged for users',\r\n      ),\r\n    metadata: z\r\n      .object({\r\n        pluginRoot: z\r\n          .string()\r\n          .optional()\r\n          .describe('Base path for relative plugin sources'),\r\n        version: z.string().optional().describe('Marketplace version'),\r\n        description: z.string().optional().describe('Marketplace description'),\r\n      })\r\n      .optional()\r\n      .describe('Optional marketplace metadata'),\r\n    allowCrossMarketplaceDependenciesOn: z\r\n      .array(z.string())\r\n      .optional()\r\n      .describe(\r\n        \"Marketplace names whose plugins may be auto-installed as dependencies. Only the root marketplace's allowlist applies \\u2014 no transitive trust.\",\r\n      ),\r\n  }),\r\n)\r\n\r\n/**\r\n * Schema for plugin ID format\r\n *\r\n * Plugin IDs follow the format: \"plugin-name@marketplace-name\"\r\n * Both parts allow alphanumeric characters, hyphens, dots, and underscores.\r\n *\r\n * Examples:\r\n * - \"code-formatter@anthropic-tools\"\r\n * - \"db_assistant@company-internal\"\r\n * - \"my.plugin@personal-marketplace\"\r\n */\r\nexport const PluginIdSchema = lazySchema(() =>\r\n  z\r\n    .string()\r\n    .regex(\r\n      /^[a-z0-9][-a-z0-9._]*@[a-z0-9][-a-z0-9._]*$/i,\r\n      'Plugin ID must be in format: plugin@marketplace',\r\n    ),\r\n)\r\n\r\nconst DEP_REF_REGEX =\r\n  /^[a-z0-9][-a-z0-9._]*(@[a-z0-9][-a-z0-9._]*)?(@\\^[^@]*)?$/i\r\n\r\n/**\r\n * Schema for entries in a plugin's `dependencies` array.\r\n *\r\n * Accepts three forms, all normalized to a plain \"name\" or \"name@mkt\" string\r\n * by the transform \u2014 downstream code (qualifyDependency, resolveDependencyClosure,\r\n * verifyAndDemote) never sees versions or objects:\r\n *\r\n *   \"plugin\"                \u2192 bare, resolved against declaring plugin's marketplace\r\n *   \"plugin@marketplace\"    \u2192 qualified\r\n *   \"plugin@mkt@^1.2\"       \u2192 trailing @^version silently stripped (forwards-compat)\r\n *   {name, marketplace?, \u2026} \u2192 object form, version etc. stripped (forwards-compat)\r\n *\r\n * The latter two are permitted-but-ignored so future clients adding version\r\n * constraints don't cause old clients to fail schema validation and reject\r\n * the whole plugin. See CC-993 for the eventual version-range design.\r\n */\r\nexport const DependencyRefSchema = lazySchema(() =>\r\n  z.union([\r\n    z\r\n      .string()\r\n      .regex(\r\n        DEP_REF_REGEX,\r\n        'Dependency must be a plugin name, optionally qualified with @marketplace',\r\n      )\r\n      .transform(s => s.replace(/@\\^[^@]*$/, '')),\r\n    z\r\n      .object({\r\n        name: z\r\n          .string()\r\n          .min(1)\r\n          .regex(/^[a-z0-9][-a-z0-9._]*$/i),\r\n        marketplace: z\r\n          .string()\r\n          .min(1)\r\n          .regex(/^[a-z0-9][-a-z0-9._]*$/i)\r\n          .optional(),\r\n      })\r\n      .loose()\r\n      .transform(o => (o.marketplace ? `${o.name}@${o.marketplace}` : o.name)),\r\n  ]),\r\n)\r\n\r\n/**\r\n * Schema for plugin reference in settings (repo or user level)\r\n *\r\n * Can be either:\r\n * - Simple string: \"plugin-name@marketplace-name\"\r\n * - Object with additional configuration\r\n *\r\n * The plugin source (npm, git, local) is defined in the marketplace entry itself,\r\n * not in the plugin reference.\r\n *\r\n * Examples:\r\n * - \"code-formatter@anthropic-tools\"\r\n * - \"db-assistant@company-internal\"\r\n * - { id: \"formatter@tools\", version: \"^2.0.0\", required: true }\r\n */\r\nexport const SettingsPluginEntrySchema = lazySchema(() =>\r\n  z.union([\r\n    // Simple format: \"plugin@marketplace\"\r\n    PluginIdSchema(),\r\n    // Extended format with configuration\r\n    z.object({\r\n      id: PluginIdSchema().describe(\r\n        'Plugin identifier (e.g., \"formatter@tools\")',\r\n      ),\r\n      version: z\r\n        .string()\r\n        .optional()\r\n        .describe('Version constraint (e.g., \"^2.0.0\")'),\r\n      required: z.boolean().optional().describe('If true, cannot be disabled'),\r\n      config: z\r\n        .record(z.string(), z.unknown())\r\n        .optional()\r\n        .describe('Plugin-specific configuration'),\r\n    }),\r\n  ]),\r\n)\r\n\r\n/**\r\n * Schema for installed plugin metadata (V1 format)\r\n *\r\n * Tracks the actual installation state of a plugin. All plugins are\r\n * installed from marketplaces, which contain the actual source details\r\n * (npm, git, local, etc.). The plugin ID is the key in the plugins record,\r\n * so it's not duplicated here.\r\n *\r\n * Example entry for key \"code-formatter@anthropic-tools\":\r\n * {\r\n *   \"version\": \"1.2.0\",\r\n *   \"installedAt\": \"2024-01-15T10:30:00Z\",\r\n *   \"marketplace\": \"anthropic-tools\",\r\n *   \"installPath\": \"/home/user/.claude/plugins/installed/anthropic-tools/code-formatter\"\r\n * }\r\n */\r\nexport const InstalledPluginSchema = lazySchema(() =>\r\n  z.object({\r\n    version: z.string().describe('Currently installed version'),\r\n    installedAt: z.string().describe('ISO 8601 timestamp of installation'),\r\n    lastUpdated: z\r\n      .string()\r\n      .optional()\r\n      .describe('ISO 8601 timestamp of last update'),\r\n    installPath: z\r\n      .string()\r\n      .describe('Absolute path to the installed plugin directory'),\r\n    gitCommitSha: z\r\n      .string()\r\n      .optional()\r\n      .describe('Git commit SHA for git-based plugins (for version tracking)'),\r\n  }),\r\n)\r\n\r\n/**\r\n * Schema for the installed_plugins.json file (V1 format)\r\n *\r\n * Contains a version number and maps plugin IDs to their installation metadata.\r\n * Maintained automatically by Tau, not edited by users.\r\n *\r\n * The version field tracks schema changes. When the version doesn't match\r\n * the current schema version, Tau will update the file on next startup.\r\n *\r\n * Example file:\r\n * {\r\n *   \"version\": 1,\r\n *   \"plugins\": {\r\n *     \"code-formatter@anthropic-tools\": { ... },\r\n *     \"db-assistant@company-internal\": { ... }\r\n *   }\r\n * }\r\n */\r\nexport const InstalledPluginsFileSchemaV1 = lazySchema(() =>\r\n  z.object({\r\n    version: z.literal(1).describe('Schema version 1'),\r\n    plugins: z\r\n      .record(\r\n        PluginIdSchema(), // Validated plugin ID key (e.g., \"formatter@tools\")\r\n        InstalledPluginSchema(),\r\n      )\r\n      .describe('Map of plugin IDs to their installation metadata'),\r\n  }),\r\n)\r\n\r\n/**\r\n * Scope types for plugin installation (V2)\r\n *\r\n * Plugins can be installed at different scopes:\r\n * - managed: Enterprise/system-wide (read-only, platform-specific paths)\r\n * - user: User's global settings (~/.claude/settings.json)\r\n * - project: Shared project settings ($project/.claude/settings.json)\r\n * - local: Personal project overrides ($project/.claude/settings.local.json)\r\n *\r\n * Note: 'flag' scope plugins (from --settings) are session-only and\r\n * are NOT persisted to installed_plugins.json.\r\n */\r\nexport const PluginScopeSchema = lazySchema(() =>\r\n  z.enum(['managed', 'user', 'project', 'local']),\r\n)\r\n\r\n/**\r\n * Schema for a single plugin installation entry (V2)\r\n *\r\n * Each plugin can have multiple installations at different scopes.\r\n * For example, the same plugin could be installed at user scope with v1.0\r\n * and at project scope with v1.1.\r\n */\r\nexport const PluginInstallationEntrySchema = lazySchema(() =>\r\n  z.object({\r\n    scope: PluginScopeSchema().describe('Installation scope'),\r\n    projectPath: z\r\n      .string()\r\n      .optional()\r\n      .describe('Project path (required for project/local scopes)'),\r\n    installPath: z\r\n      .string()\r\n      .describe('Absolute path to the versioned plugin directory'),\r\n    // Preserved from V1:\r\n    version: z.string().optional().describe('Currently installed version'),\r\n    installedAt: z\r\n      .string()\r\n      .optional()\r\n      .describe('ISO 8601 timestamp of installation'),\r\n    lastUpdated: z\r\n      .string()\r\n      .optional()\r\n      .describe('ISO 8601 timestamp of last update'),\r\n    gitCommitSha: z\r\n      .string()\r\n      .optional()\r\n      .describe('Git commit SHA for git-based plugins'),\r\n  }),\r\n)\r\n\r\n/**\r\n * Schema for the installed_plugins.json file (V2 format)\r\n *\r\n * V2 changes from V1:\r\n * - Each plugin ID maps to an ARRAY of installations (one per scope)\r\n * - Supports multi-scope installation (same plugin at different scopes/versions)\r\n *\r\n * Example file:\r\n * {\r\n *   \"version\": 2,\r\n *   \"plugins\": {\r\n *     \"code-formatter@anthropic-tools\": [\r\n *       { \"scope\": \"user\", \"installPath\": \"...\", \"version\": \"1.0.0\" },\r\n *       { \"scope\": \"project\", \"projectPath\": \"/path/to/project\", \"installPath\": \"...\", \"version\": \"1.1.0\" }\r\n *     ]\r\n *   }\r\n * }\r\n */\r\nexport const InstalledPluginsFileSchemaV2 = lazySchema(() =>\r\n  z.object({\r\n    version: z.literal(2).describe('Schema version 2'),\r\n    plugins: z\r\n      .record(PluginIdSchema(), z.array(PluginInstallationEntrySchema()))\r\n      .describe('Map of plugin IDs to arrays of installation entries'),\r\n  }),\r\n)\r\n\r\n/**\r\n * Combined schema that accepts both V1 and V2 formats\r\n * Used for reading existing files before migration\r\n */\r\nexport const InstalledPluginsFileSchema = lazySchema(() =>\r\n  z.union([InstalledPluginsFileSchemaV1(), InstalledPluginsFileSchemaV2()]),\r\n)\r\n\r\n/**\r\n * Schema for a known marketplace entry\r\n *\r\n * Tracks metadata about a registered marketplace in the user's configuration.\r\n * Each entry contains the source location, cache path, and last update time.\r\n *\r\n * Example entry:\r\n * {\r\n *   \"source\": { \"source\": \"github\", \"repo\": \"anthropic/claude-plugins\" },\r\n *   \"installLocation\": \"/home/user/.claude/plugins/cached/marketplaces/anthropic-tools\",\r\n *   \"lastUpdated\": \"2024-01-15T10:30:00Z\"\r\n * }\r\n */\r\nexport const KnownMarketplaceSchema = lazySchema(() =>\r\n  z.object({\r\n    source: MarketplaceSourceSchema().describe(\r\n      'Where to fetch the marketplace from',\r\n    ),\r\n    installLocation: z\r\n      .string()\r\n      .describe('Local cache path where marketplace manifest is stored'),\r\n    lastUpdated: z\r\n      .string()\r\n      .describe('ISO 8601 timestamp of last marketplace refresh'),\r\n    autoUpdate: z\r\n      .boolean()\r\n      .optional()\r\n      .describe(\r\n        'Whether to automatically update this marketplace and its installed plugins on startup',\r\n      ),\r\n  }),\r\n)\r\n\r\n/**\r\n * Schema for the known_marketplaces.json file\r\n *\r\n * Maps marketplace names to their source and cache metadata.\r\n * Used to track which marketplaces are registered and where to find them.\r\n *\r\n * Example file:\r\n * {\r\n *   \"anthropic-tools\": { \"source\": { ... }, \"installLocation\": \"...\", \"lastUpdated\": \"...\" },\r\n *   \"company-internal\": { \"source\": { ... }, \"installLocation\": \"...\", \"lastUpdated\": \"...\" }\r\n * }\r\n */\r\nexport const KnownMarketplacesFileSchema = lazySchema(() =>\r\n  z.record(\r\n    z.string(), // Marketplace name as key\r\n    KnownMarketplaceSchema(),\r\n  ),\r\n)\r\n\r\n// Inferred types from schemas\r\n/**\r\n * Metadata for plugin command definitions.\r\n *\r\n * Commands can be defined with either:\r\n * - `source`: Path to a markdown file (e.g., \"./README.md\")\r\n * - `content`: Inline markdown content string\r\n *\r\n * INVARIANT: Exactly one of `source` or `content` must be present.\r\n * This invariant is enforced at runtime by CommandMetadataSchema validation.\r\n *\r\n * Validation occurs at plugin manifest parsing. Metadata is assumed valid\r\n * after passing through createPluginFromPath().\r\n *\r\n * @see CommandMetadataSchema for runtime validation rules\r\n */\r\nexport type CommandMetadata = z.infer<ReturnType<typeof CommandMetadataSchema>>\r\nexport type MarketplaceSource = z.infer<\r\n  ReturnType<typeof MarketplaceSourceSchema>\r\n>\r\nexport type PluginAuthor = z.infer<ReturnType<typeof PluginAuthorSchema>>\r\nexport type PluginSource = z.infer<ReturnType<typeof PluginSourceSchema>>\r\nexport type PluginManifest = z.infer<ReturnType<typeof PluginManifestSchema>>\r\nexport type PluginManifestChannel = NonNullable<\r\n  PluginManifest['channels']\r\n>[number]\r\n\r\nexport type PluginMarketplace = z.infer<\r\n  ReturnType<typeof PluginMarketplaceSchema>\r\n>\r\nexport type PluginMarketplaceEntry = z.infer<\r\n  ReturnType<typeof PluginMarketplaceEntrySchema>\r\n>\r\nexport type PluginId = z.infer<ReturnType<typeof PluginIdSchema>> // string in \"plugin@marketplace\" format\r\nexport type InstalledPlugin = z.infer<ReturnType<typeof InstalledPluginSchema>>\r\nexport type InstalledPluginsFileV1 = z.infer<\r\n  ReturnType<typeof InstalledPluginsFileSchemaV1>\r\n>\r\nexport type InstalledPluginsFileV2 = z.infer<\r\n  ReturnType<typeof InstalledPluginsFileSchemaV2>\r\n>\r\nexport type PluginScope = z.infer<ReturnType<typeof PluginScopeSchema>>\r\nexport type PluginInstallationEntry = z.infer<\r\n  ReturnType<typeof PluginInstallationEntrySchema>\r\n>\r\nexport type KnownMarketplace = z.infer<\r\n  ReturnType<typeof KnownMarketplaceSchema>\r\n>\r\nexport type KnownMarketplacesFile = z.infer<\r\n  ReturnType<typeof KnownMarketplacesFileSchema>\r\n> // Record<string, KnownMarketplace>\r\n", "/**\n * Pure utility functions for MCP name normalization.\n * This file has no dependencies to avoid circular imports.\n */\n\n// Claude.ai server names are prefixed with this string\nconst CLAUDEAI_SERVER_PREFIX = 'claude.ai '\n\n/**\n * Normalize server names to be compatible with the API pattern ^[a-zA-Z0-9_-]{1,64}$\n * Replaces any invalid characters (including dots and spaces) with underscores.\n *\n * For claude.ai servers (names starting with \"claude.ai \"), also collapses\n * consecutive underscores and strips leading/trailing underscores to prevent\n * interference with the __ delimiter used in MCP tool names.\n */\nexport function normalizeNameForMCP(name: string): string {\n  let normalized = name.replace(/[^a-zA-Z0-9_-]/g, '_')\n  if (name.startsWith(CLAUDEAI_SERVER_PREFIX)) {\n    normalized = normalized.replace(/_+/g, '_').replace(/^_|_$/g, '')\n  }\n  return normalized\n}\n", "/**\n * Pure string utility functions for MCP tool/server name parsing.\n * This file has no heavy dependencies to keep it lightweight for\n * consumers that only need string parsing (e.g., permissionValidation).\n */\n\nimport { normalizeNameForMCP } from './normalization.js'\n\n/*\n * Extracts MCP server information from a tool name string\n * @param toolString The string to parse. Expected format: \"mcp__serverName__toolName\"\n * @returns An object containing server name and optional tool name, or null if not a valid MCP rule\n *\n * Known limitation: If a server name contains \"__\", parsing will be incorrect.\n * For example, \"mcp__my__server__tool\" would parse as server=\"my\" and tool=\"server__tool\"\n * instead of server=\"my__server\" and tool=\"tool\". This is rare in practice since server\n * names typically don't contain double underscores.\n */\nexport function mcpInfoFromString(toolString: string): {\n  serverName: string\n  toolName: string | undefined\n} | null {\n  const parts = toolString.split('__')\n  const [mcpPart, serverName, ...toolNameParts] = parts\n  if (mcpPart !== 'mcp' || !serverName) {\n    return null\n  }\n  // Join all parts after server name to preserve double underscores in tool names\n  const toolName =\n    toolNameParts.length > 0 ? toolNameParts.join('__') : undefined\n  return { serverName, toolName }\n}\n\n/**\n * Generates the MCP tool/command name prefix for a given server\n * @param serverName Name of the MCP server\n * @returns The prefix string\n */\nexport function getMcpPrefix(serverName: string): string {\n  return `mcp__${normalizeNameForMCP(serverName)}__`\n}\n\n/**\n * Builds a fully qualified MCP tool name from server and tool names.\n * Inverse of mcpInfoFromString().\n * @param serverName Name of the MCP server (unnormalized)\n * @param toolName Name of the tool (unnormalized)\n * @returns The fully qualified name, e.g., \"mcp__server__tool\"\n */\nexport function buildMcpToolName(serverName: string, toolName: string): string {\n  return `${getMcpPrefix(serverName)}${normalizeNameForMCP(toolName)}`\n}\n\n/**\n * Returns the name to use for permission rule matching.\n * For MCP tools, uses the fully qualified mcp__server__tool name so that\n * deny rules targeting builtins (e.g., \"Write\") don't match unprefixed MCP\n * replacements that share the same display name. Falls back to `tool.name`.\n */\nexport function getToolNameForPermissionCheck(tool: {\n  name: string\n  mcpInfo?: { serverName: string; toolName: string }\n}): string {\n  return tool.mcpInfo\n    ? buildMcpToolName(tool.mcpInfo.serverName, tool.mcpInfo.toolName)\n    : tool.name\n}\n\n/*\n * Extracts the display name from an MCP tool/command name\n * @param fullName The full MCP tool/command name (e.g., \"mcp__server_name__tool_name\")\n * @param serverName The server name to remove from the prefix\n * @returns The display name without the MCP prefix\n */\nexport function getMcpDisplayName(\n  fullName: string,\n  serverName: string,\n): string {\n  const prefix = `mcp__${normalizeNameForMCP(serverName)}__`\n  return fullName.replace(prefix, '')\n}\n\n/**\n * Extracts just the tool/command display name from a userFacingName\n * @param userFacingName The full user-facing name (e.g., \"github - Add comment to issue (MCP)\")\n * @returns The display name without server prefix and (MCP) suffix\n */\nexport function extractMcpToolDisplayName(userFacingName: string): string {\n  // This is really ugly but our current Tool type doesn't make it easy to have different display names for different purposes.\n\n  // First, remove the (MCP) suffix if present\n  let withoutSuffix = userFacingName.replace(/\\s*\\(MCP\\)\\s*$/, '')\n\n  // Trim the result\n  withoutSuffix = withoutSuffix.trim()\n\n  // Then, remove the server prefix (everything before \" - \")\n  const dashIndex = withoutSuffix.indexOf(' - ')\n  if (dashIndex !== -1) {\n    const displayName = withoutSuffix.substring(dashIndex + 3).trim()\n    return displayName\n  }\n\n  // If no dash found, return the string without (MCP)\n  return withoutSuffix\n}\n", "export const AGENT_TOOL_NAME = 'Agent'\n// Legacy wire name for backward compat (permission rules, hooks, resumed sessions)\nexport const LEGACY_AGENT_TOOL_NAME = 'Task'\nexport const VERIFICATION_AGENT_TYPE = 'verification'\n\n// Built-in agents that run once and return a report \u2014 the parent never\n// SendMessages back to continue them. Skip the agentId/SendMessage/usage\n// trailer for these to save tokens (~135 chars \u00D7 34M Explore runs/week).\nexport const ONE_SHOT_BUILTIN_AGENT_TYPES: ReadonlySet<string> = new Set([\n  'Explore',\n  'Plan',\n])\n", "export const TASK_OUTPUT_TOOL_NAME = 'TaskOutput'\n", "export const TASK_STOP_TOOL_NAME = 'TaskStop'\n\nexport const DESCRIPTION = `\n- Stops a running background task by its ID\n- Takes a task_id parameter identifying the task to stop\n- Returns a success or failure status\n- Use this tool when you need to terminate a long-running task\n`\n", "export const BRIEF_TOOL_NAME = 'SendUserMessage'\nexport const LEGACY_BRIEF_TOOL_NAME = 'Brief'\n\nexport const DESCRIPTION = 'Send a message to the user'\n\nexport const BRIEF_TOOL_PROMPT = `Send a message the user will read. Text outside this tool is visible in the detail view, but most won't open it \u2014 the answer lives here.\n\n\\`message\\` supports markdown. \\`attachments\\` takes file paths (absolute or cwd-relative) for images, diffs, logs.\n\n\\`status\\` labels intent: 'normal' when replying to what they just asked; 'proactive' when you're initiating \u2014 a scheduled task finished, a blocker surfaced during background work, you need input on something they haven't asked about. Set it honestly; downstream routing uses it.`\n\nexport const BRIEF_PROACTIVE_SECTION = `## Talking to the user\n\n${BRIEF_TOOL_NAME} is where your replies go. Text outside it is visible if the user expands the detail view, but most won't \u2014 assume unread. Anything you want them to actually see goes through ${BRIEF_TOOL_NAME}. The failure mode: the real answer lives in plain text while ${BRIEF_TOOL_NAME} just says \"done!\" \u2014 they see \"done!\" and miss everything.\n\nSo: every time the user says something, the reply they actually read comes through ${BRIEF_TOOL_NAME}. Even for \"hi\". Even for \"thanks\".\n\nIf you can answer right away, send the answer. If you need to go look \u2014 run a command, read files, check something \u2014 ack first in one line (\"On it \u2014 checking the test output\"), then work, then send the result. Without the ack they're staring at a spinner.\n\nFor longer work: ack \u2192 work \u2192 result. Between those, send a checkpoint when something useful happened \u2014 a decision you made, a surprise you hit, a phase boundary. Skip the filler (\"running tests...\") \u2014 a checkpoint earns its place by carrying information.\n\nKeep messages tight \u2014 the decision, the file:line, the PR number. Second person always (\"your config\"), never third.`\n", "import { feature } from 'bun:bundle'\nimport { AGENT_TOOL_NAME } from '../../tools/AgentTool/constants.js'\nimport { TASK_OUTPUT_TOOL_NAME } from '../../tools/TaskOutputTool/constants.js'\nimport { TASK_STOP_TOOL_NAME } from '../../tools/TaskStopTool/prompt.js'\nimport type { PermissionRuleValue } from './PermissionRule.js'\n\n// Dead code elimination: ant-only tool names are conditionally required so\n// their strings don't leak into external builds. Static imports always bundle.\n/* eslint-disable @typescript-eslint/no-require-imports */\nconst BRIEF_TOOL_NAME: string | null =\n  feature('KAIROS') || feature('KAIROS_BRIEF')\n    ? (\n        require('../../tools/BriefTool/prompt.js') as typeof import('../../tools/BriefTool/prompt.js')\n      ).BRIEF_TOOL_NAME\n    : null\n/* eslint-enable @typescript-eslint/no-require-imports */\n\n// Maps legacy tool names to their current canonical names.\n// When a tool is renamed, add old \u2192 new here so permission rules,\n// hooks, and persisted wire names resolve to the canonical name.\nconst LEGACY_TOOL_NAME_ALIASES: Record<string, string> = {\n  Task: AGENT_TOOL_NAME,\n  KillShell: TASK_STOP_TOOL_NAME,\n  AgentOutputTool: TASK_OUTPUT_TOOL_NAME,\n  BashOutputTool: TASK_OUTPUT_TOOL_NAME,\n  ...((feature('KAIROS') || feature('KAIROS_BRIEF')) && BRIEF_TOOL_NAME\n    ? { Brief: BRIEF_TOOL_NAME }\n    : {}),\n}\n\nexport function normalizeLegacyToolName(name: string): string {\n  return LEGACY_TOOL_NAME_ALIASES[name] ?? name\n}\n\nexport function getLegacyToolNames(canonicalName: string): string[] {\n  const result: string[] = []\n  for (const [legacy, canonical] of Object.entries(LEGACY_TOOL_NAME_ALIASES)) {\n    if (canonical === canonicalName) result.push(legacy)\n  }\n  return result\n}\n\n/**\n * Escapes special characters in rule content for safe storage in permission rules.\n * Permission rules use the format \"Tool(content)\", so parentheses in content must be escaped.\n *\n * Escaping order matters:\n * 1. Escape existing backslashes first (\\ -> \\\\)\n * 2. Then escape parentheses (( -> \\(, ) -> \\))\n *\n * @example\n * escapeRuleContent('psycopg2.connect()') // => 'psycopg2.connect\\\\(\\\\)'\n * escapeRuleContent('echo \"test\\\\nvalue\"') // => 'echo \"test\\\\\\\\nvalue\"'\n */\nexport function escapeRuleContent(content: string): string {\n  return content\n    .replace(/\\\\/g, '\\\\\\\\') // Escape backslashes first\n    .replace(/\\(/g, '\\\\(') // Escape opening parentheses\n    .replace(/\\)/g, '\\\\)') // Escape closing parentheses\n}\n\n/**\n * Unescapes special characters in rule content after parsing from permission rules.\n * This reverses the escaping done by escapeRuleContent.\n *\n * Unescaping order matters (reverse of escaping):\n * 1. Unescape parentheses first (\\( -> (, \\) -> ))\n * 2. Then unescape backslashes (\\\\ -> \\)\n *\n * @example\n * unescapeRuleContent('psycopg2.connect\\\\(\\\\)') // => 'psycopg2.connect()'\n * unescapeRuleContent('echo \"test\\\\\\\\nvalue\"') // => 'echo \"test\\\\nvalue\"'\n */\nexport function unescapeRuleContent(content: string): string {\n  return content\n    .replace(/\\\\\\(/g, '(') // Unescape opening parentheses\n    .replace(/\\\\\\)/g, ')') // Unescape closing parentheses\n    .replace(/\\\\\\\\/g, '\\\\') // Unescape backslashes last\n}\n\n/**\n * Parses a permission rule string into its components.\n * Handles escaped parentheses in the content portion.\n *\n * Format: \"ToolName\" or \"ToolName(content)\"\n * Content may contain escaped parentheses: \\( and \\)\n *\n * @example\n * permissionRuleValueFromString('Bash') // => { toolName: 'Bash' }\n * permissionRuleValueFromString('Bash(npm install)') // => { toolName: 'Bash', ruleContent: 'npm install' }\n * permissionRuleValueFromString('Bash(python -c \"print\\\\(1\\\\)\")') // => { toolName: 'Bash', ruleContent: 'python -c \"print(1)\"' }\n */\nexport function permissionRuleValueFromString(\n  ruleString: string,\n): PermissionRuleValue {\n  // Find the first unescaped opening parenthesis\n  const openParenIndex = findFirstUnescapedChar(ruleString, '(')\n  if (openParenIndex === -1) {\n    // No parenthesis found - this is just a tool name\n    return { toolName: normalizeLegacyToolName(ruleString) }\n  }\n\n  // Find the last unescaped closing parenthesis\n  const closeParenIndex = findLastUnescapedChar(ruleString, ')')\n  if (closeParenIndex === -1 || closeParenIndex <= openParenIndex) {\n    // No matching closing paren or malformed - treat as tool name\n    return { toolName: normalizeLegacyToolName(ruleString) }\n  }\n\n  // Ensure the closing paren is at the end\n  if (closeParenIndex !== ruleString.length - 1) {\n    // Content after closing paren - treat as tool name\n    return { toolName: normalizeLegacyToolName(ruleString) }\n  }\n\n  const toolName = ruleString.substring(0, openParenIndex)\n  const rawContent = ruleString.substring(openParenIndex + 1, closeParenIndex)\n\n  // Missing toolName (e.g., \"(foo)\") is malformed - treat whole string as tool name\n  if (!toolName) {\n    return { toolName: normalizeLegacyToolName(ruleString) }\n  }\n\n  // Empty content (e.g., \"Bash()\") or standalone wildcard (e.g., \"Bash(*)\")\n  // should be treated as just the tool name (tool-wide rule)\n  if (rawContent === '' || rawContent === '*') {\n    return { toolName: normalizeLegacyToolName(toolName) }\n  }\n\n  // Unescape the content\n  const ruleContent = unescapeRuleContent(rawContent)\n  return { toolName: normalizeLegacyToolName(toolName), ruleContent }\n}\n\n/**\n * Converts a permission rule value to its string representation.\n * Escapes parentheses in the content to prevent parsing issues.\n *\n * @example\n * permissionRuleValueToString({ toolName: 'Bash' }) // => 'Bash'\n * permissionRuleValueToString({ toolName: 'Bash', ruleContent: 'npm install' }) // => 'Bash(npm install)'\n * permissionRuleValueToString({ toolName: 'Bash', ruleContent: 'python -c \"print(1)\"' }) // => 'Bash(python -c \"print\\\\(1\\\\)\")'\n */\nexport function permissionRuleValueToString(\n  ruleValue: PermissionRuleValue,\n): string {\n  if (!ruleValue.ruleContent) {\n    return ruleValue.toolName\n  }\n  const escapedContent = escapeRuleContent(ruleValue.ruleContent)\n  return `${ruleValue.toolName}(${escapedContent})`\n}\n\n/**\n * Find the index of the first unescaped occurrence of a character.\n * A character is escaped if preceded by an odd number of backslashes.\n */\nfunction findFirstUnescapedChar(str: string, char: string): number {\n  for (let i = 0; i < str.length; i++) {\n    if (str[i] === char) {\n      // Count preceding backslashes\n      let backslashCount = 0\n      let j = i - 1\n      while (j >= 0 && str[j] === '\\\\') {\n        backslashCount++\n        j--\n      }\n      // If even number of backslashes, the char is unescaped\n      if (backslashCount % 2 === 0) {\n        return i\n      }\n    }\n  }\n  return -1\n}\n\n/**\n * Find the index of the last unescaped occurrence of a character.\n * A character is escaped if preceded by an odd number of backslashes.\n */\nfunction findLastUnescapedChar(str: string, char: string): number {\n  for (let i = str.length - 1; i >= 0; i--) {\n    if (str[i] === char) {\n      // Count preceding backslashes\n      let backslashCount = 0\n      let j = i - 1\n      while (j >= 0 && str[j] === '\\\\') {\n        backslashCount++\n        j--\n      }\n      // If even number of backslashes, the char is unescaped\n      if (backslashCount % 2 === 0) {\n        return i\n      }\n    }\n  }\n  return -1\n}\n", "/**\n * General string utility functions and classes for safe string accumulation\n */\n\n/**\n * Escapes special regex characters in a string so it can be used as a literal\n * pattern in a RegExp constructor.\n */\nexport function escapeRegExp(str: string): string {\n  return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\n/**\n * Uppercases the first character of a string, leaving the rest unchanged.\n * Unlike lodash `capitalize`, this does NOT lowercase the remaining characters.\n *\n * @example capitalize('fooBar') \u2192 'FooBar'\n * @example capitalize('hello world') \u2192 'Hello world'\n */\nexport function capitalize(str: string): string {\n  return str.charAt(0).toUpperCase() + str.slice(1)\n}\n\n/**\n * Returns the singular or plural form of a word based on count.\n * Replaces the inline `word${n === 1 ? '' : 's'}` idiom.\n *\n * @example plural(1, 'file') \u2192 'file'\n * @example plural(3, 'file') \u2192 'files'\n * @example plural(2, 'entry', 'entries') \u2192 'entries'\n */\nexport function plural(\n  n: number,\n  word: string,\n  pluralWord = word + 's',\n): string {\n  return n === 1 ? word : pluralWord\n}\n\n/**\n * Returns the first line of a string without allocating a split array.\n * Used for shebang detection in diff rendering.\n */\nexport function firstLineOf(s: string): string {\n  const nl = s.indexOf('\\n')\n  return nl === -1 ? s : s.slice(0, nl)\n}\n\n/**\n * Counts occurrences of `char` in `str` using indexOf jumps instead of\n * per-character iteration. Structurally typed so Buffer works too\n * (Buffer.indexOf accepts string needles).\n */\nexport function countCharInString(\n  str: { indexOf(search: string, start?: number): number },\n  char: string,\n  start = 0,\n): number {\n  let count = 0\n  let i = str.indexOf(char, start)\n  while (i !== -1) {\n    count++\n    i = str.indexOf(char, i + 1)\n  }\n  return count\n}\n\n/**\n * Normalize full-width (zenkaku) digits to half-width digits.\n * Useful for accepting input from Japanese/CJK IMEs.\n */\nexport function normalizeFullWidthDigits(input: string): string {\n  return input.replace(/[\uFF10-\uFF19]/g, ch =>\n    String.fromCharCode(ch.charCodeAt(0) - 0xfee0),\n  )\n}\n\n/**\n * Normalize full-width (zenkaku) space to half-width space.\n * Useful for accepting input from Japanese/CJK IMEs (U+3000 \u2192 U+0020).\n */\nexport function normalizeFullWidthSpace(input: string): string {\n  return input.replace(/\\u3000/g, ' ')\n}\n\n// Keep in-memory accumulation modest to avoid blowing up RSS.\n// Overflow beyond this limit is spilled to disk by ShellCommand.\nconst MAX_STRING_LENGTH = 2 ** 25\n\n/**\n * Safely joins an array of strings with a delimiter, truncating if the result exceeds maxSize.\n *\n * @param lines Array of strings to join\n * @param delimiter Delimiter to use between strings (default: ',')\n * @param maxSize Maximum size of the resulting string\n * @returns The joined string, truncated if necessary\n */\nexport function safeJoinLines(\n  lines: string[],\n  delimiter: string = ',',\n  maxSize: number = MAX_STRING_LENGTH,\n): string {\n  const truncationMarker = '...[truncated]'\n  let result = ''\n\n  for (const line of lines) {\n    const delimiterToAdd = result ? delimiter : ''\n    const fullAddition = delimiterToAdd + line\n\n    if (result.length + fullAddition.length <= maxSize) {\n      // The full line fits\n      result += fullAddition\n    } else {\n      // Need to truncate\n      const remainingSpace =\n        maxSize -\n        result.length -\n        delimiterToAdd.length -\n        truncationMarker.length\n\n      if (remainingSpace > 0) {\n        // Add delimiter and as much of the line as will fit\n        result +=\n          delimiterToAdd + line.slice(0, remainingSpace) + truncationMarker\n      } else {\n        // No room for any of this line, just add truncation marker\n        result += truncationMarker\n      }\n      return result\n    }\n  }\n  return result\n}\n\n/**\n * A string accumulator that safely handles large outputs by truncating from the end\n * when a size limit is exceeded. This prevents RangeError crashes while preserving\n * the beginning of the output.\n */\nexport class EndTruncatingAccumulator {\n  private content: string = ''\n  private isTruncated = false\n  private totalBytesReceived = 0\n\n  /**\n   * Creates a new EndTruncatingAccumulator\n   * @param maxSize Maximum size in characters before truncation occurs\n   */\n  constructor(private readonly maxSize: number = MAX_STRING_LENGTH) {}\n\n  /**\n   * Appends data to the accumulator. If the total size exceeds maxSize,\n   * the end is truncated to maintain the size limit.\n   * @param data The string data to append\n   */\n  append(data: string | Buffer): void {\n    const str = typeof data === 'string' ? data : data.toString()\n    this.totalBytesReceived += str.length\n\n    // If already at capacity and truncated, don't modify content\n    if (this.isTruncated && this.content.length >= this.maxSize) {\n      return\n    }\n\n    // Check if adding the string would exceed the limit\n    if (this.content.length + str.length > this.maxSize) {\n      // Only append what we can fit\n      const remainingSpace = this.maxSize - this.content.length\n      if (remainingSpace > 0) {\n        this.content += str.slice(0, remainingSpace)\n      }\n      this.isTruncated = true\n    } else {\n      this.content += str\n    }\n  }\n\n  /**\n   * Returns the accumulated string, with truncation marker if truncated\n   */\n  toString(): string {\n    if (!this.isTruncated) {\n      return this.content\n    }\n\n    const truncatedBytes = this.totalBytesReceived - this.maxSize\n    const truncatedKB = Math.round(truncatedBytes / 1024)\n    return this.content + `\\n... [output truncated - ${truncatedKB}KB removed]`\n  }\n\n  /**\n   * Clears all accumulated data\n   */\n  clear(): void {\n    this.content = ''\n    this.isTruncated = false\n    this.totalBytesReceived = 0\n  }\n\n  /**\n   * Returns the current size of accumulated data\n   */\n  get length(): number {\n    return this.content.length\n  }\n\n  /**\n   * Returns whether truncation has occurred\n   */\n  get truncated(): boolean {\n    return this.isTruncated\n  }\n\n  /**\n   * Returns total bytes received (before truncation)\n   */\n  get totalBytes(): number {\n    return this.totalBytesReceived\n  }\n}\n\n/**\n * Truncates text to a maximum number of lines, adding an ellipsis if truncated.\n *\n * @param text The text to truncate\n * @param maxLines Maximum number of lines to keep\n * @returns The truncated text with ellipsis if truncated\n */\nexport function truncateToLines(text: string, maxLines: number): string {\n  const lines = text.split('\\n')\n  if (lines.length <= maxLines) {\n    return text\n  }\n  return lines.slice(0, maxLines).join('\\n') + '\u2026'\n}\n", "/**\n * Tool validation configuration\n *\n * Most tools need NO configuration - basic validation works automatically.\n * Only add your tool here if it has special pattern requirements.\n */\n\nexport type ToolValidationConfig = {\n  /** Tools that accept file glob patterns (e.g., *.ts, src/**) */\n  filePatternTools: string[]\n\n  /** Tools that accept bash wildcard patterns (* anywhere) and legacy :* prefix syntax */\n  bashPrefixTools: string[]\n\n  /** Custom validation rules for specific tools */\n  customValidation: {\n    [toolName: string]: (content: string) => {\n      valid: boolean\n      error?: string\n      suggestion?: string\n      examples?: string[]\n    }\n  }\n}\n\nexport const TOOL_VALIDATION_CONFIG: ToolValidationConfig = {\n  // File pattern tools (accept *.ts, src/**, etc.)\n  filePatternTools: [\n    'Read',\n    'Write',\n    'Edit',\n    'Glob',\n    'NotebookRead',\n    'NotebookEdit',\n  ],\n\n  // Bash wildcard tools (accept * anywhere, and legacy command:* syntax)\n  bashPrefixTools: ['Bash'],\n\n  // Custom validation (only if needed)\n  customValidation: {\n    // WebSearch doesn't support wildcards or complex patterns\n    WebSearch: content => {\n      if (content.includes('*') || content.includes('?')) {\n        return {\n          valid: false,\n          error: 'WebSearch does not support wildcards',\n          suggestion: 'Use exact search terms without * or ?',\n          examples: ['WebSearch(claude ai)', 'WebSearch(typescript tutorial)'],\n        }\n      }\n      return { valid: true }\n    },\n\n    // WebFetch uses domain: prefix for hostname-based permissions\n    WebFetch: content => {\n      // Check if it's trying to use a URL format\n      if (content.includes('://') || content.startsWith('http')) {\n        return {\n          valid: false,\n          error: 'WebFetch permissions use domain format, not URLs',\n          suggestion: 'Use \"domain:hostname\" format',\n          examples: [\n            'WebFetch(domain:example.com)',\n            'WebFetch(domain:github.com)',\n          ],\n        }\n      }\n\n      // Must start with domain: prefix\n      if (!content.startsWith('domain:')) {\n        return {\n          valid: false,\n          error: 'WebFetch permissions must use \"domain:\" prefix',\n          suggestion: 'Use \"domain:hostname\" format',\n          examples: [\n            'WebFetch(domain:example.com)',\n            'WebFetch(domain:*.google.com)',\n          ],\n        }\n      }\n\n      // Allow wildcards in domain patterns\n      // Valid: domain:*.example.com, domain:example.*, etc.\n      return { valid: true }\n    },\n  },\n}\n\n// Helper to check if a tool uses file patterns\nexport function isFilePatternTool(toolName: string): boolean {\n  return TOOL_VALIDATION_CONFIG.filePatternTools.includes(toolName)\n}\n\n// Helper to check if a tool uses bash prefix patterns\nexport function isBashPrefixTool(toolName: string): boolean {\n  return TOOL_VALIDATION_CONFIG.bashPrefixTools.includes(toolName)\n}\n\n// Helper to get custom validation for a tool\nexport function getCustomValidation(toolName: string) {\n  return TOOL_VALIDATION_CONFIG.customValidation[toolName]\n}\n", "import { z } from 'zod/v4'\nimport { mcpInfoFromString } from '../../services/mcp/mcpStringUtils.js'\nimport { lazySchema } from '../lazySchema.js'\nimport { permissionRuleValueFromString } from '../permissions/permissionRuleParser.js'\nimport { capitalize } from '../stringUtils.js'\nimport {\n  getCustomValidation,\n  isBashPrefixTool,\n  isFilePatternTool,\n} from './toolValidationConfig.js'\n\n/**\n * Checks if a character at a given index is escaped (preceded by odd number of backslashes).\n */\nfunction isEscaped(str: string, index: number): boolean {\n  let backslashCount = 0\n  let j = index - 1\n  while (j >= 0 && str[j] === '\\\\') {\n    backslashCount++\n    j--\n  }\n  return backslashCount % 2 !== 0\n}\n\n/**\n * Counts unescaped occurrences of a character in a string.\n * A character is considered escaped if preceded by an odd number of backslashes.\n */\nfunction countUnescapedChar(str: string, char: string): number {\n  let count = 0\n  for (let i = 0; i < str.length; i++) {\n    if (str[i] === char && !isEscaped(str, i)) {\n      count++\n    }\n  }\n  return count\n}\n\n/**\n * Checks if a string contains unescaped empty parentheses \"()\".\n * Returns true only if both the \"(\" and \")\" are unescaped and adjacent.\n */\nfunction hasUnescapedEmptyParens(str: string): boolean {\n  for (let i = 0; i < str.length - 1; i++) {\n    if (str[i] === '(' && str[i + 1] === ')') {\n      // Check if the opening paren is unescaped\n      if (!isEscaped(str, i)) {\n        return true\n      }\n    }\n  }\n  return false\n}\n\n/**\n * Validates permission rule format and content\n */\nexport function validatePermissionRule(rule: string): {\n  valid: boolean\n  error?: string\n  suggestion?: string\n  examples?: string[]\n} {\n  // Empty rule check\n  if (!rule || rule.trim() === '') {\n    return { valid: false, error: 'Permission rule cannot be empty' }\n  }\n\n  // Check parentheses matching first (only count unescaped parens)\n  const openCount = countUnescapedChar(rule, '(')\n  const closeCount = countUnescapedChar(rule, ')')\n  if (openCount !== closeCount) {\n    return {\n      valid: false,\n      error: 'Mismatched parentheses',\n      suggestion:\n        'Ensure all opening parentheses have matching closing parentheses',\n    }\n  }\n\n  // Check for empty parentheses (escape-aware)\n  if (hasUnescapedEmptyParens(rule)) {\n    const toolName = rule.substring(0, rule.indexOf('('))\n    if (!toolName) {\n      return {\n        valid: false,\n        error: 'Empty parentheses with no tool name',\n        suggestion: 'Specify a tool name before the parentheses',\n      }\n    }\n    return {\n      valid: false,\n      error: 'Empty parentheses',\n      suggestion: `Either specify a pattern or use just \"${toolName}\" without parentheses`,\n      examples: [`${toolName}`, `${toolName}(some-pattern)`],\n    }\n  }\n\n  // Parse the rule\n  const parsed = permissionRuleValueFromString(rule)\n\n  // MCP validation - must be done before general tool validation\n  const mcpInfo = mcpInfoFromString(parsed.toolName)\n  if (mcpInfo) {\n    // MCP rules support server-level, tool-level, and wildcard permissions\n    // Valid formats:\n    // - mcp__server (server-level, all tools)\n    // - mcp__server__* (wildcard, all tools - equivalent to server-level)\n    // - mcp__server__tool (specific tool)\n\n    // MCP rules cannot have any pattern/content (parentheses)\n    // Check both parsed content and raw string since the parser normalizes\n    // standalone wildcards (e.g., \"mcp__server(*)\") to undefined ruleContent\n    if (parsed.ruleContent !== undefined || countUnescapedChar(rule, '(') > 0) {\n      return {\n        valid: false,\n        error: 'MCP rules do not support patterns in parentheses',\n        suggestion: `Use \"${parsed.toolName}\" without parentheses, or use \"mcp__${mcpInfo.serverName}__*\" for all tools`,\n        examples: [\n          `mcp__${mcpInfo.serverName}`,\n          `mcp__${mcpInfo.serverName}__*`,\n          mcpInfo.toolName && mcpInfo.toolName !== '*'\n            ? `mcp__${mcpInfo.serverName}__${mcpInfo.toolName}`\n            : undefined,\n        ].filter(Boolean) as string[],\n      }\n    }\n\n    return { valid: true } // Valid MCP rule\n  }\n\n  // Tool name validation (for non-MCP tools)\n  if (!parsed.toolName || parsed.toolName.length === 0) {\n    return { valid: false, error: 'Tool name cannot be empty' }\n  }\n\n  // Check tool name starts with uppercase (standard tools)\n  if (parsed.toolName[0] !== parsed.toolName[0]?.toUpperCase()) {\n    return {\n      valid: false,\n      error: 'Tool names must start with uppercase',\n      suggestion: `Use \"${capitalize(String(parsed.toolName))}\"`,\n    }\n  }\n\n  // Check for custom validation rules first\n  const customValidation = getCustomValidation(parsed.toolName)\n  if (customValidation && parsed.ruleContent !== undefined) {\n    const customResult = customValidation(parsed.ruleContent)\n    if (!customResult.valid) {\n      return customResult\n    }\n  }\n\n  // Bash-specific validation\n  if (isBashPrefixTool(parsed.toolName) && parsed.ruleContent !== undefined) {\n    const content = parsed.ruleContent\n\n    // Check for common :* mistakes - :* must be at the end (legacy prefix syntax)\n    if (content.includes(':*') && !content.endsWith(':*')) {\n      return {\n        valid: false,\n        error: 'The :* pattern must be at the end',\n        suggestion:\n          'Move :* to the end for prefix matching, or use * for wildcard matching',\n        examples: [\n          'Bash(npm run:*) - prefix matching (legacy)',\n          'Bash(npm run *) - wildcard matching',\n        ],\n      }\n    }\n\n    // Check for :* without a prefix\n    if (content === ':*') {\n      return {\n        valid: false,\n        error: 'Prefix cannot be empty before :*',\n        suggestion: 'Specify a command prefix before :*',\n        examples: ['Bash(npm:*)', 'Bash(git:*)'],\n      }\n    }\n\n    // Note: We don't validate quote balancing because bash quoting rules are complex.\n    // A command like `grep '\"'` has valid unbalanced double quotes.\n    // Users who create patterns with unintended quote mismatches will discover\n    // the issue when matching doesn't work as expected.\n\n    // Wildcards are now allowed at any position for flexible pattern matching\n    // Examples of valid wildcard patterns:\n    // - \"npm *\" matches \"npm install\", \"npm run test\", etc.\n    // - \"* install\" matches \"npm install\", \"yarn install\", etc.\n    // - \"git * main\" matches \"git checkout main\", \"git push main\", etc.\n    // - \"npm * --save\" matches \"npm install foo --save\", etc.\n    //\n    // Legacy :* syntax continues to work for backwards compatibility:\n    // - \"npm:*\" matches \"npm\" or \"npm <anything>\" (prefix matching with word boundary)\n  }\n\n  // File tool validation\n  if (isFilePatternTool(parsed.toolName) && parsed.ruleContent !== undefined) {\n    const content = parsed.ruleContent\n\n    // Check for :* in file patterns (common mistake from Bash patterns)\n    if (content.includes(':*')) {\n      return {\n        valid: false,\n        error: 'The \":*\" syntax is only for Bash prefix rules',\n        suggestion: 'Use glob patterns like \"*\" or \"**\" for file matching',\n        examples: [\n          `${parsed.toolName}(*.ts) - matches .ts files`,\n          `${parsed.toolName}(src/**) - matches all files in src`,\n          `${parsed.toolName}(**/*.test.ts) - matches test files`,\n        ],\n      }\n    }\n\n    // Warn about wildcards not at boundaries\n    if (\n      content.includes('*') &&\n      !content.match(/^\\*|\\*$|\\*\\*|\\/\\*|\\*\\.|\\*\\)/) &&\n      !content.includes('**')\n    ) {\n      // This is a loose check - wildcards in the middle might be valid in some cases\n      // but often indicate confusion\n      return {\n        valid: false,\n        error: 'Wildcard placement might be incorrect',\n        suggestion: 'Wildcards are typically used at path boundaries',\n        examples: [\n          `${parsed.toolName}(*.js) - all .js files`,\n          `${parsed.toolName}(src/*) - all files directly in src`,\n          `${parsed.toolName}(src/**) - all files recursively in src`,\n        ],\n      }\n    }\n  }\n\n  return { valid: true }\n}\n\n/**\n * Custom Zod schema for permission rule arrays\n */\nexport const PermissionRuleSchema = lazySchema(() =>\n  z.string().superRefine((val, ctx) => {\n    const result = validatePermissionRule(val)\n    if (!result.valid) {\n      let message = result.error!\n      if (result.suggestion) {\n        message += `. ${result.suggestion}`\n      }\n      if (result.examples && result.examples.length > 0) {\n        message += `. Examples: ${result.examples.join(', ')}`\n      }\n      ctx.addIssue({\n        code: z.ZodIssueCode.custom,\n        message,\n        params: { received: val },\n      })\n    }\n  }),\n)\n", "import { feature } from 'bun:bundle'\r\nimport { z } from 'zod/v4'\r\nimport { SandboxSettingsSchema } from '../../entrypoints/sandboxTypes.js'\r\nimport { isEnvTruthy } from '../envUtils.js'\r\nimport { lazySchema } from '../lazySchema.js'\r\nimport {\r\n  EXTERNAL_PERMISSION_MODES,\r\n  PERMISSION_MODES,\r\n} from '../permissions/PermissionMode.js'\r\nimport { MarketplaceSourceSchema } from '../plugins/schemas.js'\r\nimport { CLAUDE_CODE_SETTINGS_SCHEMA_URL } from './constants.js'\r\nimport { PermissionRuleSchema } from './permissionValidation.js'\r\n\r\n// Re-export hook schemas and types from centralized location for backward compatibility\r\nexport {\r\n  type AgentHook,\r\n  type BashCommandHook,\r\n  type HookCommand,\r\n  HookCommandSchema,\r\n  type HookMatcher,\r\n  HookMatcherSchema,\r\n  HooksSchema,\r\n  type HooksSettings,\r\n  type HttpHook,\r\n  type PromptHook,\r\n} from '../../schemas/hooks.js'\r\n\r\n// Also import for use within this file\r\nimport { type HookCommand, HooksSchema } from '../../schemas/hooks.js'\r\nimport { count } from '../array.js'\r\n\r\n/**\r\n * Schema for environment variables\r\n */\r\nexport const EnvironmentVariablesSchema = lazySchema(() =>\r\n  z.record(z.string(), z.coerce.string()),\r\n)\r\n\r\n/**\r\n * Schema for permissions section\r\n */\r\nexport const PermissionsSchema = lazySchema(() =>\r\n  z\r\n    .object({\r\n      allow: z\r\n        .array(PermissionRuleSchema())\r\n        .optional()\r\n        .describe('List of permission rules for allowed operations'),\r\n      deny: z\r\n        .array(PermissionRuleSchema())\r\n        .optional()\r\n        .describe('List of permission rules for denied operations'),\r\n      ask: z\r\n        .array(PermissionRuleSchema())\r\n        .optional()\r\n        .describe(\r\n          'List of permission rules that should always prompt for confirmation',\r\n        ),\r\n      defaultMode: z\r\n        .enum(\r\n          feature('TRANSCRIPT_CLASSIFIER')\r\n            ? PERMISSION_MODES\r\n            : EXTERNAL_PERMISSION_MODES,\r\n        )\r\n        .optional()\r\n        .describe('Default permission mode when Tau needs access'),\r\n      disableBypassPermissionsMode: z\r\n        .enum(['disable'])\r\n        .optional()\r\n        .describe('Disable the ability to bypass permission prompts'),\r\n      ...(feature('TRANSCRIPT_CLASSIFIER')\r\n        ? {\r\n            disableAutoMode: z\r\n              .enum(['disable'])\r\n              .optional()\r\n              .describe('Disable auto mode'),\r\n          }\r\n        : {}),\r\n      additionalDirectories: z\r\n        .array(z.string())\r\n        .optional()\r\n        .describe('Additional directories to include in the permission scope'),\r\n    })\r\n    .passthrough(),\r\n)\r\n\r\n/**\r\n * Schema for extra marketplaces defined in repository settings\r\n * Same as KnownMarketplace but without lastUpdated (which is managed automatically)\r\n */\r\nexport const ExtraKnownMarketplaceSchema = lazySchema(() =>\r\n  z.object({\r\n    source: MarketplaceSourceSchema().describe(\r\n      'Where to fetch the marketplace from',\r\n    ),\r\n    installLocation: z\r\n      .string()\r\n      .optional()\r\n      .describe(\r\n        'Local cache path where marketplace manifest is stored (auto-generated if not provided)',\r\n      ),\r\n    autoUpdate: z\r\n      .boolean()\r\n      .optional()\r\n      .describe(\r\n        'Whether to automatically update this marketplace and its installed plugins on startup',\r\n      ),\r\n  }),\r\n)\r\n\r\n/**\r\n * Schema for allowed MCP server entry in enterprise allowlist.\r\n * Supports matching by serverName, serverCommand, or serverUrl (mutually exclusive).\r\n */\r\nexport const AllowedMcpServerEntrySchema = lazySchema(() =>\r\n  z\r\n    .object({\r\n      serverName: z\r\n        .string()\r\n        .regex(\r\n          /^[a-zA-Z0-9_-]+$/,\r\n          'Server name can only contain letters, numbers, hyphens, and underscores',\r\n        )\r\n        .optional()\r\n        .describe('Name of the MCP server that users are allowed to configure'),\r\n      serverCommand: z\r\n        .array(z.string())\r\n        .min(1, 'Server command must have at least one element (the command)')\r\n        .optional()\r\n        .describe(\r\n          'Command array [command, ...args] to match exactly for allowed stdio servers',\r\n        ),\r\n      serverUrl: z\r\n        .string()\r\n        .optional()\r\n        .describe(\r\n          'URL pattern with wildcard support (e.g., \"https://*.example.com/*\") for allowed remote MCP servers',\r\n        ),\r\n      // Future extensibility: allowedTransports, requiredArgs, maxInstances, etc.\r\n    })\r\n    .refine(\r\n      data => {\r\n        const defined = count(\r\n          [\r\n            data.serverName !== undefined,\r\n            data.serverCommand !== undefined,\r\n            data.serverUrl !== undefined,\r\n          ],\r\n          Boolean,\r\n        )\r\n        return defined === 1\r\n      },\r\n      {\r\n        message:\r\n          'Entry must have exactly one of \"serverName\", \"serverCommand\", or \"serverUrl\"',\r\n      },\r\n    ),\r\n)\r\n\r\n/**\r\n * Schema for denied MCP server entry in enterprise denylist.\r\n * Supports matching by serverName, serverCommand, or serverUrl (mutually exclusive).\r\n */\r\nexport const DeniedMcpServerEntrySchema = lazySchema(() =>\r\n  z\r\n    .object({\r\n      serverName: z\r\n        .string()\r\n        .regex(\r\n          /^[a-zA-Z0-9_-]+$/,\r\n          'Server name can only contain letters, numbers, hyphens, and underscores',\r\n        )\r\n        .optional()\r\n        .describe('Name of the MCP server that is explicitly blocked'),\r\n      serverCommand: z\r\n        .array(z.string())\r\n        .min(1, 'Server command must have at least one element (the command)')\r\n        .optional()\r\n        .describe(\r\n          'Command array [command, ...args] to match exactly for blocked stdio servers',\r\n        ),\r\n      serverUrl: z\r\n        .string()\r\n        .optional()\r\n        .describe(\r\n          'URL pattern with wildcard support (e.g., \"https://*.example.com/*\") for blocked remote MCP servers',\r\n        ),\r\n      // Future extensibility: reason, blockedSince, etc.\r\n    })\r\n    .refine(\r\n      data => {\r\n        const defined = count(\r\n          [\r\n            data.serverName !== undefined,\r\n            data.serverCommand !== undefined,\r\n            data.serverUrl !== undefined,\r\n          ],\r\n          Boolean,\r\n        )\r\n        return defined === 1\r\n      },\r\n      {\r\n        message:\r\n          'Entry must have exactly one of \"serverName\", \"serverCommand\", or \"serverUrl\"',\r\n      },\r\n    ),\r\n)\r\n\r\n/**\r\n * Unified schema for settings files\r\n *\r\n * \u26A0\uFE0F BACKWARD COMPATIBILITY NOTICE \u26A0\uFE0F\r\n *\r\n * This schema defines the structure of user settings files (.claude/settings.json).\r\n * We support backward-compatible changes! Here's how:\r\n *\r\n * \u2705 ALLOWED CHANGES:\r\n * - Adding new optional fields (always use .optional())\r\n * - Adding new enum values (keeping existing ones)\r\n * - Adding new properties to objects\r\n * - Making validation more permissive\r\n * - Using union types for gradual migration (e.g., z.union([oldType, newType]))\r\n *\r\n * \u274C BREAKING CHANGES TO AVOID:\r\n * - Removing fields (mark as deprecated instead)\r\n * - Removing enum values\r\n * - Making optional fields required\r\n * - Making types more restrictive\r\n * - Renaming fields without keeping the old name\r\n *\r\n * TO ENSURE BACKWARD COMPATIBILITY:\r\n * 1. Run: npm run test:file -- test/utils/settings/backward-compatibility.test.ts\r\n * 2. If tests fail, you've introduced a breaking change\r\n * 3. When adding new fields, add a test to BACKWARD_COMPATIBILITY_CONFIGS\r\n *\r\n * The settings system handles backward compatibility automatically:\r\n * - When updating settings, invalid fields are preserved in the file (see settings.ts lines 233-249)\r\n * - Type coercion via z.coerce (e.g., env vars convert numbers to strings)\r\n * - .passthrough() preserves unknown fields in permissions object\r\n * - Invalid settings are simply not used, but remain in the file to be fixed by the user\r\n */\r\n\r\n/**\r\n * Surfaces lockable by `strictPluginOnlyCustomization`. Exported so the\r\n * schema preprocess (below) and the runtime helper (pluginOnlyPolicy.ts)\r\n * share one source of truth.\r\n */\r\nexport const CUSTOMIZATION_SURFACES = [\r\n  'skills',\r\n  'agents',\r\n  'hooks',\r\n  'mcp',\r\n] as const\r\n\r\nexport const SettingsSchema = lazySchema(() =>\r\n  z\r\n    .object({\r\n      $schema: z\r\n        .literal(CLAUDE_CODE_SETTINGS_SCHEMA_URL)\r\n        .optional()\r\n        .describe('JSON Schema reference for Tau settings'),\r\n      apiKeyHelper: z\r\n        .string()\r\n        .optional()\r\n        .describe('Path to a script that outputs authentication values'),\r\n      awsCredentialExport: z\r\n        .string()\r\n        .optional()\r\n        .describe('Path to a script that exports AWS credentials'),\r\n      awsAuthRefresh: z\r\n        .string()\r\n        .optional()\r\n        .describe('Path to a script that refreshes AWS authentication'),\r\n      gcpAuthRefresh: z\r\n        .string()\r\n        .optional()\r\n        .describe(\r\n          'Command to refresh GCP authentication (e.g., gcloud auth application-default login)',\r\n        ),\r\n      // Gated so the SDK generator (which runs without CLAUDE_CODE_ENABLE_XAA)\r\n      // doesn't surface this in GlobalClaudeSettings. Read via getXaaIdpSettings().\r\n      // .passthrough() on the outer object keeps an existing settings.json key\r\n      // alive across env-var-off sessions \u2014 it's just not schema-validated then.\r\n      ...(isEnvTruthy(process.env.CLAUDE_CODE_ENABLE_XAA)\r\n        ? {\r\n            xaaIdp: z\r\n              .object({\r\n                issuer: z\r\n                  .string()\r\n                  .url()\r\n                  .describe('IdP issuer URL for OIDC discovery'),\r\n                clientId: z\r\n                  .string()\r\n                  .describe(\"Tau's client_id registered at the IdP\"),\r\n                callbackPort: z\r\n                  .number()\r\n                  .int()\r\n                  .positive()\r\n                  .optional()\r\n                  .describe(\r\n                    'Fixed loopback callback port for the IdP OIDC login. ' +\r\n                      'Only needed if the IdP does not honor RFC 8252 port-any matching.',\r\n                  ),\r\n              })\r\n              .optional()\r\n              .describe(\r\n                'XAA (SEP-990) IdP connection. Configure once; all XAA-enabled MCP servers reuse this.',\r\n              ),\r\n          }\r\n        : {}),\r\n      fileSuggestion: z\r\n        .object({\r\n          type: z.literal('command'),\r\n          command: z.string(),\r\n        })\r\n        .optional()\r\n        .describe('Custom file suggestion configuration for @ mentions'),\r\n      respectGitignore: z\r\n        .boolean()\r\n        .optional()\r\n        .describe(\r\n          'Whether file picker should respect .gitignore files (default: true). ' +\r\n            'Note: .ignore files are always respected.',\r\n        ),\r\n      cleanupPeriodDays: z\r\n        .number()\r\n        .nonnegative()\r\n        .int()\r\n        .optional()\r\n        .describe(\r\n          'Number of days to retain chat transcripts (default: 30). Setting to 0 disables session persistence entirely: no transcripts are written and existing transcripts are deleted at startup.',\r\n        ),\r\n      env: EnvironmentVariablesSchema()\r\n        .optional()\r\n        .describe('Environment variables to set for Tau sessions'),\r\n      // Attribution for commits and PRs\r\n      attribution: z\r\n        .object({\r\n          commit: z\r\n            .string()\r\n            .optional()\r\n            .describe(\r\n              'Attribution text for git commits, including any trailers. ' +\r\n                'Empty string hides attribution.',\r\n            ),\r\n          pr: z\r\n            .string()\r\n            .optional()\r\n            .describe(\r\n              'Attribution text for pull request descriptions. ' +\r\n                'Empty string hides attribution.',\r\n            ),\r\n        })\r\n        .optional()\r\n        .describe(\r\n          'Customize attribution text for commits and PRs. ' +\r\n            'Each field defaults to the standard Tau attribution if not set.',\r\n        ),\r\n      includeCoAuthoredBy: z\r\n        .boolean()\r\n        .optional()\r\n        .describe(\r\n          'Deprecated: Use attribution instead. ' +\r\n            \"Whether to include Claude's co-authored by attribution in commits and PRs (defaults to true)\",\r\n        ),\r\n      includeGitInstructions: z\r\n        .boolean()\r\n        .optional()\r\n        .describe(\r\n          \"Include built-in commit and PR workflow instructions in Claude's system prompt (default: true)\",\r\n        ),\r\n      permissions: PermissionsSchema()\r\n        .optional()\r\n        .describe('Tool usage permissions configuration'),\r\n      model: z\r\n        .string()\r\n        .optional()\r\n        .describe('Override the default model used by Tau'),\r\n      // Enterprise allowlist of models\r\n      availableModels: z\r\n        .array(z.string())\r\n        .optional()\r\n        .describe(\r\n          'Allowlist of models that users can select. ' +\r\n            'Accepts family aliases (\"opus\" allows any opus version), ' +\r\n            'version prefixes (\"opus-4-5\" allows only that version), ' +\r\n            'and full model IDs. ' +\r\n            'If undefined, all models are available. If empty array, only the default model is available. ' +\r\n            'Typically set in managed settings by enterprise administrators.',\r\n        ),\r\n      modelOverrides: z\r\n        .record(z.string(), z.string())\r\n        .optional()\r\n        .describe(\r\n          'Override mapping from Anthropic model ID (e.g. \"claude-opus-4-6\") to provider-specific ' +\r\n            'model ID (e.g. a Bedrock inference profile ARN). Typically set in managed settings by ' +\r\n            'enterprise administrators.',\r\n        ),\r\n      // Whether to automatically approve all MCP servers in the project\r\n      enableAllProjectMcpServers: z\r\n        .boolean()\r\n        .optional()\r\n        .describe(\r\n          'Whether to automatically approve all MCP servers in the project',\r\n        ),\r\n      // List of approved MCP servers from .mcp.json\r\n      enabledMcpjsonServers: z\r\n        .array(z.string())\r\n        .optional()\r\n        .describe('List of approved MCP servers from .mcp.json'),\r\n      // List of rejected MCP servers from .mcp.json\r\n      disabledMcpjsonServers: z\r\n        .array(z.string())\r\n        .optional()\r\n        .describe('List of rejected MCP servers from .mcp.json'),\r\n      // Enterprise allowlist of MCP servers\r\n      allowedMcpServers: z\r\n        .array(AllowedMcpServerEntrySchema())\r\n        .optional()\r\n        .describe(\r\n          'Enterprise allowlist of MCP servers that can be used. ' +\r\n            'Applies to all scopes including enterprise servers from managed-mcp.json. ' +\r\n            'If undefined, all servers are allowed. If empty array, no servers are allowed. ' +\r\n            'Denylist takes precedence - if a server is on both lists, it is denied.',\r\n        ),\r\n      // Enterprise denylist of MCP servers\r\n      deniedMcpServers: z\r\n        .array(DeniedMcpServerEntrySchema())\r\n        .optional()\r\n        .describe(\r\n          'Enterprise denylist of MCP servers that are explicitly blocked. ' +\r\n            'If a server is on the denylist, it will be blocked across all scopes including enterprise. ' +\r\n            'Denylist takes precedence over allowlist - if a server is on both lists, it is denied.',\r\n        ),\r\n      hooks: HooksSchema()\r\n        .optional()\r\n        .describe('Custom commands to run before/after tool executions'),\r\n      worktree: z\r\n        .object({\r\n          symlinkDirectories: z\r\n            .array(z.string())\r\n            .optional()\r\n            .describe(\r\n              'Directories to symlink from main repository to worktrees to avoid disk bloat. ' +\r\n                'Must be explicitly configured - no directories are symlinked by default. ' +\r\n                'Common examples: \"node_modules\", \".cache\", \".bin\"',\r\n            ),\r\n          sparsePaths: z\r\n            .array(z.string())\r\n            .optional()\r\n            .describe(\r\n              'Directories to include when creating worktrees, via git sparse-checkout (cone mode). ' +\r\n                'Dramatically faster in large monorepos \u2014 only the listed paths are written to disk.',\r\n            ),\r\n        })\r\n        .optional()\r\n        .describe('Git worktree configuration for --worktree flag.'),\r\n      // Whether to disable all hooks and statusLine\r\n      disableAllHooks: z\r\n        .boolean()\r\n        .optional()\r\n        .describe('Disable all hooks and statusLine execution'),\r\n      // Which shell backs input-box `!` (see docs/design/ps-shell-selection.md \u00A74.2)\r\n      defaultShell: z\r\n        .enum(['bash', 'powershell'])\r\n        .optional()\r\n        .describe(\r\n          'Default shell for input-box ! commands. ' +\r\n            \"Defaults to 'bash' on all platforms (no Windows auto-flip).\",\r\n        ),\r\n      // Only run hooks defined in managed settings (managed-settings.json)\r\n      allowManagedHooksOnly: z\r\n        .boolean()\r\n        .optional()\r\n        .describe(\r\n          'When true (and set in managed settings), only hooks from managed settings run. ' +\r\n            'User, project, and local hooks are ignored.',\r\n        ),\r\n      // Allowlist of URL patterns HTTP hooks may target (follows allowedMcpServers precedent)\r\n      allowedHttpHookUrls: z\r\n        .array(z.string())\r\n        .optional()\r\n        .describe(\r\n          'Allowlist of URL patterns that HTTP hooks may target. ' +\r\n            'Supports * as a wildcard (e.g. \"https://hooks.example.com/*\"). ' +\r\n            'When set, HTTP hooks with non-matching URLs are blocked. ' +\r\n            'If undefined, all URLs are allowed. If empty array, no HTTP hooks are allowed. ' +\r\n            'Arrays merge across settings sources (same semantics as allowedMcpServers).',\r\n        ),\r\n      // Allowlist of env var names HTTP hooks may interpolate into headers\r\n      httpHookAllowedEnvVars: z\r\n        .array(z.string())\r\n        .optional()\r\n        .describe(\r\n          'Allowlist of environment variable names HTTP hooks may interpolate into headers. ' +\r\n            \"When set, each hook's effective allowedEnvVars is the intersection with this list. \" +\r\n            'If undefined, no restriction is applied. ' +\r\n            'Arrays merge across settings sources (same semantics as allowedMcpServers).',\r\n        ),\r\n      // Only use permission rules defined in managed settings (managed-settings.json)\r\n      allowManagedPermissionRulesOnly: z\r\n        .boolean()\r\n        .optional()\r\n        .describe(\r\n          'When true (and set in managed settings), only permission rules (allow/deny/ask) from managed settings are respected. ' +\r\n            'User, project, local, and CLI argument permission rules are ignored.',\r\n        ),\r\n      // Only read MCP allowlist policy from managed settings\r\n      allowManagedMcpServersOnly: z\r\n        .boolean()\r\n        .optional()\r\n        .describe(\r\n          'When true (and set in managed settings), allowedMcpServers is only read from managed settings. ' +\r\n            'deniedMcpServers still merges from all sources, so users can deny servers for themselves. ' +\r\n            'Users can still add their own MCP servers, but only the admin-defined allowlist applies.',\r\n        ),\r\n      // Force customizations through plugins only (LinkedIn ask via GTM)\r\n      strictPluginOnlyCustomization: z\r\n        .preprocess(\r\n          // Forwards-compat: drop unknown surface names so a future enum\r\n          // value (e.g. 'commands') doesn't fail safeParse and null out the\r\n          // ENTIRE managed-settings file (settings.ts:101). [\"skills\",\r\n          // \"commands\"] on an old client \u2192 [\"skills\"] \u2192 locks what it knows,\r\n          // ignores what it doesn't. Degrades to less-locked, never to\r\n          // everything-unlocked.\r\n          v =>\r\n            Array.isArray(v)\r\n              ? v.filter(x =>\r\n                  (CUSTOMIZATION_SURFACES as readonly string[]).includes(x),\r\n                )\r\n              : v,\r\n          z.union([z.boolean(), z.array(z.enum(CUSTOMIZATION_SURFACES))]),\r\n        )\r\n        .optional()\r\n        // Non-array invalid values (\"skills\" string, {object}) pass through\r\n        // the preprocess unchanged and would fail the union \u2192 null the whole\r\n        // managed-settings file. .catch drops the field to undefined instead.\r\n        // Degrades to unlocked-for-this-field, never to everything-broken.\r\n        // Doctor flags the raw value.\r\n        .catch(undefined)\r\n        .describe(\r\n          'When set in managed settings, blocks non-plugin customization sources for the listed surfaces. ' +\r\n            'Array form locks specific surfaces (e.g. [\"skills\", \"hooks\"]); `true` locks all four; `false` is an explicit no-op. ' +\r\n            'Blocked: ~/.claude/{surface}/, .claude/{surface}/ (project), settings.json hooks, .mcp.json. ' +\r\n            'NOT blocked: managed (policySettings) sources, plugin-provided customizations. ' +\r\n            'Composes with strictKnownMarketplaces for end-to-end admin control \u2014 plugins gated by ' +\r\n            'marketplace allowlist, everything else blocked here.',\r\n        ),\r\n      // Status line for custom status line display\r\n      statusLine: z\r\n        .object({\r\n          type: z.literal('command'),\r\n          command: z.string(),\r\n          padding: z.number().optional(),\r\n        })\r\n        .optional()\r\n        .describe('Custom status line display configuration'),\r\n      // Enabled plugins using marketplace-first format\r\n      enabledPlugins: z\r\n        .record(\r\n          z.string(),\r\n          z.union([z.array(z.string()), z.boolean(), z.undefined()]),\r\n        )\r\n        .optional()\r\n        .describe(\r\n          'Enabled plugins using plugin-id@marketplace-id format. Example: { \"formatter@anthropic-tools\": true }. Also supports extended format with version constraints.',\r\n        ),\r\n      // Extra marketplaces for this repository (usually for project settings)\r\n      extraKnownMarketplaces: z\r\n        .record(z.string(), ExtraKnownMarketplaceSchema())\r\n        .check(ctx => {\r\n          // For settings sources, key must equal source.name. diffMarketplaces\r\n          // looks up materialized state by dict key; addMarketplaceSource stores\r\n          // under marketplace.name (= source.name for settings). A mismatch means\r\n          // the reconciler never converges \u2014 every session: key-lookup misses \u2192\r\n          // 'missing' \u2192 source-idempotency returns alreadyMaterialized but\r\n          // installed++ anyway \u2192 pointless cache clears. For github/git/url the\r\n          // name comes from a fetched marketplace.json (mismatch is expected and\r\n          // benign); for settings, both key and name are user-authored in the\r\n          // same JSON object.\r\n          for (const [key, entry] of Object.entries(ctx.value)) {\r\n            if (\r\n              entry.source.source === 'settings' &&\r\n              entry.source.name !== key\r\n            ) {\r\n              ctx.issues.push({\r\n                code: 'custom',\r\n                input: entry.source.name,\r\n                path: [key, 'source', 'name'],\r\n                message:\r\n                  `Settings-sourced marketplace name must match its extraKnownMarketplaces key ` +\r\n                  `(got key \"${key}\" but source.name \"${entry.source.name}\")`,\r\n              })\r\n            }\r\n          }\r\n        })\r\n        .optional()\r\n        .describe(\r\n          'Additional marketplaces to make available for this repository. Typically used in repository .claude/settings.json to ensure team members have required plugin sources.',\r\n        ),\r\n      // Enterprise strict list of allowed marketplace sources (policy settings only)\r\n      // When set, ONLY these exact sources can be added. Check happens BEFORE download.\r\n      strictKnownMarketplaces: z\r\n        .array(MarketplaceSourceSchema())\r\n        .optional()\r\n        .describe(\r\n          'Enterprise strict list of allowed marketplace sources. When set in managed settings, ' +\r\n            'ONLY these exact sources can be added as marketplaces. The check happens BEFORE ' +\r\n            'downloading, so blocked sources never touch the filesystem. ' +\r\n            'Note: this is a policy gate only \u2014 it does NOT register marketplaces. ' +\r\n            'To pre-register allowed marketplaces for users, also set extraKnownMarketplaces.',\r\n        ),\r\n      // Enterprise blocklist of marketplace sources (policy settings only)\r\n      // When set, these exact sources are blocked. Check happens BEFORE download.\r\n      blockedMarketplaces: z\r\n        .array(MarketplaceSourceSchema())\r\n        .optional()\r\n        .describe(\r\n          'Enterprise blocklist of marketplace sources. When set in managed settings, ' +\r\n            'these exact sources are blocked from being added as marketplaces. The check happens BEFORE ' +\r\n            'downloading, so blocked sources never touch the filesystem.',\r\n        ),\r\n      // Force a specific login method: 'claudeai' for Claude Pro/Max, 'console' for Console billing\r\n      forceLoginMethod: z\r\n        .enum(['claudeai', 'console'])\r\n        .optional()\r\n        .describe(\r\n          'Force a specific login method: \"claudeai\" for Claude Pro/Max, \"console\" for Console billing',\r\n        ),\r\n      // Organization UUID to use for OAuth login (will be added as URL param to authorization URL)\r\n      forceLoginOrgUUID: z\r\n        .string()\r\n        .optional()\r\n        .describe('Organization UUID to use for OAuth login'),\r\n      otelHeadersHelper: z\r\n        .string()\r\n        .optional()\r\n        .describe('Path to a script that outputs OpenTelemetry headers'),\r\n      outputStyle: z\r\n        .string()\r\n        .optional()\r\n        .describe('Controls the output style for assistant responses'),\r\n      language: z\r\n        .string()\r\n        .optional()\r\n        .describe(\r\n          'Preferred language for Claude responses and voice dictation (e.g., \"japanese\", \"spanish\")',\r\n        ),\r\n      skipWebFetchPreflight: z\r\n        .boolean()\r\n        .optional()\r\n        .describe(\r\n          'Skip the WebFetch blocklist check for enterprise environments with restrictive security policies',\r\n        ),\r\n      sandbox: SandboxSettingsSchema().optional(),\r\n      feedbackSurveyRate: z\r\n        .number()\r\n        .min(0)\r\n        .max(1)\r\n        .optional()\r\n        .describe(\r\n          'Probability (0\u20131) that the session quality survey appears when eligible. 0.05 is a reasonable starting point.',\r\n        ),\r\n      spinnerTipsEnabled: z\r\n        .boolean()\r\n        .optional()\r\n        .describe('Whether to show tips in the spinner'),\r\n      spinnerVerbs: z\r\n        .object({\r\n          mode: z.enum(['append', 'replace']),\r\n          verbs: z.array(z.string()),\r\n        })\r\n        .optional()\r\n        .describe(\r\n          'Customize spinner verbs. mode: \"append\" adds verbs to defaults, \"replace\" uses only your verbs.',\r\n        ),\r\n      spinnerTipsOverride: z\r\n        .object({\r\n          excludeDefault: z.boolean().optional(),\r\n          tips: z.array(z.string()),\r\n        })\r\n        .optional()\r\n        .describe(\r\n          'Override spinner tips. tips: array of tip strings. excludeDefault: if true, only show custom tips (default: false).',\r\n        ),\r\n      syntaxHighlightingDisabled: z\r\n        .boolean()\r\n        .optional()\r\n        .describe('Whether to disable syntax highlighting in diffs'),\r\n      terminalTitleFromRename: z\r\n        .boolean()\r\n        .optional()\r\n        .describe(\r\n          'Whether /rename updates the terminal tab title (defaults to true). Set to false to keep auto-generated topic titles.',\r\n        ),\r\n      alwaysThinkingEnabled: z\r\n        .boolean()\r\n        .optional()\r\n        .describe(\r\n          'When false, thinking is disabled. When absent or true, thinking is ' +\r\n            'enabled automatically for supported models.',\r\n        ),\r\n      effortLevel: z\r\n        .enum(\r\n          process.env.USER_TYPE === 'ant'\r\n            ? ['low', 'medium', 'high', 'xhigh', 'max']\r\n            : ['low', 'medium', 'high'],\r\n        )\r\n        .optional()\r\n        .catch(undefined)\r\n        .describe('Persisted effort level for supported models.'),\r\n      advisorModel: z\r\n        .string()\r\n        .optional()\r\n        .describe('Advisor model for the server-side advisor tool.'),\r\n      pin: z\r\n        .object({\r\n          text: z.string(),\r\n          enabled: z.boolean(),\r\n        })\r\n        .optional()\r\n        .describe(\r\n          'Pinned constraint appended to every user message (cache-safe; system prompt is untouched).',\r\n        ),\r\n      fastMode: z\r\n        .boolean()\r\n        .optional()\r\n        .describe(\r\n          'When true, fast mode is enabled. When absent or false, fast mode is off.',\r\n        ),\r\n      fastModePerSessionOptIn: z\r\n        .boolean()\r\n        .optional()\r\n        .describe(\r\n          'When true, fast mode does not persist across sessions. Each session starts with fast mode off.',\r\n        ),\r\n      promptSuggestionEnabled: z\r\n        .boolean()\r\n        .optional()\r\n        .describe(\r\n          'When false, prompt suggestions are disabled. When absent or true, ' +\r\n            'prompt suggestions are enabled.',\r\n        ),\r\n      showClearContextOnPlanAccept: z\r\n        .boolean()\r\n        .optional()\r\n        .describe(\r\n          'When true, the plan-approval dialog offers a \"clear context\" option. Defaults to false.',\r\n        ),\r\n      agent: z\r\n        .string()\r\n        .optional()\r\n        .describe(\r\n          'Name of an agent (built-in or custom) to use for the main thread. ' +\r\n            \"Applies the agent's system prompt, tool restrictions, and model.\",\r\n        ),\r\n      companyAnnouncements: z\r\n        .array(z.string())\r\n        .optional()\r\n        .describe(\r\n          'Company announcements to display at startup (one will be randomly selected if multiple are provided)',\r\n        ),\r\n      pluginConfigs: z\r\n        .record(\r\n          z.string(),\r\n          z.object({\r\n            mcpServers: z\r\n              .record(\r\n                z.string(),\r\n                z.record(\r\n                  z.string(),\r\n                  z.union([\r\n                    z.string(),\r\n                    z.number(),\r\n                    z.boolean(),\r\n                    z.array(z.string()),\r\n                  ]),\r\n                ),\r\n              )\r\n              .optional()\r\n              .describe(\r\n                'User configuration values for MCP servers keyed by server name',\r\n              ),\r\n            options: z\r\n              .record(\r\n                z.string(),\r\n                z.union([\r\n                  z.string(),\r\n                  z.number(),\r\n                  z.boolean(),\r\n                  z.array(z.string()),\r\n                ]),\r\n              )\r\n              .optional()\r\n              .describe(\r\n                'Non-sensitive option values from plugin manifest userConfig, keyed by option name. Sensitive values go to secure storage instead.',\r\n              ),\r\n          }),\r\n        )\r\n        .optional()\r\n        .describe(\r\n          'Per-plugin configuration including MCP server user configs, keyed by plugin ID (plugin@marketplace format)',\r\n        ),\r\n      remote: z\r\n        .object({\r\n          defaultEnvironmentId: z\r\n            .string()\r\n            .optional()\r\n            .describe('Default environment ID to use for remote sessions'),\r\n        })\r\n        .optional()\r\n        .describe('Remote session configuration'),\r\n      autoUpdatesChannel: z\r\n        .enum(['latest', 'stable'])\r\n        .optional()\r\n        .describe('Release channel for auto-updates (latest or stable)'),\r\n      ...(feature('LODESTONE')\r\n        ? {\r\n            disableDeepLinkRegistration: z\r\n              .enum(['disable'])\r\n              .optional()\r\n              .describe(\r\n                'Prevent claude-cli:// protocol handler registration with the OS',\r\n              ),\r\n          }\r\n        : {}),\r\n      minimumVersion: z\r\n        .string()\r\n        .optional()\r\n        .describe(\r\n          'Minimum version to stay on - prevents downgrades when switching to stable channel',\r\n        ),\r\n      plansDirectory: z\r\n        .string()\r\n        .optional()\r\n        .describe(\r\n          'Custom directory for plan files, relative to project root. ' +\r\n            'If not set, defaults to ~/.claude/plans/',\r\n        ),\r\n      ...(process.env.USER_TYPE === 'ant'\r\n        ? {\r\n            classifierPermissionsEnabled: z\r\n              .boolean()\r\n              .optional()\r\n              .describe(\r\n                'Enable AI-based classification for Bash(prompt:...) permission rules',\r\n              ),\r\n          }\r\n        : {}),\r\n      ...(feature('PROACTIVE') || feature('KAIROS')\r\n        ? {\r\n            minSleepDurationMs: z\r\n              .number()\r\n              .nonnegative()\r\n              .int()\r\n              .optional()\r\n              .describe(\r\n                'Minimum duration in milliseconds that the Sleep tool must sleep for. ' +\r\n                  'Useful for throttling proactive tick frequency.',\r\n              ),\r\n            maxSleepDurationMs: z\r\n              .number()\r\n              .int()\r\n              .min(-1)\r\n              .optional()\r\n              .describe(\r\n                'Maximum duration in milliseconds that the Sleep tool can sleep for. ' +\r\n                  'Set to -1 for indefinite sleep (waits for user input). ' +\r\n                  'Useful for limiting idle time in remote/managed environments.',\r\n              ),\r\n          }\r\n        : {}),\r\n      ...(feature('VOICE_MODE')\r\n        ? {\r\n            voiceEnabled: z\r\n              .boolean()\r\n              .optional()\r\n              .describe('Enable voice mode (hold-to-talk dictation)'),\r\n          }\r\n        : {}),\r\n      heyEnabled: z\r\n        .boolean()\r\n        .optional()\r\n        .describe(\r\n          'Enable hey mode (hold-Space conversation: speech-to-text + auto-submit + spoken replies)',\r\n        ),\r\n      heyVoiceProvider: z\r\n        .enum(['local', 'gemini'])\r\n        .optional()\r\n        .describe(\r\n          'Voice conversation backend for /hey. \"gemini\" uses the saved gemini_voice key; \"local\" uses local speech tools.',\r\n        ),\r\n      heyVoiceModel: z\r\n        .string()\r\n        .optional()\r\n        .describe(\r\n          'Gemini text-to-speech model used by /hey voice conversation replies.',\r\n        ),\r\n      heyVoiceName: z\r\n        .string()\r\n        .optional()\r\n        .describe(\r\n          'Gemini prebuilt voice name used by /hey voice conversation replies.',\r\n        ),\r\n      ...(feature('KAIROS')\r\n        ? {\r\n            assistant: z\r\n              .boolean()\r\n              .optional()\r\n              .describe(\r\n                'Start Claude in assistant mode (custom system prompt, brief view, scheduled check-in skills)',\r\n              ),\r\n            assistantName: z\r\n              .string()\r\n              .optional()\r\n              .describe(\r\n                'Display name for the assistant, shown in the claude.ai session list',\r\n              ),\r\n          }\r\n        : {}),\r\n      // Teams/Enterprise opt-IN for channel notifications. Default OFF.\r\n      // MCP servers that declare the claude/channel capability can push\r\n      // inbound messages into the conversation; for managed orgs this only\r\n      // works when explicitly enabled. Which servers can connect at all is\r\n      // still governed by allowedMcpServers/deniedMcpServers. Not\r\n      // feature-spread: KAIROS_CHANNELS is external:true, and the spread\r\n      // wrecks type inference for allowedChannelPlugins (the .passthrough()\r\n      // catch-all gives {} instead of the array type).\r\n      channelsEnabled: z\r\n        .boolean()\r\n        .optional()\r\n        .describe(\r\n          'Teams/Enterprise opt-in for channel notifications (MCP servers with the ' +\r\n            'claude/channel capability pushing inbound messages). Default off. ' +\r\n            'Set true to allow; users then select servers via --channels.',\r\n        ),\r\n      // Org-level channel plugin allowlist. When set, REPLACES the\r\n      // Anthropic ledger \u2014 admin owns the trust decision. Undefined means\r\n      // fall back to the ledger. Plugin-only entry shape (same as the\r\n      // ledger); server-kind entries still need the dev flag.\r\n      allowedChannelPlugins: z\r\n        .array(\r\n          z.object({\r\n            marketplace: z.string(),\r\n            plugin: z.string(),\r\n          }),\r\n        )\r\n        .optional()\r\n        .describe(\r\n          'Teams/Enterprise allowlist of channel plugins. When set, ' +\r\n            'replaces the default Anthropic allowlist \u2014 admins decide which ' +\r\n            'plugins may push inbound messages. Undefined falls back to the default. ' +\r\n            'Requires channelsEnabled: true.',\r\n        ),\r\n      ...(feature('KAIROS') || feature('KAIROS_BRIEF')\r\n        ? {\r\n            defaultView: z\r\n              .enum(['chat', 'transcript'])\r\n              .optional()\r\n              .describe(\r\n                'Default transcript view: chat (SendUserMessage checkpoints only) or transcript (full)',\r\n              ),\r\n          }\r\n        : {}),\r\n      prefersReducedMotion: z\r\n        .boolean()\r\n        .optional()\r\n        .describe(\r\n          'Reduce or disable animations for accessibility (spinner shimmer, flash effects, etc.)',\r\n        ),\r\n      autoMemoryEnabled: z\r\n        .boolean()\r\n        .optional()\r\n        .describe(\r\n          'Enable auto-memory for this project. When false, Claude will not read from or write to the auto-memory directory.',\r\n        ),\r\n      autoMemoryDirectory: z\r\n        .string()\r\n        .optional()\r\n        .describe(\r\n          'Custom directory path for auto-memory storage. Supports ~/ prefix for home directory expansion. Ignored if set in projectSettings (checked-in .claude/settings.json) for security. When unset, defaults to ~/.claude/projects/<sanitized-cwd>/memory/.',\r\n        ),\r\n      autoDreamEnabled: z\r\n        .boolean()\r\n        .optional()\r\n        .describe(\r\n          'Enable background memory consolidation (auto-dream). When set, overrides the server-side default.',\r\n        ),\r\n      selfLearningEnabled: z\r\n        .boolean()\r\n        .optional()\r\n        .describe(\r\n          'Master switch for the self-learning loop. When true, after sessions Tau captures durable, high-signal lessons to auto-memory and periodically consolidates and prunes them (auto-dream). Off by default; requires auto-memory. Implies auto-dream unless autoDreamEnabled is explicitly set.',\r\n        ),\r\n      showThinkingSummaries: z\r\n        .boolean()\r\n        .optional()\r\n        .describe(\r\n          'Show thinking summaries in the transcript view (ctrl+o). Default: false.',\r\n        ),\r\n      skipDangerousModePermissionPrompt: z\r\n        .boolean()\r\n        .optional()\r\n        .describe(\r\n          'Whether the user has accepted the bypass permissions mode dialog',\r\n        ),\r\n      ...(feature('TRANSCRIPT_CLASSIFIER')\r\n        ? {\r\n            skipAutoPermissionPrompt: z\r\n              .boolean()\r\n              .optional()\r\n              .describe(\r\n                'Whether the user has accepted the auto mode opt-in dialog',\r\n              ),\r\n            useAutoModeDuringPlan: z\r\n              .boolean()\r\n              .optional()\r\n              .describe(\r\n                'Whether plan mode uses auto mode semantics when auto mode is available (default: true)',\r\n              ),\r\n            autoMode: z\r\n              .object({\r\n                allow: z\r\n                  .array(z.string())\r\n                  .optional()\r\n                  .describe('Rules for the auto mode classifier allow section'),\r\n                soft_deny: z\r\n                  .array(z.string())\r\n                  .optional()\r\n                  .describe('Rules for the auto mode classifier deny section'),\r\n                ...(process.env.USER_TYPE === 'ant'\r\n                  ? {\r\n                      // Back-compat alias for ant users; external users use soft_deny\r\n                      deny: z.array(z.string()).optional(),\r\n                    }\r\n                  : {}),\r\n                environment: z\r\n                  .array(z.string())\r\n                  .optional()\r\n                  .describe(\r\n                    'Entries for the auto mode classifier environment section',\r\n                  ),\r\n              })\r\n              .optional()\r\n              .describe('Auto mode classifier prompt customization'),\r\n          }\r\n        : {}),\r\n      disableAutoMode: z\r\n        .enum(['disable'])\r\n        .optional()\r\n        .describe('Disable auto mode'),\r\n      sshConfigs: z\r\n        .array(\r\n          z.object({\r\n            id: z\r\n              .string()\r\n              .describe(\r\n                'Unique identifier for this SSH config. Used to match configs across settings sources.',\r\n              ),\r\n            name: z.string().describe('Display name for the SSH connection'),\r\n            sshHost: z\r\n              .string()\r\n              .describe(\r\n                'SSH host in format \"user@hostname\" or \"hostname\", or a host alias from ~/.ssh/config',\r\n              ),\r\n            sshPort: z\r\n              .number()\r\n              .int()\r\n              .optional()\r\n              .describe('SSH port (default: 22)'),\r\n            sshIdentityFile: z\r\n              .string()\r\n              .optional()\r\n              .describe('Path to SSH identity file (private key)'),\r\n            startDirectory: z\r\n              .string()\r\n              .optional()\r\n              .describe(\r\n                'Default working directory on the remote host. ' +\r\n                  'Supports tilde expansion (e.g. ~/projects). ' +\r\n                  'If not specified, defaults to the remote user home directory. ' +\r\n                  'Can be overridden by the [dir] positional argument in `claude ssh <config> [dir]`.',\r\n              ),\r\n          }),\r\n        )\r\n        .optional()\r\n        .describe(\r\n          'SSH connection configurations for remote environments. ' +\r\n            'Typically set in managed settings by enterprise administrators ' +\r\n            'to pre-configure SSH connections for team members.',\r\n        ),\r\n      claudeMdExcludes: z\r\n        .array(z.string())\r\n        .optional()\r\n        .describe(\r\n          'Glob patterns or absolute paths of CLAUDE.md files to exclude from loading. ' +\r\n            'Patterns are matched against absolute file paths using picomatch. ' +\r\n            'Only applies to User, Project, and Local memory types (Managed/policy files cannot be excluded). ' +\r\n            'Examples: \"/home/user/monorepo/CLAUDE.md\", \"**/code/CLAUDE.md\", \"**/some-dir/.claude/rules/**\"',\r\n        ),\r\n      pluginTrustMessage: z\r\n        .string()\r\n        .optional()\r\n        .describe(\r\n          'Custom message to append to the plugin trust warning shown before installation. ' +\r\n            'Only read from policy settings (managed-settings.json / MDM). ' +\r\n            'Useful for enterprise administrators to add organization-specific context ' +\r\n            '(e.g., \"All plugins from our internal marketplace are vetted and approved.\").',\r\n        ),\r\n    })\r\n    .passthrough(),\r\n)\r\n\r\n/**\r\n * Internal type for plugin hooks - includes plugin context for execution.\r\n * Not a Zod schema since it's not user-facing (plugins provide native hooks).\r\n */\r\nexport type PluginHookMatcher = {\r\n  matcher?: string\r\n  hooks: HookCommand[]\r\n  pluginRoot: string\r\n  pluginName: string\r\n  pluginId: string // format: \"pluginName@marketplaceName\"\r\n}\r\n\r\n/**\r\n * Internal type for skill hooks - includes skill context for execution.\r\n * Not a Zod schema since it's not user-facing (skills provide native hooks).\r\n */\r\nexport type SkillHookMatcher = {\r\n  matcher?: string\r\n  hooks: HookCommand[]\r\n  skillRoot: string\r\n  skillName: string\r\n}\r\n\r\nexport type AllowedMcpServerEntry = z.infer<\r\n  ReturnType<typeof AllowedMcpServerEntrySchema>\r\n>\r\nexport type DeniedMcpServerEntry = z.infer<\r\n  ReturnType<typeof DeniedMcpServerEntrySchema>\r\n>\r\nexport type SettingsJson = z.infer<ReturnType<typeof SettingsSchema>>\r\n\r\n/**\r\n * Type guard for MCP server entry with serverName\r\n */\r\nexport function isMcpServerNameEntry(\r\n  entry: AllowedMcpServerEntry | DeniedMcpServerEntry,\r\n): entry is { serverName: string } {\r\n  return 'serverName' in entry && entry.serverName !== undefined\r\n}\r\n\r\n/**\r\n * Type guard for MCP server entry with serverCommand\r\n */\r\nexport function isMcpServerCommandEntry(\r\n  entry: AllowedMcpServerEntry | DeniedMcpServerEntry,\r\n): entry is { serverCommand: string[] } {\r\n  return 'serverCommand' in entry && entry.serverCommand !== undefined\r\n}\r\n\r\n/**\r\n * Type guard for MCP server entry with serverUrl\r\n */\r\nexport function isMcpServerUrlEntry(\r\n  entry: AllowedMcpServerEntry | DeniedMcpServerEntry,\r\n): entry is { serverUrl: string } {\r\n  return 'serverUrl' in entry && entry.serverUrl !== undefined\r\n}\r\n\r\n/**\r\n * User configuration values for MCPB MCP servers\r\n */\r\nexport type UserConfigValues = Record<\r\n  string,\r\n  string | number | boolean | string[]\r\n>\r\n\r\n/**\r\n * Plugin configuration stored in settings.json\r\n */\r\nexport type PluginConfig = {\r\n  mcpServers?: {\r\n    [serverName: string]: UserConfigValues\r\n  }\r\n}\r\n", "import { toJSONSchema } from 'zod/v4'\nimport { jsonStringify } from '../slowOperations.js'\nimport { SettingsSchema } from './types.js'\n\nexport function generateSettingsJSONSchema(): string {\n  const jsonSchema = toJSONSchema(SettingsSchema(), { unrepresentable: 'any' })\n  return jsonStringify(jsonSchema, null, 2)\n}\n", "import type { ZodIssueCode } from 'zod/v4'\n\n// v4 ZodIssueCode is a value, not a type - use typeof to get the type\ntype ZodIssueCodeType = (typeof ZodIssueCode)[keyof typeof ZodIssueCode]\n\nexport type ValidationTip = {\n  suggestion?: string\n  docLink?: string\n}\n\nexport type TipContext = {\n  path: string\n  code: ZodIssueCodeType | string\n  expected?: string\n  received?: unknown\n  enumValues?: string[]\n  message?: string\n  value?: unknown\n}\n\ntype TipMatcher = {\n  matches: (context: TipContext) => boolean\n  tip: ValidationTip\n}\n\nconst DOCUMENTATION_BASE = 'https://code.claude.com/docs/en'\n\nconst TIP_MATCHERS: TipMatcher[] = [\n  {\n    matches: (ctx): boolean =>\n      ctx.path === 'permissions.defaultMode' && ctx.code === 'invalid_value',\n    tip: {\n      suggestion:\n        'Valid modes: \"acceptEdits\" (ask before file changes), \"plan\" (analysis only), \"bypassPermissions\" (auto-accept all), or \"default\" (standard behavior)',\n      docLink: `${DOCUMENTATION_BASE}/iam#permission-modes`,\n    },\n  },\n  {\n    matches: (ctx): boolean =>\n      ctx.path === 'apiKeyHelper' && ctx.code === 'invalid_type',\n    tip: {\n      suggestion:\n        'Provide a shell command that outputs your API key to stdout. The script should output only the API key. Example: \"/bin/generate_temp_api_key.sh\"',\n    },\n  },\n  {\n    matches: (ctx): boolean =>\n      ctx.path === 'cleanupPeriodDays' &&\n      ctx.code === 'too_small' &&\n      ctx.expected === '0',\n    tip: {\n      suggestion:\n        'Must be 0 or greater. Set a positive number for days to retain transcripts (default is 30). Setting 0 disables session persistence entirely: no transcripts are written and existing transcripts are deleted at startup.',\n    },\n  },\n  {\n    matches: (ctx): boolean =>\n      ctx.path.startsWith('env.') && ctx.code === 'invalid_type',\n    tip: {\n      suggestion:\n        'Environment variables must be strings. Wrap numbers and booleans in quotes. Example: \"DEBUG\": \"true\", \"PORT\": \"3000\"',\n      docLink: `${DOCUMENTATION_BASE}/settings#environment-variables`,\n    },\n  },\n  {\n    matches: (ctx): boolean =>\n      (ctx.path === 'permissions.allow' || ctx.path === 'permissions.deny') &&\n      ctx.code === 'invalid_type' &&\n      ctx.expected === 'array',\n    tip: {\n      suggestion:\n        'Permission rules must be in an array. Format: [\"Tool(specifier)\"]. Examples: [\"Bash(npm run build)\", \"Edit(docs/**)\", \"Read(~/.zshrc)\"]. Use * for wildcards.',\n    },\n  },\n  {\n    matches: (ctx): boolean =>\n      ctx.path.includes('hooks') && ctx.code === 'invalid_type',\n    tip: {\n      suggestion:\n        // gh-31187 / CC-282: prior example showed {\"matcher\": {\"tools\": [\"BashTool\"]}}\n        // \u2014 an object format that never existed in the schema (matcher is z.string(),\n        // always has been). Users copied the tip's example and got the same validation\n        // error again. See matchesPattern() in hooks.ts: matcher is exact-match,\n        // pipe-separated (\"Edit|Write\"), or regex. Empty/\"*\" matches all.\n        'Hooks use a matcher + hooks array. The matcher is a string: a tool name (\"Bash\"), pipe-separated list (\"Edit|Write\"), or empty to match all. Example: {\"PostToolUse\": [{\"matcher\": \"Edit|Write\", \"hooks\": [{\"type\": \"command\", \"command\": \"echo Done\"}]}]}',\n    },\n  },\n  {\n    matches: (ctx): boolean =>\n      ctx.code === 'invalid_type' && ctx.expected === 'boolean',\n    tip: {\n      suggestion:\n        'Use true or false without quotes. Example: \"includeCoAuthoredBy\": true',\n    },\n  },\n  {\n    matches: (ctx): boolean => ctx.code === 'unrecognized_keys',\n    tip: {\n      suggestion:\n        'Check for typos or refer to the documentation for valid fields',\n      docLink: `${DOCUMENTATION_BASE}/settings`,\n    },\n  },\n  {\n    matches: (ctx): boolean =>\n      ctx.code === 'invalid_value' && ctx.enumValues !== undefined,\n    tip: {\n      suggestion: undefined,\n    },\n  },\n  {\n    matches: (ctx): boolean =>\n      ctx.code === 'invalid_type' &&\n      ctx.expected === 'object' &&\n      ctx.received === null &&\n      ctx.path === '',\n    tip: {\n      suggestion:\n        'Check for missing commas, unmatched brackets, or trailing commas. Use a JSON validator to identify the exact syntax error.',\n    },\n  },\n  {\n    matches: (ctx): boolean =>\n      ctx.path === 'permissions.additionalDirectories' &&\n      ctx.code === 'invalid_type',\n    tip: {\n      suggestion:\n        'Must be an array of directory paths. Example: [\"~/projects\", \"/tmp/workspace\"]. You can also use --add-dir flag or /add-dir command',\n      docLink: `${DOCUMENTATION_BASE}/iam#working-directories`,\n    },\n  },\n]\n\nconst PATH_DOC_LINKS: Record<string, string> = {\n  permissions: `${DOCUMENTATION_BASE}/iam#configuring-permissions`,\n  env: `${DOCUMENTATION_BASE}/settings#environment-variables`,\n  hooks: `${DOCUMENTATION_BASE}/hooks`,\n}\n\nexport function getValidationTip(context: TipContext): ValidationTip | null {\n  const matcher = TIP_MATCHERS.find(m => m.matches(context))\n\n  if (!matcher) return null\n\n  const tip: ValidationTip = { ...matcher.tip }\n\n  if (\n    context.code === 'invalid_value' &&\n    context.enumValues &&\n    !tip.suggestion\n  ) {\n    tip.suggestion = `Valid values: ${context.enumValues.map(v => `\"${v}\"`).join(', ')}`\n  }\n\n  // Add documentation link based on path prefix\n  if (!tip.docLink && context.path) {\n    const pathPrefix = context.path.split('.')[0]\n    if (pathPrefix) {\n      tip.docLink = PATH_DOC_LINKS[pathPrefix]\n    }\n  }\n\n  return tip\n}\n", "import type { ConfigScope } from 'src/services/mcp/types.js'\nimport type { ZodError, ZodIssue } from 'zod/v4'\nimport { jsonParse } from '../slowOperations.js'\nimport { plural } from '../stringUtils.js'\nimport { validatePermissionRule } from './permissionValidation.js'\nimport { generateSettingsJSONSchema } from './schemaOutput.js'\nimport type { SettingsJson } from './types.js'\nimport { SettingsSchema } from './types.js'\nimport { getValidationTip } from './validationTips.js'\n\n/**\n * Helper type guards for specific Zod v4 issue types\n * In v4, issue types have different structures than v3\n */\nfunction isInvalidTypeIssue(issue: ZodIssue): issue is ZodIssue & {\n  code: 'invalid_type'\n  expected: string\n  input: unknown\n} {\n  return issue.code === 'invalid_type'\n}\n\nfunction isInvalidValueIssue(issue: ZodIssue): issue is ZodIssue & {\n  code: 'invalid_value'\n  values: unknown[]\n  input: unknown\n} {\n  return issue.code === 'invalid_value'\n}\n\nfunction isUnrecognizedKeysIssue(\n  issue: ZodIssue,\n): issue is ZodIssue & { code: 'unrecognized_keys'; keys: string[] } {\n  return issue.code === 'unrecognized_keys'\n}\n\nfunction isTooSmallIssue(issue: ZodIssue): issue is ZodIssue & {\n  code: 'too_small'\n  minimum: number | bigint\n  origin: string\n} {\n  return issue.code === 'too_small'\n}\n\n/** Field path in dot notation (e.g., \"permissions.defaultMode\", \"env.DEBUG\") */\nexport type FieldPath = string\n\nexport type ValidationError = {\n  /** Relative file path */\n  file?: string\n  /** Field path in dot notation */\n  path: FieldPath\n  /** Human-readable error message */\n  message: string\n  /** Expected value or type */\n  expected?: string\n  /** The actual invalid value that was provided */\n  invalidValue?: unknown\n  /** Suggestion for fixing the error */\n  suggestion?: string\n  /** Link to relevant documentation */\n  docLink?: string\n  /** MCP-specific metadata - only present for MCP configuration errors */\n  mcpErrorMetadata?: {\n    /** Which configuration scope this error came from */\n    scope: ConfigScope\n    /** The server name if error is specific to a server */\n    serverName?: string\n    /** Severity of the error */\n    severity?: 'fatal' | 'warning'\n  }\n}\n\nexport type SettingsWithErrors = {\n  settings: SettingsJson\n  errors: ValidationError[]\n}\n\n/**\n * Format a Zod validation error into human-readable validation errors\n */\n/**\n * Get the type string for an unknown value (for error messages)\n */\nfunction getReceivedType(value: unknown): string {\n  if (value === null) return 'null'\n  if (value === undefined) return 'undefined'\n  if (Array.isArray(value)) return 'array'\n  return typeof value\n}\n\nfunction extractReceivedFromMessage(msg: string): string | undefined {\n  const match = msg.match(/received (\\w+)/)\n  return match ? match[1] : undefined\n}\n\nexport function formatZodError(\n  error: ZodError,\n  filePath: string,\n): ValidationError[] {\n  return error.issues.map((issue): ValidationError => {\n    const path = issue.path.map(String).join('.')\n    let message = issue.message\n    let expected: string | undefined\n\n    let enumValues: string[] | undefined\n    let expectedValue: string | undefined\n    let receivedValue: unknown\n    let invalidValue: unknown\n\n    if (isInvalidValueIssue(issue)) {\n      enumValues = issue.values.map(v => String(v))\n      expectedValue = enumValues.join(' | ')\n      receivedValue = undefined\n      invalidValue = undefined\n    } else if (isInvalidTypeIssue(issue)) {\n      expectedValue = issue.expected\n      const receivedType = extractReceivedFromMessage(issue.message)\n      receivedValue = receivedType ?? getReceivedType(issue.input)\n      invalidValue = receivedType ?? getReceivedType(issue.input)\n    } else if (isTooSmallIssue(issue)) {\n      expectedValue = String(issue.minimum)\n    } else if (issue.code === 'custom' && 'params' in issue) {\n      const params = issue.params as { received?: unknown }\n      receivedValue = params.received\n      invalidValue = receivedValue\n    }\n\n    const tip = getValidationTip({\n      path,\n      code: issue.code,\n      expected: expectedValue,\n      received: receivedValue,\n      enumValues,\n      message: issue.message,\n      value: receivedValue,\n    })\n\n    if (isInvalidValueIssue(issue)) {\n      expected = enumValues?.map(v => `\"${v}\"`).join(', ')\n      message = `Invalid value. Expected one of: ${expected}`\n    } else if (isInvalidTypeIssue(issue)) {\n      const receivedType =\n        extractReceivedFromMessage(issue.message) ??\n        getReceivedType(issue.input)\n      if (\n        issue.expected === 'object' &&\n        receivedType === 'null' &&\n        path === ''\n      ) {\n        message = 'Invalid or malformed JSON'\n      } else {\n        message = `Expected ${issue.expected}, but received ${receivedType}`\n      }\n    } else if (isUnrecognizedKeysIssue(issue)) {\n      const keys = issue.keys.join(', ')\n      message = `Unrecognized ${plural(issue.keys.length, 'field')}: ${keys}`\n    } else if (isTooSmallIssue(issue)) {\n      message = `Number must be greater than or equal to ${issue.minimum}`\n      expected = String(issue.minimum)\n    }\n\n    return {\n      file: filePath,\n      path,\n      message,\n      expected,\n      invalidValue,\n      suggestion: tip?.suggestion,\n      docLink: tip?.docLink,\n    }\n  })\n}\n\n/**\n * Validates that settings file content conforms to the SettingsSchema.\n * This is used during file edits to ensure the resulting file is valid.\n */\nexport function validateSettingsFileContent(content: string):\n  | {\n      isValid: true\n    }\n  | {\n      isValid: false\n      error: string\n      fullSchema: string\n    } {\n  try {\n    // Parse the JSON first\n    const jsonData = jsonParse(content)\n\n    // Validate against SettingsSchema in strict mode\n    const result = SettingsSchema().strict().safeParse(jsonData)\n\n    if (result.success) {\n      return { isValid: true }\n    }\n\n    // Format the validation error in a helpful way\n    const errors = formatZodError(result.error, 'settings')\n    const errorMessage =\n      'Settings validation failed:\\n' +\n      errors.map(err => `- ${err.path}: ${err.message}`).join('\\n')\n\n    return {\n      isValid: false,\n      error: errorMessage,\n      fullSchema: generateSettingsJSONSchema(),\n    }\n  } catch (parseError) {\n    return {\n      isValid: false,\n      error: `Invalid JSON: ${parseError instanceof Error ? parseError.message : 'Unknown parsing error'}`,\n      fullSchema: generateSettingsJSONSchema(),\n    }\n  }\n}\n\n/**\n * Filters invalid permission rules from raw parsed JSON data before schema validation.\n * This prevents one bad rule from poisoning the entire settings file.\n * Returns warnings for each filtered rule.\n */\nexport function filterInvalidPermissionRules(\n  data: unknown,\n  filePath: string,\n): ValidationError[] {\n  if (!data || typeof data !== 'object') return []\n  const obj = data as Record<string, unknown>\n  if (!obj.permissions || typeof obj.permissions !== 'object') return []\n  const perms = obj.permissions as Record<string, unknown>\n\n  const warnings: ValidationError[] = []\n  for (const key of ['allow', 'deny', 'ask']) {\n    const rules = perms[key]\n    if (!Array.isArray(rules)) continue\n\n    perms[key] = rules.filter(rule => {\n      if (typeof rule !== 'string') {\n        warnings.push({\n          file: filePath,\n          path: `permissions.${key}`,\n          message: `Non-string value in ${key} array was removed`,\n          invalidValue: rule,\n        })\n        return false\n      }\n      const result = validatePermissionRule(rule)\n      if (!result.valid) {\n        let message = `Invalid permission rule \"${rule}\" was skipped`\n        if (result.error) message += `: ${result.error}`\n        if (result.suggestion) message += `. ${result.suggestion}`\n        warnings.push({\n          file: filePath,\n          path: `permissions.${key}`,\n          message,\n          invalidValue: rule,\n        })\n        return false\n      }\n      return true\n    })\n  }\n  return warnings\n}\n", "/**\n * Shared constants and path builders for MDM settings modules.\n *\n * This module has ZERO heavy imports (only `os`) \u2014 safe to use from mdmRawRead.ts.\n * Both mdmRawRead.ts and mdmSettings.ts import from here to avoid duplication.\n */\n\nimport { homedir, userInfo } from 'os'\nimport { join } from 'path'\n\n/** macOS preference domain for Tau MDM profiles. */\nexport const MACOS_PREFERENCE_DOMAIN = 'com.anthropic.claudecode'\n\n/**\n * Windows registry key paths for Tau MDM policies.\n *\n * These keys live under SOFTWARE\\Policies which is on the WOW64 shared key\n * list \u2014 both 32-bit and 64-bit processes see the same values without\n * redirection. Do not move these to SOFTWARE\\ClaudeCode, as SOFTWARE is\n * redirected and 32-bit processes would silently read from WOW6432Node.\n * See: https://learn.microsoft.com/en-us/windows/win32/winprog64/shared-registry-keys\n */\nexport const WINDOWS_REGISTRY_KEY_PATH_HKLM =\n  'HKLM\\\\SOFTWARE\\\\Policies\\\\ClaudeCode'\nexport const WINDOWS_REGISTRY_KEY_PATH_HKCU =\n  'HKCU\\\\SOFTWARE\\\\Policies\\\\ClaudeCode'\n\n/** Windows registry value name containing the JSON settings blob. */\nexport const WINDOWS_REGISTRY_VALUE_NAME = 'Settings'\n\n/** Path to macOS plutil binary. */\nexport const PLUTIL_PATH = '/usr/bin/plutil'\n\n/** Arguments for plutil to convert plist to JSON on stdout (append plist path). */\nexport const PLUTIL_ARGS_PREFIX = ['-convert', 'json', '-o', '-', '--'] as const\n\n/** Subprocess timeout in milliseconds. */\nexport const MDM_SUBPROCESS_TIMEOUT_MS = 5000\n\n/**\n * Build the list of macOS plist paths in priority order (highest first).\n * Evaluates `process.env.USER_TYPE` at call time so ant-only paths are\n * included only when appropriate.\n */\nexport function getMacOSPlistPaths(): Array<{ path: string; label: string }> {\n  let username = ''\n  try {\n    username = userInfo().username\n  } catch {\n    // ignore\n  }\n\n  const paths: Array<{ path: string; label: string }> = []\n\n  if (username) {\n    paths.push({\n      path: `/Library/Managed Preferences/${username}/${MACOS_PREFERENCE_DOMAIN}.plist`,\n      label: 'per-user managed preferences',\n    })\n  }\n\n  paths.push({\n    path: `/Library/Managed Preferences/${MACOS_PREFERENCE_DOMAIN}.plist`,\n    label: 'device-level managed preferences',\n  })\n\n  // Allow user-writable preferences for local MDM testing in ant builds only.\n  if (process.env.USER_TYPE === 'ant') {\n    paths.push({\n      path: join(\n        homedir(),\n        'Library',\n        'Preferences',\n        `${MACOS_PREFERENCE_DOMAIN}.plist`,\n      ),\n      label: 'user preferences (ant-only)',\n    })\n  }\n\n  return paths\n}\n", "/**\n * Minimal module for firing MDM subprocess reads without blocking the event loop.\n * Has minimal imports \u2014 only child_process, fs, and mdmConstants (which only imports os).\n *\n * Two usage patterns:\n * 1. Startup: startMdmRawRead() fires at main.tsx module evaluation, results consumed later via getMdmRawReadPromise()\n * 2. Poll/fallback: fireRawRead() creates a fresh read on demand (used by changeDetector and SDK entrypoint)\n *\n * Raw stdout is consumed by mdmSettings.ts via consumeRawReadResult().\n */\n\nimport { execFile } from 'child_process'\nimport { existsSync } from 'fs'\nimport {\n  getMacOSPlistPaths,\n  MDM_SUBPROCESS_TIMEOUT_MS,\n  PLUTIL_ARGS_PREFIX,\n  PLUTIL_PATH,\n  WINDOWS_REGISTRY_KEY_PATH_HKCU,\n  WINDOWS_REGISTRY_KEY_PATH_HKLM,\n  WINDOWS_REGISTRY_VALUE_NAME,\n} from './constants.js'\n\nexport type RawReadResult = {\n  plistStdouts: Array<{ stdout: string; label: string }> | null\n  hklmStdout: string | null\n  hkcuStdout: string | null\n}\n\nlet rawReadPromise: Promise<RawReadResult> | null = null\n\nfunction execFilePromise(\n  cmd: string,\n  args: string[],\n): Promise<{ stdout: string; code: number | null }> {\n  return new Promise(resolve => {\n    try {\n      execFile(\n        cmd,\n        args,\n        { encoding: 'utf-8', timeout: MDM_SUBPROCESS_TIMEOUT_MS },\n        (err, stdout) => {\n          // biome-ignore lint/nursery/noFloatingPromises: resolve() is not a floating promise\n          resolve({ stdout: stdout ?? '', code: err ? 1 : 0 })\n        },\n      )\n    } catch {\n      // Some restricted environments can synchronously throw from spawn.\n      // Treat as \"no MDM data\" so startup continues.\n      // biome-ignore lint/nursery/noFloatingPromises: resolve() is not a floating promise\n      resolve({ stdout: '', code: 1 })\n    }\n  })\n}\n\n/**\n * Fire fresh subprocess reads for MDM settings and return raw stdout.\n * On macOS: spawns plutil for each plist path in parallel, picks first winner.\n * On Windows: spawns reg query for HKLM and HKCU in parallel.\n * On Linux: returns empty (no MDM equivalent).\n */\nexport function fireRawRead(): Promise<RawReadResult> {\n  return (async (): Promise<RawReadResult> => {\n    if (process.platform === 'darwin') {\n      const plistPaths = getMacOSPlistPaths()\n\n      const allResults = await Promise.all(\n        plistPaths.map(async ({ path, label }) => {\n          // Fast-path: skip the plutil subprocess if the plist file does not\n          // exist. Spawning plutil takes ~5ms even for an immediate ENOENT,\n          // and non-MDM machines never have these files.\n          // Uses synchronous existsSync to preserve the spawn-during-imports\n          // invariant: execFilePromise must be the first await so plutil\n          // spawns before the event loop polls (see main.tsx:3-4).\n          if (!existsSync(path)) {\n            return { stdout: '', label, ok: false }\n          }\n          const { stdout, code } = await execFilePromise(PLUTIL_PATH, [\n            ...PLUTIL_ARGS_PREFIX,\n            path,\n          ])\n          return { stdout, label, ok: code === 0 && !!stdout }\n        }),\n      )\n\n      // First source wins (array is in priority order)\n      const winner = allResults.find(r => r.ok)\n      return {\n        plistStdouts: winner\n          ? [{ stdout: winner.stdout, label: winner.label }]\n          : [],\n        hklmStdout: null,\n        hkcuStdout: null,\n      }\n    }\n\n    if (process.platform === 'win32') {\n      const [hklm, hkcu] = await Promise.all([\n        execFilePromise('reg', [\n          'query',\n          WINDOWS_REGISTRY_KEY_PATH_HKLM,\n          '/v',\n          WINDOWS_REGISTRY_VALUE_NAME,\n        ]),\n        execFilePromise('reg', [\n          'query',\n          WINDOWS_REGISTRY_KEY_PATH_HKCU,\n          '/v',\n          WINDOWS_REGISTRY_VALUE_NAME,\n        ]),\n      ])\n      return {\n        plistStdouts: null,\n        hklmStdout: hklm.code === 0 ? hklm.stdout : null,\n        hkcuStdout: hkcu.code === 0 ? hkcu.stdout : null,\n      }\n    }\n\n    return { plistStdouts: null, hklmStdout: null, hkcuStdout: null }\n  })()\n}\n\n/**\n * Fire raw subprocess reads once for startup. Called at main.tsx module evaluation.\n * Results are consumed via getMdmRawReadPromise().\n */\nexport function startMdmRawRead(): void {\n  if (rawReadPromise) return\n  rawReadPromise = fireRawRead()\n}\n\n/**\n * Get the startup promise. Returns null if startMdmRawRead() wasn't called.\n */\nexport function getMdmRawReadPromise(): Promise<RawReadResult> | null {\n  return rawReadPromise\n}\n", "/**\n * MDM (Mobile Device Management) profile enforcement for Tau managed settings.\n *\n * Reads enterprise settings from OS-level MDM configuration:\n * - macOS: `com.anthropic.claudecode` preference domain\n *   (MDM profiles at /Library/Managed Preferences/ only \u2014 not user-writable ~/Library/Preferences/)\n * - Windows: `HKLM\\SOFTWARE\\Policies\\ClaudeCode` (admin-only)\n *   and `HKCU\\SOFTWARE\\Policies\\ClaudeCode` (user-writable, lowest priority)\n * - Linux: No MDM equivalent (uses /etc/claude-code/managed-settings.json instead)\n *\n * Policy settings use \"first source wins\" \u2014 the highest-priority source that exists\n * provides all policy settings. Priority (highest to lowest):\n *   remote \u2192 HKLM/plist \u2192 managed-settings.json \u2192 HKCU\n *\n * Architecture:\n *   constants.ts \u2014 shared constants and plist path builder (zero heavy imports)\n *   rawRead.ts   \u2014 subprocess I/O only (zero heavy imports, fires at main.tsx evaluation)\n *   settings.ts  \u2014 parsing, caching, first-source-wins logic (this file)\n */\n\nimport { join } from 'path'\nimport { logForDebugging } from '../../debug.js'\nimport { logForDiagnosticsNoPII } from '../../diagLogs.js'\nimport { readFileSync } from '../../fileRead.js'\nimport { getFsImplementation } from '../../fsOperations.js'\nimport { safeParseJSON } from '../../json.js'\nimport { profileCheckpoint } from '../../startupProfiler.js'\nimport {\n  getManagedFilePath,\n  getManagedSettingsDropInDir,\n} from '../managedPath.js'\nimport { type SettingsJson, SettingsSchema } from '../types.js'\nimport {\n  filterInvalidPermissionRules,\n  formatZodError,\n  type ValidationError,\n} from '../validation.js'\nimport {\n  WINDOWS_REGISTRY_KEY_PATH_HKCU,\n  WINDOWS_REGISTRY_KEY_PATH_HKLM,\n  WINDOWS_REGISTRY_VALUE_NAME,\n} from './constants.js'\nimport {\n  fireRawRead,\n  getMdmRawReadPromise,\n  type RawReadResult,\n} from './rawRead.js'\n\n// ---------------------------------------------------------------------------\n// Types and cache\n// ---------------------------------------------------------------------------\n\ntype MdmResult = { settings: SettingsJson; errors: ValidationError[] }\nconst EMPTY_RESULT: MdmResult = Object.freeze({ settings: {}, errors: [] })\nlet mdmCache: MdmResult | null = null\nlet hkcuCache: MdmResult | null = null\nlet mdmLoadPromise: Promise<void> | null = null\n\n// ---------------------------------------------------------------------------\n// Startup load \u2014 fires early, awaited before first settings read\n// ---------------------------------------------------------------------------\n\n/**\n * Kick off async MDM/HKCU reads. Call this as early as possible in\n * startup so the subprocess runs in parallel with module loading.\n */\nexport function startMdmSettingsLoad(): void {\n  if (mdmLoadPromise) return\n  mdmLoadPromise = (async () => {\n    profileCheckpoint('mdm_load_start')\n    const startTime = Date.now()\n\n    // Use the startup raw read if cli.tsx fired it, otherwise fire a fresh one.\n    // Both paths produce the same RawReadResult; consumeRawReadResult parses it.\n    const rawPromise = getMdmRawReadPromise() ?? fireRawRead()\n    const { mdm, hkcu } = consumeRawReadResult(await rawPromise)\n    mdmCache = mdm\n    hkcuCache = hkcu\n    profileCheckpoint('mdm_load_end')\n\n    const duration = Date.now() - startTime\n    logForDebugging(`MDM settings load completed in ${duration}ms`)\n    if (Object.keys(mdm.settings).length > 0) {\n      logForDebugging(\n        `MDM settings found: ${Object.keys(mdm.settings).join(', ')}`,\n      )\n      try {\n        logForDiagnosticsNoPII('info', 'mdm_settings_loaded', {\n          duration_ms: duration,\n          key_count: Object.keys(mdm.settings).length,\n          error_count: mdm.errors.length,\n        })\n      } catch {\n        // Diagnostic logging is best-effort\n      }\n    }\n  })()\n}\n\n/**\n * Await the in-flight MDM load. Call this before the first settings read.\n * If startMdmSettingsLoad() was called early enough, this resolves immediately.\n */\nexport async function ensureMdmSettingsLoaded(): Promise<void> {\n  if (!mdmLoadPromise) {\n    startMdmSettingsLoad()\n  }\n  await mdmLoadPromise\n}\n\n// ---------------------------------------------------------------------------\n// Sync cache readers \u2014 used by the settings pipeline (loadSettingsFromDisk)\n// ---------------------------------------------------------------------------\n\n/**\n * Read admin-controlled MDM settings from the session cache.\n *\n * Returns settings from admin-only sources:\n * - macOS: /Library/Managed Preferences/ (requires root)\n * - Windows: HKLM registry (requires admin)\n *\n * Does NOT include HKCU (user-writable) \u2014 use getHkcuSettings() for that.\n */\nexport function getMdmSettings(): MdmResult {\n  return mdmCache ?? EMPTY_RESULT\n}\n\n/**\n * Read HKCU registry settings (user-writable, lowest policy priority).\n * Only relevant on Windows \u2014 returns empty on other platforms.\n */\nexport function getHkcuSettings(): MdmResult {\n  return hkcuCache ?? EMPTY_RESULT\n}\n\n// ---------------------------------------------------------------------------\n// Cache management\n// ---------------------------------------------------------------------------\n\n/**\n * Clear the MDM and HKCU settings caches, forcing a fresh read on next load.\n */\nexport function clearMdmSettingsCache(): void {\n  mdmCache = null\n  hkcuCache = null\n  mdmLoadPromise = null\n}\n\n/**\n * Update the session caches directly. Used by the change detector poll.\n */\nexport function setMdmSettingsCache(mdm: MdmResult, hkcu: MdmResult): void {\n  mdmCache = mdm\n  hkcuCache = hkcu\n}\n\n// ---------------------------------------------------------------------------\n// Refresh \u2014 fires a fresh raw read, parses, returns results.\n// Used by the 30-minute poll in changeDetector.ts.\n// ---------------------------------------------------------------------------\n\n/**\n * Fire a fresh MDM subprocess read and parse the results.\n * Does NOT update the cache \u2014 caller decides whether to apply.\n */\nexport async function refreshMdmSettings(): Promise<{\n  mdm: MdmResult\n  hkcu: MdmResult\n}> {\n  const raw = await fireRawRead()\n  return consumeRawReadResult(raw)\n}\n\n// ---------------------------------------------------------------------------\n// Parsing \u2014 converts raw subprocess output to validated MdmResult\n// ---------------------------------------------------------------------------\n\n/**\n * Parse JSON command output (plutil stdout or registry JSON value) into SettingsJson.\n * Filters invalid permission rules before schema validation so one bad rule\n * doesn't cause the entire MDM settings to be rejected.\n */\nexport function parseCommandOutputAsSettings(\n  stdout: string,\n  sourcePath: string,\n): { settings: SettingsJson; errors: ValidationError[] } {\n  const data = safeParseJSON(stdout, false)\n  if (!data || typeof data !== 'object') {\n    return { settings: {}, errors: [] }\n  }\n\n  const ruleWarnings = filterInvalidPermissionRules(data, sourcePath)\n  const parseResult = SettingsSchema().safeParse(data)\n  if (!parseResult.success) {\n    const errors = formatZodError(parseResult.error, sourcePath)\n    return { settings: {}, errors: [...ruleWarnings, ...errors] }\n  }\n  return { settings: parseResult.data, errors: ruleWarnings }\n}\n\n/**\n * Parse reg query stdout to extract a registry string value.\n * Matches both REG_SZ and REG_EXPAND_SZ, case-insensitive.\n *\n * Expected format:\n *     Settings    REG_SZ    {\"json\":\"value\"}\n */\nexport function parseRegQueryStdout(\n  stdout: string,\n  valueName = 'Settings',\n): string | null {\n  const lines = stdout.split(/\\r?\\n/)\n  const escaped = valueName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n  const re = new RegExp(`^\\\\s+${escaped}\\\\s+REG_(?:EXPAND_)?SZ\\\\s+(.*)$`, 'i')\n  for (const line of lines) {\n    const match = line.match(re)\n    if (match && match[1]) {\n      return match[1].trimEnd()\n    }\n  }\n  return null\n}\n\n/**\n * Convert raw subprocess output into parsed MDM and HKCU results,\n * applying the first-source-wins policy.\n */\nfunction consumeRawReadResult(raw: RawReadResult): {\n  mdm: MdmResult\n  hkcu: MdmResult\n} {\n  // macOS: plist result (first source wins \u2014 already filtered in mdmRawRead)\n  if (raw.plistStdouts && raw.plistStdouts.length > 0) {\n    const { stdout, label } = raw.plistStdouts[0]!\n    const result = parseCommandOutputAsSettings(stdout, label)\n    if (Object.keys(result.settings).length > 0) {\n      return { mdm: result, hkcu: EMPTY_RESULT }\n    }\n  }\n\n  // Windows: HKLM result\n  if (raw.hklmStdout) {\n    const jsonString = parseRegQueryStdout(raw.hklmStdout)\n    if (jsonString) {\n      const result = parseCommandOutputAsSettings(\n        jsonString,\n        `Registry: ${WINDOWS_REGISTRY_KEY_PATH_HKLM}\\\\${WINDOWS_REGISTRY_VALUE_NAME}`,\n      )\n      if (Object.keys(result.settings).length > 0) {\n        return { mdm: result, hkcu: EMPTY_RESULT }\n      }\n    }\n  }\n\n  // No admin MDM \u2014 check managed-settings.json before using HKCU\n  if (hasManagedSettingsFile()) {\n    return { mdm: EMPTY_RESULT, hkcu: EMPTY_RESULT }\n  }\n\n  // Fall through to HKCU (already read in parallel)\n  if (raw.hkcuStdout) {\n    const jsonString = parseRegQueryStdout(raw.hkcuStdout)\n    if (jsonString) {\n      const result = parseCommandOutputAsSettings(\n        jsonString,\n        `Registry: ${WINDOWS_REGISTRY_KEY_PATH_HKCU}\\\\${WINDOWS_REGISTRY_VALUE_NAME}`,\n      )\n      return { mdm: EMPTY_RESULT, hkcu: result }\n    }\n  }\n\n  return { mdm: EMPTY_RESULT, hkcu: EMPTY_RESULT }\n}\n\n/**\n * Check if file-based managed settings (managed-settings.json or any\n * managed-settings.d/*.json) exist and have content. Cheap sync check\n * used to skip HKCU when a higher-priority file-based source exists.\n */\nfunction hasManagedSettingsFile(): boolean {\n  try {\n    const filePath = join(getManagedFilePath(), 'managed-settings.json')\n    const content = readFileSync(filePath)\n    const data = safeParseJSON(content, false)\n    if (data && typeof data === 'object' && Object.keys(data).length > 0) {\n      return true\n    }\n  } catch {\n    // fall through to drop-in check\n  }\n  try {\n    const dropInDir = getManagedSettingsDropInDir()\n    const entries = getFsImplementation().readdirSync(dropInDir)\n    for (const d of entries) {\n      if (\n        !(d.isFile() || d.isSymbolicLink()) ||\n        !d.name.endsWith('.json') ||\n        d.name.startsWith('.')\n      ) {\n        continue\n      }\n      try {\n        const content = readFileSync(join(dropInDir, d.name))\n        const data = safeParseJSON(content, false)\n        if (data && typeof data === 'object' && Object.keys(data).length > 0) {\n          return true\n        }\n      } catch {\n        // skip unreadable/malformed file\n      }\n    }\n  } catch {\n    // drop-in dir doesn't exist\n  }\n  return false\n}\n", "import { feature } from 'bun:bundle'\nimport mergeWith from 'lodash-es/mergeWith.js'\nimport { dirname, join, resolve } from 'path'\nimport { z } from 'zod/v4'\nimport {\n  getFlagSettingsInline,\n  getFlagSettingsPath,\n  getOriginalCwd,\n  getUseCoworkPlugins,\n} from '../../bootstrap/state.js'\nimport { getRemoteManagedSettingsSyncFromCache } from '../../services/remoteManagedSettings/syncCacheState.js'\nimport { uniq } from '../array.js'\nimport { logForDebugging } from '../debug.js'\nimport { logForDiagnosticsNoPII } from '../diagLogs.js'\nimport { getClaudeConfigHomeDir, isEnvTruthy } from '../envUtils.js'\nimport { getErrnoCode, isENOENT } from '../errors.js'\nimport { writeFileSyncAndFlush_DEPRECATED } from '../file.js'\nimport { readFileSync } from '../fileRead.js'\nimport { getFsImplementation, safeResolvePath } from '../fsOperations.js'\nimport { addFileGlobRuleToGitignore } from '../git/gitignore.js'\nimport { safeParseJSON } from '../json.js'\nimport { logError } from '../log.js'\nimport { getPlatform } from '../platform.js'\nimport { clone, jsonStringify } from '../slowOperations.js'\nimport { profileCheckpoint } from '../startupProfiler.js'\nimport {\n  type EditableSettingSource,\n  getEnabledSettingSources,\n  type SettingSource,\n} from './constants.js'\nimport { markInternalWrite } from './internalWrites.js'\nimport {\n  getManagedFilePath,\n  getManagedSettingsDropInDir,\n} from './managedPath.js'\nimport { getHkcuSettings, getMdmSettings } from './mdm/settings.js'\nimport {\n  getCachedParsedFile,\n  getCachedSettingsForSource,\n  getPluginSettingsBase,\n  getSessionSettingsCache,\n  resetSettingsCache,\n  setCachedParsedFile,\n  setCachedSettingsForSource,\n  setSessionSettingsCache,\n} from './settingsCache.js'\nimport { type SettingsJson, SettingsSchema } from './types.js'\nimport {\n  filterInvalidPermissionRules,\n  formatZodError,\n  type SettingsWithErrors,\n  type ValidationError,\n} from './validation.js'\n\n/**\n * Get the path to the managed settings file based on the current platform\n */\nfunction getManagedSettingsFilePath(): string {\n  return join(getManagedFilePath(), 'managed-settings.json')\n}\n\n/**\n * Load file-based managed settings: managed-settings.json + managed-settings.d/*.json.\n *\n * managed-settings.json is merged first (lowest precedence / base), then drop-in\n * files are sorted alphabetically and merged on top (higher precedence, later\n * files win). This matches the systemd/sudoers drop-in convention: the base\n * file provides defaults, drop-ins customize. Separate teams can ship\n * independent policy fragments (e.g. 10-otel.json, 20-security.json) without\n * coordinating edits to a single admin-owned file.\n *\n * Exported for testing.\n */\nexport function loadManagedFileSettings(): {\n  settings: SettingsJson | null\n  errors: ValidationError[]\n} {\n  const errors: ValidationError[] = []\n  let merged: SettingsJson = {}\n  let found = false\n\n  const { settings, errors: baseErrors } = parseSettingsFile(\n    getManagedSettingsFilePath(),\n  )\n  errors.push(...baseErrors)\n  if (settings && Object.keys(settings).length > 0) {\n    merged = mergeWith(merged, settings, settingsMergeCustomizer)\n    found = true\n  }\n\n  const dropInDir = getManagedSettingsDropInDir()\n  try {\n    const entries = getFsImplementation()\n      .readdirSync(dropInDir)\n      .filter(\n        d =>\n          (d.isFile() || d.isSymbolicLink()) &&\n          d.name.endsWith('.json') &&\n          !d.name.startsWith('.'),\n      )\n      .map(d => d.name)\n      .sort()\n    for (const name of entries) {\n      const { settings, errors: fileErrors } = parseSettingsFile(\n        join(dropInDir, name),\n      )\n      errors.push(...fileErrors)\n      if (settings && Object.keys(settings).length > 0) {\n        merged = mergeWith(merged, settings, settingsMergeCustomizer)\n        found = true\n      }\n    }\n  } catch (e) {\n    const code = getErrnoCode(e)\n    if (code !== 'ENOENT' && code !== 'ENOTDIR') {\n      logError(e)\n    }\n  }\n\n  return { settings: found ? merged : null, errors }\n}\n\n/**\n * Check which file-based managed settings sources are present.\n * Used by /status to show \"(file)\", \"(drop-ins)\", or \"(file + drop-ins)\".\n */\nexport function getManagedFileSettingsPresence(): {\n  hasBase: boolean\n  hasDropIns: boolean\n} {\n  const { settings: base } = parseSettingsFile(getManagedSettingsFilePath())\n  const hasBase = !!base && Object.keys(base).length > 0\n\n  let hasDropIns = false\n  const dropInDir = getManagedSettingsDropInDir()\n  try {\n    hasDropIns = getFsImplementation()\n      .readdirSync(dropInDir)\n      .some(\n        d =>\n          (d.isFile() || d.isSymbolicLink()) &&\n          d.name.endsWith('.json') &&\n          !d.name.startsWith('.'),\n      )\n  } catch {\n    // dir doesn't exist\n  }\n\n  return { hasBase, hasDropIns }\n}\n\n/**\n * Handles file system errors appropriately\n * @param error The error to handle\n * @param path The file path that caused the error\n */\nfunction handleFileSystemError(error: unknown, path: string): void {\n  if (\n    typeof error === 'object' &&\n    error &&\n    'code' in error &&\n    error.code === 'ENOENT'\n  ) {\n    logForDebugging(\n      `Broken symlink or missing file encountered for settings.json at path: ${path}`,\n    )\n  } else {\n    logError(error)\n  }\n}\n\n/**\n * Parses a settings file into a structured format\n * @param path The path to the permissions file\n * @param source The source of the settings (optional, for error reporting)\n * @returns Parsed settings data and validation errors\n */\nexport function parseSettingsFile(path: string): {\n  settings: SettingsJson | null\n  errors: ValidationError[]\n} {\n  const cached = getCachedParsedFile(path)\n  if (cached) {\n    // Clone so callers (e.g. mergeWith in getSettingsForSourceUncached,\n    // updateSettingsForSource) can't mutate the cached entry.\n    return {\n      settings: cached.settings ? clone(cached.settings) : null,\n      errors: cached.errors,\n    }\n  }\n  const result = parseSettingsFileUncached(path)\n  setCachedParsedFile(path, result)\n  // Clone the first return too \u2014 the caller may mutate before\n  // another caller reads the same cache entry.\n  return {\n    settings: result.settings ? clone(result.settings) : null,\n    errors: result.errors,\n  }\n}\n\nfunction parseSettingsFileUncached(path: string): {\n  settings: SettingsJson | null\n  errors: ValidationError[]\n} {\n  try {\n    const { resolvedPath } = safeResolvePath(getFsImplementation(), path)\n    const content = readFileSync(resolvedPath)\n\n    if (content.trim() === '') {\n      return { settings: {}, errors: [] }\n    }\n\n    const data = safeParseJSON(content, false)\n\n    // Filter invalid permission rules before schema validation so one bad\n    // rule doesn't cause the entire settings file to be rejected.\n    const ruleWarnings = filterInvalidPermissionRules(data, path)\n\n    const result = SettingsSchema().safeParse(data)\n\n    if (!result.success) {\n      const errors = formatZodError(result.error, path)\n      return { settings: null, errors: [...ruleWarnings, ...errors] }\n    }\n\n    return { settings: result.data, errors: ruleWarnings }\n  } catch (error) {\n    handleFileSystemError(error, path)\n    return { settings: null, errors: [] }\n  }\n}\n\n/**\n * Get the absolute path to the associated file root for a given settings source\n * (e.g. for $PROJ_DIR/.claude/settings.json, returns $PROJ_DIR)\n * @param source The source of the settings\n * @returns The root path of the settings file\n */\nexport function getSettingsRootPathForSource(source: SettingSource): string {\n  switch (source) {\n    case 'userSettings':\n      return resolve(getClaudeConfigHomeDir())\n    case 'policySettings':\n    case 'projectSettings':\n    case 'localSettings': {\n      return resolve(getOriginalCwd())\n    }\n    case 'flagSettings': {\n      const path = getFlagSettingsPath()\n      return path ? dirname(resolve(path)) : resolve(getOriginalCwd())\n    }\n  }\n}\n\n/**\n * Get the user settings filename based on cowork mode.\n * Returns 'cowork_settings.json' when in cowork mode, 'settings.json' otherwise.\n *\n * Priority:\n * 1. Session state (set by CLI flag --cowork)\n * 2. Environment variable CLAUDE_CODE_USE_COWORK_PLUGINS\n * 3. Default: 'settings.json'\n */\nfunction getUserSettingsFilePath(): string {\n  if (\n    getUseCoworkPlugins() ||\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_COWORK_PLUGINS)\n  ) {\n    return 'cowork_settings.json'\n  }\n  return 'settings.json'\n}\n\nexport function getSettingsFilePathForSource(\n  source: SettingSource,\n): string | undefined {\n  switch (source) {\n    case 'userSettings':\n      return join(\n        getSettingsRootPathForSource(source),\n        getUserSettingsFilePath(),\n      )\n    case 'projectSettings':\n    case 'localSettings': {\n      return join(\n        getSettingsRootPathForSource(source),\n        getRelativeSettingsFilePathForSource(source),\n      )\n    }\n    case 'policySettings':\n      return getManagedSettingsFilePath()\n    case 'flagSettings': {\n      return getFlagSettingsPath()\n    }\n  }\n}\n\nexport function getRelativeSettingsFilePathForSource(\n  source: 'projectSettings' | 'localSettings',\n): string {\n  switch (source) {\n    case 'projectSettings':\n      return join('.claude', 'settings.json')\n    case 'localSettings':\n      return join('.claude', 'settings.local.json')\n  }\n}\n\nexport function getSettingsForSource(\n  source: SettingSource,\n): SettingsJson | null {\n  const cached = getCachedSettingsForSource(source)\n  if (cached !== undefined) return cached\n  const result = getSettingsForSourceUncached(source)\n  setCachedSettingsForSource(source, result)\n  return result\n}\n\nfunction getSettingsForSourceUncached(\n  source: SettingSource,\n): SettingsJson | null {\n  // For policySettings: first source wins (remote > HKLM/plist > file > HKCU)\n  if (source === 'policySettings') {\n    const remoteSettings = getRemoteManagedSettingsSyncFromCache()\n    if (remoteSettings && Object.keys(remoteSettings).length > 0) {\n      return remoteSettings\n    }\n\n    const mdmResult = getMdmSettings()\n    if (Object.keys(mdmResult.settings).length > 0) {\n      return mdmResult.settings\n    }\n\n    const { settings: fileSettings } = loadManagedFileSettings()\n    if (fileSettings) {\n      return fileSettings\n    }\n\n    const hkcu = getHkcuSettings()\n    if (Object.keys(hkcu.settings).length > 0) {\n      return hkcu.settings\n    }\n\n    return null\n  }\n\n  const settingsFilePath = getSettingsFilePathForSource(source)\n  const { settings: fileSettings } = settingsFilePath\n    ? parseSettingsFile(settingsFilePath)\n    : { settings: null }\n\n  // For flagSettings, merge in any inline settings set via the SDK\n  if (source === 'flagSettings') {\n    const inlineSettings = getFlagSettingsInline()\n    if (inlineSettings) {\n      const parsed = SettingsSchema().safeParse(inlineSettings)\n      if (parsed.success) {\n        return mergeWith(\n          fileSettings || {},\n          parsed.data,\n          settingsMergeCustomizer,\n        ) as SettingsJson\n      }\n    }\n  }\n\n  return fileSettings\n}\n\n/**\n * Get the origin of the highest-priority active policy settings source.\n * Uses \"first source wins\" \u2014 returns the first source that has content.\n * Priority: remote > plist/hklm > file (managed-settings.json) > hkcu\n */\nexport function getPolicySettingsOrigin():\n  | 'remote'\n  | 'plist'\n  | 'hklm'\n  | 'file'\n  | 'hkcu'\n  | null {\n  // 1. Remote (highest)\n  const remoteSettings = getRemoteManagedSettingsSyncFromCache()\n  if (remoteSettings && Object.keys(remoteSettings).length > 0) {\n    return 'remote'\n  }\n\n  // 2. Admin-only MDM (HKLM / macOS plist)\n  const mdmResult = getMdmSettings()\n  if (Object.keys(mdmResult.settings).length > 0) {\n    return getPlatform() === 'macos' ? 'plist' : 'hklm'\n  }\n\n  // 3. managed-settings.json + managed-settings.d/ (file-based, requires admin)\n  const { settings: fileSettings } = loadManagedFileSettings()\n  if (fileSettings) {\n    return 'file'\n  }\n\n  // 4. HKCU (lowest \u2014 user-writable)\n  const hkcu = getHkcuSettings()\n  if (Object.keys(hkcu.settings).length > 0) {\n    return 'hkcu'\n  }\n\n  return null\n}\n\n/**\n * Merges `settings` into the existing settings for `source` using lodash mergeWith.\n *\n * To delete a key from a record field (e.g. enabledPlugins, extraKnownMarketplaces),\n * set it to `undefined` \u2014 do NOT use `delete`. mergeWith only detects deletion when\n * the key is present with an explicit `undefined` value.\n */\nexport function updateSettingsForSource(\n  source: EditableSettingSource,\n  settings: SettingsJson,\n): { error: Error | null } {\n  if (\n    (source as unknown) === 'policySettings' ||\n    (source as unknown) === 'flagSettings'\n  ) {\n    return { error: null }\n  }\n\n  // Create the folder if needed\n  const filePath = getSettingsFilePathForSource(source)\n  if (!filePath) {\n    return { error: null }\n  }\n\n  try {\n    getFsImplementation().mkdirSync(dirname(filePath))\n\n    // Try to get existing settings with validation. Bypass the per-source\n    // cache \u2014 mergeWith below mutates its target (including nested refs),\n    // and mutating the cached object would leak unpersisted state if the\n    // write fails before resetSettingsCache().\n    let existingSettings = getSettingsForSourceUncached(source)\n\n    // If validation failed, check if file exists with a JSON syntax error\n    if (!existingSettings) {\n      let content: string | null = null\n      try {\n        content = readFileSync(filePath)\n      } catch (e) {\n        if (!isENOENT(e)) {\n          throw e\n        }\n        // File doesn't exist \u2014 fall through to merge with empty settings\n      }\n      if (content !== null) {\n        const rawData = safeParseJSON(content)\n        if (rawData === null) {\n          // JSON syntax error - return validation error instead of overwriting\n          // safeParseJSON will already log the error, so we'll just return the error here\n          return {\n            error: new Error(\n              `Invalid JSON syntax in settings file at ${filePath}`,\n            ),\n          }\n        }\n        if (rawData && typeof rawData === 'object') {\n          existingSettings = rawData as SettingsJson\n          logForDebugging(\n            `Using raw settings from ${filePath} due to validation failure`,\n          )\n        }\n      }\n    }\n\n    const updatedSettings = mergeWith(\n      existingSettings || {},\n      settings,\n      (\n        _objValue: unknown,\n        srcValue: unknown,\n        key: string | number | symbol,\n        object: Record<string | number | symbol, unknown>,\n      ) => {\n        // Handle undefined as deletion\n        if (srcValue === undefined && object && typeof key === 'string') {\n          delete object[key]\n          return undefined\n        }\n        // For arrays, always replace with the provided array\n        // This puts the responsibility on the caller to compute the desired final state\n        if (Array.isArray(srcValue)) {\n          return srcValue\n        }\n        // For non-arrays, let lodash handle the default merge behavior\n        return undefined\n      },\n    )\n\n    // Mark this as an internal write before writing the file\n    markInternalWrite(filePath)\n\n    writeFileSyncAndFlush_DEPRECATED(\n      filePath,\n      jsonStringify(updatedSettings, null, 2) + '\\n',\n    )\n\n    // Invalidate the session cache since settings have been updated\n    resetSettingsCache()\n\n    if (source === 'localSettings') {\n      // Okay to add to gitignore async without awaiting\n      void addFileGlobRuleToGitignore(\n        getRelativeSettingsFilePathForSource('localSettings'),\n        getOriginalCwd(),\n      )\n    }\n  } catch (e) {\n    const error = new Error(\n      `Failed to read raw settings from ${filePath}: ${e}`,\n    )\n    logError(error)\n    return { error }\n  }\n\n  return { error: null }\n}\n\n/**\n * Custom merge function for arrays - concatenate and deduplicate\n */\nfunction mergeArrays<T>(targetArray: T[], sourceArray: T[]): T[] {\n  return uniq([...targetArray, ...sourceArray])\n}\n\n/**\n * Custom merge function for lodash mergeWith when merging settings.\n * Arrays are concatenated and deduplicated; other values use default lodash merge behavior.\n * Exported for testing.\n */\nexport function settingsMergeCustomizer(\n  objValue: unknown,\n  srcValue: unknown,\n): unknown {\n  if (Array.isArray(objValue) && Array.isArray(srcValue)) {\n    return mergeArrays(objValue, srcValue)\n  }\n  // Return undefined to let lodash handle default merge behavior\n  return undefined\n}\n\n/**\n * Get a list of setting keys from managed settings for logging purposes.\n * For certain nested settings (permissions, sandbox, hooks), expands to show\n * one level of nesting (e.g., \"permissions.allow\"). For other settings,\n * returns only the top-level key.\n *\n * @param settings The settings object to extract keys from\n * @returns Sorted array of key paths\n */\nexport function getManagedSettingsKeysForLogging(\n  settings: SettingsJson,\n): string[] {\n  // Use .strip() to get only valid schema keys\n  const validSettings = SettingsSchema().strip().parse(settings) as Record<\n    string,\n    unknown\n  >\n  const keysToExpand = ['permissions', 'sandbox', 'hooks']\n  const allKeys: string[] = []\n\n  // Define valid nested keys for each nested setting we expand\n  const validNestedKeys: Record<string, Set<string>> = {\n    permissions: new Set([\n      'allow',\n      'deny',\n      'ask',\n      'defaultMode',\n      'disableBypassPermissionsMode',\n      ...(feature('TRANSCRIPT_CLASSIFIER') ? ['disableAutoMode'] : []),\n      'additionalDirectories',\n    ]),\n    sandbox: new Set([\n      'enabled',\n      'failIfUnavailable',\n      'allowUnsandboxedCommands',\n      'network',\n      'filesystem',\n      'ignoreViolations',\n      'excludedCommands',\n      'autoAllowBashIfSandboxed',\n      'enableWeakerNestedSandbox',\n      'enableWeakerNetworkIsolation',\n      'ripgrep',\n    ]),\n    // For hooks, we use z.record with enum keys, so we validate separately\n    hooks: new Set([\n      'PreToolUse',\n      'PostToolUse',\n      'Notification',\n      'UserPromptSubmit',\n      'SessionStart',\n      'SessionEnd',\n      'Stop',\n      'SubagentStop',\n      'PreCompact',\n      'PostCompact',\n      'TeammateIdle',\n      'TaskCreated',\n      'TaskCompleted',\n    ]),\n  }\n\n  for (const key of Object.keys(validSettings)) {\n    if (\n      keysToExpand.includes(key) &&\n      validSettings[key] &&\n      typeof validSettings[key] === 'object'\n    ) {\n      // Expand nested keys for these special settings (one level deep only)\n      const nestedObj = validSettings[key] as Record<string, unknown>\n      const validKeys = validNestedKeys[key]\n\n      if (validKeys) {\n        for (const nestedKey of Object.keys(nestedObj)) {\n          // Only include known valid nested keys\n          if (validKeys.has(nestedKey)) {\n            allKeys.push(`${key}.${nestedKey}`)\n          }\n        }\n      }\n    } else {\n      // For other settings, just use the top-level key\n      allKeys.push(key)\n    }\n  }\n\n  return allKeys.sort()\n}\n\n// Flag to prevent infinite recursion when loading settings\nlet isLoadingSettings = false\n\n/**\n * Load settings from disk without using cache\n * This is the original implementation that actually reads from files\n */\nfunction loadSettingsFromDisk(): SettingsWithErrors {\n  // Prevent recursive calls to loadSettingsFromDisk\n  if (isLoadingSettings) {\n    return { settings: {}, errors: [] }\n  }\n\n  const startTime = Date.now()\n  profileCheckpoint('loadSettingsFromDisk_start')\n  logForDiagnosticsNoPII('info', 'settings_load_started')\n\n  isLoadingSettings = true\n  try {\n    // Start with plugin settings as the lowest priority base.\n    // All file-based sources (user, project, local, flag, policy) override these.\n    // Plugin settings only contain allowlisted keys (e.g., agent) that are valid SettingsJson fields.\n    const pluginSettings = getPluginSettingsBase()\n    let mergedSettings: SettingsJson = {}\n    if (pluginSettings) {\n      mergedSettings = mergeWith(\n        mergedSettings,\n        pluginSettings,\n        settingsMergeCustomizer,\n      )\n    }\n    const allErrors: ValidationError[] = []\n    const seenErrors = new Set<string>()\n    const seenFiles = new Set<string>()\n\n    // Merge settings from each source in priority order with deep merging\n    for (const source of getEnabledSettingSources()) {\n      // policySettings: \"first source wins\" \u2014 use the highest-priority source\n      // that has content. Priority: remote > HKLM/plist > managed-settings.json > HKCU\n      if (source === 'policySettings') {\n        let policySettings: SettingsJson | null = null\n        const policyErrors: ValidationError[] = []\n\n        // 1. Remote (highest priority)\n        const remoteSettings = getRemoteManagedSettingsSyncFromCache()\n        if (remoteSettings && Object.keys(remoteSettings).length > 0) {\n          const result = SettingsSchema().safeParse(remoteSettings)\n          if (result.success) {\n            policySettings = result.data\n          } else {\n            // Remote exists but is invalid \u2014 surface errors even as we fall through\n            policyErrors.push(\n              ...formatZodError(result.error, 'remote managed settings'),\n            )\n          }\n        }\n\n        // 2. Admin-only MDM (HKLM / macOS plist)\n        if (!policySettings) {\n          const mdmResult = getMdmSettings()\n          if (Object.keys(mdmResult.settings).length > 0) {\n            policySettings = mdmResult.settings\n          }\n          policyErrors.push(...mdmResult.errors)\n        }\n\n        // 3. managed-settings.json + managed-settings.d/ (file-based, requires admin)\n        if (!policySettings) {\n          const { settings, errors } = loadManagedFileSettings()\n          if (settings) {\n            policySettings = settings\n          }\n          policyErrors.push(...errors)\n        }\n\n        // 4. HKCU (lowest \u2014 user-writable, only if nothing above exists)\n        if (!policySettings) {\n          const hkcu = getHkcuSettings()\n          if (Object.keys(hkcu.settings).length > 0) {\n            policySettings = hkcu.settings\n          }\n          policyErrors.push(...hkcu.errors)\n        }\n\n        // Merge the winning policy source into the settings chain\n        if (policySettings) {\n          mergedSettings = mergeWith(\n            mergedSettings,\n            policySettings,\n            settingsMergeCustomizer,\n          )\n        }\n        for (const error of policyErrors) {\n          const errorKey = `${error.file}:${error.path}:${error.message}`\n          if (!seenErrors.has(errorKey)) {\n            seenErrors.add(errorKey)\n            allErrors.push(error)\n          }\n        }\n\n        continue\n      }\n\n      const filePath = getSettingsFilePathForSource(source)\n      if (filePath) {\n        const resolvedPath = resolve(filePath)\n\n        // Skip if we've already loaded this file from another source\n        if (!seenFiles.has(resolvedPath)) {\n          seenFiles.add(resolvedPath)\n\n          const { settings, errors } = parseSettingsFile(filePath)\n\n          // Add unique errors (deduplication)\n          for (const error of errors) {\n            const errorKey = `${error.file}:${error.path}:${error.message}`\n            if (!seenErrors.has(errorKey)) {\n              seenErrors.add(errorKey)\n              allErrors.push(error)\n            }\n          }\n\n          if (settings) {\n            mergedSettings = mergeWith(\n              mergedSettings,\n              settings,\n              settingsMergeCustomizer,\n            )\n          }\n        }\n      }\n\n      // For flagSettings, also merge any inline settings set via the SDK\n      if (source === 'flagSettings') {\n        const inlineSettings = getFlagSettingsInline()\n        if (inlineSettings) {\n          const parsed = SettingsSchema().safeParse(inlineSettings)\n          if (parsed.success) {\n            mergedSettings = mergeWith(\n              mergedSettings,\n              parsed.data,\n              settingsMergeCustomizer,\n            )\n          }\n        }\n      }\n    }\n\n    logForDiagnosticsNoPII('info', 'settings_load_completed', {\n      duration_ms: Date.now() - startTime,\n      source_count: seenFiles.size,\n      error_count: allErrors.length,\n    })\n\n    return { settings: mergedSettings, errors: allErrors }\n  } finally {\n    isLoadingSettings = false\n  }\n}\n\n/**\n * Get merged settings from all sources in priority order\n * Settings are merged from lowest to highest priority:\n * userSettings -> projectSettings -> localSettings -> policySettings\n *\n * This function returns a snapshot of settings at the time of call.\n * For React components, prefer using useSettings() hook for reactive updates\n * when settings change on disk.\n *\n * Uses session-level caching to avoid repeated file I/O.\n * Cache is invalidated when settings files change via resetSettingsCache().\n *\n * @returns Merged settings from all available sources (always returns at least empty object)\n */\nexport function getInitialSettings(): SettingsJson {\n  const { settings } = getSettingsWithErrors()\n  return settings || {}\n}\n\n/**\n * @deprecated Use getInitialSettings() instead. This alias exists for backwards compatibility.\n */\nexport const getSettings_DEPRECATED = getInitialSettings\n\nexport type SettingsWithSources = {\n  effective: SettingsJson\n  /** Ordered low-to-high priority \u2014 later entries override earlier ones. */\n  sources: Array<{ source: SettingSource; settings: SettingsJson }>\n}\n\n/**\n * Get the effective merged settings alongside the raw per-source settings,\n * in merge-priority order. Only includes sources that are enabled and have\n * non-empty content.\n *\n * Always reads fresh from disk \u2014 resets the session cache so that `effective`\n * and `sources` are consistent even if the change detector hasn't fired yet.\n */\nexport function getSettingsWithSources(): SettingsWithSources {\n  // Reset both caches so getSettingsForSource (per-source cache) and\n  // getInitialSettings (session cache) agree on the current disk state.\n  resetSettingsCache()\n  const sources: SettingsWithSources['sources'] = []\n  for (const source of getEnabledSettingSources()) {\n    const settings = getSettingsForSource(source)\n    if (settings && Object.keys(settings).length > 0) {\n      sources.push({ source, settings })\n    }\n  }\n  return { effective: getInitialSettings(), sources }\n}\n\n/**\n * Get merged settings and validation errors from all sources\n * This function now uses session-level caching to avoid repeated file I/O.\n * Settings changes require Tau restart, so cache is valid for entire session.\n * @returns Merged settings and all validation errors encountered\n */\nexport function getSettingsWithErrors(): SettingsWithErrors {\n  // Use cached result if available\n  const cached = getSessionSettingsCache()\n  if (cached !== null) {\n    return cached\n  }\n\n  // Load from disk and cache the result\n  const result = loadSettingsFromDisk()\n  profileCheckpoint('loadSettingsFromDisk_end')\n  setSessionSettingsCache(result)\n  return result\n}\n\n/**\n * Check if any raw settings file contains a specific key, regardless of validation.\n * This is useful for detecting user intent even when settings validation fails.\n * For example, if a user set cleanupPeriodDays but has validation errors elsewhere,\n * we can detect they explicitly configured cleanup and skip cleanup rather than\n * falling back to defaults.\n */\n/**\n * Returns true if any trusted settings source has accepted the bypass\n * permissions mode dialog. projectSettings is intentionally excluded \u2014\n * a malicious project could otherwise auto-bypass the dialog (RCE risk).\n */\nexport function hasSkipDangerousModePermissionPrompt(): boolean {\n  return !!(\n    getSettingsForSource('userSettings')?.skipDangerousModePermissionPrompt ||\n    getSettingsForSource('localSettings')?.skipDangerousModePermissionPrompt ||\n    getSettingsForSource('flagSettings')?.skipDangerousModePermissionPrompt ||\n    getSettingsForSource('policySettings')?.skipDangerousModePermissionPrompt\n  )\n}\n\n/**\n * Returns true if any trusted settings source has accepted the auto\n * mode opt-in dialog. projectSettings is intentionally excluded \u2014\n * a malicious project could otherwise auto-bypass the dialog (RCE risk).\n */\nexport function hasAutoModeOptIn(): boolean {\n  if (feature('TRANSCRIPT_CLASSIFIER')) {\n    const user = getSettingsForSource('userSettings')?.skipAutoPermissionPrompt\n    const local =\n      getSettingsForSource('localSettings')?.skipAutoPermissionPrompt\n    const flag = getSettingsForSource('flagSettings')?.skipAutoPermissionPrompt\n    const policy =\n      getSettingsForSource('policySettings')?.skipAutoPermissionPrompt\n    const result = !!(user || local || flag || policy)\n    logForDebugging(\n      `[auto-mode] hasAutoModeOptIn=${result} skipAutoPermissionPrompt: user=${user} local=${local} flag=${flag} policy=${policy}`,\n    )\n    return result\n  }\n  return false\n}\n\n/**\n * Returns whether plan mode should use auto mode semantics. Default true\n * (opt-out). Returns false if any trusted source explicitly sets false.\n * projectSettings is excluded so a malicious project can't control this.\n */\nexport function getUseAutoModeDuringPlan(): boolean {\n  if (feature('TRANSCRIPT_CLASSIFIER')) {\n    return (\n      getSettingsForSource('policySettings')?.useAutoModeDuringPlan !== false &&\n      getSettingsForSource('flagSettings')?.useAutoModeDuringPlan !== false &&\n      getSettingsForSource('userSettings')?.useAutoModeDuringPlan !== false &&\n      getSettingsForSource('localSettings')?.useAutoModeDuringPlan !== false\n    )\n  }\n  return true\n}\n\n/**\n * Returns the merged autoMode config from trusted settings sources.\n * Only available when TRANSCRIPT_CLASSIFIER is active; returns undefined otherwise.\n * projectSettings is intentionally excluded \u2014 a malicious project could\n * otherwise inject classifier allow/deny rules (RCE risk).\n */\nexport function getAutoModeConfig():\n  | { allow?: string[]; soft_deny?: string[]; environment?: string[] }\n  | undefined {\n  if (feature('TRANSCRIPT_CLASSIFIER')) {\n    const schema = z.object({\n      allow: z.array(z.string()).optional(),\n      soft_deny: z.array(z.string()).optional(),\n      deny: z.array(z.string()).optional(),\n      environment: z.array(z.string()).optional(),\n    })\n\n    const allow: string[] = []\n    const soft_deny: string[] = []\n    const environment: string[] = []\n\n    for (const source of [\n      'userSettings',\n      'localSettings',\n      'flagSettings',\n      'policySettings',\n    ] as const) {\n      const settings = getSettingsForSource(source)\n      if (!settings) continue\n      const result = schema.safeParse(\n        (settings as Record<string, unknown>).autoMode,\n      )\n      if (result.success) {\n        if (result.data.allow) allow.push(...result.data.allow)\n        if (result.data.soft_deny) soft_deny.push(...result.data.soft_deny)\n        if (process.env.USER_TYPE === 'ant') {\n          if (result.data.deny) soft_deny.push(...result.data.deny)\n        }\n        if (result.data.environment)\n          environment.push(...result.data.environment)\n      }\n    }\n\n    if (allow.length > 0 || soft_deny.length > 0 || environment.length > 0) {\n      return {\n        ...(allow.length > 0 && { allow }),\n        ...(soft_deny.length > 0 && { soft_deny }),\n        ...(environment.length > 0 && { environment }),\n      }\n    }\n  }\n  return undefined\n}\n\nexport function rawSettingsContainsKey(key: string): boolean {\n  for (const source of getEnabledSettingSources()) {\n    // Skip policySettings - we only care about user-configured settings\n    if (source === 'policySettings') {\n      continue\n    }\n\n    const filePath = getSettingsFilePathForSource(source)\n    if (!filePath) {\n      continue\n    }\n\n    try {\n      const { resolvedPath } = safeResolvePath(getFsImplementation(), filePath)\n      const content = readFileSync(resolvedPath)\n      if (!content.trim()) {\n        continue\n      }\n\n      const rawData = safeParseJSON(content, false)\n      if (rawData && typeof rawData === 'object' && key in rawData) {\n        return true\n      }\n    } catch (error) {\n      // File not found is expected - not all settings files exist\n      // Other errors (permissions, I/O) should be tracked\n      handleFileSystemError(error, filePath)\n    }\n  }\n\n  return false\n}\n", "import memoize from 'lodash-es/memoize.js'\nimport { logForDebugging } from './debug.js'\nimport { hasNodeOption } from './envUtils.js'\nimport { getFsImplementation } from './fsOperations.js'\n\n/**\n * Load CA certificates for TLS connections.\n *\n * Since setting `ca` on an HTTPS agent replaces the default certificate store,\n * we must always include base CAs (either system or bundled Mozilla) when returning.\n *\n * Returns undefined when no custom CA configuration is needed, allowing the\n * runtime's default certificate handling to apply.\n *\n * Behavior:\n * - Neither NODE_EXTRA_CA_CERTS nor --use-system-ca/--use-openssl-ca set: undefined (runtime defaults)\n * - NODE_EXTRA_CA_CERTS only: bundled Mozilla CAs + extra cert file contents\n * - --use-system-ca or --use-openssl-ca only: system CAs\n * - --use-system-ca + NODE_EXTRA_CA_CERTS: system CAs + extra cert file contents\n *\n * Memoized for performance. Call clearCACertsCache() to invalidate after\n * environment variable changes (e.g., after trust dialog applies settings.json).\n *\n * Reads ONLY `process.env.NODE_EXTRA_CA_CERTS`. `caCertsConfig.ts` populates\n * that env var from settings.json at CLI init; this module stays config-free\n * so `proxy.ts`/`mtls.ts` don't transitively pull in the command registry.\n */\nexport const getCACertificates = memoize((): string[] | undefined => {\n  const useSystemCA =\n    hasNodeOption('--use-system-ca') || hasNodeOption('--use-openssl-ca')\n\n  const extraCertsPath = process.env.NODE_EXTRA_CA_CERTS\n\n  logForDebugging(\n    `CA certs: useSystemCA=${useSystemCA}, extraCertsPath=${extraCertsPath}`,\n  )\n\n  // If neither is set, return undefined (use runtime defaults, no override)\n  if (!useSystemCA && !extraCertsPath) {\n    return undefined\n  }\n\n  // Deferred load: Bun's node:tls module eagerly materializes ~150 Mozilla\n  // root certificates (~750KB heap) on import, even if tls.rootCertificates\n  // is never accessed. Most users hit the early return above, so we only\n  // pay this cost when custom CA handling is actually needed.\n  /* eslint-disable @typescript-eslint/no-require-imports */\n  const tls = require('tls') as typeof import('tls')\n  /* eslint-enable @typescript-eslint/no-require-imports */\n\n  const certs: string[] = []\n\n  if (useSystemCA) {\n    // Load system CA store (Bun API)\n    const getCACerts = (\n      tls as typeof tls & { getCACertificates?: (type: string) => string[] }\n    ).getCACertificates\n    const systemCAs = getCACerts?.('system')\n    if (systemCAs && systemCAs.length > 0) {\n      certs.push(...systemCAs)\n      logForDebugging(\n        `CA certs: Loaded ${certs.length} system CA certificates (--use-system-ca)`,\n      )\n    } else if (!getCACerts && !extraCertsPath) {\n      // Under Node.js where getCACertificates doesn't exist and no extra certs,\n      // return undefined to let Node.js handle --use-system-ca natively.\n      logForDebugging(\n        'CA certs: --use-system-ca set but system CA API unavailable, deferring to runtime',\n      )\n      return undefined\n    } else {\n      // System CA API returned empty or unavailable; fall back to bundled root certs\n      certs.push(...tls.rootCertificates)\n      logForDebugging(\n        `CA certs: Loaded ${certs.length} bundled root certificates as base (--use-system-ca fallback)`,\n      )\n    }\n  } else {\n    // Must include bundled Mozilla CAs as base since ca replaces defaults\n    certs.push(...tls.rootCertificates)\n    logForDebugging(\n      `CA certs: Loaded ${certs.length} bundled root certificates as base`,\n    )\n  }\n\n  // Append extra certs from file\n  if (extraCertsPath) {\n    try {\n      const extraCert = getFsImplementation().readFileSync(extraCertsPath, {\n        encoding: 'utf8',\n      })\n      certs.push(extraCert)\n      logForDebugging(\n        `CA certs: Appended extra certificates from NODE_EXTRA_CA_CERTS (${extraCertsPath})`,\n      )\n    } catch (error) {\n      logForDebugging(\n        `CA certs: Failed to read NODE_EXTRA_CA_CERTS file (${extraCertsPath}): ${error}`,\n        { level: 'error' },\n      )\n    }\n  }\n\n  return certs.length > 0 ? certs : undefined\n})\n\n/**\n * Clear the CA certificates cache.\n * Call this when environment variables that affect CA certs may have changed\n * (e.g., NODE_EXTRA_CA_CERTS, NODE_OPTIONS).\n */\nexport function clearCACertsCache(): void {\n  getCACertificates.cache.clear?.()\n  logForDebugging('Cleared CA certificates cache')\n}\n", "import type * as https from 'https'\nimport { Agent as HttpsAgent } from 'https'\nimport memoize from 'lodash-es/memoize.js'\nimport type * as tls from 'tls'\nimport type * as undici from 'undici'\nimport { getCACertificates } from './caCerts.js'\nimport { logForDebugging } from './debug.js'\nimport { getFsImplementation } from './fsOperations.js'\n\nexport type MTLSConfig = {\n  cert?: string\n  key?: string\n  passphrase?: string\n}\n\nexport type TLSConfig = MTLSConfig & {\n  ca?: string | string[] | Buffer\n}\n\n/**\n * Get mTLS configuration from environment variables\n */\nexport const getMTLSConfig = memoize((): MTLSConfig | undefined => {\n  const config: MTLSConfig = {}\n\n  // Note: NODE_EXTRA_CA_CERTS is automatically handled by Node.js at runtime\n  // We don't need to manually load it - Node.js appends it to the built-in CAs automatically\n\n  // Client certificate\n  if (process.env.CLAUDE_CODE_CLIENT_CERT) {\n    try {\n      config.cert = getFsImplementation().readFileSync(\n        process.env.CLAUDE_CODE_CLIENT_CERT,\n        { encoding: 'utf8' },\n      )\n      logForDebugging(\n        'mTLS: Loaded client certificate from CLAUDE_CODE_CLIENT_CERT',\n      )\n    } catch (error) {\n      logForDebugging(`mTLS: Failed to load client certificate: ${error}`, {\n        level: 'error',\n      })\n    }\n  }\n\n  // Client key\n  if (process.env.CLAUDE_CODE_CLIENT_KEY) {\n    try {\n      config.key = getFsImplementation().readFileSync(\n        process.env.CLAUDE_CODE_CLIENT_KEY,\n        { encoding: 'utf8' },\n      )\n      logForDebugging('mTLS: Loaded client key from CLAUDE_CODE_CLIENT_KEY')\n    } catch (error) {\n      logForDebugging(`mTLS: Failed to load client key: ${error}`, {\n        level: 'error',\n      })\n    }\n  }\n\n  // Key passphrase\n  if (process.env.CLAUDE_CODE_CLIENT_KEY_PASSPHRASE) {\n    config.passphrase = process.env.CLAUDE_CODE_CLIENT_KEY_PASSPHRASE\n    logForDebugging('mTLS: Using client key passphrase')\n  }\n\n  // Only return config if at least one option is set\n  if (Object.keys(config).length === 0) {\n    return undefined\n  }\n\n  return config\n})\n\n/**\n * Create an HTTPS agent with mTLS configuration\n */\nexport const getMTLSAgent = memoize((): HttpsAgent | undefined => {\n  const mtlsConfig = getMTLSConfig()\n  const caCerts = getCACertificates()\n\n  if (!mtlsConfig && !caCerts) {\n    return undefined\n  }\n\n  const agentOptions: https.AgentOptions = {\n    ...mtlsConfig,\n    ...(caCerts && { ca: caCerts }),\n    // Enable keep-alive for better performance\n    keepAlive: true,\n  }\n\n  logForDebugging('mTLS: Creating HTTPS agent with custom certificates')\n  return new HttpsAgent(agentOptions)\n})\n\n/**\n * Get TLS options for WebSocket connections\n */\nexport function getWebSocketTLSOptions(): tls.ConnectionOptions | undefined {\n  const mtlsConfig = getMTLSConfig()\n  const caCerts = getCACertificates()\n\n  if (!mtlsConfig && !caCerts) {\n    return undefined\n  }\n\n  return {\n    ...mtlsConfig,\n    ...(caCerts && { ca: caCerts }),\n  }\n}\n\n/**\n * Get fetch options with TLS configuration (mTLS + CA certs) for undici\n */\nexport function getTLSFetchOptions(): {\n  tls?: TLSConfig\n  dispatcher?: undici.Dispatcher\n} {\n  const mtlsConfig = getMTLSConfig()\n  const caCerts = getCACertificates()\n\n  if (!mtlsConfig && !caCerts) {\n    return {}\n  }\n\n  const tlsConfig: TLSConfig = {\n    ...mtlsConfig,\n    ...(caCerts && { ca: caCerts }),\n  }\n\n  if (typeof Bun !== 'undefined') {\n    return { tls: tlsConfig }\n  }\n  logForDebugging('TLS: Created undici agent with custom certificates')\n  // Create a custom undici Agent with TLS options. Lazy-required so that\n  // the ~1.5MB undici package is only loaded when mTLS/CA certs are configured.\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  const undiciMod = require('undici') as typeof undici\n  const agent = new undiciMod.Agent({\n    connect: {\n      cert: tlsConfig.cert,\n      key: tlsConfig.key,\n      passphrase: tlsConfig.passphrase,\n      ...(tlsConfig.ca && { ca: tlsConfig.ca }),\n    },\n    pipelining: 1,\n  })\n\n  return { dispatcher: agent }\n}\n\n/**\n * Clear the mTLS configuration cache.\n */\nexport function clearMTLSCache(): void {\n  getMTLSConfig.cache.clear?.()\n  getMTLSAgent.cache.clear?.()\n  logForDebugging('Cleared mTLS configuration cache')\n}\n\n/**\n * Configure global Node.js TLS settings\n */\nexport function configureGlobalMTLS(): void {\n  const mtlsConfig = getMTLSConfig()\n\n  if (!mtlsConfig) {\n    return\n  }\n\n  // NODE_EXTRA_CA_CERTS is automatically handled by Node.js at runtime\n  if (process.env.NODE_EXTRA_CA_CERTS) {\n    logForDebugging(\n      'NODE_EXTRA_CA_CERTS detected - Node.js will automatically append to built-in CAs',\n    )\n  }\n}\n", "'use strict';\n\nexports.HttpAuthLocation = void 0;\n(function (HttpAuthLocation) {\n    HttpAuthLocation[\"HEADER\"] = \"header\";\n    HttpAuthLocation[\"QUERY\"] = \"query\";\n})(exports.HttpAuthLocation || (exports.HttpAuthLocation = {}));\n\nexports.HttpApiKeyAuthLocation = void 0;\n(function (HttpApiKeyAuthLocation) {\n    HttpApiKeyAuthLocation[\"HEADER\"] = \"header\";\n    HttpApiKeyAuthLocation[\"QUERY\"] = \"query\";\n})(exports.HttpApiKeyAuthLocation || (exports.HttpApiKeyAuthLocation = {}));\n\nexports.EndpointURLScheme = void 0;\n(function (EndpointURLScheme) {\n    EndpointURLScheme[\"HTTP\"] = \"http\";\n    EndpointURLScheme[\"HTTPS\"] = \"https\";\n})(exports.EndpointURLScheme || (exports.EndpointURLScheme = {}));\n\nexports.AlgorithmId = void 0;\n(function (AlgorithmId) {\n    AlgorithmId[\"MD5\"] = \"md5\";\n    AlgorithmId[\"CRC32\"] = \"crc32\";\n    AlgorithmId[\"CRC32C\"] = \"crc32c\";\n    AlgorithmId[\"SHA1\"] = \"sha1\";\n    AlgorithmId[\"SHA256\"] = \"sha256\";\n})(exports.AlgorithmId || (exports.AlgorithmId = {}));\nconst getChecksumConfiguration = (runtimeConfig) => {\n    const checksumAlgorithms = [];\n    if (runtimeConfig.sha256 !== undefined) {\n        checksumAlgorithms.push({\n            algorithmId: () => exports.AlgorithmId.SHA256,\n            checksumConstructor: () => runtimeConfig.sha256,\n        });\n    }\n    if (runtimeConfig.md5 != undefined) {\n        checksumAlgorithms.push({\n            algorithmId: () => exports.AlgorithmId.MD5,\n            checksumConstructor: () => runtimeConfig.md5,\n        });\n    }\n    return {\n        addChecksumAlgorithm(algo) {\n            checksumAlgorithms.push(algo);\n        },\n        checksumAlgorithms() {\n            return checksumAlgorithms;\n        },\n    };\n};\nconst resolveChecksumRuntimeConfig = (clientConfig) => {\n    const runtimeConfig = {};\n    clientConfig.checksumAlgorithms().forEach((checksumAlgorithm) => {\n        runtimeConfig[checksumAlgorithm.algorithmId()] = checksumAlgorithm.checksumConstructor();\n    });\n    return runtimeConfig;\n};\n\nconst getDefaultClientConfiguration = (runtimeConfig) => {\n    return getChecksumConfiguration(runtimeConfig);\n};\nconst resolveDefaultRuntimeConfig = (config) => {\n    return resolveChecksumRuntimeConfig(config);\n};\n\nexports.FieldPosition = void 0;\n(function (FieldPosition) {\n    FieldPosition[FieldPosition[\"HEADER\"] = 0] = \"HEADER\";\n    FieldPosition[FieldPosition[\"TRAILER\"] = 1] = \"TRAILER\";\n})(exports.FieldPosition || (exports.FieldPosition = {}));\n\nconst SMITHY_CONTEXT_KEY = \"__smithy_context\";\n\nexports.IniSectionType = void 0;\n(function (IniSectionType) {\n    IniSectionType[\"PROFILE\"] = \"profile\";\n    IniSectionType[\"SSO_SESSION\"] = \"sso-session\";\n    IniSectionType[\"SERVICES\"] = \"services\";\n})(exports.IniSectionType || (exports.IniSectionType = {}));\n\nexports.RequestHandlerProtocol = void 0;\n(function (RequestHandlerProtocol) {\n    RequestHandlerProtocol[\"HTTP_0_9\"] = \"http/0.9\";\n    RequestHandlerProtocol[\"HTTP_1_0\"] = \"http/1.0\";\n    RequestHandlerProtocol[\"TDS_8_0\"] = \"tds/8.0\";\n})(exports.RequestHandlerProtocol || (exports.RequestHandlerProtocol = {}));\n\nexports.SMITHY_CONTEXT_KEY = SMITHY_CONTEXT_KEY;\nexports.getDefaultClientConfiguration = getDefaultClientConfiguration;\nexports.resolveDefaultRuntimeConfig = resolveDefaultRuntimeConfig;\n", "'use strict';\n\nvar types = require('@smithy/types');\n\nconst getHttpHandlerExtensionConfiguration = (runtimeConfig) => {\n    return {\n        setHttpHandler(handler) {\n            runtimeConfig.httpHandler = handler;\n        },\n        httpHandler() {\n            return runtimeConfig.httpHandler;\n        },\n        updateHttpClientConfig(key, value) {\n            runtimeConfig.httpHandler?.updateHttpClientConfig(key, value);\n        },\n        httpHandlerConfigs() {\n            return runtimeConfig.httpHandler.httpHandlerConfigs();\n        },\n    };\n};\nconst resolveHttpHandlerRuntimeConfig = (httpHandlerExtensionConfiguration) => {\n    return {\n        httpHandler: httpHandlerExtensionConfiguration.httpHandler(),\n    };\n};\n\nclass Field {\n    name;\n    kind;\n    values;\n    constructor({ name, kind = types.FieldPosition.HEADER, values = [] }) {\n        this.name = name;\n        this.kind = kind;\n        this.values = values;\n    }\n    add(value) {\n        this.values.push(value);\n    }\n    set(values) {\n        this.values = values;\n    }\n    remove(value) {\n        this.values = this.values.filter((v) => v !== value);\n    }\n    toString() {\n        return this.values.map((v) => (v.includes(\",\") || v.includes(\" \") ? `\"${v}\"` : v)).join(\", \");\n    }\n    get() {\n        return this.values;\n    }\n}\n\nclass Fields {\n    entries = {};\n    encoding;\n    constructor({ fields = [], encoding = \"utf-8\" }) {\n        fields.forEach(this.setField.bind(this));\n        this.encoding = encoding;\n    }\n    setField(field) {\n        this.entries[field.name.toLowerCase()] = field;\n    }\n    getField(name) {\n        return this.entries[name.toLowerCase()];\n    }\n    removeField(name) {\n        delete this.entries[name.toLowerCase()];\n    }\n    getByType(kind) {\n        return Object.values(this.entries).filter((field) => field.kind === kind);\n    }\n}\n\nclass HttpRequest {\n    method;\n    protocol;\n    hostname;\n    port;\n    path;\n    query;\n    headers;\n    username;\n    password;\n    fragment;\n    body;\n    constructor(options) {\n        this.method = options.method || \"GET\";\n        this.hostname = options.hostname || \"localhost\";\n        this.port = options.port;\n        this.query = options.query || {};\n        this.headers = options.headers || {};\n        this.body = options.body;\n        this.protocol = options.protocol\n            ? options.protocol.slice(-1) !== \":\"\n                ? `${options.protocol}:`\n                : options.protocol\n            : \"https:\";\n        this.path = options.path ? (options.path.charAt(0) !== \"/\" ? `/${options.path}` : options.path) : \"/\";\n        this.username = options.username;\n        this.password = options.password;\n        this.fragment = options.fragment;\n    }\n    static clone(request) {\n        const cloned = new HttpRequest({\n            ...request,\n            headers: { ...request.headers },\n        });\n        if (cloned.query) {\n            cloned.query = cloneQuery(cloned.query);\n        }\n        return cloned;\n    }\n    static isInstance(request) {\n        if (!request) {\n            return false;\n        }\n        const req = request;\n        return (\"method\" in req &&\n            \"protocol\" in req &&\n            \"hostname\" in req &&\n            \"path\" in req &&\n            typeof req[\"query\"] === \"object\" &&\n            typeof req[\"headers\"] === \"object\");\n    }\n    clone() {\n        return HttpRequest.clone(this);\n    }\n}\nfunction cloneQuery(query) {\n    return Object.keys(query).reduce((carry, paramName) => {\n        const param = query[paramName];\n        return {\n            ...carry,\n            [paramName]: Array.isArray(param) ? [...param] : param,\n        };\n    }, {});\n}\n\nclass HttpResponse {\n    statusCode;\n    reason;\n    headers;\n    body;\n    constructor(options) {\n        this.statusCode = options.statusCode;\n        this.reason = options.reason;\n        this.headers = options.headers || {};\n        this.body = options.body;\n    }\n    static isInstance(response) {\n        if (!response)\n            return false;\n        const resp = response;\n        return typeof resp.statusCode === \"number\" && typeof resp.headers === \"object\";\n    }\n}\n\nfunction isValidHostname(hostname) {\n    const hostPattern = /^[a-z0-9][a-z0-9\\.\\-]*[a-z0-9]$/;\n    return hostPattern.test(hostname);\n}\n\nexports.Field = Field;\nexports.Fields = Fields;\nexports.HttpRequest = HttpRequest;\nexports.HttpResponse = HttpResponse;\nexports.getHttpHandlerExtensionConfiguration = getHttpHandlerExtensionConfiguration;\nexports.isValidHostname = isValidHostname;\nexports.resolveHttpHandlerRuntimeConfig = resolveHttpHandlerRuntimeConfig;\n", "'use strict';\n\nconst escapeUri = (uri) => encodeURIComponent(uri).replace(/[!'()*]/g, hexEncode);\nconst hexEncode = (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`;\n\nconst escapeUriPath = (uri) => uri.split(\"/\").map(escapeUri).join(\"/\");\n\nexports.escapeUri = escapeUri;\nexports.escapeUriPath = escapeUriPath;\n", "'use strict';\n\nvar utilUriEscape = require('@smithy/util-uri-escape');\n\nfunction buildQueryString(query) {\n    const parts = [];\n    for (let key of Object.keys(query).sort()) {\n        const value = query[key];\n        key = utilUriEscape.escapeUri(key);\n        if (Array.isArray(value)) {\n            for (let i = 0, iLen = value.length; i < iLen; i++) {\n                parts.push(`${key}=${utilUriEscape.escapeUri(value[i])}`);\n            }\n        }\n        else {\n            let qsEntry = key;\n            if (value || typeof value === \"string\") {\n                qsEntry += `=${utilUriEscape.escapeUri(value)}`;\n            }\n            parts.push(qsEntry);\n        }\n    }\n    return parts.join(\"&\");\n}\n\nexports.buildQueryString = buildQueryString;\n", "'use strict';\n\nvar protocolHttp = require('@smithy/protocol-http');\nvar querystringBuilder = require('@smithy/querystring-builder');\nvar node_https = require('node:https');\nvar node_stream = require('node:stream');\nvar http2 = require('node:http2');\n\nfunction buildAbortError(abortSignal) {\n    const reason = abortSignal && typeof abortSignal === \"object\" && \"reason\" in abortSignal\n        ? abortSignal.reason\n        : undefined;\n    if (reason) {\n        if (reason instanceof Error) {\n            const abortError = new Error(\"Request aborted\");\n            abortError.name = \"AbortError\";\n            abortError.cause = reason;\n            return abortError;\n        }\n        const abortError = new Error(String(reason));\n        abortError.name = \"AbortError\";\n        return abortError;\n    }\n    const abortError = new Error(\"Request aborted\");\n    abortError.name = \"AbortError\";\n    return abortError;\n}\n\nconst NODEJS_TIMEOUT_ERROR_CODES = [\"ECONNRESET\", \"EPIPE\", \"ETIMEDOUT\"];\n\nconst getTransformedHeaders = (headers) => {\n    const transformedHeaders = {};\n    for (const name of Object.keys(headers)) {\n        const headerValues = headers[name];\n        transformedHeaders[name] = Array.isArray(headerValues) ? headerValues.join(\",\") : headerValues;\n    }\n    return transformedHeaders;\n};\n\nconst timing = {\n    setTimeout: (cb, ms) => setTimeout(cb, ms),\n    clearTimeout: (timeoutId) => clearTimeout(timeoutId),\n};\n\nconst DEFER_EVENT_LISTENER_TIME$2 = 1000;\nconst setConnectionTimeout = (request, reject, timeoutInMs = 0) => {\n    if (!timeoutInMs) {\n        return -1;\n    }\n    const registerTimeout = (offset) => {\n        const timeoutId = timing.setTimeout(() => {\n            request.destroy();\n            reject(Object.assign(new Error(`@smithy/node-http-handler - the request socket did not establish a connection with the server within the configured timeout of ${timeoutInMs} ms.`), {\n                name: \"TimeoutError\",\n            }));\n        }, timeoutInMs - offset);\n        const doWithSocket = (socket) => {\n            if (socket?.connecting) {\n                socket.on(\"connect\", () => {\n                    timing.clearTimeout(timeoutId);\n                });\n            }\n            else {\n                timing.clearTimeout(timeoutId);\n            }\n        };\n        if (request.socket) {\n            doWithSocket(request.socket);\n        }\n        else {\n            request.on(\"socket\", doWithSocket);\n        }\n    };\n    if (timeoutInMs < 2000) {\n        registerTimeout(0);\n        return 0;\n    }\n    return timing.setTimeout(registerTimeout.bind(null, DEFER_EVENT_LISTENER_TIME$2), DEFER_EVENT_LISTENER_TIME$2);\n};\n\nconst setRequestTimeout = (req, reject, timeoutInMs = 0, throwOnRequestTimeout, logger) => {\n    if (timeoutInMs) {\n        return timing.setTimeout(() => {\n            let msg = `@smithy/node-http-handler - [${throwOnRequestTimeout ? \"ERROR\" : \"WARN\"}] a request has exceeded the configured ${timeoutInMs} ms requestTimeout.`;\n            if (throwOnRequestTimeout) {\n                const error = Object.assign(new Error(msg), {\n                    name: \"TimeoutError\",\n                    code: \"ETIMEDOUT\",\n                });\n                req.destroy(error);\n                reject(error);\n            }\n            else {\n                msg += ` Init client requestHandler with throwOnRequestTimeout=true to turn this into an error.`;\n                logger?.warn?.(msg);\n            }\n        }, timeoutInMs);\n    }\n    return -1;\n};\n\nconst DEFER_EVENT_LISTENER_TIME$1 = 3000;\nconst setSocketKeepAlive = (request, { keepAlive, keepAliveMsecs }, deferTimeMs = DEFER_EVENT_LISTENER_TIME$1) => {\n    if (keepAlive !== true) {\n        return -1;\n    }\n    const registerListener = () => {\n        if (request.socket) {\n            request.socket.setKeepAlive(keepAlive, keepAliveMsecs || 0);\n        }\n        else {\n            request.on(\"socket\", (socket) => {\n                socket.setKeepAlive(keepAlive, keepAliveMsecs || 0);\n            });\n        }\n    };\n    if (deferTimeMs === 0) {\n        registerListener();\n        return 0;\n    }\n    return timing.setTimeout(registerListener, deferTimeMs);\n};\n\nconst DEFER_EVENT_LISTENER_TIME = 3000;\nconst setSocketTimeout = (request, reject, timeoutInMs = 0) => {\n    const registerTimeout = (offset) => {\n        const timeout = timeoutInMs - offset;\n        const onTimeout = () => {\n            request.destroy();\n            reject(Object.assign(new Error(`@smithy/node-http-handler - the request socket timed out after ${timeoutInMs} ms of inactivity (configured by client requestHandler).`), { name: \"TimeoutError\" }));\n        };\n        if (request.socket) {\n            request.socket.setTimeout(timeout, onTimeout);\n            request.on(\"close\", () => request.socket?.removeListener(\"timeout\", onTimeout));\n        }\n        else {\n            request.setTimeout(timeout, onTimeout);\n        }\n    };\n    if (0 < timeoutInMs && timeoutInMs < 6000) {\n        registerTimeout(0);\n        return 0;\n    }\n    return timing.setTimeout(registerTimeout.bind(null, timeoutInMs === 0 ? 0 : DEFER_EVENT_LISTENER_TIME), DEFER_EVENT_LISTENER_TIME);\n};\n\nconst MIN_WAIT_TIME = 6_000;\nasync function writeRequestBody(httpRequest, request, maxContinueTimeoutMs = MIN_WAIT_TIME, externalAgent = false) {\n    const headers = request.headers ?? {};\n    const expect = headers.Expect || headers.expect;\n    let timeoutId = -1;\n    let sendBody = true;\n    if (!externalAgent && expect === \"100-continue\") {\n        sendBody = await Promise.race([\n            new Promise((resolve) => {\n                timeoutId = Number(timing.setTimeout(() => resolve(true), Math.max(MIN_WAIT_TIME, maxContinueTimeoutMs)));\n            }),\n            new Promise((resolve) => {\n                httpRequest.on(\"continue\", () => {\n                    timing.clearTimeout(timeoutId);\n                    resolve(true);\n                });\n                httpRequest.on(\"response\", () => {\n                    timing.clearTimeout(timeoutId);\n                    resolve(false);\n                });\n                httpRequest.on(\"error\", () => {\n                    timing.clearTimeout(timeoutId);\n                    resolve(false);\n                });\n            }),\n        ]);\n    }\n    if (sendBody) {\n        writeBody(httpRequest, request.body);\n    }\n}\nfunction writeBody(httpRequest, body) {\n    if (body instanceof node_stream.Readable) {\n        body.pipe(httpRequest);\n        return;\n    }\n    if (body) {\n        const isBuffer = Buffer.isBuffer(body);\n        const isString = typeof body === \"string\";\n        if (isBuffer || isString) {\n            if (isBuffer && body.byteLength === 0) {\n                httpRequest.end();\n            }\n            else {\n                httpRequest.end(body);\n            }\n            return;\n        }\n        const uint8 = body;\n        if (typeof uint8 === \"object\" &&\n            uint8.buffer &&\n            typeof uint8.byteOffset === \"number\" &&\n            typeof uint8.byteLength === \"number\") {\n            httpRequest.end(Buffer.from(uint8.buffer, uint8.byteOffset, uint8.byteLength));\n            return;\n        }\n        httpRequest.end(Buffer.from(body));\n        return;\n    }\n    httpRequest.end();\n}\n\nconst DEFAULT_REQUEST_TIMEOUT = 0;\nlet hAgent = undefined;\nlet hRequest = undefined;\nclass NodeHttpHandler {\n    config;\n    configProvider;\n    socketWarningTimestamp = 0;\n    externalAgent = false;\n    metadata = { handlerProtocol: \"http/1.1\" };\n    static create(instanceOrOptions) {\n        if (typeof instanceOrOptions?.handle === \"function\") {\n            return instanceOrOptions;\n        }\n        return new NodeHttpHandler(instanceOrOptions);\n    }\n    static checkSocketUsage(agent, socketWarningTimestamp, logger = console) {\n        const { sockets, requests, maxSockets } = agent;\n        if (typeof maxSockets !== \"number\" || maxSockets === Infinity) {\n            return socketWarningTimestamp;\n        }\n        const interval = 15_000;\n        if (Date.now() - interval < socketWarningTimestamp) {\n            return socketWarningTimestamp;\n        }\n        if (sockets && requests) {\n            for (const origin in sockets) {\n                const socketsInUse = sockets[origin]?.length ?? 0;\n                const requestsEnqueued = requests[origin]?.length ?? 0;\n                if (socketsInUse >= maxSockets && requestsEnqueued >= 2 * maxSockets) {\n                    logger?.warn?.(`@smithy/node-http-handler:WARN - socket usage at capacity=${socketsInUse} and ${requestsEnqueued} additional requests are enqueued.\nSee https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/node-configuring-maxsockets.html\nor increase socketAcquisitionWarningTimeout=(millis) in the NodeHttpHandler config.`);\n                    return Date.now();\n                }\n            }\n        }\n        return socketWarningTimestamp;\n    }\n    constructor(options) {\n        this.configProvider = new Promise((resolve, reject) => {\n            if (typeof options === \"function\") {\n                options()\n                    .then((_options) => {\n                    resolve(this.resolveDefaultConfig(_options));\n                })\n                    .catch(reject);\n            }\n            else {\n                resolve(this.resolveDefaultConfig(options));\n            }\n        });\n    }\n    destroy() {\n        this.config?.httpAgent?.destroy();\n        this.config?.httpsAgent?.destroy();\n    }\n    async handle(request, { abortSignal, requestTimeout } = {}) {\n        if (!this.config) {\n            this.config = await this.configProvider;\n        }\n        const config = this.config;\n        const isSSL = request.protocol === \"https:\";\n        if (!isSSL && !this.config.httpAgent) {\n            this.config.httpAgent = await this.config.httpAgentProvider();\n        }\n        return new Promise((_resolve, _reject) => {\n            let writeRequestBodyPromise = undefined;\n            const timeouts = [];\n            const resolve = async (arg) => {\n                await writeRequestBodyPromise;\n                timeouts.forEach(timing.clearTimeout);\n                _resolve(arg);\n            };\n            const reject = async (arg) => {\n                await writeRequestBodyPromise;\n                timeouts.forEach(timing.clearTimeout);\n                _reject(arg);\n            };\n            if (abortSignal?.aborted) {\n                const abortError = buildAbortError(abortSignal);\n                reject(abortError);\n                return;\n            }\n            const headers = request.headers ?? {};\n            const expectContinue = (headers.Expect ?? headers.expect) === \"100-continue\";\n            let agent = isSSL ? config.httpsAgent : config.httpAgent;\n            if (expectContinue && !this.externalAgent) {\n                agent = new (isSSL ? node_https.Agent : hAgent)({\n                    keepAlive: false,\n                    maxSockets: Infinity,\n                });\n            }\n            timeouts.push(timing.setTimeout(() => {\n                this.socketWarningTimestamp = NodeHttpHandler.checkSocketUsage(agent, this.socketWarningTimestamp, config.logger);\n            }, config.socketAcquisitionWarningTimeout ?? (config.requestTimeout ?? 2000) + (config.connectionTimeout ?? 1000)));\n            const queryString = querystringBuilder.buildQueryString(request.query || {});\n            let auth = undefined;\n            if (request.username != null || request.password != null) {\n                const username = request.username ?? \"\";\n                const password = request.password ?? \"\";\n                auth = `${username}:${password}`;\n            }\n            let path = request.path;\n            if (queryString) {\n                path += `?${queryString}`;\n            }\n            if (request.fragment) {\n                path += `#${request.fragment}`;\n            }\n            let hostname = request.hostname ?? \"\";\n            if (hostname[0] === \"[\" && hostname.endsWith(\"]\")) {\n                hostname = request.hostname.slice(1, -1);\n            }\n            else {\n                hostname = request.hostname;\n            }\n            const nodeHttpsOptions = {\n                headers: request.headers,\n                host: hostname,\n                method: request.method,\n                path,\n                port: request.port,\n                agent,\n                auth,\n            };\n            const requestFunc = isSSL ? node_https.request : hRequest;\n            const req = requestFunc(nodeHttpsOptions, (res) => {\n                const httpResponse = new protocolHttp.HttpResponse({\n                    statusCode: res.statusCode || -1,\n                    reason: res.statusMessage,\n                    headers: getTransformedHeaders(res.headers),\n                    body: res,\n                });\n                resolve({ response: httpResponse });\n            });\n            req.on(\"error\", (err) => {\n                if (NODEJS_TIMEOUT_ERROR_CODES.includes(err.code)) {\n                    reject(Object.assign(err, { name: \"TimeoutError\" }));\n                }\n                else {\n                    reject(err);\n                }\n            });\n            if (abortSignal) {\n                const onAbort = () => {\n                    req.destroy();\n                    const abortError = buildAbortError(abortSignal);\n                    reject(abortError);\n                };\n                if (typeof abortSignal.addEventListener === \"function\") {\n                    const signal = abortSignal;\n                    signal.addEventListener(\"abort\", onAbort, { once: true });\n                    req.once(\"close\", () => signal.removeEventListener(\"abort\", onAbort));\n                }\n                else {\n                    abortSignal.onabort = onAbort;\n                }\n            }\n            const effectiveRequestTimeout = requestTimeout ?? config.requestTimeout;\n            timeouts.push(setConnectionTimeout(req, reject, config.connectionTimeout));\n            timeouts.push(setRequestTimeout(req, reject, effectiveRequestTimeout, config.throwOnRequestTimeout, config.logger ?? console));\n            timeouts.push(setSocketTimeout(req, reject, config.socketTimeout));\n            const httpAgent = nodeHttpsOptions.agent;\n            if (typeof httpAgent === \"object\" && \"keepAlive\" in httpAgent) {\n                timeouts.push(setSocketKeepAlive(req, {\n                    keepAlive: httpAgent.keepAlive,\n                    keepAliveMsecs: httpAgent.keepAliveMsecs,\n                }));\n            }\n            writeRequestBodyPromise = writeRequestBody(req, request, effectiveRequestTimeout, this.externalAgent).catch((e) => {\n                timeouts.forEach(timing.clearTimeout);\n                return _reject(e);\n            });\n        });\n    }\n    updateHttpClientConfig(key, value) {\n        this.config = undefined;\n        this.configProvider = this.configProvider.then((config) => {\n            return {\n                ...config,\n                [key]: value,\n            };\n        });\n    }\n    httpHandlerConfigs() {\n        return this.config ?? {};\n    }\n    resolveDefaultConfig(options) {\n        const { requestTimeout, connectionTimeout, socketTimeout, socketAcquisitionWarningTimeout, httpAgent, httpsAgent, throwOnRequestTimeout, logger, } = options || {};\n        const keepAlive = true;\n        const maxSockets = 50;\n        return {\n            connectionTimeout,\n            requestTimeout,\n            socketTimeout,\n            socketAcquisitionWarningTimeout,\n            throwOnRequestTimeout,\n            httpAgentProvider: async () => {\n                const { Agent, request } = await import('node:http');\n                hRequest = request;\n                hAgent = Agent;\n                if (httpAgent instanceof hAgent || typeof httpAgent?.destroy === \"function\") {\n                    this.externalAgent = true;\n                    return httpAgent;\n                }\n                return new hAgent({ keepAlive, maxSockets, ...httpAgent });\n            },\n            httpsAgent: (() => {\n                if (httpsAgent instanceof node_https.Agent || typeof httpsAgent?.destroy === \"function\") {\n                    this.externalAgent = true;\n                    return httpsAgent;\n                }\n                return new node_https.Agent({ keepAlive, maxSockets, ...httpsAgent });\n            })(),\n            logger,\n        };\n    }\n}\n\nconst ids = new Uint16Array(1);\nclass ClientHttp2SessionRef {\n    id = ids[0]++;\n    total = 0;\n    max = 0;\n    session;\n    refs = 0;\n    constructor(session) {\n        session.unref();\n        this.session = session;\n    }\n    retain() {\n        if (this.session.destroyed) {\n            throw new Error(\"@smithy/node-http-handler - cannot acquire reference to destroyed session.\");\n        }\n        this.refs += 1;\n        this.total += 1;\n        this.max = Math.max(this.refs, this.max);\n        this.session.ref();\n    }\n    free() {\n        if (this.session.destroyed) {\n            return;\n        }\n        this.refs -= 1;\n        if (this.refs === 0) {\n            this.session.unref();\n        }\n        if (this.refs < 0) {\n            throw new Error(\"@smithy/node-http-handler - ClientHttp2Session refcount at zero, cannot decrement.\");\n        }\n    }\n    deref() {\n        return this.session;\n    }\n    close() {\n        if (!this.session.closed) {\n            this.session.close();\n        }\n    }\n    destroy() {\n        this.refs = 0;\n        if (!this.session.destroyed) {\n            this.session.destroy();\n        }\n    }\n    useCount() {\n        return this.refs;\n    }\n}\n\nclass NodeHttp2ConnectionPool {\n    sessions = [];\n    maxConcurrency = 0;\n    constructor(sessions) {\n        this.sessions = (sessions ?? []).map((session) => new ClientHttp2SessionRef(session));\n    }\n    poll() {\n        let cleanup = false;\n        for (const session of this.sessions) {\n            if (session.deref().destroyed) {\n                cleanup = true;\n                continue;\n            }\n            if (!this.maxConcurrency || session.useCount() < this.maxConcurrency) {\n                return session;\n            }\n        }\n        if (cleanup) {\n            for (const session of this.sessions) {\n                if (session.deref().destroyed) {\n                    this.remove(session);\n                }\n            }\n        }\n    }\n    offerLast(ref) {\n        this.sessions.push(ref);\n    }\n    remove(ref) {\n        const ix = this.sessions.indexOf(ref);\n        if (ix > -1) {\n            this.sessions.splice(ix, 1);\n        }\n    }\n    [Symbol.iterator]() {\n        return this.sessions[Symbol.iterator]();\n    }\n    setMaxConcurrency(maxConcurrency) {\n        this.maxConcurrency = maxConcurrency;\n    }\n    destroy(ref) {\n        this.remove(ref);\n        ref.destroy();\n    }\n}\n\nclass NodeHttp2ConnectionManager {\n    config;\n    connectionPools = new Map();\n    constructor(config) {\n        this.config = config;\n        if (this.config.maxConcurrency && this.config.maxConcurrency <= 0) {\n            throw new RangeError(\"maxConcurrency must be greater than zero.\");\n        }\n    }\n    lease(requestContext, connectionConfiguration) {\n        const url = this.getUrlString(requestContext);\n        const pool = this.getPool(url);\n        if (!this.config.disableConcurrency && !connectionConfiguration.isEventStream) {\n            const available = pool.poll();\n            if (available) {\n                available.retain();\n                return available;\n            }\n        }\n        const ref = new ClientHttp2SessionRef(http2.connect(url));\n        const session = ref.deref();\n        if (this.config.maxConcurrency) {\n            session.settings({ maxConcurrentStreams: this.config.maxConcurrency }, (err) => {\n                if (err) {\n                    throw new Error(\"Fail to set maxConcurrentStreams to \" +\n                        this.config.maxConcurrency +\n                        \"when creating new session for \" +\n                        requestContext.destination.toString());\n                }\n            });\n        }\n        const graceful = () => {\n            this.removeFromPoolAndClose(url, ref);\n        };\n        const ensureDestroyed = () => {\n            this.removeFromPoolAndCheckedDestroy(url, ref);\n        };\n        session.on(\"goaway\", graceful);\n        session.on(\"error\", ensureDestroyed);\n        session.on(\"frameError\", ensureDestroyed);\n        session.on(\"close\", ensureDestroyed);\n        if (connectionConfiguration.requestTimeout) {\n            session.setTimeout(connectionConfiguration.requestTimeout, ensureDestroyed);\n        }\n        pool.offerLast(ref);\n        ref.retain();\n        return ref;\n    }\n    release(_requestContext, ref) {\n        ref.free();\n    }\n    createIsolatedSession(requestContext, connectionConfiguration) {\n        const url = this.getUrlString(requestContext);\n        const ref = new ClientHttp2SessionRef(http2.connect(url));\n        const session = ref.deref();\n        session.settings({ maxConcurrentStreams: 1 });\n        const ensureDestroyed = () => {\n            ref.destroy();\n        };\n        session.on(\"error\", ensureDestroyed);\n        session.on(\"frameError\", ensureDestroyed);\n        session.on(\"close\", ensureDestroyed);\n        if (connectionConfiguration.requestTimeout) {\n            session.setTimeout(connectionConfiguration.requestTimeout, ensureDestroyed);\n        }\n        ref.retain();\n        return ref;\n    }\n    destroy() {\n        for (const [url, connectionPool] of this.connectionPools) {\n            for (const session of [...connectionPool]) {\n                session.destroy();\n            }\n            this.connectionPools.delete(url);\n        }\n    }\n    setMaxConcurrentStreams(maxConcurrentStreams) {\n        if (maxConcurrentStreams && maxConcurrentStreams <= 0) {\n            throw new RangeError(\"maxConcurrentStreams must be greater than zero.\");\n        }\n        this.config.maxConcurrency = maxConcurrentStreams;\n        for (const pool of this.connectionPools.values()) {\n            pool.setMaxConcurrency(maxConcurrentStreams);\n        }\n    }\n    setDisableConcurrentStreams(disableConcurrentStreams) {\n        this.config.disableConcurrency = disableConcurrentStreams;\n    }\n    debug() {\n        const pools = {};\n        for (const [url, pool] of this.connectionPools) {\n            const sessions = [];\n            for (const ref of pool) {\n                sessions.push({\n                    id: ref.id,\n                    active: ref.useCount(),\n                    maxConcurrent: ref.max,\n                    totalRequests: ref.total,\n                });\n            }\n            pools[url] = { sessions };\n        }\n        return pools;\n    }\n    removeFromPoolAndClose(authority, ref) {\n        this.connectionPools.get(authority)?.remove(ref);\n        ref.close();\n    }\n    removeFromPoolAndCheckedDestroy(authority, ref) {\n        this.connectionPools.get(authority)?.remove(ref);\n        ref.destroy();\n    }\n    getPool(url) {\n        if (!this.connectionPools.has(url)) {\n            const pool = new NodeHttp2ConnectionPool();\n            if (this.config.maxConcurrency) {\n                pool.setMaxConcurrency(this.config.maxConcurrency);\n            }\n            this.connectionPools.set(url, pool);\n        }\n        return this.connectionPools.get(url);\n    }\n    getUrlString(request) {\n        return request.destination.toString();\n    }\n}\n\nclass NodeHttp2Handler {\n    config;\n    configProvider;\n    metadata = { handlerProtocol: \"h2\" };\n    connectionManager = new NodeHttp2ConnectionManager({});\n    static create(instanceOrOptions) {\n        if (typeof instanceOrOptions?.handle === \"function\") {\n            return instanceOrOptions;\n        }\n        return new NodeHttp2Handler(instanceOrOptions);\n    }\n    constructor(options) {\n        this.configProvider = new Promise((resolve, reject) => {\n            if (typeof options === \"function\") {\n                options()\n                    .then((opts) => {\n                    resolve(opts || {});\n                })\n                    .catch(reject);\n            }\n            else {\n                resolve(options || {});\n            }\n        });\n    }\n    destroy() {\n        this.connectionManager.destroy();\n    }\n    async handle(request, { abortSignal, requestTimeout, isEventStream } = {}) {\n        if (!this.config) {\n            this.config = await this.configProvider;\n            const { disableConcurrentStreams, maxConcurrentStreams } = this.config;\n            this.connectionManager.setDisableConcurrentStreams(disableConcurrentStreams ?? false);\n            if (maxConcurrentStreams) {\n                this.connectionManager.setMaxConcurrentStreams(maxConcurrentStreams);\n            }\n        }\n        const { requestTimeout: configRequestTimeout, disableConcurrentStreams } = this.config;\n        const useIsolatedSession = disableConcurrentStreams || isEventStream;\n        const effectiveRequestTimeout = requestTimeout ?? configRequestTimeout;\n        return new Promise((_resolve, _reject) => {\n            let fulfilled = false;\n            let writeRequestBodyPromise = undefined;\n            const resolve = async (arg) => {\n                await writeRequestBodyPromise;\n                _resolve(arg);\n            };\n            const reject = async (arg) => {\n                await writeRequestBodyPromise;\n                _reject(arg);\n            };\n            if (abortSignal?.aborted) {\n                fulfilled = true;\n                const abortError = buildAbortError(abortSignal);\n                reject(abortError);\n                return;\n            }\n            const { hostname, method, port, protocol, query } = request;\n            let auth = \"\";\n            if (request.username != null || request.password != null) {\n                const username = request.username ?? \"\";\n                const password = request.password ?? \"\";\n                auth = `${username}:${password}@`;\n            }\n            const authority = `${protocol}//${auth}${hostname}${port ? `:${port}` : \"\"}`;\n            const requestContext = { destination: new URL(authority) };\n            const connectConfig = {\n                requestTimeout: this.config?.sessionTimeout,\n                isEventStream,\n            };\n            const ref = useIsolatedSession\n                ? this.connectionManager.createIsolatedSession(requestContext, connectConfig)\n                : this.connectionManager.lease(requestContext, connectConfig);\n            const session = ref.deref();\n            const rejectWithDestroy = (err) => {\n                if (useIsolatedSession) {\n                    ref.destroy();\n                }\n                fulfilled = true;\n                reject(err);\n            };\n            const queryString = querystringBuilder.buildQueryString(query ?? {});\n            let path = request.path;\n            if (queryString) {\n                path += `?${queryString}`;\n            }\n            if (request.fragment) {\n                path += `#${request.fragment}`;\n            }\n            const clientHttp2Stream = session.request({\n                ...request.headers,\n                [http2.constants.HTTP2_HEADER_PATH]: path,\n                [http2.constants.HTTP2_HEADER_METHOD]: method,\n            });\n            if (effectiveRequestTimeout) {\n                clientHttp2Stream.setTimeout(effectiveRequestTimeout, () => {\n                    clientHttp2Stream.close();\n                    const timeoutError = new Error(`Stream timed out because of no activity for ${effectiveRequestTimeout} ms`);\n                    timeoutError.name = \"TimeoutError\";\n                    rejectWithDestroy(timeoutError);\n                });\n            }\n            if (abortSignal) {\n                const onAbort = () => {\n                    clientHttp2Stream.close();\n                    const abortError = buildAbortError(abortSignal);\n                    rejectWithDestroy(abortError);\n                };\n                if (typeof abortSignal.addEventListener === \"function\") {\n                    const signal = abortSignal;\n                    signal.addEventListener(\"abort\", onAbort, { once: true });\n                    clientHttp2Stream.once(\"close\", () => signal.removeEventListener(\"abort\", onAbort));\n                }\n                else {\n                    abortSignal.onabort = onAbort;\n                }\n            }\n            clientHttp2Stream.on(\"frameError\", (type, code, id) => {\n                rejectWithDestroy(new Error(`Frame type id ${type} in stream id ${id} has failed with code ${code}.`));\n            });\n            clientHttp2Stream.on(\"error\", rejectWithDestroy);\n            clientHttp2Stream.on(\"aborted\", () => {\n                rejectWithDestroy(new Error(`HTTP/2 stream is abnormally aborted in mid-communication with result code ${clientHttp2Stream.rstCode}.`));\n            });\n            clientHttp2Stream.on(\"response\", (headers) => {\n                const httpResponse = new protocolHttp.HttpResponse({\n                    statusCode: headers[\":status\"] ?? -1,\n                    headers: getTransformedHeaders(headers),\n                    body: clientHttp2Stream,\n                });\n                fulfilled = true;\n                resolve({ response: httpResponse });\n                if (useIsolatedSession) {\n                    session.close();\n                }\n            });\n            clientHttp2Stream.on(\"close\", () => {\n                if (useIsolatedSession) {\n                    ref.destroy();\n                }\n                else {\n                    this.connectionManager.release(requestContext, ref);\n                }\n                if (!fulfilled) {\n                    rejectWithDestroy(new Error(\"Unexpected error: http2 request did not get a response\"));\n                }\n            });\n            writeRequestBodyPromise = writeRequestBody(clientHttp2Stream, request, effectiveRequestTimeout);\n        });\n    }\n    updateHttpClientConfig(key, value) {\n        this.config = undefined;\n        this.configProvider = this.configProvider.then((config) => {\n            return {\n                ...config,\n                [key]: value,\n            };\n        });\n    }\n    httpHandlerConfigs() {\n        return this.config ?? {};\n    }\n}\n\nclass Collector extends node_stream.Writable {\n    bufferedBytes = [];\n    _write(chunk, encoding, callback) {\n        this.bufferedBytes.push(chunk);\n        callback();\n    }\n}\n\nconst streamCollector = (stream) => {\n    if (isReadableStreamInstance(stream)) {\n        return collectReadableStream(stream);\n    }\n    return new Promise((resolve, reject) => {\n        const collector = new Collector();\n        stream.pipe(collector);\n        stream.on(\"error\", (err) => {\n            collector.end();\n            reject(err);\n        });\n        collector.on(\"error\", reject);\n        collector.on(\"finish\", function () {\n            const bytes = new Uint8Array(Buffer.concat(this.bufferedBytes));\n            resolve(bytes);\n        });\n    });\n};\nconst isReadableStreamInstance = (stream) => typeof ReadableStream === \"function\" && stream instanceof ReadableStream;\nasync function collectReadableStream(stream) {\n    const chunks = [];\n    const reader = stream.getReader();\n    let isDone = false;\n    let length = 0;\n    while (!isDone) {\n        const { done, value } = await reader.read();\n        if (value) {\n            chunks.push(value);\n            length += value.length;\n        }\n        isDone = done;\n    }\n    const collected = new Uint8Array(length);\n    let offset = 0;\n    for (const chunk of chunks) {\n        collected.set(chunk, offset);\n        offset += chunk.length;\n    }\n    return collected;\n}\n\nexports.DEFAULT_REQUEST_TIMEOUT = DEFAULT_REQUEST_TIMEOUT;\nexports.NodeHttp2Handler = NodeHttp2Handler;\nexports.NodeHttpHandler = NodeHttpHandler;\nexports.streamCollector = streamCollector;\n", "export const state = {\n    warningEmitted: false,\n};\nexport const emitWarningIfUnsupportedVersion = (version) => {\n    if (version && !state.warningEmitted && parseInt(version.substring(1, version.indexOf(\".\"))) < 20) {\n        state.warningEmitted = true;\n        process.emitWarning(`NodeDeprecationWarning: The AWS SDK for JavaScript (v3) will\nno longer support Node.js ${version} in January 2026.\n\nTo continue receiving updates to AWS services, bug fixes, and security\nupdates please upgrade to a supported Node.js LTS version.\n\nMore information can be found at: https://a.co/c895JFp`);\n    }\n};\n", "export const longPollMiddleware = () => (next, context) => async (args) => {\n    context.__retryLongPoll = true;\n    return next(args);\n};\nexport const longPollMiddlewareOptions = {\n    name: \"longPollMiddleware\",\n    tags: [\"RETRY\"],\n    step: \"initialize\",\n    override: true,\n};\nexport const getLongPollPlugin = (options) => ({\n    applyToStack: (clientStack) => {\n        clientStack.add(longPollMiddleware(), longPollMiddlewareOptions);\n    },\n});\n", "export function setCredentialFeature(credentials, feature, value) {\n    if (!credentials.$source) {\n        credentials.$source = {};\n    }\n    credentials.$source[feature] = value;\n    return credentials;\n}\n", "'use strict';\n\nconst CLOCK_SKEW_ERROR_CODES = [\n    \"AuthFailure\",\n    \"InvalidSignatureException\",\n    \"RequestExpired\",\n    \"RequestInTheFuture\",\n    \"RequestTimeTooSkewed\",\n    \"SignatureDoesNotMatch\",\n];\nconst THROTTLING_ERROR_CODES = [\n    \"BandwidthLimitExceeded\",\n    \"EC2ThrottledException\",\n    \"LimitExceededException\",\n    \"PriorRequestNotComplete\",\n    \"ProvisionedThroughputExceededException\",\n    \"RequestLimitExceeded\",\n    \"RequestThrottled\",\n    \"RequestThrottledException\",\n    \"SlowDown\",\n    \"ThrottledException\",\n    \"Throttling\",\n    \"ThrottlingException\",\n    \"TooManyRequestsException\",\n    \"TransactionInProgressException\",\n];\nconst TRANSIENT_ERROR_CODES = [\"TimeoutError\", \"RequestTimeout\", \"RequestTimeoutException\"];\nconst TRANSIENT_ERROR_STATUS_CODES = [500, 502, 503, 504];\nconst NODEJS_TIMEOUT_ERROR_CODES = [\"ECONNRESET\", \"ECONNREFUSED\", \"EPIPE\", \"ETIMEDOUT\"];\nconst NODEJS_NETWORK_ERROR_CODES = [\"EHOSTUNREACH\", \"ENETUNREACH\", \"ENOTFOUND\"];\n\nconst isRetryableByTrait = (error) => error?.$retryable !== undefined;\nconst isClockSkewError = (error) => CLOCK_SKEW_ERROR_CODES.includes(error.name);\nconst isClockSkewCorrectedError = (error) => error.$metadata?.clockSkewCorrected;\nconst isBrowserNetworkError = (error) => {\n    const errorMessages = new Set([\n        \"Failed to fetch\",\n        \"NetworkError when attempting to fetch resource\",\n        \"The Internet connection appears to be offline\",\n        \"Load failed\",\n        \"Network request failed\",\n    ]);\n    const isValid = error && error instanceof TypeError;\n    if (!isValid) {\n        return false;\n    }\n    return errorMessages.has(error.message);\n};\nconst isThrottlingError = (error) => error.$metadata?.httpStatusCode === 429 ||\n    THROTTLING_ERROR_CODES.includes(error.name) ||\n    error.$retryable?.throttling == true;\nconst isTransientError = (error, depth = 0) => isRetryableByTrait(error) ||\n    isClockSkewCorrectedError(error) ||\n    TRANSIENT_ERROR_CODES.includes(error.name) ||\n    NODEJS_TIMEOUT_ERROR_CODES.includes(error?.code || \"\") ||\n    NODEJS_NETWORK_ERROR_CODES.includes(error?.code || \"\") ||\n    TRANSIENT_ERROR_STATUS_CODES.includes(error.$metadata?.httpStatusCode || 0) ||\n    isBrowserNetworkError(error) ||\n    isNodeJsHttp2TransientError(error) ||\n    (error.cause !== undefined && depth <= 10 && isTransientError(error.cause, depth + 1));\nconst isServerError = (error) => {\n    if (error.$metadata?.httpStatusCode !== undefined) {\n        const statusCode = error.$metadata.httpStatusCode;\n        if (500 <= statusCode && statusCode <= 599 && !isTransientError(error)) {\n            return true;\n        }\n        return false;\n    }\n    return false;\n};\nfunction isNodeJsHttp2TransientError(error) {\n    return error.code === \"ERR_HTTP2_STREAM_ERROR\" && error.message.includes(\"NGHTTP2_REFUSED_STREAM\");\n}\n\nexports.isBrowserNetworkError = isBrowserNetworkError;\nexports.isClockSkewCorrectedError = isClockSkewCorrectedError;\nexports.isClockSkewError = isClockSkewError;\nexports.isNodeJsHttp2TransientError = isNodeJsHttp2TransientError;\nexports.isRetryableByTrait = isRetryableByTrait;\nexports.isServerError = isServerError;\nexports.isThrottlingError = isThrottlingError;\nexports.isTransientError = isTransientError;\n", "'use strict';\n\nvar serviceErrorClassification = require('@smithy/service-error-classification');\n\nexports.RETRY_MODES = void 0;\n(function (RETRY_MODES) {\n    RETRY_MODES[\"STANDARD\"] = \"standard\";\n    RETRY_MODES[\"ADAPTIVE\"] = \"adaptive\";\n})(exports.RETRY_MODES || (exports.RETRY_MODES = {}));\nconst DEFAULT_MAX_ATTEMPTS = 3;\nconst DEFAULT_RETRY_MODE = exports.RETRY_MODES.STANDARD;\n\nclass DefaultRateLimiter {\n    static setTimeoutFn = setTimeout;\n    beta;\n    minCapacity;\n    minFillRate;\n    scaleConstant;\n    smooth;\n    enabled = false;\n    availableTokens = 0;\n    lastMaxRate = 0;\n    measuredTxRate = 0;\n    requestCount = 0;\n    fillRate;\n    lastThrottleTime;\n    lastTimestamp = 0;\n    lastTxRateBucket;\n    maxCapacity;\n    timeWindow = 0;\n    constructor(options) {\n        this.beta = options?.beta ?? 0.7;\n        this.minCapacity = options?.minCapacity ?? 1;\n        this.minFillRate = options?.minFillRate ?? 0.5;\n        this.scaleConstant = options?.scaleConstant ?? 0.4;\n        this.smooth = options?.smooth ?? 0.8;\n        this.lastThrottleTime = this.getCurrentTimeInSeconds();\n        this.lastTxRateBucket = Math.floor(this.getCurrentTimeInSeconds());\n        this.fillRate = this.minFillRate;\n        this.maxCapacity = this.minCapacity;\n    }\n    async getSendToken() {\n        return this.acquireTokenBucket(1);\n    }\n    updateClientSendingRate(response) {\n        let calculatedRate;\n        this.updateMeasuredRate();\n        const retryErrorInfo = response;\n        const isThrottling = retryErrorInfo?.errorType === \"THROTTLING\" || serviceErrorClassification.isThrottlingError(retryErrorInfo?.error ?? response);\n        if (isThrottling) {\n            const rateToUse = !this.enabled ? this.measuredTxRate : Math.min(this.measuredTxRate, this.fillRate);\n            this.lastMaxRate = rateToUse;\n            this.calculateTimeWindow();\n            this.lastThrottleTime = this.getCurrentTimeInSeconds();\n            calculatedRate = this.cubicThrottle(rateToUse);\n            this.enableTokenBucket();\n        }\n        else {\n            this.calculateTimeWindow();\n            calculatedRate = this.cubicSuccess(this.getCurrentTimeInSeconds());\n        }\n        const newRate = Math.min(calculatedRate, 2 * this.measuredTxRate);\n        this.updateTokenBucketRate(newRate);\n    }\n    getCurrentTimeInSeconds() {\n        return Date.now() / 1000;\n    }\n    async acquireTokenBucket(amount) {\n        if (!this.enabled) {\n            return;\n        }\n        this.refillTokenBucket();\n        if (amount > this.availableTokens) {\n            const delay = ((amount - this.availableTokens) / this.fillRate) * 1000;\n            await new Promise((resolve) => DefaultRateLimiter.setTimeoutFn(resolve, delay));\n        }\n        this.availableTokens = this.availableTokens - amount;\n    }\n    refillTokenBucket() {\n        const timestamp = this.getCurrentTimeInSeconds();\n        if (!this.lastTimestamp) {\n            this.lastTimestamp = timestamp;\n            return;\n        }\n        const fillAmount = (timestamp - this.lastTimestamp) * this.fillRate;\n        this.availableTokens = Math.min(this.maxCapacity, this.availableTokens + fillAmount);\n        this.lastTimestamp = timestamp;\n    }\n    calculateTimeWindow() {\n        this.timeWindow = this.getPrecise(Math.pow((this.lastMaxRate * (1 - this.beta)) / this.scaleConstant, 1 / 3));\n    }\n    cubicThrottle(rateToUse) {\n        return this.getPrecise(rateToUse * this.beta);\n    }\n    cubicSuccess(timestamp) {\n        return this.getPrecise(this.scaleConstant * Math.pow(timestamp - this.lastThrottleTime - this.timeWindow, 3) + this.lastMaxRate);\n    }\n    enableTokenBucket() {\n        this.enabled = true;\n    }\n    updateTokenBucketRate(newRate) {\n        this.refillTokenBucket();\n        this.fillRate = Math.max(newRate, this.minFillRate);\n        this.maxCapacity = Math.max(newRate, this.minCapacity);\n        this.availableTokens = Math.min(this.availableTokens, this.maxCapacity);\n    }\n    updateMeasuredRate() {\n        const t = this.getCurrentTimeInSeconds();\n        const timeBucket = Math.floor(t * 2) / 2;\n        this.requestCount++;\n        if (timeBucket > this.lastTxRateBucket) {\n            const currentRate = this.requestCount / (timeBucket - this.lastTxRateBucket);\n            this.measuredTxRate = this.getPrecise(currentRate * this.smooth + this.measuredTxRate * (1 - this.smooth));\n            this.requestCount = 0;\n            this.lastTxRateBucket = timeBucket;\n        }\n    }\n    getPrecise(num) {\n        return parseFloat(num.toFixed(8));\n    }\n}\n\nconst DEFAULT_RETRY_DELAY_BASE = 100;\nconst MAXIMUM_RETRY_DELAY = 20 * 1000;\nconst THROTTLING_RETRY_DELAY_BASE = 500;\nconst INITIAL_RETRY_TOKENS = 500;\nconst RETRY_COST = 5;\nconst TIMEOUT_RETRY_COST = 10;\nconst NO_RETRY_INCREMENT = 1;\nconst INVOCATION_ID_HEADER = \"amz-sdk-invocation-id\";\nconst REQUEST_HEADER = \"amz-sdk-request\";\n\nclass Retry {\n    static v2026 = typeof process !== \"undefined\" && process.env?.SMITHY_NEW_RETRIES_2026 === \"true\";\n    static delay() {\n        return Retry.v2026 ? 50 : 100;\n    }\n    static throttlingDelay() {\n        return Retry.v2026 ? 1_000 : 500;\n    }\n    static cost() {\n        return Retry.v2026 ? 14 : 5;\n    }\n    static throttlingCost() {\n        return Retry.v2026 ? 5 : 10;\n    }\n    static modifiedCostType() {\n        return Retry.v2026 ? \"THROTTLING\" : \"TRANSIENT\";\n    }\n}\n\nclass DefaultRetryBackoffStrategy {\n    x = Retry.delay();\n    computeNextBackoffDelay(i) {\n        const b = Math.random();\n        const r = 2;\n        const t_i = b * Math.min(this.x * r ** i, MAXIMUM_RETRY_DELAY);\n        return Math.floor(t_i);\n    }\n    setDelayBase(delay) {\n        this.x = delay;\n    }\n}\n\nclass DefaultRetryToken {\n    delay;\n    count;\n    cost;\n    longPoll;\n    constructor(delay, count, cost, longPoll) {\n        this.delay = delay;\n        this.count = count;\n        this.cost = cost;\n        this.longPoll = longPoll;\n    }\n    getRetryCount() {\n        return this.count;\n    }\n    getRetryDelay() {\n        return Math.min(MAXIMUM_RETRY_DELAY, this.delay);\n    }\n    getRetryCost() {\n        return this.cost;\n    }\n    isLongPoll() {\n        return this.longPoll;\n    }\n}\n\nconst refusal = {\n    incompatible: 1,\n    attempts: 2,\n    capacity: 3,\n};\nclass StandardRetryStrategy {\n    mode = exports.RETRY_MODES.STANDARD;\n    capacity = INITIAL_RETRY_TOKENS;\n    retryBackoffStrategy;\n    maxAttemptsProvider;\n    baseDelay;\n    constructor(arg1) {\n        if (typeof arg1 === \"number\") {\n            this.maxAttemptsProvider = async () => arg1;\n        }\n        else if (typeof arg1 === \"function\") {\n            this.maxAttemptsProvider = arg1;\n        }\n        else if (arg1 && typeof arg1 === \"object\") {\n            this.maxAttemptsProvider = async () => arg1.maxAttempts;\n            this.baseDelay = arg1.baseDelay;\n            this.retryBackoffStrategy = arg1.backoff;\n        }\n        this.maxAttemptsProvider ??= async () => DEFAULT_MAX_ATTEMPTS;\n        this.baseDelay ??= Retry.delay();\n        this.retryBackoffStrategy ??= new DefaultRetryBackoffStrategy();\n    }\n    async acquireInitialRetryToken(retryTokenScope) {\n        return new DefaultRetryToken(Retry.delay(), 0, undefined, Retry.v2026 && retryTokenScope.includes(\":longpoll\"));\n    }\n    async refreshRetryTokenForRetry(token, errorInfo) {\n        const maxAttempts = await this.getMaxAttempts();\n        const retryCode = this.retryCode(token, errorInfo, maxAttempts);\n        const shouldRetry = retryCode === 0;\n        const isLongPoll = token.isLongPoll?.();\n        if (shouldRetry || isLongPoll) {\n            const errorType = errorInfo.errorType;\n            this.retryBackoffStrategy.setDelayBase(errorType === \"THROTTLING\" ? Retry.throttlingDelay() : this.baseDelay);\n            const delayFromErrorType = this.retryBackoffStrategy.computeNextBackoffDelay(token.getRetryCount());\n            let retryDelay = delayFromErrorType;\n            if (errorInfo.retryAfterHint instanceof Date) {\n                retryDelay = Math.max(delayFromErrorType, Math.min(errorInfo.retryAfterHint.getTime() - Date.now(), delayFromErrorType + 5_000));\n            }\n            if (!shouldRetry) {\n                throw Object.assign(new Error(\"No retry token available\"), {\n                    $backoff: Retry.v2026 && retryCode === refusal.capacity && isLongPoll ? retryDelay : 0,\n                });\n            }\n            else {\n                const capacityCost = this.getCapacityCost(errorType);\n                this.capacity -= capacityCost;\n                return new DefaultRetryToken(retryDelay, token.getRetryCount() + 1, capacityCost, token.isLongPoll?.() ?? false);\n            }\n        }\n        throw new Error(\"No retry token available\");\n    }\n    recordSuccess(token) {\n        this.capacity = Math.min(INITIAL_RETRY_TOKENS, this.capacity + (token.getRetryCost() ?? NO_RETRY_INCREMENT));\n    }\n    getCapacity() {\n        return this.capacity;\n    }\n    async maxAttempts() {\n        return this.maxAttemptsProvider();\n    }\n    async getMaxAttempts() {\n        try {\n            return await this.maxAttemptsProvider();\n        }\n        catch (error) {\n            console.warn(`Max attempts provider could not resolve. Using default of ${DEFAULT_MAX_ATTEMPTS}`);\n            return DEFAULT_MAX_ATTEMPTS;\n        }\n    }\n    retryCode(tokenToRenew, errorInfo, maxAttempts) {\n        const attempts = tokenToRenew.getRetryCount() + 1;\n        const retryableStatus = this.isRetryableError(errorInfo.errorType) ? 0 : refusal.incompatible;\n        const attemptStatus = attempts < maxAttempts ? 0 : refusal.attempts;\n        const capacityStatus = this.capacity >= this.getCapacityCost(errorInfo.errorType) ? 0 : refusal.capacity;\n        return retryableStatus || attemptStatus || capacityStatus;\n    }\n    getCapacityCost(errorType) {\n        return errorType === Retry.modifiedCostType() ? Retry.throttlingCost() : Retry.cost();\n    }\n    isRetryableError(errorType) {\n        return errorType === \"THROTTLING\" || errorType === \"TRANSIENT\";\n    }\n}\n\nclass AdaptiveRetryStrategy {\n    mode = exports.RETRY_MODES.ADAPTIVE;\n    rateLimiter;\n    standardRetryStrategy;\n    constructor(maxAttemptsProvider, options) {\n        const { rateLimiter } = options ?? {};\n        this.rateLimiter = rateLimiter ?? new DefaultRateLimiter();\n        this.standardRetryStrategy = options\n            ? new StandardRetryStrategy({\n                maxAttempts: typeof maxAttemptsProvider === \"number\" ? maxAttemptsProvider : 3,\n                ...options,\n            })\n            : new StandardRetryStrategy(maxAttemptsProvider);\n    }\n    async acquireInitialRetryToken(retryTokenScope) {\n        await this.rateLimiter.getSendToken();\n        return this.standardRetryStrategy.acquireInitialRetryToken(retryTokenScope);\n    }\n    async refreshRetryTokenForRetry(tokenToRenew, errorInfo) {\n        this.rateLimiter.updateClientSendingRate(errorInfo);\n        return this.standardRetryStrategy.refreshRetryTokenForRetry(tokenToRenew, errorInfo);\n    }\n    recordSuccess(token) {\n        this.rateLimiter.updateClientSendingRate({});\n        this.standardRetryStrategy.recordSuccess(token);\n    }\n    async maxAttemptsProvider() {\n        return this.standardRetryStrategy.maxAttempts();\n    }\n}\n\nclass ConfiguredRetryStrategy extends StandardRetryStrategy {\n    computeNextBackoffDelay;\n    constructor(maxAttempts, computeNextBackoffDelay = Retry.delay()) {\n        super(typeof maxAttempts === \"function\" ? maxAttempts : async () => maxAttempts);\n        if (typeof computeNextBackoffDelay === \"number\") {\n            this.computeNextBackoffDelay = () => computeNextBackoffDelay;\n        }\n        else {\n            this.computeNextBackoffDelay = computeNextBackoffDelay;\n        }\n    }\n    async refreshRetryTokenForRetry(tokenToRenew, errorInfo) {\n        const token = await super.refreshRetryTokenForRetry(tokenToRenew, errorInfo);\n        token.getRetryDelay = () => this.computeNextBackoffDelay(token.getRetryCount());\n        return token;\n    }\n}\n\nexports.AdaptiveRetryStrategy = AdaptiveRetryStrategy;\nexports.ConfiguredRetryStrategy = ConfiguredRetryStrategy;\nexports.DEFAULT_MAX_ATTEMPTS = DEFAULT_MAX_ATTEMPTS;\nexports.DEFAULT_RETRY_DELAY_BASE = DEFAULT_RETRY_DELAY_BASE;\nexports.DEFAULT_RETRY_MODE = DEFAULT_RETRY_MODE;\nexports.DefaultRateLimiter = DefaultRateLimiter;\nexports.INITIAL_RETRY_TOKENS = INITIAL_RETRY_TOKENS;\nexports.INVOCATION_ID_HEADER = INVOCATION_ID_HEADER;\nexports.MAXIMUM_RETRY_DELAY = MAXIMUM_RETRY_DELAY;\nexports.NO_RETRY_INCREMENT = NO_RETRY_INCREMENT;\nexports.REQUEST_HEADER = REQUEST_HEADER;\nexports.RETRY_COST = RETRY_COST;\nexports.Retry = Retry;\nexports.StandardRetryStrategy = StandardRetryStrategy;\nexports.THROTTLING_RETRY_DELAY_BASE = THROTTLING_RETRY_DELAY_BASE;\nexports.TIMEOUT_RETRY_COST = TIMEOUT_RETRY_COST;\n", "import { Retry } from \"@smithy/util-retry\";\nRetry.v2026 ||= typeof process === \"object\" && process.env?.AWS_NEW_RETRIES_2026 === \"true\";\nexport function setFeature(context, feature, value) {\n    if (!context.__aws_sdk_context) {\n        context.__aws_sdk_context = {\n            features: {},\n        };\n    }\n    else if (!context.__aws_sdk_context.features) {\n        context.__aws_sdk_context.features = {};\n    }\n    context.__aws_sdk_context.features[feature] = value;\n}\n", "export function setTokenFeature(token, feature, value) {\n    if (!token.$source) {\n        token.$source = {};\n    }\n    token.$source[feature] = value;\n    return token;\n}\n", "export * from \"./emitWarningIfUnsupportedVersion\";\nexport { getLongPollPlugin } from \"./longPollMiddleware\";\nexport * from \"./setCredentialFeature\";\nexport * from \"./setFeature\";\nexport * from \"./setTokenFeature\";\n", "'use strict';\n\nclass ProviderError extends Error {\n    name = \"ProviderError\";\n    tryNextLink;\n    constructor(message, options = true) {\n        let logger;\n        let tryNextLink = true;\n        if (typeof options === \"boolean\") {\n            logger = undefined;\n            tryNextLink = options;\n        }\n        else if (options != null && typeof options === \"object\") {\n            logger = options.logger;\n            tryNextLink = options.tryNextLink ?? true;\n        }\n        super(message);\n        this.tryNextLink = tryNextLink;\n        Object.setPrototypeOf(this, ProviderError.prototype);\n        logger?.debug?.(`@smithy/property-provider ${tryNextLink ? \"->\" : \"(!)\"} ${message}`);\n    }\n    static from(error, options = true) {\n        return Object.assign(new this(error.message, options), error);\n    }\n}\n\nclass CredentialsProviderError extends ProviderError {\n    name = \"CredentialsProviderError\";\n    constructor(message, options = true) {\n        super(message, options);\n        Object.setPrototypeOf(this, CredentialsProviderError.prototype);\n    }\n}\n\nclass TokenProviderError extends ProviderError {\n    name = \"TokenProviderError\";\n    constructor(message, options = true) {\n        super(message, options);\n        Object.setPrototypeOf(this, TokenProviderError.prototype);\n    }\n}\n\nconst chain = (...providers) => async () => {\n    if (providers.length === 0) {\n        throw new ProviderError(\"No providers in chain\");\n    }\n    let lastProviderError;\n    for (const provider of providers) {\n        try {\n            const credentials = await provider();\n            return credentials;\n        }\n        catch (err) {\n            lastProviderError = err;\n            if (err?.tryNextLink) {\n                continue;\n            }\n            throw err;\n        }\n    }\n    throw lastProviderError;\n};\n\nconst fromStatic = (staticValue) => () => Promise.resolve(staticValue);\n\nconst memoize = (provider, isExpired, requiresRefresh) => {\n    let resolved;\n    let pending;\n    let hasResult;\n    let isConstant = false;\n    const coalesceProvider = async () => {\n        if (!pending) {\n            pending = provider();\n        }\n        try {\n            resolved = await pending;\n            hasResult = true;\n            isConstant = false;\n        }\n        finally {\n            pending = undefined;\n        }\n        return resolved;\n    };\n    if (isExpired === undefined) {\n        return async (options) => {\n            if (!hasResult || options?.forceRefresh) {\n                resolved = await coalesceProvider();\n            }\n            return resolved;\n        };\n    }\n    return async (options) => {\n        if (!hasResult || options?.forceRefresh) {\n            resolved = await coalesceProvider();\n        }\n        if (isConstant) {\n            return resolved;\n        }\n        if (requiresRefresh && !requiresRefresh(resolved)) {\n            isConstant = true;\n            return resolved;\n        }\n        if (isExpired(resolved)) {\n            await coalesceProvider();\n            return resolved;\n        }\n        return resolved;\n    };\n};\n\nexports.CredentialsProviderError = CredentialsProviderError;\nexports.ProviderError = ProviderError;\nexports.TokenProviderError = TokenProviderError;\nexports.chain = chain;\nexports.fromStatic = fromStatic;\nexports.memoize = memoize;\n", "'use strict';\n\nvar client = require('@aws-sdk/core/client');\nvar propertyProvider = require('@smithy/property-provider');\n\nconst ENV_KEY = \"AWS_ACCESS_KEY_ID\";\nconst ENV_SECRET = \"AWS_SECRET_ACCESS_KEY\";\nconst ENV_SESSION = \"AWS_SESSION_TOKEN\";\nconst ENV_EXPIRATION = \"AWS_CREDENTIAL_EXPIRATION\";\nconst ENV_CREDENTIAL_SCOPE = \"AWS_CREDENTIAL_SCOPE\";\nconst ENV_ACCOUNT_ID = \"AWS_ACCOUNT_ID\";\nconst fromEnv = (init) => async () => {\n    init?.logger?.debug(\"@aws-sdk/credential-provider-env - fromEnv\");\n    const accessKeyId = process.env[ENV_KEY];\n    const secretAccessKey = process.env[ENV_SECRET];\n    const sessionToken = process.env[ENV_SESSION];\n    const expiry = process.env[ENV_EXPIRATION];\n    const credentialScope = process.env[ENV_CREDENTIAL_SCOPE];\n    const accountId = process.env[ENV_ACCOUNT_ID];\n    if (accessKeyId && secretAccessKey) {\n        const credentials = {\n            accessKeyId,\n            secretAccessKey,\n            ...(sessionToken && { sessionToken }),\n            ...(expiry && { expiration: new Date(expiry) }),\n            ...(credentialScope && { credentialScope }),\n            ...(accountId && { accountId }),\n        };\n        client.setCredentialFeature(credentials, \"CREDENTIALS_ENV_VARS\", \"g\");\n        return credentials;\n    }\n    throw new propertyProvider.CredentialsProviderError(\"Unable to find environment variable credentials.\", { logger: init?.logger });\n};\n\nexports.ENV_ACCOUNT_ID = ENV_ACCOUNT_ID;\nexports.ENV_CREDENTIAL_SCOPE = ENV_CREDENTIAL_SCOPE;\nexports.ENV_EXPIRATION = ENV_EXPIRATION;\nexports.ENV_KEY = ENV_KEY;\nexports.ENV_SECRET = ENV_SECRET;\nexports.ENV_SESSION = ENV_SESSION;\nexports.fromEnv = fromEnv;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getHomeDir = void 0;\nconst os_1 = require(\"os\");\nconst path_1 = require(\"path\");\nconst homeDirCache = {};\nconst getHomeDirCacheKey = () => {\n    if (process && process.geteuid) {\n        return `${process.geteuid()}`;\n    }\n    return \"DEFAULT\";\n};\nconst getHomeDir = () => {\n    const { HOME, USERPROFILE, HOMEPATH, HOMEDRIVE = `C:${path_1.sep}` } = process.env;\n    if (HOME)\n        return HOME;\n    if (USERPROFILE)\n        return USERPROFILE;\n    if (HOMEPATH)\n        return `${HOMEDRIVE}${HOMEPATH}`;\n    const homeDirCacheKey = getHomeDirCacheKey();\n    if (!homeDirCache[homeDirCacheKey])\n        homeDirCache[homeDirCacheKey] = (0, os_1.homedir)();\n    return homeDirCache[homeDirCacheKey];\n};\nexports.getHomeDir = getHomeDir;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getSSOTokenFilepath = void 0;\nconst crypto_1 = require(\"crypto\");\nconst path_1 = require(\"path\");\nconst getHomeDir_1 = require(\"./getHomeDir\");\nconst getSSOTokenFilepath = (id) => {\n    const hasher = (0, crypto_1.createHash)(\"sha1\");\n    const cacheName = hasher.update(id).digest(\"hex\");\n    return (0, path_1.join)((0, getHomeDir_1.getHomeDir)(), \".aws\", \"sso\", \"cache\", `${cacheName}.json`);\n};\nexports.getSSOTokenFilepath = getSSOTokenFilepath;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getSSOTokenFromFile = exports.tokenIntercept = void 0;\nconst promises_1 = require(\"fs/promises\");\nconst getSSOTokenFilepath_1 = require(\"./getSSOTokenFilepath\");\nexports.tokenIntercept = {};\nconst getSSOTokenFromFile = async (id) => {\n    if (exports.tokenIntercept[id]) {\n        return exports.tokenIntercept[id];\n    }\n    const ssoTokenFilepath = (0, getSSOTokenFilepath_1.getSSOTokenFilepath)(id);\n    const ssoTokenText = await (0, promises_1.readFile)(ssoTokenFilepath, \"utf8\");\n    return JSON.parse(ssoTokenText);\n};\nexports.getSSOTokenFromFile = getSSOTokenFromFile;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.readFile = exports.fileIntercept = exports.filePromises = void 0;\nconst promises_1 = require(\"node:fs/promises\");\nexports.filePromises = {};\nexports.fileIntercept = {};\nconst readFile = (path, options) => {\n    if (exports.fileIntercept[path] !== undefined) {\n        return exports.fileIntercept[path];\n    }\n    if (!exports.filePromises[path] || options?.ignoreCache) {\n        exports.filePromises[path] = (0, promises_1.readFile)(path, \"utf8\");\n    }\n    return exports.filePromises[path];\n};\nexports.readFile = readFile;\n", "'use strict';\n\nvar getHomeDir = require('./getHomeDir');\nvar getSSOTokenFilepath = require('./getSSOTokenFilepath');\nvar getSSOTokenFromFile = require('./getSSOTokenFromFile');\nvar path = require('path');\nvar types = require('@smithy/types');\nvar readFile = require('./readFile');\n\nconst ENV_PROFILE = \"AWS_PROFILE\";\nconst DEFAULT_PROFILE = \"default\";\nconst getProfileName = (init) => init.profile || process.env[ENV_PROFILE] || DEFAULT_PROFILE;\n\nconst CONFIG_PREFIX_SEPARATOR = \".\";\n\nconst getConfigData = (data) => Object.entries(data)\n    .filter(([key]) => {\n    const indexOfSeparator = key.indexOf(CONFIG_PREFIX_SEPARATOR);\n    if (indexOfSeparator === -1) {\n        return false;\n    }\n    return Object.values(types.IniSectionType).includes(key.substring(0, indexOfSeparator));\n})\n    .reduce((acc, [key, value]) => {\n    const indexOfSeparator = key.indexOf(CONFIG_PREFIX_SEPARATOR);\n    const updatedKey = key.substring(0, indexOfSeparator) === types.IniSectionType.PROFILE ? key.substring(indexOfSeparator + 1) : key;\n    acc[updatedKey] = value;\n    return acc;\n}, {\n    ...(data.default && { default: data.default }),\n});\n\nconst ENV_CONFIG_PATH = \"AWS_CONFIG_FILE\";\nconst getConfigFilepath = () => process.env[ENV_CONFIG_PATH] || path.join(getHomeDir.getHomeDir(), \".aws\", \"config\");\n\nconst ENV_CREDENTIALS_PATH = \"AWS_SHARED_CREDENTIALS_FILE\";\nconst getCredentialsFilepath = () => process.env[ENV_CREDENTIALS_PATH] || path.join(getHomeDir.getHomeDir(), \".aws\", \"credentials\");\n\nconst prefixKeyRegex = /^([\\w-]+)\\s([\"'])?([\\w-@\\+\\.%:/]+)\\2$/;\nconst profileNameBlockList = [\"__proto__\", \"profile __proto__\"];\nconst parseIni = (iniData) => {\n    const map = {};\n    let currentSection;\n    let currentSubSection;\n    for (const iniLine of iniData.split(/\\r?\\n/)) {\n        const trimmedLine = iniLine.split(/(^|\\s)[;#]/)[0].trim();\n        const isSection = trimmedLine[0] === \"[\" && trimmedLine[trimmedLine.length - 1] === \"]\";\n        if (isSection) {\n            currentSection = undefined;\n            currentSubSection = undefined;\n            const sectionName = trimmedLine.substring(1, trimmedLine.length - 1);\n            const matches = prefixKeyRegex.exec(sectionName);\n            if (matches) {\n                const [, prefix, , name] = matches;\n                if (Object.values(types.IniSectionType).includes(prefix)) {\n                    currentSection = [prefix, name].join(CONFIG_PREFIX_SEPARATOR);\n                }\n            }\n            else {\n                currentSection = sectionName;\n            }\n            if (profileNameBlockList.includes(sectionName)) {\n                throw new Error(`Found invalid profile name \"${sectionName}\"`);\n            }\n        }\n        else if (currentSection) {\n            const indexOfEqualsSign = trimmedLine.indexOf(\"=\");\n            if (![0, -1].includes(indexOfEqualsSign)) {\n                const [name, value] = [\n                    trimmedLine.substring(0, indexOfEqualsSign).trim(),\n                    trimmedLine.substring(indexOfEqualsSign + 1).trim(),\n                ];\n                if (value === \"\") {\n                    currentSubSection = name;\n                }\n                else {\n                    if (currentSubSection && iniLine.trimStart() === iniLine) {\n                        currentSubSection = undefined;\n                    }\n                    map[currentSection] = map[currentSection] || {};\n                    const key = currentSubSection ? [currentSubSection, name].join(CONFIG_PREFIX_SEPARATOR) : name;\n                    map[currentSection][key] = value;\n                }\n            }\n        }\n    }\n    return map;\n};\n\nconst swallowError$1 = () => ({});\nconst loadSharedConfigFiles = async (init = {}) => {\n    const { filepath = getCredentialsFilepath(), configFilepath = getConfigFilepath() } = init;\n    const homeDir = getHomeDir.getHomeDir();\n    const relativeHomeDirPrefix = \"~/\";\n    let resolvedFilepath = filepath;\n    if (filepath.startsWith(relativeHomeDirPrefix)) {\n        resolvedFilepath = path.join(homeDir, filepath.slice(2));\n    }\n    let resolvedConfigFilepath = configFilepath;\n    if (configFilepath.startsWith(relativeHomeDirPrefix)) {\n        resolvedConfigFilepath = path.join(homeDir, configFilepath.slice(2));\n    }\n    const parsedFiles = await Promise.all([\n        readFile.readFile(resolvedConfigFilepath, {\n            ignoreCache: init.ignoreCache,\n        })\n            .then(parseIni)\n            .then(getConfigData)\n            .catch(swallowError$1),\n        readFile.readFile(resolvedFilepath, {\n            ignoreCache: init.ignoreCache,\n        })\n            .then(parseIni)\n            .catch(swallowError$1),\n    ]);\n    return {\n        configFile: parsedFiles[0],\n        credentialsFile: parsedFiles[1],\n    };\n};\n\nconst getSsoSessionData = (data) => Object.entries(data)\n    .filter(([key]) => key.startsWith(types.IniSectionType.SSO_SESSION + CONFIG_PREFIX_SEPARATOR))\n    .reduce((acc, [key, value]) => ({ ...acc, [key.substring(key.indexOf(CONFIG_PREFIX_SEPARATOR) + 1)]: value }), {});\n\nconst swallowError = () => ({});\nconst loadSsoSessionData = async (init = {}) => readFile.readFile(init.configFilepath ?? getConfigFilepath())\n    .then(parseIni)\n    .then(getSsoSessionData)\n    .catch(swallowError);\n\nconst mergeConfigFiles = (...files) => {\n    const merged = {};\n    for (const file of files) {\n        for (const [key, values] of Object.entries(file)) {\n            if (merged[key] !== undefined) {\n                Object.assign(merged[key], values);\n            }\n            else {\n                merged[key] = values;\n            }\n        }\n    }\n    return merged;\n};\n\nconst parseKnownFiles = async (init) => {\n    const parsedFiles = await loadSharedConfigFiles(init);\n    return mergeConfigFiles(parsedFiles.configFile, parsedFiles.credentialsFile);\n};\n\nconst externalDataInterceptor = {\n    getFileRecord() {\n        return readFile.fileIntercept;\n    },\n    interceptFile(path, contents) {\n        readFile.fileIntercept[path] = Promise.resolve(contents);\n    },\n    getTokenRecord() {\n        return getSSOTokenFromFile.tokenIntercept;\n    },\n    interceptToken(id, contents) {\n        getSSOTokenFromFile.tokenIntercept[id] = contents;\n    },\n};\n\nexports.getSSOTokenFromFile = getSSOTokenFromFile.getSSOTokenFromFile;\nexports.readFile = readFile.readFile;\nexports.CONFIG_PREFIX_SEPARATOR = CONFIG_PREFIX_SEPARATOR;\nexports.DEFAULT_PROFILE = DEFAULT_PROFILE;\nexports.ENV_PROFILE = ENV_PROFILE;\nexports.externalDataInterceptor = externalDataInterceptor;\nexports.getProfileName = getProfileName;\nexports.loadSharedConfigFiles = loadSharedConfigFiles;\nexports.loadSsoSessionData = loadSsoSessionData;\nexports.parseKnownFiles = parseKnownFiles;\nObject.prototype.hasOwnProperty.call(getHomeDir, '__proto__') &&\n    !Object.prototype.hasOwnProperty.call(exports, '__proto__') &&\n    Object.defineProperty(exports, '__proto__', {\n        enumerable: true,\n        value: getHomeDir['__proto__']\n    });\n\nObject.keys(getHomeDir).forEach(function (k) {\n    if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) exports[k] = getHomeDir[k];\n});\nObject.prototype.hasOwnProperty.call(getSSOTokenFilepath, '__proto__') &&\n    !Object.prototype.hasOwnProperty.call(exports, '__proto__') &&\n    Object.defineProperty(exports, '__proto__', {\n        enumerable: true,\n        value: getSSOTokenFilepath['__proto__']\n    });\n\nObject.keys(getSSOTokenFilepath).forEach(function (k) {\n    if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) exports[k] = getSSOTokenFilepath[k];\n});\n", "'use strict';\n\nvar propertyProvider = require('@smithy/property-provider');\nvar sharedIniFileLoader = require('@smithy/shared-ini-file-loader');\n\nfunction getSelectorName(functionString) {\n    try {\n        const constants = new Set(Array.from(functionString.match(/([A-Z_]){3,}/g) ?? []));\n        constants.delete(\"CONFIG\");\n        constants.delete(\"CONFIG_PREFIX_SEPARATOR\");\n        constants.delete(\"ENV\");\n        return [...constants].join(\", \");\n    }\n    catch (e) {\n        return functionString;\n    }\n}\n\nconst fromEnv = (envVarSelector, options) => async () => {\n    try {\n        const config = envVarSelector(process.env, options);\n        if (config === undefined) {\n            throw new Error();\n        }\n        return config;\n    }\n    catch (e) {\n        throw new propertyProvider.CredentialsProviderError(e.message || `Not found in ENV: ${getSelectorName(envVarSelector.toString())}`, { logger: options?.logger });\n    }\n};\n\nconst fromSharedConfigFiles = (configSelector, { preferredFile = \"config\", ...init } = {}) => async () => {\n    const profile = sharedIniFileLoader.getProfileName(init);\n    const { configFile, credentialsFile } = await sharedIniFileLoader.loadSharedConfigFiles(init);\n    const profileFromCredentials = credentialsFile[profile] || {};\n    const profileFromConfig = configFile[profile] || {};\n    const mergedProfile = preferredFile === \"config\"\n        ? { ...profileFromCredentials, ...profileFromConfig }\n        : { ...profileFromConfig, ...profileFromCredentials };\n    try {\n        const cfgFile = preferredFile === \"config\" ? configFile : credentialsFile;\n        const configValue = configSelector(mergedProfile, cfgFile);\n        if (configValue === undefined) {\n            throw new Error();\n        }\n        return configValue;\n    }\n    catch (e) {\n        throw new propertyProvider.CredentialsProviderError(e.message || `Not found in config files w/ profile [${profile}]: ${getSelectorName(configSelector.toString())}`, { logger: init.logger });\n    }\n};\n\nconst isFunction = (func) => typeof func === \"function\";\nconst fromStatic = (defaultValue) => isFunction(defaultValue) ? async () => await defaultValue() : propertyProvider.fromStatic(defaultValue);\n\nconst loadConfig = ({ environmentVariableSelector, configFileSelector, default: defaultValue }, configuration = {}) => {\n    const { signingName, logger } = configuration;\n    const envOptions = { signingName, logger };\n    return propertyProvider.memoize(propertyProvider.chain(fromEnv(environmentVariableSelector, envOptions), fromSharedConfigFiles(configFileSelector, configuration), fromStatic(defaultValue)));\n};\n\nexports.loadConfig = loadConfig;\n", "'use strict';\n\nfunction parseQueryString(querystring) {\n    const query = {};\n    querystring = querystring.replace(/^\\?/, \"\");\n    if (querystring) {\n        for (const pair of querystring.split(\"&\")) {\n            let [key, value = null] = pair.split(\"=\");\n            key = decodeURIComponent(key);\n            if (value) {\n                value = decodeURIComponent(value);\n            }\n            if (!(key in query)) {\n                query[key] = value;\n            }\n            else if (Array.isArray(query[key])) {\n                query[key].push(value);\n            }\n            else {\n                query[key] = [query[key], value];\n            }\n        }\n    }\n    return query;\n}\n\nexports.parseQueryString = parseQueryString;\n", "'use strict';\n\nvar querystringParser = require('@smithy/querystring-parser');\n\nconst parseUrl = (url) => {\n    if (typeof url === \"string\") {\n        return parseUrl(new URL(url));\n    }\n    const { hostname, pathname, port, protocol, search } = url;\n    let query;\n    if (search) {\n        query = querystringParser.parseQueryString(search);\n    }\n    return {\n        hostname,\n        port: port ? parseInt(port) : undefined,\n        protocol,\n        path: pathname,\n        query,\n    };\n};\n\nexports.parseUrl = parseUrl;\n", "'use strict';\n\nvar propertyProvider = require('@smithy/property-provider');\nvar url = require('url');\nvar buffer = require('buffer');\nvar http = require('http');\nvar nodeConfigProvider = require('@smithy/node-config-provider');\nvar urlParser = require('@smithy/url-parser');\n\nfunction httpRequest(options) {\n    return new Promise((resolve, reject) => {\n        const req = http.request({\n            method: \"GET\",\n            ...options,\n            hostname: options.hostname?.replace(/^\\[(.+)\\]$/, \"$1\"),\n        });\n        req.on(\"error\", (err) => {\n            reject(Object.assign(new propertyProvider.ProviderError(\"Unable to connect to instance metadata service\"), err));\n            req.destroy();\n        });\n        req.on(\"timeout\", () => {\n            reject(new propertyProvider.ProviderError(\"TimeoutError from instance metadata service\"));\n            req.destroy();\n        });\n        req.on(\"response\", (res) => {\n            const { statusCode = 400 } = res;\n            if (statusCode < 200 || 300 <= statusCode) {\n                reject(Object.assign(new propertyProvider.ProviderError(\"Error response received from instance metadata service\"), { statusCode }));\n                req.destroy();\n            }\n            const chunks = [];\n            res.on(\"data\", (chunk) => {\n                chunks.push(chunk);\n            });\n            res.on(\"end\", () => {\n                resolve(buffer.Buffer.concat(chunks));\n                req.destroy();\n            });\n        });\n        req.end();\n    });\n}\n\nconst isImdsCredentials = (arg) => Boolean(arg) &&\n    typeof arg === \"object\" &&\n    typeof arg.AccessKeyId === \"string\" &&\n    typeof arg.SecretAccessKey === \"string\" &&\n    typeof arg.Token === \"string\" &&\n    typeof arg.Expiration === \"string\";\nconst fromImdsCredentials = (creds) => ({\n    accessKeyId: creds.AccessKeyId,\n    secretAccessKey: creds.SecretAccessKey,\n    sessionToken: creds.Token,\n    expiration: new Date(creds.Expiration),\n    ...(creds.AccountId && { accountId: creds.AccountId }),\n});\n\nconst DEFAULT_TIMEOUT = 1000;\nconst DEFAULT_MAX_RETRIES = 0;\nconst providerConfigFromInit = ({ maxRetries = DEFAULT_MAX_RETRIES, timeout = DEFAULT_TIMEOUT, }) => ({ maxRetries, timeout });\n\nconst retry = (toRetry, maxRetries) => {\n    let promise = toRetry();\n    for (let i = 0; i < maxRetries; i++) {\n        promise = promise.catch(toRetry);\n    }\n    return promise;\n};\n\nconst ENV_CMDS_FULL_URI = \"AWS_CONTAINER_CREDENTIALS_FULL_URI\";\nconst ENV_CMDS_RELATIVE_URI = \"AWS_CONTAINER_CREDENTIALS_RELATIVE_URI\";\nconst ENV_CMDS_AUTH_TOKEN = \"AWS_CONTAINER_AUTHORIZATION_TOKEN\";\nconst fromContainerMetadata = (init = {}) => {\n    const { timeout, maxRetries } = providerConfigFromInit(init);\n    return () => retry(async () => {\n        const requestOptions = await getCmdsUri({ logger: init.logger });\n        const credsResponse = JSON.parse(await requestFromEcsImds(timeout, requestOptions));\n        if (!isImdsCredentials(credsResponse)) {\n            throw new propertyProvider.CredentialsProviderError(\"Invalid response received from instance metadata service.\", {\n                logger: init.logger,\n            });\n        }\n        return fromImdsCredentials(credsResponse);\n    }, maxRetries);\n};\nconst requestFromEcsImds = async (timeout, options) => {\n    if (process.env[ENV_CMDS_AUTH_TOKEN]) {\n        options.headers = {\n            ...options.headers,\n            Authorization: process.env[ENV_CMDS_AUTH_TOKEN],\n        };\n    }\n    const buffer = await httpRequest({\n        ...options,\n        timeout,\n    });\n    return buffer.toString();\n};\nconst CMDS_IP = \"169.254.170.2\";\nconst GREENGRASS_HOSTS = {\n    localhost: true,\n    \"127.0.0.1\": true,\n};\nconst GREENGRASS_PROTOCOLS = {\n    \"http:\": true,\n    \"https:\": true,\n};\nconst getCmdsUri = async ({ logger }) => {\n    if (process.env[ENV_CMDS_RELATIVE_URI]) {\n        return {\n            hostname: CMDS_IP,\n            path: process.env[ENV_CMDS_RELATIVE_URI],\n        };\n    }\n    if (process.env[ENV_CMDS_FULL_URI]) {\n        const parsed = url.parse(process.env[ENV_CMDS_FULL_URI]);\n        if (!parsed.hostname || !(parsed.hostname in GREENGRASS_HOSTS)) {\n            throw new propertyProvider.CredentialsProviderError(`${parsed.hostname} is not a valid container metadata service hostname`, {\n                tryNextLink: false,\n                logger,\n            });\n        }\n        if (!parsed.protocol || !(parsed.protocol in GREENGRASS_PROTOCOLS)) {\n            throw new propertyProvider.CredentialsProviderError(`${parsed.protocol} is not a valid container metadata service protocol`, {\n                tryNextLink: false,\n                logger,\n            });\n        }\n        return {\n            ...parsed,\n            port: parsed.port ? parseInt(parsed.port, 10) : undefined,\n        };\n    }\n    throw new propertyProvider.CredentialsProviderError(\"The container metadata credential provider cannot be used unless\" +\n        ` the ${ENV_CMDS_RELATIVE_URI} or ${ENV_CMDS_FULL_URI} environment` +\n        \" variable is set\", {\n        tryNextLink: false,\n        logger,\n    });\n};\n\nclass InstanceMetadataV1FallbackError extends propertyProvider.CredentialsProviderError {\n    tryNextLink;\n    name = \"InstanceMetadataV1FallbackError\";\n    constructor(message, tryNextLink = true) {\n        super(message, tryNextLink);\n        this.tryNextLink = tryNextLink;\n        Object.setPrototypeOf(this, InstanceMetadataV1FallbackError.prototype);\n    }\n}\n\nexports.Endpoint = void 0;\n(function (Endpoint) {\n    Endpoint[\"IPv4\"] = \"http://169.254.169.254\";\n    Endpoint[\"IPv6\"] = \"http://[fd00:ec2::254]\";\n})(exports.Endpoint || (exports.Endpoint = {}));\n\nconst ENV_ENDPOINT_NAME = \"AWS_EC2_METADATA_SERVICE_ENDPOINT\";\nconst CONFIG_ENDPOINT_NAME = \"ec2_metadata_service_endpoint\";\nconst ENDPOINT_CONFIG_OPTIONS = {\n    environmentVariableSelector: (env) => env[ENV_ENDPOINT_NAME],\n    configFileSelector: (profile) => profile[CONFIG_ENDPOINT_NAME],\n    default: undefined,\n};\n\nvar EndpointMode;\n(function (EndpointMode) {\n    EndpointMode[\"IPv4\"] = \"IPv4\";\n    EndpointMode[\"IPv6\"] = \"IPv6\";\n})(EndpointMode || (EndpointMode = {}));\n\nconst ENV_ENDPOINT_MODE_NAME = \"AWS_EC2_METADATA_SERVICE_ENDPOINT_MODE\";\nconst CONFIG_ENDPOINT_MODE_NAME = \"ec2_metadata_service_endpoint_mode\";\nconst ENDPOINT_MODE_CONFIG_OPTIONS = {\n    environmentVariableSelector: (env) => env[ENV_ENDPOINT_MODE_NAME],\n    configFileSelector: (profile) => profile[CONFIG_ENDPOINT_MODE_NAME],\n    default: EndpointMode.IPv4,\n};\n\nconst getInstanceMetadataEndpoint = async () => urlParser.parseUrl((await getFromEndpointConfig()) || (await getFromEndpointModeConfig()));\nconst getFromEndpointConfig = async () => nodeConfigProvider.loadConfig(ENDPOINT_CONFIG_OPTIONS)();\nconst getFromEndpointModeConfig = async () => {\n    const endpointMode = await nodeConfigProvider.loadConfig(ENDPOINT_MODE_CONFIG_OPTIONS)();\n    switch (endpointMode) {\n        case EndpointMode.IPv4:\n            return exports.Endpoint.IPv4;\n        case EndpointMode.IPv6:\n            return exports.Endpoint.IPv6;\n        default:\n            throw new Error(`Unsupported endpoint mode: ${endpointMode}.` + ` Select from ${Object.values(EndpointMode)}`);\n    }\n};\n\nconst STATIC_STABILITY_REFRESH_INTERVAL_SECONDS = 5 * 60;\nconst STATIC_STABILITY_REFRESH_INTERVAL_JITTER_WINDOW_SECONDS = 5 * 60;\nconst STATIC_STABILITY_DOC_URL = \"https://docs.aws.amazon.com/sdkref/latest/guide/feature-static-credentials.html\";\nconst getExtendedInstanceMetadataCredentials = (credentials, logger) => {\n    const refreshInterval = STATIC_STABILITY_REFRESH_INTERVAL_SECONDS +\n        Math.floor(Math.random() * STATIC_STABILITY_REFRESH_INTERVAL_JITTER_WINDOW_SECONDS);\n    const newExpiration = new Date(Date.now() + refreshInterval * 1000);\n    logger.warn(\"Attempting credential expiration extension due to a credential service availability issue. A refresh of these \" +\n        `credentials will be attempted after ${new Date(newExpiration)}.\\nFor more information, please visit: ` +\n        STATIC_STABILITY_DOC_URL);\n    const originalExpiration = credentials.originalExpiration ?? credentials.expiration;\n    return {\n        ...credentials,\n        ...(originalExpiration ? { originalExpiration } : {}),\n        expiration: newExpiration,\n    };\n};\n\nconst staticStabilityProvider = (provider, options = {}) => {\n    const logger = options?.logger || console;\n    let pastCredentials;\n    return async () => {\n        let credentials;\n        try {\n            credentials = await provider();\n            if (credentials.expiration && credentials.expiration.getTime() < Date.now()) {\n                credentials = getExtendedInstanceMetadataCredentials(credentials, logger);\n            }\n        }\n        catch (e) {\n            if (pastCredentials) {\n                logger.warn(\"Credential renew failed: \", e);\n                credentials = getExtendedInstanceMetadataCredentials(pastCredentials, logger);\n            }\n            else {\n                throw e;\n            }\n        }\n        pastCredentials = credentials;\n        return credentials;\n    };\n};\n\nconst IMDS_PATH = \"/latest/meta-data/iam/security-credentials/\";\nconst IMDS_TOKEN_PATH = \"/latest/api/token\";\nconst AWS_EC2_METADATA_V1_DISABLED = \"AWS_EC2_METADATA_V1_DISABLED\";\nconst PROFILE_AWS_EC2_METADATA_V1_DISABLED = \"ec2_metadata_v1_disabled\";\nconst X_AWS_EC2_METADATA_TOKEN = \"x-aws-ec2-metadata-token\";\nconst fromInstanceMetadata = (init = {}) => staticStabilityProvider(getInstanceMetadataProvider(init), { logger: init.logger });\nconst getInstanceMetadataProvider = (init = {}) => {\n    let disableFetchToken = false;\n    const { logger, profile } = init;\n    const { timeout, maxRetries } = providerConfigFromInit(init);\n    const getCredentials = async (maxRetries, options) => {\n        const isImdsV1Fallback = disableFetchToken || options.headers?.[X_AWS_EC2_METADATA_TOKEN] == null;\n        if (isImdsV1Fallback) {\n            let fallbackBlockedFromProfile = false;\n            let fallbackBlockedFromProcessEnv = false;\n            const configValue = await nodeConfigProvider.loadConfig({\n                environmentVariableSelector: (env) => {\n                    const envValue = env[AWS_EC2_METADATA_V1_DISABLED];\n                    fallbackBlockedFromProcessEnv = !!envValue && envValue !== \"false\";\n                    if (envValue === undefined) {\n                        throw new propertyProvider.CredentialsProviderError(`${AWS_EC2_METADATA_V1_DISABLED} not set in env, checking config file next.`, { logger: init.logger });\n                    }\n                    return fallbackBlockedFromProcessEnv;\n                },\n                configFileSelector: (profile) => {\n                    const profileValue = profile[PROFILE_AWS_EC2_METADATA_V1_DISABLED];\n                    fallbackBlockedFromProfile = !!profileValue && profileValue !== \"false\";\n                    return fallbackBlockedFromProfile;\n                },\n                default: false,\n            }, {\n                profile,\n            })();\n            if (init.ec2MetadataV1Disabled || configValue) {\n                const causes = [];\n                if (init.ec2MetadataV1Disabled)\n                    causes.push(\"credential provider initialization (runtime option ec2MetadataV1Disabled)\");\n                if (fallbackBlockedFromProfile)\n                    causes.push(`config file profile (${PROFILE_AWS_EC2_METADATA_V1_DISABLED})`);\n                if (fallbackBlockedFromProcessEnv)\n                    causes.push(`process environment variable (${AWS_EC2_METADATA_V1_DISABLED})`);\n                throw new InstanceMetadataV1FallbackError(`AWS EC2 Metadata v1 fallback has been blocked by AWS SDK configuration in the following: [${causes.join(\", \")}].`);\n            }\n        }\n        const imdsProfile = (await retry(async () => {\n            let profile;\n            try {\n                profile = await getProfile(options);\n            }\n            catch (err) {\n                if (err.statusCode === 401) {\n                    disableFetchToken = false;\n                }\n                throw err;\n            }\n            return profile;\n        }, maxRetries)).trim();\n        return retry(async () => {\n            let creds;\n            try {\n                creds = await getCredentialsFromProfile(imdsProfile, options, init);\n            }\n            catch (err) {\n                if (err.statusCode === 401) {\n                    disableFetchToken = false;\n                }\n                throw err;\n            }\n            return creds;\n        }, maxRetries);\n    };\n    return async () => {\n        const endpoint = await getInstanceMetadataEndpoint();\n        if (disableFetchToken) {\n            logger?.debug(\"AWS SDK Instance Metadata\", \"using v1 fallback (no token fetch)\");\n            return getCredentials(maxRetries, { ...endpoint, timeout });\n        }\n        else {\n            let token;\n            try {\n                token = (await getMetadataToken({ ...endpoint, timeout })).toString();\n            }\n            catch (error) {\n                if (error?.statusCode === 400) {\n                    throw Object.assign(error, {\n                        message: \"EC2 Metadata token request returned error\",\n                    });\n                }\n                else if (error.message === \"TimeoutError\" || [403, 404, 405].includes(error.statusCode)) {\n                    disableFetchToken = true;\n                }\n                logger?.debug(\"AWS SDK Instance Metadata\", \"using v1 fallback (initial)\");\n                return getCredentials(maxRetries, { ...endpoint, timeout });\n            }\n            return getCredentials(maxRetries, {\n                ...endpoint,\n                headers: {\n                    [X_AWS_EC2_METADATA_TOKEN]: token,\n                },\n                timeout,\n            });\n        }\n    };\n};\nconst getMetadataToken = async (options) => httpRequest({\n    ...options,\n    path: IMDS_TOKEN_PATH,\n    method: \"PUT\",\n    headers: {\n        \"x-aws-ec2-metadata-token-ttl-seconds\": \"21600\",\n    },\n});\nconst getProfile = async (options) => (await httpRequest({ ...options, path: IMDS_PATH })).toString();\nconst getCredentialsFromProfile = async (profile, options, init) => {\n    const credentialsResponse = JSON.parse((await httpRequest({\n        ...options,\n        path: IMDS_PATH + profile,\n    })).toString());\n    if (!isImdsCredentials(credentialsResponse)) {\n        throw new propertyProvider.CredentialsProviderError(\"Invalid response received from instance metadata service.\", {\n            logger: init.logger,\n        });\n    }\n    return fromImdsCredentials(credentialsResponse);\n};\n\nexports.DEFAULT_MAX_RETRIES = DEFAULT_MAX_RETRIES;\nexports.DEFAULT_TIMEOUT = DEFAULT_TIMEOUT;\nexports.ENV_CMDS_AUTH_TOKEN = ENV_CMDS_AUTH_TOKEN;\nexports.ENV_CMDS_FULL_URI = ENV_CMDS_FULL_URI;\nexports.ENV_CMDS_RELATIVE_URI = ENV_CMDS_RELATIVE_URI;\nexports.fromContainerMetadata = fromContainerMetadata;\nexports.fromInstanceMetadata = fromInstanceMetadata;\nexports.getInstanceMetadataEndpoint = getInstanceMetadataEndpoint;\nexports.httpRequest = httpRequest;\nexports.providerConfigFromInit = providerConfigFromInit;\n", "/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n  extendStatics = Object.setPrototypeOf ||\n      ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n      function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n  return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n  if (typeof b !== \"function\" && b !== null)\n      throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n  extendStatics(d, b);\n  function __() { this.constructor = d; }\n  d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n  __assign = Object.assign || function __assign(t) {\n      for (var s, i = 1, n = arguments.length; i < n; i++) {\n          s = arguments[i];\n          for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n      }\n      return t;\n  }\n  return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n  var t = {};\n  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n      t[p] = s[p];\n  if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n      for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n          if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n              t[p[i]] = s[p[i]];\n      }\n  return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n  if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n  return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n  return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n  function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n  var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n  var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n  var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n  var _, done = false;\n  for (var i = decorators.length - 1; i >= 0; i--) {\n      var context = {};\n      for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n      for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n      context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n      var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n      if (kind === \"accessor\") {\n          if (result === void 0) continue;\n          if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n          if (_ = accept(result.get)) descriptor.get = _;\n          if (_ = accept(result.set)) descriptor.set = _;\n          if (_ = accept(result.init)) initializers.unshift(_);\n      }\n      else if (_ = accept(result)) {\n          if (kind === \"field\") initializers.unshift(_);\n          else descriptor[key] = _;\n      }\n  }\n  if (target) Object.defineProperty(target, contextIn.name, descriptor);\n  done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n  var useValue = arguments.length > 2;\n  for (var i = 0; i < initializers.length; i++) {\n      value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n  }\n  return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n  return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n  if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n  return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n  if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n  return new (P || (P = Promise))(function (resolve, reject) {\n      function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n      function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n      function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n  });\n}\n\nexport function __generator(thisArg, body) {\n  var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n  return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n  function verb(n) { return function (v) { return step([n, v]); }; }\n  function step(op) {\n      if (f) throw new TypeError(\"Generator is already executing.\");\n      while (g && (g = 0, op[0] && (_ = 0)), _) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n              case 0: case 1: t = op; break;\n              case 4: _.label++; return { value: op[1], done: false };\n              case 5: _.label++; y = op[1]; op = [0]; continue;\n              case 7: op = _.ops.pop(); _.trys.pop(); continue;\n              default:\n                  if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n                  if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n                  if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n                  if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n                  if (t[2]) _.ops.pop();\n                  _.trys.pop(); continue;\n          }\n          op = body.call(thisArg, _);\n      } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n      if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n  }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n  if (k2 === undefined) k2 = k;\n  var desc = Object.getOwnPropertyDescriptor(m, k);\n  if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n      desc = { enumerable: true, get: function() { return m[k]; } };\n  }\n  Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n  if (k2 === undefined) k2 = k;\n  o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n  for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n  var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n  if (m) return m.call(o);\n  if (o && typeof o.length === \"number\") return {\n      next: function () {\n          if (o && i >= o.length) o = void 0;\n          return { value: o && o[i++], done: !o };\n      }\n  };\n  throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n  var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n  if (!m) return o;\n  var i = m.call(o), r, ar = [], e;\n  try {\n      while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n  }\n  catch (error) { e = { error: error }; }\n  finally {\n      try {\n          if (r && !r.done && (m = i[\"return\"])) m.call(i);\n      }\n      finally { if (e) throw e.error; }\n  }\n  return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n  for (var ar = [], i = 0; i < arguments.length; i++)\n      ar = ar.concat(__read(arguments[i]));\n  return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n  for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n  for (var r = Array(s), k = 0, i = 0; i < il; i++)\n      for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n          r[k] = a[j];\n  return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n  if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n      if (ar || !(i in from)) {\n          if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n          ar[i] = from[i];\n      }\n  }\n  return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n  return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n  if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n  var g = generator.apply(thisArg, _arguments || []), i, q = [];\n  return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n  function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n  function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n  function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n  function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n  function fulfill(value) { resume(\"next\", value); }\n  function reject(value) { resume(\"throw\", value); }\n  function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n  var i, p;\n  return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n  function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n  if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n  var m = o[Symbol.asyncIterator], i;\n  return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n  function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n  function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n  if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n  return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n  Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n  o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n  ownKeys = Object.getOwnPropertyNames || function (o) {\n    var ar = [];\n    for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n    return ar;\n  };\n  return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n  if (mod && mod.__esModule) return mod;\n  var result = {};\n  if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n  __setModuleDefault(result, mod);\n  return result;\n}\n\nexport function __importDefault(mod) {\n  return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n  if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n  if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n  return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n  if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n  if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n  if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n  return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n  if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n  return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n  if (value !== null && value !== void 0) {\n    if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n    var dispose, inner;\n    if (async) {\n      if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n      dispose = value[Symbol.asyncDispose];\n    }\n    if (dispose === void 0) {\n      if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n      dispose = value[Symbol.dispose];\n      if (async) inner = dispose;\n    }\n    if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n    if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n    env.stack.push({ value: value, dispose: dispose, async: async });\n  }\n  else if (async) {\n    env.stack.push({ async: true });\n  }\n  return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n  var e = new Error(message);\n  return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n  function fail(e) {\n    env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n    env.hasError = true;\n  }\n  var r, s = 0;\n  function next() {\n    while (r = env.stack.pop()) {\n      try {\n        if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n        if (r.dispose) {\n          var result = r.dispose.call(r.value);\n          if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n        }\n        else s |= 1;\n      }\n      catch (e) {\n        fail(e);\n      }\n    }\n    if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n    if (env.hasError) throw env.error;\n  }\n  return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n  if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n      return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n          return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n      });\n  }\n  return path;\n}\n\nexport default {\n  __extends,\n  __assign,\n  __rest,\n  __decorate,\n  __param,\n  __esDecorate,\n  __runInitializers,\n  __propKey,\n  __setFunctionName,\n  __metadata,\n  __awaiter,\n  __generator,\n  __createBinding,\n  __exportStar,\n  __values,\n  __read,\n  __spread,\n  __spreadArrays,\n  __spreadArray,\n  __await,\n  __asyncGenerator,\n  __asyncDelegator,\n  __asyncValues,\n  __makeTemplateObject,\n  __importStar,\n  __importDefault,\n  __classPrivateFieldGet,\n  __classPrivateFieldSet,\n  __classPrivateFieldIn,\n  __addDisposableResource,\n  __disposeResources,\n  __rewriteRelativeImportExtension,\n};\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.checkUrl = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst LOOPBACK_CIDR_IPv4 = \"127.0.0.0/8\";\nconst LOOPBACK_CIDR_IPv6 = \"::1/128\";\nconst ECS_CONTAINER_HOST = \"169.254.170.2\";\nconst EKS_CONTAINER_HOST_IPv4 = \"169.254.170.23\";\nconst EKS_CONTAINER_HOST_IPv6 = \"[fd00:ec2::23]\";\nconst checkUrl = (url, logger) => {\n    if (url.protocol === \"https:\") {\n        return;\n    }\n    if (url.hostname === ECS_CONTAINER_HOST ||\n        url.hostname === EKS_CONTAINER_HOST_IPv4 ||\n        url.hostname === EKS_CONTAINER_HOST_IPv6) {\n        return;\n    }\n    if (url.hostname.includes(\"[\")) {\n        if (url.hostname === \"[::1]\" || url.hostname === \"[0000:0000:0000:0000:0000:0000:0000:0001]\") {\n            return;\n        }\n    }\n    else {\n        if (url.hostname === \"localhost\") {\n            return;\n        }\n        const ipComponents = url.hostname.split(\".\");\n        const inRange = (component) => {\n            const num = parseInt(component, 10);\n            return 0 <= num && num <= 255;\n        };\n        if (ipComponents[0] === \"127\" &&\n            inRange(ipComponents[1]) &&\n            inRange(ipComponents[2]) &&\n            inRange(ipComponents[3]) &&\n            ipComponents.length === 4) {\n            return;\n        }\n    }\n    throw new property_provider_1.CredentialsProviderError(`URL not accepted. It must either be HTTPS or match one of the following:\n  - loopback CIDR 127.0.0.0/8 or [::1/128]\n  - ECS container host 169.254.170.2\n  - EKS container host 169.254.170.23 or [fd00:ec2::23]`, { logger });\n};\nexports.checkUrl = checkUrl;\n", "'use strict';\n\nconst getAllAliases = (name, aliases) => {\n    const _aliases = [];\n    if (name) {\n        _aliases.push(name);\n    }\n    if (aliases) {\n        for (const alias of aliases) {\n            _aliases.push(alias);\n        }\n    }\n    return _aliases;\n};\nconst getMiddlewareNameWithAliases = (name, aliases) => {\n    return `${name || \"anonymous\"}${aliases && aliases.length > 0 ? ` (a.k.a. ${aliases.join(\",\")})` : \"\"}`;\n};\nconst constructStack = () => {\n    let absoluteEntries = [];\n    let relativeEntries = [];\n    let identifyOnResolve = false;\n    const entriesNameSet = new Set();\n    const sort = (entries) => entries.sort((a, b) => stepWeights[b.step] - stepWeights[a.step] ||\n        priorityWeights[b.priority || \"normal\"] - priorityWeights[a.priority || \"normal\"]);\n    const removeByName = (toRemove) => {\n        let isRemoved = false;\n        const filterCb = (entry) => {\n            const aliases = getAllAliases(entry.name, entry.aliases);\n            if (aliases.includes(toRemove)) {\n                isRemoved = true;\n                for (const alias of aliases) {\n                    entriesNameSet.delete(alias);\n                }\n                return false;\n            }\n            return true;\n        };\n        absoluteEntries = absoluteEntries.filter(filterCb);\n        relativeEntries = relativeEntries.filter(filterCb);\n        return isRemoved;\n    };\n    const removeByReference = (toRemove) => {\n        let isRemoved = false;\n        const filterCb = (entry) => {\n            if (entry.middleware === toRemove) {\n                isRemoved = true;\n                for (const alias of getAllAliases(entry.name, entry.aliases)) {\n                    entriesNameSet.delete(alias);\n                }\n                return false;\n            }\n            return true;\n        };\n        absoluteEntries = absoluteEntries.filter(filterCb);\n        relativeEntries = relativeEntries.filter(filterCb);\n        return isRemoved;\n    };\n    const cloneTo = (toStack) => {\n        absoluteEntries.forEach((entry) => {\n            toStack.add(entry.middleware, { ...entry });\n        });\n        relativeEntries.forEach((entry) => {\n            toStack.addRelativeTo(entry.middleware, { ...entry });\n        });\n        toStack.identifyOnResolve?.(stack.identifyOnResolve());\n        return toStack;\n    };\n    const expandRelativeMiddlewareList = (from) => {\n        const expandedMiddlewareList = [];\n        from.before.forEach((entry) => {\n            if (entry.before.length === 0 && entry.after.length === 0) {\n                expandedMiddlewareList.push(entry);\n            }\n            else {\n                expandedMiddlewareList.push(...expandRelativeMiddlewareList(entry));\n            }\n        });\n        expandedMiddlewareList.push(from);\n        from.after.reverse().forEach((entry) => {\n            if (entry.before.length === 0 && entry.after.length === 0) {\n                expandedMiddlewareList.push(entry);\n            }\n            else {\n                expandedMiddlewareList.push(...expandRelativeMiddlewareList(entry));\n            }\n        });\n        return expandedMiddlewareList;\n    };\n    const getMiddlewareList = (debug = false) => {\n        const normalizedAbsoluteEntries = [];\n        const normalizedRelativeEntries = [];\n        const normalizedEntriesNameMap = {};\n        absoluteEntries.forEach((entry) => {\n            const normalizedEntry = {\n                ...entry,\n                before: [],\n                after: [],\n            };\n            for (const alias of getAllAliases(normalizedEntry.name, normalizedEntry.aliases)) {\n                normalizedEntriesNameMap[alias] = normalizedEntry;\n            }\n            normalizedAbsoluteEntries.push(normalizedEntry);\n        });\n        relativeEntries.forEach((entry) => {\n            const normalizedEntry = {\n                ...entry,\n                before: [],\n                after: [],\n            };\n            for (const alias of getAllAliases(normalizedEntry.name, normalizedEntry.aliases)) {\n                normalizedEntriesNameMap[alias] = normalizedEntry;\n            }\n            normalizedRelativeEntries.push(normalizedEntry);\n        });\n        normalizedRelativeEntries.forEach((entry) => {\n            if (entry.toMiddleware) {\n                const toMiddleware = normalizedEntriesNameMap[entry.toMiddleware];\n                if (toMiddleware === undefined) {\n                    if (debug) {\n                        return;\n                    }\n                    throw new Error(`${entry.toMiddleware} is not found when adding ` +\n                        `${getMiddlewareNameWithAliases(entry.name, entry.aliases)} ` +\n                        `middleware ${entry.relation} ${entry.toMiddleware}`);\n                }\n                if (entry.relation === \"after\") {\n                    toMiddleware.after.push(entry);\n                }\n                if (entry.relation === \"before\") {\n                    toMiddleware.before.push(entry);\n                }\n            }\n        });\n        const mainChain = sort(normalizedAbsoluteEntries)\n            .map(expandRelativeMiddlewareList)\n            .reduce((wholeList, expandedMiddlewareList) => {\n            wholeList.push(...expandedMiddlewareList);\n            return wholeList;\n        }, []);\n        return mainChain;\n    };\n    const stack = {\n        add: (middleware, options = {}) => {\n            const { name, override, aliases: _aliases } = options;\n            const entry = {\n                step: \"initialize\",\n                priority: \"normal\",\n                middleware,\n                ...options,\n            };\n            const aliases = getAllAliases(name, _aliases);\n            if (aliases.length > 0) {\n                if (aliases.some((alias) => entriesNameSet.has(alias))) {\n                    if (!override)\n                        throw new Error(`Duplicate middleware name '${getMiddlewareNameWithAliases(name, _aliases)}'`);\n                    for (const alias of aliases) {\n                        const toOverrideIndex = absoluteEntries.findIndex((entry) => entry.name === alias || entry.aliases?.some((a) => a === alias));\n                        if (toOverrideIndex === -1) {\n                            continue;\n                        }\n                        const toOverride = absoluteEntries[toOverrideIndex];\n                        if (toOverride.step !== entry.step || entry.priority !== toOverride.priority) {\n                            throw new Error(`\"${getMiddlewareNameWithAliases(toOverride.name, toOverride.aliases)}\" middleware with ` +\n                                `${toOverride.priority} priority in ${toOverride.step} step cannot ` +\n                                `be overridden by \"${getMiddlewareNameWithAliases(name, _aliases)}\" middleware with ` +\n                                `${entry.priority} priority in ${entry.step} step.`);\n                        }\n                        absoluteEntries.splice(toOverrideIndex, 1);\n                    }\n                }\n                for (const alias of aliases) {\n                    entriesNameSet.add(alias);\n                }\n            }\n            absoluteEntries.push(entry);\n        },\n        addRelativeTo: (middleware, options) => {\n            const { name, override, aliases: _aliases } = options;\n            const entry = {\n                middleware,\n                ...options,\n            };\n            const aliases = getAllAliases(name, _aliases);\n            if (aliases.length > 0) {\n                if (aliases.some((alias) => entriesNameSet.has(alias))) {\n                    if (!override)\n                        throw new Error(`Duplicate middleware name '${getMiddlewareNameWithAliases(name, _aliases)}'`);\n                    for (const alias of aliases) {\n                        const toOverrideIndex = relativeEntries.findIndex((entry) => entry.name === alias || entry.aliases?.some((a) => a === alias));\n                        if (toOverrideIndex === -1) {\n                            continue;\n                        }\n                        const toOverride = relativeEntries[toOverrideIndex];\n                        if (toOverride.toMiddleware !== entry.toMiddleware || toOverride.relation !== entry.relation) {\n                            throw new Error(`\"${getMiddlewareNameWithAliases(toOverride.name, toOverride.aliases)}\" middleware ` +\n                                `${toOverride.relation} \"${toOverride.toMiddleware}\" middleware cannot be overridden ` +\n                                `by \"${getMiddlewareNameWithAliases(name, _aliases)}\" middleware ${entry.relation} ` +\n                                `\"${entry.toMiddleware}\" middleware.`);\n                        }\n                        relativeEntries.splice(toOverrideIndex, 1);\n                    }\n                }\n                for (const alias of aliases) {\n                    entriesNameSet.add(alias);\n                }\n            }\n            relativeEntries.push(entry);\n        },\n        clone: () => cloneTo(constructStack()),\n        use: (plugin) => {\n            plugin.applyToStack(stack);\n        },\n        remove: (toRemove) => {\n            if (typeof toRemove === \"string\")\n                return removeByName(toRemove);\n            else\n                return removeByReference(toRemove);\n        },\n        removeByTag: (toRemove) => {\n            let isRemoved = false;\n            const filterCb = (entry) => {\n                const { tags, name, aliases: _aliases } = entry;\n                if (tags && tags.includes(toRemove)) {\n                    const aliases = getAllAliases(name, _aliases);\n                    for (const alias of aliases) {\n                        entriesNameSet.delete(alias);\n                    }\n                    isRemoved = true;\n                    return false;\n                }\n                return true;\n            };\n            absoluteEntries = absoluteEntries.filter(filterCb);\n            relativeEntries = relativeEntries.filter(filterCb);\n            return isRemoved;\n        },\n        concat: (from) => {\n            const cloned = cloneTo(constructStack());\n            cloned.use(from);\n            cloned.identifyOnResolve(identifyOnResolve || cloned.identifyOnResolve() || (from.identifyOnResolve?.() ?? false));\n            return cloned;\n        },\n        applyToStack: cloneTo,\n        identify: () => {\n            return getMiddlewareList(true).map((mw) => {\n                const step = mw.step ??\n                    mw.relation +\n                        \" \" +\n                        mw.toMiddleware;\n                return getMiddlewareNameWithAliases(mw.name, mw.aliases) + \" - \" + step;\n            });\n        },\n        identifyOnResolve(toggle) {\n            if (typeof toggle === \"boolean\")\n                identifyOnResolve = toggle;\n            return identifyOnResolve;\n        },\n        resolve: (handler, context) => {\n            for (const middleware of getMiddlewareList()\n                .map((entry) => entry.middleware)\n                .reverse()) {\n                handler = middleware(handler, context);\n            }\n            if (identifyOnResolve) {\n                console.log(stack.identify());\n            }\n            return handler;\n        },\n    };\n    return stack;\n};\nconst stepWeights = {\n    initialize: 5,\n    serialize: 4,\n    build: 3,\n    finalizeRequest: 2,\n    deserialize: 1,\n};\nconst priorityWeights = {\n    high: 3,\n    normal: 2,\n    low: 1,\n};\n\nexports.constructStack = constructStack;\n", "export const deref = (schemaRef) => {\n    if (typeof schemaRef === \"function\") {\n        return schemaRef();\n    }\n    return schemaRef;\n};\n", "'use strict';\n\nvar types = require('@smithy/types');\n\nconst getSmithyContext = (context) => context[types.SMITHY_CONTEXT_KEY] || (context[types.SMITHY_CONTEXT_KEY] = {});\n\nconst normalizeProvider = (input) => {\n    if (typeof input === \"function\")\n        return input;\n    const promisified = Promise.resolve(input);\n    return () => promisified;\n};\n\nexports.getSmithyContext = getSmithyContext;\nexports.normalizeProvider = normalizeProvider;\n", "export const operation = (namespace, name, traits, input, output) => ({\n    name,\n    namespace,\n    traits,\n    input,\n    output,\n});\n", "import { HttpResponse } from \"@smithy/protocol-http\";\nimport { getSmithyContext } from \"@smithy/util-middleware\";\nimport { operation } from \"../schemas/operation\";\nexport const schemaDeserializationMiddleware = (config) => (next, context) => async (args) => {\n    const { response } = await next(args);\n    const { operationSchema } = getSmithyContext(context);\n    const [, ns, n, t, i, o] = operationSchema ?? [];\n    try {\n        const parsed = await config.protocol.deserializeResponse(operation(ns, n, t, i, o), {\n            ...config,\n            ...context,\n        }, response);\n        return {\n            response,\n            output: parsed,\n        };\n    }\n    catch (error) {\n        Object.defineProperty(error, \"$response\", {\n            value: response,\n            enumerable: false,\n            writable: false,\n            configurable: false,\n        });\n        if (!(\"$metadata\" in error)) {\n            const hint = `Deserialization error: to see the raw response, inspect the hidden field {error}.$response on this object.`;\n            try {\n                error.message += \"\\n  \" + hint;\n            }\n            catch (e) {\n                if (!context.logger || context.logger?.constructor?.name === \"NoOpLogger\") {\n                    console.warn(hint);\n                }\n                else {\n                    context.logger?.warn?.(hint);\n                }\n            }\n            if (typeof error.$responseBodyText !== \"undefined\") {\n                if (error.$response) {\n                    error.$response.body = error.$responseBodyText;\n                }\n            }\n            try {\n                if (HttpResponse.isInstance(response)) {\n                    const { headers = {} } = response;\n                    const headerEntries = Object.entries(headers);\n                    error.$metadata = {\n                        httpStatusCode: response.statusCode,\n                        requestId: findHeader(/^x-[\\w-]+-request-?id$/, headerEntries),\n                        extendedRequestId: findHeader(/^x-[\\w-]+-id-2$/, headerEntries),\n                        cfId: findHeader(/^x-[\\w-]+-cf-id$/, headerEntries),\n                    };\n                }\n            }\n            catch (e) {\n            }\n        }\n        throw error;\n    }\n};\nconst findHeader = (pattern, headers) => {\n    return (headers.find(([k]) => {\n        return k.match(pattern);\n    }) || [void 0, void 1])[1];\n};\n", "import { parseUrl } from \"@smithy/url-parser\";\nexport const toEndpointV1 = (endpoint) => {\n    if (typeof endpoint === \"object\") {\n        if (\"url\" in endpoint) {\n            const v1Endpoint = parseUrl(endpoint.url);\n            if (endpoint.headers) {\n                v1Endpoint.headers = {};\n                for (const name in endpoint.headers) {\n                    v1Endpoint.headers[name.toLowerCase()] = endpoint.headers[name].join(\", \");\n                }\n            }\n            return v1Endpoint;\n        }\n        return endpoint;\n    }\n    return parseUrl(endpoint);\n};\n", "export * from \"./toEndpointV1\";\n", "import { toEndpointV1 } from \"@smithy/core/endpoints\";\nimport { getSmithyContext } from \"@smithy/util-middleware\";\nimport { operation } from \"../schemas/operation\";\nexport const schemaSerializationMiddleware = (config) => (next, context) => async (args) => {\n    const { operationSchema } = getSmithyContext(context);\n    const [, ns, n, t, i, o] = operationSchema ?? [];\n    const endpoint = context.endpointV2\n        ? async () => toEndpointV1(context.endpointV2)\n        : config.endpoint;\n    const request = await config.protocol.serializeRequest(operation(ns, n, t, i, o), args.input, {\n        ...config,\n        ...context,\n        endpoint,\n    });\n    return next({\n        ...args,\n        request,\n    });\n};\n", "import { schemaDeserializationMiddleware } from \"./schemaDeserializationMiddleware\";\nimport { schemaSerializationMiddleware } from \"./schemaSerializationMiddleware\";\nexport const deserializerMiddlewareOption = {\n    name: \"deserializerMiddleware\",\n    step: \"deserialize\",\n    tags: [\"DESERIALIZER\"],\n    override: true,\n};\nexport const serializerMiddlewareOption = {\n    name: \"serializerMiddleware\",\n    step: \"serialize\",\n    tags: [\"SERIALIZER\"],\n    override: true,\n};\nexport function getSchemaSerdePlugin(config) {\n    return {\n        applyToStack: (commandStack) => {\n            commandStack.add(schemaSerializationMiddleware(config), serializerMiddlewareOption);\n            commandStack.add(schemaDeserializationMiddleware(config), deserializerMiddlewareOption);\n            config.protocol.setSerdeContext(config);\n        },\n    };\n}\n", "export class Schema {\n    name;\n    namespace;\n    traits;\n    static assign(instance, values) {\n        const schema = Object.assign(instance, values);\n        return schema;\n    }\n    static [Symbol.hasInstance](lhs) {\n        const isPrototype = this.prototype.isPrototypeOf(lhs);\n        if (!isPrototype && typeof lhs === \"object\" && lhs !== null) {\n            const list = lhs;\n            return list.symbol === this.symbol;\n        }\n        return isPrototype;\n    }\n    getName() {\n        return this.namespace + \"#\" + this.name;\n    }\n}\n", "import { Schema } from \"./Schema\";\nexport class ListSchema extends Schema {\n    static symbol = Symbol.for(\"@smithy/lis\");\n    name;\n    traits;\n    valueSchema;\n    symbol = ListSchema.symbol;\n}\nexport const list = (namespace, name, traits, valueSchema) => Schema.assign(new ListSchema(), {\n    name,\n    namespace,\n    traits,\n    valueSchema,\n});\n", "import { Schema } from \"./Schema\";\nexport class MapSchema extends Schema {\n    static symbol = Symbol.for(\"@smithy/map\");\n    name;\n    traits;\n    keySchema;\n    valueSchema;\n    symbol = MapSchema.symbol;\n}\nexport const map = (namespace, name, traits, keySchema, valueSchema) => Schema.assign(new MapSchema(), {\n    name,\n    namespace,\n    traits,\n    keySchema,\n    valueSchema,\n});\n", "import { Schema } from \"./Schema\";\nexport class OperationSchema extends Schema {\n    static symbol = Symbol.for(\"@smithy/ope\");\n    name;\n    traits;\n    input;\n    output;\n    symbol = OperationSchema.symbol;\n}\nexport const op = (namespace, name, traits, input, output) => Schema.assign(new OperationSchema(), {\n    name,\n    namespace,\n    traits,\n    input,\n    output,\n});\n", "import { Schema } from \"./Schema\";\nexport class StructureSchema extends Schema {\n    static symbol = Symbol.for(\"@smithy/str\");\n    name;\n    traits;\n    memberNames;\n    memberList;\n    symbol = StructureSchema.symbol;\n}\nexport const struct = (namespace, name, traits, memberNames, memberList) => Schema.assign(new StructureSchema(), {\n    name,\n    namespace,\n    traits,\n    memberNames,\n    memberList,\n});\n", "import { Schema } from \"./Schema\";\nimport { StructureSchema } from \"./StructureSchema\";\nexport class ErrorSchema extends StructureSchema {\n    static symbol = Symbol.for(\"@smithy/err\");\n    ctor;\n    symbol = ErrorSchema.symbol;\n}\nexport const error = (namespace, name, traits, memberNames, memberList, ctor) => Schema.assign(new ErrorSchema(), {\n    name,\n    namespace,\n    traits,\n    memberNames,\n    memberList,\n    ctor: null,\n});\n", "export const traitsCache = [];\nexport function translateTraits(indicator) {\n    if (typeof indicator === \"object\") {\n        return indicator;\n    }\n    indicator = indicator | 0;\n    if (traitsCache[indicator]) {\n        return traitsCache[indicator];\n    }\n    const traits = {};\n    let i = 0;\n    for (const trait of [\n        \"httpLabel\",\n        \"idempotent\",\n        \"idempotencyToken\",\n        \"sensitive\",\n        \"httpPayload\",\n        \"httpResponseCode\",\n        \"httpQueryParams\",\n    ]) {\n        if (((indicator >> i++) & 1) === 1) {\n            traits[trait] = 1;\n        }\n    }\n    return (traitsCache[indicator] = traits);\n}\n", "import { deref } from \"../deref\";\nimport { translateTraits } from \"./translateTraits\";\nconst anno = {\n    it: Symbol.for(\"@smithy/nor-struct-it\"),\n    ns: Symbol.for(\"@smithy/ns\"),\n};\nexport const simpleSchemaCacheN = [];\nexport const simpleSchemaCacheS = {};\nexport class NormalizedSchema {\n    ref;\n    memberName;\n    static symbol = Symbol.for(\"@smithy/nor\");\n    symbol = NormalizedSchema.symbol;\n    name;\n    schema;\n    _isMemberSchema;\n    traits;\n    memberTraits;\n    normalizedTraits;\n    constructor(ref, memberName) {\n        this.ref = ref;\n        this.memberName = memberName;\n        const traitStack = [];\n        let _ref = ref;\n        let schema = ref;\n        this._isMemberSchema = false;\n        while (isMemberSchema(_ref)) {\n            traitStack.push(_ref[1]);\n            _ref = _ref[0];\n            schema = deref(_ref);\n            this._isMemberSchema = true;\n        }\n        if (traitStack.length > 0) {\n            this.memberTraits = {};\n            for (let i = traitStack.length - 1; i >= 0; --i) {\n                const traitSet = traitStack[i];\n                Object.assign(this.memberTraits, translateTraits(traitSet));\n            }\n        }\n        else {\n            this.memberTraits = 0;\n        }\n        if (schema instanceof NormalizedSchema) {\n            const computedMemberTraits = this.memberTraits;\n            Object.assign(this, schema);\n            this.memberTraits = Object.assign({}, computedMemberTraits, schema.getMemberTraits(), this.getMemberTraits());\n            this.normalizedTraits = void 0;\n            this.memberName = memberName ?? schema.memberName;\n            return;\n        }\n        this.schema = deref(schema);\n        if (isStaticSchema(this.schema)) {\n            this.name = `${this.schema[1]}#${this.schema[2]}`;\n            this.traits = this.schema[3];\n        }\n        else {\n            this.name = this.memberName ?? String(schema);\n            this.traits = 0;\n        }\n        if (this._isMemberSchema && !memberName) {\n            throw new Error(`@smithy/core/schema - NormalizedSchema member init ${this.getName(true)} missing member name.`);\n        }\n    }\n    static [Symbol.hasInstance](lhs) {\n        const isPrototype = this.prototype.isPrototypeOf(lhs);\n        if (!isPrototype && typeof lhs === \"object\" && lhs !== null) {\n            const ns = lhs;\n            return ns.symbol === this.symbol;\n        }\n        return isPrototype;\n    }\n    static of(ref) {\n        const keyAble = typeof ref === \"function\" || (typeof ref === \"object\" && ref !== null);\n        if (typeof ref === \"number\") {\n            if (simpleSchemaCacheN[ref]) {\n                return simpleSchemaCacheN[ref];\n            }\n        }\n        else if (typeof ref === \"string\") {\n            if (simpleSchemaCacheS[ref]) {\n                return simpleSchemaCacheS[ref];\n            }\n        }\n        else if (keyAble) {\n            if (ref[anno.ns]) {\n                return ref[anno.ns];\n            }\n        }\n        const sc = deref(ref);\n        if (sc instanceof NormalizedSchema) {\n            return sc;\n        }\n        if (isMemberSchema(sc)) {\n            const [ns, traits] = sc;\n            if (ns instanceof NormalizedSchema) {\n                Object.assign(ns.getMergedTraits(), translateTraits(traits));\n                return ns;\n            }\n            throw new Error(`@smithy/core/schema - may not init unwrapped member schema=${JSON.stringify(ref, null, 2)}.`);\n        }\n        const ns = new NormalizedSchema(sc);\n        if (keyAble) {\n            return (ref[anno.ns] = ns);\n        }\n        if (typeof sc === \"string\") {\n            return (simpleSchemaCacheS[sc] = ns);\n        }\n        if (typeof sc === \"number\") {\n            return (simpleSchemaCacheN[sc] = ns);\n        }\n        return ns;\n    }\n    getSchema() {\n        const sc = this.schema;\n        if (Array.isArray(sc) && sc[0] === 0) {\n            return sc[4];\n        }\n        return sc;\n    }\n    getName(withNamespace = false) {\n        const { name } = this;\n        const short = !withNamespace && name && name.includes(\"#\");\n        return short ? name.split(\"#\")[1] : name || undefined;\n    }\n    getMemberName() {\n        return this.memberName;\n    }\n    isMemberSchema() {\n        return this._isMemberSchema;\n    }\n    isListSchema() {\n        const sc = this.getSchema();\n        return typeof sc === \"number\"\n            ? sc >= 64 && sc < 128\n            : sc[0] === 1;\n    }\n    isMapSchema() {\n        const sc = this.getSchema();\n        return typeof sc === \"number\"\n            ? sc >= 128 && sc <= 0b1111_1111\n            : sc[0] === 2;\n    }\n    isStructSchema() {\n        const sc = this.getSchema();\n        if (typeof sc !== \"object\") {\n            return false;\n        }\n        const id = sc[0];\n        return (id === 3 ||\n            id === -3 ||\n            id === 4);\n    }\n    isUnionSchema() {\n        const sc = this.getSchema();\n        if (typeof sc !== \"object\") {\n            return false;\n        }\n        return sc[0] === 4;\n    }\n    isBlobSchema() {\n        const sc = this.getSchema();\n        return sc === 21 || sc === 42;\n    }\n    isTimestampSchema() {\n        const sc = this.getSchema();\n        return (typeof sc === \"number\" &&\n            sc >= 4 &&\n            sc <= 7);\n    }\n    isUnitSchema() {\n        return this.getSchema() === \"unit\";\n    }\n    isDocumentSchema() {\n        return this.getSchema() === 15;\n    }\n    isStringSchema() {\n        return this.getSchema() === 0;\n    }\n    isBooleanSchema() {\n        return this.getSchema() === 2;\n    }\n    isNumericSchema() {\n        return this.getSchema() === 1;\n    }\n    isBigIntegerSchema() {\n        return this.getSchema() === 17;\n    }\n    isBigDecimalSchema() {\n        return this.getSchema() === 19;\n    }\n    isStreaming() {\n        const { streaming } = this.getMergedTraits();\n        return !!streaming || this.getSchema() === 42;\n    }\n    isIdempotencyToken() {\n        return !!this.getMergedTraits().idempotencyToken;\n    }\n    getMergedTraits() {\n        return (this.normalizedTraits ??\n            (this.normalizedTraits = {\n                ...this.getOwnTraits(),\n                ...this.getMemberTraits(),\n            }));\n    }\n    getMemberTraits() {\n        return translateTraits(this.memberTraits);\n    }\n    getOwnTraits() {\n        return translateTraits(this.traits);\n    }\n    getKeySchema() {\n        const [isDoc, isMap] = [this.isDocumentSchema(), this.isMapSchema()];\n        if (!isDoc && !isMap) {\n            throw new Error(`@smithy/core/schema - cannot get key for non-map: ${this.getName(true)}`);\n        }\n        const schema = this.getSchema();\n        const memberSchema = isDoc\n            ? 15\n            : schema[4] ?? 0;\n        return member([memberSchema, 0], \"key\");\n    }\n    getValueSchema() {\n        const sc = this.getSchema();\n        const [isDoc, isMap, isList] = [this.isDocumentSchema(), this.isMapSchema(), this.isListSchema()];\n        const memberSchema = typeof sc === \"number\"\n            ? 0b0011_1111 & sc\n            : sc && typeof sc === \"object\" && (isMap || isList)\n                ? sc[3 + sc[0]]\n                : isDoc\n                    ? 15\n                    : void 0;\n        if (memberSchema != null) {\n            return member([memberSchema, 0], isMap ? \"value\" : \"member\");\n        }\n        throw new Error(`@smithy/core/schema - ${this.getName(true)} has no value member.`);\n    }\n    getMemberSchema(memberName) {\n        const struct = this.getSchema();\n        if (this.isStructSchema() && struct[4].includes(memberName)) {\n            const i = struct[4].indexOf(memberName);\n            const memberSchema = struct[5][i];\n            return member(isMemberSchema(memberSchema) ? memberSchema : [memberSchema, 0], memberName);\n        }\n        if (this.isDocumentSchema()) {\n            return member([15, 0], memberName);\n        }\n        throw new Error(`@smithy/core/schema - ${this.getName(true)} has no member=${memberName}.`);\n    }\n    getMemberSchemas() {\n        const buffer = {};\n        try {\n            for (const [k, v] of this.structIterator()) {\n                buffer[k] = v;\n            }\n        }\n        catch (ignored) { }\n        return buffer;\n    }\n    getEventStreamMember() {\n        if (this.isStructSchema()) {\n            for (const [memberName, memberSchema] of this.structIterator()) {\n                if (memberSchema.isStreaming() && memberSchema.isStructSchema()) {\n                    return memberName;\n                }\n            }\n        }\n        return \"\";\n    }\n    *structIterator() {\n        if (this.isUnitSchema()) {\n            return;\n        }\n        if (!this.isStructSchema()) {\n            throw new Error(\"@smithy/core/schema - cannot iterate non-struct schema.\");\n        }\n        const struct = this.getSchema();\n        const z = struct[4].length;\n        let it = struct[anno.it];\n        if (it && z === it.length) {\n            yield* it;\n            return;\n        }\n        it = Array(z);\n        for (let i = 0; i < z; ++i) {\n            const k = struct[4][i];\n            const v = member([struct[5][i], 0], k);\n            yield (it[i] = [k, v]);\n        }\n        struct[anno.it] = it;\n    }\n}\nfunction member(memberSchema, memberName) {\n    if (memberSchema instanceof NormalizedSchema) {\n        return Object.assign(memberSchema, {\n            memberName,\n            _isMemberSchema: true,\n        });\n    }\n    const internalCtorAccess = NormalizedSchema;\n    return new internalCtorAccess(memberSchema, memberName);\n}\nconst isMemberSchema = (sc) => Array.isArray(sc) && sc.length === 2;\nexport const isStaticSchema = (sc) => Array.isArray(sc) && sc.length >= 5;\n", "import { Schema } from \"./Schema\";\nexport class SimpleSchema extends Schema {\n    static symbol = Symbol.for(\"@smithy/sim\");\n    name;\n    schemaRef;\n    traits;\n    symbol = SimpleSchema.symbol;\n}\nexport const sim = (namespace, name, schemaRef, traits) => Schema.assign(new SimpleSchema(), {\n    name,\n    namespace,\n    traits,\n    schemaRef,\n});\nexport const simAdapter = (namespace, name, traits, schemaRef) => Schema.assign(new SimpleSchema(), {\n    name,\n    namespace,\n    traits,\n    schemaRef,\n});\n", "export const SCHEMA = {\n    BLOB: 0b0001_0101,\n    STREAMING_BLOB: 0b0010_1010,\n    BOOLEAN: 0b0000_0010,\n    STRING: 0b0000_0000,\n    NUMERIC: 0b0000_0001,\n    BIG_INTEGER: 0b0001_0001,\n    BIG_DECIMAL: 0b0001_0011,\n    DOCUMENT: 0b0000_1111,\n    TIMESTAMP_DEFAULT: 0b0000_0100,\n    TIMESTAMP_DATE_TIME: 0b0000_0101,\n    TIMESTAMP_HTTP_DATE: 0b0000_0110,\n    TIMESTAMP_EPOCH_SECONDS: 0b0000_0111,\n    LIST_MODIFIER: 0b0100_0000,\n    MAP_MODIFIER: 0b1000_0000,\n};\n", "export class TypeRegistry {\n    namespace;\n    schemas;\n    exceptions;\n    static registries = new Map();\n    constructor(namespace, schemas = new Map(), exceptions = new Map()) {\n        this.namespace = namespace;\n        this.schemas = schemas;\n        this.exceptions = exceptions;\n    }\n    static for(namespace) {\n        if (!TypeRegistry.registries.has(namespace)) {\n            TypeRegistry.registries.set(namespace, new TypeRegistry(namespace));\n        }\n        return TypeRegistry.registries.get(namespace);\n    }\n    copyFrom(other) {\n        const { schemas, exceptions } = this;\n        for (const [k, v] of other.schemas) {\n            if (!schemas.has(k)) {\n                schemas.set(k, v);\n            }\n        }\n        for (const [k, v] of other.exceptions) {\n            if (!exceptions.has(k)) {\n                exceptions.set(k, v);\n            }\n        }\n    }\n    register(shapeId, schema) {\n        const qualifiedName = this.normalizeShapeId(shapeId);\n        for (const r of [this, TypeRegistry.for(qualifiedName.split(\"#\")[0])]) {\n            r.schemas.set(qualifiedName, schema);\n        }\n    }\n    getSchema(shapeId) {\n        const id = this.normalizeShapeId(shapeId);\n        if (!this.schemas.has(id)) {\n            throw new Error(`@smithy/core/schema - schema not found for ${id}`);\n        }\n        return this.schemas.get(id);\n    }\n    registerError(es, ctor) {\n        const $error = es;\n        const ns = $error[1];\n        for (const r of [this, TypeRegistry.for(ns)]) {\n            r.schemas.set(ns + \"#\" + $error[2], $error);\n            r.exceptions.set($error, ctor);\n        }\n    }\n    getErrorCtor(es) {\n        const $error = es;\n        if (this.exceptions.has($error)) {\n            return this.exceptions.get($error);\n        }\n        const registry = TypeRegistry.for($error[1]);\n        return registry.exceptions.get($error);\n    }\n    getBaseException() {\n        for (const exceptionKey of this.exceptions.keys()) {\n            if (Array.isArray(exceptionKey)) {\n                const [, ns, name] = exceptionKey;\n                const id = ns + \"#\" + name;\n                if (id.startsWith(\"smithy.ts.sdk.synthetic.\") && id.endsWith(\"ServiceException\")) {\n                    return exceptionKey;\n                }\n            }\n        }\n        return undefined;\n    }\n    find(predicate) {\n        for (const schema of this.schemas.values()) {\n            if (predicate(schema)) {\n                return schema;\n            }\n        }\n        return undefined;\n    }\n    clear() {\n        this.schemas.clear();\n        this.exceptions.clear();\n    }\n    normalizeShapeId(shapeId) {\n        if (shapeId.includes(\"#\")) {\n            return shapeId;\n        }\n        return this.namespace + \"#\" + shapeId;\n    }\n}\n", "export * from \"./deref\";\nexport * from \"./middleware/getSchemaSerdePlugin\";\nexport * from \"./schemas/ListSchema\";\nexport * from \"./schemas/MapSchema\";\nexport * from \"./schemas/OperationSchema\";\nexport * from \"./schemas/operation\";\nexport * from \"./schemas/ErrorSchema\";\nexport * from \"./schemas/NormalizedSchema\";\nexport * from \"./schemas/Schema\";\nexport * from \"./schemas/SimpleSchema\";\nexport * from \"./schemas/StructureSchema\";\nexport * from \"./schemas/sentinels\";\nexport * from \"./schemas/translateTraits\";\nexport * from \"./TypeRegistry\";\n", "export const copyDocumentWithTransform = (source, schemaRef, transform = (_) => _) => source;\n", "export const parseBoolean = (value) => {\n    switch (value) {\n        case \"true\":\n            return true;\n        case \"false\":\n            return false;\n        default:\n            throw new Error(`Unable to parse boolean value \"${value}\"`);\n    }\n};\nexport const expectBoolean = (value) => {\n    if (value === null || value === undefined) {\n        return undefined;\n    }\n    if (typeof value === \"number\") {\n        if (value === 0 || value === 1) {\n            logger.warn(stackTraceWarning(`Expected boolean, got ${typeof value}: ${value}`));\n        }\n        if (value === 0) {\n            return false;\n        }\n        if (value === 1) {\n            return true;\n        }\n    }\n    if (typeof value === \"string\") {\n        const lower = value.toLowerCase();\n        if (lower === \"false\" || lower === \"true\") {\n            logger.warn(stackTraceWarning(`Expected boolean, got ${typeof value}: ${value}`));\n        }\n        if (lower === \"false\") {\n            return false;\n        }\n        if (lower === \"true\") {\n            return true;\n        }\n    }\n    if (typeof value === \"boolean\") {\n        return value;\n    }\n    throw new TypeError(`Expected boolean, got ${typeof value}: ${value}`);\n};\nexport const expectNumber = (value) => {\n    if (value === null || value === undefined) {\n        return undefined;\n    }\n    if (typeof value === \"string\") {\n        const parsed = parseFloat(value);\n        if (!Number.isNaN(parsed)) {\n            if (String(parsed) !== String(value)) {\n                logger.warn(stackTraceWarning(`Expected number but observed string: ${value}`));\n            }\n            return parsed;\n        }\n    }\n    if (typeof value === \"number\") {\n        return value;\n    }\n    throw new TypeError(`Expected number, got ${typeof value}: ${value}`);\n};\nconst MAX_FLOAT = Math.ceil(2 ** 127 * (2 - 2 ** -23));\nexport const expectFloat32 = (value) => {\n    const expected = expectNumber(value);\n    if (expected !== undefined && !Number.isNaN(expected) && expected !== Infinity && expected !== -Infinity) {\n        if (Math.abs(expected) > MAX_FLOAT) {\n            throw new TypeError(`Expected 32-bit float, got ${value}`);\n        }\n    }\n    return expected;\n};\nexport const expectLong = (value) => {\n    if (value === null || value === undefined) {\n        return undefined;\n    }\n    if (Number.isInteger(value) && !Number.isNaN(value)) {\n        return value;\n    }\n    throw new TypeError(`Expected integer, got ${typeof value}: ${value}`);\n};\nexport const expectInt = expectLong;\nexport const expectInt32 = (value) => expectSizedInt(value, 32);\nexport const expectShort = (value) => expectSizedInt(value, 16);\nexport const expectByte = (value) => expectSizedInt(value, 8);\nconst expectSizedInt = (value, size) => {\n    const expected = expectLong(value);\n    if (expected !== undefined && castInt(expected, size) !== expected) {\n        throw new TypeError(`Expected ${size}-bit integer, got ${value}`);\n    }\n    return expected;\n};\nconst castInt = (value, size) => {\n    switch (size) {\n        case 32:\n            return Int32Array.of(value)[0];\n        case 16:\n            return Int16Array.of(value)[0];\n        case 8:\n            return Int8Array.of(value)[0];\n    }\n};\nexport const expectNonNull = (value, location) => {\n    if (value === null || value === undefined) {\n        if (location) {\n            throw new TypeError(`Expected a non-null value for ${location}`);\n        }\n        throw new TypeError(\"Expected a non-null value\");\n    }\n    return value;\n};\nexport const expectObject = (value) => {\n    if (value === null || value === undefined) {\n        return undefined;\n    }\n    if (typeof value === \"object\" && !Array.isArray(value)) {\n        return value;\n    }\n    const receivedType = Array.isArray(value) ? \"array\" : typeof value;\n    throw new TypeError(`Expected object, got ${receivedType}: ${value}`);\n};\nexport const expectString = (value) => {\n    if (value === null || value === undefined) {\n        return undefined;\n    }\n    if (typeof value === \"string\") {\n        return value;\n    }\n    if ([\"boolean\", \"number\", \"bigint\"].includes(typeof value)) {\n        logger.warn(stackTraceWarning(`Expected string, got ${typeof value}: ${value}`));\n        return String(value);\n    }\n    throw new TypeError(`Expected string, got ${typeof value}: ${value}`);\n};\nexport const expectUnion = (value) => {\n    if (value === null || value === undefined) {\n        return undefined;\n    }\n    const asObject = expectObject(value);\n    const setKeys = [];\n    for (const k in asObject) {\n        if (asObject[k] != null) {\n            setKeys.push(k);\n        }\n    }\n    if (setKeys.length === 0) {\n        throw new TypeError(`Unions must have exactly one non-null member. None were found.`);\n    }\n    if (setKeys.length > 1) {\n        throw new TypeError(`Unions must have exactly one non-null member. Keys ${setKeys} were not null.`);\n    }\n    return asObject;\n};\nexport const strictParseDouble = (value) => {\n    if (typeof value == \"string\") {\n        return expectNumber(parseNumber(value));\n    }\n    return expectNumber(value);\n};\nexport const strictParseFloat = strictParseDouble;\nexport const strictParseFloat32 = (value) => {\n    if (typeof value == \"string\") {\n        return expectFloat32(parseNumber(value));\n    }\n    return expectFloat32(value);\n};\nconst NUMBER_REGEX = /(-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?)|(-?Infinity)|(NaN)/g;\nconst parseNumber = (value) => {\n    const matches = value.match(NUMBER_REGEX);\n    if (matches === null || matches[0].length !== value.length) {\n        throw new TypeError(`Expected real number, got implicit NaN`);\n    }\n    return parseFloat(value);\n};\nexport const limitedParseDouble = (value) => {\n    if (typeof value == \"string\") {\n        return parseFloatString(value);\n    }\n    return expectNumber(value);\n};\nexport const handleFloat = limitedParseDouble;\nexport const limitedParseFloat = limitedParseDouble;\nexport const limitedParseFloat32 = (value) => {\n    if (typeof value == \"string\") {\n        return parseFloatString(value);\n    }\n    return expectFloat32(value);\n};\nconst parseFloatString = (value) => {\n    switch (value) {\n        case \"NaN\":\n            return NaN;\n        case \"Infinity\":\n            return Infinity;\n        case \"-Infinity\":\n            return -Infinity;\n        default:\n            throw new Error(`Unable to parse float value: ${value}`);\n    }\n};\nexport const strictParseLong = (value) => {\n    if (typeof value === \"string\") {\n        return expectLong(parseNumber(value));\n    }\n    return expectLong(value);\n};\nexport const strictParseInt = strictParseLong;\nexport const strictParseInt32 = (value) => {\n    if (typeof value === \"string\") {\n        return expectInt32(parseNumber(value));\n    }\n    return expectInt32(value);\n};\nexport const strictParseShort = (value) => {\n    if (typeof value === \"string\") {\n        return expectShort(parseNumber(value));\n    }\n    return expectShort(value);\n};\nexport const strictParseByte = (value) => {\n    if (typeof value === \"string\") {\n        return expectByte(parseNumber(value));\n    }\n    return expectByte(value);\n};\nconst stackTraceWarning = (message) => {\n    return String(new TypeError(message).stack || message)\n        .split(\"\\n\")\n        .slice(0, 5)\n        .filter((s) => !s.includes(\"stackTraceWarning\"))\n        .join(\"\\n\");\n};\nexport const logger = {\n    warn: console.warn,\n};\n", "import { strictParseByte, strictParseDouble, strictParseFloat32, strictParseShort } from \"./parse-utils\";\nconst DAYS = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nconst MONTHS = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\nexport function dateToUtcString(date) {\n    const year = date.getUTCFullYear();\n    const month = date.getUTCMonth();\n    const dayOfWeek = date.getUTCDay();\n    const dayOfMonthInt = date.getUTCDate();\n    const hoursInt = date.getUTCHours();\n    const minutesInt = date.getUTCMinutes();\n    const secondsInt = date.getUTCSeconds();\n    const dayOfMonthString = dayOfMonthInt < 10 ? `0${dayOfMonthInt}` : `${dayOfMonthInt}`;\n    const hoursString = hoursInt < 10 ? `0${hoursInt}` : `${hoursInt}`;\n    const minutesString = minutesInt < 10 ? `0${minutesInt}` : `${minutesInt}`;\n    const secondsString = secondsInt < 10 ? `0${secondsInt}` : `${secondsInt}`;\n    return `${DAYS[dayOfWeek]}, ${dayOfMonthString} ${MONTHS[month]} ${year} ${hoursString}:${minutesString}:${secondsString} GMT`;\n}\nconst RFC3339 = new RegExp(/^(\\d{4})-(\\d{2})-(\\d{2})[tT](\\d{2}):(\\d{2}):(\\d{2})(?:\\.(\\d+))?[zZ]$/);\nexport const parseRfc3339DateTime = (value) => {\n    if (value === null || value === undefined) {\n        return undefined;\n    }\n    if (typeof value !== \"string\") {\n        throw new TypeError(\"RFC-3339 date-times must be expressed as strings\");\n    }\n    const match = RFC3339.exec(value);\n    if (!match) {\n        throw new TypeError(\"Invalid RFC-3339 date-time value\");\n    }\n    const [_, yearStr, monthStr, dayStr, hours, minutes, seconds, fractionalMilliseconds] = match;\n    const year = strictParseShort(stripLeadingZeroes(yearStr));\n    const month = parseDateValue(monthStr, \"month\", 1, 12);\n    const day = parseDateValue(dayStr, \"day\", 1, 31);\n    return buildDate(year, month, day, { hours, minutes, seconds, fractionalMilliseconds });\n};\nconst RFC3339_WITH_OFFSET = new RegExp(/^(\\d{4})-(\\d{2})-(\\d{2})[tT](\\d{2}):(\\d{2}):(\\d{2})(?:\\.(\\d+))?(([-+]\\d{2}\\:\\d{2})|[zZ])$/);\nexport const parseRfc3339DateTimeWithOffset = (value) => {\n    if (value === null || value === undefined) {\n        return undefined;\n    }\n    if (typeof value !== \"string\") {\n        throw new TypeError(\"RFC-3339 date-times must be expressed as strings\");\n    }\n    const match = RFC3339_WITH_OFFSET.exec(value);\n    if (!match) {\n        throw new TypeError(\"Invalid RFC-3339 date-time value\");\n    }\n    const [_, yearStr, monthStr, dayStr, hours, minutes, seconds, fractionalMilliseconds, offsetStr] = match;\n    const year = strictParseShort(stripLeadingZeroes(yearStr));\n    const month = parseDateValue(monthStr, \"month\", 1, 12);\n    const day = parseDateValue(dayStr, \"day\", 1, 31);\n    const date = buildDate(year, month, day, { hours, minutes, seconds, fractionalMilliseconds });\n    if (offsetStr.toUpperCase() != \"Z\") {\n        date.setTime(date.getTime() - parseOffsetToMilliseconds(offsetStr));\n    }\n    return date;\n};\nconst IMF_FIXDATE = new RegExp(/^(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\\d{2}) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\\d{4}) (\\d{1,2}):(\\d{2}):(\\d{2})(?:\\.(\\d+))? GMT$/);\nconst RFC_850_DATE = new RegExp(/^(?:Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\\d{2})-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\\d{2}) (\\d{1,2}):(\\d{2}):(\\d{2})(?:\\.(\\d+))? GMT$/);\nconst ASC_TIME = new RegExp(/^(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( [1-9]|\\d{2}) (\\d{1,2}):(\\d{2}):(\\d{2})(?:\\.(\\d+))? (\\d{4})$/);\nexport const parseRfc7231DateTime = (value) => {\n    if (value === null || value === undefined) {\n        return undefined;\n    }\n    if (typeof value !== \"string\") {\n        throw new TypeError(\"RFC-7231 date-times must be expressed as strings\");\n    }\n    let match = IMF_FIXDATE.exec(value);\n    if (match) {\n        const [_, dayStr, monthStr, yearStr, hours, minutes, seconds, fractionalMilliseconds] = match;\n        return buildDate(strictParseShort(stripLeadingZeroes(yearStr)), parseMonthByShortName(monthStr), parseDateValue(dayStr, \"day\", 1, 31), { hours, minutes, seconds, fractionalMilliseconds });\n    }\n    match = RFC_850_DATE.exec(value);\n    if (match) {\n        const [_, dayStr, monthStr, yearStr, hours, minutes, seconds, fractionalMilliseconds] = match;\n        return adjustRfc850Year(buildDate(parseTwoDigitYear(yearStr), parseMonthByShortName(monthStr), parseDateValue(dayStr, \"day\", 1, 31), {\n            hours,\n            minutes,\n            seconds,\n            fractionalMilliseconds,\n        }));\n    }\n    match = ASC_TIME.exec(value);\n    if (match) {\n        const [_, monthStr, dayStr, hours, minutes, seconds, fractionalMilliseconds, yearStr] = match;\n        return buildDate(strictParseShort(stripLeadingZeroes(yearStr)), parseMonthByShortName(monthStr), parseDateValue(dayStr.trimLeft(), \"day\", 1, 31), { hours, minutes, seconds, fractionalMilliseconds });\n    }\n    throw new TypeError(\"Invalid RFC-7231 date-time value\");\n};\nexport const parseEpochTimestamp = (value) => {\n    if (value === null || value === undefined) {\n        return undefined;\n    }\n    let valueAsDouble;\n    if (typeof value === \"number\") {\n        valueAsDouble = value;\n    }\n    else if (typeof value === \"string\") {\n        valueAsDouble = strictParseDouble(value);\n    }\n    else if (typeof value === \"object\" && value.tag === 1) {\n        valueAsDouble = value.value;\n    }\n    else {\n        throw new TypeError(\"Epoch timestamps must be expressed as floating point numbers or their string representation\");\n    }\n    if (Number.isNaN(valueAsDouble) || valueAsDouble === Infinity || valueAsDouble === -Infinity) {\n        throw new TypeError(\"Epoch timestamps must be valid, non-Infinite, non-NaN numerics\");\n    }\n    return new Date(Math.round(valueAsDouble * 1000));\n};\nconst buildDate = (year, month, day, time) => {\n    const adjustedMonth = month - 1;\n    validateDayOfMonth(year, adjustedMonth, day);\n    return new Date(Date.UTC(year, adjustedMonth, day, parseDateValue(time.hours, \"hour\", 0, 23), parseDateValue(time.minutes, \"minute\", 0, 59), parseDateValue(time.seconds, \"seconds\", 0, 60), parseMilliseconds(time.fractionalMilliseconds)));\n};\nconst parseTwoDigitYear = (value) => {\n    const thisYear = new Date().getUTCFullYear();\n    const valueInThisCentury = Math.floor(thisYear / 100) * 100 + strictParseShort(stripLeadingZeroes(value));\n    if (valueInThisCentury < thisYear) {\n        return valueInThisCentury + 100;\n    }\n    return valueInThisCentury;\n};\nconst FIFTY_YEARS_IN_MILLIS = 50 * 365 * 24 * 60 * 60 * 1000;\nconst adjustRfc850Year = (input) => {\n    if (input.getTime() - new Date().getTime() > FIFTY_YEARS_IN_MILLIS) {\n        return new Date(Date.UTC(input.getUTCFullYear() - 100, input.getUTCMonth(), input.getUTCDate(), input.getUTCHours(), input.getUTCMinutes(), input.getUTCSeconds(), input.getUTCMilliseconds()));\n    }\n    return input;\n};\nconst parseMonthByShortName = (value) => {\n    const monthIdx = MONTHS.indexOf(value);\n    if (monthIdx < 0) {\n        throw new TypeError(`Invalid month: ${value}`);\n    }\n    return monthIdx + 1;\n};\nconst DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nconst validateDayOfMonth = (year, month, day) => {\n    let maxDays = DAYS_IN_MONTH[month];\n    if (month === 1 && isLeapYear(year)) {\n        maxDays = 29;\n    }\n    if (day > maxDays) {\n        throw new TypeError(`Invalid day for ${MONTHS[month]} in ${year}: ${day}`);\n    }\n};\nconst isLeapYear = (year) => {\n    return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n};\nconst parseDateValue = (value, type, lower, upper) => {\n    const dateVal = strictParseByte(stripLeadingZeroes(value));\n    if (dateVal < lower || dateVal > upper) {\n        throw new TypeError(`${type} must be between ${lower} and ${upper}, inclusive`);\n    }\n    return dateVal;\n};\nconst parseMilliseconds = (value) => {\n    if (value === null || value === undefined) {\n        return 0;\n    }\n    return strictParseFloat32(\"0.\" + value) * 1000;\n};\nconst parseOffsetToMilliseconds = (value) => {\n    const directionStr = value[0];\n    let direction = 1;\n    if (directionStr == \"+\") {\n        direction = 1;\n    }\n    else if (directionStr == \"-\") {\n        direction = -1;\n    }\n    else {\n        throw new TypeError(`Offset direction, ${directionStr}, must be \"+\" or \"-\"`);\n    }\n    const hour = Number(value.substring(1, 3));\n    const minute = Number(value.substring(4, 6));\n    return direction * (hour * 60 + minute) * 60 * 1000;\n};\nconst stripLeadingZeroes = (value) => {\n    let idx = 0;\n    while (idx < value.length - 1 && value.charAt(idx) === \"0\") {\n        idx++;\n    }\n    if (idx === 0) {\n        return value;\n    }\n    return value.slice(idx);\n};\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.randomUUID = void 0;\nconst tslib_1 = require(\"tslib\");\nconst crypto_1 = tslib_1.__importDefault(require(\"crypto\"));\nexports.randomUUID = crypto_1.default.randomUUID.bind(crypto_1.default);\n", "'use strict';\n\nvar randomUUID = require('./randomUUID');\n\nconst decimalToHex = Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, \"0\"));\nconst v4 = () => {\n    if (randomUUID.randomUUID) {\n        return randomUUID.randomUUID();\n    }\n    const rnds = new Uint8Array(16);\n    crypto.getRandomValues(rnds);\n    rnds[6] = (rnds[6] & 0x0f) | 0x40;\n    rnds[8] = (rnds[8] & 0x3f) | 0x80;\n    return (decimalToHex[rnds[0]] +\n        decimalToHex[rnds[1]] +\n        decimalToHex[rnds[2]] +\n        decimalToHex[rnds[3]] +\n        \"-\" +\n        decimalToHex[rnds[4]] +\n        decimalToHex[rnds[5]] +\n        \"-\" +\n        decimalToHex[rnds[6]] +\n        decimalToHex[rnds[7]] +\n        \"-\" +\n        decimalToHex[rnds[8]] +\n        decimalToHex[rnds[9]] +\n        \"-\" +\n        decimalToHex[rnds[10]] +\n        decimalToHex[rnds[11]] +\n        decimalToHex[rnds[12]] +\n        decimalToHex[rnds[13]] +\n        decimalToHex[rnds[14]] +\n        decimalToHex[rnds[15]]);\n};\n\nexports.v4 = v4;\n", "import { v4 as generateIdempotencyToken } from \"@smithy/uuid\";\nexport { generateIdempotencyToken };\n", "export const LazyJsonString = function LazyJsonString(val) {\n    const str = Object.assign(new String(val), {\n        deserializeJSON() {\n            return JSON.parse(String(val));\n        },\n        toString() {\n            return String(val);\n        },\n        toJSON() {\n            return String(val);\n        },\n    });\n    return str;\n};\nLazyJsonString.from = (object) => {\n    if (object && typeof object === \"object\" && (object instanceof LazyJsonString || \"deserializeJSON\" in object)) {\n        return object;\n    }\n    else if (typeof object === \"string\" || Object.getPrototypeOf(object) === String.prototype) {\n        return LazyJsonString(String(object));\n    }\n    return LazyJsonString(JSON.stringify(object));\n};\nLazyJsonString.fromObject = LazyJsonString.from;\n", "export function quoteHeader(part) {\n    if (part.includes(\",\") || part.includes('\"')) {\n        part = `\"${part.replace(/\"/g, '\\\\\"')}\"`;\n    }\n    return part;\n}\n", "const ddd = `(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)(?:[ne|u?r]?s?day)?`;\nconst mmm = `(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)`;\nconst time = `(\\\\d?\\\\d):(\\\\d{2}):(\\\\d{2})(?:\\\\.(\\\\d+))?`;\nconst date = `(\\\\d?\\\\d)`;\nconst year = `(\\\\d{4})`;\nconst RFC3339_WITH_OFFSET = new RegExp(/^(\\d{4})-(\\d\\d)-(\\d\\d)[tT](\\d\\d):(\\d\\d):(\\d\\d)(\\.(\\d+))?(([-+]\\d\\d:\\d\\d)|[zZ])$/);\nconst IMF_FIXDATE = new RegExp(`^${ddd}, ${date} ${mmm} ${year} ${time} GMT$`);\nconst RFC_850_DATE = new RegExp(`^${ddd}, ${date}-${mmm}-(\\\\d\\\\d) ${time} GMT$`);\nconst ASC_TIME = new RegExp(`^${ddd} ${mmm} ( [1-9]|\\\\d\\\\d) ${time} ${year}$`);\nconst months = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\nexport const _parseEpochTimestamp = (value) => {\n    if (value == null) {\n        return void 0;\n    }\n    let num = NaN;\n    if (typeof value === \"number\") {\n        num = value;\n    }\n    else if (typeof value === \"string\") {\n        if (!/^-?\\d*\\.?\\d+$/.test(value)) {\n            throw new TypeError(`parseEpochTimestamp - numeric string invalid.`);\n        }\n        num = Number.parseFloat(value);\n    }\n    else if (typeof value === \"object\" && value.tag === 1) {\n        num = value.value;\n    }\n    if (isNaN(num) || Math.abs(num) === Infinity) {\n        throw new TypeError(\"Epoch timestamps must be valid finite numbers.\");\n    }\n    return new Date(Math.round(num * 1000));\n};\nexport const _parseRfc3339DateTimeWithOffset = (value) => {\n    if (value == null) {\n        return void 0;\n    }\n    if (typeof value !== \"string\") {\n        throw new TypeError(\"RFC3339 timestamps must be strings\");\n    }\n    const matches = RFC3339_WITH_OFFSET.exec(value);\n    if (!matches) {\n        throw new TypeError(`Invalid RFC3339 timestamp format ${value}`);\n    }\n    const [, yearStr, monthStr, dayStr, hours, minutes, seconds, , ms, offsetStr] = matches;\n    range(monthStr, 1, 12);\n    range(dayStr, 1, 31);\n    range(hours, 0, 23);\n    range(minutes, 0, 59);\n    range(seconds, 0, 60);\n    const date = new Date(Date.UTC(Number(yearStr), Number(monthStr) - 1, Number(dayStr), Number(hours), Number(minutes), Number(seconds), Number(ms) ? Math.round(parseFloat(`0.${ms}`) * 1000) : 0));\n    date.setUTCFullYear(Number(yearStr));\n    if (offsetStr.toUpperCase() != \"Z\") {\n        const [, sign, offsetH, offsetM] = /([+-])(\\d\\d):(\\d\\d)/.exec(offsetStr) || [void 0, \"+\", 0, 0];\n        const scalar = sign === \"-\" ? 1 : -1;\n        date.setTime(date.getTime() + scalar * (Number(offsetH) * 60 * 60 * 1000 + Number(offsetM) * 60 * 1000));\n    }\n    return date;\n};\nexport const _parseRfc7231DateTime = (value) => {\n    if (value == null) {\n        return void 0;\n    }\n    if (typeof value !== \"string\") {\n        throw new TypeError(\"RFC7231 timestamps must be strings.\");\n    }\n    let day;\n    let month;\n    let year;\n    let hour;\n    let minute;\n    let second;\n    let fraction;\n    let matches;\n    if ((matches = IMF_FIXDATE.exec(value))) {\n        [, day, month, year, hour, minute, second, fraction] = matches;\n    }\n    else if ((matches = RFC_850_DATE.exec(value))) {\n        [, day, month, year, hour, minute, second, fraction] = matches;\n        year = (Number(year) + 1900).toString();\n    }\n    else if ((matches = ASC_TIME.exec(value))) {\n        [, month, day, hour, minute, second, fraction, year] = matches;\n    }\n    if (year && second) {\n        const timestamp = Date.UTC(Number(year), months.indexOf(month), Number(day), Number(hour), Number(minute), Number(second), fraction ? Math.round(parseFloat(`0.${fraction}`) * 1000) : 0);\n        range(day, 1, 31);\n        range(hour, 0, 23);\n        range(minute, 0, 59);\n        range(second, 0, 60);\n        const date = new Date(timestamp);\n        date.setUTCFullYear(Number(year));\n        return date;\n    }\n    throw new TypeError(`Invalid RFC7231 date-time value ${value}.`);\n};\nfunction range(v, min, max) {\n    const _v = Number(v);\n    if (_v < min || _v > max) {\n        throw new Error(`Value ${_v} out of range [${min}, ${max}]`);\n    }\n}\n", "export function splitEvery(value, delimiter, numDelimiters) {\n    if (numDelimiters <= 0 || !Number.isInteger(numDelimiters)) {\n        throw new Error(\"Invalid number of delimiters (\" + numDelimiters + \") for splitEvery.\");\n    }\n    const segments = value.split(delimiter);\n    if (numDelimiters === 1) {\n        return segments;\n    }\n    const compoundSegments = [];\n    let currentSegment = \"\";\n    for (let i = 0; i < segments.length; i++) {\n        if (currentSegment === \"\") {\n            currentSegment = segments[i];\n        }\n        else {\n            currentSegment += delimiter + segments[i];\n        }\n        if ((i + 1) % numDelimiters === 0) {\n            compoundSegments.push(currentSegment);\n            currentSegment = \"\";\n        }\n    }\n    if (currentSegment !== \"\") {\n        compoundSegments.push(currentSegment);\n    }\n    return compoundSegments;\n}\n", "export const splitHeader = (value) => {\n    const z = value.length;\n    const values = [];\n    let withinQuotes = false;\n    let prevChar = undefined;\n    let anchor = 0;\n    for (let i = 0; i < z; ++i) {\n        const char = value[i];\n        switch (char) {\n            case `\"`:\n                if (prevChar !== \"\\\\\") {\n                    withinQuotes = !withinQuotes;\n                }\n                break;\n            case \",\":\n                if (!withinQuotes) {\n                    values.push(value.slice(anchor, i));\n                    anchor = i + 1;\n                }\n                break;\n            default:\n        }\n        prevChar = char;\n    }\n    values.push(value.slice(anchor));\n    return values.map((v) => {\n        v = v.trim();\n        const z = v.length;\n        if (z < 2) {\n            return v;\n        }\n        if (v[0] === `\"` && v[z - 1] === `\"`) {\n            v = v.slice(1, z - 1);\n        }\n        return v.replace(/\\\\\"/g, '\"');\n    });\n};\n", "const format = /^-?\\d*(\\.\\d+)?$/;\nexport class NumericValue {\n    string;\n    type;\n    constructor(string, type) {\n        this.string = string;\n        this.type = type;\n        if (!format.test(string)) {\n            throw new Error(`@smithy/core/serde - NumericValue must only contain [0-9], at most one decimal point \".\", and an optional negation prefix \"-\".`);\n        }\n    }\n    toString() {\n        return this.string;\n    }\n    static [Symbol.hasInstance](object) {\n        if (!object || typeof object !== \"object\") {\n            return false;\n        }\n        const _nv = object;\n        return NumericValue.prototype.isPrototypeOf(object) || (_nv.type === \"bigDecimal\" && format.test(_nv.string));\n    }\n}\nexport function nv(input) {\n    return new NumericValue(String(input), \"bigDecimal\");\n}\n", "export * from \"./copyDocumentWithTransform\";\nexport * from \"./date-utils\";\nexport * from \"./generateIdempotencyToken\";\nexport * from \"./lazy-json\";\nexport * from \"./parse-utils\";\nexport * from \"./quote-header\";\nexport * from \"./schema-serde-lib/schema-date-utils\";\nexport * from \"./split-every\";\nexport * from \"./split-header\";\nexport * from \"./value/NumericValue\";\n", "'use strict';\n\nconst isArrayBuffer = (arg) => (typeof ArrayBuffer === \"function\" && arg instanceof ArrayBuffer) ||\n    Object.prototype.toString.call(arg) === \"[object ArrayBuffer]\";\n\nexports.isArrayBuffer = isArrayBuffer;\n", "'use strict';\n\nvar isArrayBuffer = require('@smithy/is-array-buffer');\nvar buffer = require('buffer');\n\nconst fromArrayBuffer = (input, offset = 0, length = input.byteLength - offset) => {\n    if (!isArrayBuffer.isArrayBuffer(input)) {\n        throw new TypeError(`The \"input\" argument must be ArrayBuffer. Received type ${typeof input} (${input})`);\n    }\n    return buffer.Buffer.from(input, offset, length);\n};\nconst fromString = (input, encoding) => {\n    if (typeof input !== \"string\") {\n        throw new TypeError(`The \"input\" argument must be of type string. Received type ${typeof input} (${input})`);\n    }\n    return encoding ? buffer.Buffer.from(input, encoding) : buffer.Buffer.from(input);\n};\n\nexports.fromArrayBuffer = fromArrayBuffer;\nexports.fromString = fromString;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromBase64 = void 0;\nconst util_buffer_from_1 = require(\"@smithy/util-buffer-from\");\nconst BASE64_REGEX = /^[A-Za-z0-9+/]*={0,2}$/;\nconst fromBase64 = (input) => {\n    if ((input.length * 3) % 4 !== 0) {\n        throw new TypeError(`Incorrect padding on base64 string.`);\n    }\n    if (!BASE64_REGEX.exec(input)) {\n        throw new TypeError(`Invalid base64 string.`);\n    }\n    const buffer = (0, util_buffer_from_1.fromString)(input, \"base64\");\n    return new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength);\n};\nexports.fromBase64 = fromBase64;\n", "'use strict';\n\nvar utilBufferFrom = require('@smithy/util-buffer-from');\n\nconst fromUtf8 = (input) => {\n    const buf = utilBufferFrom.fromString(input, \"utf8\");\n    return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength / Uint8Array.BYTES_PER_ELEMENT);\n};\n\nconst toUint8Array = (data) => {\n    if (typeof data === \"string\") {\n        return fromUtf8(data);\n    }\n    if (ArrayBuffer.isView(data)) {\n        return new Uint8Array(data.buffer, data.byteOffset, data.byteLength / Uint8Array.BYTES_PER_ELEMENT);\n    }\n    return new Uint8Array(data);\n};\n\nconst toUtf8 = (input) => {\n    if (typeof input === \"string\") {\n        return input;\n    }\n    if (typeof input !== \"object\" || typeof input.byteOffset !== \"number\" || typeof input.byteLength !== \"number\") {\n        throw new Error(\"@smithy/util-utf8: toUtf8 encoder function only accepts string | Uint8Array.\");\n    }\n    return utilBufferFrom.fromArrayBuffer(input.buffer, input.byteOffset, input.byteLength).toString(\"utf8\");\n};\n\nexports.fromUtf8 = fromUtf8;\nexports.toUint8Array = toUint8Array;\nexports.toUtf8 = toUtf8;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toBase64 = void 0;\nconst util_buffer_from_1 = require(\"@smithy/util-buffer-from\");\nconst util_utf8_1 = require(\"@smithy/util-utf8\");\nconst toBase64 = (_input) => {\n    let input;\n    if (typeof _input === \"string\") {\n        input = (0, util_utf8_1.fromUtf8)(_input);\n    }\n    else {\n        input = _input;\n    }\n    if (typeof input !== \"object\" || typeof input.byteOffset !== \"number\" || typeof input.byteLength !== \"number\") {\n        throw new Error(\"@smithy/util-base64: toBase64 encoder function only accepts string | Uint8Array.\");\n    }\n    return (0, util_buffer_from_1.fromArrayBuffer)(input.buffer, input.byteOffset, input.byteLength).toString(\"base64\");\n};\nexports.toBase64 = toBase64;\n", "'use strict';\n\nvar fromBase64 = require('./fromBase64');\nvar toBase64 = require('./toBase64');\n\n\n\nObject.prototype.hasOwnProperty.call(fromBase64, '__proto__') &&\n\t!Object.prototype.hasOwnProperty.call(exports, '__proto__') &&\n\tObject.defineProperty(exports, '__proto__', {\n\t\tenumerable: true,\n\t\tvalue: fromBase64['__proto__']\n\t});\n\nObject.keys(fromBase64).forEach(function (k) {\n\tif (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) exports[k] = fromBase64[k];\n});\nObject.prototype.hasOwnProperty.call(toBase64, '__proto__') &&\n\t!Object.prototype.hasOwnProperty.call(exports, '__proto__') &&\n\tObject.defineProperty(exports, '__proto__', {\n\t\tenumerable: true,\n\t\tvalue: toBase64['__proto__']\n\t});\n\nObject.keys(toBase64).forEach(function (k) {\n\tif (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) exports[k] = toBase64[k];\n});\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ChecksumStream = void 0;\nconst util_base64_1 = require(\"@smithy/util-base64\");\nconst stream_1 = require(\"stream\");\nclass ChecksumStream extends stream_1.Duplex {\n    expectedChecksum;\n    checksumSourceLocation;\n    checksum;\n    source;\n    base64Encoder;\n    pendingCallback = null;\n    constructor({ expectedChecksum, checksum, source, checksumSourceLocation, base64Encoder, }) {\n        super();\n        if (typeof source.pipe === \"function\") {\n            this.source = source;\n        }\n        else {\n            throw new Error(`@smithy/util-stream: unsupported source type ${source?.constructor?.name ?? source} in ChecksumStream.`);\n        }\n        this.base64Encoder = base64Encoder ?? util_base64_1.toBase64;\n        this.expectedChecksum = expectedChecksum;\n        this.checksum = checksum;\n        this.checksumSourceLocation = checksumSourceLocation;\n        this.source.pipe(this);\n    }\n    _read(size) {\n        if (this.pendingCallback) {\n            const callback = this.pendingCallback;\n            this.pendingCallback = null;\n            callback();\n        }\n    }\n    _write(chunk, encoding, callback) {\n        try {\n            this.checksum.update(chunk);\n            const canPushMore = this.push(chunk);\n            if (!canPushMore) {\n                this.pendingCallback = callback;\n                return;\n            }\n        }\n        catch (e) {\n            return callback(e);\n        }\n        return callback();\n    }\n    async _final(callback) {\n        try {\n            const digest = await this.checksum.digest();\n            const received = this.base64Encoder(digest);\n            if (this.expectedChecksum !== received) {\n                return callback(new Error(`Checksum mismatch: expected \"${this.expectedChecksum}\" but received \"${received}\"` +\n                    ` in response header \"${this.checksumSourceLocation}\".`));\n            }\n        }\n        catch (e) {\n            return callback(e);\n        }\n        this.push(null);\n        return callback();\n    }\n}\nexports.ChecksumStream = ChecksumStream;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isBlob = exports.isReadableStream = void 0;\nconst isReadableStream = (stream) => typeof ReadableStream === \"function\" &&\n    (stream?.constructor?.name === ReadableStream.name || stream instanceof ReadableStream);\nexports.isReadableStream = isReadableStream;\nconst isBlob = (blob) => {\n    return typeof Blob === \"function\" && (blob?.constructor?.name === Blob.name || blob instanceof Blob);\n};\nexports.isBlob = isBlob;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ChecksumStream = void 0;\nconst ReadableStreamRef = typeof ReadableStream === \"function\" ? ReadableStream : function () { };\nclass ChecksumStream extends ReadableStreamRef {\n}\nexports.ChecksumStream = ChecksumStream;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createChecksumStream = void 0;\nconst util_base64_1 = require(\"@smithy/util-base64\");\nconst stream_type_check_1 = require(\"../stream-type-check\");\nconst ChecksumStream_browser_1 = require(\"./ChecksumStream.browser\");\nconst createChecksumStream = ({ expectedChecksum, checksum, source, checksumSourceLocation, base64Encoder, }) => {\n    if (!(0, stream_type_check_1.isReadableStream)(source)) {\n        throw new Error(`@smithy/util-stream: unsupported source type ${source?.constructor?.name ?? source} in ChecksumStream.`);\n    }\n    const encoder = base64Encoder ?? util_base64_1.toBase64;\n    if (typeof TransformStream !== \"function\") {\n        throw new Error(\"@smithy/util-stream: unable to instantiate ChecksumStream because API unavailable: ReadableStream/TransformStream.\");\n    }\n    const transform = new TransformStream({\n        start() { },\n        async transform(chunk, controller) {\n            checksum.update(chunk);\n            controller.enqueue(chunk);\n        },\n        async flush(controller) {\n            const digest = await checksum.digest();\n            const received = encoder(digest);\n            if (expectedChecksum !== received) {\n                const error = new Error(`Checksum mismatch: expected \"${expectedChecksum}\" but received \"${received}\"` +\n                    ` in response header \"${checksumSourceLocation}\".`);\n                controller.error(error);\n            }\n            else {\n                controller.terminate();\n            }\n        },\n    });\n    source.pipeThrough(transform);\n    const readable = transform.readable;\n    Object.setPrototypeOf(readable, ChecksumStream_browser_1.ChecksumStream.prototype);\n    return readable;\n};\nexports.createChecksumStream = createChecksumStream;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createChecksumStream = createChecksumStream;\nconst stream_type_check_1 = require(\"../stream-type-check\");\nconst ChecksumStream_1 = require(\"./ChecksumStream\");\nconst createChecksumStream_browser_1 = require(\"./createChecksumStream.browser\");\nfunction createChecksumStream(init) {\n    if (typeof ReadableStream === \"function\" && (0, stream_type_check_1.isReadableStream)(init.source)) {\n        return (0, createChecksumStream_browser_1.createChecksumStream)(init);\n    }\n    return new ChecksumStream_1.ChecksumStream(init);\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ByteArrayCollector = void 0;\nclass ByteArrayCollector {\n    allocByteArray;\n    byteLength = 0;\n    byteArrays = [];\n    constructor(allocByteArray) {\n        this.allocByteArray = allocByteArray;\n    }\n    push(byteArray) {\n        this.byteArrays.push(byteArray);\n        this.byteLength += byteArray.byteLength;\n    }\n    flush() {\n        if (this.byteArrays.length === 1) {\n            const bytes = this.byteArrays[0];\n            this.reset();\n            return bytes;\n        }\n        const aggregation = this.allocByteArray(this.byteLength);\n        let cursor = 0;\n        for (let i = 0; i < this.byteArrays.length; ++i) {\n            const bytes = this.byteArrays[i];\n            aggregation.set(bytes, cursor);\n            cursor += bytes.byteLength;\n        }\n        this.reset();\n        return aggregation;\n    }\n    reset() {\n        this.byteArrays = [];\n        this.byteLength = 0;\n    }\n}\nexports.ByteArrayCollector = ByteArrayCollector;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createBufferedReadable = void 0;\nexports.createBufferedReadableStream = createBufferedReadableStream;\nexports.merge = merge;\nexports.flush = flush;\nexports.sizeOf = sizeOf;\nexports.modeOf = modeOf;\nconst ByteArrayCollector_1 = require(\"./ByteArrayCollector\");\nfunction createBufferedReadableStream(upstream, size, logger) {\n    const reader = upstream.getReader();\n    let streamBufferingLoggedWarning = false;\n    let bytesSeen = 0;\n    const buffers = [\"\", new ByteArrayCollector_1.ByteArrayCollector((size) => new Uint8Array(size))];\n    let mode = -1;\n    const pull = async (controller) => {\n        const { value, done } = await reader.read();\n        const chunk = value;\n        if (done) {\n            if (mode !== -1) {\n                const remainder = flush(buffers, mode);\n                if (sizeOf(remainder) > 0) {\n                    controller.enqueue(remainder);\n                }\n            }\n            controller.close();\n        }\n        else {\n            const chunkMode = modeOf(chunk, false);\n            if (mode !== chunkMode) {\n                if (mode >= 0) {\n                    controller.enqueue(flush(buffers, mode));\n                }\n                mode = chunkMode;\n            }\n            if (mode === -1) {\n                controller.enqueue(chunk);\n                return;\n            }\n            const chunkSize = sizeOf(chunk);\n            bytesSeen += chunkSize;\n            const bufferSize = sizeOf(buffers[mode]);\n            if (chunkSize >= size && bufferSize === 0) {\n                controller.enqueue(chunk);\n            }\n            else {\n                const newSize = merge(buffers, mode, chunk);\n                if (!streamBufferingLoggedWarning && bytesSeen > size * 2) {\n                    streamBufferingLoggedWarning = true;\n                    logger?.warn(`@smithy/util-stream - stream chunk size ${chunkSize} is below threshold of ${size}, automatically buffering.`);\n                }\n                if (newSize >= size) {\n                    controller.enqueue(flush(buffers, mode));\n                }\n                else {\n                    await pull(controller);\n                }\n            }\n        }\n    };\n    return new ReadableStream({\n        pull,\n    });\n}\nexports.createBufferedReadable = createBufferedReadableStream;\nfunction merge(buffers, mode, chunk) {\n    switch (mode) {\n        case 0:\n            buffers[0] += chunk;\n            return sizeOf(buffers[0]);\n        case 1:\n        case 2:\n            buffers[mode].push(chunk);\n            return sizeOf(buffers[mode]);\n    }\n}\nfunction flush(buffers, mode) {\n    switch (mode) {\n        case 0:\n            const s = buffers[0];\n            buffers[0] = \"\";\n            return s;\n        case 1:\n        case 2:\n            return buffers[mode].flush();\n    }\n    throw new Error(`@smithy/util-stream - invalid index ${mode} given to flush()`);\n}\nfunction sizeOf(chunk) {\n    return chunk?.byteLength ?? chunk?.length ?? 0;\n}\nfunction modeOf(chunk, allowBuffer = true) {\n    if (allowBuffer && typeof Buffer !== \"undefined\" && chunk instanceof Buffer) {\n        return 2;\n    }\n    if (chunk instanceof Uint8Array) {\n        return 1;\n    }\n    if (typeof chunk === \"string\") {\n        return 0;\n    }\n    return -1;\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createBufferedReadable = createBufferedReadable;\nconst node_stream_1 = require(\"node:stream\");\nconst ByteArrayCollector_1 = require(\"./ByteArrayCollector\");\nconst createBufferedReadableStream_1 = require(\"./createBufferedReadableStream\");\nconst stream_type_check_1 = require(\"./stream-type-check\");\nfunction createBufferedReadable(upstream, size, logger) {\n    if ((0, stream_type_check_1.isReadableStream)(upstream)) {\n        return (0, createBufferedReadableStream_1.createBufferedReadableStream)(upstream, size, logger);\n    }\n    const downstream = new node_stream_1.Readable({ read() { } });\n    let streamBufferingLoggedWarning = false;\n    let bytesSeen = 0;\n    const buffers = [\n        \"\",\n        new ByteArrayCollector_1.ByteArrayCollector((size) => new Uint8Array(size)),\n        new ByteArrayCollector_1.ByteArrayCollector((size) => Buffer.from(new Uint8Array(size))),\n    ];\n    let mode = -1;\n    upstream.on(\"data\", (chunk) => {\n        const chunkMode = (0, createBufferedReadableStream_1.modeOf)(chunk, true);\n        if (mode !== chunkMode) {\n            if (mode >= 0) {\n                downstream.push((0, createBufferedReadableStream_1.flush)(buffers, mode));\n            }\n            mode = chunkMode;\n        }\n        if (mode === -1) {\n            downstream.push(chunk);\n            return;\n        }\n        const chunkSize = (0, createBufferedReadableStream_1.sizeOf)(chunk);\n        bytesSeen += chunkSize;\n        const bufferSize = (0, createBufferedReadableStream_1.sizeOf)(buffers[mode]);\n        if (chunkSize >= size && bufferSize === 0) {\n            downstream.push(chunk);\n        }\n        else {\n            const newSize = (0, createBufferedReadableStream_1.merge)(buffers, mode, chunk);\n            if (!streamBufferingLoggedWarning && bytesSeen > size * 2) {\n                streamBufferingLoggedWarning = true;\n                logger?.warn(`@smithy/util-stream - stream chunk size ${chunkSize} is below threshold of ${size}, automatically buffering.`);\n            }\n            if (newSize >= size) {\n                downstream.push((0, createBufferedReadableStream_1.flush)(buffers, mode));\n            }\n        }\n    });\n    upstream.on(\"end\", () => {\n        if (mode !== -1) {\n            const remainder = (0, createBufferedReadableStream_1.flush)(buffers, mode);\n            if ((0, createBufferedReadableStream_1.sizeOf)(remainder) > 0) {\n                downstream.push(remainder);\n            }\n        }\n        downstream.push(null);\n    });\n    return downstream;\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getAwsChunkedEncodingStream = void 0;\nconst getAwsChunkedEncodingStream = (readableStream, options) => {\n    const { base64Encoder, bodyLengthChecker, checksumAlgorithmFn, checksumLocationName, streamHasher } = options;\n    const checksumRequired = base64Encoder !== undefined &&\n        bodyLengthChecker !== undefined &&\n        checksumAlgorithmFn !== undefined &&\n        checksumLocationName !== undefined &&\n        streamHasher !== undefined;\n    const digest = checksumRequired ? streamHasher(checksumAlgorithmFn, readableStream) : undefined;\n    const reader = readableStream.getReader();\n    return new ReadableStream({\n        async pull(controller) {\n            const { value, done } = await reader.read();\n            if (done) {\n                controller.enqueue(`0\\r\\n`);\n                if (checksumRequired) {\n                    const checksum = base64Encoder(await digest);\n                    controller.enqueue(`${checksumLocationName}:${checksum}\\r\\n`);\n                    controller.enqueue(`\\r\\n`);\n                }\n                controller.close();\n            }\n            else {\n                controller.enqueue(`${(bodyLengthChecker(value) || 0).toString(16)}\\r\\n${value}\\r\\n`);\n            }\n        },\n    });\n};\nexports.getAwsChunkedEncodingStream = getAwsChunkedEncodingStream;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getAwsChunkedEncodingStream = getAwsChunkedEncodingStream;\nconst node_stream_1 = require(\"node:stream\");\nconst getAwsChunkedEncodingStream_browser_1 = require(\"./getAwsChunkedEncodingStream.browser\");\nconst stream_type_check_1 = require(\"./stream-type-check\");\nfunction getAwsChunkedEncodingStream(stream, options) {\n    const readable = stream;\n    const readableStream = stream;\n    if ((0, stream_type_check_1.isReadableStream)(readableStream)) {\n        return (0, getAwsChunkedEncodingStream_browser_1.getAwsChunkedEncodingStream)(readableStream, options);\n    }\n    const { base64Encoder, bodyLengthChecker, checksumAlgorithmFn, checksumLocationName, streamHasher } = options;\n    const checksumRequired = base64Encoder !== undefined &&\n        checksumAlgorithmFn !== undefined &&\n        checksumLocationName !== undefined &&\n        streamHasher !== undefined;\n    const digest = checksumRequired ? streamHasher(checksumAlgorithmFn, readable) : undefined;\n    const awsChunkedEncodingStream = new node_stream_1.Readable({\n        read: () => { },\n    });\n    readable.on(\"data\", (data) => {\n        const length = bodyLengthChecker(data) || 0;\n        if (length === 0) {\n            return;\n        }\n        awsChunkedEncodingStream.push(`${length.toString(16)}\\r\\n`);\n        awsChunkedEncodingStream.push(data);\n        awsChunkedEncodingStream.push(\"\\r\\n\");\n    });\n    readable.on(\"end\", async () => {\n        awsChunkedEncodingStream.push(`0\\r\\n`);\n        if (checksumRequired) {\n            const checksum = base64Encoder(await digest);\n            awsChunkedEncodingStream.push(`${checksumLocationName}:${checksum}\\r\\n`);\n            awsChunkedEncodingStream.push(`\\r\\n`);\n        }\n        awsChunkedEncodingStream.push(null);\n    });\n    return awsChunkedEncodingStream;\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.headStream = headStream;\nasync function headStream(stream, bytes) {\n    let byteLengthCounter = 0;\n    const chunks = [];\n    const reader = stream.getReader();\n    let isDone = false;\n    while (!isDone) {\n        const { done, value } = await reader.read();\n        if (value) {\n            chunks.push(value);\n            byteLengthCounter += value?.byteLength ?? 0;\n        }\n        if (byteLengthCounter >= bytes) {\n            break;\n        }\n        isDone = done;\n    }\n    reader.releaseLock();\n    const collected = new Uint8Array(Math.min(bytes, byteLengthCounter));\n    let offset = 0;\n    for (const chunk of chunks) {\n        if (chunk.byteLength > collected.byteLength - offset) {\n            collected.set(chunk.subarray(0, collected.byteLength - offset), offset);\n            break;\n        }\n        else {\n            collected.set(chunk, offset);\n        }\n        offset += chunk.length;\n    }\n    return collected;\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.headStream = void 0;\nconst stream_1 = require(\"stream\");\nconst headStream_browser_1 = require(\"./headStream.browser\");\nconst stream_type_check_1 = require(\"./stream-type-check\");\nconst headStream = (stream, bytes) => {\n    if ((0, stream_type_check_1.isReadableStream)(stream)) {\n        return (0, headStream_browser_1.headStream)(stream, bytes);\n    }\n    return new Promise((resolve, reject) => {\n        const collector = new Collector();\n        collector.limit = bytes;\n        stream.pipe(collector);\n        stream.on(\"error\", (err) => {\n            collector.end();\n            reject(err);\n        });\n        collector.on(\"error\", reject);\n        collector.on(\"finish\", function () {\n            const bytes = new Uint8Array(Buffer.concat(this.buffers));\n            resolve(bytes);\n        });\n    });\n};\nexports.headStream = headStream;\nclass Collector extends stream_1.Writable {\n    buffers = [];\n    limit = Infinity;\n    bytesBuffered = 0;\n    _write(chunk, encoding, callback) {\n        this.buffers.push(chunk);\n        this.bytesBuffered += chunk.byteLength ?? 0;\n        if (this.bytesBuffered >= this.limit) {\n            const excess = this.bytesBuffered - this.limit;\n            const tailBuffer = this.buffers[this.buffers.length - 1];\n            this.buffers[this.buffers.length - 1] = tailBuffer.subarray(0, tailBuffer.byteLength - excess);\n            this.emit(\"finish\");\n        }\n        callback();\n    }\n}\n", "'use strict';\n\nvar protocolHttp = require('@smithy/protocol-http');\nvar querystringBuilder = require('@smithy/querystring-builder');\nvar utilBase64 = require('@smithy/util-base64');\n\nfunction createRequest(url, requestOptions) {\n    return new Request(url, requestOptions);\n}\n\nfunction requestTimeout(timeoutInMs = 0) {\n    return new Promise((resolve, reject) => {\n        if (timeoutInMs) {\n            setTimeout(() => {\n                const timeoutError = new Error(`Request did not complete within ${timeoutInMs} ms`);\n                timeoutError.name = \"TimeoutError\";\n                reject(timeoutError);\n            }, timeoutInMs);\n        }\n    });\n}\n\nconst keepAliveSupport = {\n    supported: undefined,\n};\nclass FetchHttpHandler {\n    config;\n    configProvider;\n    static create(instanceOrOptions) {\n        if (typeof instanceOrOptions?.handle === \"function\") {\n            return instanceOrOptions;\n        }\n        return new FetchHttpHandler(instanceOrOptions);\n    }\n    constructor(options) {\n        if (typeof options === \"function\") {\n            this.configProvider = options().then((opts) => opts || {});\n        }\n        else {\n            this.config = options ?? {};\n            this.configProvider = Promise.resolve(this.config);\n        }\n        if (keepAliveSupport.supported === undefined) {\n            keepAliveSupport.supported = Boolean(typeof Request !== \"undefined\" && \"keepalive\" in createRequest(\"https://[::1]\"));\n        }\n    }\n    destroy() {\n    }\n    async handle(request, { abortSignal, requestTimeout: requestTimeout$1 } = {}) {\n        if (!this.config) {\n            this.config = await this.configProvider;\n        }\n        const requestTimeoutInMs = requestTimeout$1 ?? this.config.requestTimeout;\n        const keepAlive = this.config.keepAlive === true;\n        const credentials = this.config.credentials;\n        if (abortSignal?.aborted) {\n            const abortError = buildAbortError(abortSignal);\n            return Promise.reject(abortError);\n        }\n        let path = request.path;\n        const queryString = querystringBuilder.buildQueryString(request.query || {});\n        if (queryString) {\n            path += `?${queryString}`;\n        }\n        if (request.fragment) {\n            path += `#${request.fragment}`;\n        }\n        let auth = \"\";\n        if (request.username != null || request.password != null) {\n            const username = request.username ?? \"\";\n            const password = request.password ?? \"\";\n            auth = `${username}:${password}@`;\n        }\n        const { port, method } = request;\n        const url = `${request.protocol}//${auth}${request.hostname}${port ? `:${port}` : \"\"}${path}`;\n        const body = method === \"GET\" || method === \"HEAD\" ? undefined : request.body;\n        const requestOptions = {\n            body,\n            headers: new Headers(request.headers),\n            method: method,\n            credentials,\n        };\n        if (this.config?.cache) {\n            requestOptions.cache = this.config.cache;\n        }\n        if (body) {\n            requestOptions.duplex = \"half\";\n        }\n        if (typeof AbortController !== \"undefined\") {\n            requestOptions.signal = abortSignal;\n        }\n        if (keepAliveSupport.supported) {\n            requestOptions.keepalive = keepAlive;\n        }\n        if (typeof this.config.requestInit === \"function\") {\n            Object.assign(requestOptions, this.config.requestInit(request));\n        }\n        let removeSignalEventListener = () => { };\n        const fetchRequest = createRequest(url, requestOptions);\n        const raceOfPromises = [\n            fetch(fetchRequest).then((response) => {\n                const fetchHeaders = response.headers;\n                const transformedHeaders = {};\n                for (const pair of fetchHeaders.entries()) {\n                    transformedHeaders[pair[0]] = pair[1];\n                }\n                const hasReadableStream = response.body != undefined;\n                if (!hasReadableStream) {\n                    return response.blob().then((body) => ({\n                        response: new protocolHttp.HttpResponse({\n                            headers: transformedHeaders,\n                            reason: response.statusText,\n                            statusCode: response.status,\n                            body,\n                        }),\n                    }));\n                }\n                return {\n                    response: new protocolHttp.HttpResponse({\n                        headers: transformedHeaders,\n                        reason: response.statusText,\n                        statusCode: response.status,\n                        body: response.body,\n                    }),\n                };\n            }),\n            requestTimeout(requestTimeoutInMs),\n        ];\n        if (abortSignal) {\n            raceOfPromises.push(new Promise((resolve, reject) => {\n                const onAbort = () => {\n                    const abortError = buildAbortError(abortSignal);\n                    reject(abortError);\n                };\n                if (typeof abortSignal.addEventListener === \"function\") {\n                    const signal = abortSignal;\n                    signal.addEventListener(\"abort\", onAbort, { once: true });\n                    removeSignalEventListener = () => signal.removeEventListener(\"abort\", onAbort);\n                }\n                else {\n                    abortSignal.onabort = onAbort;\n                }\n            }));\n        }\n        return Promise.race(raceOfPromises).finally(removeSignalEventListener);\n    }\n    updateHttpClientConfig(key, value) {\n        this.config = undefined;\n        this.configProvider = this.configProvider.then((config) => {\n            config[key] = value;\n            return config;\n        });\n    }\n    httpHandlerConfigs() {\n        return this.config ?? {};\n    }\n}\nfunction buildAbortError(abortSignal) {\n    const reason = abortSignal && typeof abortSignal === \"object\" && \"reason\" in abortSignal\n        ? abortSignal.reason\n        : undefined;\n    if (reason) {\n        if (reason instanceof Error) {\n            const abortError = new Error(\"Request aborted\");\n            abortError.name = \"AbortError\";\n            abortError.cause = reason;\n            return abortError;\n        }\n        const abortError = new Error(String(reason));\n        abortError.name = \"AbortError\";\n        return abortError;\n    }\n    const abortError = new Error(\"Request aborted\");\n    abortError.name = \"AbortError\";\n    return abortError;\n}\n\nconst streamCollector = async (stream) => {\n    if ((typeof Blob === \"function\" && stream instanceof Blob) || stream.constructor?.name === \"Blob\") {\n        if (Blob.prototype.arrayBuffer !== undefined) {\n            return new Uint8Array(await stream.arrayBuffer());\n        }\n        return collectBlob(stream);\n    }\n    return collectStream(stream);\n};\nasync function collectBlob(blob) {\n    const base64 = await readToBase64(blob);\n    const arrayBuffer = utilBase64.fromBase64(base64);\n    return new Uint8Array(arrayBuffer);\n}\nasync function collectStream(stream) {\n    const chunks = [];\n    const reader = stream.getReader();\n    let isDone = false;\n    let length = 0;\n    while (!isDone) {\n        const { done, value } = await reader.read();\n        if (value) {\n            chunks.push(value);\n            length += value.length;\n        }\n        isDone = done;\n    }\n    const collected = new Uint8Array(length);\n    let offset = 0;\n    for (const chunk of chunks) {\n        collected.set(chunk, offset);\n        offset += chunk.length;\n    }\n    return collected;\n}\nfunction readToBase64(blob) {\n    return new Promise((resolve, reject) => {\n        const reader = new FileReader();\n        reader.onloadend = () => {\n            if (reader.readyState !== 2) {\n                return reject(new Error(\"Reader aborted too early\"));\n            }\n            const result = (reader.result ?? \"\");\n            const commaIndex = result.indexOf(\",\");\n            const dataOffset = commaIndex > -1 ? commaIndex + 1 : result.length;\n            resolve(result.substring(dataOffset));\n        };\n        reader.onabort = () => reject(new Error(\"Read aborted\"));\n        reader.onerror = () => reject(reader.error);\n        reader.readAsDataURL(blob);\n    });\n}\n\nexports.FetchHttpHandler = FetchHttpHandler;\nexports.keepAliveSupport = keepAliveSupport;\nexports.streamCollector = streamCollector;\n", "'use strict';\n\nconst SHORT_TO_HEX = {};\nconst HEX_TO_SHORT = {};\nfor (let i = 0; i < 256; i++) {\n    let encodedByte = i.toString(16).toLowerCase();\n    if (encodedByte.length === 1) {\n        encodedByte = `0${encodedByte}`;\n    }\n    SHORT_TO_HEX[i] = encodedByte;\n    HEX_TO_SHORT[encodedByte] = i;\n}\nfunction fromHex(encoded) {\n    if (encoded.length % 2 !== 0) {\n        throw new Error(\"Hex encoded strings must have an even number length\");\n    }\n    const out = new Uint8Array(encoded.length / 2);\n    for (let i = 0; i < encoded.length; i += 2) {\n        const encodedByte = encoded.slice(i, i + 2).toLowerCase();\n        if (encodedByte in HEX_TO_SHORT) {\n            out[i / 2] = HEX_TO_SHORT[encodedByte];\n        }\n        else {\n            throw new Error(`Cannot decode unrecognized sequence ${encodedByte} as hexadecimal`);\n        }\n    }\n    return out;\n}\nfunction toHex(bytes) {\n    let out = \"\";\n    for (let i = 0; i < bytes.byteLength; i++) {\n        out += SHORT_TO_HEX[bytes[i]];\n    }\n    return out;\n}\n\nexports.fromHex = fromHex;\nexports.toHex = toHex;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.sdkStreamMixin = void 0;\nconst fetch_http_handler_1 = require(\"@smithy/fetch-http-handler\");\nconst util_base64_1 = require(\"@smithy/util-base64\");\nconst util_hex_encoding_1 = require(\"@smithy/util-hex-encoding\");\nconst util_utf8_1 = require(\"@smithy/util-utf8\");\nconst stream_type_check_1 = require(\"./stream-type-check\");\nconst ERR_MSG_STREAM_HAS_BEEN_TRANSFORMED = \"The stream has already been transformed.\";\nconst sdkStreamMixin = (stream) => {\n    if (!isBlobInstance(stream) && !(0, stream_type_check_1.isReadableStream)(stream)) {\n        const name = stream?.__proto__?.constructor?.name || stream;\n        throw new Error(`Unexpected stream implementation, expect Blob or ReadableStream, got ${name}`);\n    }\n    let transformed = false;\n    const transformToByteArray = async () => {\n        if (transformed) {\n            throw new Error(ERR_MSG_STREAM_HAS_BEEN_TRANSFORMED);\n        }\n        transformed = true;\n        return await (0, fetch_http_handler_1.streamCollector)(stream);\n    };\n    const blobToWebStream = (blob) => {\n        if (typeof blob.stream !== \"function\") {\n            throw new Error(\"Cannot transform payload Blob to web stream. Please make sure the Blob.stream() is polyfilled.\\n\" +\n                \"If you are using React Native, this API is not yet supported, see: https://react-native.canny.io/feature-requests/p/fetch-streaming-body\");\n        }\n        return blob.stream();\n    };\n    return Object.assign(stream, {\n        transformToByteArray: transformToByteArray,\n        transformToString: async (encoding) => {\n            const buf = await transformToByteArray();\n            if (encoding === \"base64\") {\n                return (0, util_base64_1.toBase64)(buf);\n            }\n            else if (encoding === \"hex\") {\n                return (0, util_hex_encoding_1.toHex)(buf);\n            }\n            else if (encoding === undefined || encoding === \"utf8\" || encoding === \"utf-8\") {\n                return (0, util_utf8_1.toUtf8)(buf);\n            }\n            else if (typeof TextDecoder === \"function\") {\n                return new TextDecoder(encoding).decode(buf);\n            }\n            else {\n                throw new Error(\"TextDecoder is not available, please make sure polyfill is provided.\");\n            }\n        },\n        transformToWebStream: () => {\n            if (transformed) {\n                throw new Error(ERR_MSG_STREAM_HAS_BEEN_TRANSFORMED);\n            }\n            transformed = true;\n            if (isBlobInstance(stream)) {\n                return blobToWebStream(stream);\n            }\n            else if ((0, stream_type_check_1.isReadableStream)(stream)) {\n                return stream;\n            }\n            else {\n                throw new Error(`Cannot transform payload to web stream, got ${stream}`);\n            }\n        },\n    });\n};\nexports.sdkStreamMixin = sdkStreamMixin;\nconst isBlobInstance = (stream) => typeof Blob === \"function\" && stream instanceof Blob;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.sdkStreamMixin = void 0;\nconst node_http_handler_1 = require(\"@smithy/node-http-handler\");\nconst util_buffer_from_1 = require(\"@smithy/util-buffer-from\");\nconst stream_1 = require(\"stream\");\nconst sdk_stream_mixin_browser_1 = require(\"./sdk-stream-mixin.browser\");\nconst ERR_MSG_STREAM_HAS_BEEN_TRANSFORMED = \"The stream has already been transformed.\";\nconst sdkStreamMixin = (stream) => {\n    if (!(stream instanceof stream_1.Readable)) {\n        try {\n            return (0, sdk_stream_mixin_browser_1.sdkStreamMixin)(stream);\n        }\n        catch (e) {\n            const name = stream?.__proto__?.constructor?.name || stream;\n            throw new Error(`Unexpected stream implementation, expect Stream.Readable instance, got ${name}`);\n        }\n    }\n    let transformed = false;\n    const transformToByteArray = async () => {\n        if (transformed) {\n            throw new Error(ERR_MSG_STREAM_HAS_BEEN_TRANSFORMED);\n        }\n        transformed = true;\n        return await (0, node_http_handler_1.streamCollector)(stream);\n    };\n    return Object.assign(stream, {\n        transformToByteArray,\n        transformToString: async (encoding) => {\n            const buf = await transformToByteArray();\n            if (encoding === undefined || Buffer.isEncoding(encoding)) {\n                return (0, util_buffer_from_1.fromArrayBuffer)(buf.buffer, buf.byteOffset, buf.byteLength).toString(encoding);\n            }\n            else {\n                const decoder = new TextDecoder(encoding);\n                return decoder.decode(buf);\n            }\n        },\n        transformToWebStream: () => {\n            if (transformed) {\n                throw new Error(ERR_MSG_STREAM_HAS_BEEN_TRANSFORMED);\n            }\n            if (stream.readableFlowing !== null) {\n                throw new Error(\"The stream has been consumed by other callbacks.\");\n            }\n            if (typeof stream_1.Readable.toWeb !== \"function\") {\n                throw new Error(\"Readable.toWeb() is not supported. Please ensure a polyfill is available.\");\n            }\n            transformed = true;\n            return stream_1.Readable.toWeb(stream);\n        },\n    });\n};\nexports.sdkStreamMixin = sdkStreamMixin;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.splitStream = splitStream;\nasync function splitStream(stream) {\n    if (typeof stream.stream === \"function\") {\n        stream = stream.stream();\n    }\n    const readableStream = stream;\n    return readableStream.tee();\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.splitStream = splitStream;\nconst stream_1 = require(\"stream\");\nconst splitStream_browser_1 = require(\"./splitStream.browser\");\nconst stream_type_check_1 = require(\"./stream-type-check\");\nasync function splitStream(stream) {\n    if ((0, stream_type_check_1.isReadableStream)(stream) || (0, stream_type_check_1.isBlob)(stream)) {\n        return (0, splitStream_browser_1.splitStream)(stream);\n    }\n    const stream1 = new stream_1.PassThrough();\n    const stream2 = new stream_1.PassThrough();\n    stream.pipe(stream1);\n    stream.pipe(stream2);\n    return [stream1, stream2];\n}\n", "'use strict';\n\nvar utilBase64 = require('@smithy/util-base64');\nvar utilUtf8 = require('@smithy/util-utf8');\nvar ChecksumStream = require('./checksum/ChecksumStream');\nvar createChecksumStream = require('./checksum/createChecksumStream');\nvar createBufferedReadable = require('./createBufferedReadable');\nvar getAwsChunkedEncodingStream = require('./getAwsChunkedEncodingStream');\nvar headStream = require('./headStream');\nvar sdkStreamMixin = require('./sdk-stream-mixin');\nvar splitStream = require('./splitStream');\nvar streamTypeCheck = require('./stream-type-check');\n\nclass Uint8ArrayBlobAdapter extends Uint8Array {\n    static fromString(source, encoding = \"utf-8\") {\n        if (typeof source === \"string\") {\n            if (encoding === \"base64\") {\n                return Uint8ArrayBlobAdapter.mutate(utilBase64.fromBase64(source));\n            }\n            return Uint8ArrayBlobAdapter.mutate(utilUtf8.fromUtf8(source));\n        }\n        throw new Error(`Unsupported conversion from ${typeof source} to Uint8ArrayBlobAdapter.`);\n    }\n    static mutate(source) {\n        Object.setPrototypeOf(source, Uint8ArrayBlobAdapter.prototype);\n        return source;\n    }\n    transformToString(encoding = \"utf-8\") {\n        if (encoding === \"base64\") {\n            return utilBase64.toBase64(this);\n        }\n        return utilUtf8.toUtf8(this);\n    }\n}\n\nexports.isBlob = streamTypeCheck.isBlob;\nexports.isReadableStream = streamTypeCheck.isReadableStream;\nexports.Uint8ArrayBlobAdapter = Uint8ArrayBlobAdapter;\nObject.prototype.hasOwnProperty.call(ChecksumStream, '__proto__') &&\n    !Object.prototype.hasOwnProperty.call(exports, '__proto__') &&\n    Object.defineProperty(exports, '__proto__', {\n        enumerable: true,\n        value: ChecksumStream['__proto__']\n    });\n\nObject.keys(ChecksumStream).forEach(function (k) {\n    if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) exports[k] = ChecksumStream[k];\n});\nObject.prototype.hasOwnProperty.call(createChecksumStream, '__proto__') &&\n    !Object.prototype.hasOwnProperty.call(exports, '__proto__') &&\n    Object.defineProperty(exports, '__proto__', {\n        enumerable: true,\n        value: createChecksumStream['__proto__']\n    });\n\nObject.keys(createChecksumStream).forEach(function (k) {\n    if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) exports[k] = createChecksumStream[k];\n});\nObject.prototype.hasOwnProperty.call(createBufferedReadable, '__proto__') &&\n    !Object.prototype.hasOwnProperty.call(exports, '__proto__') &&\n    Object.defineProperty(exports, '__proto__', {\n        enumerable: true,\n        value: createBufferedReadable['__proto__']\n    });\n\nObject.keys(createBufferedReadable).forEach(function (k) {\n    if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) exports[k] = createBufferedReadable[k];\n});\nObject.prototype.hasOwnProperty.call(getAwsChunkedEncodingStream, '__proto__') &&\n    !Object.prototype.hasOwnProperty.call(exports, '__proto__') &&\n    Object.defineProperty(exports, '__proto__', {\n        enumerable: true,\n        value: getAwsChunkedEncodingStream['__proto__']\n    });\n\nObject.keys(getAwsChunkedEncodingStream).forEach(function (k) {\n    if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) exports[k] = getAwsChunkedEncodingStream[k];\n});\nObject.prototype.hasOwnProperty.call(headStream, '__proto__') &&\n    !Object.prototype.hasOwnProperty.call(exports, '__proto__') &&\n    Object.defineProperty(exports, '__proto__', {\n        enumerable: true,\n        value: headStream['__proto__']\n    });\n\nObject.keys(headStream).forEach(function (k) {\n    if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) exports[k] = headStream[k];\n});\nObject.prototype.hasOwnProperty.call(sdkStreamMixin, '__proto__') &&\n    !Object.prototype.hasOwnProperty.call(exports, '__proto__') &&\n    Object.defineProperty(exports, '__proto__', {\n        enumerable: true,\n        value: sdkStreamMixin['__proto__']\n    });\n\nObject.keys(sdkStreamMixin).forEach(function (k) {\n    if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) exports[k] = sdkStreamMixin[k];\n});\nObject.prototype.hasOwnProperty.call(splitStream, '__proto__') &&\n    !Object.prototype.hasOwnProperty.call(exports, '__proto__') &&\n    Object.defineProperty(exports, '__proto__', {\n        enumerable: true,\n        value: splitStream['__proto__']\n    });\n\nObject.keys(splitStream).forEach(function (k) {\n    if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) exports[k] = splitStream[k];\n});\n", "import { Uint8ArrayBlobAdapter } from \"@smithy/util-stream\";\nexport const collectBody = async (streamBody = new Uint8Array(), context) => {\n    if (streamBody instanceof Uint8Array) {\n        return Uint8ArrayBlobAdapter.mutate(streamBody);\n    }\n    if (!streamBody) {\n        return Uint8ArrayBlobAdapter.mutate(new Uint8Array());\n    }\n    const fromContext = context.streamCollector(streamBody);\n    return Uint8ArrayBlobAdapter.mutate(await fromContext);\n};\n", "export function extendedEncodeURIComponent(str) {\n    return encodeURIComponent(str).replace(/[!'()*]/g, function (c) {\n        return \"%\" + c.charCodeAt(0).toString(16).toUpperCase();\n    });\n}\n", "export class SerdeContext {\n    serdeContext;\n    setSerdeContext(serdeContext) {\n        this.serdeContext = serdeContext;\n    }\n}\n", "import { fromUtf8, toUtf8 } from \"@smithy/util-utf8\";\nexport class EventStreamSerde {\n    marshaller;\n    serializer;\n    deserializer;\n    serdeContext;\n    defaultContentType;\n    constructor({ marshaller, serializer, deserializer, serdeContext, defaultContentType, }) {\n        this.marshaller = marshaller;\n        this.serializer = serializer;\n        this.deserializer = deserializer;\n        this.serdeContext = serdeContext;\n        this.defaultContentType = defaultContentType;\n    }\n    async serializeEventStream({ eventStream, requestSchema, initialRequest, }) {\n        const marshaller = this.marshaller;\n        const eventStreamMember = requestSchema.getEventStreamMember();\n        const unionSchema = requestSchema.getMemberSchema(eventStreamMember);\n        const serializer = this.serializer;\n        const defaultContentType = this.defaultContentType;\n        const initialRequestMarker = Symbol(\"initialRequestMarker\");\n        const eventStreamIterable = {\n            async *[Symbol.asyncIterator]() {\n                if (initialRequest) {\n                    const headers = {\n                        \":event-type\": { type: \"string\", value: \"initial-request\" },\n                        \":message-type\": { type: \"string\", value: \"event\" },\n                        \":content-type\": { type: \"string\", value: defaultContentType },\n                    };\n                    serializer.write(requestSchema, initialRequest);\n                    const body = serializer.flush();\n                    yield {\n                        [initialRequestMarker]: true,\n                        headers,\n                        body,\n                    };\n                }\n                for await (const page of eventStream) {\n                    yield page;\n                }\n            },\n        };\n        return marshaller.serialize(eventStreamIterable, (event) => {\n            if (event[initialRequestMarker]) {\n                return {\n                    headers: event.headers,\n                    body: event.body,\n                };\n            }\n            let unionMember = \"\";\n            for (const key in event) {\n                if (key !== \"__type\") {\n                    unionMember = key;\n                    break;\n                }\n            }\n            const { additionalHeaders, body, eventType, explicitPayloadContentType } = this.writeEventBody(unionMember, unionSchema, event);\n            const headers = {\n                \":event-type\": { type: \"string\", value: eventType },\n                \":message-type\": { type: \"string\", value: \"event\" },\n                \":content-type\": { type: \"string\", value: explicitPayloadContentType ?? defaultContentType },\n                ...additionalHeaders,\n            };\n            return {\n                headers,\n                body,\n            };\n        });\n    }\n    async deserializeEventStream({ response, responseSchema, initialResponseContainer, }) {\n        const marshaller = this.marshaller;\n        const eventStreamMember = responseSchema.getEventStreamMember();\n        const unionSchema = responseSchema.getMemberSchema(eventStreamMember);\n        const memberSchemas = unionSchema.getMemberSchemas();\n        const initialResponseMarker = Symbol(\"initialResponseMarker\");\n        const asyncIterable = marshaller.deserialize(response.body, async (event) => {\n            let unionMember = \"\";\n            for (const key in event) {\n                if (key !== \"__type\") {\n                    unionMember = key;\n                    break;\n                }\n            }\n            const body = event[unionMember].body;\n            if (unionMember === \"initial-response\") {\n                const dataObject = await this.deserializer.read(responseSchema, body);\n                delete dataObject[eventStreamMember];\n                return {\n                    [initialResponseMarker]: true,\n                    ...dataObject,\n                };\n            }\n            else if (unionMember in memberSchemas) {\n                const eventStreamSchema = memberSchemas[unionMember];\n                if (eventStreamSchema.isStructSchema()) {\n                    const out = {};\n                    let hasBindings = false;\n                    for (const [name, member] of eventStreamSchema.structIterator()) {\n                        const { eventHeader, eventPayload } = member.getMergedTraits();\n                        hasBindings = hasBindings || Boolean(eventHeader || eventPayload);\n                        if (eventPayload) {\n                            if (member.isBlobSchema()) {\n                                out[name] = body;\n                            }\n                            else if (member.isStringSchema()) {\n                                out[name] = (this.serdeContext?.utf8Encoder ?? toUtf8)(body);\n                            }\n                            else if (member.isStructSchema()) {\n                                out[name] = await this.deserializer.read(member, body);\n                            }\n                        }\n                        else if (eventHeader) {\n                            const value = event[unionMember].headers[name]?.value;\n                            if (value != null) {\n                                if (member.isNumericSchema()) {\n                                    if (value && typeof value === \"object\" && \"bytes\" in value) {\n                                        out[name] = BigInt(value.toString());\n                                    }\n                                    else {\n                                        out[name] = Number(value);\n                                    }\n                                }\n                                else {\n                                    out[name] = value;\n                                }\n                            }\n                        }\n                    }\n                    if (hasBindings) {\n                        return {\n                            [unionMember]: out,\n                        };\n                    }\n                    if (body.byteLength === 0) {\n                        return {\n                            [unionMember]: {},\n                        };\n                    }\n                }\n                return {\n                    [unionMember]: await this.deserializer.read(eventStreamSchema, body),\n                };\n            }\n            else {\n                return {\n                    $unknown: event,\n                };\n            }\n        });\n        const asyncIterator = asyncIterable[Symbol.asyncIterator]();\n        const firstEvent = await asyncIterator.next();\n        if (firstEvent.done) {\n            return asyncIterable;\n        }\n        if (firstEvent.value?.[initialResponseMarker]) {\n            if (!responseSchema) {\n                throw new Error(\"@smithy::core/protocols - initial-response event encountered in event stream but no response schema given.\");\n            }\n            for (const key in firstEvent.value) {\n                initialResponseContainer[key] = firstEvent.value[key];\n            }\n        }\n        return {\n            async *[Symbol.asyncIterator]() {\n                if (!firstEvent?.value?.[initialResponseMarker]) {\n                    yield firstEvent.value;\n                }\n                while (true) {\n                    const { done, value } = await asyncIterator.next();\n                    if (done) {\n                        break;\n                    }\n                    yield value;\n                }\n            },\n        };\n    }\n    writeEventBody(unionMember, unionSchema, event) {\n        const serializer = this.serializer;\n        let eventType = unionMember;\n        let explicitPayloadMember = null;\n        let explicitPayloadContentType;\n        const isKnownSchema = (() => {\n            const struct = unionSchema.getSchema();\n            return struct[4].includes(unionMember);\n        })();\n        const additionalHeaders = {};\n        if (!isKnownSchema) {\n            const [type, value] = event[unionMember];\n            eventType = type;\n            serializer.write(15, value);\n        }\n        else {\n            const eventSchema = unionSchema.getMemberSchema(unionMember);\n            if (eventSchema.isStructSchema()) {\n                for (const [memberName, memberSchema] of eventSchema.structIterator()) {\n                    const { eventHeader, eventPayload } = memberSchema.getMergedTraits();\n                    if (eventPayload) {\n                        explicitPayloadMember = memberName;\n                    }\n                    else if (eventHeader) {\n                        const value = event[unionMember][memberName];\n                        let type = \"binary\";\n                        if (memberSchema.isNumericSchema()) {\n                            if ((-2) ** 31 <= value && value <= 2 ** 31 - 1) {\n                                type = \"integer\";\n                            }\n                            else {\n                                type = \"long\";\n                            }\n                        }\n                        else if (memberSchema.isTimestampSchema()) {\n                            type = \"timestamp\";\n                        }\n                        else if (memberSchema.isStringSchema()) {\n                            type = \"string\";\n                        }\n                        else if (memberSchema.isBooleanSchema()) {\n                            type = \"boolean\";\n                        }\n                        if (value != null) {\n                            additionalHeaders[memberName] = {\n                                type,\n                                value,\n                            };\n                            delete event[unionMember][memberName];\n                        }\n                    }\n                }\n                if (explicitPayloadMember !== null) {\n                    const payloadSchema = eventSchema.getMemberSchema(explicitPayloadMember);\n                    if (payloadSchema.isBlobSchema()) {\n                        explicitPayloadContentType = \"application/octet-stream\";\n                    }\n                    else if (payloadSchema.isStringSchema()) {\n                        explicitPayloadContentType = \"text/plain\";\n                    }\n                    serializer.write(payloadSchema, event[unionMember][explicitPayloadMember]);\n                }\n                else {\n                    serializer.write(eventSchema, event[unionMember]);\n                }\n            }\n            else if (eventSchema.isUnitSchema()) {\n                serializer.write(eventSchema, {});\n            }\n            else {\n                throw new Error(\"@smithy/core/event-streams - non-struct member not supported in event stream union.\");\n            }\n        }\n        const messageSerialization = serializer.flush() ?? new Uint8Array();\n        const body = typeof messageSerialization === \"string\"\n            ? (this.serdeContext?.utf8Decoder ?? fromUtf8)(messageSerialization)\n            : messageSerialization;\n        return {\n            body,\n            eventType,\n            explicitPayloadContentType,\n            additionalHeaders,\n        };\n    }\n}\n", "export * from \"./EventStreamSerde\";\n", "import { NormalizedSchema, translateTraits, TypeRegistry } from \"@smithy/core/schema\";\nimport { HttpRequest, HttpResponse } from \"@smithy/protocol-http\";\nimport { SerdeContext } from \"./SerdeContext\";\nexport class HttpProtocol extends SerdeContext {\n    options;\n    compositeErrorRegistry;\n    constructor(options) {\n        super();\n        this.options = options;\n        this.compositeErrorRegistry = TypeRegistry.for(options.defaultNamespace);\n        for (const etr of options.errorTypeRegistries ?? []) {\n            this.compositeErrorRegistry.copyFrom(etr);\n        }\n    }\n    getRequestType() {\n        return HttpRequest;\n    }\n    getResponseType() {\n        return HttpResponse;\n    }\n    setSerdeContext(serdeContext) {\n        this.serdeContext = serdeContext;\n        this.serializer.setSerdeContext(serdeContext);\n        this.deserializer.setSerdeContext(serdeContext);\n        if (this.getPayloadCodec()) {\n            this.getPayloadCodec().setSerdeContext(serdeContext);\n        }\n    }\n    updateServiceEndpoint(request, endpoint) {\n        if (\"url\" in endpoint) {\n            request.protocol = endpoint.url.protocol;\n            request.hostname = endpoint.url.hostname;\n            request.port = endpoint.url.port ? Number(endpoint.url.port) : undefined;\n            request.path = endpoint.url.pathname;\n            request.fragment = endpoint.url.hash || void 0;\n            request.username = endpoint.url.username || void 0;\n            request.password = endpoint.url.password || void 0;\n            if (!request.query) {\n                request.query = {};\n            }\n            for (const [k, v] of endpoint.url.searchParams.entries()) {\n                request.query[k] = v;\n            }\n            if (endpoint.headers) {\n                for (const name in endpoint.headers) {\n                    request.headers[name] = endpoint.headers[name].join(\", \");\n                }\n            }\n            return request;\n        }\n        else {\n            request.protocol = endpoint.protocol;\n            request.hostname = endpoint.hostname;\n            request.port = endpoint.port ? Number(endpoint.port) : undefined;\n            request.path = endpoint.path;\n            request.query = {\n                ...endpoint.query,\n            };\n            if (endpoint.headers) {\n                for (const name in endpoint.headers) {\n                    request.headers[name] = endpoint.headers[name];\n                }\n            }\n            return request;\n        }\n    }\n    setHostPrefix(request, operationSchema, input) {\n        if (this.serdeContext?.disableHostPrefix) {\n            return;\n        }\n        const inputNs = NormalizedSchema.of(operationSchema.input);\n        const opTraits = translateTraits(operationSchema.traits ?? {});\n        if (opTraits.endpoint) {\n            let hostPrefix = opTraits.endpoint?.[0];\n            if (typeof hostPrefix === \"string\") {\n                for (const [name, member] of inputNs.structIterator()) {\n                    if (!member.getMergedTraits().hostLabel) {\n                        continue;\n                    }\n                    const replacement = input[name];\n                    if (typeof replacement !== \"string\") {\n                        throw new Error(`@smithy/core/schema - ${name} in input must be a string as hostLabel.`);\n                    }\n                    hostPrefix = hostPrefix.replace(`{${name}}`, replacement);\n                }\n                request.hostname = hostPrefix + request.hostname;\n            }\n        }\n    }\n    deserializeMetadata(output) {\n        return {\n            httpStatusCode: output.statusCode,\n            requestId: output.headers[\"x-amzn-requestid\"] ?? output.headers[\"x-amzn-request-id\"] ?? output.headers[\"x-amz-request-id\"],\n            extendedRequestId: output.headers[\"x-amz-id-2\"],\n            cfId: output.headers[\"x-amz-cf-id\"],\n        };\n    }\n    async serializeEventStream({ eventStream, requestSchema, initialRequest, }) {\n        const eventStreamSerde = await this.loadEventStreamCapability();\n        return eventStreamSerde.serializeEventStream({\n            eventStream,\n            requestSchema,\n            initialRequest,\n        });\n    }\n    async deserializeEventStream({ response, responseSchema, initialResponseContainer, }) {\n        const eventStreamSerde = await this.loadEventStreamCapability();\n        return eventStreamSerde.deserializeEventStream({\n            response,\n            responseSchema,\n            initialResponseContainer,\n        });\n    }\n    async loadEventStreamCapability() {\n        const { EventStreamSerde } = await import(\"@smithy/core/event-streams\");\n        return new EventStreamSerde({\n            marshaller: this.getEventStreamMarshaller(),\n            serializer: this.serializer,\n            deserializer: this.deserializer,\n            serdeContext: this.serdeContext,\n            defaultContentType: this.getDefaultContentType(),\n        });\n    }\n    getDefaultContentType() {\n        throw new Error(`@smithy/core/protocols - ${this.constructor.name} getDefaultContentType() implementation missing.`);\n    }\n    async deserializeHttpMessage(schema, context, response, arg4, arg5) {\n        void schema;\n        void context;\n        void response;\n        void arg4;\n        void arg5;\n        return [];\n    }\n    getEventStreamMarshaller() {\n        const context = this.serdeContext;\n        if (!context.eventStreamMarshaller) {\n            throw new Error(\"@smithy/core - HttpProtocol: eventStreamMarshaller missing in serdeContext.\");\n        }\n        return context.eventStreamMarshaller;\n    }\n}\n", "import { NormalizedSchema, translateTraits } from \"@smithy/core/schema\";\nimport { splitEvery, splitHeader } from \"@smithy/core/serde\";\nimport { HttpRequest } from \"@smithy/protocol-http\";\nimport { sdkStreamMixin } from \"@smithy/util-stream\";\nimport { collectBody } from \"./collect-stream-body\";\nimport { extendedEncodeURIComponent } from \"./extended-encode-uri-component\";\nimport { HttpProtocol } from \"./HttpProtocol\";\nexport class HttpBindingProtocol extends HttpProtocol {\n    async serializeRequest(operationSchema, _input, context) {\n        const input = _input && typeof _input === \"object\" ? _input : {};\n        const serializer = this.serializer;\n        const query = {};\n        const headers = {};\n        const endpoint = await context.endpoint();\n        const ns = NormalizedSchema.of(operationSchema?.input);\n        const payloadMemberNames = [];\n        const payloadMemberSchemas = [];\n        let hasNonHttpBindingMember = false;\n        let payload;\n        const request = new HttpRequest({\n            protocol: \"\",\n            hostname: \"\",\n            port: undefined,\n            path: \"\",\n            fragment: undefined,\n            query: query,\n            headers: headers,\n            body: undefined,\n        });\n        if (endpoint) {\n            this.updateServiceEndpoint(request, endpoint);\n            this.setHostPrefix(request, operationSchema, input);\n            const opTraits = translateTraits(operationSchema.traits);\n            if (opTraits.http) {\n                request.method = opTraits.http[0];\n                const [path, search] = opTraits.http[1].split(\"?\");\n                if (request.path == \"/\") {\n                    request.path = path;\n                }\n                else {\n                    request.path += path;\n                }\n                const traitSearchParams = new URLSearchParams(search ?? \"\");\n                for (const [key, value] of traitSearchParams) {\n                    query[key] = value;\n                }\n            }\n        }\n        for (const [memberName, memberNs] of ns.structIterator()) {\n            const memberTraits = memberNs.getMergedTraits() ?? {};\n            const inputMemberValue = input[memberName];\n            if (inputMemberValue == null && !memberNs.isIdempotencyToken()) {\n                if (memberTraits.httpLabel) {\n                    if (request.path.includes(`{${memberName}+}`) || request.path.includes(`{${memberName}}`)) {\n                        throw new Error(`No value provided for input HTTP label: ${memberName}.`);\n                    }\n                }\n                continue;\n            }\n            if (memberTraits.httpPayload) {\n                const isStreaming = memberNs.isStreaming();\n                if (isStreaming) {\n                    const isEventStream = memberNs.isStructSchema();\n                    if (isEventStream) {\n                        if (input[memberName]) {\n                            payload = await this.serializeEventStream({\n                                eventStream: input[memberName],\n                                requestSchema: ns,\n                            });\n                        }\n                    }\n                    else {\n                        payload = inputMemberValue;\n                    }\n                }\n                else {\n                    serializer.write(memberNs, inputMemberValue);\n                    payload = serializer.flush();\n                }\n            }\n            else if (memberTraits.httpLabel) {\n                serializer.write(memberNs, inputMemberValue);\n                const replacement = serializer.flush();\n                if (request.path.includes(`{${memberName}+}`)) {\n                    request.path = request.path.replace(`{${memberName}+}`, replacement.split(\"/\").map(extendedEncodeURIComponent).join(\"/\"));\n                }\n                else if (request.path.includes(`{${memberName}}`)) {\n                    request.path = request.path.replace(`{${memberName}}`, extendedEncodeURIComponent(replacement));\n                }\n            }\n            else if (memberTraits.httpHeader) {\n                serializer.write(memberNs, inputMemberValue);\n                headers[memberTraits.httpHeader.toLowerCase()] = String(serializer.flush());\n            }\n            else if (typeof memberTraits.httpPrefixHeaders === \"string\") {\n                for (const key in inputMemberValue) {\n                    const val = inputMemberValue[key];\n                    const amalgam = memberTraits.httpPrefixHeaders + key;\n                    serializer.write([memberNs.getValueSchema(), { httpHeader: amalgam }], val);\n                    headers[amalgam.toLowerCase()] = serializer.flush();\n                }\n            }\n            else if (memberTraits.httpQuery || memberTraits.httpQueryParams) {\n                this.serializeQuery(memberNs, inputMemberValue, query);\n            }\n            else {\n                hasNonHttpBindingMember = true;\n                payloadMemberNames.push(memberName);\n                payloadMemberSchemas.push(memberNs);\n            }\n        }\n        if (hasNonHttpBindingMember && input) {\n            const [namespace, name] = (ns.getName(true) ?? \"#Unknown\").split(\"#\");\n            const requiredMembers = ns.getSchema()[6];\n            const payloadSchema = [\n                3,\n                namespace,\n                name,\n                ns.getMergedTraits(),\n                payloadMemberNames,\n                payloadMemberSchemas,\n                undefined,\n            ];\n            if (requiredMembers) {\n                payloadSchema[6] = requiredMembers;\n            }\n            else {\n                payloadSchema.pop();\n            }\n            serializer.write(payloadSchema, input);\n            payload = serializer.flush();\n        }\n        request.headers = headers;\n        request.query = query;\n        request.body = payload;\n        return request;\n    }\n    serializeQuery(ns, data, query) {\n        const serializer = this.serializer;\n        const traits = ns.getMergedTraits();\n        if (traits.httpQueryParams) {\n            for (const key in data) {\n                if (!(key in query)) {\n                    const val = data[key];\n                    const valueSchema = ns.getValueSchema();\n                    Object.assign(valueSchema.getMergedTraits(), {\n                        ...traits,\n                        httpQuery: key,\n                        httpQueryParams: undefined,\n                    });\n                    this.serializeQuery(valueSchema, val, query);\n                }\n            }\n            return;\n        }\n        if (ns.isListSchema()) {\n            const sparse = !!ns.getMergedTraits().sparse;\n            const buffer = [];\n            for (const item of data) {\n                serializer.write([ns.getValueSchema(), traits], item);\n                const serializable = serializer.flush();\n                if (sparse || serializable !== undefined) {\n                    buffer.push(serializable);\n                }\n            }\n            query[traits.httpQuery] = buffer;\n        }\n        else {\n            serializer.write([ns, traits], data);\n            query[traits.httpQuery] = serializer.flush();\n        }\n    }\n    async deserializeResponse(operationSchema, context, response) {\n        const deserializer = this.deserializer;\n        const ns = NormalizedSchema.of(operationSchema.output);\n        const dataObject = {};\n        if (response.statusCode >= 300) {\n            const bytes = await collectBody(response.body, context);\n            if (bytes.byteLength > 0) {\n                Object.assign(dataObject, await deserializer.read(15, bytes));\n            }\n            await this.handleError(operationSchema, context, response, dataObject, this.deserializeMetadata(response));\n            throw new Error(\"@smithy/core/protocols - HTTP Protocol error handler failed to throw.\");\n        }\n        for (const header in response.headers) {\n            const value = response.headers[header];\n            delete response.headers[header];\n            response.headers[header.toLowerCase()] = value;\n        }\n        const nonHttpBindingMembers = await this.deserializeHttpMessage(ns, context, response, dataObject);\n        if (nonHttpBindingMembers.length) {\n            const bytes = await collectBody(response.body, context);\n            if (bytes.byteLength > 0) {\n                const dataFromBody = await deserializer.read(ns, bytes);\n                for (const member of nonHttpBindingMembers) {\n                    if (dataFromBody[member] != null) {\n                        dataObject[member] = dataFromBody[member];\n                    }\n                }\n            }\n        }\n        else if (nonHttpBindingMembers.discardResponseBody) {\n            await collectBody(response.body, context);\n        }\n        dataObject.$metadata = this.deserializeMetadata(response);\n        return dataObject;\n    }\n    async deserializeHttpMessage(schema, context, response, arg4, arg5) {\n        let dataObject;\n        if (arg4 instanceof Set) {\n            dataObject = arg5;\n        }\n        else {\n            dataObject = arg4;\n        }\n        let discardResponseBody = true;\n        const deserializer = this.deserializer;\n        const ns = NormalizedSchema.of(schema);\n        const nonHttpBindingMembers = [];\n        for (const [memberName, memberSchema] of ns.structIterator()) {\n            const memberTraits = memberSchema.getMemberTraits();\n            if (memberTraits.httpPayload) {\n                discardResponseBody = false;\n                const isStreaming = memberSchema.isStreaming();\n                if (isStreaming) {\n                    const isEventStream = memberSchema.isStructSchema();\n                    if (isEventStream) {\n                        dataObject[memberName] = await this.deserializeEventStream({\n                            response,\n                            responseSchema: ns,\n                        });\n                    }\n                    else {\n                        dataObject[memberName] = sdkStreamMixin(response.body);\n                    }\n                }\n                else if (response.body) {\n                    const bytes = await collectBody(response.body, context);\n                    if (bytes.byteLength > 0) {\n                        dataObject[memberName] = await deserializer.read(memberSchema, bytes);\n                    }\n                }\n            }\n            else if (memberTraits.httpHeader) {\n                const key = String(memberTraits.httpHeader).toLowerCase();\n                const value = response.headers[key];\n                if (null != value) {\n                    if (memberSchema.isListSchema()) {\n                        const headerListValueSchema = memberSchema.getValueSchema();\n                        headerListValueSchema.getMergedTraits().httpHeader = key;\n                        let sections;\n                        if (headerListValueSchema.isTimestampSchema() &&\n                            headerListValueSchema.getSchema() === 4) {\n                            sections = splitEvery(value, \",\", 2);\n                        }\n                        else {\n                            sections = splitHeader(value);\n                        }\n                        const list = [];\n                        for (const section of sections) {\n                            list.push(await deserializer.read(headerListValueSchema, section.trim()));\n                        }\n                        dataObject[memberName] = list;\n                    }\n                    else {\n                        dataObject[memberName] = await deserializer.read(memberSchema, value);\n                    }\n                }\n            }\n            else if (memberTraits.httpPrefixHeaders !== undefined) {\n                dataObject[memberName] = {};\n                for (const header in response.headers) {\n                    if (header.startsWith(memberTraits.httpPrefixHeaders)) {\n                        const value = response.headers[header];\n                        const valueSchema = memberSchema.getValueSchema();\n                        valueSchema.getMergedTraits().httpHeader = header;\n                        dataObject[memberName][header.slice(memberTraits.httpPrefixHeaders.length)] = await deserializer.read(valueSchema, value);\n                    }\n                }\n            }\n            else if (memberTraits.httpResponseCode) {\n                dataObject[memberName] = response.statusCode;\n            }\n            else {\n                nonHttpBindingMembers.push(memberName);\n            }\n        }\n        nonHttpBindingMembers.discardResponseBody = discardResponseBody;\n        return nonHttpBindingMembers;\n    }\n}\n", "import { NormalizedSchema } from \"@smithy/core/schema\";\nimport { HttpRequest } from \"@smithy/protocol-http\";\nimport { collectBody } from \"./collect-stream-body\";\nimport { HttpProtocol } from \"./HttpProtocol\";\nexport class RpcProtocol extends HttpProtocol {\n    async serializeRequest(operationSchema, _input, context) {\n        const serializer = this.serializer;\n        const query = {};\n        const headers = {};\n        const endpoint = await context.endpoint();\n        const ns = NormalizedSchema.of(operationSchema?.input);\n        const schema = ns.getSchema();\n        let payload;\n        const input = _input && typeof _input === \"object\" ? _input : {};\n        const request = new HttpRequest({\n            protocol: \"\",\n            hostname: \"\",\n            port: undefined,\n            path: \"/\",\n            fragment: undefined,\n            query: query,\n            headers: headers,\n            body: undefined,\n        });\n        if (endpoint) {\n            this.updateServiceEndpoint(request, endpoint);\n            this.setHostPrefix(request, operationSchema, input);\n        }\n        if (input) {\n            const eventStreamMember = ns.getEventStreamMember();\n            if (eventStreamMember) {\n                if (input[eventStreamMember]) {\n                    const initialRequest = {};\n                    for (const [memberName, memberSchema] of ns.structIterator()) {\n                        if (memberName !== eventStreamMember && input[memberName]) {\n                            serializer.write(memberSchema, input[memberName]);\n                            initialRequest[memberName] = serializer.flush();\n                        }\n                    }\n                    payload = await this.serializeEventStream({\n                        eventStream: input[eventStreamMember],\n                        requestSchema: ns,\n                        initialRequest,\n                    });\n                }\n            }\n            else {\n                serializer.write(schema, input);\n                payload = serializer.flush();\n            }\n        }\n        request.headers = Object.assign(request.headers, headers);\n        request.query = query;\n        request.body = payload;\n        request.method = \"POST\";\n        return request;\n    }\n    async deserializeResponse(operationSchema, context, response) {\n        const deserializer = this.deserializer;\n        const ns = NormalizedSchema.of(operationSchema.output);\n        const dataObject = {};\n        if (response.statusCode >= 300) {\n            const bytes = await collectBody(response.body, context);\n            if (bytes.byteLength > 0) {\n                Object.assign(dataObject, await deserializer.read(15, bytes));\n            }\n            await this.handleError(operationSchema, context, response, dataObject, this.deserializeMetadata(response));\n            throw new Error(\"@smithy/core/protocols - RPC Protocol error handler failed to throw.\");\n        }\n        for (const header in response.headers) {\n            const value = response.headers[header];\n            delete response.headers[header];\n            response.headers[header.toLowerCase()] = value;\n        }\n        const eventStreamMember = ns.getEventStreamMember();\n        if (eventStreamMember) {\n            dataObject[eventStreamMember] = await this.deserializeEventStream({\n                response,\n                responseSchema: ns,\n                initialResponseContainer: dataObject,\n            });\n        }\n        else {\n            const bytes = await collectBody(response.body, context);\n            if (bytes.byteLength > 0) {\n                Object.assign(dataObject, await deserializer.read(ns, bytes));\n            }\n        }\n        dataObject.$metadata = this.deserializeMetadata(response);\n        return dataObject;\n    }\n}\n", "import { extendedEncodeURIComponent } from \"./extended-encode-uri-component\";\nexport const resolvedPath = (resolvedPath, input, memberName, labelValueProvider, uriLabel, isGreedyLabel) => {\n    if (input != null && input[memberName] !== undefined) {\n        const labelValue = labelValueProvider();\n        if (labelValue == null || labelValue.length <= 0) {\n            throw new Error(\"Empty value provided for input HTTP label: \" + memberName + \".\");\n        }\n        resolvedPath = resolvedPath.replace(uriLabel, isGreedyLabel\n            ? labelValue\n                .split(\"/\")\n                .map((segment) => extendedEncodeURIComponent(segment))\n                .join(\"/\")\n            : extendedEncodeURIComponent(labelValue));\n    }\n    else {\n        throw new Error(\"No value provided for input HTTP label: \" + memberName + \".\");\n    }\n    return resolvedPath;\n};\n", "import { HttpRequest } from \"@smithy/protocol-http\";\nimport { resolvedPath } from \"./resolve-path\";\nexport function requestBuilder(input, context) {\n    return new RequestBuilder(input, context);\n}\nexport class RequestBuilder {\n    input;\n    context;\n    query = {};\n    method = \"\";\n    headers = {};\n    path = \"\";\n    body = null;\n    hostname = \"\";\n    resolvePathStack = [];\n    constructor(input, context) {\n        this.input = input;\n        this.context = context;\n    }\n    async build() {\n        const { hostname, protocol = \"https\", port, path: basePath } = await this.context.endpoint();\n        this.path = basePath;\n        for (const resolvePath of this.resolvePathStack) {\n            resolvePath(this.path);\n        }\n        return new HttpRequest({\n            protocol,\n            hostname: this.hostname || hostname,\n            port,\n            method: this.method,\n            path: this.path,\n            query: this.query,\n            body: this.body,\n            headers: this.headers,\n        });\n    }\n    hn(hostname) {\n        this.hostname = hostname;\n        return this;\n    }\n    bp(uriLabel) {\n        this.resolvePathStack.push((basePath) => {\n            this.path = `${basePath?.endsWith(\"/\") ? basePath.slice(0, -1) : basePath || \"\"}` + uriLabel;\n        });\n        return this;\n    }\n    p(memberName, labelValueProvider, uriLabel, isGreedyLabel) {\n        this.resolvePathStack.push((path) => {\n            this.path = resolvedPath(path, this.input, memberName, labelValueProvider, uriLabel, isGreedyLabel);\n        });\n        return this;\n    }\n    h(headers) {\n        this.headers = headers;\n        return this;\n    }\n    q(query) {\n        this.query = query;\n        return this;\n    }\n    b(body) {\n        this.body = body;\n        return this;\n    }\n    m(method) {\n        this.method = method;\n        return this;\n    }\n}\n", "export function determineTimestampFormat(ns, settings) {\n    if (settings.timestampFormat.useTrait) {\n        if (ns.isTimestampSchema() &&\n            (ns.getSchema() === 5 ||\n                ns.getSchema() === 6 ||\n                ns.getSchema() === 7)) {\n            return ns.getSchema();\n        }\n    }\n    const { httpLabel, httpPrefixHeaders, httpHeader, httpQuery } = ns.getMergedTraits();\n    const bindingFormat = settings.httpBindings\n        ? typeof httpPrefixHeaders === \"string\" || Boolean(httpHeader)\n            ? 6\n            : Boolean(httpQuery) || Boolean(httpLabel)\n                ? 5\n                : undefined\n        : undefined;\n    return bindingFormat ?? settings.timestampFormat.default;\n}\n", "import { NormalizedSchema } from \"@smithy/core/schema\";\nimport { _parseEpochTimestamp, _parseRfc3339DateTimeWithOffset, _parseRfc7231DateTime, LazyJsonString, NumericValue, splitHeader, } from \"@smithy/core/serde\";\nimport { fromBase64 } from \"@smithy/util-base64\";\nimport { toUtf8 } from \"@smithy/util-utf8\";\nimport { SerdeContext } from \"../SerdeContext\";\nimport { determineTimestampFormat } from \"./determineTimestampFormat\";\nexport class FromStringShapeDeserializer extends SerdeContext {\n    settings;\n    constructor(settings) {\n        super();\n        this.settings = settings;\n    }\n    read(_schema, data) {\n        const ns = NormalizedSchema.of(_schema);\n        if (ns.isListSchema()) {\n            return splitHeader(data).map((item) => this.read(ns.getValueSchema(), item));\n        }\n        if (ns.isBlobSchema()) {\n            return (this.serdeContext?.base64Decoder ?? fromBase64)(data);\n        }\n        if (ns.isTimestampSchema()) {\n            const format = determineTimestampFormat(ns, this.settings);\n            switch (format) {\n                case 5:\n                    return _parseRfc3339DateTimeWithOffset(data);\n                case 6:\n                    return _parseRfc7231DateTime(data);\n                case 7:\n                    return _parseEpochTimestamp(data);\n                default:\n                    console.warn(\"Missing timestamp format, parsing value with Date constructor:\", data);\n                    return new Date(data);\n            }\n        }\n        if (ns.isStringSchema()) {\n            const mediaType = ns.getMergedTraits().mediaType;\n            let intermediateValue = data;\n            if (mediaType) {\n                if (ns.getMergedTraits().httpHeader) {\n                    intermediateValue = this.base64ToUtf8(intermediateValue);\n                }\n                const isJson = mediaType === \"application/json\" || mediaType.endsWith(\"+json\");\n                if (isJson) {\n                    intermediateValue = LazyJsonString.from(intermediateValue);\n                }\n                return intermediateValue;\n            }\n        }\n        if (ns.isNumericSchema()) {\n            return Number(data);\n        }\n        if (ns.isBigIntegerSchema()) {\n            return BigInt(data);\n        }\n        if (ns.isBigDecimalSchema()) {\n            return new NumericValue(data, \"bigDecimal\");\n        }\n        if (ns.isBooleanSchema()) {\n            return String(data).toLowerCase() === \"true\";\n        }\n        return data;\n    }\n    base64ToUtf8(base64String) {\n        return (this.serdeContext?.utf8Encoder ?? toUtf8)((this.serdeContext?.base64Decoder ?? fromBase64)(base64String));\n    }\n}\n", "import { NormalizedSchema } from \"@smithy/core/schema\";\nimport { fromUtf8, toUtf8 } from \"@smithy/util-utf8\";\nimport { SerdeContext } from \"../SerdeContext\";\nimport { FromStringShapeDeserializer } from \"./FromStringShapeDeserializer\";\nexport class HttpInterceptingShapeDeserializer extends SerdeContext {\n    codecDeserializer;\n    stringDeserializer;\n    constructor(codecDeserializer, codecSettings) {\n        super();\n        this.codecDeserializer = codecDeserializer;\n        this.stringDeserializer = new FromStringShapeDeserializer(codecSettings);\n    }\n    setSerdeContext(serdeContext) {\n        this.stringDeserializer.setSerdeContext(serdeContext);\n        this.codecDeserializer.setSerdeContext(serdeContext);\n        this.serdeContext = serdeContext;\n    }\n    read(schema, data) {\n        const ns = NormalizedSchema.of(schema);\n        const traits = ns.getMergedTraits();\n        const toString = this.serdeContext?.utf8Encoder ?? toUtf8;\n        if (traits.httpHeader || traits.httpResponseCode) {\n            return this.stringDeserializer.read(ns, toString(data));\n        }\n        if (traits.httpPayload) {\n            if (ns.isBlobSchema()) {\n                const toBytes = this.serdeContext?.utf8Decoder ?? fromUtf8;\n                if (typeof data === \"string\") {\n                    return toBytes(data);\n                }\n                return data;\n            }\n            else if (ns.isStringSchema()) {\n                if (\"byteLength\" in data) {\n                    return toString(data);\n                }\n                return data;\n            }\n        }\n        return this.codecDeserializer.read(ns, data);\n    }\n}\n", "import { NormalizedSchema } from \"@smithy/core/schema\";\nimport { dateToUtcString, generateIdempotencyToken, LazyJsonString, quoteHeader } from \"@smithy/core/serde\";\nimport { toBase64 } from \"@smithy/util-base64\";\nimport { SerdeContext } from \"../SerdeContext\";\nimport { determineTimestampFormat } from \"./determineTimestampFormat\";\nexport class ToStringShapeSerializer extends SerdeContext {\n    settings;\n    stringBuffer = \"\";\n    constructor(settings) {\n        super();\n        this.settings = settings;\n    }\n    write(schema, value) {\n        const ns = NormalizedSchema.of(schema);\n        switch (typeof value) {\n            case \"object\":\n                if (value === null) {\n                    this.stringBuffer = \"null\";\n                    return;\n                }\n                if (ns.isTimestampSchema()) {\n                    if (!(value instanceof Date)) {\n                        throw new Error(`@smithy/core/protocols - received non-Date value ${value} when schema expected Date in ${ns.getName(true)}`);\n                    }\n                    const format = determineTimestampFormat(ns, this.settings);\n                    switch (format) {\n                        case 5:\n                            this.stringBuffer = value.toISOString().replace(\".000Z\", \"Z\");\n                            break;\n                        case 6:\n                            this.stringBuffer = dateToUtcString(value);\n                            break;\n                        case 7:\n                            this.stringBuffer = String(value.getTime() / 1000);\n                            break;\n                        default:\n                            console.warn(\"Missing timestamp format, using epoch seconds\", value);\n                            this.stringBuffer = String(value.getTime() / 1000);\n                    }\n                    return;\n                }\n                if (ns.isBlobSchema() && \"byteLength\" in value) {\n                    this.stringBuffer = (this.serdeContext?.base64Encoder ?? toBase64)(value);\n                    return;\n                }\n                if (ns.isListSchema() && Array.isArray(value)) {\n                    let buffer = \"\";\n                    for (const item of value) {\n                        this.write([ns.getValueSchema(), ns.getMergedTraits()], item);\n                        const headerItem = this.flush();\n                        const serialized = ns.getValueSchema().isTimestampSchema() ? headerItem : quoteHeader(headerItem);\n                        if (buffer !== \"\") {\n                            buffer += \", \";\n                        }\n                        buffer += serialized;\n                    }\n                    this.stringBuffer = buffer;\n                    return;\n                }\n                this.stringBuffer = JSON.stringify(value, null, 2);\n                break;\n            case \"string\":\n                const mediaType = ns.getMergedTraits().mediaType;\n                let intermediateValue = value;\n                if (mediaType) {\n                    const isJson = mediaType === \"application/json\" || mediaType.endsWith(\"+json\");\n                    if (isJson) {\n                        intermediateValue = LazyJsonString.from(intermediateValue);\n                    }\n                    if (ns.getMergedTraits().httpHeader) {\n                        this.stringBuffer = (this.serdeContext?.base64Encoder ?? toBase64)(intermediateValue.toString());\n                        return;\n                    }\n                }\n                this.stringBuffer = value;\n                break;\n            default:\n                if (ns.isIdempotencyToken()) {\n                    this.stringBuffer = generateIdempotencyToken();\n                }\n                else {\n                    this.stringBuffer = String(value);\n                }\n        }\n    }\n    flush() {\n        const buffer = this.stringBuffer;\n        this.stringBuffer = \"\";\n        return buffer;\n    }\n}\n", "import { NormalizedSchema } from \"@smithy/core/schema\";\nimport { ToStringShapeSerializer } from \"./ToStringShapeSerializer\";\nexport class HttpInterceptingShapeSerializer {\n    codecSerializer;\n    stringSerializer;\n    buffer;\n    constructor(codecSerializer, codecSettings, stringSerializer = new ToStringShapeSerializer(codecSettings)) {\n        this.codecSerializer = codecSerializer;\n        this.stringSerializer = stringSerializer;\n    }\n    setSerdeContext(serdeContext) {\n        this.codecSerializer.setSerdeContext(serdeContext);\n        this.stringSerializer.setSerdeContext(serdeContext);\n    }\n    write(schema, value) {\n        const ns = NormalizedSchema.of(schema);\n        const traits = ns.getMergedTraits();\n        if (traits.httpHeader || traits.httpLabel || traits.httpQuery) {\n            this.stringSerializer.write(ns, value);\n            this.buffer = this.stringSerializer.flush();\n            return;\n        }\n        return this.codecSerializer.write(ns, value);\n    }\n    flush() {\n        if (this.buffer !== undefined) {\n            const buffer = this.buffer;\n            this.buffer = undefined;\n            return buffer;\n        }\n        return this.codecSerializer.flush();\n    }\n}\n", "export * from \"./collect-stream-body\";\nexport * from \"./extended-encode-uri-component\";\nexport * from \"./HttpBindingProtocol\";\nexport * from \"./HttpProtocol\";\nexport * from \"./RpcProtocol\";\nexport * from \"./requestBuilder\";\nexport * from \"./resolve-path\";\nexport * from \"./serde/FromStringShapeDeserializer\";\nexport * from \"./serde/HttpInterceptingShapeDeserializer\";\nexport * from \"./serde/HttpInterceptingShapeSerializer\";\nexport * from \"./serde/ToStringShapeSerializer\";\nexport * from \"./serde/determineTimestampFormat\";\nexport * from \"./SerdeContext\";\n", "'use strict';\n\nvar middlewareStack = require('@smithy/middleware-stack');\nvar types = require('@smithy/types');\nvar schema = require('@smithy/core/schema');\nvar serde = require('@smithy/core/serde');\nvar protocols = require('@smithy/core/protocols');\n\nclass Client {\n    config;\n    middlewareStack = middlewareStack.constructStack();\n    initConfig;\n    handlers;\n    constructor(config) {\n        this.config = config;\n        const { protocol, protocolSettings } = config;\n        if (protocolSettings) {\n            if (typeof protocol === \"function\") {\n                config.protocol = new protocol(protocolSettings);\n            }\n        }\n    }\n    send(command, optionsOrCb, cb) {\n        const options = typeof optionsOrCb !== \"function\" ? optionsOrCb : undefined;\n        const callback = typeof optionsOrCb === \"function\" ? optionsOrCb : cb;\n        const useHandlerCache = options === undefined && this.config.cacheMiddleware === true;\n        let handler;\n        if (useHandlerCache) {\n            if (!this.handlers) {\n                this.handlers = new WeakMap();\n            }\n            const handlers = this.handlers;\n            if (handlers.has(command.constructor)) {\n                handler = handlers.get(command.constructor);\n            }\n            else {\n                handler = command.resolveMiddleware(this.middlewareStack, this.config, options);\n                handlers.set(command.constructor, handler);\n            }\n        }\n        else {\n            delete this.handlers;\n            handler = command.resolveMiddleware(this.middlewareStack, this.config, options);\n        }\n        if (callback) {\n            handler(command)\n                .then((result) => callback(null, result.output), (err) => callback(err))\n                .catch(() => { });\n        }\n        else {\n            return handler(command).then((result) => result.output);\n        }\n    }\n    destroy() {\n        this.config?.requestHandler?.destroy?.();\n        delete this.handlers;\n    }\n}\n\nconst SENSITIVE_STRING$1 = \"***SensitiveInformation***\";\nfunction schemaLogFilter(schema$1, data) {\n    if (data == null) {\n        return data;\n    }\n    const ns = schema.NormalizedSchema.of(schema$1);\n    if (ns.getMergedTraits().sensitive) {\n        return SENSITIVE_STRING$1;\n    }\n    if (ns.isListSchema()) {\n        const isSensitive = !!ns.getValueSchema().getMergedTraits().sensitive;\n        if (isSensitive) {\n            return SENSITIVE_STRING$1;\n        }\n    }\n    else if (ns.isMapSchema()) {\n        const isSensitive = !!ns.getKeySchema().getMergedTraits().sensitive || !!ns.getValueSchema().getMergedTraits().sensitive;\n        if (isSensitive) {\n            return SENSITIVE_STRING$1;\n        }\n    }\n    else if (ns.isStructSchema() && typeof data === \"object\") {\n        const object = data;\n        const newObject = {};\n        for (const [member, memberNs] of ns.structIterator()) {\n            if (object[member] != null) {\n                newObject[member] = schemaLogFilter(memberNs, object[member]);\n            }\n        }\n        return newObject;\n    }\n    return data;\n}\n\nclass Command {\n    middlewareStack = middlewareStack.constructStack();\n    schema;\n    static classBuilder() {\n        return new ClassBuilder();\n    }\n    resolveMiddlewareWithContext(clientStack, configuration, options, { middlewareFn, clientName, commandName, inputFilterSensitiveLog, outputFilterSensitiveLog, smithyContext, additionalContext, CommandCtor, }) {\n        for (const mw of middlewareFn.bind(this)(CommandCtor, clientStack, configuration, options)) {\n            this.middlewareStack.use(mw);\n        }\n        const stack = clientStack.concat(this.middlewareStack);\n        const { logger } = configuration;\n        const handlerExecutionContext = {\n            logger,\n            clientName,\n            commandName,\n            inputFilterSensitiveLog,\n            outputFilterSensitiveLog,\n            [types.SMITHY_CONTEXT_KEY]: {\n                commandInstance: this,\n                ...smithyContext,\n            },\n            ...additionalContext,\n        };\n        const { requestHandler } = configuration;\n        let requestOptions = options ?? {};\n        if (smithyContext.eventStream) {\n            requestOptions = {\n                isEventStream: true,\n                ...requestOptions,\n            };\n        }\n        return stack.resolve((request) => requestHandler.handle(request.request, requestOptions), handlerExecutionContext);\n    }\n}\nclass ClassBuilder {\n    _init = () => { };\n    _ep = {};\n    _middlewareFn = () => [];\n    _commandName = \"\";\n    _clientName = \"\";\n    _additionalContext = {};\n    _smithyContext = {};\n    _inputFilterSensitiveLog = undefined;\n    _outputFilterSensitiveLog = undefined;\n    _serializer = null;\n    _deserializer = null;\n    _operationSchema;\n    init(cb) {\n        this._init = cb;\n    }\n    ep(endpointParameterInstructions) {\n        this._ep = endpointParameterInstructions;\n        return this;\n    }\n    m(middlewareSupplier) {\n        this._middlewareFn = middlewareSupplier;\n        return this;\n    }\n    s(service, operation, smithyContext = {}) {\n        this._smithyContext = {\n            service,\n            operation,\n            ...smithyContext,\n        };\n        return this;\n    }\n    c(additionalContext = {}) {\n        this._additionalContext = additionalContext;\n        return this;\n    }\n    n(clientName, commandName) {\n        this._clientName = clientName;\n        this._commandName = commandName;\n        return this;\n    }\n    f(inputFilter = (_) => _, outputFilter = (_) => _) {\n        this._inputFilterSensitiveLog = inputFilter;\n        this._outputFilterSensitiveLog = outputFilter;\n        return this;\n    }\n    ser(serializer) {\n        this._serializer = serializer;\n        return this;\n    }\n    de(deserializer) {\n        this._deserializer = deserializer;\n        return this;\n    }\n    sc(operation) {\n        this._operationSchema = operation;\n        this._smithyContext.operationSchema = operation;\n        return this;\n    }\n    build() {\n        const closure = this;\n        let CommandRef;\n        return (CommandRef = class extends Command {\n            input;\n            static getEndpointParameterInstructions() {\n                return closure._ep;\n            }\n            constructor(...[input]) {\n                super();\n                this.input = input ?? {};\n                closure._init(this);\n                this.schema = closure._operationSchema;\n            }\n            resolveMiddleware(stack, configuration, options) {\n                const op = closure._operationSchema;\n                const input = op?.[4] ?? op?.input;\n                const output = op?.[5] ?? op?.output;\n                return this.resolveMiddlewareWithContext(stack, configuration, options, {\n                    CommandCtor: CommandRef,\n                    middlewareFn: closure._middlewareFn,\n                    clientName: closure._clientName,\n                    commandName: closure._commandName,\n                    inputFilterSensitiveLog: closure._inputFilterSensitiveLog ?? (op ? schemaLogFilter.bind(null, input) : (_) => _),\n                    outputFilterSensitiveLog: closure._outputFilterSensitiveLog ?? (op ? schemaLogFilter.bind(null, output) : (_) => _),\n                    smithyContext: closure._smithyContext,\n                    additionalContext: closure._additionalContext,\n                });\n            }\n            serialize = closure._serializer;\n            deserialize = closure._deserializer;\n        });\n    }\n}\n\nconst SENSITIVE_STRING = \"***SensitiveInformation***\";\n\nconst createAggregatedClient = (commands, Client, options) => {\n    for (const [command, CommandCtor] of Object.entries(commands)) {\n        const methodImpl = async function (args, optionsOrCb, cb) {\n            const command = new CommandCtor(args);\n            if (typeof optionsOrCb === \"function\") {\n                this.send(command, optionsOrCb);\n            }\n            else if (typeof cb === \"function\") {\n                if (typeof optionsOrCb !== \"object\")\n                    throw new Error(`Expected http options but got ${typeof optionsOrCb}`);\n                this.send(command, optionsOrCb || {}, cb);\n            }\n            else {\n                return this.send(command, optionsOrCb);\n            }\n        };\n        const methodName = (command[0].toLowerCase() + command.slice(1)).replace(/Command$/, \"\");\n        Client.prototype[methodName] = methodImpl;\n    }\n    const { paginators = {}, waiters = {} } = options ?? {};\n    for (const [paginatorName, paginatorFn] of Object.entries(paginators)) {\n        if (Client.prototype[paginatorName] === void 0) {\n            Client.prototype[paginatorName] = function (commandInput = {}, paginationConfiguration, ...rest) {\n                return paginatorFn({\n                    ...paginationConfiguration,\n                    client: this,\n                }, commandInput, ...rest);\n            };\n        }\n    }\n    for (const [waiterName, waiterFn] of Object.entries(waiters)) {\n        if (Client.prototype[waiterName] === void 0) {\n            Client.prototype[waiterName] = async function (commandInput = {}, waiterConfiguration, ...rest) {\n                let config = waiterConfiguration;\n                if (typeof waiterConfiguration === \"number\") {\n                    config = {\n                        maxWaitTime: waiterConfiguration,\n                    };\n                }\n                return waiterFn({\n                    ...config,\n                    client: this,\n                }, commandInput, ...rest);\n            };\n        }\n    }\n};\n\nclass ServiceException extends Error {\n    $fault;\n    $response;\n    $retryable;\n    $metadata;\n    constructor(options) {\n        super(options.message);\n        Object.setPrototypeOf(this, Object.getPrototypeOf(this).constructor.prototype);\n        this.name = options.name;\n        this.$fault = options.$fault;\n        this.$metadata = options.$metadata;\n    }\n    static isInstance(value) {\n        if (!value)\n            return false;\n        const candidate = value;\n        return (ServiceException.prototype.isPrototypeOf(candidate) ||\n            (Boolean(candidate.$fault) &&\n                Boolean(candidate.$metadata) &&\n                (candidate.$fault === \"client\" || candidate.$fault === \"server\")));\n    }\n    static [Symbol.hasInstance](instance) {\n        if (!instance)\n            return false;\n        const candidate = instance;\n        if (this === ServiceException) {\n            return ServiceException.isInstance(instance);\n        }\n        if (ServiceException.isInstance(instance)) {\n            if (candidate.name && this.name) {\n                return this.prototype.isPrototypeOf(instance) || candidate.name === this.name;\n            }\n            return this.prototype.isPrototypeOf(instance);\n        }\n        return false;\n    }\n}\nconst decorateServiceException = (exception, additions = {}) => {\n    Object.entries(additions)\n        .filter(([, v]) => v !== undefined)\n        .forEach(([k, v]) => {\n        if (exception[k] == undefined || exception[k] === \"\") {\n            exception[k] = v;\n        }\n    });\n    const message = exception.message || exception.Message || \"UnknownError\";\n    exception.message = message;\n    delete exception.Message;\n    return exception;\n};\n\nconst throwDefaultError = ({ output, parsedBody, exceptionCtor, errorCode }) => {\n    const $metadata = deserializeMetadata(output);\n    const statusCode = $metadata.httpStatusCode ? $metadata.httpStatusCode + \"\" : undefined;\n    const response = new exceptionCtor({\n        name: parsedBody?.code || parsedBody?.Code || errorCode || statusCode || \"UnknownError\",\n        $fault: \"client\",\n        $metadata,\n    });\n    throw decorateServiceException(response, parsedBody);\n};\nconst withBaseException = (ExceptionCtor) => {\n    return ({ output, parsedBody, errorCode }) => {\n        throwDefaultError({ output, parsedBody, exceptionCtor: ExceptionCtor, errorCode });\n    };\n};\nconst deserializeMetadata = (output) => ({\n    httpStatusCode: output.statusCode,\n    requestId: output.headers[\"x-amzn-requestid\"] ?? output.headers[\"x-amzn-request-id\"] ?? output.headers[\"x-amz-request-id\"],\n    extendedRequestId: output.headers[\"x-amz-id-2\"],\n    cfId: output.headers[\"x-amz-cf-id\"],\n});\n\nconst loadConfigsForDefaultMode = (mode) => {\n    switch (mode) {\n        case \"standard\":\n            return {\n                retryMode: \"standard\",\n                connectionTimeout: 3100,\n            };\n        case \"in-region\":\n            return {\n                retryMode: \"standard\",\n                connectionTimeout: 1100,\n            };\n        case \"cross-region\":\n            return {\n                retryMode: \"standard\",\n                connectionTimeout: 3100,\n            };\n        case \"mobile\":\n            return {\n                retryMode: \"standard\",\n                connectionTimeout: 30000,\n            };\n        default:\n            return {};\n    }\n};\n\nlet warningEmitted = false;\nconst emitWarningIfUnsupportedVersion = (version) => {\n    if (version && !warningEmitted && parseInt(version.substring(1, version.indexOf(\".\"))) < 16) {\n        warningEmitted = true;\n    }\n};\n\nconst knownAlgorithms = Object.values(types.AlgorithmId);\nconst getChecksumConfiguration = (runtimeConfig) => {\n    const checksumAlgorithms = [];\n    for (const id in types.AlgorithmId) {\n        const algorithmId = types.AlgorithmId[id];\n        if (runtimeConfig[algorithmId] === undefined) {\n            continue;\n        }\n        checksumAlgorithms.push({\n            algorithmId: () => algorithmId,\n            checksumConstructor: () => runtimeConfig[algorithmId],\n        });\n    }\n    for (const [id, ChecksumCtor] of Object.entries(runtimeConfig.checksumAlgorithms ?? {})) {\n        checksumAlgorithms.push({\n            algorithmId: () => id,\n            checksumConstructor: () => ChecksumCtor,\n        });\n    }\n    return {\n        addChecksumAlgorithm(algo) {\n            runtimeConfig.checksumAlgorithms = runtimeConfig.checksumAlgorithms ?? {};\n            const id = algo.algorithmId();\n            const ctor = algo.checksumConstructor();\n            if (knownAlgorithms.includes(id)) {\n                runtimeConfig.checksumAlgorithms[id.toUpperCase()] = ctor;\n            }\n            else {\n                runtimeConfig.checksumAlgorithms[id] = ctor;\n            }\n            checksumAlgorithms.push(algo);\n        },\n        checksumAlgorithms() {\n            return checksumAlgorithms;\n        },\n    };\n};\nconst resolveChecksumRuntimeConfig = (clientConfig) => {\n    const runtimeConfig = {};\n    clientConfig.checksumAlgorithms().forEach((checksumAlgorithm) => {\n        const id = checksumAlgorithm.algorithmId();\n        if (knownAlgorithms.includes(id)) {\n            runtimeConfig[id] = checksumAlgorithm.checksumConstructor();\n        }\n    });\n    return runtimeConfig;\n};\n\nconst getRetryConfiguration = (runtimeConfig) => {\n    return {\n        setRetryStrategy(retryStrategy) {\n            runtimeConfig.retryStrategy = retryStrategy;\n        },\n        retryStrategy() {\n            return runtimeConfig.retryStrategy;\n        },\n    };\n};\nconst resolveRetryRuntimeConfig = (retryStrategyConfiguration) => {\n    const runtimeConfig = {};\n    runtimeConfig.retryStrategy = retryStrategyConfiguration.retryStrategy();\n    return runtimeConfig;\n};\n\nconst getDefaultExtensionConfiguration = (runtimeConfig) => {\n    return Object.assign(getChecksumConfiguration(runtimeConfig), getRetryConfiguration(runtimeConfig));\n};\nconst getDefaultClientConfiguration = getDefaultExtensionConfiguration;\nconst resolveDefaultRuntimeConfig = (config) => {\n    return Object.assign(resolveChecksumRuntimeConfig(config), resolveRetryRuntimeConfig(config));\n};\n\nconst getArrayIfSingleItem = (mayBeArray) => Array.isArray(mayBeArray) ? mayBeArray : [mayBeArray];\n\nconst getValueFromTextNode = (obj) => {\n    const textNodeName = \"#text\";\n    for (const key in obj) {\n        if (obj.hasOwnProperty(key) && obj[key][textNodeName] !== undefined) {\n            obj[key] = obj[key][textNodeName];\n        }\n        else if (typeof obj[key] === \"object\" && obj[key] !== null) {\n            obj[key] = getValueFromTextNode(obj[key]);\n        }\n    }\n    return obj;\n};\n\nconst isSerializableHeaderValue = (value) => {\n    return value != null;\n};\n\nclass NoOpLogger {\n    trace() { }\n    debug() { }\n    info() { }\n    warn() { }\n    error() { }\n}\n\nfunction map(arg0, arg1, arg2) {\n    let target;\n    let filter;\n    let instructions;\n    if (typeof arg1 === \"undefined\" && typeof arg2 === \"undefined\") {\n        target = {};\n        instructions = arg0;\n    }\n    else {\n        target = arg0;\n        if (typeof arg1 === \"function\") {\n            filter = arg1;\n            instructions = arg2;\n            return mapWithFilter(target, filter, instructions);\n        }\n        else {\n            instructions = arg1;\n        }\n    }\n    for (const key of Object.keys(instructions)) {\n        if (!Array.isArray(instructions[key])) {\n            target[key] = instructions[key];\n            continue;\n        }\n        applyInstruction(target, null, instructions, key);\n    }\n    return target;\n}\nconst convertMap = (target) => {\n    const output = {};\n    for (const [k, v] of Object.entries(target || {})) {\n        output[k] = [, v];\n    }\n    return output;\n};\nconst take = (source, instructions) => {\n    const out = {};\n    for (const key in instructions) {\n        applyInstruction(out, source, instructions, key);\n    }\n    return out;\n};\nconst mapWithFilter = (target, filter, instructions) => {\n    return map(target, Object.entries(instructions).reduce((_instructions, [key, value]) => {\n        if (Array.isArray(value)) {\n            _instructions[key] = value;\n        }\n        else {\n            if (typeof value === \"function\") {\n                _instructions[key] = [filter, value()];\n            }\n            else {\n                _instructions[key] = [filter, value];\n            }\n        }\n        return _instructions;\n    }, {}));\n};\nconst applyInstruction = (target, source, instructions, targetKey) => {\n    if (source !== null) {\n        let instruction = instructions[targetKey];\n        if (typeof instruction === \"function\") {\n            instruction = [, instruction];\n        }\n        const [filter = nonNullish, valueFn = pass, sourceKey = targetKey] = instruction;\n        if ((typeof filter === \"function\" && filter(source[sourceKey])) || (typeof filter !== \"function\" && !!filter)) {\n            target[targetKey] = valueFn(source[sourceKey]);\n        }\n        return;\n    }\n    let [filter, value] = instructions[targetKey];\n    if (typeof value === \"function\") {\n        let _value;\n        const defaultFilterPassed = filter === undefined && (_value = value()) != null;\n        const customFilterPassed = (typeof filter === \"function\" && !!filter(void 0)) || (typeof filter !== \"function\" && !!filter);\n        if (defaultFilterPassed) {\n            target[targetKey] = _value;\n        }\n        else if (customFilterPassed) {\n            target[targetKey] = value();\n        }\n    }\n    else {\n        const defaultFilterPassed = filter === undefined && value != null;\n        const customFilterPassed = (typeof filter === \"function\" && !!filter(value)) || (typeof filter !== \"function\" && !!filter);\n        if (defaultFilterPassed || customFilterPassed) {\n            target[targetKey] = value;\n        }\n    }\n};\nconst nonNullish = (_) => _ != null;\nconst pass = (_) => _;\n\nconst serializeFloat = (value) => {\n    if (value !== value) {\n        return \"NaN\";\n    }\n    switch (value) {\n        case Infinity:\n            return \"Infinity\";\n        case -Infinity:\n            return \"-Infinity\";\n        default:\n            return value;\n    }\n};\nconst serializeDateTime = (date) => date.toISOString().replace(\".000Z\", \"Z\");\n\nconst _json = (obj) => {\n    if (obj == null) {\n        return {};\n    }\n    if (Array.isArray(obj)) {\n        return obj.filter((_) => _ != null).map(_json);\n    }\n    if (typeof obj === \"object\") {\n        const target = {};\n        for (const key of Object.keys(obj)) {\n            if (obj[key] == null) {\n                continue;\n            }\n            target[key] = _json(obj[key]);\n        }\n        return target;\n    }\n    return obj;\n};\n\nexports.collectBody = protocols.collectBody;\nexports.extendedEncodeURIComponent = protocols.extendedEncodeURIComponent;\nexports.resolvedPath = protocols.resolvedPath;\nexports.Client = Client;\nexports.Command = Command;\nexports.NoOpLogger = NoOpLogger;\nexports.SENSITIVE_STRING = SENSITIVE_STRING;\nexports.ServiceException = ServiceException;\nexports._json = _json;\nexports.convertMap = convertMap;\nexports.createAggregatedClient = createAggregatedClient;\nexports.decorateServiceException = decorateServiceException;\nexports.emitWarningIfUnsupportedVersion = emitWarningIfUnsupportedVersion;\nexports.getArrayIfSingleItem = getArrayIfSingleItem;\nexports.getDefaultClientConfiguration = getDefaultClientConfiguration;\nexports.getDefaultExtensionConfiguration = getDefaultExtensionConfiguration;\nexports.getValueFromTextNode = getValueFromTextNode;\nexports.isSerializableHeaderValue = isSerializableHeaderValue;\nexports.loadConfigsForDefaultMode = loadConfigsForDefaultMode;\nexports.map = map;\nexports.resolveDefaultRuntimeConfig = resolveDefaultRuntimeConfig;\nexports.serializeDateTime = serializeDateTime;\nexports.serializeFloat = serializeFloat;\nexports.take = take;\nexports.throwDefaultError = throwDefaultError;\nexports.withBaseException = withBaseException;\nObject.prototype.hasOwnProperty.call(serde, '__proto__') &&\n    !Object.prototype.hasOwnProperty.call(exports, '__proto__') &&\n    Object.defineProperty(exports, '__proto__', {\n        enumerable: true,\n        value: serde['__proto__']\n    });\n\nObject.keys(serde).forEach(function (k) {\n    if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) exports[k] = serde[k];\n});\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createGetRequest = createGetRequest;\nexports.getCredentials = getCredentials;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst util_stream_1 = require(\"@smithy/util-stream\");\nfunction createGetRequest(url) {\n    return new protocol_http_1.HttpRequest({\n        protocol: url.protocol,\n        hostname: url.hostname,\n        port: Number(url.port),\n        path: url.pathname,\n        query: Array.from(url.searchParams.entries()).reduce((acc, [k, v]) => {\n            acc[k] = v;\n            return acc;\n        }, {}),\n        fragment: url.hash,\n    });\n}\nasync function getCredentials(response, logger) {\n    const stream = (0, util_stream_1.sdkStreamMixin)(response.body);\n    const str = await stream.transformToString();\n    if (response.statusCode === 200) {\n        const parsed = JSON.parse(str);\n        if (typeof parsed.AccessKeyId !== \"string\" ||\n            typeof parsed.SecretAccessKey !== \"string\" ||\n            typeof parsed.Token !== \"string\" ||\n            typeof parsed.Expiration !== \"string\") {\n            throw new property_provider_1.CredentialsProviderError(\"HTTP credential provider response not of the required format, an object matching: \" +\n                \"{ AccessKeyId: string, SecretAccessKey: string, Token: string, Expiration: string(rfc3339) }\", { logger });\n        }\n        return {\n            accessKeyId: parsed.AccessKeyId,\n            secretAccessKey: parsed.SecretAccessKey,\n            sessionToken: parsed.Token,\n            expiration: (0, smithy_client_1.parseRfc3339DateTime)(parsed.Expiration),\n        };\n    }\n    if (response.statusCode >= 400 && response.statusCode < 500) {\n        let parsedBody = {};\n        try {\n            parsedBody = JSON.parse(str);\n        }\n        catch (e) { }\n        throw Object.assign(new property_provider_1.CredentialsProviderError(`Server responded with status: ${response.statusCode}`, { logger }), {\n            Code: parsedBody.Code,\n            Message: parsedBody.Message,\n        });\n    }\n    throw new property_provider_1.CredentialsProviderError(`Server responded with status: ${response.statusCode}`, { logger });\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.retryWrapper = void 0;\nconst retryWrapper = (toRetry, maxRetries, delayMs) => {\n    return async () => {\n        for (let i = 0; i < maxRetries; ++i) {\n            try {\n                return await toRetry();\n            }\n            catch (e) {\n                await new Promise((resolve) => setTimeout(resolve, delayMs));\n            }\n        }\n        return await toRetry();\n    };\n};\nexports.retryWrapper = retryWrapper;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromHttp = void 0;\nconst tslib_1 = require(\"tslib\");\nconst client_1 = require(\"@aws-sdk/core/client\");\nconst node_http_handler_1 = require(\"@smithy/node-http-handler\");\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst promises_1 = tslib_1.__importDefault(require(\"node:fs/promises\"));\nconst checkUrl_1 = require(\"./checkUrl\");\nconst requestHelpers_1 = require(\"./requestHelpers\");\nconst retry_wrapper_1 = require(\"./retry-wrapper\");\nconst AWS_CONTAINER_CREDENTIALS_RELATIVE_URI = \"AWS_CONTAINER_CREDENTIALS_RELATIVE_URI\";\nconst DEFAULT_LINK_LOCAL_HOST = \"http://169.254.170.2\";\nconst AWS_CONTAINER_CREDENTIALS_FULL_URI = \"AWS_CONTAINER_CREDENTIALS_FULL_URI\";\nconst AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE = \"AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE\";\nconst AWS_CONTAINER_AUTHORIZATION_TOKEN = \"AWS_CONTAINER_AUTHORIZATION_TOKEN\";\nconst fromHttp = (options = {}) => {\n    options.logger?.debug(\"@aws-sdk/credential-provider-http - fromHttp\");\n    let host;\n    const relative = options.awsContainerCredentialsRelativeUri ?? process.env[AWS_CONTAINER_CREDENTIALS_RELATIVE_URI];\n    const full = options.awsContainerCredentialsFullUri ?? process.env[AWS_CONTAINER_CREDENTIALS_FULL_URI];\n    const token = options.awsContainerAuthorizationToken ?? process.env[AWS_CONTAINER_AUTHORIZATION_TOKEN];\n    const tokenFile = options.awsContainerAuthorizationTokenFile ?? process.env[AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE];\n    const warn = options.logger?.constructor?.name === \"NoOpLogger\" || !options.logger?.warn\n        ? console.warn\n        : options.logger.warn.bind(options.logger);\n    if (relative && full) {\n        warn(\"@aws-sdk/credential-provider-http: \" +\n            \"you have set both awsContainerCredentialsRelativeUri and awsContainerCredentialsFullUri.\");\n        warn(\"awsContainerCredentialsFullUri will take precedence.\");\n    }\n    if (token && tokenFile) {\n        warn(\"@aws-sdk/credential-provider-http: \" +\n            \"you have set both awsContainerAuthorizationToken and awsContainerAuthorizationTokenFile.\");\n        warn(\"awsContainerAuthorizationToken will take precedence.\");\n    }\n    if (full) {\n        host = full;\n    }\n    else if (relative) {\n        host = `${DEFAULT_LINK_LOCAL_HOST}${relative}`;\n    }\n    else {\n        throw new property_provider_1.CredentialsProviderError(`No HTTP credential provider host provided.\nSet AWS_CONTAINER_CREDENTIALS_FULL_URI or AWS_CONTAINER_CREDENTIALS_RELATIVE_URI.`, { logger: options.logger });\n    }\n    const url = new URL(host);\n    (0, checkUrl_1.checkUrl)(url, options.logger);\n    const requestHandler = node_http_handler_1.NodeHttpHandler.create({\n        requestTimeout: options.timeout ?? 1000,\n        connectionTimeout: options.timeout ?? 1000,\n    });\n    return (0, retry_wrapper_1.retryWrapper)(async () => {\n        const request = (0, requestHelpers_1.createGetRequest)(url);\n        if (token) {\n            request.headers.Authorization = token;\n        }\n        else if (tokenFile) {\n            request.headers.Authorization = (await promises_1.default.readFile(tokenFile)).toString();\n        }\n        try {\n            const result = await requestHandler.handle(request);\n            return (0, requestHelpers_1.getCredentials)(result.response).then((creds) => (0, client_1.setCredentialFeature)(creds, \"CREDENTIALS_HTTP\", \"z\"));\n        }\n        catch (e) {\n            throw new property_provider_1.CredentialsProviderError(String(e), { logger: options.logger });\n        }\n    }, options.maxRetries ?? 3, options.timeout ?? 1000);\n};\nexports.fromHttp = fromHttp;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromHttp = void 0;\nvar fromHttp_1 = require(\"./fromHttp/fromHttp\");\nObject.defineProperty(exports, \"fromHttp\", { enumerable: true, get: function () { return fromHttp_1.fromHttp; } });\n", "import { HttpResponse } from \"@smithy/protocol-http\";\nexport const getDateHeader = (response) => HttpResponse.isInstance(response) ? response.headers?.date ?? response.headers?.Date : undefined;\n", "export const getSkewCorrectedDate = (systemClockOffset) => new Date(Date.now() + systemClockOffset);\n", "import { getSkewCorrectedDate } from \"./getSkewCorrectedDate\";\nexport const isClockSkewed = (clockTime, systemClockOffset) => Math.abs(getSkewCorrectedDate(systemClockOffset).getTime() - clockTime) >= 300000;\n", "import { isClockSkewed } from \"./isClockSkewed\";\nexport const getUpdatedSystemClockOffset = (clockTime, currentSystemClockOffset) => {\n    const clockTimeInMs = Date.parse(clockTime);\n    if (isClockSkewed(clockTimeInMs, currentSystemClockOffset)) {\n        return clockTimeInMs - Date.now();\n    }\n    return currentSystemClockOffset;\n};\n", "export * from \"./getDateHeader\";\nexport * from \"./getSkewCorrectedDate\";\nexport * from \"./getUpdatedSystemClockOffset\";\n", "import { HttpRequest } from \"@smithy/protocol-http\";\nimport { getDateHeader, getSkewCorrectedDate, getUpdatedSystemClockOffset } from \"../utils\";\nconst throwSigningPropertyError = (name, property) => {\n    if (!property) {\n        throw new Error(`Property \\`${name}\\` is not resolved for AWS SDK SigV4Auth`);\n    }\n    return property;\n};\nexport const validateSigningProperties = async (signingProperties) => {\n    const context = throwSigningPropertyError(\"context\", signingProperties.context);\n    const config = throwSigningPropertyError(\"config\", signingProperties.config);\n    const authScheme = context.endpointV2?.properties?.authSchemes?.[0];\n    const signerFunction = throwSigningPropertyError(\"signer\", config.signer);\n    const signer = await signerFunction(authScheme);\n    const signingRegion = signingProperties?.signingRegion;\n    const signingRegionSet = signingProperties?.signingRegionSet;\n    const signingName = signingProperties?.signingName;\n    return {\n        config,\n        signer,\n        signingRegion,\n        signingRegionSet,\n        signingName,\n    };\n};\nexport class AwsSdkSigV4Signer {\n    async sign(httpRequest, identity, signingProperties) {\n        if (!HttpRequest.isInstance(httpRequest)) {\n            throw new Error(\"The request is not an instance of `HttpRequest` and cannot be signed\");\n        }\n        const validatedProps = await validateSigningProperties(signingProperties);\n        const { config, signer } = validatedProps;\n        let { signingRegion, signingName } = validatedProps;\n        const handlerExecutionContext = signingProperties.context;\n        if (handlerExecutionContext?.authSchemes?.length ?? 0 > 1) {\n            const [first, second] = handlerExecutionContext.authSchemes;\n            if (first?.name === \"sigv4a\" && second?.name === \"sigv4\") {\n                signingRegion = second?.signingRegion ?? signingRegion;\n                signingName = second?.signingName ?? signingName;\n            }\n        }\n        const signedRequest = await signer.sign(httpRequest, {\n            signingDate: getSkewCorrectedDate(config.systemClockOffset),\n            signingRegion: signingRegion,\n            signingService: signingName,\n        });\n        return signedRequest;\n    }\n    errorHandler(signingProperties) {\n        return (error) => {\n            const serverTime = error.ServerTime ?? getDateHeader(error.$response);\n            if (serverTime) {\n                const config = throwSigningPropertyError(\"config\", signingProperties.config);\n                const initialSystemClockOffset = config.systemClockOffset;\n                config.systemClockOffset = getUpdatedSystemClockOffset(serverTime, config.systemClockOffset);\n                const clockSkewCorrected = config.systemClockOffset !== initialSystemClockOffset;\n                if (clockSkewCorrected && error.$metadata) {\n                    error.$metadata.clockSkewCorrected = true;\n                }\n            }\n            throw error;\n        };\n    }\n    successHandler(httpResponse, signingProperties) {\n        const dateHeader = getDateHeader(httpResponse);\n        if (dateHeader) {\n            const config = throwSigningPropertyError(\"config\", signingProperties.config);\n            config.systemClockOffset = getUpdatedSystemClockOffset(dateHeader, config.systemClockOffset);\n        }\n    }\n}\nexport const AWSSDKSigV4Signer = AwsSdkSigV4Signer;\n", "import { HttpRequest } from \"@smithy/protocol-http\";\nimport { getSkewCorrectedDate } from \"../utils\";\nimport { AwsSdkSigV4Signer, validateSigningProperties } from \"./AwsSdkSigV4Signer\";\nexport class AwsSdkSigV4ASigner extends AwsSdkSigV4Signer {\n    async sign(httpRequest, identity, signingProperties) {\n        if (!HttpRequest.isInstance(httpRequest)) {\n            throw new Error(\"The request is not an instance of `HttpRequest` and cannot be signed\");\n        }\n        const { config, signer, signingRegion, signingRegionSet, signingName } = await validateSigningProperties(signingProperties);\n        const configResolvedSigningRegionSet = await config.sigv4aSigningRegionSet?.();\n        const multiRegionOverride = (configResolvedSigningRegionSet ??\n            signingRegionSet ?? [signingRegion]).join(\",\");\n        const signedRequest = await signer.sign(httpRequest, {\n            signingDate: getSkewCorrectedDate(config.systemClockOffset),\n            signingRegion: multiRegionOverride,\n            signingService: signingName,\n        });\n        return signedRequest;\n    }\n}\n", "export const getArrayForCommaSeparatedString = (str) => typeof str === \"string\" && str.length > 0 ? str.split(\",\").map((item) => item.trim()) : [];\n", "export const getBearerTokenEnvKey = (signingName) => `AWS_BEARER_TOKEN_${signingName.replace(/[\\s-]/g, \"_\").toUpperCase()}`;\n", "import { getArrayForCommaSeparatedString } from \"../utils/getArrayForCommaSeparatedString\";\nimport { getBearerTokenEnvKey } from \"../utils/getBearerTokenEnvKey\";\nconst NODE_AUTH_SCHEME_PREFERENCE_ENV_KEY = \"AWS_AUTH_SCHEME_PREFERENCE\";\nconst NODE_AUTH_SCHEME_PREFERENCE_CONFIG_KEY = \"auth_scheme_preference\";\nexport const NODE_AUTH_SCHEME_PREFERENCE_OPTIONS = {\n    environmentVariableSelector: (env, options) => {\n        if (options?.signingName) {\n            const bearerTokenKey = getBearerTokenEnvKey(options.signingName);\n            if (bearerTokenKey in env)\n                return [\"httpBearerAuth\"];\n        }\n        if (!(NODE_AUTH_SCHEME_PREFERENCE_ENV_KEY in env))\n            return undefined;\n        return getArrayForCommaSeparatedString(env[NODE_AUTH_SCHEME_PREFERENCE_ENV_KEY]);\n    },\n    configFileSelector: (profile) => {\n        if (!(NODE_AUTH_SCHEME_PREFERENCE_CONFIG_KEY in profile))\n            return undefined;\n        return getArrayForCommaSeparatedString(profile[NODE_AUTH_SCHEME_PREFERENCE_CONFIG_KEY]);\n    },\n    default: [],\n};\n", "import { SMITHY_CONTEXT_KEY } from \"@smithy/types\";\nexport const getSmithyContext = (context) => context[SMITHY_CONTEXT_KEY] || (context[SMITHY_CONTEXT_KEY] = {});\n", "export const resolveAuthOptions = (candidateAuthOptions, authSchemePreference) => {\n    if (!authSchemePreference || authSchemePreference.length === 0) {\n        return candidateAuthOptions;\n    }\n    const preferredAuthOptions = [];\n    for (const preferredSchemeName of authSchemePreference) {\n        for (const candidateAuthOption of candidateAuthOptions) {\n            const candidateAuthSchemeName = candidateAuthOption.schemeId.split(\"#\")[1];\n            if (candidateAuthSchemeName === preferredSchemeName) {\n                preferredAuthOptions.push(candidateAuthOption);\n            }\n        }\n    }\n    for (const candidateAuthOption of candidateAuthOptions) {\n        if (!preferredAuthOptions.find(({ schemeId }) => schemeId === candidateAuthOption.schemeId)) {\n            preferredAuthOptions.push(candidateAuthOption);\n        }\n    }\n    return preferredAuthOptions;\n};\n", "import { getSmithyContext } from \"@smithy/util-middleware\";\nimport { resolveAuthOptions } from \"./resolveAuthOptions\";\nfunction convertHttpAuthSchemesToMap(httpAuthSchemes) {\n    const map = new Map();\n    for (const scheme of httpAuthSchemes) {\n        map.set(scheme.schemeId, scheme);\n    }\n    return map;\n}\nexport const httpAuthSchemeMiddleware = (config, mwOptions) => (next, context) => async (args) => {\n    const options = config.httpAuthSchemeProvider(await mwOptions.httpAuthSchemeParametersProvider(config, context, args.input));\n    const authSchemePreference = config.authSchemePreference ? await config.authSchemePreference() : [];\n    const resolvedOptions = resolveAuthOptions(options, authSchemePreference);\n    const authSchemes = convertHttpAuthSchemesToMap(config.httpAuthSchemes);\n    const smithyContext = getSmithyContext(context);\n    const failureReasons = [];\n    for (const option of resolvedOptions) {\n        const scheme = authSchemes.get(option.schemeId);\n        if (!scheme) {\n            failureReasons.push(`HttpAuthScheme \\`${option.schemeId}\\` was not enabled for this service.`);\n            continue;\n        }\n        const identityProvider = scheme.identityProvider(await mwOptions.identityProviderConfigProvider(config));\n        if (!identityProvider) {\n            failureReasons.push(`HttpAuthScheme \\`${option.schemeId}\\` did not have an IdentityProvider configured.`);\n            continue;\n        }\n        const { identityProperties = {}, signingProperties = {} } = option.propertiesExtractor?.(config, context) || {};\n        option.identityProperties = Object.assign(option.identityProperties || {}, identityProperties);\n        option.signingProperties = Object.assign(option.signingProperties || {}, signingProperties);\n        smithyContext.selectedHttpAuthScheme = {\n            httpAuthOption: option,\n            identity: await identityProvider(option.identityProperties),\n            signer: scheme.signer,\n        };\n        break;\n    }\n    if (!smithyContext.selectedHttpAuthScheme) {\n        throw new Error(failureReasons.join(\"\\n\"));\n    }\n    return next(args);\n};\n", "import { httpAuthSchemeMiddleware } from \"./httpAuthSchemeMiddleware\";\nexport const httpAuthSchemeEndpointRuleSetMiddlewareOptions = {\n    step: \"serialize\",\n    tags: [\"HTTP_AUTH_SCHEME\"],\n    name: \"httpAuthSchemeMiddleware\",\n    override: true,\n    relation: \"before\",\n    toMiddleware: \"endpointV2Middleware\",\n};\nexport const getHttpAuthSchemeEndpointRuleSetPlugin = (config, { httpAuthSchemeParametersProvider, identityProviderConfigProvider, }) => ({\n    applyToStack: (clientStack) => {\n        clientStack.addRelativeTo(httpAuthSchemeMiddleware(config, {\n            httpAuthSchemeParametersProvider,\n            identityProviderConfigProvider,\n        }), httpAuthSchemeEndpointRuleSetMiddlewareOptions);\n    },\n});\n", "import { httpAuthSchemeMiddleware } from \"./httpAuthSchemeMiddleware\";\nexport const httpAuthSchemeMiddlewareOptions = {\n    step: \"serialize\",\n    tags: [\"HTTP_AUTH_SCHEME\"],\n    name: \"httpAuthSchemeMiddleware\",\n    override: true,\n    relation: \"before\",\n    toMiddleware: \"serializerMiddleware\",\n};\nexport const getHttpAuthSchemePlugin = (config, { httpAuthSchemeParametersProvider, identityProviderConfigProvider, }) => ({\n    applyToStack: (clientStack) => {\n        clientStack.addRelativeTo(httpAuthSchemeMiddleware(config, {\n            httpAuthSchemeParametersProvider,\n            identityProviderConfigProvider,\n        }), httpAuthSchemeMiddlewareOptions);\n    },\n});\n", "export * from \"./httpAuthSchemeMiddleware\";\nexport * from \"./getHttpAuthSchemeEndpointRuleSetPlugin\";\nexport * from \"./getHttpAuthSchemePlugin\";\n", "import { HttpRequest } from \"@smithy/protocol-http\";\nimport { getSmithyContext } from \"@smithy/util-middleware\";\nconst defaultErrorHandler = (signingProperties) => (error) => {\n    throw error;\n};\nconst defaultSuccessHandler = (httpResponse, signingProperties) => { };\nexport const httpSigningMiddleware = (config) => (next, context) => async (args) => {\n    if (!HttpRequest.isInstance(args.request)) {\n        return next(args);\n    }\n    const smithyContext = getSmithyContext(context);\n    const scheme = smithyContext.selectedHttpAuthScheme;\n    if (!scheme) {\n        throw new Error(`No HttpAuthScheme was selected: unable to sign request`);\n    }\n    const { httpAuthOption: { signingProperties = {} }, identity, signer, } = scheme;\n    const output = await next({\n        ...args,\n        request: await signer.sign(args.request, identity, signingProperties),\n    }).catch((signer.errorHandler || defaultErrorHandler)(signingProperties));\n    (signer.successHandler || defaultSuccessHandler)(output.response, signingProperties);\n    return output;\n};\n", "import { httpSigningMiddleware } from \"./httpSigningMiddleware\";\nexport const httpSigningMiddlewareOptions = {\n    step: \"finalizeRequest\",\n    tags: [\"HTTP_SIGNING\"],\n    name: \"httpSigningMiddleware\",\n    aliases: [\"apiKeyMiddleware\", \"tokenMiddleware\", \"awsAuthMiddleware\"],\n    override: true,\n    relation: \"after\",\n    toMiddleware: \"retryMiddleware\",\n};\nexport const getHttpSigningPlugin = (config) => ({\n    applyToStack: (clientStack) => {\n        clientStack.addRelativeTo(httpSigningMiddleware(config), httpSigningMiddlewareOptions);\n    },\n});\n", "export * from \"./httpSigningMiddleware\";\nexport * from \"./getHttpSigningMiddleware\";\n", "export const normalizeProvider = (input) => {\n    if (typeof input === \"function\")\n        return input;\n    const promisified = Promise.resolve(input);\n    return () => promisified;\n};\n", "const makePagedClientRequest = async (CommandCtor, client, input, withCommand = (_) => _, ...args) => {\n    let command = new CommandCtor(input);\n    command = withCommand(command) ?? command;\n    return await client.send(command, ...args);\n};\nexport function createPaginator(ClientCtor, CommandCtor, inputTokenName, outputTokenName, pageSizeTokenName) {\n    return async function* paginateOperation(config, input, ...additionalArguments) {\n        const _input = input;\n        let token = config.startingToken ?? _input[inputTokenName];\n        let hasNext = true;\n        let page;\n        while (hasNext) {\n            _input[inputTokenName] = token;\n            if (pageSizeTokenName) {\n                _input[pageSizeTokenName] = _input[pageSizeTokenName] ?? config.pageSize;\n            }\n            if (config.client instanceof ClientCtor) {\n                page = await makePagedClientRequest(CommandCtor, config.client, input, config.withCommand, ...additionalArguments);\n            }\n            else {\n                throw new Error(`Invalid client, expected instance of ${ClientCtor.name}`);\n            }\n            yield page;\n            const prevToken = token;\n            token = get(page, outputTokenName);\n            hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n        }\n        return undefined;\n    };\n}\nconst get = (fromObject, path) => {\n    let cursor = fromObject;\n    const pathComponents = path.split(\".\");\n    for (const step of pathComponents) {\n        if (!cursor || typeof cursor !== \"object\") {\n            return undefined;\n        }\n        cursor = cursor[step];\n    }\n    return cursor;\n};\n", "export { requestBuilder } from \"@smithy/core/protocols\";\n", "export function setFeature(context, feature, value) {\n    if (!context.__smithy_context) {\n        context.__smithy_context = {\n            features: {},\n        };\n    }\n    else if (!context.__smithy_context.features) {\n        context.__smithy_context.features = {};\n    }\n    context.__smithy_context.features[feature] = value;\n}\n", "export class DefaultIdentityProviderConfig {\n    authSchemes = new Map();\n    constructor(config) {\n        for (const key in config) {\n            const value = config[key];\n            if (value !== undefined) {\n                this.authSchemes.set(key, value);\n            }\n        }\n    }\n    getIdentityProvider(schemeId) {\n        return this.authSchemes.get(schemeId);\n    }\n}\n", "import { HttpRequest } from \"@smithy/protocol-http\";\nimport { HttpApiKeyAuthLocation } from \"@smithy/types\";\nexport class HttpApiKeyAuthSigner {\n    async sign(httpRequest, identity, signingProperties) {\n        if (!signingProperties) {\n            throw new Error(\"request could not be signed with `apiKey` since the `name` and `in` signer properties are missing\");\n        }\n        if (!signingProperties.name) {\n            throw new Error(\"request could not be signed with `apiKey` since the `name` signer property is missing\");\n        }\n        if (!signingProperties.in) {\n            throw new Error(\"request could not be signed with `apiKey` since the `in` signer property is missing\");\n        }\n        if (!identity.apiKey) {\n            throw new Error(\"request could not be signed with `apiKey` since the `apiKey` is not defined\");\n        }\n        const clonedRequest = HttpRequest.clone(httpRequest);\n        if (signingProperties.in === HttpApiKeyAuthLocation.QUERY) {\n            clonedRequest.query[signingProperties.name] = identity.apiKey;\n        }\n        else if (signingProperties.in === HttpApiKeyAuthLocation.HEADER) {\n            clonedRequest.headers[signingProperties.name] = signingProperties.scheme\n                ? `${signingProperties.scheme} ${identity.apiKey}`\n                : identity.apiKey;\n        }\n        else {\n            throw new Error(\"request can only be signed with `apiKey` locations `query` or `header`, \" +\n                \"but found: `\" +\n                signingProperties.in +\n                \"`\");\n        }\n        return clonedRequest;\n    }\n}\n", "import { HttpRequest } from \"@smithy/protocol-http\";\nexport class HttpBearerAuthSigner {\n    async sign(httpRequest, identity, signingProperties) {\n        const clonedRequest = HttpRequest.clone(httpRequest);\n        if (!identity.token) {\n            throw new Error(\"request could not be signed with `token` since the `token` is not defined\");\n        }\n        clonedRequest.headers[\"Authorization\"] = `Bearer ${identity.token}`;\n        return clonedRequest;\n    }\n}\n", "export class NoAuthSigner {\n    async sign(httpRequest, identity, signingProperties) {\n        return httpRequest;\n    }\n}\n", "export * from \"./httpApiKeyAuth\";\nexport * from \"./httpBearerAuth\";\nexport * from \"./noAuth\";\n", "export const createIsIdentityExpiredFunction = (expirationMs) => function isIdentityExpired(identity) {\n    return doesIdentityRequireRefresh(identity) && identity.expiration.getTime() - Date.now() < expirationMs;\n};\nexport const EXPIRATION_MS = 300_000;\nexport const isIdentityExpired = createIsIdentityExpiredFunction(EXPIRATION_MS);\nexport const doesIdentityRequireRefresh = (identity) => identity.expiration !== undefined;\nexport const memoizeIdentityProvider = (provider, isExpired, requiresRefresh) => {\n    if (provider === undefined) {\n        return undefined;\n    }\n    const normalizedProvider = typeof provider !== \"function\" ? async () => Promise.resolve(provider) : provider;\n    let resolved;\n    let pending;\n    let hasResult;\n    let isConstant = false;\n    const coalesceProvider = async (options) => {\n        if (!pending) {\n            pending = normalizedProvider(options);\n        }\n        try {\n            resolved = await pending;\n            hasResult = true;\n            isConstant = false;\n        }\n        finally {\n            pending = undefined;\n        }\n        return resolved;\n    };\n    if (isExpired === undefined) {\n        return async (options) => {\n            if (!hasResult || options?.forceRefresh) {\n                resolved = await coalesceProvider(options);\n            }\n            return resolved;\n        };\n    }\n    return async (options) => {\n        if (!hasResult || options?.forceRefresh) {\n            resolved = await coalesceProvider(options);\n        }\n        if (isConstant) {\n            return resolved;\n        }\n        if (!requiresRefresh(resolved)) {\n            isConstant = true;\n            return resolved;\n        }\n        if (isExpired(resolved)) {\n            await coalesceProvider(options);\n            return resolved;\n        }\n        return resolved;\n    };\n};\n", "export * from \"./DefaultIdentityProviderConfig\";\nexport * from \"./httpAuthSchemes\";\nexport * from \"./memoizeIdentityProvider\";\n", "export * from \"./getSmithyContext\";\nexport * from \"./middleware-http-auth-scheme\";\nexport * from \"./middleware-http-signing\";\nexport * from \"./normalizeProvider\";\nexport { createPaginator } from \"./pagination/createPaginator\";\nexport * from \"./request-builder/requestBuilder\";\nexport * from \"./setFeature\";\nexport * from \"./util-identity-and-auth\";\n", "import { normalizeProvider } from \"@smithy/core\";\nimport { ProviderError } from \"@smithy/property-provider\";\nexport const resolveAwsSdkSigV4AConfig = (config) => {\n    config.sigv4aSigningRegionSet = normalizeProvider(config.sigv4aSigningRegionSet);\n    return config;\n};\nexport const NODE_SIGV4A_CONFIG_OPTIONS = {\n    environmentVariableSelector(env) {\n        if (env.AWS_SIGV4A_SIGNING_REGION_SET) {\n            return env.AWS_SIGV4A_SIGNING_REGION_SET.split(\",\").map((_) => _.trim());\n        }\n        throw new ProviderError(\"AWS_SIGV4A_SIGNING_REGION_SET not set in env.\", {\n            tryNextLink: true,\n        });\n    },\n    configFileSelector(profile) {\n        if (profile.sigv4a_signing_region_set) {\n            return (profile.sigv4a_signing_region_set ?? \"\").split(\",\").map((_) => _.trim());\n        }\n        throw new ProviderError(\"sigv4a_signing_region_set not set in profile.\", {\n            tryNextLink: true,\n        });\n    },\n    default: undefined,\n};\n", "'use strict';\n\nvar utilHexEncoding = require('@smithy/util-hex-encoding');\nvar utilUtf8 = require('@smithy/util-utf8');\nvar isArrayBuffer = require('@smithy/is-array-buffer');\nvar protocolHttp = require('@smithy/protocol-http');\nvar utilMiddleware = require('@smithy/util-middleware');\nvar utilUriEscape = require('@smithy/util-uri-escape');\n\nconst ALGORITHM_QUERY_PARAM = \"X-Amz-Algorithm\";\nconst CREDENTIAL_QUERY_PARAM = \"X-Amz-Credential\";\nconst AMZ_DATE_QUERY_PARAM = \"X-Amz-Date\";\nconst SIGNED_HEADERS_QUERY_PARAM = \"X-Amz-SignedHeaders\";\nconst EXPIRES_QUERY_PARAM = \"X-Amz-Expires\";\nconst SIGNATURE_QUERY_PARAM = \"X-Amz-Signature\";\nconst TOKEN_QUERY_PARAM = \"X-Amz-Security-Token\";\nconst REGION_SET_PARAM = \"X-Amz-Region-Set\";\nconst AUTH_HEADER = \"authorization\";\nconst AMZ_DATE_HEADER = AMZ_DATE_QUERY_PARAM.toLowerCase();\nconst DATE_HEADER = \"date\";\nconst GENERATED_HEADERS = [AUTH_HEADER, AMZ_DATE_HEADER, DATE_HEADER];\nconst SIGNATURE_HEADER = SIGNATURE_QUERY_PARAM.toLowerCase();\nconst SHA256_HEADER = \"x-amz-content-sha256\";\nconst TOKEN_HEADER = TOKEN_QUERY_PARAM.toLowerCase();\nconst HOST_HEADER = \"host\";\nconst ALWAYS_UNSIGNABLE_HEADERS = {\n    authorization: true,\n    \"cache-control\": true,\n    connection: true,\n    expect: true,\n    from: true,\n    \"keep-alive\": true,\n    \"max-forwards\": true,\n    pragma: true,\n    referer: true,\n    te: true,\n    trailer: true,\n    \"transfer-encoding\": true,\n    upgrade: true,\n    \"user-agent\": true,\n    \"x-amzn-trace-id\": true,\n};\nconst PROXY_HEADER_PATTERN = /^proxy-/;\nconst SEC_HEADER_PATTERN = /^sec-/;\nconst UNSIGNABLE_PATTERNS = [/^proxy-/i, /^sec-/i];\nconst ALGORITHM_IDENTIFIER = \"AWS4-HMAC-SHA256\";\nconst ALGORITHM_IDENTIFIER_V4A = \"AWS4-ECDSA-P256-SHA256\";\nconst EVENT_ALGORITHM_IDENTIFIER = \"AWS4-HMAC-SHA256-PAYLOAD\";\nconst UNSIGNED_PAYLOAD = \"UNSIGNED-PAYLOAD\";\nconst MAX_CACHE_SIZE = 50;\nconst KEY_TYPE_IDENTIFIER = \"aws4_request\";\nconst MAX_PRESIGNED_TTL = 60 * 60 * 24 * 7;\n\nconst signingKeyCache = {};\nconst cacheQueue = [];\nconst createScope = (shortDate, region, service) => `${shortDate}/${region}/${service}/${KEY_TYPE_IDENTIFIER}`;\nconst getSigningKey = async (sha256Constructor, credentials, shortDate, region, service) => {\n    const credsHash = await hmac(sha256Constructor, credentials.secretAccessKey, credentials.accessKeyId);\n    const cacheKey = `${shortDate}:${region}:${service}:${utilHexEncoding.toHex(credsHash)}:${credentials.sessionToken}`;\n    if (cacheKey in signingKeyCache) {\n        return signingKeyCache[cacheKey];\n    }\n    cacheQueue.push(cacheKey);\n    while (cacheQueue.length > MAX_CACHE_SIZE) {\n        delete signingKeyCache[cacheQueue.shift()];\n    }\n    let key = `AWS4${credentials.secretAccessKey}`;\n    for (const signable of [shortDate, region, service, KEY_TYPE_IDENTIFIER]) {\n        key = await hmac(sha256Constructor, key, signable);\n    }\n    return (signingKeyCache[cacheKey] = key);\n};\nconst clearCredentialCache = () => {\n    cacheQueue.length = 0;\n    Object.keys(signingKeyCache).forEach((cacheKey) => {\n        delete signingKeyCache[cacheKey];\n    });\n};\nconst hmac = (ctor, secret, data) => {\n    const hash = new ctor(secret);\n    hash.update(utilUtf8.toUint8Array(data));\n    return hash.digest();\n};\n\nconst getCanonicalHeaders = ({ headers }, unsignableHeaders, signableHeaders) => {\n    const canonical = {};\n    for (const headerName of Object.keys(headers).sort()) {\n        if (headers[headerName] == undefined) {\n            continue;\n        }\n        const canonicalHeaderName = headerName.toLowerCase();\n        if (canonicalHeaderName in ALWAYS_UNSIGNABLE_HEADERS ||\n            unsignableHeaders?.has(canonicalHeaderName) ||\n            PROXY_HEADER_PATTERN.test(canonicalHeaderName) ||\n            SEC_HEADER_PATTERN.test(canonicalHeaderName)) {\n            if (!signableHeaders || (signableHeaders && !signableHeaders.has(canonicalHeaderName))) {\n                continue;\n            }\n        }\n        canonical[canonicalHeaderName] = headers[headerName].trim().replace(/\\s+/g, \" \");\n    }\n    return canonical;\n};\n\nconst getPayloadHash = async ({ headers, body }, hashConstructor) => {\n    for (const headerName of Object.keys(headers)) {\n        if (headerName.toLowerCase() === SHA256_HEADER) {\n            return headers[headerName];\n        }\n    }\n    if (body == undefined) {\n        return \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\";\n    }\n    else if (typeof body === \"string\" || ArrayBuffer.isView(body) || isArrayBuffer.isArrayBuffer(body)) {\n        const hashCtor = new hashConstructor();\n        hashCtor.update(utilUtf8.toUint8Array(body));\n        return utilHexEncoding.toHex(await hashCtor.digest());\n    }\n    return UNSIGNED_PAYLOAD;\n};\n\nclass HeaderFormatter {\n    format(headers) {\n        const chunks = [];\n        for (const headerName of Object.keys(headers)) {\n            const bytes = utilUtf8.fromUtf8(headerName);\n            chunks.push(Uint8Array.from([bytes.byteLength]), bytes, this.formatHeaderValue(headers[headerName]));\n        }\n        const out = new Uint8Array(chunks.reduce((carry, bytes) => carry + bytes.byteLength, 0));\n        let position = 0;\n        for (const chunk of chunks) {\n            out.set(chunk, position);\n            position += chunk.byteLength;\n        }\n        return out;\n    }\n    formatHeaderValue(header) {\n        switch (header.type) {\n            case \"boolean\":\n                return Uint8Array.from([header.value ? 0 : 1]);\n            case \"byte\":\n                return Uint8Array.from([2, header.value]);\n            case \"short\":\n                const shortView = new DataView(new ArrayBuffer(3));\n                shortView.setUint8(0, 3);\n                shortView.setInt16(1, header.value, false);\n                return new Uint8Array(shortView.buffer);\n            case \"integer\":\n                const intView = new DataView(new ArrayBuffer(5));\n                intView.setUint8(0, 4);\n                intView.setInt32(1, header.value, false);\n                return new Uint8Array(intView.buffer);\n            case \"long\":\n                const longBytes = new Uint8Array(9);\n                longBytes[0] = 5;\n                longBytes.set(header.value.bytes, 1);\n                return longBytes;\n            case \"binary\":\n                const binView = new DataView(new ArrayBuffer(3 + header.value.byteLength));\n                binView.setUint8(0, 6);\n                binView.setUint16(1, header.value.byteLength, false);\n                const binBytes = new Uint8Array(binView.buffer);\n                binBytes.set(header.value, 3);\n                return binBytes;\n            case \"string\":\n                const utf8Bytes = utilUtf8.fromUtf8(header.value);\n                const strView = new DataView(new ArrayBuffer(3 + utf8Bytes.byteLength));\n                strView.setUint8(0, 7);\n                strView.setUint16(1, utf8Bytes.byteLength, false);\n                const strBytes = new Uint8Array(strView.buffer);\n                strBytes.set(utf8Bytes, 3);\n                return strBytes;\n            case \"timestamp\":\n                const tsBytes = new Uint8Array(9);\n                tsBytes[0] = 8;\n                tsBytes.set(Int64.fromNumber(header.value.valueOf()).bytes, 1);\n                return tsBytes;\n            case \"uuid\":\n                if (!UUID_PATTERN.test(header.value)) {\n                    throw new Error(`Invalid UUID received: ${header.value}`);\n                }\n                const uuidBytes = new Uint8Array(17);\n                uuidBytes[0] = 9;\n                uuidBytes.set(utilHexEncoding.fromHex(header.value.replace(/\\-/g, \"\")), 1);\n                return uuidBytes;\n        }\n    }\n}\nvar HEADER_VALUE_TYPE;\n(function (HEADER_VALUE_TYPE) {\n    HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"boolTrue\"] = 0] = \"boolTrue\";\n    HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"boolFalse\"] = 1] = \"boolFalse\";\n    HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"byte\"] = 2] = \"byte\";\n    HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"short\"] = 3] = \"short\";\n    HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"integer\"] = 4] = \"integer\";\n    HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"long\"] = 5] = \"long\";\n    HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"byteArray\"] = 6] = \"byteArray\";\n    HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"string\"] = 7] = \"string\";\n    HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"timestamp\"] = 8] = \"timestamp\";\n    HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"uuid\"] = 9] = \"uuid\";\n})(HEADER_VALUE_TYPE || (HEADER_VALUE_TYPE = {}));\nconst UUID_PATTERN = /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/;\nclass Int64 {\n    bytes;\n    constructor(bytes) {\n        this.bytes = bytes;\n        if (bytes.byteLength !== 8) {\n            throw new Error(\"Int64 buffers must be exactly 8 bytes\");\n        }\n    }\n    static fromNumber(number) {\n        if (number > 9_223_372_036_854_775_807 || number < -9223372036854776e3) {\n            throw new Error(`${number} is too large (or, if negative, too small) to represent as an Int64`);\n        }\n        const bytes = new Uint8Array(8);\n        for (let i = 7, remaining = Math.abs(Math.round(number)); i > -1 && remaining > 0; i--, remaining /= 256) {\n            bytes[i] = remaining;\n        }\n        if (number < 0) {\n            negate(bytes);\n        }\n        return new Int64(bytes);\n    }\n    valueOf() {\n        const bytes = this.bytes.slice(0);\n        const negative = bytes[0] & 0b10000000;\n        if (negative) {\n            negate(bytes);\n        }\n        return parseInt(utilHexEncoding.toHex(bytes), 16) * (negative ? -1 : 1);\n    }\n    toString() {\n        return String(this.valueOf());\n    }\n}\nfunction negate(bytes) {\n    for (let i = 0; i < 8; i++) {\n        bytes[i] ^= 0xff;\n    }\n    for (let i = 7; i > -1; i--) {\n        bytes[i]++;\n        if (bytes[i] !== 0)\n            break;\n    }\n}\n\nconst hasHeader = (soughtHeader, headers) => {\n    soughtHeader = soughtHeader.toLowerCase();\n    for (const headerName of Object.keys(headers)) {\n        if (soughtHeader === headerName.toLowerCase()) {\n            return true;\n        }\n    }\n    return false;\n};\n\nconst moveHeadersToQuery = (request, options = {}) => {\n    const { headers, query = {} } = protocolHttp.HttpRequest.clone(request);\n    for (const name of Object.keys(headers)) {\n        const lname = name.toLowerCase();\n        if ((lname.slice(0, 6) === \"x-amz-\" && !options.unhoistableHeaders?.has(lname)) ||\n            options.hoistableHeaders?.has(lname)) {\n            query[name] = headers[name];\n            delete headers[name];\n        }\n    }\n    return {\n        ...request,\n        headers,\n        query,\n    };\n};\n\nconst prepareRequest = (request) => {\n    request = protocolHttp.HttpRequest.clone(request);\n    for (const headerName of Object.keys(request.headers)) {\n        if (GENERATED_HEADERS.indexOf(headerName.toLowerCase()) > -1) {\n            delete request.headers[headerName];\n        }\n    }\n    return request;\n};\n\nconst getCanonicalQuery = ({ query = {} }) => {\n    const keys = [];\n    const serialized = {};\n    for (const key of Object.keys(query)) {\n        if (key.toLowerCase() === SIGNATURE_HEADER) {\n            continue;\n        }\n        const encodedKey = utilUriEscape.escapeUri(key);\n        keys.push(encodedKey);\n        const value = query[key];\n        if (typeof value === \"string\") {\n            serialized[encodedKey] = `${encodedKey}=${utilUriEscape.escapeUri(value)}`;\n        }\n        else if (Array.isArray(value)) {\n            serialized[encodedKey] = value\n                .slice(0)\n                .reduce((encoded, value) => encoded.concat([`${encodedKey}=${utilUriEscape.escapeUri(value)}`]), [])\n                .sort()\n                .join(\"&\");\n        }\n    }\n    return keys\n        .sort()\n        .map((key) => serialized[key])\n        .filter((serialized) => serialized)\n        .join(\"&\");\n};\n\nconst iso8601 = (time) => toDate(time)\n    .toISOString()\n    .replace(/\\.\\d{3}Z$/, \"Z\");\nconst toDate = (time) => {\n    if (typeof time === \"number\") {\n        return new Date(time * 1000);\n    }\n    if (typeof time === \"string\") {\n        if (Number(time)) {\n            return new Date(Number(time) * 1000);\n        }\n        return new Date(time);\n    }\n    return time;\n};\n\nclass SignatureV4Base {\n    service;\n    regionProvider;\n    credentialProvider;\n    sha256;\n    uriEscapePath;\n    applyChecksum;\n    constructor({ applyChecksum, credentials, region, service, sha256, uriEscapePath = true, }) {\n        this.service = service;\n        this.sha256 = sha256;\n        this.uriEscapePath = uriEscapePath;\n        this.applyChecksum = typeof applyChecksum === \"boolean\" ? applyChecksum : true;\n        this.regionProvider = utilMiddleware.normalizeProvider(region);\n        this.credentialProvider = utilMiddleware.normalizeProvider(credentials);\n    }\n    createCanonicalRequest(request, canonicalHeaders, payloadHash) {\n        const sortedHeaders = Object.keys(canonicalHeaders).sort();\n        return `${request.method}\n${this.getCanonicalPath(request)}\n${getCanonicalQuery(request)}\n${sortedHeaders.map((name) => `${name}:${canonicalHeaders[name]}`).join(\"\\n\")}\n\n${sortedHeaders.join(\";\")}\n${payloadHash}`;\n    }\n    async createStringToSign(longDate, credentialScope, canonicalRequest, algorithmIdentifier) {\n        const hash = new this.sha256();\n        hash.update(utilUtf8.toUint8Array(canonicalRequest));\n        const hashedRequest = await hash.digest();\n        return `${algorithmIdentifier}\n${longDate}\n${credentialScope}\n${utilHexEncoding.toHex(hashedRequest)}`;\n    }\n    getCanonicalPath({ path }) {\n        if (this.uriEscapePath) {\n            const normalizedPathSegments = [];\n            for (const pathSegment of path.split(\"/\")) {\n                if (pathSegment?.length === 0)\n                    continue;\n                if (pathSegment === \".\")\n                    continue;\n                if (pathSegment === \"..\") {\n                    normalizedPathSegments.pop();\n                }\n                else {\n                    normalizedPathSegments.push(pathSegment);\n                }\n            }\n            const normalizedPath = `${path?.startsWith(\"/\") ? \"/\" : \"\"}${normalizedPathSegments.join(\"/\")}${normalizedPathSegments.length > 0 && path?.endsWith(\"/\") ? \"/\" : \"\"}`;\n            const doubleEncoded = utilUriEscape.escapeUri(normalizedPath);\n            return doubleEncoded.replace(/%2F/g, \"/\");\n        }\n        return path;\n    }\n    validateResolvedCredentials(credentials) {\n        if (typeof credentials !== \"object\" ||\n            typeof credentials.accessKeyId !== \"string\" ||\n            typeof credentials.secretAccessKey !== \"string\") {\n            throw new Error(\"Resolved credential object is not valid\");\n        }\n    }\n    formatDate(now) {\n        const longDate = iso8601(now).replace(/[\\-:]/g, \"\");\n        return {\n            longDate,\n            shortDate: longDate.slice(0, 8),\n        };\n    }\n    getCanonicalHeaderList(headers) {\n        return Object.keys(headers).sort().join(\";\");\n    }\n}\n\nclass SignatureV4 extends SignatureV4Base {\n    headerFormatter = new HeaderFormatter();\n    constructor({ applyChecksum, credentials, region, service, sha256, uriEscapePath = true, }) {\n        super({\n            applyChecksum,\n            credentials,\n            region,\n            service,\n            sha256,\n            uriEscapePath,\n        });\n    }\n    async presign(originalRequest, options = {}) {\n        const { signingDate = new Date(), expiresIn = 3600, unsignableHeaders, unhoistableHeaders, signableHeaders, hoistableHeaders, signingRegion, signingService, } = options;\n        const credentials = await this.credentialProvider();\n        this.validateResolvedCredentials(credentials);\n        const region = signingRegion ?? (await this.regionProvider());\n        const { longDate, shortDate } = this.formatDate(signingDate);\n        if (expiresIn > MAX_PRESIGNED_TTL) {\n            return Promise.reject(\"Signature version 4 presigned URLs\" + \" must have an expiration date less than one week in\" + \" the future\");\n        }\n        const scope = createScope(shortDate, region, signingService ?? this.service);\n        const request = moveHeadersToQuery(prepareRequest(originalRequest), { unhoistableHeaders, hoistableHeaders });\n        if (credentials.sessionToken) {\n            request.query[TOKEN_QUERY_PARAM] = credentials.sessionToken;\n        }\n        request.query[ALGORITHM_QUERY_PARAM] = ALGORITHM_IDENTIFIER;\n        request.query[CREDENTIAL_QUERY_PARAM] = `${credentials.accessKeyId}/${scope}`;\n        request.query[AMZ_DATE_QUERY_PARAM] = longDate;\n        request.query[EXPIRES_QUERY_PARAM] = expiresIn.toString(10);\n        const canonicalHeaders = getCanonicalHeaders(request, unsignableHeaders, signableHeaders);\n        request.query[SIGNED_HEADERS_QUERY_PARAM] = this.getCanonicalHeaderList(canonicalHeaders);\n        request.query[SIGNATURE_QUERY_PARAM] = await this.getSignature(longDate, scope, this.getSigningKey(credentials, region, shortDate, signingService), this.createCanonicalRequest(request, canonicalHeaders, await getPayloadHash(originalRequest, this.sha256)));\n        return request;\n    }\n    async sign(toSign, options) {\n        if (typeof toSign === \"string\") {\n            return this.signString(toSign, options);\n        }\n        else if (toSign.headers && toSign.payload) {\n            return this.signEvent(toSign, options);\n        }\n        else if (toSign.message) {\n            return this.signMessage(toSign, options);\n        }\n        else {\n            return this.signRequest(toSign, options);\n        }\n    }\n    async signEvent({ headers, payload }, { signingDate = new Date(), priorSignature, signingRegion, signingService, eventStreamCredentials, }) {\n        const region = signingRegion ?? (await this.regionProvider());\n        const { shortDate, longDate } = this.formatDate(signingDate);\n        const scope = createScope(shortDate, region, signingService ?? this.service);\n        const hashedPayload = await getPayloadHash({ headers: {}, body: payload }, this.sha256);\n        const hash = new this.sha256();\n        hash.update(headers);\n        const hashedHeaders = utilHexEncoding.toHex(await hash.digest());\n        const stringToSign = [\n            EVENT_ALGORITHM_IDENTIFIER,\n            longDate,\n            scope,\n            priorSignature,\n            hashedHeaders,\n            hashedPayload,\n        ].join(\"\\n\");\n        return this.signString(stringToSign, {\n            signingDate,\n            signingRegion: region,\n            signingService,\n            eventStreamCredentials,\n        });\n    }\n    async signMessage(signableMessage, { signingDate = new Date(), signingRegion, signingService, eventStreamCredentials }) {\n        const promise = this.signEvent({\n            headers: this.headerFormatter.format(signableMessage.message.headers),\n            payload: signableMessage.message.body,\n        }, {\n            signingDate,\n            signingRegion,\n            signingService,\n            priorSignature: signableMessage.priorSignature,\n            eventStreamCredentials,\n        });\n        return promise.then((signature) => {\n            return { message: signableMessage.message, signature };\n        });\n    }\n    async signString(stringToSign, { signingDate = new Date(), signingRegion, signingService, eventStreamCredentials, } = {}) {\n        const credentials = eventStreamCredentials ?? (await this.credentialProvider());\n        this.validateResolvedCredentials(credentials);\n        const region = signingRegion ?? (await this.regionProvider());\n        const { shortDate } = this.formatDate(signingDate);\n        const hash = new this.sha256(await this.getSigningKey(credentials, region, shortDate, signingService));\n        hash.update(utilUtf8.toUint8Array(stringToSign));\n        return utilHexEncoding.toHex(await hash.digest());\n    }\n    async signRequest(requestToSign, { signingDate = new Date(), signableHeaders, unsignableHeaders, signingRegion, signingService, } = {}) {\n        const credentials = await this.credentialProvider();\n        this.validateResolvedCredentials(credentials);\n        const region = signingRegion ?? (await this.regionProvider());\n        const request = prepareRequest(requestToSign);\n        const { longDate, shortDate } = this.formatDate(signingDate);\n        const scope = createScope(shortDate, region, signingService ?? this.service);\n        request.headers[AMZ_DATE_HEADER] = longDate;\n        if (credentials.sessionToken) {\n            request.headers[TOKEN_HEADER] = credentials.sessionToken;\n        }\n        const payloadHash = await getPayloadHash(request, this.sha256);\n        if (!hasHeader(SHA256_HEADER, request.headers) && this.applyChecksum) {\n            request.headers[SHA256_HEADER] = payloadHash;\n        }\n        const canonicalHeaders = getCanonicalHeaders(request, unsignableHeaders, signableHeaders);\n        const signature = await this.getSignature(longDate, scope, this.getSigningKey(credentials, region, shortDate, signingService), this.createCanonicalRequest(request, canonicalHeaders, payloadHash));\n        request.headers[AUTH_HEADER] =\n            `${ALGORITHM_IDENTIFIER} ` +\n                `Credential=${credentials.accessKeyId}/${scope}, ` +\n                `SignedHeaders=${this.getCanonicalHeaderList(canonicalHeaders)}, ` +\n                `Signature=${signature}`;\n        return request;\n    }\n    async getSignature(longDate, credentialScope, keyPromise, canonicalRequest) {\n        const stringToSign = await this.createStringToSign(longDate, credentialScope, canonicalRequest, ALGORITHM_IDENTIFIER);\n        const hash = new this.sha256(await keyPromise);\n        hash.update(utilUtf8.toUint8Array(stringToSign));\n        return utilHexEncoding.toHex(await hash.digest());\n    }\n    getSigningKey(credentials, region, shortDate, service) {\n        return getSigningKey(this.sha256, credentials, shortDate, region, service || this.service);\n    }\n}\n\nconst signatureV4aContainer = {\n    SignatureV4a: null,\n};\n\nexports.ALGORITHM_IDENTIFIER = ALGORITHM_IDENTIFIER;\nexports.ALGORITHM_IDENTIFIER_V4A = ALGORITHM_IDENTIFIER_V4A;\nexports.ALGORITHM_QUERY_PARAM = ALGORITHM_QUERY_PARAM;\nexports.ALWAYS_UNSIGNABLE_HEADERS = ALWAYS_UNSIGNABLE_HEADERS;\nexports.AMZ_DATE_HEADER = AMZ_DATE_HEADER;\nexports.AMZ_DATE_QUERY_PARAM = AMZ_DATE_QUERY_PARAM;\nexports.AUTH_HEADER = AUTH_HEADER;\nexports.CREDENTIAL_QUERY_PARAM = CREDENTIAL_QUERY_PARAM;\nexports.DATE_HEADER = DATE_HEADER;\nexports.EVENT_ALGORITHM_IDENTIFIER = EVENT_ALGORITHM_IDENTIFIER;\nexports.EXPIRES_QUERY_PARAM = EXPIRES_QUERY_PARAM;\nexports.GENERATED_HEADERS = GENERATED_HEADERS;\nexports.HOST_HEADER = HOST_HEADER;\nexports.KEY_TYPE_IDENTIFIER = KEY_TYPE_IDENTIFIER;\nexports.MAX_CACHE_SIZE = MAX_CACHE_SIZE;\nexports.MAX_PRESIGNED_TTL = MAX_PRESIGNED_TTL;\nexports.PROXY_HEADER_PATTERN = PROXY_HEADER_PATTERN;\nexports.REGION_SET_PARAM = REGION_SET_PARAM;\nexports.SEC_HEADER_PATTERN = SEC_HEADER_PATTERN;\nexports.SHA256_HEADER = SHA256_HEADER;\nexports.SIGNATURE_HEADER = SIGNATURE_HEADER;\nexports.SIGNATURE_QUERY_PARAM = SIGNATURE_QUERY_PARAM;\nexports.SIGNED_HEADERS_QUERY_PARAM = SIGNED_HEADERS_QUERY_PARAM;\nexports.SignatureV4 = SignatureV4;\nexports.SignatureV4Base = SignatureV4Base;\nexports.TOKEN_HEADER = TOKEN_HEADER;\nexports.TOKEN_QUERY_PARAM = TOKEN_QUERY_PARAM;\nexports.UNSIGNABLE_PATTERNS = UNSIGNABLE_PATTERNS;\nexports.UNSIGNED_PAYLOAD = UNSIGNED_PAYLOAD;\nexports.clearCredentialCache = clearCredentialCache;\nexports.createScope = createScope;\nexports.getCanonicalHeaders = getCanonicalHeaders;\nexports.getCanonicalQuery = getCanonicalQuery;\nexports.getPayloadHash = getPayloadHash;\nexports.getSigningKey = getSigningKey;\nexports.hasHeader = hasHeader;\nexports.moveHeadersToQuery = moveHeadersToQuery;\nexports.prepareRequest = prepareRequest;\nexports.signatureV4aContainer = signatureV4aContainer;\n", "import { setCredentialFeature } from \"@aws-sdk/core/client\";\nimport { doesIdentityRequireRefresh, isIdentityExpired, memoizeIdentityProvider, normalizeProvider, } from \"@smithy/core\";\nimport { SignatureV4 } from \"@smithy/signature-v4\";\nexport const resolveAwsSdkSigV4Config = (config) => {\n    let inputCredentials = config.credentials;\n    let isUserSupplied = !!config.credentials;\n    let resolvedCredentials = undefined;\n    Object.defineProperty(config, \"credentials\", {\n        set(credentials) {\n            if (credentials && credentials !== inputCredentials && credentials !== resolvedCredentials) {\n                isUserSupplied = true;\n            }\n            inputCredentials = credentials;\n            const memoizedProvider = normalizeCredentialProvider(config, {\n                credentials: inputCredentials,\n                credentialDefaultProvider: config.credentialDefaultProvider,\n            });\n            const boundProvider = bindCallerConfig(config, memoizedProvider);\n            if (isUserSupplied && !boundProvider.attributed) {\n                const isCredentialObject = typeof inputCredentials === \"object\" && inputCredentials !== null;\n                resolvedCredentials = async (options) => {\n                    const creds = await boundProvider(options);\n                    const attributedCreds = creds;\n                    if (isCredentialObject && (!attributedCreds.$source || Object.keys(attributedCreds.$source).length === 0)) {\n                        return setCredentialFeature(attributedCreds, \"CREDENTIALS_CODE\", \"e\");\n                    }\n                    return attributedCreds;\n                };\n                resolvedCredentials.memoized = boundProvider.memoized;\n                resolvedCredentials.configBound = boundProvider.configBound;\n                resolvedCredentials.attributed = true;\n            }\n            else {\n                resolvedCredentials = boundProvider;\n            }\n        },\n        get() {\n            return resolvedCredentials;\n        },\n        enumerable: true,\n        configurable: true,\n    });\n    config.credentials = inputCredentials;\n    const { signingEscapePath = true, systemClockOffset = config.systemClockOffset || 0, sha256, } = config;\n    let signer;\n    if (config.signer) {\n        signer = normalizeProvider(config.signer);\n    }\n    else if (config.regionInfoProvider) {\n        signer = () => normalizeProvider(config.region)()\n            .then(async (region) => [\n            (await config.regionInfoProvider(region, {\n                useFipsEndpoint: await config.useFipsEndpoint(),\n                useDualstackEndpoint: await config.useDualstackEndpoint(),\n            })) || {},\n            region,\n        ])\n            .then(([regionInfo, region]) => {\n            const { signingRegion, signingService } = regionInfo;\n            config.signingRegion = config.signingRegion || signingRegion || region;\n            config.signingName = config.signingName || signingService || config.serviceId;\n            const params = {\n                ...config,\n                credentials: config.credentials,\n                region: config.signingRegion,\n                service: config.signingName,\n                sha256,\n                uriEscapePath: signingEscapePath,\n            };\n            const SignerCtor = config.signerConstructor || SignatureV4;\n            return new SignerCtor(params);\n        });\n    }\n    else {\n        signer = async (authScheme) => {\n            authScheme = Object.assign({}, {\n                name: \"sigv4\",\n                signingName: config.signingName || config.defaultSigningName,\n                signingRegion: await normalizeProvider(config.region)(),\n                properties: {},\n            }, authScheme);\n            const signingRegion = authScheme.signingRegion;\n            const signingService = authScheme.signingName;\n            config.signingRegion = config.signingRegion || signingRegion;\n            config.signingName = config.signingName || signingService || config.serviceId;\n            const params = {\n                ...config,\n                credentials: config.credentials,\n                region: config.signingRegion,\n                service: config.signingName,\n                sha256,\n                uriEscapePath: signingEscapePath,\n            };\n            const SignerCtor = config.signerConstructor || SignatureV4;\n            return new SignerCtor(params);\n        };\n    }\n    const resolvedConfig = Object.assign(config, {\n        systemClockOffset,\n        signingEscapePath,\n        signer,\n    });\n    return resolvedConfig;\n};\nexport const resolveAWSSDKSigV4Config = resolveAwsSdkSigV4Config;\nfunction normalizeCredentialProvider(config, { credentials, credentialDefaultProvider, }) {\n    let credentialsProvider;\n    if (credentials) {\n        if (!credentials?.memoized) {\n            credentialsProvider = memoizeIdentityProvider(credentials, isIdentityExpired, doesIdentityRequireRefresh);\n        }\n        else {\n            credentialsProvider = credentials;\n        }\n    }\n    else {\n        if (credentialDefaultProvider) {\n            credentialsProvider = normalizeProvider(credentialDefaultProvider(Object.assign({}, config, {\n                parentClientConfig: config,\n            })));\n        }\n        else {\n            credentialsProvider = async () => {\n                throw new Error(\"@aws-sdk/core::resolveAwsSdkSigV4Config - `credentials` not provided and no credentialDefaultProvider was configured.\");\n            };\n        }\n    }\n    credentialsProvider.memoized = true;\n    return credentialsProvider;\n}\nfunction bindCallerConfig(config, credentialsProvider) {\n    if (credentialsProvider.configBound) {\n        return credentialsProvider;\n    }\n    const fn = async (options) => credentialsProvider({ ...options, callerClientConfig: config });\n    fn.memoized = credentialsProvider.memoized;\n    fn.configBound = true;\n    return fn;\n}\n", "export { AwsSdkSigV4Signer, AWSSDKSigV4Signer, validateSigningProperties } from \"./AwsSdkSigV4Signer\";\nexport { AwsSdkSigV4ASigner } from \"./AwsSdkSigV4ASigner\";\nexport * from \"./NODE_AUTH_SCHEME_PREFERENCE_OPTIONS\";\nexport * from \"./resolveAwsSdkSigV4AConfig\";\nexport * from \"./resolveAwsSdkSigV4Config\";\n", "export * from \"./aws_sdk\";\nexport * from \"./utils/getBearerTokenEnvKey\";\n", "'use strict';\n\nvar protocolHttp = require('@smithy/protocol-http');\n\nfunction resolveHostHeaderConfig(input) {\n    return input;\n}\nconst hostHeaderMiddleware = (options) => (next) => async (args) => {\n    if (!protocolHttp.HttpRequest.isInstance(args.request))\n        return next(args);\n    const { request } = args;\n    const { handlerProtocol = \"\" } = options.requestHandler.metadata || {};\n    if (handlerProtocol.indexOf(\"h2\") >= 0 && !request.headers[\":authority\"]) {\n        delete request.headers[\"host\"];\n        request.headers[\":authority\"] = request.hostname + (request.port ? \":\" + request.port : \"\");\n    }\n    else if (!request.headers[\"host\"]) {\n        let host = request.hostname;\n        if (request.port != null)\n            host += `:${request.port}`;\n        request.headers[\"host\"] = host;\n    }\n    return next(args);\n};\nconst hostHeaderMiddlewareOptions = {\n    name: \"hostHeaderMiddleware\",\n    step: \"build\",\n    priority: \"low\",\n    tags: [\"HOST\"],\n    override: true,\n};\nconst getHostHeaderPlugin = (options) => ({\n    applyToStack: (clientStack) => {\n        clientStack.add(hostHeaderMiddleware(options), hostHeaderMiddlewareOptions);\n    },\n});\n\nexports.getHostHeaderPlugin = getHostHeaderPlugin;\nexports.hostHeaderMiddleware = hostHeaderMiddleware;\nexports.hostHeaderMiddlewareOptions = hostHeaderMiddlewareOptions;\nexports.resolveHostHeaderConfig = resolveHostHeaderConfig;\n", "'use strict';\n\nconst loggerMiddleware = () => (next, context) => async (args) => {\n    try {\n        const response = await next(args);\n        const { clientName, commandName, logger, dynamoDbDocumentClientOptions = {} } = context;\n        const { overrideInputFilterSensitiveLog, overrideOutputFilterSensitiveLog } = dynamoDbDocumentClientOptions;\n        const inputFilterSensitiveLog = overrideInputFilterSensitiveLog ?? context.inputFilterSensitiveLog;\n        const outputFilterSensitiveLog = overrideOutputFilterSensitiveLog ?? context.outputFilterSensitiveLog;\n        const { $metadata, ...outputWithoutMetadata } = response.output;\n        logger?.info?.({\n            clientName,\n            commandName,\n            input: inputFilterSensitiveLog(args.input),\n            output: outputFilterSensitiveLog(outputWithoutMetadata),\n            metadata: $metadata,\n        });\n        return response;\n    }\n    catch (error) {\n        const { clientName, commandName, logger, dynamoDbDocumentClientOptions = {} } = context;\n        const { overrideInputFilterSensitiveLog } = dynamoDbDocumentClientOptions;\n        const inputFilterSensitiveLog = overrideInputFilterSensitiveLog ?? context.inputFilterSensitiveLog;\n        logger?.error?.({\n            clientName,\n            commandName,\n            input: inputFilterSensitiveLog(args.input),\n            error,\n            metadata: error.$metadata,\n        });\n        throw error;\n    }\n};\nconst loggerMiddlewareOptions = {\n    name: \"loggerMiddleware\",\n    tags: [\"LOGGER\"],\n    step: \"initialize\",\n    override: true,\n};\nconst getLoggerPlugin = (options) => ({\n    applyToStack: (clientStack) => {\n        clientStack.add(loggerMiddleware(), loggerMiddlewareOptions);\n    },\n});\n\nexports.getLoggerPlugin = getLoggerPlugin;\nexports.loggerMiddleware = loggerMiddleware;\nexports.loggerMiddlewareOptions = loggerMiddlewareOptions;\n", "const PROTECTED_KEYS = {\n    REQUEST_ID: Symbol.for(\"_AWS_LAMBDA_REQUEST_ID\"),\n    X_RAY_TRACE_ID: Symbol.for(\"_AWS_LAMBDA_X_RAY_TRACE_ID\"),\n    TENANT_ID: Symbol.for(\"_AWS_LAMBDA_TENANT_ID\"),\n};\nconst NO_GLOBAL_AWS_LAMBDA = [\"true\", \"1\"].includes(process.env?.AWS_LAMBDA_NODEJS_NO_GLOBAL_AWSLAMBDA ?? \"\");\nif (!NO_GLOBAL_AWS_LAMBDA) {\n    globalThis.awslambda = globalThis.awslambda || {};\n}\nclass InvokeStoreBase {\n    static PROTECTED_KEYS = PROTECTED_KEYS;\n    isProtectedKey(key) {\n        return Object.values(PROTECTED_KEYS).includes(key);\n    }\n    getRequestId() {\n        return this.get(PROTECTED_KEYS.REQUEST_ID) ?? \"-\";\n    }\n    getXRayTraceId() {\n        return this.get(PROTECTED_KEYS.X_RAY_TRACE_ID);\n    }\n    getTenantId() {\n        return this.get(PROTECTED_KEYS.TENANT_ID);\n    }\n}\nclass InvokeStoreSingle extends InvokeStoreBase {\n    currentContext;\n    getContext() {\n        return this.currentContext;\n    }\n    hasContext() {\n        return this.currentContext !== undefined;\n    }\n    get(key) {\n        return this.currentContext?.[key];\n    }\n    set(key, value) {\n        if (this.isProtectedKey(key)) {\n            throw new Error(`Cannot modify protected Lambda context field: ${String(key)}`);\n        }\n        this.currentContext = this.currentContext || {};\n        this.currentContext[key] = value;\n    }\n    run(context, fn) {\n        this.currentContext = context;\n        return fn();\n    }\n}\nclass InvokeStoreMulti extends InvokeStoreBase {\n    als;\n    static async create() {\n        const instance = new InvokeStoreMulti();\n        const asyncHooks = await import('node:async_hooks');\n        instance.als = new asyncHooks.AsyncLocalStorage();\n        return instance;\n    }\n    getContext() {\n        return this.als.getStore();\n    }\n    hasContext() {\n        return this.als.getStore() !== undefined;\n    }\n    get(key) {\n        return this.als.getStore()?.[key];\n    }\n    set(key, value) {\n        if (this.isProtectedKey(key)) {\n            throw new Error(`Cannot modify protected Lambda context field: ${String(key)}`);\n        }\n        const store = this.als.getStore();\n        if (!store) {\n            throw new Error(\"No context available\");\n        }\n        store[key] = value;\n    }\n    run(context, fn) {\n        return this.als.run(context, fn);\n    }\n}\nvar InvokeStore;\n(function (InvokeStore) {\n    let instance = null;\n    async function getInstanceAsync(forceInvokeStoreMulti) {\n        if (!instance) {\n            instance = (async () => {\n                const isMulti = forceInvokeStoreMulti === true || \"AWS_LAMBDA_MAX_CONCURRENCY\" in process.env;\n                const newInstance = isMulti\n                    ? await InvokeStoreMulti.create()\n                    : new InvokeStoreSingle();\n                if (!NO_GLOBAL_AWS_LAMBDA && globalThis.awslambda?.InvokeStore) {\n                    return globalThis.awslambda.InvokeStore;\n                }\n                else if (!NO_GLOBAL_AWS_LAMBDA && globalThis.awslambda) {\n                    globalThis.awslambda.InvokeStore = newInstance;\n                    return newInstance;\n                }\n                else {\n                    return newInstance;\n                }\n            })();\n        }\n        return instance;\n    }\n    InvokeStore.getInstanceAsync = getInstanceAsync;\n    InvokeStore._testing = process.env.AWS_LAMBDA_BENCHMARK_MODE === \"1\"\n        ? {\n            reset: () => {\n                instance = null;\n                if (globalThis.awslambda?.InvokeStore) {\n                    delete globalThis.awslambda.InvokeStore;\n                }\n                globalThis.awslambda = { InvokeStore: undefined };\n            },\n        }\n        : undefined;\n})(InvokeStore || (InvokeStore = {}));\n\nexport { InvokeStore, InvokeStoreBase };\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.recursionDetectionMiddleware = void 0;\nconst lambda_invoke_store_1 = require(\"@aws/lambda-invoke-store\");\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst TRACE_ID_HEADER_NAME = \"X-Amzn-Trace-Id\";\nconst ENV_LAMBDA_FUNCTION_NAME = \"AWS_LAMBDA_FUNCTION_NAME\";\nconst ENV_TRACE_ID = \"_X_AMZN_TRACE_ID\";\nconst recursionDetectionMiddleware = () => (next) => async (args) => {\n    const { request } = args;\n    if (!protocol_http_1.HttpRequest.isInstance(request)) {\n        return next(args);\n    }\n    const traceIdHeader = Object.keys(request.headers ?? {}).find((h) => h.toLowerCase() === TRACE_ID_HEADER_NAME.toLowerCase()) ??\n        TRACE_ID_HEADER_NAME;\n    if (request.headers.hasOwnProperty(traceIdHeader)) {\n        return next(args);\n    }\n    const functionName = process.env[ENV_LAMBDA_FUNCTION_NAME];\n    const traceIdFromEnv = process.env[ENV_TRACE_ID];\n    const invokeStore = await lambda_invoke_store_1.InvokeStore.getInstanceAsync();\n    const traceIdFromInvokeStore = invokeStore?.getXRayTraceId();\n    const traceId = traceIdFromInvokeStore ?? traceIdFromEnv;\n    const nonEmptyString = (str) => typeof str === \"string\" && str.length > 0;\n    if (nonEmptyString(functionName) && nonEmptyString(traceId)) {\n        request.headers[TRACE_ID_HEADER_NAME] = traceId;\n    }\n    return next({\n        ...args,\n        request,\n    });\n};\nexports.recursionDetectionMiddleware = recursionDetectionMiddleware;\n", "'use strict';\n\nvar recursionDetectionMiddleware = require('./recursionDetectionMiddleware');\n\nconst recursionDetectionMiddlewareOptions = {\n    step: \"build\",\n    tags: [\"RECURSION_DETECTION\"],\n    name: \"recursionDetectionMiddleware\",\n    override: true,\n    priority: \"low\",\n};\n\nconst getRecursionDetectionPlugin = (options) => ({\n    applyToStack: (clientStack) => {\n        clientStack.add(recursionDetectionMiddleware.recursionDetectionMiddleware(), recursionDetectionMiddlewareOptions);\n    },\n});\n\nexports.getRecursionDetectionPlugin = getRecursionDetectionPlugin;\nObject.prototype.hasOwnProperty.call(recursionDetectionMiddleware, '__proto__') &&\n    !Object.prototype.hasOwnProperty.call(exports, '__proto__') &&\n    Object.defineProperty(exports, '__proto__', {\n        enumerable: true,\n        value: recursionDetectionMiddleware['__proto__']\n    });\n\nObject.keys(recursionDetectionMiddleware).forEach(function (k) {\n    if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) exports[k] = recursionDetectionMiddleware[k];\n});\n", "'use strict';\n\nvar types = require('@smithy/types');\n\nclass BinaryDecisionDiagram {\n    nodes;\n    root;\n    conditions;\n    results;\n    constructor(bdd, root, conditions, results) {\n        this.nodes = bdd;\n        this.root = root;\n        this.conditions = conditions;\n        this.results = results;\n    }\n    static from(bdd, root, conditions, results) {\n        return new BinaryDecisionDiagram(bdd, root, conditions, results);\n    }\n}\n\nclass EndpointCache {\n    capacity;\n    data = new Map();\n    parameters = [];\n    constructor({ size, params }) {\n        this.capacity = size ?? 50;\n        if (params) {\n            this.parameters = params;\n        }\n    }\n    get(endpointParams, resolver) {\n        const key = this.hash(endpointParams);\n        if (key === false) {\n            return resolver();\n        }\n        if (!this.data.has(key)) {\n            if (this.data.size > this.capacity + 10) {\n                const keys = this.data.keys();\n                let i = 0;\n                while (true) {\n                    const { value, done } = keys.next();\n                    this.data.delete(value);\n                    if (done || ++i > 10) {\n                        break;\n                    }\n                }\n            }\n            this.data.set(key, resolver());\n        }\n        return this.data.get(key);\n    }\n    size() {\n        return this.data.size;\n    }\n    hash(endpointParams) {\n        let buffer = \"\";\n        const { parameters } = this;\n        if (parameters.length === 0) {\n            return false;\n        }\n        for (const param of parameters) {\n            const val = String(endpointParams[param] ?? \"\");\n            if (val.includes(\"|;\")) {\n                return false;\n            }\n            buffer += val + \"|;\";\n        }\n        return buffer;\n    }\n}\n\nclass EndpointError extends Error {\n    constructor(message) {\n        super(message);\n        this.name = \"EndpointError\";\n    }\n}\n\nconst debugId = \"endpoints\";\n\nfunction toDebugString(input) {\n    if (typeof input !== \"object\" || input == null) {\n        return input;\n    }\n    if (\"ref\" in input) {\n        return `$${toDebugString(input.ref)}`;\n    }\n    if (\"fn\" in input) {\n        return `${input.fn}(${(input.argv || []).map(toDebugString).join(\", \")})`;\n    }\n    return JSON.stringify(input, null, 2);\n}\n\nconst customEndpointFunctions = {};\n\nconst booleanEquals = (value1, value2) => value1 === value2;\n\nfunction coalesce(...args) {\n    for (const arg of args) {\n        if (arg != null) {\n            return arg;\n        }\n    }\n    return undefined;\n}\n\nconst getAttrPathList = (path) => {\n    const parts = path.split(\".\");\n    const pathList = [];\n    for (const part of parts) {\n        const squareBracketIndex = part.indexOf(\"[\");\n        if (squareBracketIndex !== -1) {\n            if (part.indexOf(\"]\") !== part.length - 1) {\n                throw new EndpointError(`Path: '${path}' does not end with ']'`);\n            }\n            const arrayIndex = part.slice(squareBracketIndex + 1, -1);\n            if (Number.isNaN(parseInt(arrayIndex))) {\n                throw new EndpointError(`Invalid array index: '${arrayIndex}' in path: '${path}'`);\n            }\n            if (squareBracketIndex !== 0) {\n                pathList.push(part.slice(0, squareBracketIndex));\n            }\n            pathList.push(arrayIndex);\n        }\n        else {\n            pathList.push(part);\n        }\n    }\n    return pathList;\n};\n\nconst getAttr = (value, path) => getAttrPathList(path).reduce((acc, index) => {\n    if (typeof acc !== \"object\") {\n        throw new EndpointError(`Index '${index}' in '${path}' not found in '${JSON.stringify(value)}'`);\n    }\n    else if (Array.isArray(acc)) {\n        const i = parseInt(index);\n        return acc[i < 0 ? acc.length + i : i];\n    }\n    return acc[index];\n}, value);\n\nconst isSet = (value) => value != null;\n\nconst VALID_HOST_LABEL_REGEX = new RegExp(`^(?!.*-$)(?!-)[a-zA-Z0-9-]{1,63}$`);\nconst isValidHostLabel = (value, allowSubDomains = false) => {\n    if (!allowSubDomains) {\n        return VALID_HOST_LABEL_REGEX.test(value);\n    }\n    const labels = value.split(\".\");\n    for (const label of labels) {\n        if (!isValidHostLabel(label)) {\n            return false;\n        }\n    }\n    return true;\n};\n\nfunction ite(condition, trueValue, falseValue) {\n    return condition ? trueValue : falseValue;\n}\n\nconst not = (value) => !value;\n\nconst IP_V4_REGEX = new RegExp(`^(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)){3}$`);\nconst isIpAddress = (value) => IP_V4_REGEX.test(value) || (value.startsWith(\"[\") && value.endsWith(\"]\"));\n\nconst DEFAULT_PORTS = {\n    [types.EndpointURLScheme.HTTP]: 80,\n    [types.EndpointURLScheme.HTTPS]: 443,\n};\nconst parseURL = (value) => {\n    const whatwgURL = (() => {\n        try {\n            if (value instanceof URL) {\n                return value;\n            }\n            if (typeof value === \"object\" && \"hostname\" in value) {\n                const { hostname, port, protocol = \"\", path = \"\", query = {} } = value;\n                const url = new URL(`${protocol}//${hostname}${port ? `:${port}` : \"\"}${path}`);\n                url.search = Object.entries(query)\n                    .map(([k, v]) => `${k}=${v}`)\n                    .join(\"&\");\n                return url;\n            }\n            return new URL(value);\n        }\n        catch (error) {\n            return null;\n        }\n    })();\n    if (!whatwgURL) {\n        console.error(`Unable to parse ${JSON.stringify(value)} as a whatwg URL.`);\n        return null;\n    }\n    const urlString = whatwgURL.href;\n    const { host, hostname, pathname, protocol, search } = whatwgURL;\n    if (search) {\n        return null;\n    }\n    const scheme = protocol.slice(0, -1);\n    if (!Object.values(types.EndpointURLScheme).includes(scheme)) {\n        return null;\n    }\n    const isIp = isIpAddress(hostname);\n    const inputContainsDefaultPort = urlString.includes(`${host}:${DEFAULT_PORTS[scheme]}`) ||\n        (typeof value === \"string\" && value.includes(`${host}:${DEFAULT_PORTS[scheme]}`));\n    const authority = `${host}${inputContainsDefaultPort ? `:${DEFAULT_PORTS[scheme]}` : ``}`;\n    return {\n        scheme,\n        authority,\n        path: pathname,\n        normalizedPath: pathname.endsWith(\"/\") ? pathname : `${pathname}/`,\n        isIp,\n    };\n};\n\nfunction split(value, delimiter, limit) {\n    if (limit === 1) {\n        return [value];\n    }\n    if (value === \"\") {\n        return [\"\"];\n    }\n    const parts = value.split(delimiter);\n    if (limit === 0) {\n        return parts;\n    }\n    return parts.slice(0, limit - 1).concat(parts.slice(1).join(delimiter));\n}\n\nconst stringEquals = (value1, value2) => value1 === value2;\n\nconst substring = (input, start, stop, reverse) => {\n    if (input == null || start >= stop || input.length < stop || /[^\\u0000-\\u007f]/.test(input)) {\n        return null;\n    }\n    if (!reverse) {\n        return input.substring(start, stop);\n    }\n    return input.substring(input.length - stop, input.length - start);\n};\n\nconst uriEncode = (value) => encodeURIComponent(value).replace(/[!*'()]/g, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`);\n\nconst endpointFunctions = {\n    booleanEquals,\n    coalesce,\n    getAttr,\n    isSet,\n    isValidHostLabel,\n    ite,\n    not,\n    parseURL,\n    split,\n    stringEquals,\n    substring,\n    uriEncode,\n};\n\nconst evaluateTemplate = (template, options) => {\n    const evaluatedTemplateArr = [];\n    const { referenceRecord, endpointParams } = options;\n    let currentIndex = 0;\n    while (currentIndex < template.length) {\n        const openingBraceIndex = template.indexOf(\"{\", currentIndex);\n        if (openingBraceIndex === -1) {\n            evaluatedTemplateArr.push(template.slice(currentIndex));\n            break;\n        }\n        evaluatedTemplateArr.push(template.slice(currentIndex, openingBraceIndex));\n        const closingBraceIndex = template.indexOf(\"}\", openingBraceIndex);\n        if (closingBraceIndex === -1) {\n            evaluatedTemplateArr.push(template.slice(openingBraceIndex));\n            break;\n        }\n        if (template[openingBraceIndex + 1] === \"{\" && template[closingBraceIndex + 1] === \"}\") {\n            evaluatedTemplateArr.push(template.slice(openingBraceIndex + 1, closingBraceIndex));\n            currentIndex = closingBraceIndex + 2;\n        }\n        const parameterName = template.substring(openingBraceIndex + 1, closingBraceIndex);\n        if (parameterName.includes(\"#\")) {\n            const [refName, attrName] = parameterName.split(\"#\");\n            evaluatedTemplateArr.push(getAttr((referenceRecord[refName] ?? endpointParams[refName]), attrName));\n        }\n        else {\n            evaluatedTemplateArr.push((referenceRecord[parameterName] ?? endpointParams[parameterName]));\n        }\n        currentIndex = closingBraceIndex + 1;\n    }\n    return evaluatedTemplateArr.join(\"\");\n};\n\nconst getReferenceValue = ({ ref }, options) => {\n    return options.referenceRecord[ref] ?? options.endpointParams[ref];\n};\n\nconst evaluateExpression = (obj, keyName, options) => {\n    if (typeof obj === \"string\") {\n        return evaluateTemplate(obj, options);\n    }\n    else if (obj[\"fn\"]) {\n        return group$2.callFunction(obj, options);\n    }\n    else if (obj[\"ref\"]) {\n        return getReferenceValue(obj, options);\n    }\n    throw new EndpointError(`'${keyName}': ${String(obj)} is not a string, function or reference.`);\n};\nconst callFunction = ({ fn, argv }, options) => {\n    const evaluatedArgs = Array(argv.length);\n    for (let i = 0; i < evaluatedArgs.length; ++i) {\n        const arg = argv[i];\n        if (typeof arg === \"boolean\" || typeof arg === \"number\") {\n            evaluatedArgs[i] = arg;\n        }\n        else {\n            evaluatedArgs[i] = group$2.evaluateExpression(arg, \"arg\", options);\n        }\n    }\n    const namespaceSeparatorIndex = fn.indexOf(\".\");\n    if (namespaceSeparatorIndex !== -1) {\n        const namespaceFunctions = customEndpointFunctions[fn.slice(0, namespaceSeparatorIndex)];\n        const customFunction = namespaceFunctions?.[fn.slice(namespaceSeparatorIndex + 1)];\n        if (typeof customFunction === \"function\") {\n            return customFunction(...evaluatedArgs);\n        }\n    }\n    const callable = endpointFunctions[fn];\n    if (typeof callable === \"function\") {\n        return callable(...evaluatedArgs);\n    }\n    throw new Error(`function ${fn} not loaded in endpointFunctions.`);\n};\nconst group$2 = {\n    evaluateExpression,\n    callFunction,\n};\n\nconst evaluateCondition = (condition, options) => {\n    const { assign } = condition;\n    if (assign && assign in options.referenceRecord) {\n        throw new EndpointError(`'${assign}' is already defined in Reference Record.`);\n    }\n    const value = callFunction(condition, options);\n    options.logger?.debug?.(`${debugId} evaluateCondition: ${toDebugString(condition)} = ${toDebugString(value)}`);\n    const result = value === \"\" ? true : !!value;\n    if (assign != null) {\n        return { result, toAssign: { name: assign, value } };\n    }\n    return { result };\n};\n\nconst getEndpointHeaders = (headers, options) => Object.entries(headers ?? {}).reduce((acc, [headerKey, headerVal]) => {\n    acc[headerKey] = headerVal.map((headerValEntry) => {\n        const processedExpr = evaluateExpression(headerValEntry, \"Header value entry\", options);\n        if (typeof processedExpr !== \"string\") {\n            throw new EndpointError(`Header '${headerKey}' value '${processedExpr}' is not a string`);\n        }\n        return processedExpr;\n    });\n    return acc;\n}, {});\n\nconst getEndpointProperties = (properties, options) => Object.entries(properties).reduce((acc, [propertyKey, propertyVal]) => {\n    acc[propertyKey] = group$1.getEndpointProperty(propertyVal, options);\n    return acc;\n}, {});\nconst getEndpointProperty = (property, options) => {\n    if (Array.isArray(property)) {\n        return property.map((propertyEntry) => getEndpointProperty(propertyEntry, options));\n    }\n    switch (typeof property) {\n        case \"string\":\n            return evaluateTemplate(property, options);\n        case \"object\":\n            if (property === null) {\n                throw new EndpointError(`Unexpected endpoint property: ${property}`);\n            }\n            return group$1.getEndpointProperties(property, options);\n        case \"boolean\":\n            return property;\n        default:\n            throw new EndpointError(`Unexpected endpoint property type: ${typeof property}`);\n    }\n};\nconst group$1 = {\n    getEndpointProperty,\n    getEndpointProperties,\n};\n\nconst getEndpointUrl = (endpointUrl, options) => {\n    const expression = evaluateExpression(endpointUrl, \"Endpoint URL\", options);\n    if (typeof expression === \"string\") {\n        try {\n            return new URL(expression);\n        }\n        catch (error) {\n            console.error(`Failed to construct URL with ${expression}`, error);\n            throw error;\n        }\n    }\n    throw new EndpointError(`Endpoint URL must be a string, got ${typeof expression}`);\n};\n\nconst RESULT = 100_000_000;\nconst decideEndpoint = (bdd, options) => {\n    const { nodes, root, results, conditions } = bdd;\n    let ref = root;\n    const referenceRecord = {};\n    const closure = {\n        referenceRecord,\n        endpointParams: options.endpointParams,\n        logger: options.logger,\n    };\n    while (ref !== 1 && ref !== -1 && ref < RESULT) {\n        const node_i = 3 * (Math.abs(ref) - 1);\n        const [condition_i, highRef, lowRef] = [nodes[node_i], nodes[node_i + 1], nodes[node_i + 2]];\n        const [fn, argv, assign] = conditions[condition_i];\n        const evaluation = evaluateCondition({ fn, assign, argv }, closure);\n        if (evaluation.toAssign) {\n            const { name, value } = evaluation.toAssign;\n            referenceRecord[name] = value;\n        }\n        ref = ref >= 0 === evaluation.result ? highRef : lowRef;\n    }\n    if (ref >= RESULT) {\n        const result = results[ref - RESULT];\n        if (result[0] === -1) {\n            const [, errorExpression] = result;\n            throw new EndpointError(evaluateExpression(errorExpression, \"Error\", closure));\n        }\n        const [url, properties, headers] = result;\n        return {\n            url: getEndpointUrl(url, closure),\n            properties: getEndpointProperties(properties, closure),\n            headers: getEndpointHeaders(headers ?? {}, closure),\n        };\n    }\n    throw new EndpointError(`No matching endpoint.`);\n};\n\nconst evaluateConditions = (conditions = [], options) => {\n    const conditionsReferenceRecord = {};\n    const conditionOptions = {\n        ...options,\n        referenceRecord: { ...options.referenceRecord },\n    };\n    let didAssign = false;\n    for (const condition of conditions) {\n        const { result, toAssign } = evaluateCondition(condition, conditionOptions);\n        if (!result) {\n            return { result };\n        }\n        if (toAssign) {\n            didAssign = true;\n            conditionsReferenceRecord[toAssign.name] = toAssign.value;\n            conditionOptions.referenceRecord[toAssign.name] = toAssign.value;\n            options.logger?.debug?.(`${debugId} assign: ${toAssign.name} := ${toDebugString(toAssign.value)}`);\n        }\n    }\n    if (didAssign) {\n        return { result: true, referenceRecord: conditionsReferenceRecord };\n    }\n    return { result: true };\n};\n\nconst evaluateEndpointRule = (endpointRule, options) => {\n    const { conditions, endpoint } = endpointRule;\n    const { result, referenceRecord } = evaluateConditions(conditions, options);\n    if (!result) {\n        return;\n    }\n    const endpointRuleOptions = referenceRecord\n        ? {\n            ...options,\n            referenceRecord: { ...options.referenceRecord, ...referenceRecord },\n        }\n        : options;\n    const { url, properties, headers } = endpoint;\n    options.logger?.debug?.(`${debugId} Resolving endpoint from template: ${toDebugString(endpoint)}`);\n    const endpointToReturn = { url: getEndpointUrl(url, endpointRuleOptions) };\n    if (headers != null) {\n        endpointToReturn.headers = getEndpointHeaders(headers, endpointRuleOptions);\n    }\n    if (properties != null) {\n        endpointToReturn.properties = getEndpointProperties(properties, endpointRuleOptions);\n    }\n    return endpointToReturn;\n};\n\nconst evaluateErrorRule = (errorRule, options) => {\n    const { conditions, error } = errorRule;\n    const { result, referenceRecord } = evaluateConditions(conditions, options);\n    if (!result) {\n        return;\n    }\n    const errorRuleOptions = referenceRecord\n        ? {\n            ...options,\n            referenceRecord: { ...options.referenceRecord, ...referenceRecord },\n        }\n        : options;\n    throw new EndpointError(evaluateExpression(error, \"Error\", errorRuleOptions));\n};\n\nconst evaluateRules = (rules, options) => {\n    for (const rule of rules) {\n        if (rule.type === \"endpoint\") {\n            const endpointOrUndefined = evaluateEndpointRule(rule, options);\n            if (endpointOrUndefined) {\n                return endpointOrUndefined;\n            }\n        }\n        else if (rule.type === \"error\") {\n            evaluateErrorRule(rule, options);\n        }\n        else if (rule.type === \"tree\") {\n            const endpointOrUndefined = group.evaluateTreeRule(rule, options);\n            if (endpointOrUndefined) {\n                return endpointOrUndefined;\n            }\n        }\n        else {\n            throw new EndpointError(`Unknown endpoint rule: ${rule}`);\n        }\n    }\n    throw new EndpointError(`Rules evaluation failed`);\n};\nconst evaluateTreeRule = (treeRule, options) => {\n    const { conditions, rules } = treeRule;\n    const { result, referenceRecord } = evaluateConditions(conditions, options);\n    if (!result) {\n        return;\n    }\n    const treeRuleOptions = referenceRecord\n        ? { ...options, referenceRecord: { ...options.referenceRecord, ...referenceRecord } }\n        : options;\n    return group.evaluateRules(rules, treeRuleOptions);\n};\nconst group = {\n    evaluateRules,\n    evaluateTreeRule,\n};\n\nconst resolveEndpoint = (ruleSetObject, options) => {\n    const { endpointParams, logger } = options;\n    const { parameters, rules } = ruleSetObject;\n    options.logger?.debug?.(`${debugId} Initial EndpointParams: ${toDebugString(endpointParams)}`);\n    for (const paramKey in parameters) {\n        const parameter = parameters[paramKey];\n        const endpointParam = endpointParams[paramKey];\n        if (endpointParam == null && parameter.default != null) {\n            endpointParams[paramKey] = parameter.default;\n            continue;\n        }\n        if (parameter.required && endpointParam == null) {\n            throw new EndpointError(`Missing required parameter: '${paramKey}'`);\n        }\n    }\n    const endpoint = evaluateRules(rules, { endpointParams, logger, referenceRecord: {} });\n    options.logger?.debug?.(`${debugId} Resolved endpoint: ${toDebugString(endpoint)}`);\n    return endpoint;\n};\n\nexports.BinaryDecisionDiagram = BinaryDecisionDiagram;\nexports.EndpointCache = EndpointCache;\nexports.EndpointError = EndpointError;\nexports.customEndpointFunctions = customEndpointFunctions;\nexports.decideEndpoint = decideEndpoint;\nexports.isIpAddress = isIpAddress;\nexports.isValidHostLabel = isValidHostLabel;\nexports.resolveEndpoint = resolveEndpoint;\n", "'use strict';\n\nvar utilEndpoints = require('@smithy/util-endpoints');\nvar urlParser = require('@smithy/url-parser');\n\nconst isVirtualHostableS3Bucket = (value, allowSubDomains = false) => {\n    if (allowSubDomains) {\n        for (const label of value.split(\".\")) {\n            if (!isVirtualHostableS3Bucket(label)) {\n                return false;\n            }\n        }\n        return true;\n    }\n    if (!utilEndpoints.isValidHostLabel(value)) {\n        return false;\n    }\n    if (value.length < 3 || value.length > 63) {\n        return false;\n    }\n    if (value !== value.toLowerCase()) {\n        return false;\n    }\n    if (utilEndpoints.isIpAddress(value)) {\n        return false;\n    }\n    return true;\n};\n\nconst ARN_DELIMITER = \":\";\nconst RESOURCE_DELIMITER = \"/\";\nconst parseArn = (value) => {\n    const segments = value.split(ARN_DELIMITER);\n    if (segments.length < 6)\n        return null;\n    const [arn, partition, service, region, accountId, ...resourcePath] = segments;\n    if (arn !== \"arn\" || partition === \"\" || service === \"\" || resourcePath.join(ARN_DELIMITER) === \"\")\n        return null;\n    const resourceId = resourcePath.map((resource) => resource.split(RESOURCE_DELIMITER)).flat();\n    return {\n        partition,\n        service,\n        region,\n        accountId,\n        resourceId,\n    };\n};\n\nvar partitions = [\n\t{\n\t\tid: \"aws\",\n\t\toutputs: {\n\t\t\tdnsSuffix: \"amazonaws.com\",\n\t\t\tdualStackDnsSuffix: \"api.aws\",\n\t\t\timplicitGlobalRegion: \"us-east-1\",\n\t\t\tname: \"aws\",\n\t\t\tsupportsDualStack: true,\n\t\t\tsupportsFIPS: true\n\t\t},\n\t\tregionRegex: \"^(us|eu|ap|sa|ca|me|af|il|mx)\\\\-\\\\w+\\\\-\\\\d+$\",\n\t\tregions: {\n\t\t\t\"af-south-1\": {\n\t\t\t\tdescription: \"Africa (Cape Town)\"\n\t\t\t},\n\t\t\t\"ap-east-1\": {\n\t\t\t\tdescription: \"Asia Pacific (Hong Kong)\"\n\t\t\t},\n\t\t\t\"ap-east-2\": {\n\t\t\t\tdescription: \"Asia Pacific (Taipei)\"\n\t\t\t},\n\t\t\t\"ap-northeast-1\": {\n\t\t\t\tdescription: \"Asia Pacific (Tokyo)\"\n\t\t\t},\n\t\t\t\"ap-northeast-2\": {\n\t\t\t\tdescription: \"Asia Pacific (Seoul)\"\n\t\t\t},\n\t\t\t\"ap-northeast-3\": {\n\t\t\t\tdescription: \"Asia Pacific (Osaka)\"\n\t\t\t},\n\t\t\t\"ap-south-1\": {\n\t\t\t\tdescription: \"Asia Pacific (Mumbai)\"\n\t\t\t},\n\t\t\t\"ap-south-2\": {\n\t\t\t\tdescription: \"Asia Pacific (Hyderabad)\"\n\t\t\t},\n\t\t\t\"ap-southeast-1\": {\n\t\t\t\tdescription: \"Asia Pacific (Singapore)\"\n\t\t\t},\n\t\t\t\"ap-southeast-2\": {\n\t\t\t\tdescription: \"Asia Pacific (Sydney)\"\n\t\t\t},\n\t\t\t\"ap-southeast-3\": {\n\t\t\t\tdescription: \"Asia Pacific (Jakarta)\"\n\t\t\t},\n\t\t\t\"ap-southeast-4\": {\n\t\t\t\tdescription: \"Asia Pacific (Melbourne)\"\n\t\t\t},\n\t\t\t\"ap-southeast-5\": {\n\t\t\t\tdescription: \"Asia Pacific (Malaysia)\"\n\t\t\t},\n\t\t\t\"ap-southeast-6\": {\n\t\t\t\tdescription: \"Asia Pacific (New Zealand)\"\n\t\t\t},\n\t\t\t\"ap-southeast-7\": {\n\t\t\t\tdescription: \"Asia Pacific (Thailand)\"\n\t\t\t},\n\t\t\t\"aws-global\": {\n\t\t\t\tdescription: \"aws global region\"\n\t\t\t},\n\t\t\t\"ca-central-1\": {\n\t\t\t\tdescription: \"Canada (Central)\"\n\t\t\t},\n\t\t\t\"ca-west-1\": {\n\t\t\t\tdescription: \"Canada West (Calgary)\"\n\t\t\t},\n\t\t\t\"eu-central-1\": {\n\t\t\t\tdescription: \"Europe (Frankfurt)\"\n\t\t\t},\n\t\t\t\"eu-central-2\": {\n\t\t\t\tdescription: \"Europe (Zurich)\"\n\t\t\t},\n\t\t\t\"eu-north-1\": {\n\t\t\t\tdescription: \"Europe (Stockholm)\"\n\t\t\t},\n\t\t\t\"eu-south-1\": {\n\t\t\t\tdescription: \"Europe (Milan)\"\n\t\t\t},\n\t\t\t\"eu-south-2\": {\n\t\t\t\tdescription: \"Europe (Spain)\"\n\t\t\t},\n\t\t\t\"eu-west-1\": {\n\t\t\t\tdescription: \"Europe (Ireland)\"\n\t\t\t},\n\t\t\t\"eu-west-2\": {\n\t\t\t\tdescription: \"Europe (London)\"\n\t\t\t},\n\t\t\t\"eu-west-3\": {\n\t\t\t\tdescription: \"Europe (Paris)\"\n\t\t\t},\n\t\t\t\"il-central-1\": {\n\t\t\t\tdescription: \"Israel (Tel Aviv)\"\n\t\t\t},\n\t\t\t\"me-central-1\": {\n\t\t\t\tdescription: \"Middle East (UAE)\"\n\t\t\t},\n\t\t\t\"me-south-1\": {\n\t\t\t\tdescription: \"Middle East (Bahrain)\"\n\t\t\t},\n\t\t\t\"mx-central-1\": {\n\t\t\t\tdescription: \"Mexico (Central)\"\n\t\t\t},\n\t\t\t\"sa-east-1\": {\n\t\t\t\tdescription: \"South America (Sao Paulo)\"\n\t\t\t},\n\t\t\t\"us-east-1\": {\n\t\t\t\tdescription: \"US East (N. Virginia)\"\n\t\t\t},\n\t\t\t\"us-east-2\": {\n\t\t\t\tdescription: \"US East (Ohio)\"\n\t\t\t},\n\t\t\t\"us-west-1\": {\n\t\t\t\tdescription: \"US West (N. California)\"\n\t\t\t},\n\t\t\t\"us-west-2\": {\n\t\t\t\tdescription: \"US West (Oregon)\"\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\tid: \"aws-cn\",\n\t\toutputs: {\n\t\t\tdnsSuffix: \"amazonaws.com.cn\",\n\t\t\tdualStackDnsSuffix: \"api.amazonwebservices.com.cn\",\n\t\t\timplicitGlobalRegion: \"cn-northwest-1\",\n\t\t\tname: \"aws-cn\",\n\t\t\tsupportsDualStack: true,\n\t\t\tsupportsFIPS: true\n\t\t},\n\t\tregionRegex: \"^cn\\\\-\\\\w+\\\\-\\\\d+$\",\n\t\tregions: {\n\t\t\t\"aws-cn-global\": {\n\t\t\t\tdescription: \"aws-cn global region\"\n\t\t\t},\n\t\t\t\"cn-north-1\": {\n\t\t\t\tdescription: \"China (Beijing)\"\n\t\t\t},\n\t\t\t\"cn-northwest-1\": {\n\t\t\t\tdescription: \"China (Ningxia)\"\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\tid: \"aws-eusc\",\n\t\toutputs: {\n\t\t\tdnsSuffix: \"amazonaws.eu\",\n\t\t\tdualStackDnsSuffix: \"api.amazonwebservices.eu\",\n\t\t\timplicitGlobalRegion: \"eusc-de-east-1\",\n\t\t\tname: \"aws-eusc\",\n\t\t\tsupportsDualStack: true,\n\t\t\tsupportsFIPS: true\n\t\t},\n\t\tregionRegex: \"^eusc\\\\-(de)\\\\-\\\\w+\\\\-\\\\d+$\",\n\t\tregions: {\n\t\t\t\"eusc-de-east-1\": {\n\t\t\t\tdescription: \"AWS European Sovereign Cloud (Germany)\"\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\tid: \"aws-iso\",\n\t\toutputs: {\n\t\t\tdnsSuffix: \"c2s.ic.gov\",\n\t\t\tdualStackDnsSuffix: \"api.aws.ic.gov\",\n\t\t\timplicitGlobalRegion: \"us-iso-east-1\",\n\t\t\tname: \"aws-iso\",\n\t\t\tsupportsDualStack: true,\n\t\t\tsupportsFIPS: true\n\t\t},\n\t\tregionRegex: \"^us\\\\-iso\\\\-\\\\w+\\\\-\\\\d+$\",\n\t\tregions: {\n\t\t\t\"aws-iso-global\": {\n\t\t\t\tdescription: \"aws-iso global region\"\n\t\t\t},\n\t\t\t\"us-iso-east-1\": {\n\t\t\t\tdescription: \"US ISO East\"\n\t\t\t},\n\t\t\t\"us-iso-west-1\": {\n\t\t\t\tdescription: \"US ISO WEST\"\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\tid: \"aws-iso-b\",\n\t\toutputs: {\n\t\t\tdnsSuffix: \"sc2s.sgov.gov\",\n\t\t\tdualStackDnsSuffix: \"api.aws.scloud\",\n\t\t\timplicitGlobalRegion: \"us-isob-east-1\",\n\t\t\tname: \"aws-iso-b\",\n\t\t\tsupportsDualStack: true,\n\t\t\tsupportsFIPS: true\n\t\t},\n\t\tregionRegex: \"^us\\\\-isob\\\\-\\\\w+\\\\-\\\\d+$\",\n\t\tregions: {\n\t\t\t\"aws-iso-b-global\": {\n\t\t\t\tdescription: \"aws-iso-b global region\"\n\t\t\t},\n\t\t\t\"us-isob-east-1\": {\n\t\t\t\tdescription: \"US ISOB East (Ohio)\"\n\t\t\t},\n\t\t\t\"us-isob-west-1\": {\n\t\t\t\tdescription: \"US ISOB West\"\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\tid: \"aws-iso-e\",\n\t\toutputs: {\n\t\t\tdnsSuffix: \"cloud.adc-e.uk\",\n\t\t\tdualStackDnsSuffix: \"api.cloud-aws.adc-e.uk\",\n\t\t\timplicitGlobalRegion: \"eu-isoe-west-1\",\n\t\t\tname: \"aws-iso-e\",\n\t\t\tsupportsDualStack: true,\n\t\t\tsupportsFIPS: true\n\t\t},\n\t\tregionRegex: \"^eu\\\\-isoe\\\\-\\\\w+\\\\-\\\\d+$\",\n\t\tregions: {\n\t\t\t\"aws-iso-e-global\": {\n\t\t\t\tdescription: \"aws-iso-e global region\"\n\t\t\t},\n\t\t\t\"eu-isoe-west-1\": {\n\t\t\t\tdescription: \"EU ISOE West\"\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\tid: \"aws-iso-f\",\n\t\toutputs: {\n\t\t\tdnsSuffix: \"csp.hci.ic.gov\",\n\t\t\tdualStackDnsSuffix: \"api.aws.hci.ic.gov\",\n\t\t\timplicitGlobalRegion: \"us-isof-south-1\",\n\t\t\tname: \"aws-iso-f\",\n\t\t\tsupportsDualStack: true,\n\t\t\tsupportsFIPS: true\n\t\t},\n\t\tregionRegex: \"^us\\\\-isof\\\\-\\\\w+\\\\-\\\\d+$\",\n\t\tregions: {\n\t\t\t\"aws-iso-f-global\": {\n\t\t\t\tdescription: \"aws-iso-f global region\"\n\t\t\t},\n\t\t\t\"us-isof-east-1\": {\n\t\t\t\tdescription: \"US ISOF EAST\"\n\t\t\t},\n\t\t\t\"us-isof-south-1\": {\n\t\t\t\tdescription: \"US ISOF SOUTH\"\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\tid: \"aws-us-gov\",\n\t\toutputs: {\n\t\t\tdnsSuffix: \"amazonaws.com\",\n\t\t\tdualStackDnsSuffix: \"api.aws\",\n\t\t\timplicitGlobalRegion: \"us-gov-west-1\",\n\t\t\tname: \"aws-us-gov\",\n\t\t\tsupportsDualStack: true,\n\t\t\tsupportsFIPS: true\n\t\t},\n\t\tregionRegex: \"^us\\\\-gov\\\\-\\\\w+\\\\-\\\\d+$\",\n\t\tregions: {\n\t\t\t\"aws-us-gov-global\": {\n\t\t\t\tdescription: \"aws-us-gov global region\"\n\t\t\t},\n\t\t\t\"us-gov-east-1\": {\n\t\t\t\tdescription: \"AWS GovCloud (US-East)\"\n\t\t\t},\n\t\t\t\"us-gov-west-1\": {\n\t\t\t\tdescription: \"AWS GovCloud (US-West)\"\n\t\t\t}\n\t\t}\n\t}\n];\nvar version = \"1.1\";\nvar partitionsInfo = {\n\tpartitions: partitions,\n\tversion: version\n};\n\nlet selectedPartitionsInfo = partitionsInfo;\nlet selectedUserAgentPrefix = \"\";\nconst partition = (value) => {\n    const { partitions } = selectedPartitionsInfo;\n    for (const partition of partitions) {\n        const { regions, outputs } = partition;\n        for (const [region, regionData] of Object.entries(regions)) {\n            if (region === value) {\n                return {\n                    ...outputs,\n                    ...regionData,\n                };\n            }\n        }\n    }\n    for (const partition of partitions) {\n        const { regionRegex, outputs } = partition;\n        if (new RegExp(regionRegex).test(value)) {\n            return {\n                ...outputs,\n            };\n        }\n    }\n    const DEFAULT_PARTITION = partitions.find((partition) => partition.id === \"aws\");\n    if (!DEFAULT_PARTITION) {\n        throw new Error(\"Provided region was not found in the partition array or regex,\" +\n            \" and default partition with id 'aws' doesn't exist.\");\n    }\n    return {\n        ...DEFAULT_PARTITION.outputs,\n    };\n};\nconst setPartitionInfo = (partitionsInfo, userAgentPrefix = \"\") => {\n    selectedPartitionsInfo = partitionsInfo;\n    selectedUserAgentPrefix = userAgentPrefix;\n};\nconst useDefaultPartitionInfo = () => {\n    setPartitionInfo(partitionsInfo, \"\");\n};\nconst getUserAgentPrefix = () => selectedUserAgentPrefix;\n\nconst awsEndpointFunctions = {\n    isVirtualHostableS3Bucket: isVirtualHostableS3Bucket,\n    parseArn: parseArn,\n    partition: partition,\n};\nutilEndpoints.customEndpointFunctions.aws = awsEndpointFunctions;\n\nconst resolveDefaultAwsRegionalEndpointsConfig = (input) => {\n    if (typeof input.endpointProvider !== \"function\") {\n        throw new Error(\"@aws-sdk/util-endpoint - endpointProvider and endpoint missing in config for this client.\");\n    }\n    const { endpoint } = input;\n    if (endpoint === undefined) {\n        input.endpoint = async () => {\n            return toEndpointV1(input.endpointProvider({\n                Region: typeof input.region === \"function\" ? await input.region() : input.region,\n                UseDualStack: typeof input.useDualstackEndpoint === \"function\"\n                    ? await input.useDualstackEndpoint()\n                    : input.useDualstackEndpoint,\n                UseFIPS: typeof input.useFipsEndpoint === \"function\" ? await input.useFipsEndpoint() : input.useFipsEndpoint,\n                Endpoint: undefined,\n            }, { logger: input.logger }));\n        };\n    }\n    return input;\n};\nconst toEndpointV1 = (endpoint) => urlParser.parseUrl(endpoint.url);\n\nexports.EndpointError = utilEndpoints.EndpointError;\nexports.isIpAddress = utilEndpoints.isIpAddress;\nexports.resolveEndpoint = utilEndpoints.resolveEndpoint;\nexports.awsEndpointFunctions = awsEndpointFunctions;\nexports.getUserAgentPrefix = getUserAgentPrefix;\nexports.partition = partition;\nexports.resolveDefaultAwsRegionalEndpointsConfig = resolveDefaultAwsRegionalEndpointsConfig;\nexports.setPartitionInfo = setPartitionInfo;\nexports.toEndpointV1 = toEndpointV1;\nexports.useDefaultPartitionInfo = useDefaultPartitionInfo;\n", "'use strict';\n\nvar core = require('@smithy/core');\nvar utilEndpoints = require('@aws-sdk/util-endpoints');\nvar protocolHttp = require('@smithy/protocol-http');\nvar client = require('@aws-sdk/core/client');\nvar utilRetry = require('@smithy/util-retry');\n\nconst DEFAULT_UA_APP_ID = undefined;\nfunction isValidUserAgentAppId(appId) {\n    if (appId === undefined) {\n        return true;\n    }\n    return typeof appId === \"string\" && appId.length <= 50;\n}\nfunction resolveUserAgentConfig(input) {\n    const normalizedAppIdProvider = core.normalizeProvider(input.userAgentAppId ?? DEFAULT_UA_APP_ID);\n    const { customUserAgent } = input;\n    return Object.assign(input, {\n        customUserAgent: typeof customUserAgent === \"string\" ? [[customUserAgent]] : customUserAgent,\n        userAgentAppId: async () => {\n            const appId = await normalizedAppIdProvider();\n            if (!isValidUserAgentAppId(appId)) {\n                const logger = input.logger?.constructor?.name === \"NoOpLogger\" || !input.logger ? console : input.logger;\n                if (typeof appId !== \"string\") {\n                    logger?.warn(\"userAgentAppId must be a string or undefined.\");\n                }\n                else if (appId.length > 50) {\n                    logger?.warn(\"The provided userAgentAppId exceeds the maximum length of 50 characters.\");\n                }\n            }\n            return appId;\n        },\n    });\n}\n\nconst ACCOUNT_ID_ENDPOINT_REGEX = /\\d{12}\\.ddb/;\nasync function checkFeatures(context, config, args) {\n    const request = args.request;\n    if (request?.headers?.[\"smithy-protocol\"] === \"rpc-v2-cbor\") {\n        client.setFeature(context, \"PROTOCOL_RPC_V2_CBOR\", \"M\");\n    }\n    if (typeof config.retryStrategy === \"function\") {\n        const retryStrategy = await config.retryStrategy();\n        if (typeof retryStrategy.mode === \"string\") {\n            switch (retryStrategy.mode) {\n                case utilRetry.RETRY_MODES.ADAPTIVE:\n                    client.setFeature(context, \"RETRY_MODE_ADAPTIVE\", \"F\");\n                    break;\n                case utilRetry.RETRY_MODES.STANDARD:\n                    client.setFeature(context, \"RETRY_MODE_STANDARD\", \"E\");\n                    break;\n            }\n        }\n    }\n    if (typeof config.accountIdEndpointMode === \"function\") {\n        const endpointV2 = context.endpointV2;\n        if (String(endpointV2?.url?.hostname).match(ACCOUNT_ID_ENDPOINT_REGEX)) {\n            client.setFeature(context, \"ACCOUNT_ID_ENDPOINT\", \"O\");\n        }\n        switch (await config.accountIdEndpointMode?.()) {\n            case \"disabled\":\n                client.setFeature(context, \"ACCOUNT_ID_MODE_DISABLED\", \"Q\");\n                break;\n            case \"preferred\":\n                client.setFeature(context, \"ACCOUNT_ID_MODE_PREFERRED\", \"P\");\n                break;\n            case \"required\":\n                client.setFeature(context, \"ACCOUNT_ID_MODE_REQUIRED\", \"R\");\n                break;\n        }\n    }\n    const identity = context.__smithy_context?.selectedHttpAuthScheme?.identity;\n    if (identity?.$source) {\n        const credentials = identity;\n        if (credentials.accountId) {\n            client.setFeature(context, \"RESOLVED_ACCOUNT_ID\", \"T\");\n        }\n        for (const [key, value] of Object.entries(credentials.$source ?? {})) {\n            client.setFeature(context, key, value);\n        }\n    }\n}\n\nconst USER_AGENT = \"user-agent\";\nconst X_AMZ_USER_AGENT = \"x-amz-user-agent\";\nconst SPACE = \" \";\nconst UA_NAME_SEPARATOR = \"/\";\nconst UA_NAME_ESCAPE_REGEX = /[^!$%&'*+\\-.^_`|~\\w]/g;\nconst UA_VALUE_ESCAPE_REGEX = /[^!$%&'*+\\-.^_`|~\\w#]/g;\nconst UA_ESCAPE_CHAR = \"-\";\n\nconst BYTE_LIMIT = 1024;\nfunction encodeFeatures(features) {\n    let buffer = \"\";\n    for (const key in features) {\n        const val = features[key];\n        if (buffer.length + val.length + 1 <= BYTE_LIMIT) {\n            if (buffer.length) {\n                buffer += \",\" + val;\n            }\n            else {\n                buffer += val;\n            }\n            continue;\n        }\n        break;\n    }\n    return buffer;\n}\n\nconst userAgentMiddleware = (options) => (next, context) => async (args) => {\n    const { request } = args;\n    if (!protocolHttp.HttpRequest.isInstance(request)) {\n        return next(args);\n    }\n    const { headers } = request;\n    const userAgent = context?.userAgent?.map(escapeUserAgent) || [];\n    const defaultUserAgent = (await options.defaultUserAgentProvider()).map(escapeUserAgent);\n    await checkFeatures(context, options, args);\n    const awsContext = context;\n    defaultUserAgent.push(`m/${encodeFeatures(Object.assign({}, context.__smithy_context?.features, awsContext.__aws_sdk_context?.features))}`);\n    const customUserAgent = options?.customUserAgent?.map(escapeUserAgent) || [];\n    const appId = await options.userAgentAppId();\n    if (appId) {\n        defaultUserAgent.push(escapeUserAgent([`app`, `${appId}`]));\n    }\n    const prefix = utilEndpoints.getUserAgentPrefix();\n    const sdkUserAgentValue = (prefix ? [prefix] : [])\n        .concat([...defaultUserAgent, ...userAgent, ...customUserAgent])\n        .join(SPACE);\n    const normalUAValue = [\n        ...defaultUserAgent.filter((section) => section.startsWith(\"aws-sdk-\")),\n        ...customUserAgent,\n    ].join(SPACE);\n    if (options.runtime !== \"browser\") {\n        if (normalUAValue) {\n            headers[X_AMZ_USER_AGENT] = headers[X_AMZ_USER_AGENT]\n                ? `${headers[USER_AGENT]} ${normalUAValue}`\n                : normalUAValue;\n        }\n        headers[USER_AGENT] = sdkUserAgentValue;\n    }\n    else {\n        headers[X_AMZ_USER_AGENT] = sdkUserAgentValue;\n    }\n    return next({\n        ...args,\n        request,\n    });\n};\nconst escapeUserAgent = (userAgentPair) => {\n    const name = userAgentPair[0]\n        .split(UA_NAME_SEPARATOR)\n        .map((part) => part.replace(UA_NAME_ESCAPE_REGEX, UA_ESCAPE_CHAR))\n        .join(UA_NAME_SEPARATOR);\n    const version = userAgentPair[1]?.replace(UA_VALUE_ESCAPE_REGEX, UA_ESCAPE_CHAR);\n    const prefixSeparatorIndex = name.indexOf(UA_NAME_SEPARATOR);\n    const prefix = name.substring(0, prefixSeparatorIndex);\n    let uaName = name.substring(prefixSeparatorIndex + 1);\n    if (prefix === \"api\") {\n        uaName = uaName.toLowerCase();\n    }\n    return [prefix, uaName, version]\n        .filter((item) => item && item.length > 0)\n        .reduce((acc, item, index) => {\n        switch (index) {\n            case 0:\n                return item;\n            case 1:\n                return `${acc}/${item}`;\n            default:\n                return `${acc}#${item}`;\n        }\n    }, \"\");\n};\nconst getUserAgentMiddlewareOptions = {\n    name: \"getUserAgentMiddleware\",\n    step: \"build\",\n    priority: \"low\",\n    tags: [\"SET_USER_AGENT\", \"USER_AGENT\"],\n    override: true,\n};\nconst getUserAgentPlugin = (config) => ({\n    applyToStack: (clientStack) => {\n        clientStack.add(userAgentMiddleware(config), getUserAgentMiddlewareOptions);\n    },\n});\n\nexports.DEFAULT_UA_APP_ID = DEFAULT_UA_APP_ID;\nexports.getUserAgentMiddlewareOptions = getUserAgentMiddlewareOptions;\nexports.getUserAgentPlugin = getUserAgentPlugin;\nexports.resolveUserAgentConfig = resolveUserAgentConfig;\nexports.userAgentMiddleware = userAgentMiddleware;\n", "'use strict';\n\nconst booleanSelector = (obj, key, type) => {\n    if (!(key in obj))\n        return undefined;\n    if (obj[key] === \"true\")\n        return true;\n    if (obj[key] === \"false\")\n        return false;\n    throw new Error(`Cannot load ${type} \"${key}\". Expected \"true\" or \"false\", got ${obj[key]}.`);\n};\n\nconst numberSelector = (obj, key, type) => {\n    if (!(key in obj))\n        return undefined;\n    const numberValue = parseInt(obj[key], 10);\n    if (Number.isNaN(numberValue)) {\n        throw new TypeError(`Cannot load ${type} '${key}'. Expected number, got '${obj[key]}'.`);\n    }\n    return numberValue;\n};\n\nexports.SelectorType = void 0;\n(function (SelectorType) {\n    SelectorType[\"ENV\"] = \"env\";\n    SelectorType[\"CONFIG\"] = \"shared config entry\";\n})(exports.SelectorType || (exports.SelectorType = {}));\n\nexports.booleanSelector = booleanSelector;\nexports.numberSelector = numberSelector;\n", "'use strict';\n\nvar utilConfigProvider = require('@smithy/util-config-provider');\nvar utilMiddleware = require('@smithy/util-middleware');\nvar utilEndpoints = require('@smithy/util-endpoints');\n\nconst ENV_USE_DUALSTACK_ENDPOINT = \"AWS_USE_DUALSTACK_ENDPOINT\";\nconst CONFIG_USE_DUALSTACK_ENDPOINT = \"use_dualstack_endpoint\";\nconst DEFAULT_USE_DUALSTACK_ENDPOINT = false;\nconst NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS = {\n    environmentVariableSelector: (env) => utilConfigProvider.booleanSelector(env, ENV_USE_DUALSTACK_ENDPOINT, utilConfigProvider.SelectorType.ENV),\n    configFileSelector: (profile) => utilConfigProvider.booleanSelector(profile, CONFIG_USE_DUALSTACK_ENDPOINT, utilConfigProvider.SelectorType.CONFIG),\n    default: false,\n};\nconst nodeDualstackConfigSelectors = {\n    environmentVariableSelector: (env) => utilConfigProvider.booleanSelector(env, ENV_USE_DUALSTACK_ENDPOINT, utilConfigProvider.SelectorType.ENV),\n    configFileSelector: (profile) => utilConfigProvider.booleanSelector(profile, CONFIG_USE_DUALSTACK_ENDPOINT, utilConfigProvider.SelectorType.CONFIG),\n    default: undefined,\n};\n\nconst ENV_USE_FIPS_ENDPOINT = \"AWS_USE_FIPS_ENDPOINT\";\nconst CONFIG_USE_FIPS_ENDPOINT = \"use_fips_endpoint\";\nconst DEFAULT_USE_FIPS_ENDPOINT = false;\nconst NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS = {\n    environmentVariableSelector: (env) => utilConfigProvider.booleanSelector(env, ENV_USE_FIPS_ENDPOINT, utilConfigProvider.SelectorType.ENV),\n    configFileSelector: (profile) => utilConfigProvider.booleanSelector(profile, CONFIG_USE_FIPS_ENDPOINT, utilConfigProvider.SelectorType.CONFIG),\n    default: false,\n};\nconst nodeFipsConfigSelectors = {\n    environmentVariableSelector: (env) => utilConfigProvider.booleanSelector(env, ENV_USE_FIPS_ENDPOINT, utilConfigProvider.SelectorType.ENV),\n    configFileSelector: (profile) => utilConfigProvider.booleanSelector(profile, CONFIG_USE_FIPS_ENDPOINT, utilConfigProvider.SelectorType.CONFIG),\n    default: undefined,\n};\n\nconst resolveCustomEndpointsConfig = (input) => {\n    const { tls, endpoint, urlParser, useDualstackEndpoint } = input;\n    return Object.assign(input, {\n        tls: tls ?? true,\n        endpoint: utilMiddleware.normalizeProvider(typeof endpoint === \"string\" ? urlParser(endpoint) : endpoint),\n        isCustomEndpoint: true,\n        useDualstackEndpoint: utilMiddleware.normalizeProvider(useDualstackEndpoint ?? false),\n    });\n};\n\nconst getEndpointFromRegion = async (input) => {\n    const { tls = true } = input;\n    const region = await input.region();\n    const dnsHostRegex = new RegExp(/^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])$/);\n    if (!dnsHostRegex.test(region)) {\n        throw new Error(\"Invalid region in client config\");\n    }\n    const useDualstackEndpoint = await input.useDualstackEndpoint();\n    const useFipsEndpoint = await input.useFipsEndpoint();\n    const { hostname } = (await input.regionInfoProvider(region, { useDualstackEndpoint, useFipsEndpoint })) ?? {};\n    if (!hostname) {\n        throw new Error(\"Cannot resolve hostname from client config\");\n    }\n    return input.urlParser(`${tls ? \"https:\" : \"http:\"}//${hostname}`);\n};\n\nconst resolveEndpointsConfig = (input) => {\n    const useDualstackEndpoint = utilMiddleware.normalizeProvider(input.useDualstackEndpoint ?? false);\n    const { endpoint, useFipsEndpoint, urlParser, tls } = input;\n    return Object.assign(input, {\n        tls: tls ?? true,\n        endpoint: endpoint\n            ? utilMiddleware.normalizeProvider(typeof endpoint === \"string\" ? urlParser(endpoint) : endpoint)\n            : () => getEndpointFromRegion({ ...input, useDualstackEndpoint, useFipsEndpoint }),\n        isCustomEndpoint: !!endpoint,\n        useDualstackEndpoint,\n    });\n};\n\nconst REGION_ENV_NAME = \"AWS_REGION\";\nconst REGION_INI_NAME = \"region\";\nconst NODE_REGION_CONFIG_OPTIONS = {\n    environmentVariableSelector: (env) => env[REGION_ENV_NAME],\n    configFileSelector: (profile) => profile[REGION_INI_NAME],\n    default: () => {\n        throw new Error(\"Region is missing\");\n    },\n};\nconst NODE_REGION_CONFIG_FILE_OPTIONS = {\n    preferredFile: \"credentials\",\n};\n\nconst validRegions = new Set();\nconst checkRegion = (region, check = utilEndpoints.isValidHostLabel) => {\n    if (!validRegions.has(region) && !check(region)) {\n        if (region === \"*\") {\n            console.warn(`@smithy/config-resolver WARN - Please use the caller region instead of \"*\". See \"sigv4a\" in https://github.com/aws/aws-sdk-js-v3/blob/main/supplemental-docs/CLIENTS.md.`);\n        }\n        else {\n            throw new Error(`Region not accepted: region=\"${region}\" is not a valid hostname component.`);\n        }\n    }\n    else {\n        validRegions.add(region);\n    }\n};\n\nconst isFipsRegion = (region) => typeof region === \"string\" && (region.startsWith(\"fips-\") || region.endsWith(\"-fips\"));\n\nconst getRealRegion = (region) => isFipsRegion(region)\n    ? [\"fips-aws-global\", \"aws-fips\"].includes(region)\n        ? \"us-east-1\"\n        : region.replace(/fips-(dkr-|prod-)?|-fips/, \"\")\n    : region;\n\nconst resolveRegionConfig = (input) => {\n    const { region, useFipsEndpoint } = input;\n    if (!region) {\n        throw new Error(\"Region is missing\");\n    }\n    return Object.assign(input, {\n        region: async () => {\n            const providedRegion = typeof region === \"function\" ? await region() : region;\n            const realRegion = getRealRegion(providedRegion);\n            checkRegion(realRegion);\n            return realRegion;\n        },\n        useFipsEndpoint: async () => {\n            const providedRegion = typeof region === \"string\" ? region : await region();\n            if (isFipsRegion(providedRegion)) {\n                return true;\n            }\n            return typeof useFipsEndpoint !== \"function\" ? Promise.resolve(!!useFipsEndpoint) : useFipsEndpoint();\n        },\n    });\n};\n\nconst getHostnameFromVariants = (variants = [], { useFipsEndpoint, useDualstackEndpoint }) => variants.find(({ tags }) => useFipsEndpoint === tags.includes(\"fips\") && useDualstackEndpoint === tags.includes(\"dualstack\"))?.hostname;\n\nconst getResolvedHostname = (resolvedRegion, { regionHostname, partitionHostname }) => regionHostname\n    ? regionHostname\n    : partitionHostname\n        ? partitionHostname.replace(\"{region}\", resolvedRegion)\n        : undefined;\n\nconst getResolvedPartition = (region, { partitionHash }) => Object.keys(partitionHash || {}).find((key) => partitionHash[key].regions.includes(region)) ?? \"aws\";\n\nconst getResolvedSigningRegion = (hostname, { signingRegion, regionRegex, useFipsEndpoint }) => {\n    if (signingRegion) {\n        return signingRegion;\n    }\n    else if (useFipsEndpoint) {\n        const regionRegexJs = regionRegex.replace(\"\\\\\\\\\", \"\\\\\").replace(/^\\^/g, \"\\\\.\").replace(/\\$$/g, \"\\\\.\");\n        const regionRegexmatchArray = hostname.match(regionRegexJs);\n        if (regionRegexmatchArray) {\n            return regionRegexmatchArray[0].slice(1, -1);\n        }\n    }\n};\n\nconst getRegionInfo = (region, { useFipsEndpoint = false, useDualstackEndpoint = false, signingService, regionHash, partitionHash, }) => {\n    const partition = getResolvedPartition(region, { partitionHash });\n    const resolvedRegion = region in regionHash ? region : partitionHash[partition]?.endpoint ?? region;\n    const hostnameOptions = { useFipsEndpoint, useDualstackEndpoint };\n    const regionHostname = getHostnameFromVariants(regionHash[resolvedRegion]?.variants, hostnameOptions);\n    const partitionHostname = getHostnameFromVariants(partitionHash[partition]?.variants, hostnameOptions);\n    const hostname = getResolvedHostname(resolvedRegion, { regionHostname, partitionHostname });\n    if (hostname === undefined) {\n        throw new Error(`Endpoint resolution failed for: ${{ resolvedRegion, useFipsEndpoint, useDualstackEndpoint }}`);\n    }\n    const signingRegion = getResolvedSigningRegion(hostname, {\n        signingRegion: regionHash[resolvedRegion]?.signingRegion,\n        regionRegex: partitionHash[partition].regionRegex,\n        useFipsEndpoint,\n    });\n    return {\n        partition,\n        signingService,\n        hostname,\n        ...(signingRegion && { signingRegion }),\n        ...(regionHash[resolvedRegion]?.signingService && {\n            signingService: regionHash[resolvedRegion].signingService,\n        }),\n    };\n};\n\nexports.CONFIG_USE_DUALSTACK_ENDPOINT = CONFIG_USE_DUALSTACK_ENDPOINT;\nexports.CONFIG_USE_FIPS_ENDPOINT = CONFIG_USE_FIPS_ENDPOINT;\nexports.DEFAULT_USE_DUALSTACK_ENDPOINT = DEFAULT_USE_DUALSTACK_ENDPOINT;\nexports.DEFAULT_USE_FIPS_ENDPOINT = DEFAULT_USE_FIPS_ENDPOINT;\nexports.ENV_USE_DUALSTACK_ENDPOINT = ENV_USE_DUALSTACK_ENDPOINT;\nexports.ENV_USE_FIPS_ENDPOINT = ENV_USE_FIPS_ENDPOINT;\nexports.NODE_REGION_CONFIG_FILE_OPTIONS = NODE_REGION_CONFIG_FILE_OPTIONS;\nexports.NODE_REGION_CONFIG_OPTIONS = NODE_REGION_CONFIG_OPTIONS;\nexports.NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS = NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS;\nexports.NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS = NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS;\nexports.REGION_ENV_NAME = REGION_ENV_NAME;\nexports.REGION_INI_NAME = REGION_INI_NAME;\nexports.getRegionInfo = getRegionInfo;\nexports.nodeDualstackConfigSelectors = nodeDualstackConfigSelectors;\nexports.nodeFipsConfigSelectors = nodeFipsConfigSelectors;\nexports.resolveCustomEndpointsConfig = resolveCustomEndpointsConfig;\nexports.resolveEndpointsConfig = resolveEndpointsConfig;\nexports.resolveRegionConfig = resolveRegionConfig;\n", "'use strict';\n\nvar protocolHttp = require('@smithy/protocol-http');\n\nconst CONTENT_LENGTH_HEADER = \"content-length\";\nfunction contentLengthMiddleware(bodyLengthChecker) {\n    return (next) => async (args) => {\n        const request = args.request;\n        if (protocolHttp.HttpRequest.isInstance(request)) {\n            const { body, headers } = request;\n            if (body &&\n                Object.keys(headers)\n                    .map((str) => str.toLowerCase())\n                    .indexOf(CONTENT_LENGTH_HEADER) === -1) {\n                try {\n                    const length = bodyLengthChecker(body);\n                    request.headers = {\n                        ...request.headers,\n                        [CONTENT_LENGTH_HEADER]: String(length),\n                    };\n                }\n                catch (error) {\n                }\n            }\n        }\n        return next({\n            ...args,\n            request,\n        });\n    };\n}\nconst contentLengthMiddlewareOptions = {\n    step: \"build\",\n    tags: [\"SET_CONTENT_LENGTH\", \"CONTENT_LENGTH\"],\n    name: \"contentLengthMiddleware\",\n    override: true,\n};\nconst getContentLengthPlugin = (options) => ({\n    applyToStack: (clientStack) => {\n        clientStack.add(contentLengthMiddleware(options.bodyLengthChecker), contentLengthMiddlewareOptions);\n    },\n});\n\nexports.contentLengthMiddleware = contentLengthMiddleware;\nexports.contentLengthMiddlewareOptions = contentLengthMiddlewareOptions;\nexports.getContentLengthPlugin = getContentLengthPlugin;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getEndpointUrlConfig = void 0;\nconst shared_ini_file_loader_1 = require(\"@smithy/shared-ini-file-loader\");\nconst ENV_ENDPOINT_URL = \"AWS_ENDPOINT_URL\";\nconst CONFIG_ENDPOINT_URL = \"endpoint_url\";\nconst getEndpointUrlConfig = (serviceId) => ({\n    environmentVariableSelector: (env) => {\n        const serviceSuffixParts = serviceId.split(\" \").map((w) => w.toUpperCase());\n        const serviceEndpointUrl = env[[ENV_ENDPOINT_URL, ...serviceSuffixParts].join(\"_\")];\n        if (serviceEndpointUrl)\n            return serviceEndpointUrl;\n        const endpointUrl = env[ENV_ENDPOINT_URL];\n        if (endpointUrl)\n            return endpointUrl;\n        return undefined;\n    },\n    configFileSelector: (profile, config) => {\n        if (config && profile.services) {\n            const servicesSection = config[[\"services\", profile.services].join(shared_ini_file_loader_1.CONFIG_PREFIX_SEPARATOR)];\n            if (servicesSection) {\n                const servicePrefixParts = serviceId.split(\" \").map((w) => w.toLowerCase());\n                const endpointUrl = servicesSection[[servicePrefixParts.join(\"_\"), CONFIG_ENDPOINT_URL].join(shared_ini_file_loader_1.CONFIG_PREFIX_SEPARATOR)];\n                if (endpointUrl)\n                    return endpointUrl;\n            }\n        }\n        const endpointUrl = profile[CONFIG_ENDPOINT_URL];\n        if (endpointUrl)\n            return endpointUrl;\n        return undefined;\n    },\n    default: undefined,\n});\nexports.getEndpointUrlConfig = getEndpointUrlConfig;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getEndpointFromConfig = void 0;\nconst node_config_provider_1 = require(\"@smithy/node-config-provider\");\nconst getEndpointUrlConfig_1 = require(\"./getEndpointUrlConfig\");\nconst getEndpointFromConfig = async (serviceId) => (0, node_config_provider_1.loadConfig)((0, getEndpointUrlConfig_1.getEndpointUrlConfig)(serviceId ?? \"\"))();\nexports.getEndpointFromConfig = getEndpointFromConfig;\n", "'use strict';\n\nvar protocolHttp = require('@smithy/protocol-http');\nvar endpoints = require('@smithy/core/endpoints');\n\nconst deserializerMiddleware = (options, deserializer) => (next, context) => async (args) => {\n    const { response } = await next(args);\n    try {\n        const parsed = await deserializer(response, options);\n        return {\n            response,\n            output: parsed,\n        };\n    }\n    catch (error) {\n        Object.defineProperty(error, \"$response\", {\n            value: response,\n            enumerable: false,\n            writable: false,\n            configurable: false,\n        });\n        if (!(\"$metadata\" in error)) {\n            const hint = `Deserialization error: to see the raw response, inspect the hidden field {error}.$response on this object.`;\n            try {\n                error.message += \"\\n  \" + hint;\n            }\n            catch (e) {\n                if (!context.logger || context.logger?.constructor?.name === \"NoOpLogger\") {\n                    console.warn(hint);\n                }\n                else {\n                    context.logger?.warn?.(hint);\n                }\n            }\n            if (typeof error.$responseBodyText !== \"undefined\") {\n                if (error.$response) {\n                    error.$response.body = error.$responseBodyText;\n                }\n            }\n            try {\n                if (protocolHttp.HttpResponse.isInstance(response)) {\n                    const { headers = {} } = response;\n                    const headerEntries = Object.entries(headers);\n                    error.$metadata = {\n                        httpStatusCode: response.statusCode,\n                        requestId: findHeader(/^x-[\\w-]+-request-?id$/, headerEntries),\n                        extendedRequestId: findHeader(/^x-[\\w-]+-id-2$/, headerEntries),\n                        cfId: findHeader(/^x-[\\w-]+-cf-id$/, headerEntries),\n                    };\n                }\n            }\n            catch (e) {\n            }\n        }\n        throw error;\n    }\n};\nconst findHeader = (pattern, headers) => {\n    return (headers.find(([k]) => {\n        return k.match(pattern);\n    }) || [void 0, void 0])[1];\n};\n\nconst serializerMiddleware = (options, serializer) => (next, context) => async (args) => {\n    const endpointConfig = options;\n    const endpoint = context.endpointV2\n        ? async () => endpoints.toEndpointV1(context.endpointV2)\n        : endpointConfig.endpoint;\n    if (!endpoint) {\n        throw new Error(\"No valid endpoint provider available.\");\n    }\n    const request = await serializer(args.input, { ...options, endpoint });\n    return next({\n        ...args,\n        request,\n    });\n};\n\nconst deserializerMiddlewareOption = {\n    name: \"deserializerMiddleware\",\n    step: \"deserialize\",\n    tags: [\"DESERIALIZER\"],\n    override: true,\n};\nconst serializerMiddlewareOption = {\n    name: \"serializerMiddleware\",\n    step: \"serialize\",\n    tags: [\"SERIALIZER\"],\n    override: true,\n};\nfunction getSerdePlugin(config, serializer, deserializer) {\n    return {\n        applyToStack: (commandStack) => {\n            commandStack.add(deserializerMiddleware(config, deserializer), deserializerMiddlewareOption);\n            commandStack.add(serializerMiddleware(config, serializer), serializerMiddlewareOption);\n        },\n    };\n}\n\nexports.deserializerMiddleware = deserializerMiddleware;\nexports.deserializerMiddlewareOption = deserializerMiddlewareOption;\nexports.getSerdePlugin = getSerdePlugin;\nexports.serializerMiddleware = serializerMiddleware;\nexports.serializerMiddlewareOption = serializerMiddlewareOption;\n", "'use strict';\n\nvar core = require('@smithy/core');\nvar utilMiddleware = require('@smithy/util-middleware');\nvar getEndpointFromConfig = require('./adaptors/getEndpointFromConfig');\nvar urlParser = require('@smithy/url-parser');\nvar middlewareSerde = require('@smithy/middleware-serde');\n\nconst resolveParamsForS3 = async (endpointParams) => {\n    const bucket = endpointParams?.Bucket || \"\";\n    if (typeof endpointParams.Bucket === \"string\") {\n        endpointParams.Bucket = bucket.replace(/#/g, encodeURIComponent(\"#\")).replace(/\\?/g, encodeURIComponent(\"?\"));\n    }\n    if (isArnBucketName(bucket)) {\n        if (endpointParams.ForcePathStyle === true) {\n            throw new Error(\"Path-style addressing cannot be used with ARN buckets\");\n        }\n    }\n    else if (!isDnsCompatibleBucketName(bucket) ||\n        (bucket.indexOf(\".\") !== -1 && !String(endpointParams.Endpoint).startsWith(\"http:\")) ||\n        bucket.toLowerCase() !== bucket ||\n        bucket.length < 3) {\n        endpointParams.ForcePathStyle = true;\n    }\n    if (endpointParams.DisableMultiRegionAccessPoints) {\n        endpointParams.disableMultiRegionAccessPoints = true;\n        endpointParams.DisableMRAP = true;\n    }\n    return endpointParams;\n};\nconst DOMAIN_PATTERN = /^[a-z0-9][a-z0-9\\.\\-]{1,61}[a-z0-9]$/;\nconst IP_ADDRESS_PATTERN = /(\\d+\\.){3}\\d+/;\nconst DOTS_PATTERN = /\\.\\./;\nconst isDnsCompatibleBucketName = (bucketName) => DOMAIN_PATTERN.test(bucketName) && !IP_ADDRESS_PATTERN.test(bucketName) && !DOTS_PATTERN.test(bucketName);\nconst isArnBucketName = (bucketName) => {\n    const [arn, partition, service, , , bucket] = bucketName.split(\":\");\n    const isArn = arn === \"arn\" && bucketName.split(\":\").length >= 6;\n    const isValidArn = Boolean(isArn && partition && service && bucket);\n    if (isArn && !isValidArn) {\n        throw new Error(`Invalid ARN: ${bucketName} was an invalid ARN.`);\n    }\n    return isValidArn;\n};\n\nconst createConfigValueProvider = (configKey, canonicalEndpointParamKey, config, isClientContextParam = false) => {\n    const configProvider = async () => {\n        let configValue;\n        if (isClientContextParam) {\n            const clientContextParams = config.clientContextParams;\n            const nestedValue = clientContextParams?.[configKey];\n            configValue = nestedValue ?? config[configKey] ?? config[canonicalEndpointParamKey];\n        }\n        else {\n            configValue = config[configKey] ?? config[canonicalEndpointParamKey];\n        }\n        if (typeof configValue === \"function\") {\n            return configValue();\n        }\n        return configValue;\n    };\n    if (configKey === \"credentialScope\" || canonicalEndpointParamKey === \"CredentialScope\") {\n        return async () => {\n            const credentials = typeof config.credentials === \"function\" ? await config.credentials() : config.credentials;\n            const configValue = credentials?.credentialScope ?? credentials?.CredentialScope;\n            return configValue;\n        };\n    }\n    if (configKey === \"accountId\" || canonicalEndpointParamKey === \"AccountId\") {\n        return async () => {\n            const credentials = typeof config.credentials === \"function\" ? await config.credentials() : config.credentials;\n            const configValue = credentials?.accountId ?? credentials?.AccountId;\n            return configValue;\n        };\n    }\n    if (configKey === \"endpoint\" || canonicalEndpointParamKey === \"endpoint\") {\n        return async () => {\n            if (config.isCustomEndpoint === false) {\n                return undefined;\n            }\n            const endpoint = await configProvider();\n            if (endpoint && typeof endpoint === \"object\") {\n                if (\"url\" in endpoint) {\n                    return endpoint.url.href;\n                }\n                if (\"hostname\" in endpoint) {\n                    const { protocol, hostname, port, path } = endpoint;\n                    return `${protocol}//${hostname}${port ? \":\" + port : \"\"}${path}`;\n                }\n            }\n            return endpoint;\n        };\n    }\n    return configProvider;\n};\n\nconst toEndpointV1 = (endpoint) => {\n    if (typeof endpoint === \"object\") {\n        if (\"url\" in endpoint) {\n            const v1Endpoint = urlParser.parseUrl(endpoint.url);\n            if (endpoint.headers) {\n                v1Endpoint.headers = {};\n                for (const [name, values] of Object.entries(endpoint.headers)) {\n                    v1Endpoint.headers[name.toLowerCase()] = values.join(\", \");\n                }\n            }\n            return v1Endpoint;\n        }\n        return endpoint;\n    }\n    return urlParser.parseUrl(endpoint);\n};\n\nconst getEndpointFromInstructions = async (commandInput, instructionsSupplier, clientConfig, context) => {\n    if (!clientConfig.isCustomEndpoint) {\n        let endpointFromConfig;\n        if (clientConfig.serviceConfiguredEndpoint) {\n            endpointFromConfig = await clientConfig.serviceConfiguredEndpoint();\n        }\n        else {\n            endpointFromConfig = await getEndpointFromConfig.getEndpointFromConfig(clientConfig.serviceId);\n        }\n        if (endpointFromConfig) {\n            clientConfig.endpoint = () => Promise.resolve(toEndpointV1(endpointFromConfig));\n            clientConfig.isCustomEndpoint = true;\n        }\n    }\n    const endpointParams = await resolveParams(commandInput, instructionsSupplier, clientConfig);\n    if (typeof clientConfig.endpointProvider !== \"function\") {\n        throw new Error(\"config.endpointProvider is not set.\");\n    }\n    const endpoint = clientConfig.endpointProvider(endpointParams, context);\n    if (clientConfig.isCustomEndpoint && clientConfig.endpoint) {\n        const customEndpoint = await clientConfig.endpoint();\n        if (customEndpoint?.headers) {\n            endpoint.headers ??= {};\n            for (const [name, value] of Object.entries(customEndpoint.headers)) {\n                endpoint.headers[name] = Array.isArray(value) ? value : [value];\n            }\n        }\n    }\n    return endpoint;\n};\nconst resolveParams = async (commandInput, instructionsSupplier, clientConfig) => {\n    const endpointParams = {};\n    const instructions = instructionsSupplier?.getEndpointParameterInstructions?.() || {};\n    for (const [name, instruction] of Object.entries(instructions)) {\n        switch (instruction.type) {\n            case \"staticContextParams\":\n                endpointParams[name] = instruction.value;\n                break;\n            case \"contextParams\":\n                endpointParams[name] = commandInput[instruction.name];\n                break;\n            case \"clientContextParams\":\n            case \"builtInParams\":\n                endpointParams[name] = await createConfigValueProvider(instruction.name, name, clientConfig, instruction.type !== \"builtInParams\")();\n                break;\n            case \"operationContextParams\":\n                endpointParams[name] = instruction.get(commandInput);\n                break;\n            default:\n                throw new Error(\"Unrecognized endpoint parameter instruction: \" + JSON.stringify(instruction));\n        }\n    }\n    if (Object.keys(instructions).length === 0) {\n        Object.assign(endpointParams, clientConfig);\n    }\n    if (String(clientConfig.serviceId).toLowerCase() === \"s3\") {\n        await resolveParamsForS3(endpointParams);\n    }\n    return endpointParams;\n};\n\nconst endpointMiddleware = ({ config, instructions, }) => {\n    return (next, context) => async (args) => {\n        if (config.isCustomEndpoint) {\n            core.setFeature(context, \"ENDPOINT_OVERRIDE\", \"N\");\n        }\n        const endpoint = await getEndpointFromInstructions(args.input, {\n            getEndpointParameterInstructions() {\n                return instructions;\n            },\n        }, { ...config }, context);\n        context.endpointV2 = endpoint;\n        context.authSchemes = endpoint.properties?.authSchemes;\n        const authScheme = context.authSchemes?.[0];\n        if (authScheme) {\n            context[\"signing_region\"] = authScheme.signingRegion;\n            context[\"signing_service\"] = authScheme.signingName;\n            const smithyContext = utilMiddleware.getSmithyContext(context);\n            const httpAuthOption = smithyContext?.selectedHttpAuthScheme?.httpAuthOption;\n            if (httpAuthOption) {\n                httpAuthOption.signingProperties = Object.assign(httpAuthOption.signingProperties || {}, {\n                    signing_region: authScheme.signingRegion,\n                    signingRegion: authScheme.signingRegion,\n                    signing_service: authScheme.signingName,\n                    signingName: authScheme.signingName,\n                    signingRegionSet: authScheme.signingRegionSet,\n                }, authScheme.properties);\n            }\n        }\n        return next({\n            ...args,\n        });\n    };\n};\n\nconst endpointMiddlewareOptions = {\n    step: \"serialize\",\n    tags: [\"ENDPOINT_PARAMETERS\", \"ENDPOINT_V2\", \"ENDPOINT\"],\n    name: \"endpointV2Middleware\",\n    override: true,\n    relation: \"before\",\n    toMiddleware: middlewareSerde.serializerMiddlewareOption.name,\n};\nconst getEndpointPlugin = (config, instructions) => ({\n    applyToStack: (clientStack) => {\n        clientStack.addRelativeTo(endpointMiddleware({\n            config,\n            instructions,\n        }), endpointMiddlewareOptions);\n    },\n});\n\nconst resolveEndpointConfig = (input) => {\n    const tls = input.tls ?? true;\n    const { endpoint, useDualstackEndpoint, useFipsEndpoint } = input;\n    const customEndpointProvider = endpoint != null ? async () => toEndpointV1(await utilMiddleware.normalizeProvider(endpoint)()) : undefined;\n    const isCustomEndpoint = !!endpoint;\n    const resolvedConfig = Object.assign(input, {\n        endpoint: customEndpointProvider,\n        tls,\n        isCustomEndpoint,\n        useDualstackEndpoint: utilMiddleware.normalizeProvider(useDualstackEndpoint ?? false),\n        useFipsEndpoint: utilMiddleware.normalizeProvider(useFipsEndpoint ?? false),\n    });\n    let configuredEndpointPromise = undefined;\n    resolvedConfig.serviceConfiguredEndpoint = async () => {\n        if (input.serviceId && !configuredEndpointPromise) {\n            configuredEndpointPromise = getEndpointFromConfig.getEndpointFromConfig(input.serviceId);\n        }\n        return configuredEndpointPromise;\n    };\n    return resolvedConfig;\n};\n\nconst resolveEndpointRequiredConfig = (input) => {\n    const { endpoint } = input;\n    if (endpoint === undefined) {\n        input.endpoint = async () => {\n            throw new Error(\"@smithy/middleware-endpoint: (default endpointRuleSet) endpoint is not set - you must configure an endpoint.\");\n        };\n    }\n    return input;\n};\n\nexports.endpointMiddleware = endpointMiddleware;\nexports.endpointMiddlewareOptions = endpointMiddlewareOptions;\nexports.getEndpointFromInstructions = getEndpointFromInstructions;\nexports.getEndpointPlugin = getEndpointPlugin;\nexports.resolveEndpointConfig = resolveEndpointConfig;\nexports.resolveEndpointRequiredConfig = resolveEndpointRequiredConfig;\nexports.resolveParams = resolveParams;\nexports.toEndpointV1 = toEndpointV1;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isStreamingPayload = void 0;\nconst stream_1 = require(\"stream\");\nconst isStreamingPayload = (request) => request?.body instanceof stream_1.Readable ||\n    (typeof ReadableStream !== \"undefined\" && request?.body instanceof ReadableStream);\nexports.isStreamingPayload = isStreamingPayload;\n", "'use strict';\n\nvar utilRetry = require('@smithy/util-retry');\nvar protocolHttp = require('@smithy/protocol-http');\nvar serviceErrorClassification = require('@smithy/service-error-classification');\nvar uuid = require('@smithy/uuid');\nvar utilMiddleware = require('@smithy/util-middleware');\nvar smithyClient = require('@smithy/smithy-client');\nvar isStreamingPayload = require('./isStreamingPayload/isStreamingPayload');\nvar serde = require('@smithy/core/serde');\n\nconst asSdkError = (error) => {\n    if (error instanceof Error)\n        return error;\n    if (error instanceof Object)\n        return Object.assign(new Error(), error);\n    if (typeof error === \"string\")\n        return new Error(error);\n    return new Error(`AWS SDK error wrapper for ${error}`);\n};\n\nconst getDefaultRetryQuota = (initialRetryTokens, options) => {\n    const MAX_CAPACITY = initialRetryTokens;\n    const noRetryIncrement = utilRetry.NO_RETRY_INCREMENT;\n    const retryCost = utilRetry.RETRY_COST;\n    const timeoutRetryCost = utilRetry.TIMEOUT_RETRY_COST;\n    let availableCapacity = initialRetryTokens;\n    const getCapacityAmount = (error) => (error.name === \"TimeoutError\" ? timeoutRetryCost : retryCost);\n    const hasRetryTokens = (error) => getCapacityAmount(error) <= availableCapacity;\n    const retrieveRetryTokens = (error) => {\n        if (!hasRetryTokens(error)) {\n            throw new Error(\"No retry token available\");\n        }\n        const capacityAmount = getCapacityAmount(error);\n        availableCapacity -= capacityAmount;\n        return capacityAmount;\n    };\n    const releaseRetryTokens = (capacityReleaseAmount) => {\n        availableCapacity += capacityReleaseAmount ?? noRetryIncrement;\n        availableCapacity = Math.min(availableCapacity, MAX_CAPACITY);\n    };\n    return Object.freeze({\n        hasRetryTokens,\n        retrieveRetryTokens,\n        releaseRetryTokens,\n    });\n};\n\nconst defaultDelayDecider = (delayBase, attempts) => Math.floor(Math.min(utilRetry.MAXIMUM_RETRY_DELAY, Math.random() * 2 ** attempts * delayBase));\n\nconst defaultRetryDecider = (error) => {\n    if (!error) {\n        return false;\n    }\n    return serviceErrorClassification.isRetryableByTrait(error) || serviceErrorClassification.isClockSkewError(error) || serviceErrorClassification.isThrottlingError(error) || serviceErrorClassification.isTransientError(error);\n};\n\nclass StandardRetryStrategy {\n    maxAttemptsProvider;\n    retryDecider;\n    delayDecider;\n    retryQuota;\n    mode = utilRetry.RETRY_MODES.STANDARD;\n    constructor(maxAttemptsProvider, options) {\n        this.maxAttemptsProvider = maxAttemptsProvider;\n        this.retryDecider = options?.retryDecider ?? defaultRetryDecider;\n        this.delayDecider = options?.delayDecider ?? defaultDelayDecider;\n        this.retryQuota = options?.retryQuota ?? getDefaultRetryQuota(utilRetry.INITIAL_RETRY_TOKENS);\n    }\n    shouldRetry(error, attempts, maxAttempts) {\n        return attempts < maxAttempts && this.retryDecider(error) && this.retryQuota.hasRetryTokens(error);\n    }\n    async getMaxAttempts() {\n        let maxAttempts;\n        try {\n            maxAttempts = await this.maxAttemptsProvider();\n        }\n        catch (error) {\n            maxAttempts = utilRetry.DEFAULT_MAX_ATTEMPTS;\n        }\n        return maxAttempts;\n    }\n    async retry(next, args, options) {\n        let retryTokenAmount;\n        let attempts = 0;\n        let totalDelay = 0;\n        const maxAttempts = await this.getMaxAttempts();\n        const { request } = args;\n        if (protocolHttp.HttpRequest.isInstance(request)) {\n            request.headers[utilRetry.INVOCATION_ID_HEADER] = uuid.v4();\n        }\n        while (true) {\n            try {\n                if (protocolHttp.HttpRequest.isInstance(request)) {\n                    request.headers[utilRetry.REQUEST_HEADER] = `attempt=${attempts + 1}; max=${maxAttempts}`;\n                }\n                if (options?.beforeRequest) {\n                    await options.beforeRequest();\n                }\n                const { response, output } = await next(args);\n                if (options?.afterRequest) {\n                    options.afterRequest(response);\n                }\n                this.retryQuota.releaseRetryTokens(retryTokenAmount);\n                output.$metadata.attempts = attempts + 1;\n                output.$metadata.totalRetryDelay = totalDelay;\n                return { response, output };\n            }\n            catch (e) {\n                const err = asSdkError(e);\n                attempts++;\n                if (this.shouldRetry(err, attempts, maxAttempts)) {\n                    retryTokenAmount = this.retryQuota.retrieveRetryTokens(err);\n                    const delayFromDecider = this.delayDecider(serviceErrorClassification.isThrottlingError(err) ? utilRetry.THROTTLING_RETRY_DELAY_BASE : utilRetry.DEFAULT_RETRY_DELAY_BASE, attempts);\n                    const delayFromResponse = getDelayFromRetryAfterHeader(err.$response);\n                    const delay = Math.max(delayFromResponse || 0, delayFromDecider);\n                    totalDelay += delay;\n                    await new Promise((resolve) => setTimeout(resolve, delay));\n                    continue;\n                }\n                if (!err.$metadata) {\n                    err.$metadata = {};\n                }\n                err.$metadata.attempts = attempts;\n                err.$metadata.totalRetryDelay = totalDelay;\n                throw err;\n            }\n        }\n    }\n}\nconst getDelayFromRetryAfterHeader = (response) => {\n    if (!protocolHttp.HttpResponse.isInstance(response))\n        return;\n    const retryAfterHeaderName = Object.keys(response.headers).find((key) => key.toLowerCase() === \"retry-after\");\n    if (!retryAfterHeaderName)\n        return;\n    const retryAfter = response.headers[retryAfterHeaderName];\n    const retryAfterSeconds = Number(retryAfter);\n    if (!Number.isNaN(retryAfterSeconds))\n        return retryAfterSeconds * 1000;\n    const retryAfterDate = new Date(retryAfter);\n    return retryAfterDate.getTime() - Date.now();\n};\n\nclass AdaptiveRetryStrategy extends StandardRetryStrategy {\n    rateLimiter;\n    constructor(maxAttemptsProvider, options) {\n        const { rateLimiter, ...superOptions } = options ?? {};\n        super(maxAttemptsProvider, superOptions);\n        this.rateLimiter = rateLimiter ?? new utilRetry.DefaultRateLimiter();\n        this.mode = utilRetry.RETRY_MODES.ADAPTIVE;\n    }\n    async retry(next, args) {\n        return super.retry(next, args, {\n            beforeRequest: async () => {\n                return this.rateLimiter.getSendToken();\n            },\n            afterRequest: (response) => {\n                this.rateLimiter.updateClientSendingRate(response);\n            },\n        });\n    }\n}\n\nconst ENV_MAX_ATTEMPTS = \"AWS_MAX_ATTEMPTS\";\nconst CONFIG_MAX_ATTEMPTS = \"max_attempts\";\nconst NODE_MAX_ATTEMPT_CONFIG_OPTIONS = {\n    environmentVariableSelector: (env) => {\n        const value = env[ENV_MAX_ATTEMPTS];\n        if (!value)\n            return undefined;\n        const maxAttempt = parseInt(value);\n        if (Number.isNaN(maxAttempt)) {\n            throw new Error(`Environment variable ${ENV_MAX_ATTEMPTS} mast be a number, got \"${value}\"`);\n        }\n        return maxAttempt;\n    },\n    configFileSelector: (profile) => {\n        const value = profile[CONFIG_MAX_ATTEMPTS];\n        if (!value)\n            return undefined;\n        const maxAttempt = parseInt(value);\n        if (Number.isNaN(maxAttempt)) {\n            throw new Error(`Shared config file entry ${CONFIG_MAX_ATTEMPTS} mast be a number, got \"${value}\"`);\n        }\n        return maxAttempt;\n    },\n    default: utilRetry.DEFAULT_MAX_ATTEMPTS,\n};\nconst resolveRetryConfig = (input) => {\n    const { retryStrategy, retryMode } = input;\n    const maxAttempts = utilMiddleware.normalizeProvider(input.maxAttempts ?? utilRetry.DEFAULT_MAX_ATTEMPTS);\n    let controller = retryStrategy\n        ? Promise.resolve(retryStrategy)\n        : undefined;\n    const getDefault = async () => (await utilMiddleware.normalizeProvider(retryMode)()) === utilRetry.RETRY_MODES.ADAPTIVE\n        ? new utilRetry.AdaptiveRetryStrategy(maxAttempts)\n        : new utilRetry.StandardRetryStrategy(maxAttempts);\n    return Object.assign(input, {\n        maxAttempts,\n        retryStrategy: () => (controller ??= getDefault()),\n    });\n};\nconst ENV_RETRY_MODE = \"AWS_RETRY_MODE\";\nconst CONFIG_RETRY_MODE = \"retry_mode\";\nconst NODE_RETRY_MODE_CONFIG_OPTIONS = {\n    environmentVariableSelector: (env) => env[ENV_RETRY_MODE],\n    configFileSelector: (profile) => profile[CONFIG_RETRY_MODE],\n    default: utilRetry.DEFAULT_RETRY_MODE,\n};\n\nconst omitRetryHeadersMiddleware = () => (next) => async (args) => {\n    const { request } = args;\n    if (protocolHttp.HttpRequest.isInstance(request)) {\n        delete request.headers[utilRetry.INVOCATION_ID_HEADER];\n        delete request.headers[utilRetry.REQUEST_HEADER];\n    }\n    return next(args);\n};\nconst omitRetryHeadersMiddlewareOptions = {\n    name: \"omitRetryHeadersMiddleware\",\n    tags: [\"RETRY\", \"HEADERS\", \"OMIT_RETRY_HEADERS\"],\n    relation: \"before\",\n    toMiddleware: \"awsAuthMiddleware\",\n    override: true,\n};\nconst getOmitRetryHeadersPlugin = (options) => ({\n    applyToStack: (clientStack) => {\n        clientStack.addRelativeTo(omitRetryHeadersMiddleware(), omitRetryHeadersMiddlewareOptions);\n    },\n});\n\nfunction parseRetryAfterHeader(response, logger) {\n    if (!protocolHttp.HttpResponse.isInstance(response)) {\n        return;\n    }\n    for (const header of Object.keys(response.headers)) {\n        const h = header.toLowerCase();\n        if (h === \"retry-after\") {\n            const retryAfter = response.headers[header];\n            let retryAfterSeconds = NaN;\n            if (retryAfter.endsWith(\"GMT\")) {\n                try {\n                    const date = serde.parseRfc7231DateTime(retryAfter);\n                    retryAfterSeconds = (date.getTime() - Date.now()) / 1000;\n                }\n                catch (e) {\n                    logger?.trace?.(\"Failed to parse retry-after header\");\n                    logger?.trace?.(e);\n                }\n            }\n            else if (retryAfter.match(/ GMT, ((\\d+)|(\\d+\\.\\d+))$/)) {\n                retryAfterSeconds = Number(retryAfter.match(/ GMT, ([\\d.]+)$/)?.[1]);\n            }\n            else if (retryAfter.match(/^((\\d+)|(\\d+\\.\\d+))$/)) {\n                retryAfterSeconds = Number(retryAfter);\n            }\n            else if (Date.parse(retryAfter) >= Date.now()) {\n                retryAfterSeconds = (Date.parse(retryAfter) - Date.now()) / 1000;\n            }\n            if (isNaN(retryAfterSeconds)) {\n                return;\n            }\n            return new Date(Date.now() + retryAfterSeconds * 1000);\n        }\n        else if (h === \"x-amz-retry-after\") {\n            const v = response.headers[header];\n            const backoffMilliseconds = Number(v);\n            if (isNaN(backoffMilliseconds)) {\n                logger?.trace?.(`Failed to parse x-amz-retry-after=${v}`);\n                return;\n            }\n            return new Date(Date.now() + backoffMilliseconds);\n        }\n    }\n}\nfunction getRetryAfterHint(response, logger) {\n    return parseRetryAfterHeader(response, logger);\n}\n\nconst retryMiddleware = (options) => (next, context) => async (args) => {\n    let retryStrategy = await options.retryStrategy();\n    const maxAttempts = await options.maxAttempts();\n    if (isRetryStrategyV2(retryStrategy)) {\n        retryStrategy = retryStrategy;\n        let retryToken = await retryStrategy.acquireInitialRetryToken((context[\"partition_id\"] ?? \"\") + (context.__retryLongPoll ? \":longpoll\" : \"\"));\n        let lastError = new Error();\n        let attempts = 0;\n        let totalRetryDelay = 0;\n        const { request } = args;\n        const isRequest = protocolHttp.HttpRequest.isInstance(request);\n        if (isRequest) {\n            request.headers[utilRetry.INVOCATION_ID_HEADER] = uuid.v4();\n        }\n        while (true) {\n            try {\n                if (isRequest) {\n                    request.headers[utilRetry.REQUEST_HEADER] = `attempt=${attempts + 1}; max=${maxAttempts}`;\n                }\n                const { response, output } = await next(args);\n                retryStrategy.recordSuccess(retryToken);\n                output.$metadata.attempts = attempts + 1;\n                output.$metadata.totalRetryDelay = totalRetryDelay;\n                return { response, output };\n            }\n            catch (e) {\n                const retryErrorInfo = getRetryErrorInfo(e, options.logger);\n                lastError = asSdkError(e);\n                if (isRequest && isStreamingPayload.isStreamingPayload(request)) {\n                    (context.logger instanceof smithyClient.NoOpLogger ? console : context.logger)?.warn(\"An error was encountered in a non-retryable streaming request.\");\n                    throw lastError;\n                }\n                try {\n                    retryToken = await retryStrategy.refreshRetryTokenForRetry(retryToken, retryErrorInfo);\n                }\n                catch (refreshError) {\n                    if (typeof refreshError.$backoff === \"number\") {\n                        await cooldown(refreshError.$backoff);\n                    }\n                    if (!lastError.$metadata) {\n                        lastError.$metadata = {};\n                    }\n                    lastError.$metadata.attempts = attempts + 1;\n                    lastError.$metadata.totalRetryDelay = totalRetryDelay;\n                    throw lastError;\n                }\n                attempts = retryToken.getRetryCount();\n                const delay = retryToken.getRetryDelay();\n                totalRetryDelay += delay;\n                await cooldown(delay);\n            }\n        }\n    }\n    else {\n        retryStrategy = retryStrategy;\n        if (retryStrategy?.mode) {\n            context.userAgent = [...(context.userAgent || []), [\"cfg/retry-mode\", retryStrategy.mode]];\n        }\n        return retryStrategy.retry(next, args);\n    }\n};\nconst cooldown = (ms) => new Promise((resolve) => setTimeout(resolve, ms));\nconst isRetryStrategyV2 = (retryStrategy) => typeof retryStrategy.acquireInitialRetryToken !== \"undefined\" &&\n    typeof retryStrategy.refreshRetryTokenForRetry !== \"undefined\" &&\n    typeof retryStrategy.recordSuccess !== \"undefined\";\nconst getRetryErrorInfo = (error, logger) => {\n    const errorInfo = {\n        error,\n        errorType: getRetryErrorType(error),\n    };\n    const retryAfterHint = parseRetryAfterHeader(error.$response, logger);\n    if (retryAfterHint) {\n        errorInfo.retryAfterHint = retryAfterHint;\n    }\n    return errorInfo;\n};\nconst getRetryErrorType = (error) => {\n    if (serviceErrorClassification.isThrottlingError(error))\n        return \"THROTTLING\";\n    if (serviceErrorClassification.isTransientError(error))\n        return \"TRANSIENT\";\n    if (serviceErrorClassification.isServerError(error))\n        return \"SERVER_ERROR\";\n    return \"CLIENT_ERROR\";\n};\nconst retryMiddlewareOptions = {\n    name: \"retryMiddleware\",\n    tags: [\"RETRY\"],\n    step: \"finalizeRequest\",\n    priority: \"high\",\n    override: true,\n};\nconst getRetryPlugin = (options) => ({\n    applyToStack: (clientStack) => {\n        clientStack.add(retryMiddleware(options), retryMiddlewareOptions);\n    },\n});\n\nexports.AdaptiveRetryStrategy = AdaptiveRetryStrategy;\nexports.CONFIG_MAX_ATTEMPTS = CONFIG_MAX_ATTEMPTS;\nexports.CONFIG_RETRY_MODE = CONFIG_RETRY_MODE;\nexports.ENV_MAX_ATTEMPTS = ENV_MAX_ATTEMPTS;\nexports.ENV_RETRY_MODE = ENV_RETRY_MODE;\nexports.NODE_MAX_ATTEMPT_CONFIG_OPTIONS = NODE_MAX_ATTEMPT_CONFIG_OPTIONS;\nexports.NODE_RETRY_MODE_CONFIG_OPTIONS = NODE_RETRY_MODE_CONFIG_OPTIONS;\nexports.StandardRetryStrategy = StandardRetryStrategy;\nexports.defaultDelayDecider = defaultDelayDecider;\nexports.defaultRetryDecider = defaultRetryDecider;\nexports.getOmitRetryHeadersPlugin = getOmitRetryHeadersPlugin;\nexports.getRetryAfterHint = getRetryAfterHint;\nexports.getRetryPlugin = getRetryPlugin;\nexports.omitRetryHeadersMiddleware = omitRetryHeadersMiddleware;\nexports.omitRetryHeadersMiddlewareOptions = omitRetryHeadersMiddlewareOptions;\nexports.resolveRetryConfig = resolveRetryConfig;\nexports.retryMiddleware = retryMiddleware;\nexports.retryMiddlewareOptions = retryMiddlewareOptions;\n", "import { resolveAwsSdkSigV4Config } from \"@aws-sdk/core/httpAuthSchemes\";\nimport { getSmithyContext, normalizeProvider } from \"@smithy/util-middleware\";\nexport const defaultSSOOIDCHttpAuthSchemeParametersProvider = async (config, context, input) => {\n    return {\n        operation: getSmithyContext(context).operation,\n        region: (await normalizeProvider(config.region)()) ||\n            (() => {\n                throw new Error(\"expected `region` to be configured for `aws.auth#sigv4`\");\n            })(),\n    };\n};\nfunction createAwsAuthSigv4HttpAuthOption(authParameters) {\n    return {\n        schemeId: \"aws.auth#sigv4\",\n        signingProperties: {\n            name: \"sso-oauth\",\n            region: authParameters.region,\n        },\n        propertiesExtractor: (config, context) => ({\n            signingProperties: {\n                config,\n                context,\n            },\n        }),\n    };\n}\nfunction createSmithyApiNoAuthHttpAuthOption(authParameters) {\n    return {\n        schemeId: \"smithy.api#noAuth\",\n    };\n}\nexport const defaultSSOOIDCHttpAuthSchemeProvider = (authParameters) => {\n    const options = [];\n    switch (authParameters.operation) {\n        case \"CreateToken\": {\n            options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n            break;\n        }\n        default: {\n            options.push(createAwsAuthSigv4HttpAuthOption(authParameters));\n        }\n    }\n    return options;\n};\nexport const resolveHttpAuthSchemeConfig = (config) => {\n    const config_0 = resolveAwsSdkSigV4Config(config);\n    return Object.assign(config_0, {\n        authSchemePreference: normalizeProvider(config.authSchemePreference ?? []),\n    });\n};\n", "export const resolveClientEndpointParameters = (options) => {\n    return Object.assign(options, {\n        useDualstackEndpoint: options.useDualstackEndpoint ?? false,\n        useFipsEndpoint: options.useFipsEndpoint ?? false,\n        defaultSigningName: \"sso-oauth\",\n    });\n};\nexport const commonParams = {\n    UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n    Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n    Region: { type: \"builtInParams\", name: \"region\" },\n    UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n};\n", "{\n  \"name\": \"@aws-sdk/nested-clients\",\n  \"version\": \"3.997.3\",\n  \"description\": \"Nested clients for AWS SDK packages.\",\n  \"main\": \"./dist-cjs/index.js\",\n  \"module\": \"./dist-es/index.js\",\n  \"types\": \"./dist-types/index.d.ts\",\n  \"scripts\": {\n    \"build\": \"yarn lint && concurrently 'yarn:build:types' 'yarn:build:es' && yarn build:cjs\",\n    \"build:cjs\": \"node ../../scripts/compilation/inline nested-clients\",\n    \"build:es\": \"tsc -p tsconfig.es.json\",\n    \"build:include:deps\": \"yarn g:turbo run build -F=\\\"$npm_package_name\\\"\",\n    \"build:types\": \"tsc -p tsconfig.types.json\",\n    \"build:types:downlevel\": \"downlevel-dts dist-types dist-types/ts3.4\",\n    \"clean\": \"premove dist-cjs dist-es dist-types tsconfig.cjs.tsbuildinfo tsconfig.es.tsbuildinfo tsconfig.types.tsbuildinfo\",\n    \"lint\": \"node ../../scripts/validation/submodules-linter.js --pkg nested-clients\",\n    \"test\": \"yarn g:vitest run\",\n    \"test:watch\": \"yarn g:vitest watch\"\n  },\n  \"engines\": {\n    \"node\": \">=20.0.0\"\n  },\n  \"sideEffects\": false,\n  \"author\": {\n    \"name\": \"AWS SDK for JavaScript Team\",\n    \"url\": \"https://aws.amazon.com/javascript/\"\n  },\n  \"license\": \"Apache-2.0\",\n  \"dependencies\": {\n    \"@aws-crypto/sha256-browser\": \"5.2.0\",\n    \"@aws-crypto/sha256-js\": \"5.2.0\",\n    \"@aws-sdk/core\": \"^3.974.5\",\n    \"@aws-sdk/middleware-host-header\": \"^3.972.10\",\n    \"@aws-sdk/middleware-logger\": \"^3.972.10\",\n    \"@aws-sdk/middleware-recursion-detection\": \"^3.972.11\",\n    \"@aws-sdk/middleware-user-agent\": \"^3.972.35\",\n    \"@aws-sdk/region-config-resolver\": \"^3.972.13\",\n    \"@aws-sdk/signature-v4-multi-region\": \"^3.996.22\",\n    \"@aws-sdk/types\": \"^3.973.8\",\n    \"@aws-sdk/util-endpoints\": \"^3.996.8\",\n    \"@aws-sdk/util-user-agent-browser\": \"^3.972.10\",\n    \"@aws-sdk/util-user-agent-node\": \"^3.973.21\",\n    \"@smithy/config-resolver\": \"^4.4.17\",\n    \"@smithy/core\": \"^3.23.17\",\n    \"@smithy/fetch-http-handler\": \"^5.3.17\",\n    \"@smithy/hash-node\": \"^4.2.14\",\n    \"@smithy/invalid-dependency\": \"^4.2.14\",\n    \"@smithy/middleware-content-length\": \"^4.2.14\",\n    \"@smithy/middleware-endpoint\": \"^4.4.32\",\n    \"@smithy/middleware-retry\": \"^4.5.5\",\n    \"@smithy/middleware-serde\": \"^4.2.20\",\n    \"@smithy/middleware-stack\": \"^4.2.14\",\n    \"@smithy/node-config-provider\": \"^4.3.14\",\n    \"@smithy/node-http-handler\": \"^4.6.1\",\n    \"@smithy/protocol-http\": \"^5.3.14\",\n    \"@smithy/smithy-client\": \"^4.12.13\",\n    \"@smithy/types\": \"^4.14.1\",\n    \"@smithy/url-parser\": \"^4.2.14\",\n    \"@smithy/util-base64\": \"^4.3.2\",\n    \"@smithy/util-body-length-browser\": \"^4.2.2\",\n    \"@smithy/util-body-length-node\": \"^4.2.3\",\n    \"@smithy/util-defaults-mode-browser\": \"^4.3.49\",\n    \"@smithy/util-defaults-mode-node\": \"^4.2.54\",\n    \"@smithy/util-endpoints\": \"^3.4.2\",\n    \"@smithy/util-middleware\": \"^4.2.14\",\n    \"@smithy/util-retry\": \"^4.3.4\",\n    \"@smithy/util-utf8\": \"^4.2.2\",\n    \"tslib\": \"^2.6.2\"\n  },\n  \"devDependencies\": {\n    \"concurrently\": \"7.0.0\",\n    \"downlevel-dts\": \"0.10.1\",\n    \"premove\": \"4.0.0\",\n    \"typescript\": \"~5.8.3\"\n  },\n  \"typesVersions\": {\n    \"<4.5\": {\n      \"dist-types/*\": [\n        \"dist-types/ts3.4/*\"\n      ]\n    }\n  },\n  \"files\": [\n    \"./cognito-identity.d.ts\",\n    \"./cognito-identity.js\",\n    \"./signin.d.ts\",\n    \"./signin.js\",\n    \"./sso-oidc.d.ts\",\n    \"./sso-oidc.js\",\n    \"./sso.d.ts\",\n    \"./sso.js\",\n    \"./sts.d.ts\",\n    \"./sts.js\",\n    \"dist-*/**\"\n  ],\n  \"browser\": {\n    \"./dist-es/submodules/cognito-identity/runtimeConfig\": \"./dist-es/submodules/cognito-identity/runtimeConfig.browser\",\n    \"./dist-es/submodules/signin/runtimeConfig\": \"./dist-es/submodules/signin/runtimeConfig.browser\",\n    \"./dist-es/submodules/sso-oidc/runtimeConfig\": \"./dist-es/submodules/sso-oidc/runtimeConfig.browser\",\n    \"./dist-es/submodules/sso/runtimeConfig\": \"./dist-es/submodules/sso/runtimeConfig.browser\",\n    \"./dist-es/submodules/sts/runtimeConfig\": \"./dist-es/submodules/sts/runtimeConfig.browser\"\n  },\n  \"react-native\": {},\n  \"homepage\": \"https://github.com/aws/aws-sdk-js-v3/tree/main/packages/nested-clients\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/aws/aws-sdk-js-v3.git\",\n    \"directory\": \"packages/nested-clients\"\n  },\n  \"exports\": {\n    \"./package.json\": \"./package.json\",\n    \"./sso-oidc\": {\n      \"types\": \"./dist-types/submodules/sso-oidc/index.d.ts\",\n      \"module\": \"./dist-es/submodules/sso-oidc/index.js\",\n      \"node\": \"./dist-cjs/submodules/sso-oidc/index.js\",\n      \"import\": \"./dist-es/submodules/sso-oidc/index.js\",\n      \"require\": \"./dist-cjs/submodules/sso-oidc/index.js\"\n    },\n    \"./sts\": {\n      \"types\": \"./dist-types/submodules/sts/index.d.ts\",\n      \"module\": \"./dist-es/submodules/sts/index.js\",\n      \"node\": \"./dist-cjs/submodules/sts/index.js\",\n      \"import\": \"./dist-es/submodules/sts/index.js\",\n      \"require\": \"./dist-cjs/submodules/sts/index.js\"\n    },\n    \"./signin\": {\n      \"types\": \"./dist-types/submodules/signin/index.d.ts\",\n      \"module\": \"./dist-es/submodules/signin/index.js\",\n      \"node\": \"./dist-cjs/submodules/signin/index.js\",\n      \"import\": \"./dist-es/submodules/signin/index.js\",\n      \"require\": \"./dist-cjs/submodules/signin/index.js\"\n    },\n    \"./cognito-identity\": {\n      \"types\": \"./dist-types/submodules/cognito-identity/index.d.ts\",\n      \"module\": \"./dist-es/submodules/cognito-identity/index.js\",\n      \"node\": \"./dist-cjs/submodules/cognito-identity/index.js\",\n      \"import\": \"./dist-es/submodules/cognito-identity/index.js\",\n      \"require\": \"./dist-cjs/submodules/cognito-identity/index.js\"\n    },\n    \"./sso\": {\n      \"types\": \"./dist-types/submodules/sso/index.d.ts\",\n      \"module\": \"./dist-es/submodules/sso/index.js\",\n      \"node\": \"./dist-cjs/submodules/sso/index.js\",\n      \"import\": \"./dist-es/submodules/sso/index.js\",\n      \"require\": \"./dist-cjs/submodules/sso/index.js\"\n    }\n  }\n}\n", "'use strict';\n\nvar node_os = require('node:os');\nvar node_process = require('node:process');\nvar utilConfigProvider = require('@smithy/util-config-provider');\nvar promises = require('node:fs/promises');\nvar node_path = require('node:path');\nvar middlewareUserAgent = require('@aws-sdk/middleware-user-agent');\n\nconst getRuntimeUserAgentPair = () => {\n    const runtimesToCheck = [\"deno\", \"bun\", \"llrt\"];\n    for (const runtime of runtimesToCheck) {\n        if (node_process.versions[runtime]) {\n            return [`md/${runtime}`, node_process.versions[runtime]];\n        }\n    }\n    return [\"md/nodejs\", node_process.versions.node];\n};\n\nconst getNodeModulesParentDirs = (dirname) => {\n    const cwd = process.cwd();\n    if (!dirname) {\n        return [cwd];\n    }\n    const normalizedPath = node_path.normalize(dirname);\n    const parts = normalizedPath.split(node_path.sep);\n    const nodeModulesIndex = parts.indexOf(\"node_modules\");\n    const parentDir = nodeModulesIndex !== -1 ? parts.slice(0, nodeModulesIndex).join(node_path.sep) : normalizedPath;\n    if (cwd === parentDir) {\n        return [cwd];\n    }\n    return [parentDir, cwd];\n};\n\nconst SEMVER_REGEX = /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+[0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*)?$/;\nconst getSanitizedTypeScriptVersion = (version = \"\") => {\n    const match = version.match(SEMVER_REGEX);\n    if (!match) {\n        return undefined;\n    }\n    const [major, minor, patch, prerelease] = [match[1], match[2], match[3], match[4]];\n    return prerelease ? `${major}.${minor}.${patch}-${prerelease}` : `${major}.${minor}.${patch}`;\n};\n\nconst ALLOWED_PREFIXES = [\"^\", \"~\", \">=\", \"<=\", \">\", \"<\"];\nconst ALLOWED_DIST_TAGS = [\"latest\", \"beta\", \"dev\", \"rc\", \"insiders\", \"next\"];\nconst getSanitizedDevTypeScriptVersion = (version = \"\") => {\n    if (ALLOWED_DIST_TAGS.includes(version)) {\n        return version;\n    }\n    const prefix = ALLOWED_PREFIXES.find((p) => version.startsWith(p)) ?? \"\";\n    const sanitizedTypeScriptVersion = getSanitizedTypeScriptVersion(version.slice(prefix.length));\n    if (!sanitizedTypeScriptVersion) {\n        return undefined;\n    }\n    return `${prefix}${sanitizedTypeScriptVersion}`;\n};\n\nlet tscVersion;\nconst TS_PACKAGE_JSON = node_path.join(\"node_modules\", \"typescript\", \"package.json\");\nconst getTypeScriptUserAgentPair = async () => {\n    if (tscVersion === null) {\n        return undefined;\n    }\n    else if (typeof tscVersion === \"string\") {\n        return [\"md/tsc\", tscVersion];\n    }\n    let isTypeScriptDetectionDisabled = false;\n    try {\n        isTypeScriptDetectionDisabled =\n            utilConfigProvider.booleanSelector(process.env, \"AWS_SDK_JS_TYPESCRIPT_DETECTION_DISABLED\", utilConfigProvider.SelectorType.ENV) || false;\n    }\n    catch { }\n    if (isTypeScriptDetectionDisabled) {\n        tscVersion = null;\n        return undefined;\n    }\n    const dirname = typeof __dirname !== \"undefined\" ? __dirname : undefined;\n    const nodeModulesParentDirs = getNodeModulesParentDirs(dirname);\n    let versionFromApp;\n    for (const nodeModulesParentDir of nodeModulesParentDirs) {\n        try {\n            const appPackageJsonPath = node_path.join(nodeModulesParentDir, \"package.json\");\n            const packageJson = await promises.readFile(appPackageJsonPath, \"utf-8\");\n            const { dependencies, devDependencies } = JSON.parse(packageJson);\n            const version = devDependencies?.typescript ?? dependencies?.typescript;\n            if (typeof version !== \"string\") {\n                continue;\n            }\n            versionFromApp = version;\n            break;\n        }\n        catch {\n        }\n    }\n    if (!versionFromApp) {\n        tscVersion = null;\n        return undefined;\n    }\n    let versionFromNodeModules;\n    for (const nodeModulesParentDir of nodeModulesParentDirs) {\n        try {\n            const tsPackageJsonPath = node_path.join(nodeModulesParentDir, TS_PACKAGE_JSON);\n            const packageJson = await promises.readFile(tsPackageJsonPath, \"utf-8\");\n            const { version } = JSON.parse(packageJson);\n            const sanitizedVersion = getSanitizedTypeScriptVersion(version);\n            if (typeof sanitizedVersion !== \"string\") {\n                continue;\n            }\n            versionFromNodeModules = sanitizedVersion;\n            break;\n        }\n        catch {\n        }\n    }\n    if (versionFromNodeModules) {\n        tscVersion = versionFromNodeModules;\n        return [\"md/tsc\", tscVersion];\n    }\n    const sanitizedVersion = getSanitizedDevTypeScriptVersion(versionFromApp);\n    if (typeof sanitizedVersion !== \"string\") {\n        tscVersion = null;\n        return undefined;\n    }\n    tscVersion = `dev_${sanitizedVersion}`;\n    return [\"md/tsc\", tscVersion];\n};\n\nconst crtAvailability = {\n    isCrtAvailable: false,\n};\n\nconst isCrtAvailable = () => {\n    if (crtAvailability.isCrtAvailable) {\n        return [\"md/crt-avail\"];\n    }\n    return null;\n};\n\nconst createDefaultUserAgentProvider = ({ serviceId, clientVersion }) => {\n    const runtimeUserAgentPair = getRuntimeUserAgentPair();\n    return async (config) => {\n        const sections = [\n            [\"aws-sdk-js\", clientVersion],\n            [\"ua\", \"2.1\"],\n            [`os/${node_os.platform()}`, node_os.release()],\n            [\"lang/js\"],\n            runtimeUserAgentPair,\n        ];\n        const typescriptUserAgentPair = await getTypeScriptUserAgentPair();\n        if (typescriptUserAgentPair) {\n            sections.push(typescriptUserAgentPair);\n        }\n        const crtAvailable = isCrtAvailable();\n        if (crtAvailable) {\n            sections.push(crtAvailable);\n        }\n        if (serviceId) {\n            sections.push([`api/${serviceId}`, clientVersion]);\n        }\n        if (node_process.env.AWS_EXECUTION_ENV) {\n            sections.push([`exec-env/${node_process.env.AWS_EXECUTION_ENV}`]);\n        }\n        const appId = await config?.userAgentAppId?.();\n        const resolvedUserAgent = appId ? [...sections, [`app/${appId}`]] : [...sections];\n        return resolvedUserAgent;\n    };\n};\nconst defaultUserAgent = createDefaultUserAgentProvider;\n\nconst UA_APP_ID_ENV_NAME = \"AWS_SDK_UA_APP_ID\";\nconst UA_APP_ID_INI_NAME = \"sdk_ua_app_id\";\nconst UA_APP_ID_INI_NAME_DEPRECATED = \"sdk-ua-app-id\";\nconst NODE_APP_ID_CONFIG_OPTIONS = {\n    environmentVariableSelector: (env) => env[UA_APP_ID_ENV_NAME],\n    configFileSelector: (profile) => profile[UA_APP_ID_INI_NAME] ?? profile[UA_APP_ID_INI_NAME_DEPRECATED],\n    default: middlewareUserAgent.DEFAULT_UA_APP_ID,\n};\n\nexports.NODE_APP_ID_CONFIG_OPTIONS = NODE_APP_ID_CONFIG_OPTIONS;\nexports.UA_APP_ID_ENV_NAME = UA_APP_ID_ENV_NAME;\nexports.UA_APP_ID_INI_NAME = UA_APP_ID_INI_NAME;\nexports.createDefaultUserAgentProvider = createDefaultUserAgentProvider;\nexports.crtAvailability = crtAvailability;\nexports.defaultUserAgent = defaultUserAgent;\n", "'use strict';\n\nvar utilBufferFrom = require('@smithy/util-buffer-from');\nvar utilUtf8 = require('@smithy/util-utf8');\nvar buffer = require('buffer');\nvar crypto = require('crypto');\n\nclass Hash {\n    algorithmIdentifier;\n    secret;\n    hash;\n    constructor(algorithmIdentifier, secret) {\n        this.algorithmIdentifier = algorithmIdentifier;\n        this.secret = secret;\n        this.reset();\n    }\n    update(toHash, encoding) {\n        this.hash.update(utilUtf8.toUint8Array(castSourceData(toHash, encoding)));\n    }\n    digest() {\n        return Promise.resolve(this.hash.digest());\n    }\n    reset() {\n        this.hash = this.secret\n            ? crypto.createHmac(this.algorithmIdentifier, castSourceData(this.secret))\n            : crypto.createHash(this.algorithmIdentifier);\n    }\n}\nfunction castSourceData(toCast, encoding) {\n    if (buffer.Buffer.isBuffer(toCast)) {\n        return toCast;\n    }\n    if (typeof toCast === \"string\") {\n        return utilBufferFrom.fromString(toCast, encoding);\n    }\n    if (ArrayBuffer.isView(toCast)) {\n        return utilBufferFrom.fromArrayBuffer(toCast.buffer, toCast.byteOffset, toCast.byteLength);\n    }\n    return utilBufferFrom.fromArrayBuffer(toCast);\n}\n\nexports.Hash = Hash;\n", "'use strict';\n\nvar node_fs = require('node:fs');\n\nconst calculateBodyLength = (body) => {\n    if (!body) {\n        return 0;\n    }\n    if (typeof body === \"string\") {\n        return Buffer.byteLength(body);\n    }\n    else if (typeof body.byteLength === \"number\") {\n        return body.byteLength;\n    }\n    else if (typeof body.size === \"number\") {\n        return body.size;\n    }\n    else if (typeof body.start === \"number\" && typeof body.end === \"number\") {\n        return body.end + 1 - body.start;\n    }\n    else if (body instanceof node_fs.ReadStream) {\n        if (body.path != null) {\n            return node_fs.lstatSync(body.path).size;\n        }\n        else if (typeof body.fd === \"number\") {\n            return node_fs.fstatSync(body.fd).size;\n        }\n    }\n    throw new Error(`Body Length computation failed for ${body}`);\n};\n\nexports.calculateBodyLength = calculateBodyLength;\n", "'use strict';\n\nvar configResolver = require('@smithy/config-resolver');\nvar nodeConfigProvider = require('@smithy/node-config-provider');\nvar propertyProvider = require('@smithy/property-provider');\n\nconst AWS_EXECUTION_ENV = \"AWS_EXECUTION_ENV\";\nconst AWS_REGION_ENV = \"AWS_REGION\";\nconst AWS_DEFAULT_REGION_ENV = \"AWS_DEFAULT_REGION\";\nconst ENV_IMDS_DISABLED = \"AWS_EC2_METADATA_DISABLED\";\nconst DEFAULTS_MODE_OPTIONS = [\"in-region\", \"cross-region\", \"mobile\", \"standard\", \"legacy\"];\nconst IMDS_REGION_PATH = \"/latest/meta-data/placement/region\";\n\nconst AWS_DEFAULTS_MODE_ENV = \"AWS_DEFAULTS_MODE\";\nconst AWS_DEFAULTS_MODE_CONFIG = \"defaults_mode\";\nconst NODE_DEFAULTS_MODE_CONFIG_OPTIONS = {\n    environmentVariableSelector: (env) => {\n        return env[AWS_DEFAULTS_MODE_ENV];\n    },\n    configFileSelector: (profile) => {\n        return profile[AWS_DEFAULTS_MODE_CONFIG];\n    },\n    default: \"legacy\",\n};\n\nconst resolveDefaultsModeConfig = ({ region = nodeConfigProvider.loadConfig(configResolver.NODE_REGION_CONFIG_OPTIONS), defaultsMode = nodeConfigProvider.loadConfig(NODE_DEFAULTS_MODE_CONFIG_OPTIONS), } = {}) => propertyProvider.memoize(async () => {\n    const mode = typeof defaultsMode === \"function\" ? await defaultsMode() : defaultsMode;\n    switch (mode?.toLowerCase()) {\n        case \"auto\":\n            return resolveNodeDefaultsModeAuto(region);\n        case \"in-region\":\n        case \"cross-region\":\n        case \"mobile\":\n        case \"standard\":\n        case \"legacy\":\n            return Promise.resolve(mode?.toLocaleLowerCase());\n        case undefined:\n            return Promise.resolve(\"legacy\");\n        default:\n            throw new Error(`Invalid parameter for \"defaultsMode\", expect ${DEFAULTS_MODE_OPTIONS.join(\", \")}, got ${mode}`);\n    }\n});\nconst resolveNodeDefaultsModeAuto = async (clientRegion) => {\n    if (clientRegion) {\n        const resolvedRegion = typeof clientRegion === \"function\" ? await clientRegion() : clientRegion;\n        const inferredRegion = await inferPhysicalRegion();\n        if (!inferredRegion) {\n            return \"standard\";\n        }\n        if (resolvedRegion === inferredRegion) {\n            return \"in-region\";\n        }\n        else {\n            return \"cross-region\";\n        }\n    }\n    return \"standard\";\n};\nconst inferPhysicalRegion = async () => {\n    if (process.env[AWS_EXECUTION_ENV] && (process.env[AWS_REGION_ENV] || process.env[AWS_DEFAULT_REGION_ENV])) {\n        return process.env[AWS_REGION_ENV] ?? process.env[AWS_DEFAULT_REGION_ENV];\n    }\n    if (!process.env[ENV_IMDS_DISABLED]) {\n        try {\n            const { getInstanceMetadataEndpoint, httpRequest } = await import('@smithy/credential-provider-imds');\n            const endpoint = await getInstanceMetadataEndpoint();\n            return (await httpRequest({ ...endpoint, path: IMDS_REGION_PATH })).toString();\n        }\n        catch (e) {\n        }\n    }\n};\n\nexports.resolveDefaultsModeConfig = resolveDefaultsModeConfig;\n", "export const majorUint64 = 0;\nexport const majorNegativeInt64 = 1;\nexport const majorUnstructuredByteString = 2;\nexport const majorUtf8String = 3;\nexport const majorList = 4;\nexport const majorMap = 5;\nexport const majorTag = 6;\nexport const majorSpecial = 7;\nexport const specialFalse = 20;\nexport const specialTrue = 21;\nexport const specialNull = 22;\nexport const specialUndefined = 23;\nexport const extendedOneByte = 24;\nexport const extendedFloat16 = 25;\nexport const extendedFloat32 = 26;\nexport const extendedFloat64 = 27;\nexport const minorIndefinite = 31;\nexport function alloc(size) {\n    return typeof Buffer !== \"undefined\" ? Buffer.alloc(size) : new Uint8Array(size);\n}\nexport const tagSymbol = Symbol(\"@smithy/core/cbor::tagSymbol\");\nexport function tag(data) {\n    data[tagSymbol] = true;\n    return data;\n}\n", "import { nv } from \"@smithy/core/serde\";\nimport { toUtf8 } from \"@smithy/util-utf8\";\nimport { alloc, extendedFloat16, extendedFloat32, extendedFloat64, extendedOneByte, majorList, majorMap, majorNegativeInt64, majorTag, majorUint64, majorUnstructuredByteString, majorUtf8String, minorIndefinite, specialFalse, specialNull, specialTrue, specialUndefined, tag, } from \"./cbor-types\";\nconst USE_TEXT_DECODER = typeof TextDecoder !== \"undefined\";\nconst USE_BUFFER = typeof Buffer !== \"undefined\";\nlet payload = alloc(0);\nlet dataView = new DataView(payload.buffer, payload.byteOffset, payload.byteLength);\nconst textDecoder = USE_TEXT_DECODER ? new TextDecoder() : null;\nlet _offset = 0;\nexport function setPayload(bytes) {\n    payload = bytes;\n    dataView = new DataView(payload.buffer, payload.byteOffset, payload.byteLength);\n}\nexport function decode(at, to) {\n    if (at >= to) {\n        throw new Error(\"unexpected end of (decode) payload.\");\n    }\n    const major = (payload[at] & 0b1110_0000) >> 5;\n    const minor = payload[at] & 0b0001_1111;\n    switch (major) {\n        case majorUint64:\n        case majorNegativeInt64:\n        case majorTag:\n            let unsignedInt;\n            let offset;\n            if (minor < 24) {\n                unsignedInt = minor;\n                offset = 1;\n            }\n            else {\n                switch (minor) {\n                    case extendedOneByte:\n                    case extendedFloat16:\n                    case extendedFloat32:\n                    case extendedFloat64:\n                        const countLength = minorValueToArgumentLength[minor];\n                        const countOffset = (countLength + 1);\n                        offset = countOffset;\n                        if (to - at < countOffset) {\n                            throw new Error(`countLength ${countLength} greater than remaining buf len.`);\n                        }\n                        const countIndex = at + 1;\n                        if (countLength === 1) {\n                            unsignedInt = payload[countIndex];\n                        }\n                        else if (countLength === 2) {\n                            unsignedInt = dataView.getUint16(countIndex);\n                        }\n                        else if (countLength === 4) {\n                            unsignedInt = dataView.getUint32(countIndex);\n                        }\n                        else {\n                            unsignedInt = dataView.getBigUint64(countIndex);\n                        }\n                        break;\n                    default:\n                        throw new Error(`unexpected minor value ${minor}.`);\n                }\n            }\n            if (major === majorUint64) {\n                _offset = offset;\n                return castBigInt(unsignedInt);\n            }\n            else if (major === majorNegativeInt64) {\n                let negativeInt;\n                if (typeof unsignedInt === \"bigint\") {\n                    negativeInt = BigInt(-1) - unsignedInt;\n                }\n                else {\n                    negativeInt = -1 - unsignedInt;\n                }\n                _offset = offset;\n                return castBigInt(negativeInt);\n            }\n            else {\n                if (minor === 2 || minor === 3) {\n                    const length = decodeCount(at + offset, to);\n                    let b = BigInt(0);\n                    const start = at + offset + _offset;\n                    for (let i = start; i < start + length; ++i) {\n                        b = (b << BigInt(8)) | BigInt(payload[i]);\n                    }\n                    _offset = offset + _offset + length;\n                    return minor === 3 ? -b - BigInt(1) : b;\n                }\n                else if (minor === 4) {\n                    const decimalFraction = decode(at + offset, to);\n                    const [exponent, mantissa] = decimalFraction;\n                    const normalizer = mantissa < 0 ? -1 : 1;\n                    const mantissaStr = \"0\".repeat(Math.abs(exponent) + 1) + String(BigInt(normalizer) * BigInt(mantissa));\n                    let numericString;\n                    const sign = mantissa < 0 ? \"-\" : \"\";\n                    numericString =\n                        exponent === 0\n                            ? mantissaStr\n                            : mantissaStr.slice(0, mantissaStr.length + exponent) + \".\" + mantissaStr.slice(exponent);\n                    numericString = numericString.replace(/^0+/g, \"\");\n                    if (numericString === \"\") {\n                        numericString = \"0\";\n                    }\n                    if (numericString[0] === \".\") {\n                        numericString = \"0\" + numericString;\n                    }\n                    numericString = sign + numericString;\n                    _offset = offset + _offset;\n                    return nv(numericString);\n                }\n                else {\n                    const value = decode(at + offset, to);\n                    const valueOffset = _offset;\n                    _offset = offset + valueOffset;\n                    return tag({ tag: castBigInt(unsignedInt), value });\n                }\n            }\n        case majorUtf8String:\n        case majorMap:\n        case majorList:\n        case majorUnstructuredByteString:\n            if (minor === minorIndefinite) {\n                switch (major) {\n                    case majorUtf8String:\n                        return decodeUtf8StringIndefinite(at, to);\n                    case majorMap:\n                        return decodeMapIndefinite(at, to);\n                    case majorList:\n                        return decodeListIndefinite(at, to);\n                    case majorUnstructuredByteString:\n                        return decodeUnstructuredByteStringIndefinite(at, to);\n                }\n            }\n            else {\n                switch (major) {\n                    case majorUtf8String:\n                        return decodeUtf8String(at, to);\n                    case majorMap:\n                        return decodeMap(at, to);\n                    case majorList:\n                        return decodeList(at, to);\n                    case majorUnstructuredByteString:\n                        return decodeUnstructuredByteString(at, to);\n                }\n            }\n        default:\n            return decodeSpecial(at, to);\n    }\n}\nfunction bytesToUtf8(bytes, at, to) {\n    if (USE_BUFFER && bytes.constructor?.name === \"Buffer\") {\n        return bytes.toString(\"utf-8\", at, to);\n    }\n    if (textDecoder) {\n        return textDecoder.decode(bytes.subarray(at, to));\n    }\n    return toUtf8(bytes.subarray(at, to));\n}\nfunction demote(bigInteger) {\n    const num = Number(bigInteger);\n    if (num < Number.MIN_SAFE_INTEGER || Number.MAX_SAFE_INTEGER < num) {\n        console.warn(new Error(`@smithy/core/cbor - truncating BigInt(${bigInteger}) to ${num} with loss of precision.`));\n    }\n    return num;\n}\nconst minorValueToArgumentLength = {\n    [extendedOneByte]: 1,\n    [extendedFloat16]: 2,\n    [extendedFloat32]: 4,\n    [extendedFloat64]: 8,\n};\nexport function bytesToFloat16(a, b) {\n    const sign = a >> 7;\n    const exponent = (a & 0b0111_1100) >> 2;\n    const fraction = ((a & 0b0000_0011) << 8) | b;\n    const scalar = sign === 0 ? 1 : -1;\n    let exponentComponent;\n    let summation;\n    if (exponent === 0b00000) {\n        if (fraction === 0b00000_00000) {\n            return 0;\n        }\n        else {\n            exponentComponent = Math.pow(2, 1 - 15);\n            summation = 0;\n        }\n    }\n    else if (exponent === 0b11111) {\n        if (fraction === 0b00000_00000) {\n            return scalar * Infinity;\n        }\n        else {\n            return NaN;\n        }\n    }\n    else {\n        exponentComponent = Math.pow(2, exponent - 15);\n        summation = 1;\n    }\n    summation += fraction / 1024;\n    return scalar * (exponentComponent * summation);\n}\nfunction decodeCount(at, to) {\n    const minor = payload[at] & 0b0001_1111;\n    if (minor < 24) {\n        _offset = 1;\n        return minor;\n    }\n    if (minor === extendedOneByte ||\n        minor === extendedFloat16 ||\n        minor === extendedFloat32 ||\n        minor === extendedFloat64) {\n        const countLength = minorValueToArgumentLength[minor];\n        _offset = (countLength + 1);\n        if (to - at < _offset) {\n            throw new Error(`countLength ${countLength} greater than remaining buf len.`);\n        }\n        const countIndex = at + 1;\n        if (countLength === 1) {\n            return payload[countIndex];\n        }\n        else if (countLength === 2) {\n            return dataView.getUint16(countIndex);\n        }\n        else if (countLength === 4) {\n            return dataView.getUint32(countIndex);\n        }\n        return demote(dataView.getBigUint64(countIndex));\n    }\n    throw new Error(`unexpected minor value ${minor}.`);\n}\nfunction decodeUtf8String(at, to) {\n    const length = decodeCount(at, to);\n    const offset = _offset;\n    at += offset;\n    if (to - at < length) {\n        throw new Error(`string len ${length} greater than remaining buf len.`);\n    }\n    const value = bytesToUtf8(payload, at, at + length);\n    _offset = offset + length;\n    return value;\n}\nfunction decodeUtf8StringIndefinite(at, to) {\n    at += 1;\n    const vector = [];\n    for (const base = at; at < to;) {\n        if (payload[at] === 0b1111_1111) {\n            const data = alloc(vector.length);\n            data.set(vector, 0);\n            _offset = at - base + 2;\n            return bytesToUtf8(data, 0, data.length);\n        }\n        const major = (payload[at] & 0b1110_0000) >> 5;\n        const minor = payload[at] & 0b0001_1111;\n        if (major !== majorUtf8String) {\n            throw new Error(`unexpected major type ${major} in indefinite string.`);\n        }\n        if (minor === minorIndefinite) {\n            throw new Error(\"nested indefinite string.\");\n        }\n        const bytes = decodeUnstructuredByteString(at, to);\n        const length = _offset;\n        at += length;\n        for (let i = 0; i < bytes.length; ++i) {\n            vector.push(bytes[i]);\n        }\n    }\n    throw new Error(\"expected break marker.\");\n}\nfunction decodeUnstructuredByteString(at, to) {\n    const length = decodeCount(at, to);\n    const offset = _offset;\n    at += offset;\n    if (to - at < length) {\n        throw new Error(`unstructured byte string len ${length} greater than remaining buf len.`);\n    }\n    const value = payload.subarray(at, at + length);\n    _offset = offset + length;\n    return value;\n}\nfunction decodeUnstructuredByteStringIndefinite(at, to) {\n    at += 1;\n    const vector = [];\n    for (const base = at; at < to;) {\n        if (payload[at] === 0b1111_1111) {\n            const data = alloc(vector.length);\n            data.set(vector, 0);\n            _offset = at - base + 2;\n            return data;\n        }\n        const major = (payload[at] & 0b1110_0000) >> 5;\n        const minor = payload[at] & 0b0001_1111;\n        if (major !== majorUnstructuredByteString) {\n            throw new Error(`unexpected major type ${major} in indefinite string.`);\n        }\n        if (minor === minorIndefinite) {\n            throw new Error(\"nested indefinite string.\");\n        }\n        const bytes = decodeUnstructuredByteString(at, to);\n        const length = _offset;\n        at += length;\n        for (let i = 0; i < bytes.length; ++i) {\n            vector.push(bytes[i]);\n        }\n    }\n    throw new Error(\"expected break marker.\");\n}\nfunction decodeList(at, to) {\n    const listDataLength = decodeCount(at, to);\n    const offset = _offset;\n    at += offset;\n    const base = at;\n    const list = Array(listDataLength);\n    for (let i = 0; i < listDataLength; ++i) {\n        const item = decode(at, to);\n        const itemOffset = _offset;\n        list[i] = item;\n        at += itemOffset;\n    }\n    _offset = offset + (at - base);\n    return list;\n}\nfunction decodeListIndefinite(at, to) {\n    at += 1;\n    const list = [];\n    for (const base = at; at < to;) {\n        if (payload[at] === 0b1111_1111) {\n            _offset = at - base + 2;\n            return list;\n        }\n        const item = decode(at, to);\n        const n = _offset;\n        at += n;\n        list.push(item);\n    }\n    throw new Error(\"expected break marker.\");\n}\nfunction decodeMap(at, to) {\n    const mapDataLength = decodeCount(at, to);\n    const offset = _offset;\n    at += offset;\n    const base = at;\n    const map = {};\n    for (let i = 0; i < mapDataLength; ++i) {\n        if (at >= to) {\n            throw new Error(\"unexpected end of map payload.\");\n        }\n        const major = (payload[at] & 0b1110_0000) >> 5;\n        if (major !== majorUtf8String) {\n            throw new Error(`unexpected major type ${major} for map key at index ${at}.`);\n        }\n        const key = decode(at, to);\n        at += _offset;\n        const value = decode(at, to);\n        at += _offset;\n        map[key] = value;\n    }\n    _offset = offset + (at - base);\n    return map;\n}\nfunction decodeMapIndefinite(at, to) {\n    at += 1;\n    const base = at;\n    const map = {};\n    for (; at < to;) {\n        if (at >= to) {\n            throw new Error(\"unexpected end of map payload.\");\n        }\n        if (payload[at] === 0b1111_1111) {\n            _offset = at - base + 2;\n            return map;\n        }\n        const major = (payload[at] & 0b1110_0000) >> 5;\n        if (major !== majorUtf8String) {\n            throw new Error(`unexpected major type ${major} for map key.`);\n        }\n        const key = decode(at, to);\n        at += _offset;\n        const value = decode(at, to);\n        at += _offset;\n        map[key] = value;\n    }\n    throw new Error(\"expected break marker.\");\n}\nfunction decodeSpecial(at, to) {\n    const minor = payload[at] & 0b0001_1111;\n    switch (minor) {\n        case specialTrue:\n        case specialFalse:\n            _offset = 1;\n            return minor === specialTrue;\n        case specialNull:\n            _offset = 1;\n            return null;\n        case specialUndefined:\n            _offset = 1;\n            return null;\n        case extendedFloat16:\n            if (to - at < 3) {\n                throw new Error(\"incomplete float16 at end of buf.\");\n            }\n            _offset = 3;\n            return bytesToFloat16(payload[at + 1], payload[at + 2]);\n        case extendedFloat32:\n            if (to - at < 5) {\n                throw new Error(\"incomplete float32 at end of buf.\");\n            }\n            _offset = 5;\n            return dataView.getFloat32(at + 1);\n        case extendedFloat64:\n            if (to - at < 9) {\n                throw new Error(\"incomplete float64 at end of buf.\");\n            }\n            _offset = 9;\n            return dataView.getFloat64(at + 1);\n        default:\n            throw new Error(`unexpected minor value ${minor}.`);\n    }\n}\nfunction castBigInt(bigInt) {\n    if (typeof bigInt === \"number\") {\n        return bigInt;\n    }\n    const num = Number(bigInt);\n    if (Number.MIN_SAFE_INTEGER <= num && num <= Number.MAX_SAFE_INTEGER) {\n        return num;\n    }\n    return bigInt;\n}\n", "import { NumericValue } from \"@smithy/core/serde\";\nimport { fromUtf8 } from \"@smithy/util-utf8\";\nimport { alloc, extendedFloat16, extendedFloat32, extendedFloat64, majorList, majorMap, majorNegativeInt64, majorSpecial, majorTag, majorUint64, majorUnstructuredByteString, majorUtf8String, specialFalse, specialNull, specialTrue, tagSymbol, } from \"./cbor-types\";\nconst USE_BUFFER = typeof Buffer !== \"undefined\";\nconst initialSize = 2048;\nlet data = alloc(initialSize);\nlet dataView = new DataView(data.buffer, data.byteOffset, data.byteLength);\nlet cursor = 0;\nfunction ensureSpace(bytes) {\n    const remaining = data.byteLength - cursor;\n    if (remaining < bytes) {\n        if (cursor < 16_000_000) {\n            resize(Math.max(data.byteLength * 4, data.byteLength + bytes));\n        }\n        else {\n            resize(data.byteLength + bytes + 16_000_000);\n        }\n    }\n}\nexport function toUint8Array() {\n    const out = alloc(cursor);\n    out.set(data.subarray(0, cursor), 0);\n    cursor = 0;\n    return out;\n}\nexport function resize(size) {\n    const old = data;\n    data = alloc(size);\n    if (old) {\n        if (old.copy) {\n            old.copy(data, 0, 0, old.byteLength);\n        }\n        else {\n            data.set(old, 0);\n        }\n    }\n    dataView = new DataView(data.buffer, data.byteOffset, data.byteLength);\n}\nfunction encodeHeader(major, value) {\n    if (value < 24) {\n        data[cursor++] = (major << 5) | value;\n    }\n    else if (value < 1 << 8) {\n        data[cursor++] = (major << 5) | 24;\n        data[cursor++] = value;\n    }\n    else if (value < 1 << 16) {\n        data[cursor++] = (major << 5) | extendedFloat16;\n        dataView.setUint16(cursor, value);\n        cursor += 2;\n    }\n    else if (value < 2 ** 32) {\n        data[cursor++] = (major << 5) | extendedFloat32;\n        dataView.setUint32(cursor, value);\n        cursor += 4;\n    }\n    else {\n        data[cursor++] = (major << 5) | extendedFloat64;\n        dataView.setBigUint64(cursor, typeof value === \"bigint\" ? value : BigInt(value));\n        cursor += 8;\n    }\n}\nexport function encode(_input) {\n    const encodeStack = [_input];\n    while (encodeStack.length) {\n        const input = encodeStack.pop();\n        ensureSpace(typeof input === \"string\" ? input.length * 4 : 64);\n        if (typeof input === \"string\") {\n            if (USE_BUFFER) {\n                encodeHeader(majorUtf8String, Buffer.byteLength(input));\n                cursor += data.write(input, cursor);\n            }\n            else {\n                const bytes = fromUtf8(input);\n                encodeHeader(majorUtf8String, bytes.byteLength);\n                data.set(bytes, cursor);\n                cursor += bytes.byteLength;\n            }\n            continue;\n        }\n        else if (typeof input === \"number\") {\n            if (Number.isInteger(input)) {\n                const nonNegative = input >= 0;\n                const major = nonNegative ? majorUint64 : majorNegativeInt64;\n                const value = nonNegative ? input : -input - 1;\n                if (value < 24) {\n                    data[cursor++] = (major << 5) | value;\n                }\n                else if (value < 256) {\n                    data[cursor++] = (major << 5) | 24;\n                    data[cursor++] = value;\n                }\n                else if (value < 65536) {\n                    data[cursor++] = (major << 5) | extendedFloat16;\n                    data[cursor++] = value >> 8;\n                    data[cursor++] = value;\n                }\n                else if (value < 4294967296) {\n                    data[cursor++] = (major << 5) | extendedFloat32;\n                    dataView.setUint32(cursor, value);\n                    cursor += 4;\n                }\n                else {\n                    data[cursor++] = (major << 5) | extendedFloat64;\n                    dataView.setBigUint64(cursor, BigInt(value));\n                    cursor += 8;\n                }\n                continue;\n            }\n            data[cursor++] = (majorSpecial << 5) | extendedFloat64;\n            dataView.setFloat64(cursor, input);\n            cursor += 8;\n            continue;\n        }\n        else if (typeof input === \"bigint\") {\n            const nonNegative = input >= 0;\n            const major = nonNegative ? majorUint64 : majorNegativeInt64;\n            const value = nonNegative ? input : -input - BigInt(1);\n            const n = Number(value);\n            if (n < 24) {\n                data[cursor++] = (major << 5) | n;\n            }\n            else if (n < 256) {\n                data[cursor++] = (major << 5) | 24;\n                data[cursor++] = n;\n            }\n            else if (n < 65536) {\n                data[cursor++] = (major << 5) | extendedFloat16;\n                data[cursor++] = n >> 8;\n                data[cursor++] = n & 0b1111_1111;\n            }\n            else if (n < 4294967296) {\n                data[cursor++] = (major << 5) | extendedFloat32;\n                dataView.setUint32(cursor, n);\n                cursor += 4;\n            }\n            else if (value < BigInt(\"18446744073709551616\")) {\n                data[cursor++] = (major << 5) | extendedFloat64;\n                dataView.setBigUint64(cursor, value);\n                cursor += 8;\n            }\n            else {\n                const binaryBigInt = value.toString(2);\n                const bigIntBytes = new Uint8Array(Math.ceil(binaryBigInt.length / 8));\n                let b = value;\n                let i = 0;\n                while (bigIntBytes.byteLength - ++i >= 0) {\n                    bigIntBytes[bigIntBytes.byteLength - i] = Number(b & BigInt(255));\n                    b >>= BigInt(8);\n                }\n                ensureSpace(bigIntBytes.byteLength * 2);\n                data[cursor++] = nonNegative ? 0b110_00010 : 0b110_00011;\n                if (USE_BUFFER) {\n                    encodeHeader(majorUnstructuredByteString, Buffer.byteLength(bigIntBytes));\n                }\n                else {\n                    encodeHeader(majorUnstructuredByteString, bigIntBytes.byteLength);\n                }\n                data.set(bigIntBytes, cursor);\n                cursor += bigIntBytes.byteLength;\n            }\n            continue;\n        }\n        else if (input === null) {\n            data[cursor++] = (majorSpecial << 5) | specialNull;\n            continue;\n        }\n        else if (typeof input === \"boolean\") {\n            data[cursor++] = (majorSpecial << 5) | (input ? specialTrue : specialFalse);\n            continue;\n        }\n        else if (typeof input === \"undefined\") {\n            throw new Error(\"@smithy/core/cbor: client may not serialize undefined value.\");\n        }\n        else if (Array.isArray(input)) {\n            for (let i = input.length - 1; i >= 0; --i) {\n                encodeStack.push(input[i]);\n            }\n            encodeHeader(majorList, input.length);\n            continue;\n        }\n        else if (typeof input.byteLength === \"number\") {\n            ensureSpace(input.length * 2);\n            encodeHeader(majorUnstructuredByteString, input.length);\n            data.set(input, cursor);\n            cursor += input.byteLength;\n            continue;\n        }\n        else if (typeof input === \"object\") {\n            if (input instanceof NumericValue) {\n                const decimalIndex = input.string.indexOf(\".\");\n                const exponent = decimalIndex === -1 ? 0 : decimalIndex - input.string.length + 1;\n                const mantissa = BigInt(input.string.replace(\".\", \"\"));\n                data[cursor++] = 0b110_00100;\n                encodeStack.push(mantissa);\n                encodeStack.push(exponent);\n                encodeHeader(majorList, 2);\n                continue;\n            }\n            if (input[tagSymbol]) {\n                if (\"tag\" in input && \"value\" in input) {\n                    encodeStack.push(input.value);\n                    encodeHeader(majorTag, input.tag);\n                    continue;\n                }\n                else {\n                    throw new Error(\"tag encountered with missing fields, need 'tag' and 'value', found: \" + JSON.stringify(input));\n                }\n            }\n            const keys = Object.keys(input);\n            for (let i = keys.length - 1; i >= 0; --i) {\n                const key = keys[i];\n                encodeStack.push(input[key]);\n                encodeStack.push(key);\n            }\n            encodeHeader(majorMap, keys.length);\n            continue;\n        }\n        throw new Error(`data type ${input?.constructor?.name ?? typeof input} not compatible for encoding.`);\n    }\n}\n", "import { decode, setPayload } from \"./cbor-decode\";\nimport { encode, resize, toUint8Array } from \"./cbor-encode\";\nexport const cbor = {\n    deserialize(payload) {\n        setPayload(payload);\n        return decode(0, payload.length);\n    },\n    serialize(input) {\n        try {\n            encode(input);\n            return toUint8Array();\n        }\n        catch (e) {\n            toUint8Array();\n            throw e;\n        }\n    },\n    resizeEncodingBuffer(size) {\n        resize(size);\n    },\n};\n", "import { collectBody } from \"@smithy/core/protocols\";\nimport { HttpRequest as __HttpRequest } from \"@smithy/protocol-http\";\nimport { calculateBodyLength } from \"@smithy/util-body-length-browser\";\nimport { cbor } from \"./cbor\";\nimport { tag } from \"./cbor-types\";\nexport const parseCborBody = (streamBody, context) => {\n    return collectBody(streamBody, context).then(async (bytes) => {\n        if (bytes.length) {\n            try {\n                return cbor.deserialize(bytes);\n            }\n            catch (e) {\n                Object.defineProperty(e, \"$responseBodyText\", {\n                    value: context.utf8Encoder(bytes),\n                });\n                throw e;\n            }\n        }\n        return {};\n    });\n};\nexport const dateToTag = (date) => {\n    return tag({\n        tag: 1,\n        value: date.getTime() / 1000,\n    });\n};\nexport const parseCborErrorBody = async (errorBody, context) => {\n    const value = await parseCborBody(errorBody, context);\n    value.message = value.message ?? value.Message;\n    return value;\n};\nexport const loadSmithyRpcV2CborErrorCode = (output, data) => {\n    const sanitizeErrorCode = (rawValue) => {\n        let cleanValue = rawValue;\n        if (typeof cleanValue === \"number\") {\n            cleanValue = cleanValue.toString();\n        }\n        if (cleanValue.indexOf(\",\") >= 0) {\n            cleanValue = cleanValue.split(\",\")[0];\n        }\n        if (cleanValue.indexOf(\":\") >= 0) {\n            cleanValue = cleanValue.split(\":\")[0];\n        }\n        if (cleanValue.indexOf(\"#\") >= 0) {\n            cleanValue = cleanValue.split(\"#\")[1];\n        }\n        return cleanValue;\n    };\n    if (data[\"__type\"] !== undefined) {\n        return sanitizeErrorCode(data[\"__type\"]);\n    }\n    let codeKey;\n    for (const key in data) {\n        if (key.toLowerCase() === \"code\") {\n            codeKey = key;\n            break;\n        }\n    }\n    if (codeKey && data[codeKey] !== undefined) {\n        return sanitizeErrorCode(data[codeKey]);\n    }\n};\nexport const checkCborResponse = (response) => {\n    if (String(response.headers[\"smithy-protocol\"]).toLowerCase() !== \"rpc-v2-cbor\") {\n        throw new Error(\"Malformed RPCv2 CBOR response, status: \" + response.statusCode);\n    }\n};\nexport const buildHttpRpcRequest = async (context, headers, path, resolvedHostname, body) => {\n    const endpoint = await context.endpoint();\n    const { hostname, protocol = \"https\", port, path: basePath } = endpoint;\n    const contents = {\n        protocol,\n        hostname,\n        port,\n        method: \"POST\",\n        path: basePath.endsWith(\"/\") ? basePath.slice(0, -1) + path : basePath + path,\n        headers: {\n            ...headers,\n        },\n    };\n    if (resolvedHostname !== undefined) {\n        contents.hostname = resolvedHostname;\n    }\n    if (endpoint.headers) {\n        for (const name in endpoint.headers) {\n            contents.headers[name] = endpoint.headers[name];\n        }\n    }\n    if (body !== undefined) {\n        contents.body = body;\n        try {\n            contents.headers[\"content-length\"] = String(calculateBodyLength(body));\n        }\n        catch (e) { }\n    }\n    return new __HttpRequest(contents);\n};\n", "import { SerdeContext } from \"@smithy/core/protocols\";\nimport { NormalizedSchema } from \"@smithy/core/schema\";\nimport { _parseEpochTimestamp, generateIdempotencyToken } from \"@smithy/core/serde\";\nimport { NumericValue } from \"@smithy/core/serde\";\nimport { fromBase64 } from \"@smithy/util-base64\";\nimport { cbor } from \"./cbor\";\nimport { dateToTag } from \"./parseCborBody\";\nexport class CborCodec extends SerdeContext {\n    createSerializer() {\n        const serializer = new CborShapeSerializer();\n        serializer.setSerdeContext(this.serdeContext);\n        return serializer;\n    }\n    createDeserializer() {\n        const deserializer = new CborShapeDeserializer();\n        deserializer.setSerdeContext(this.serdeContext);\n        return deserializer;\n    }\n}\nexport class CborShapeSerializer extends SerdeContext {\n    value;\n    write(schema, value) {\n        this.value = this.serialize(schema, value);\n    }\n    serialize(schema, source) {\n        const ns = NormalizedSchema.of(schema);\n        if (source == null) {\n            if (ns.isIdempotencyToken()) {\n                return generateIdempotencyToken();\n            }\n            return source;\n        }\n        if (ns.isBlobSchema()) {\n            if (typeof source === \"string\") {\n                return (this.serdeContext?.base64Decoder ?? fromBase64)(source);\n            }\n            return source;\n        }\n        if (ns.isTimestampSchema()) {\n            if (typeof source === \"number\" || typeof source === \"bigint\") {\n                return dateToTag(new Date((Number(source) / 1000) | 0));\n            }\n            return dateToTag(source);\n        }\n        if (typeof source === \"function\" || typeof source === \"object\") {\n            const sourceObject = source;\n            if (ns.isListSchema() && Array.isArray(sourceObject)) {\n                const sparse = !!ns.getMergedTraits().sparse;\n                const newArray = [];\n                let i = 0;\n                for (const item of sourceObject) {\n                    const value = this.serialize(ns.getValueSchema(), item);\n                    if (value != null || sparse) {\n                        newArray[i++] = value;\n                    }\n                }\n                return newArray;\n            }\n            if (sourceObject instanceof Date) {\n                return dateToTag(sourceObject);\n            }\n            const newObject = {};\n            if (ns.isMapSchema()) {\n                const sparse = !!ns.getMergedTraits().sparse;\n                for (const key in sourceObject) {\n                    const value = this.serialize(ns.getValueSchema(), sourceObject[key]);\n                    if (value != null || sparse) {\n                        newObject[key] = value;\n                    }\n                }\n            }\n            else if (ns.isStructSchema()) {\n                for (const [key, memberSchema] of ns.structIterator()) {\n                    const value = this.serialize(memberSchema, sourceObject[key]);\n                    if (value != null) {\n                        newObject[key] = value;\n                    }\n                }\n                const isUnion = ns.isUnionSchema();\n                if (isUnion && Array.isArray(sourceObject.$unknown)) {\n                    const [k, v] = sourceObject.$unknown;\n                    newObject[k] = v;\n                }\n                else if (typeof sourceObject.__type === \"string\") {\n                    for (const k in sourceObject) {\n                        if (!(k in newObject)) {\n                            newObject[k] = this.serialize(15, sourceObject[k]);\n                        }\n                    }\n                }\n            }\n            else if (ns.isDocumentSchema()) {\n                for (const key in sourceObject) {\n                    newObject[key] = this.serialize(ns.getValueSchema(), sourceObject[key]);\n                }\n            }\n            else if (ns.isBigDecimalSchema()) {\n                return sourceObject;\n            }\n            return newObject;\n        }\n        return source;\n    }\n    flush() {\n        const buffer = cbor.serialize(this.value);\n        this.value = undefined;\n        return buffer;\n    }\n}\nexport class CborShapeDeserializer extends SerdeContext {\n    read(schema, bytes) {\n        const data = cbor.deserialize(bytes);\n        return this.readValue(schema, data);\n    }\n    readValue(_schema, value) {\n        const ns = NormalizedSchema.of(_schema);\n        if (ns.isTimestampSchema()) {\n            if (typeof value === \"number\") {\n                return _parseEpochTimestamp(value);\n            }\n            if (typeof value === \"object\") {\n                if (value.tag === 1 && \"value\" in value) {\n                    return _parseEpochTimestamp(value.value);\n                }\n            }\n        }\n        if (ns.isBlobSchema()) {\n            if (typeof value === \"string\") {\n                return (this.serdeContext?.base64Decoder ?? fromBase64)(value);\n            }\n            return value;\n        }\n        if (typeof value === \"undefined\" ||\n            typeof value === \"boolean\" ||\n            typeof value === \"number\" ||\n            typeof value === \"string\" ||\n            typeof value === \"bigint\" ||\n            typeof value === \"symbol\") {\n            return value;\n        }\n        else if (typeof value === \"object\") {\n            if (value === null) {\n                return null;\n            }\n            if (\"byteLength\" in value) {\n                return value;\n            }\n            if (value instanceof Date) {\n                return value;\n            }\n            if (ns.isDocumentSchema()) {\n                return value;\n            }\n            if (ns.isListSchema()) {\n                const newArray = [];\n                const memberSchema = ns.getValueSchema();\n                for (const item of value) {\n                    const itemValue = this.readValue(memberSchema, item);\n                    newArray.push(itemValue);\n                }\n                return newArray;\n            }\n            const newObject = {};\n            if (ns.isMapSchema()) {\n                const targetSchema = ns.getValueSchema();\n                for (const key in value) {\n                    const itemValue = this.readValue(targetSchema, value[key]);\n                    newObject[key] = itemValue;\n                }\n            }\n            else if (ns.isStructSchema()) {\n                const isUnion = ns.isUnionSchema();\n                let keys;\n                if (isUnion) {\n                    keys = new Set();\n                    for (const k in value) {\n                        if (k !== \"__type\") {\n                            keys.add(k);\n                        }\n                    }\n                }\n                for (const [key, memberSchema] of ns.structIterator()) {\n                    if (isUnion) {\n                        keys.delete(key);\n                    }\n                    if (value[key] != null) {\n                        newObject[key] = this.readValue(memberSchema, value[key]);\n                    }\n                }\n                if (isUnion && keys?.size === 1) {\n                    let newObjectEmpty = true;\n                    for (const _ in newObject) {\n                        newObjectEmpty = false;\n                        break;\n                    }\n                    if (newObjectEmpty) {\n                        const k = keys.values().next().value;\n                        newObject.$unknown = [k, value[k]];\n                    }\n                }\n                else if (typeof value.__type === \"string\") {\n                    for (const k in value) {\n                        if (!(k in newObject)) {\n                            newObject[k] = value[k];\n                        }\n                    }\n                }\n            }\n            else if (value instanceof NumericValue) {\n                return value;\n            }\n            return newObject;\n        }\n        else {\n            return value;\n        }\n    }\n}\n", "import { RpcProtocol } from \"@smithy/core/protocols\";\nimport { TypeRegistry } from \"@smithy/core/schema\";\nimport { deref, NormalizedSchema } from \"@smithy/core/schema\";\nimport { getSmithyContext } from \"@smithy/util-middleware\";\nimport { CborCodec } from \"./CborCodec\";\nimport { loadSmithyRpcV2CborErrorCode } from \"./parseCborBody\";\nexport class SmithyRpcV2CborProtocol extends RpcProtocol {\n    codec = new CborCodec();\n    serializer = this.codec.createSerializer();\n    deserializer = this.codec.createDeserializer();\n    constructor({ defaultNamespace, errorTypeRegistries, }) {\n        super({ defaultNamespace, errorTypeRegistries });\n    }\n    getShapeId() {\n        return \"smithy.protocols#rpcv2Cbor\";\n    }\n    getPayloadCodec() {\n        return this.codec;\n    }\n    async serializeRequest(operationSchema, input, context) {\n        const request = await super.serializeRequest(operationSchema, input, context);\n        Object.assign(request.headers, {\n            \"content-type\": this.getDefaultContentType(),\n            \"smithy-protocol\": \"rpc-v2-cbor\",\n            accept: this.getDefaultContentType(),\n        });\n        if (deref(operationSchema.input) === \"unit\") {\n            delete request.body;\n            delete request.headers[\"content-type\"];\n        }\n        else {\n            if (!request.body) {\n                this.serializer.write(15, {});\n                request.body = this.serializer.flush();\n            }\n            try {\n                request.headers[\"content-length\"] = String(request.body.byteLength);\n            }\n            catch (e) { }\n        }\n        const { service, operation } = getSmithyContext(context);\n        const path = `/service/${service}/operation/${operation}`;\n        if (request.path.endsWith(\"/\")) {\n            request.path += path.slice(1);\n        }\n        else {\n            request.path += path;\n        }\n        return request;\n    }\n    async deserializeResponse(operationSchema, context, response) {\n        return super.deserializeResponse(operationSchema, context, response);\n    }\n    async handleError(operationSchema, context, response, dataObject, metadata) {\n        const errorName = loadSmithyRpcV2CborErrorCode(response, dataObject) ?? \"Unknown\";\n        const errorMetadata = {\n            $metadata: metadata,\n            $fault: response.statusCode <= 500 ? \"client\" : \"server\",\n        };\n        let namespace = this.options.defaultNamespace;\n        if (errorName.includes(\"#\")) {\n            [namespace] = errorName.split(\"#\");\n        }\n        const registry = this.compositeErrorRegistry;\n        const nsRegistry = TypeRegistry.for(namespace);\n        registry.copyFrom(nsRegistry);\n        let errorSchema;\n        try {\n            errorSchema = registry.getSchema(errorName);\n        }\n        catch (e) {\n            if (dataObject.Message) {\n                dataObject.message = dataObject.Message;\n            }\n            const syntheticRegistry = TypeRegistry.for(\"smithy.ts.sdk.synthetic.\" + namespace);\n            registry.copyFrom(syntheticRegistry);\n            const baseExceptionSchema = registry.getBaseException();\n            if (baseExceptionSchema) {\n                const ErrorCtor = registry.getErrorCtor(baseExceptionSchema);\n                throw Object.assign(new ErrorCtor({ name: errorName }), errorMetadata, dataObject);\n            }\n            throw Object.assign(new Error(errorName), errorMetadata, dataObject);\n        }\n        const ns = NormalizedSchema.of(errorSchema);\n        const ErrorCtor = registry.getErrorCtor(errorSchema);\n        const message = dataObject.message ?? dataObject.Message ?? \"Unknown\";\n        const exception = new ErrorCtor(message);\n        const output = {};\n        for (const [name, member] of ns.structIterator()) {\n            output[name] = this.deserializer.readValue(member, dataObject[name]);\n        }\n        throw Object.assign(exception, errorMetadata, {\n            $fault: ns.getMergedTraits().error,\n            message,\n        }, output);\n    }\n    getDefaultContentType() {\n        return \"application/cbor\";\n    }\n}\n", "export { cbor } from \"./cbor\";\nexport { tag, tagSymbol } from \"./cbor-types\";\nexport * from \"./parseCborBody\";\nexport * from \"./SmithyRpcV2CborProtocol\";\nexport * from \"./CborCodec\";\n", "import { NormalizedSchema, TypeRegistry } from \"@smithy/core/schema\";\nimport { decorateServiceException } from \"@smithy/smithy-client\";\nexport class ProtocolLib {\n    queryCompat;\n    errorRegistry;\n    constructor(queryCompat = false) {\n        this.queryCompat = queryCompat;\n    }\n    resolveRestContentType(defaultContentType, inputSchema) {\n        const members = inputSchema.getMemberSchemas();\n        const httpPayloadMember = Object.values(members).find((m) => {\n            return !!m.getMergedTraits().httpPayload;\n        });\n        if (httpPayloadMember) {\n            const mediaType = httpPayloadMember.getMergedTraits().mediaType;\n            if (mediaType) {\n                return mediaType;\n            }\n            else if (httpPayloadMember.isStringSchema()) {\n                return \"text/plain\";\n            }\n            else if (httpPayloadMember.isBlobSchema()) {\n                return \"application/octet-stream\";\n            }\n            else {\n                return defaultContentType;\n            }\n        }\n        else if (!inputSchema.isUnitSchema()) {\n            const hasBody = Object.values(members).find((m) => {\n                const { httpQuery, httpQueryParams, httpHeader, httpLabel, httpPrefixHeaders } = m.getMergedTraits();\n                const noPrefixHeaders = httpPrefixHeaders === void 0;\n                return !httpQuery && !httpQueryParams && !httpHeader && !httpLabel && noPrefixHeaders;\n            });\n            if (hasBody) {\n                return defaultContentType;\n            }\n        }\n    }\n    async getErrorSchemaOrThrowBaseException(errorIdentifier, defaultNamespace, response, dataObject, metadata, getErrorSchema) {\n        let errorName = errorIdentifier;\n        if (errorIdentifier.includes(\"#\")) {\n            [, errorName] = errorIdentifier.split(\"#\");\n        }\n        const errorMetadata = {\n            $metadata: metadata,\n            $fault: response.statusCode < 500 ? \"client\" : \"server\",\n        };\n        if (!this.errorRegistry) {\n            throw new Error(\"@aws-sdk/core/protocols - error handler not initialized.\");\n        }\n        try {\n            const errorSchema = getErrorSchema?.(this.errorRegistry, errorName) ??\n                this.errorRegistry.getSchema(errorIdentifier);\n            return { errorSchema, errorMetadata };\n        }\n        catch (e) {\n            dataObject.message = dataObject.message ?? dataObject.Message ?? \"UnknownError\";\n            const synthetic = this.errorRegistry;\n            const baseExceptionSchema = synthetic.getBaseException();\n            if (baseExceptionSchema) {\n                const ErrorCtor = synthetic.getErrorCtor(baseExceptionSchema) ?? Error;\n                throw this.decorateServiceException(Object.assign(new ErrorCtor({ name: errorName }), errorMetadata), dataObject);\n            }\n            const d = dataObject;\n            const message = d?.message ?? d?.Message ?? d?.Error?.Message ?? d?.Error?.message;\n            throw this.decorateServiceException(Object.assign(new Error(message), {\n                name: errorName,\n            }, errorMetadata), dataObject);\n        }\n    }\n    compose(composite, errorIdentifier, defaultNamespace) {\n        let namespace = defaultNamespace;\n        if (errorIdentifier.includes(\"#\")) {\n            [namespace] = errorIdentifier.split(\"#\");\n        }\n        const staticRegistry = TypeRegistry.for(namespace);\n        const defaultSyntheticRegistry = TypeRegistry.for(\"smithy.ts.sdk.synthetic.\" + defaultNamespace);\n        composite.copyFrom(staticRegistry);\n        composite.copyFrom(defaultSyntheticRegistry);\n        this.errorRegistry = composite;\n    }\n    decorateServiceException(exception, additions = {}) {\n        if (this.queryCompat) {\n            const msg = exception.Message ?? additions.Message;\n            const error = decorateServiceException(exception, additions);\n            if (msg) {\n                error.message = msg;\n            }\n            const errorObj = error.Error ?? {};\n            errorObj.Type = error.Error?.Type;\n            errorObj.Code = error.Error?.Code;\n            errorObj.Message = error.Error?.message ?? error.Error?.Message ?? msg;\n            error.Error = errorObj;\n            const reqId = error.$metadata.requestId;\n            if (reqId) {\n                error.RequestId = reqId;\n            }\n            return error;\n        }\n        return decorateServiceException(exception, additions);\n    }\n    setQueryCompatError(output, response) {\n        const queryErrorHeader = response.headers?.[\"x-amzn-query-error\"];\n        if (output !== undefined && queryErrorHeader != null) {\n            const [Code, Type] = queryErrorHeader.split(\";\");\n            const keys = Object.keys(output);\n            const Error = {\n                Code,\n                Type,\n            };\n            output.Code = Code;\n            output.Type = Type;\n            for (let i = 0; i < keys.length; i++) {\n                const k = keys[i];\n                Error[k === \"message\" ? \"Message\" : k] = output[k];\n            }\n            delete Error.__type;\n            output.Error = Error;\n        }\n    }\n    queryCompatOutput(queryCompatErrorData, errorData) {\n        if (queryCompatErrorData.Error) {\n            errorData.Error = queryCompatErrorData.Error;\n        }\n        if (queryCompatErrorData.Type) {\n            errorData.Type = queryCompatErrorData.Type;\n        }\n        if (queryCompatErrorData.Code) {\n            errorData.Code = queryCompatErrorData.Code;\n        }\n    }\n    findQueryCompatibleError(registry, errorName) {\n        try {\n            return registry.getSchema(errorName);\n        }\n        catch (e) {\n            return registry.find((schema) => NormalizedSchema.of(schema).getMergedTraits().awsQueryError?.[0] === errorName);\n        }\n    }\n}\n", "import { loadSmithyRpcV2CborErrorCode, SmithyRpcV2CborProtocol } from \"@smithy/core/cbor\";\nimport { NormalizedSchema } from \"@smithy/core/schema\";\nimport { ProtocolLib } from \"../ProtocolLib\";\nexport class AwsSmithyRpcV2CborProtocol extends SmithyRpcV2CborProtocol {\n    awsQueryCompatible;\n    mixin;\n    constructor({ defaultNamespace, errorTypeRegistries, awsQueryCompatible, }) {\n        super({ defaultNamespace, errorTypeRegistries });\n        this.awsQueryCompatible = !!awsQueryCompatible;\n        this.mixin = new ProtocolLib(this.awsQueryCompatible);\n    }\n    async serializeRequest(operationSchema, input, context) {\n        const request = await super.serializeRequest(operationSchema, input, context);\n        if (this.awsQueryCompatible) {\n            request.headers[\"x-amzn-query-mode\"] = \"true\";\n        }\n        return request;\n    }\n    async handleError(operationSchema, context, response, dataObject, metadata) {\n        if (this.awsQueryCompatible) {\n            this.mixin.setQueryCompatError(dataObject, response);\n        }\n        const errorName = (() => {\n            const compatHeader = response.headers[\"x-amzn-query-error\"];\n            if (compatHeader && this.awsQueryCompatible) {\n                return compatHeader.split(\";\")[0];\n            }\n            return loadSmithyRpcV2CborErrorCode(response, dataObject) ?? \"Unknown\";\n        })();\n        this.mixin.compose(this.compositeErrorRegistry, errorName, this.options.defaultNamespace);\n        const { errorSchema, errorMetadata } = await this.mixin.getErrorSchemaOrThrowBaseException(errorName, this.options.defaultNamespace, response, dataObject, metadata, this.awsQueryCompatible ? this.mixin.findQueryCompatibleError : undefined);\n        const ns = NormalizedSchema.of(errorSchema);\n        const message = dataObject.message ?? dataObject.Message ?? \"UnknownError\";\n        const ErrorCtor = this.compositeErrorRegistry.getErrorCtor(errorSchema) ?? Error;\n        const exception = new ErrorCtor(message);\n        const output = {};\n        for (const [name, member] of ns.structIterator()) {\n            if (dataObject[name] != null) {\n                output[name] = this.deserializer.readValue(member, dataObject[name]);\n            }\n        }\n        if (this.awsQueryCompatible) {\n            this.mixin.queryCompatOutput(dataObject, output);\n        }\n        throw this.mixin.decorateServiceException(Object.assign(exception, errorMetadata, {\n            $fault: ns.getMergedTraits().error,\n            message,\n        }, output), dataObject);\n    }\n}\n", "export const _toStr = (val) => {\n    if (val == null) {\n        return val;\n    }\n    if (typeof val === \"number\" || typeof val === \"bigint\") {\n        const warning = new Error(`Received number ${val} where a string was expected.`);\n        warning.name = \"Warning\";\n        console.warn(warning);\n        return String(val);\n    }\n    if (typeof val === \"boolean\") {\n        const warning = new Error(`Received boolean ${val} where a string was expected.`);\n        warning.name = \"Warning\";\n        console.warn(warning);\n        return String(val);\n    }\n    return val;\n};\nexport const _toBool = (val) => {\n    if (val == null) {\n        return val;\n    }\n    if (typeof val === \"number\") {\n    }\n    if (typeof val === \"string\") {\n        const lowercase = val.toLowerCase();\n        if (val !== \"\" && lowercase !== \"false\" && lowercase !== \"true\") {\n            const warning = new Error(`Received string \"${val}\" where a boolean was expected.`);\n            warning.name = \"Warning\";\n            console.warn(warning);\n        }\n        return val !== \"\" && lowercase !== \"false\";\n    }\n    return val;\n};\nexport const _toNum = (val) => {\n    if (val == null) {\n        return val;\n    }\n    if (typeof val === \"boolean\") {\n    }\n    if (typeof val === \"string\") {\n        const num = Number(val);\n        if (num.toString() !== val) {\n            const warning = new Error(`Received string \"${val}\" where a number was expected.`);\n            warning.name = \"Warning\";\n            console.warn(warning);\n            return val;\n        }\n        return num;\n    }\n    return val;\n};\n", "export class SerdeContextConfig {\n    serdeContext;\n    setSerdeContext(serdeContext) {\n        this.serdeContext = serdeContext;\n    }\n}\n", "export class UnionSerde {\n    from;\n    to;\n    keys;\n    constructor(from, to) {\n        this.from = from;\n        this.to = to;\n        const keys = Object.keys(this.from);\n        const set = new Set(keys);\n        set.delete(\"__type\");\n        this.keys = set;\n    }\n    mark(key) {\n        this.keys.delete(key);\n    }\n    hasUnknown() {\n        return this.keys.size === 1 && Object.keys(this.to).length === 0;\n    }\n    writeUnknown() {\n        if (this.hasUnknown()) {\n            const k = this.keys.values().next().value;\n            const v = this.from[k];\n            this.to.$unknown = [k, v];\n        }\n    }\n}\n", "import { NumericValue } from \"@smithy/core/serde\";\nexport function jsonReviver(key, value, context) {\n    if (context?.source) {\n        const numericString = context.source;\n        if (typeof value === \"number\") {\n            if (value > Number.MAX_SAFE_INTEGER || value < Number.MIN_SAFE_INTEGER || numericString !== String(value)) {\n                const isFractional = numericString.includes(\".\");\n                if (isFractional) {\n                    return new NumericValue(numericString, \"bigDecimal\");\n                }\n                else {\n                    return BigInt(numericString);\n                }\n            }\n        }\n    }\n    return value;\n}\n", "import { collectBody } from \"@smithy/smithy-client\";\nimport { toUtf8 } from \"@smithy/util-utf8\";\nexport const collectBodyString = (streamBody, context) => collectBody(streamBody, context).then((body) => (context?.utf8Encoder ?? toUtf8)(body));\n", "import { collectBodyString } from \"../common\";\nexport const parseJsonBody = (streamBody, context) => collectBodyString(streamBody, context).then((encoded) => {\n    if (encoded.length) {\n        try {\n            return JSON.parse(encoded);\n        }\n        catch (e) {\n            if (e?.name === \"SyntaxError\") {\n                Object.defineProperty(e, \"$responseBodyText\", {\n                    value: encoded,\n                });\n            }\n            throw e;\n        }\n    }\n    return {};\n});\nexport const parseJsonErrorBody = async (errorBody, context) => {\n    const value = await parseJsonBody(errorBody, context);\n    value.message = value.message ?? value.Message;\n    return value;\n};\nconst findKey = (object, key) => Object.keys(object).find((k) => k.toLowerCase() === key.toLowerCase());\nconst sanitizeErrorCode = (rawValue) => {\n    let cleanValue = rawValue;\n    if (typeof cleanValue === \"number\") {\n        cleanValue = cleanValue.toString();\n    }\n    if (cleanValue.indexOf(\",\") >= 0) {\n        cleanValue = cleanValue.split(\",\")[0];\n    }\n    if (cleanValue.indexOf(\":\") >= 0) {\n        cleanValue = cleanValue.split(\":\")[0];\n    }\n    if (cleanValue.indexOf(\"#\") >= 0) {\n        cleanValue = cleanValue.split(\"#\")[1];\n    }\n    return cleanValue;\n};\nexport const loadRestJsonErrorCode = (output, data) => {\n    const headerKey = findKey(output.headers, \"x-amzn-errortype\");\n    if (headerKey !== undefined) {\n        return sanitizeErrorCode(output.headers[headerKey]);\n    }\n    if (data && typeof data === \"object\") {\n        const codeKey = findKey(data, \"code\");\n        if (codeKey && data[codeKey] !== undefined) {\n            return sanitizeErrorCode(data[codeKey]);\n        }\n        if (data[\"__type\"] !== undefined) {\n            return sanitizeErrorCode(data[\"__type\"]);\n        }\n    }\n};\n", "import { determineTimestampFormat } from \"@smithy/core/protocols\";\nimport { NormalizedSchema } from \"@smithy/core/schema\";\nimport { LazyJsonString, NumericValue, parseEpochTimestamp, parseRfc3339DateTimeWithOffset, parseRfc7231DateTime, } from \"@smithy/core/serde\";\nimport { fromBase64 } from \"@smithy/util-base64\";\nimport { SerdeContextConfig } from \"../ConfigurableSerdeContext\";\nimport { UnionSerde } from \"../UnionSerde\";\nimport { jsonReviver } from \"./jsonReviver\";\nimport { parseJsonBody } from \"./parseJsonBody\";\nexport class JsonShapeDeserializer extends SerdeContextConfig {\n    settings;\n    constructor(settings) {\n        super();\n        this.settings = settings;\n    }\n    async read(schema, data) {\n        return this._read(schema, typeof data === \"string\" ? JSON.parse(data, jsonReviver) : await parseJsonBody(data, this.serdeContext));\n    }\n    readObject(schema, data) {\n        return this._read(schema, data);\n    }\n    _read(schema, value) {\n        const isObject = value !== null && typeof value === \"object\";\n        const ns = NormalizedSchema.of(schema);\n        if (isObject) {\n            if (ns.isStructSchema()) {\n                const record = value;\n                const union = ns.isUnionSchema();\n                const out = {};\n                let nameMap = void 0;\n                const { jsonName } = this.settings;\n                if (jsonName) {\n                    nameMap = {};\n                }\n                let unionSerde;\n                if (union) {\n                    unionSerde = new UnionSerde(record, out);\n                }\n                for (const [memberName, memberSchema] of ns.structIterator()) {\n                    let fromKey = memberName;\n                    if (jsonName) {\n                        fromKey = memberSchema.getMergedTraits().jsonName ?? fromKey;\n                        nameMap[fromKey] = memberName;\n                    }\n                    if (union) {\n                        unionSerde.mark(fromKey);\n                    }\n                    if (record[fromKey] != null) {\n                        out[memberName] = this._read(memberSchema, record[fromKey]);\n                    }\n                }\n                if (union) {\n                    unionSerde.writeUnknown();\n                }\n                else if (typeof record.__type === \"string\") {\n                    for (const k in record) {\n                        const v = record[k];\n                        const t = jsonName ? nameMap[k] ?? k : k;\n                        if (!(t in out)) {\n                            out[t] = v;\n                        }\n                    }\n                }\n                return out;\n            }\n            if (Array.isArray(value) && ns.isListSchema()) {\n                const listMember = ns.getValueSchema();\n                const out = [];\n                for (const item of value) {\n                    out.push(this._read(listMember, item));\n                }\n                return out;\n            }\n            if (ns.isMapSchema()) {\n                const mapMember = ns.getValueSchema();\n                const out = {};\n                for (const _k in value) {\n                    out[_k] = this._read(mapMember, value[_k]);\n                }\n                return out;\n            }\n        }\n        if (ns.isBlobSchema() && typeof value === \"string\") {\n            return fromBase64(value);\n        }\n        const mediaType = ns.getMergedTraits().mediaType;\n        if (ns.isStringSchema() && typeof value === \"string\" && mediaType) {\n            const isJson = mediaType === \"application/json\" || mediaType.endsWith(\"+json\");\n            if (isJson) {\n                return LazyJsonString.from(value);\n            }\n            return value;\n        }\n        if (ns.isTimestampSchema() && value != null) {\n            const format = determineTimestampFormat(ns, this.settings);\n            switch (format) {\n                case 5:\n                    return parseRfc3339DateTimeWithOffset(value);\n                case 6:\n                    return parseRfc7231DateTime(value);\n                case 7:\n                    return parseEpochTimestamp(value);\n                default:\n                    console.warn(\"Missing timestamp format, parsing value with Date constructor:\", value);\n                    return new Date(value);\n            }\n        }\n        if (ns.isBigIntegerSchema() && (typeof value === \"number\" || typeof value === \"string\")) {\n            return BigInt(value);\n        }\n        if (ns.isBigDecimalSchema() && value != undefined) {\n            if (value instanceof NumericValue) {\n                return value;\n            }\n            const untyped = value;\n            if (untyped.type === \"bigDecimal\" && \"string\" in untyped) {\n                return new NumericValue(untyped.string, untyped.type);\n            }\n            return new NumericValue(String(value), \"bigDecimal\");\n        }\n        if (ns.isNumericSchema() && typeof value === \"string\") {\n            switch (value) {\n                case \"Infinity\":\n                    return Infinity;\n                case \"-Infinity\":\n                    return -Infinity;\n                case \"NaN\":\n                    return NaN;\n            }\n            return value;\n        }\n        if (ns.isDocumentSchema()) {\n            if (isObject) {\n                const out = Array.isArray(value) ? [] : {};\n                for (const k in value) {\n                    const v = value[k];\n                    if (v instanceof NumericValue) {\n                        out[k] = v;\n                    }\n                    else {\n                        out[k] = this._read(ns, v);\n                    }\n                }\n                return out;\n            }\n            else {\n                return structuredClone(value);\n            }\n        }\n        return value;\n    }\n}\n", "import { NumericValue } from \"@smithy/core/serde\";\nconst NUMERIC_CONTROL_CHAR = String.fromCharCode(925);\nexport class JsonReplacer {\n    values = new Map();\n    counter = 0;\n    stage = 0;\n    createReplacer() {\n        if (this.stage === 1) {\n            throw new Error(\"@aws-sdk/core/protocols - JsonReplacer already created.\");\n        }\n        if (this.stage === 2) {\n            throw new Error(\"@aws-sdk/core/protocols - JsonReplacer exhausted.\");\n        }\n        this.stage = 1;\n        return (key, value) => {\n            if (value instanceof NumericValue) {\n                const v = `${NUMERIC_CONTROL_CHAR + \"nv\" + this.counter++}_` + value.string;\n                this.values.set(`\"${v}\"`, value.string);\n                return v;\n            }\n            if (typeof value === \"bigint\") {\n                const s = value.toString();\n                const v = `${NUMERIC_CONTROL_CHAR + \"b\" + this.counter++}_` + s;\n                this.values.set(`\"${v}\"`, s);\n                return v;\n            }\n            return value;\n        };\n    }\n    replaceInJson(json) {\n        if (this.stage === 0) {\n            throw new Error(\"@aws-sdk/core/protocols - JsonReplacer not created yet.\");\n        }\n        if (this.stage === 2) {\n            throw new Error(\"@aws-sdk/core/protocols - JsonReplacer exhausted.\");\n        }\n        this.stage = 2;\n        if (this.counter === 0) {\n            return json;\n        }\n        for (const [key, value] of this.values) {\n            json = json.replace(key, value);\n        }\n        return json;\n    }\n}\n", "import { determineTimestampFormat } from \"@smithy/core/protocols\";\nimport { NormalizedSchema } from \"@smithy/core/schema\";\nimport { dateToUtcString, generateIdempotencyToken, LazyJsonString, NumericValue } from \"@smithy/core/serde\";\nimport { toBase64 } from \"@smithy/util-base64\";\nimport { SerdeContextConfig } from \"../ConfigurableSerdeContext\";\nimport { JsonReplacer } from \"./jsonReplacer\";\nexport class JsonShapeSerializer extends SerdeContextConfig {\n    settings;\n    buffer;\n    useReplacer = false;\n    rootSchema;\n    constructor(settings) {\n        super();\n        this.settings = settings;\n    }\n    write(schema, value) {\n        this.rootSchema = NormalizedSchema.of(schema);\n        this.buffer = this._write(this.rootSchema, value);\n    }\n    flush() {\n        const { rootSchema, useReplacer } = this;\n        this.rootSchema = undefined;\n        this.useReplacer = false;\n        if (rootSchema?.isStructSchema() || rootSchema?.isDocumentSchema()) {\n            if (!useReplacer) {\n                return JSON.stringify(this.buffer);\n            }\n            const replacer = new JsonReplacer();\n            return replacer.replaceInJson(JSON.stringify(this.buffer, replacer.createReplacer(), 0));\n        }\n        return this.buffer;\n    }\n    writeDiscriminatedDocument(schema, value) {\n        this.write(schema, value);\n        if (typeof this.buffer === \"object\") {\n            this.buffer.__type = NormalizedSchema.of(schema).getName(true);\n        }\n    }\n    _write(schema, value, container) {\n        const isObject = value !== null && typeof value === \"object\";\n        const ns = NormalizedSchema.of(schema);\n        if (isObject) {\n            if (ns.isStructSchema()) {\n                const record = value;\n                const out = {};\n                const { jsonName } = this.settings;\n                let nameMap = void 0;\n                if (jsonName) {\n                    nameMap = {};\n                }\n                let outCount = 0;\n                for (const [memberName, memberSchema] of ns.structIterator()) {\n                    const serializableValue = this._write(memberSchema, record[memberName], ns);\n                    if (serializableValue !== undefined) {\n                        let targetKey = memberName;\n                        if (jsonName) {\n                            targetKey = memberSchema.getMergedTraits().jsonName ?? memberName;\n                            nameMap[memberName] = targetKey;\n                        }\n                        out[targetKey] = serializableValue;\n                        outCount++;\n                    }\n                }\n                if (ns.isUnionSchema() && outCount === 0) {\n                    const { $unknown } = record;\n                    if (Array.isArray($unknown)) {\n                        const [k, v] = $unknown;\n                        out[k] = this._write(15, v);\n                    }\n                }\n                else if (typeof record.__type === \"string\") {\n                    for (const k in record) {\n                        const v = record[k];\n                        const targetKey = jsonName ? nameMap[k] ?? k : k;\n                        if (!(targetKey in out)) {\n                            out[targetKey] = this._write(15, v);\n                        }\n                    }\n                }\n                return out;\n            }\n            if (Array.isArray(value) && ns.isListSchema()) {\n                const listMember = ns.getValueSchema();\n                const out = [];\n                const sparse = !!ns.getMergedTraits().sparse;\n                for (const item of value) {\n                    if (sparse || item != null) {\n                        out.push(this._write(listMember, item));\n                    }\n                }\n                return out;\n            }\n            if (ns.isMapSchema()) {\n                const mapMember = ns.getValueSchema();\n                const out = {};\n                const sparse = !!ns.getMergedTraits().sparse;\n                for (const _k in value) {\n                    const _v = value[_k];\n                    if (sparse || _v != null) {\n                        out[_k] = this._write(mapMember, _v);\n                    }\n                }\n                return out;\n            }\n            if (value instanceof Uint8Array && (ns.isBlobSchema() || ns.isDocumentSchema())) {\n                if (ns === this.rootSchema) {\n                    return value;\n                }\n                return (this.serdeContext?.base64Encoder ?? toBase64)(value);\n            }\n            if (value instanceof Date && (ns.isTimestampSchema() || ns.isDocumentSchema())) {\n                const format = determineTimestampFormat(ns, this.settings);\n                switch (format) {\n                    case 5:\n                        return value.toISOString().replace(\".000Z\", \"Z\");\n                    case 6:\n                        return dateToUtcString(value);\n                    case 7:\n                        return value.getTime() / 1000;\n                    default:\n                        console.warn(\"Missing timestamp format, using epoch seconds\", value);\n                        return value.getTime() / 1000;\n                }\n            }\n            if (value instanceof NumericValue) {\n                this.useReplacer = true;\n            }\n        }\n        if (value === null && container?.isStructSchema()) {\n            return void 0;\n        }\n        if (ns.isStringSchema()) {\n            if (typeof value === \"undefined\" && ns.isIdempotencyToken()) {\n                return generateIdempotencyToken();\n            }\n            const mediaType = ns.getMergedTraits().mediaType;\n            if (value != null && mediaType) {\n                const isJson = mediaType === \"application/json\" || mediaType.endsWith(\"+json\");\n                if (isJson) {\n                    return LazyJsonString.from(value);\n                }\n            }\n            return value;\n        }\n        if (typeof value === \"number\" && ns.isNumericSchema()) {\n            if (Math.abs(value) === Infinity || isNaN(value)) {\n                return String(value);\n            }\n            return value;\n        }\n        if (typeof value === \"string\" && ns.isBlobSchema()) {\n            if (ns === this.rootSchema) {\n                return value;\n            }\n            return (this.serdeContext?.base64Encoder ?? toBase64)(value);\n        }\n        if (typeof value === \"bigint\") {\n            this.useReplacer = true;\n        }\n        if (ns.isDocumentSchema()) {\n            if (isObject) {\n                const out = Array.isArray(value) ? [] : {};\n                for (const k in value) {\n                    const v = value[k];\n                    if (v instanceof NumericValue) {\n                        this.useReplacer = true;\n                        out[k] = v;\n                    }\n                    else {\n                        out[k] = this._write(ns, v);\n                    }\n                }\n                return out;\n            }\n            else {\n                return structuredClone(value);\n            }\n        }\n        return value;\n    }\n}\n", "import { SerdeContextConfig } from \"../ConfigurableSerdeContext\";\nimport { JsonShapeDeserializer } from \"./JsonShapeDeserializer\";\nimport { JsonShapeSerializer } from \"./JsonShapeSerializer\";\nexport class JsonCodec extends SerdeContextConfig {\n    settings;\n    constructor(settings) {\n        super();\n        this.settings = settings;\n    }\n    createSerializer() {\n        const serializer = new JsonShapeSerializer(this.settings);\n        serializer.setSerdeContext(this.serdeContext);\n        return serializer;\n    }\n    createDeserializer() {\n        const deserializer = new JsonShapeDeserializer(this.settings);\n        deserializer.setSerdeContext(this.serdeContext);\n        return deserializer;\n    }\n}\n", "import { RpcProtocol } from \"@smithy/core/protocols\";\nimport { deref, NormalizedSchema } from \"@smithy/core/schema\";\nimport { ProtocolLib } from \"../ProtocolLib\";\nimport { JsonCodec } from \"./JsonCodec\";\nimport { loadRestJsonErrorCode } from \"./parseJsonBody\";\nexport class AwsJsonRpcProtocol extends RpcProtocol {\n    serializer;\n    deserializer;\n    serviceTarget;\n    codec;\n    mixin;\n    awsQueryCompatible;\n    constructor({ defaultNamespace, errorTypeRegistries, serviceTarget, awsQueryCompatible, jsonCodec, }) {\n        super({\n            defaultNamespace,\n            errorTypeRegistries,\n        });\n        this.serviceTarget = serviceTarget;\n        this.codec =\n            jsonCodec ??\n                new JsonCodec({\n                    timestampFormat: {\n                        useTrait: true,\n                        default: 7,\n                    },\n                    jsonName: false,\n                });\n        this.serializer = this.codec.createSerializer();\n        this.deserializer = this.codec.createDeserializer();\n        this.awsQueryCompatible = !!awsQueryCompatible;\n        this.mixin = new ProtocolLib(this.awsQueryCompatible);\n    }\n    async serializeRequest(operationSchema, input, context) {\n        const request = await super.serializeRequest(operationSchema, input, context);\n        if (!request.path.endsWith(\"/\")) {\n            request.path += \"/\";\n        }\n        request.headers[\"content-type\"] = `application/x-amz-json-${this.getJsonRpcVersion()}`;\n        request.headers[\"x-amz-target\"] = `${this.serviceTarget}.${operationSchema.name}`;\n        if (this.awsQueryCompatible) {\n            request.headers[\"x-amzn-query-mode\"] = \"true\";\n        }\n        if (deref(operationSchema.input) === \"unit\" || !request.body) {\n            request.body = \"{}\";\n        }\n        return request;\n    }\n    getPayloadCodec() {\n        return this.codec;\n    }\n    async handleError(operationSchema, context, response, dataObject, metadata) {\n        if (this.awsQueryCompatible) {\n            this.mixin.setQueryCompatError(dataObject, response);\n        }\n        const errorIdentifier = loadRestJsonErrorCode(response, dataObject) ?? \"Unknown\";\n        this.mixin.compose(this.compositeErrorRegistry, errorIdentifier, this.options.defaultNamespace);\n        const { errorSchema, errorMetadata } = await this.mixin.getErrorSchemaOrThrowBaseException(errorIdentifier, this.options.defaultNamespace, response, dataObject, metadata, this.awsQueryCompatible ? this.mixin.findQueryCompatibleError : undefined);\n        const ns = NormalizedSchema.of(errorSchema);\n        const message = dataObject.message ?? dataObject.Message ?? \"UnknownError\";\n        const ErrorCtor = this.compositeErrorRegistry.getErrorCtor(errorSchema) ?? Error;\n        const exception = new ErrorCtor(message);\n        const output = {};\n        const errorDeserializer = this.codec.createDeserializer();\n        for (const [name, member] of ns.structIterator()) {\n            if (dataObject[name] != null) {\n                output[name] = errorDeserializer.readObject(member, dataObject[name]);\n            }\n        }\n        if (this.awsQueryCompatible) {\n            this.mixin.queryCompatOutput(dataObject, output);\n        }\n        throw this.mixin.decorateServiceException(Object.assign(exception, errorMetadata, {\n            $fault: ns.getMergedTraits().error,\n            message,\n        }, output), dataObject);\n    }\n}\n", "import { AwsJsonRpcProtocol } from \"./AwsJsonRpcProtocol\";\nexport class AwsJson1_0Protocol extends AwsJsonRpcProtocol {\n    constructor({ defaultNamespace, errorTypeRegistries, serviceTarget, awsQueryCompatible, jsonCodec, }) {\n        super({\n            defaultNamespace,\n            errorTypeRegistries,\n            serviceTarget,\n            awsQueryCompatible,\n            jsonCodec,\n        });\n    }\n    getShapeId() {\n        return \"aws.protocols#awsJson1_0\";\n    }\n    getJsonRpcVersion() {\n        return \"1.0\";\n    }\n    getDefaultContentType() {\n        return \"application/x-amz-json-1.0\";\n    }\n}\n", "import { AwsJsonRpcProtocol } from \"./AwsJsonRpcProtocol\";\nexport class AwsJson1_1Protocol extends AwsJsonRpcProtocol {\n    constructor({ defaultNamespace, errorTypeRegistries, serviceTarget, awsQueryCompatible, jsonCodec, }) {\n        super({\n            defaultNamespace,\n            errorTypeRegistries,\n            serviceTarget,\n            awsQueryCompatible,\n            jsonCodec,\n        });\n    }\n    getShapeId() {\n        return \"aws.protocols#awsJson1_1\";\n    }\n    getJsonRpcVersion() {\n        return \"1.1\";\n    }\n    getDefaultContentType() {\n        return \"application/x-amz-json-1.1\";\n    }\n}\n", "import { HttpBindingProtocol, HttpInterceptingShapeDeserializer, HttpInterceptingShapeSerializer, } from \"@smithy/core/protocols\";\nimport { NormalizedSchema } from \"@smithy/core/schema\";\nimport { ProtocolLib } from \"../ProtocolLib\";\nimport { JsonCodec } from \"./JsonCodec\";\nimport { loadRestJsonErrorCode } from \"./parseJsonBody\";\nexport class AwsRestJsonProtocol extends HttpBindingProtocol {\n    serializer;\n    deserializer;\n    codec;\n    mixin = new ProtocolLib();\n    constructor({ defaultNamespace, errorTypeRegistries, }) {\n        super({\n            defaultNamespace,\n            errorTypeRegistries,\n        });\n        const settings = {\n            timestampFormat: {\n                useTrait: true,\n                default: 7,\n            },\n            httpBindings: true,\n            jsonName: true,\n        };\n        this.codec = new JsonCodec(settings);\n        this.serializer = new HttpInterceptingShapeSerializer(this.codec.createSerializer(), settings);\n        this.deserializer = new HttpInterceptingShapeDeserializer(this.codec.createDeserializer(), settings);\n    }\n    getShapeId() {\n        return \"aws.protocols#restJson1\";\n    }\n    getPayloadCodec() {\n        return this.codec;\n    }\n    setSerdeContext(serdeContext) {\n        this.codec.setSerdeContext(serdeContext);\n        super.setSerdeContext(serdeContext);\n    }\n    async serializeRequest(operationSchema, input, context) {\n        const request = await super.serializeRequest(operationSchema, input, context);\n        const inputSchema = NormalizedSchema.of(operationSchema.input);\n        if (!request.headers[\"content-type\"]) {\n            const contentType = this.mixin.resolveRestContentType(this.getDefaultContentType(), inputSchema);\n            if (contentType) {\n                request.headers[\"content-type\"] = contentType;\n            }\n        }\n        if (request.body == null && request.headers[\"content-type\"] === this.getDefaultContentType()) {\n            request.body = \"{}\";\n        }\n        return request;\n    }\n    async deserializeResponse(operationSchema, context, response) {\n        const output = await super.deserializeResponse(operationSchema, context, response);\n        const outputSchema = NormalizedSchema.of(operationSchema.output);\n        for (const [name, member] of outputSchema.structIterator()) {\n            if (member.getMemberTraits().httpPayload && !(name in output)) {\n                output[name] = null;\n            }\n        }\n        return output;\n    }\n    async handleError(operationSchema, context, response, dataObject, metadata) {\n        const errorIdentifier = loadRestJsonErrorCode(response, dataObject) ?? \"Unknown\";\n        this.mixin.compose(this.compositeErrorRegistry, errorIdentifier, this.options.defaultNamespace);\n        const { errorSchema, errorMetadata } = await this.mixin.getErrorSchemaOrThrowBaseException(errorIdentifier, this.options.defaultNamespace, response, dataObject, metadata);\n        const ns = NormalizedSchema.of(errorSchema);\n        const message = dataObject.message ?? dataObject.Message ?? \"UnknownError\";\n        const ErrorCtor = this.compositeErrorRegistry.getErrorCtor(errorSchema) ?? Error;\n        const exception = new ErrorCtor(message);\n        await this.deserializeHttpMessage(errorSchema, context, response, dataObject);\n        const output = {};\n        const errorDeserializer = this.codec.createDeserializer();\n        for (const [name, member] of ns.structIterator()) {\n            const target = member.getMergedTraits().jsonName ?? name;\n            output[name] = errorDeserializer.readObject(member, dataObject[target]);\n        }\n        throw this.mixin.decorateServiceException(Object.assign(exception, errorMetadata, {\n            $fault: ns.getMergedTraits().error,\n            message,\n        }, output), dataObject);\n    }\n    getDefaultContentType() {\n        return \"application/json\";\n    }\n}\n", "import { expectUnion } from \"@smithy/smithy-client\";\nexport const awsExpectUnion = (value) => {\n    if (value == null) {\n        return undefined;\n    }\n    if (typeof value === \"object\" && \"__type\" in value) {\n        delete value.__type;\n    }\n    return expectUnion(value);\n};\n", "(()=>{\"use strict\";var t={d:(e,n)=>{for(var i in n)t.o(n,i)&&!t.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:n[i]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(t,\"__esModule\",{value:!0})}},e={};t.r(e),t.d(e,{XMLBuilder:()=>Bt,XMLParser:()=>Tt,XMLValidator:()=>Ut});const n=\":A-Za-z_\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD\",i=new RegExp(\"^[\"+n+\"][\"+n+\"\\\\-.\\\\d\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040]*$\");function s(t,e){const n=[];let i=e.exec(t);for(;i;){const s=[];s.startIndex=e.lastIndex-i[0].length;const r=i.length;for(let t=0;t<r;t++)s.push(i[t]);n.push(s),i=e.exec(t)}return n}const r=function(t){return!(null==i.exec(t))},o=[\"hasOwnProperty\",\"toString\",\"valueOf\",\"__defineGetter__\",\"__defineSetter__\",\"__lookupGetter__\",\"__lookupSetter__\"],a=[\"__proto__\",\"constructor\",\"prototype\"],h={allowBooleanAttributes:!1,unpairedTags:[]};function l(t,e){e=Object.assign({},h,e);const n=[];let i=!1,s=!1;\"\\ufeff\"===t[0]&&(t=t.substr(1));for(let r=0;r<t.length;r++)if(\"<\"===t[r]&&\"?\"===t[r+1]){if(r+=2,r=p(t,r),r.err)return r}else{if(\"<\"!==t[r]){if(u(t[r]))continue;return b(\"InvalidChar\",\"char '\"+t[r]+\"' is not expected.\",w(t,r))}{let o=r;if(r++,\"!\"===t[r]){r=c(t,r);continue}{let a=!1;\"/\"===t[r]&&(a=!0,r++);let h=\"\";for(;r<t.length&&\">\"!==t[r]&&\" \"!==t[r]&&\"\\t\"!==t[r]&&\"\\n\"!==t[r]&&\"\\r\"!==t[r];r++)h+=t[r];if(h=h.trim(),\"/\"===h[h.length-1]&&(h=h.substring(0,h.length-1),r--),!E(h)){let e;return e=0===h.trim().length?\"Invalid space after '<'.\":\"Tag '\"+h+\"' is an invalid name.\",b(\"InvalidTag\",e,w(t,r))}const l=g(t,r);if(!1===l)return b(\"InvalidAttr\",\"Attributes for '\"+h+\"' have open quote.\",w(t,r));let d=l.value;if(r=l.index,\"/\"===d[d.length-1]){const n=r-d.length;d=d.substring(0,d.length-1);const s=x(d,e);if(!0!==s)return b(s.err.code,s.err.msg,w(t,n+s.err.line));i=!0}else if(a){if(!l.tagClosed)return b(\"InvalidTag\",\"Closing tag '\"+h+\"' doesn't have proper closing.\",w(t,r));if(d.trim().length>0)return b(\"InvalidTag\",\"Closing tag '\"+h+\"' can't have attributes or invalid starting.\",w(t,o));if(0===n.length)return b(\"InvalidTag\",\"Closing tag '\"+h+\"' has not been opened.\",w(t,o));{const e=n.pop();if(h!==e.tagName){let n=w(t,e.tagStartPos);return b(\"InvalidTag\",\"Expected closing tag '\"+e.tagName+\"' (opened in line \"+n.line+\", col \"+n.col+\") instead of closing tag '\"+h+\"'.\",w(t,o))}0==n.length&&(s=!0)}}else{const a=x(d,e);if(!0!==a)return b(a.err.code,a.err.msg,w(t,r-d.length+a.err.line));if(!0===s)return b(\"InvalidXml\",\"Multiple possible root nodes found.\",w(t,r));-1!==e.unpairedTags.indexOf(h)||n.push({tagName:h,tagStartPos:o}),i=!0}for(r++;r<t.length;r++)if(\"<\"===t[r]){if(\"!\"===t[r+1]){r++,r=c(t,r);continue}if(\"?\"!==t[r+1])break;if(r=p(t,++r),r.err)return r}else if(\"&\"===t[r]){const e=N(t,r);if(-1==e)return b(\"InvalidChar\",\"char '&' is not expected.\",w(t,r));r=e}else if(!0===s&&!u(t[r]))return b(\"InvalidXml\",\"Extra text at the end\",w(t,r));\"<\"===t[r]&&r--}}}return i?1==n.length?b(\"InvalidTag\",\"Unclosed tag '\"+n[0].tagName+\"'.\",w(t,n[0].tagStartPos)):!(n.length>0)||b(\"InvalidXml\",\"Invalid '\"+JSON.stringify(n.map(t=>t.tagName),null,4).replace(/\\r?\\n/g,\"\")+\"' found.\",{line:1,col:1}):b(\"InvalidXml\",\"Start tag expected.\",1)}function u(t){return\" \"===t||\"\\t\"===t||\"\\n\"===t||\"\\r\"===t}function p(t,e){const n=e;for(;e<t.length;e++)if(\"?\"==t[e]||\" \"==t[e]){const i=t.substr(n,e-n);if(e>5&&\"xml\"===i)return b(\"InvalidXml\",\"XML declaration allowed only at the start of the document.\",w(t,e));if(\"?\"==t[e]&&\">\"==t[e+1]){e++;break}continue}return e}function c(t,e){if(t.length>e+5&&\"-\"===t[e+1]&&\"-\"===t[e+2]){for(e+=3;e<t.length;e++)if(\"-\"===t[e]&&\"-\"===t[e+1]&&\">\"===t[e+2]){e+=2;break}}else if(t.length>e+8&&\"D\"===t[e+1]&&\"O\"===t[e+2]&&\"C\"===t[e+3]&&\"T\"===t[e+4]&&\"Y\"===t[e+5]&&\"P\"===t[e+6]&&\"E\"===t[e+7]){let n=1;for(e+=8;e<t.length;e++)if(\"<\"===t[e])n++;else if(\">\"===t[e]&&(n--,0===n))break}else if(t.length>e+9&&\"[\"===t[e+1]&&\"C\"===t[e+2]&&\"D\"===t[e+3]&&\"A\"===t[e+4]&&\"T\"===t[e+5]&&\"A\"===t[e+6]&&\"[\"===t[e+7])for(e+=8;e<t.length;e++)if(\"]\"===t[e]&&\"]\"===t[e+1]&&\">\"===t[e+2]){e+=2;break}return e}const d='\"',f=\"'\";function g(t,e){let n=\"\",i=\"\",s=!1;for(;e<t.length;e++){if(t[e]===d||t[e]===f)\"\"===i?i=t[e]:i!==t[e]||(i=\"\");else if(\">\"===t[e]&&\"\"===i){s=!0;break}n+=t[e]}return\"\"===i&&{value:n,index:e,tagClosed:s}}const m=new RegExp(\"(\\\\s*)([^\\\\s=]+)(\\\\s*=)?(\\\\s*(['\\\"])(([\\\\s\\\\S])*?)\\\\5)?\",\"g\");function x(t,e){const n=s(t,m),i={};for(let t=0;t<n.length;t++){if(0===n[t][1].length)return b(\"InvalidAttr\",\"Attribute '\"+n[t][2]+\"' has no space in starting.\",v(n[t]));if(void 0!==n[t][3]&&void 0===n[t][4])return b(\"InvalidAttr\",\"Attribute '\"+n[t][2]+\"' is without value.\",v(n[t]));if(void 0===n[t][3]&&!e.allowBooleanAttributes)return b(\"InvalidAttr\",\"boolean attribute '\"+n[t][2]+\"' is not allowed.\",v(n[t]));const s=n[t][2];if(!y(s))return b(\"InvalidAttr\",\"Attribute '\"+s+\"' is an invalid name.\",v(n[t]));if(Object.prototype.hasOwnProperty.call(i,s))return b(\"InvalidAttr\",\"Attribute '\"+s+\"' is repeated.\",v(n[t]));i[s]=1}return!0}function N(t,e){if(\";\"===t[++e])return-1;if(\"#\"===t[e])return function(t,e){let n=/\\d/;for(\"x\"===t[e]&&(e++,n=/[\\da-fA-F]/);e<t.length;e++){if(\";\"===t[e])return e;if(!t[e].match(n))break}return-1}(t,++e);let n=0;for(;e<t.length;e++,n++)if(!(t[e].match(/\\w/)&&n<20)){if(\";\"===t[e])break;return-1}return e}function b(t,e,n){return{err:{code:t,msg:e,line:n.line||n,col:n.col}}}function y(t){return r(t)}function E(t){return r(t)}function w(t,e){const n=t.substring(0,e).split(/\\r?\\n/);return{line:n.length,col:n[n.length-1].length+1}}function v(t){return t.startIndex+t[1].length}const S=t=>o.includes(t)?\"__\"+t:t,_={preserveOrder:!1,attributeNamePrefix:\"@_\",attributesGroupName:!1,textNodeName:\"#text\",ignoreAttributes:!0,removeNSPrefix:!1,allowBooleanAttributes:!1,parseTagValue:!0,parseAttributeValue:!1,trimValues:!0,cdataPropName:!1,numberParseOptions:{hex:!0,leadingZeros:!0,eNotation:!0},tagValueProcessor:function(t,e){return e},attributeValueProcessor:function(t,e){return e},stopNodes:[],alwaysCreateTextNode:!1,isArray:()=>!1,commentPropName:!1,unpairedTags:[],processEntities:!0,htmlEntities:!1,entityDecoder:null,ignoreDeclaration:!1,ignorePiTags:!1,transformTagName:!1,transformAttributeName:!1,updateTag:function(t,e,n){return t},captureMetaData:!1,maxNestedTags:100,strictReservedNames:!0,jPath:!0,onDangerousProperty:S};function A(t,e){if(\"string\"!=typeof t)return;const n=t.toLowerCase();if(o.some(t=>n===t.toLowerCase()))throw new Error(`[SECURITY] Invalid ${e}: \"${t}\" is a reserved JavaScript keyword that could cause prototype pollution`);if(a.some(t=>n===t.toLowerCase()))throw new Error(`[SECURITY] Invalid ${e}: \"${t}\" is a reserved JavaScript keyword that could cause prototype pollution`)}function T(t,e){return\"boolean\"==typeof t?{enabled:t,maxEntitySize:1e4,maxExpansionDepth:1e4,maxTotalExpansions:1/0,maxExpandedLength:1e5,maxEntityCount:1e3,allowedTags:null,tagFilter:null,appliesTo:\"all\"}:\"object\"==typeof t&&null!==t?{enabled:!1!==t.enabled,maxEntitySize:Math.max(1,t.maxEntitySize??1e4),maxExpansionDepth:Math.max(1,t.maxExpansionDepth??1e4),maxTotalExpansions:Math.max(1,t.maxTotalExpansions??1/0),maxExpandedLength:Math.max(1,t.maxExpandedLength??1e5),maxEntityCount:Math.max(1,t.maxEntityCount??1e3),allowedTags:t.allowedTags??null,tagFilter:t.tagFilter??null,appliesTo:t.appliesTo??\"all\"}:T(!0)}const C=function(t){const e=Object.assign({},_,t),n=[{value:e.attributeNamePrefix,name:\"attributeNamePrefix\"},{value:e.attributesGroupName,name:\"attributesGroupName\"},{value:e.textNodeName,name:\"textNodeName\"},{value:e.cdataPropName,name:\"cdataPropName\"},{value:e.commentPropName,name:\"commentPropName\"}];for(const{value:t,name:e}of n)t&&A(t,e);return null===e.onDangerousProperty&&(e.onDangerousProperty=S),e.processEntities=T(e.processEntities,e.htmlEntities),e.unpairedTagsSet=new Set(e.unpairedTags),e.stopNodes&&Array.isArray(e.stopNodes)&&(e.stopNodes=e.stopNodes.map(t=>\"string\"==typeof t&&t.startsWith(\"*.\")?\"..\"+t.substring(2):t)),e};let P;P=\"function\"!=typeof Symbol?\"@@xmlMetadata\":Symbol(\"XML Node Metadata\");class O{constructor(t){this.tagname=t,this.child=[],this[\":@\"]=Object.create(null)}add(t,e){\"__proto__\"===t&&(t=\"#__proto__\"),this.child.push({[t]:e})}addChild(t,e){\"__proto__\"===t.tagname&&(t.tagname=\"#__proto__\"),t[\":@\"]&&Object.keys(t[\":@\"]).length>0?this.child.push({[t.tagname]:t.child,\":@\":t[\":@\"]}):this.child.push({[t.tagname]:t.child}),void 0!==e&&(this.child[this.child.length-1][P]={startIndex:e})}static getMetaDataSymbol(){return P}}class ${constructor(t){this.suppressValidationErr=!t,this.options=t}readDocType(t,e){const n=Object.create(null);let i=0;if(\"O\"!==t[e+3]||\"C\"!==t[e+4]||\"T\"!==t[e+5]||\"Y\"!==t[e+6]||\"P\"!==t[e+7]||\"E\"!==t[e+8])throw new Error(\"Invalid Tag instead of DOCTYPE\");{e+=9;let s=1,r=!1,o=!1,a=\"\";for(;e<t.length;e++)if(\"<\"!==t[e]||o)if(\">\"===t[e]){if(o?\"-\"===t[e-1]&&\"-\"===t[e-2]&&(o=!1,s--):s--,0===s)break}else\"[\"===t[e]?r=!0:a+=t[e];else{if(r&&D(t,\"!ENTITY\",e)){let s,r;if(e+=7,[s,r,e]=this.readEntityExp(t,e+1,this.suppressValidationErr),-1===r.indexOf(\"&\")){if(!1!==this.options.enabled&&null!=this.options.maxEntityCount&&i>=this.options.maxEntityCount)throw new Error(`Entity count (${i+1}) exceeds maximum allowed (${this.options.maxEntityCount})`);n[s]=r,i++}}else if(r&&D(t,\"!ELEMENT\",e)){e+=8;const{index:n}=this.readElementExp(t,e+1);e=n}else if(r&&D(t,\"!ATTLIST\",e))e+=8;else if(r&&D(t,\"!NOTATION\",e)){e+=9;const{index:n}=this.readNotationExp(t,e+1,this.suppressValidationErr);e=n}else{if(!D(t,\"!--\",e))throw new Error(\"Invalid DOCTYPE\");o=!0}s++,a=\"\"}if(0!==s)throw new Error(\"Unclosed DOCTYPE\")}return{entities:n,i:e}}readEntityExp(t,e){const n=e=I(t,e);for(;e<t.length&&!/\\s/.test(t[e])&&'\"'!==t[e]&&\"'\"!==t[e];)e++;let i=t.substring(n,e);if(M(i),e=I(t,e),!this.suppressValidationErr){if(\"SYSTEM\"===t.substring(e,e+6).toUpperCase())throw new Error(\"External entities are not supported\");if(\"%\"===t[e])throw new Error(\"Parameter entities are not supported\")}let s=\"\";if([e,s]=this.readIdentifierVal(t,e,\"entity\"),!1!==this.options.enabled&&null!=this.options.maxEntitySize&&s.length>this.options.maxEntitySize)throw new Error(`Entity \"${i}\" size (${s.length}) exceeds maximum allowed size (${this.options.maxEntitySize})`);return[i,s,--e]}readNotationExp(t,e){const n=e=I(t,e);for(;e<t.length&&!/\\s/.test(t[e]);)e++;let i=t.substring(n,e);!this.suppressValidationErr&&M(i),e=I(t,e);const s=t.substring(e,e+6).toUpperCase();if(!this.suppressValidationErr&&\"SYSTEM\"!==s&&\"PUBLIC\"!==s)throw new Error(`Expected SYSTEM or PUBLIC, found \"${s}\"`);e+=s.length,e=I(t,e);let r=null,o=null;if(\"PUBLIC\"===s)[e,r]=this.readIdentifierVal(t,e,\"publicIdentifier\"),'\"'!==t[e=I(t,e)]&&\"'\"!==t[e]||([e,o]=this.readIdentifierVal(t,e,\"systemIdentifier\"));else if(\"SYSTEM\"===s&&([e,o]=this.readIdentifierVal(t,e,\"systemIdentifier\"),!this.suppressValidationErr&&!o))throw new Error(\"Missing mandatory system identifier for SYSTEM notation\");return{notationName:i,publicIdentifier:r,systemIdentifier:o,index:--e}}readIdentifierVal(t,e,n){let i=\"\";const s=t[e];if('\"'!==s&&\"'\"!==s)throw new Error(`Expected quoted string, found \"${s}\"`);const r=++e;for(;e<t.length&&t[e]!==s;)e++;if(i=t.substring(r,e),t[e]!==s)throw new Error(`Unterminated ${n} value`);return[++e,i]}readElementExp(t,e){const n=e=I(t,e);for(;e<t.length&&!/\\s/.test(t[e]);)e++;let i=t.substring(n,e);if(!this.suppressValidationErr&&!r(i))throw new Error(`Invalid element name: \"${i}\"`);let s=\"\";if(\"E\"===t[e=I(t,e)]&&D(t,\"MPTY\",e))e+=4;else if(\"A\"===t[e]&&D(t,\"NY\",e))e+=2;else if(\"(\"===t[e]){const n=++e;for(;e<t.length&&\")\"!==t[e];)e++;if(s=t.substring(n,e),\")\"!==t[e])throw new Error(\"Unterminated content model\")}else if(!this.suppressValidationErr)throw new Error(`Invalid Element Expression, found \"${t[e]}\"`);return{elementName:i,contentModel:s.trim(),index:e}}readAttlistExp(t,e){let n=e=I(t,e);for(;e<t.length&&!/\\s/.test(t[e]);)e++;let i=t.substring(n,e);for(M(i),n=e=I(t,e);e<t.length&&!/\\s/.test(t[e]);)e++;let s=t.substring(n,e);if(!M(s))throw new Error(`Invalid attribute name: \"${s}\"`);e=I(t,e);let r=\"\";if(\"NOTATION\"===t.substring(e,e+8).toUpperCase()){if(r=\"NOTATION\",\"(\"!==t[e=I(t,e+=8)])throw new Error(`Expected '(', found \"${t[e]}\"`);e++;let n=[];for(;e<t.length&&\")\"!==t[e];){const i=e;for(;e<t.length&&\"|\"!==t[e]&&\")\"!==t[e];)e++;let s=t.substring(i,e);if(s=s.trim(),!M(s))throw new Error(`Invalid notation name: \"${s}\"`);n.push(s),\"|\"===t[e]&&(e++,e=I(t,e))}if(\")\"!==t[e])throw new Error(\"Unterminated list of notations\");e++,r+=\" (\"+n.join(\"|\")+\")\"}else{const n=e;for(;e<t.length&&!/\\s/.test(t[e]);)e++;r+=t.substring(n,e);const i=[\"CDATA\",\"ID\",\"IDREF\",\"IDREFS\",\"ENTITY\",\"ENTITIES\",\"NMTOKEN\",\"NMTOKENS\"];if(!this.suppressValidationErr&&!i.includes(r.toUpperCase()))throw new Error(`Invalid attribute type: \"${r}\"`)}e=I(t,e);let o=\"\";return\"#REQUIRED\"===t.substring(e,e+8).toUpperCase()?(o=\"#REQUIRED\",e+=8):\"#IMPLIED\"===t.substring(e,e+7).toUpperCase()?(o=\"#IMPLIED\",e+=7):[e,o]=this.readIdentifierVal(t,e,\"ATTLIST\"),{elementName:i,attributeName:s,attributeType:r,defaultValue:o,index:e}}}const I=(t,e)=>{for(;e<t.length&&/\\s/.test(t[e]);)e++;return e};function D(t,e,n){for(let i=0;i<e.length;i++)if(e[i]!==t[n+i+1])return!1;return!0}function M(t){if(r(t))return t;throw new Error(`Invalid entity name ${t}`)}const j=/^[-+]?0x[a-fA-F0-9]+$/,V=/^([\\-\\+])?(0*)([0-9]*(\\.[0-9]*)?)$/,L={hex:!0,leadingZeros:!0,decimalPoint:\".\",eNotation:!0,infinity:\"original\"};const k=/^([-+])?(0*)(\\d*(\\.\\d*)?[eE][-\\+]?\\d+)$/;class F{constructor(t){this._matcher=t}get separator(){return this._matcher.separator}getCurrentTag(){const t=this._matcher.path;return t.length>0?t[t.length-1].tag:void 0}getCurrentNamespace(){const t=this._matcher.path;return t.length>0?t[t.length-1].namespace:void 0}getAttrValue(t){const e=this._matcher.path;if(0!==e.length)return e[e.length-1].values?.[t]}hasAttr(t){const e=this._matcher.path;if(0===e.length)return!1;const n=e[e.length-1];return void 0!==n.values&&t in n.values}getPosition(){const t=this._matcher.path;return 0===t.length?-1:t[t.length-1].position??0}getCounter(){const t=this._matcher.path;return 0===t.length?-1:t[t.length-1].counter??0}getIndex(){return this.getPosition()}getDepth(){return this._matcher.path.length}toString(t,e=!0){return this._matcher.toString(t,e)}toArray(){return this._matcher.path.map(t=>t.tag)}matches(t){return this._matcher.matches(t)}matchesAny(t){return t.matchesAny(this._matcher)}}class R{constructor(t={}){this.separator=t.separator||\".\",this.path=[],this.siblingStacks=[],this._pathStringCache=null,this._view=new F(this)}push(t,e=null,n=null){this._pathStringCache=null,this.path.length>0&&(this.path[this.path.length-1].values=void 0);const i=this.path.length;this.siblingStacks[i]||(this.siblingStacks[i]=new Map);const s=this.siblingStacks[i],r=n?`${n}:${t}`:t,o=s.get(r)||0;let a=0;for(const t of s.values())a+=t;s.set(r,o+1);const h={tag:t,position:a,counter:o};null!=n&&(h.namespace=n),null!=e&&(h.values=e),this.path.push(h)}pop(){if(0===this.path.length)return;this._pathStringCache=null;const t=this.path.pop();return this.siblingStacks.length>this.path.length+1&&(this.siblingStacks.length=this.path.length+1),t}updateCurrent(t){if(this.path.length>0){const e=this.path[this.path.length-1];null!=t&&(e.values=t)}}getCurrentTag(){return this.path.length>0?this.path[this.path.length-1].tag:void 0}getCurrentNamespace(){return this.path.length>0?this.path[this.path.length-1].namespace:void 0}getAttrValue(t){if(0!==this.path.length)return this.path[this.path.length-1].values?.[t]}hasAttr(t){if(0===this.path.length)return!1;const e=this.path[this.path.length-1];return void 0!==e.values&&t in e.values}getPosition(){return 0===this.path.length?-1:this.path[this.path.length-1].position??0}getCounter(){return 0===this.path.length?-1:this.path[this.path.length-1].counter??0}getIndex(){return this.getPosition()}getDepth(){return this.path.length}toString(t,e=!0){const n=t||this.separator;if(n===this.separator&&!0===e){if(null!==this._pathStringCache)return this._pathStringCache;const t=this.path.map(t=>t.namespace?`${t.namespace}:${t.tag}`:t.tag).join(n);return this._pathStringCache=t,t}return this.path.map(t=>e&&t.namespace?`${t.namespace}:${t.tag}`:t.tag).join(n)}toArray(){return this.path.map(t=>t.tag)}reset(){this._pathStringCache=null,this.path=[],this.siblingStacks=[]}matches(t){const e=t.segments;return 0!==e.length&&(t.hasDeepWildcard()?this._matchWithDeepWildcard(e):this._matchSimple(e))}_matchSimple(t){if(this.path.length!==t.length)return!1;for(let e=0;e<t.length;e++)if(!this._matchSegment(t[e],this.path[e],e===this.path.length-1))return!1;return!0}_matchWithDeepWildcard(t){let e=this.path.length-1,n=t.length-1;for(;n>=0&&e>=0;){const i=t[n];if(\"deep-wildcard\"===i.type){if(n--,n<0)return!0;const i=t[n];let s=!1;for(let t=e;t>=0;t--)if(this._matchSegment(i,this.path[t],t===this.path.length-1)){e=t-1,n--,s=!0;break}if(!s)return!1}else{if(!this._matchSegment(i,this.path[e],e===this.path.length-1))return!1;e--,n--}}return n<0}_matchSegment(t,e,n){if(\"*\"!==t.tag&&t.tag!==e.tag)return!1;if(void 0!==t.namespace&&\"*\"!==t.namespace&&t.namespace!==e.namespace)return!1;if(void 0!==t.attrName){if(!n)return!1;if(!e.values||!(t.attrName in e.values))return!1;if(void 0!==t.attrValue&&String(e.values[t.attrName])!==String(t.attrValue))return!1}if(void 0!==t.position){if(!n)return!1;const i=e.counter??0;if(\"first\"===t.position&&0!==i)return!1;if(\"odd\"===t.position&&i%2!=1)return!1;if(\"even\"===t.position&&i%2!=0)return!1;if(\"nth\"===t.position&&i!==t.positionValue)return!1}return!0}matchesAny(t){return t.matchesAny(this)}snapshot(){return{path:this.path.map(t=>({...t})),siblingStacks:this.siblingStacks.map(t=>new Map(t))}}restore(t){this._pathStringCache=null,this.path=t.path.map(t=>({...t})),this.siblingStacks=t.siblingStacks.map(t=>new Map(t))}readOnly(){return this._view}}class G{constructor(t,e={},n){this.pattern=t,this.separator=e.separator||\".\",this.segments=this._parse(t),this.data=n,this._hasDeepWildcard=this.segments.some(t=>\"deep-wildcard\"===t.type),this._hasAttributeCondition=this.segments.some(t=>void 0!==t.attrName),this._hasPositionSelector=this.segments.some(t=>void 0!==t.position)}_parse(t){const e=[];let n=0,i=\"\";for(;n<t.length;)t[n]===this.separator?n+1<t.length&&t[n+1]===this.separator?(i.trim()&&(e.push(this._parseSegment(i.trim())),i=\"\"),e.push({type:\"deep-wildcard\"}),n+=2):(i.trim()&&e.push(this._parseSegment(i.trim())),i=\"\",n++):(i+=t[n],n++);return i.trim()&&e.push(this._parseSegment(i.trim())),e}_parseSegment(t){const e={type:\"tag\"};let n=null,i=t;const s=t.match(/^([^\\[]+)(\\[[^\\]]*\\])(.*)$/);if(s&&(i=s[1]+s[3],s[2])){const t=s[2].slice(1,-1);t&&(n=t)}let r,o,a=i;if(i.includes(\"::\")){const e=i.indexOf(\"::\");if(r=i.substring(0,e).trim(),a=i.substring(e+2).trim(),!r)throw new Error(`Invalid namespace in pattern: ${t}`)}let h=null;if(a.includes(\":\")){const t=a.lastIndexOf(\":\"),e=a.substring(0,t).trim(),n=a.substring(t+1).trim();[\"first\",\"last\",\"odd\",\"even\"].includes(n)||/^nth\\(\\d+\\)$/.test(n)?(o=e,h=n):o=a}else o=a;if(!o)throw new Error(`Invalid segment pattern: ${t}`);if(e.tag=o,r&&(e.namespace=r),n)if(n.includes(\"=\")){const t=n.indexOf(\"=\");e.attrName=n.substring(0,t).trim(),e.attrValue=n.substring(t+1).trim()}else e.attrName=n.trim();if(h){const t=h.match(/^nth\\((\\d+)\\)$/);t?(e.position=\"nth\",e.positionValue=parseInt(t[1],10)):e.position=h}return e}get length(){return this.segments.length}hasDeepWildcard(){return this._hasDeepWildcard}hasAttributeCondition(){return this._hasAttributeCondition}hasPositionSelector(){return this._hasPositionSelector}toString(){return this.pattern}}class B{constructor(){this._byDepthAndTag=new Map,this._wildcardByDepth=new Map,this._deepWildcards=[],this._patterns=new Set,this._sealed=!1}add(t){if(this._sealed)throw new TypeError(\"ExpressionSet is sealed. Create a new ExpressionSet to add more expressions.\");if(this._patterns.has(t.pattern))return this;if(this._patterns.add(t.pattern),t.hasDeepWildcard())return this._deepWildcards.push(t),this;const e=t.length,n=t.segments[t.segments.length-1],i=n?.tag;if(i&&\"*\"!==i){const n=`${e}:${i}`;this._byDepthAndTag.has(n)||this._byDepthAndTag.set(n,[]),this._byDepthAndTag.get(n).push(t)}else this._wildcardByDepth.has(e)||this._wildcardByDepth.set(e,[]),this._wildcardByDepth.get(e).push(t);return this}addAll(t){for(const e of t)this.add(e);return this}has(t){return this._patterns.has(t.pattern)}get size(){return this._patterns.size}seal(){return this._sealed=!0,this}get isSealed(){return this._sealed}matchesAny(t){return null!==this.findMatch(t)}findMatch(t){const e=t.getDepth(),n=`${e}:${t.getCurrentTag()}`,i=this._byDepthAndTag.get(n);if(i)for(let e=0;e<i.length;e++)if(t.matches(i[e]))return i[e];const s=this._wildcardByDepth.get(e);if(s)for(let e=0;e<s.length;e++)if(t.matches(s[e]))return s[e];for(let e=0;e<this._deepWildcards.length;e++)if(t.matches(this._deepWildcards[e]))return this._deepWildcards[e];return null}}const U={cent:\"\u00A2\",pound:\"\u00A3\",curren:\"\u00A4\",yen:\"\u00A5\",euro:\"\u20AC\",dollar:\"$\",euro:\"\u20AC\",fnof:\"\u0192\",inr:\"\u20B9\",af:\"\u060B\",birr:\"\u1265\u122D\",peso:\"\u20B1\",rub:\"\u20BD\",won:\"\u20A9\",yuan:\"\u00A5\",cedil:\"\u00B8\"},W={amp:\"&\",apos:\"'\",gt:\">\",lt:\"<\",quot:'\"'},X={nbsp:\"\u00A0\",copy:\"\u00A9\",reg:\"\u00AE\",trade:\"\u2122\",mdash:\"\u2014\",ndash:\"\u2013\",hellip:\"\u2026\",laquo:\"\u00AB\",raquo:\"\u00BB\",lsquo:\"\u2018\",rsquo:\"\u2019\",ldquo:\"\u201C\",rdquo:\"\u201D\",bull:\"\u2022\",para:\"\u00B6\",sect:\"\u00A7\",deg:\"\u00B0\",frac12:\"\u00BD\",frac14:\"\u00BC\",frac34:\"\u00BE\"},Y=new Set(\"!?\\\\\\\\/[]$%{}^&*()<>|+\");function z(t){if(\"#\"===t[0])throw new Error(`[EntityReplacer] Invalid character '#' in entity name: \"${t}\"`);for(const e of t)if(Y.has(e))throw new Error(`[EntityReplacer] Invalid character '${e}' in entity name: \"${t}\"`);return t}function q(...t){const e=Object.create(null);for(const n of t)if(n)for(const t of Object.keys(n)){const i=n[t];if(\"string\"==typeof i)e[t]=i;else if(i&&\"object\"==typeof i&&void 0!==i.val){const n=i.val;\"string\"==typeof n&&(e[t]=n)}}return e}const Z=\"external\",J=\"base\",K=\"all\",Q=Object.freeze({allow:0,leave:1,remove:2,throw:3}),H=new Set([9,10,13]);class tt{constructor(t={}){var e;this._limit=t.limit||{},this._maxTotalExpansions=this._limit.maxTotalExpansions||0,this._maxExpandedLength=this._limit.maxExpandedLength||0,this._postCheck=\"function\"==typeof t.postCheck?t.postCheck:t=>t,this._limitTiers=(e=this._limit.applyLimitsTo??Z)&&e!==Z?e===K?new Set([K]):e===J?new Set([J]):Array.isArray(e)?new Set(e):new Set([Z]):new Set([Z]),this._numericAllowed=t.numericAllowed??!0,this._baseMap=q(W,t.namedEntities||null),this._externalMap=Object.create(null),this._inputMap=Object.create(null),this._totalExpansions=0,this._expandedLength=0,this._removeSet=new Set(t.remove&&Array.isArray(t.remove)?t.remove:[]),this._leaveSet=new Set(t.leave&&Array.isArray(t.leave)?t.leave:[]);const n=function(t){if(!t)return{xmlVersion:1,onLevel:Q.allow,nullLevel:Q.remove};const e=1.1===t.xmlVersion?1.1:1,n=Q[t.onNCR]??Q.allow,i=Q[t.nullNCR]??Q.remove;return{xmlVersion:e,onLevel:n,nullLevel:Math.max(i,Q.remove)}}(t.ncr);this._ncrXmlVersion=n.xmlVersion,this._ncrOnLevel=n.onLevel,this._ncrNullLevel=n.nullLevel}setExternalEntities(t){if(t)for(const e of Object.keys(t))z(e);this._externalMap=q(t)}addExternalEntity(t,e){z(t),\"string\"==typeof e&&-1===e.indexOf(\"&\")&&(this._externalMap[t]=e)}addInputEntities(t){this._totalExpansions=0,this._expandedLength=0,this._inputMap=q(t)}reset(){return this._inputMap=Object.create(null),this._totalExpansions=0,this._expandedLength=0,this}setXmlVersion(t){this._ncrXmlVersion=1.1===t?1.1:1}decode(t){if(\"string\"!=typeof t||0===t.length)return t;const e=t,n=[],i=t.length;let s=0,r=0;const o=this._maxTotalExpansions>0,a=this._maxExpandedLength>0,h=o||a;for(;r<i;){if(38!==t.charCodeAt(r)){r++;continue}let e=r+1;for(;e<i&&59!==t.charCodeAt(e)&&e-r<=32;)e++;if(e>=i||59!==t.charCodeAt(e)){r++;continue}const l=t.slice(r+1,e);if(0===l.length){r++;continue}let u,p;if(this._removeSet.has(l))u=\"\",void 0===p&&(p=Z);else{if(this._leaveSet.has(l)){r++;continue}if(35===l.charCodeAt(0)){const t=this._resolveNCR(l);if(void 0===t){r++;continue}u=t,p=J}else{const t=this._resolveName(l);u=t?.value,p=t?.tier}}if(void 0!==u){if(r>s&&n.push(t.slice(s,r)),n.push(u),s=e+1,r=s,h&&this._tierCounts(p)){if(o&&(this._totalExpansions++,this._totalExpansions>this._maxTotalExpansions))throw new Error(`[EntityReplacer] Entity expansion count limit exceeded: ${this._totalExpansions} > ${this._maxTotalExpansions}`);if(a){const t=u.length-(l.length+2);if(t>0&&(this._expandedLength+=t,this._expandedLength>this._maxExpandedLength))throw new Error(`[EntityReplacer] Expanded content length limit exceeded: ${this._expandedLength} > ${this._maxExpandedLength}`)}}}else r++}s<i&&n.push(t.slice(s));const l=0===n.length?t:n.join(\"\");return this._postCheck(l,e)}_tierCounts(t){return!!this._limitTiers.has(K)||this._limitTiers.has(t)}_resolveName(t){return t in this._inputMap?{value:this._inputMap[t],tier:Z}:t in this._externalMap?{value:this._externalMap[t],tier:Z}:t in this._baseMap?{value:this._baseMap[t],tier:J}:void 0}_classifyNCR(t){return 0===t?this._ncrNullLevel:t>=55296&&t<=57343||1===this._ncrXmlVersion&&t>=1&&t<=31&&!H.has(t)?Q.remove:-1}_applyNCRAction(t,e,n){switch(t){case Q.allow:return String.fromCodePoint(n);case Q.remove:return\"\";case Q.leave:return;case Q.throw:throw new Error(`[EntityDecoder] Prohibited numeric character reference &${e}; (U+${n.toString(16).toUpperCase().padStart(4,\"0\")})`);default:return String.fromCodePoint(n)}}_resolveNCR(t){const e=t.charCodeAt(1);let n;if(n=120===e||88===e?parseInt(t.slice(2),16):parseInt(t.slice(1),10),Number.isNaN(n)||n<0||n>1114111)return;const i=this._classifyNCR(n);if(!this._numericAllowed&&i<Q.remove)return;const s=-1===i?this._ncrOnLevel:Math.max(this._ncrOnLevel,i);return this._applyNCRAction(s,t,n)}}function et(t,e){if(!t)return{};const n=e.attributesGroupName?t[e.attributesGroupName]:t;if(!n)return{};const i={};for(const t in n)t.startsWith(e.attributeNamePrefix)?i[t.substring(e.attributeNamePrefix.length)]=n[t]:i[t]=n[t];return i}function nt(t){if(!t||\"string\"!=typeof t)return;const e=t.indexOf(\":\");if(-1!==e&&e>0){const n=t.substring(0,e);if(\"xmlns\"!==n)return n}}class it{constructor(t){var e;this.options=t,this.currentNode=null,this.tagsNodeStack=[],this.parseXml=ht,this.parseTextData=st,this.resolveNameSpace=rt,this.buildAttributesMap=at,this.isItStopNode=ct,this.replaceEntitiesValue=ut,this.readStopNodeData=mt,this.saveTextToParentTag=pt,this.addChild=lt,this.ignoreAttributesFn=\"function\"==typeof(e=this.options.ignoreAttributes)?e:Array.isArray(e)?t=>{for(const n of e){if(\"string\"==typeof n&&t===n)return!0;if(n instanceof RegExp&&n.test(t))return!0}}:()=>!1,this.entityExpansionCount=0,this.currentExpandedLength=0;let n={...W};this.options.entityDecoder?this.entityDecoder=this.options.entityDecoder:(\"object\"==typeof this.options.htmlEntities?n=this.options.htmlEntities:!0===this.options.htmlEntities&&(n={...X,...U}),this.entityDecoder=new tt({namedEntities:n,numericAllowed:this.options.htmlEntities,limit:{maxTotalExpansions:this.options.processEntities.maxTotalExpansions,maxExpandedLength:this.options.processEntities.maxExpandedLength,applyLimitsTo:this.options.processEntities.appliesTo}})),this.matcher=new R,this.readonlyMatcher=this.matcher.readOnly(),this.isCurrentNodeStopNode=!1,this.stopNodeExpressionsSet=new B;const i=this.options.stopNodes;if(i&&i.length>0){for(let t=0;t<i.length;t++){const e=i[t];\"string\"==typeof e?this.stopNodeExpressionsSet.add(new G(e)):e instanceof G&&this.stopNodeExpressionsSet.add(e)}this.stopNodeExpressionsSet.seal()}}}function st(t,e,n,i,s,r,o){const a=this.options;if(void 0!==t&&(a.trimValues&&!i&&(t=t.trim()),t.length>0)){o||(t=this.replaceEntitiesValue(t,e,n));const i=a.jPath?n.toString():n,h=a.tagValueProcessor(e,t,i,s,r);return null==h?t:typeof h!=typeof t||h!==t?h:a.trimValues||t.trim()===t?xt(t,a.parseTagValue,a.numberParseOptions):t}}function rt(t){if(this.options.removeNSPrefix){const e=t.split(\":\"),n=\"/\"===t.charAt(0)?\"/\":\"\";if(\"xmlns\"===e[0])return\"\";2===e.length&&(t=n+e[1])}return t}const ot=new RegExp(\"([^\\\\s=]+)\\\\s*(=\\\\s*(['\\\"])([\\\\s\\\\S]*?)\\\\3)?\",\"gm\");function at(t,e,n,i=!1){const r=this.options;if(!0===i||!0!==r.ignoreAttributes&&\"string\"==typeof t){const i=s(t,ot),o=i.length,a={},h=new Array(o);let l=!1;const u={};for(let t=0;t<o;t++){const e=this.resolveNameSpace(i[t][1]),s=i[t][4];if(e.length&&void 0!==s){let i=s;r.trimValues&&(i=i.trim()),i=this.replaceEntitiesValue(i,n,this.readonlyMatcher),h[t]=i,u[e]=i,l=!0}}l&&\"object\"==typeof e&&e.updateCurrent&&e.updateCurrent(u);const p=r.jPath?e.toString():this.readonlyMatcher;let c=!1;for(let t=0;t<o;t++){const e=this.resolveNameSpace(i[t][1]);if(this.ignoreAttributesFn(e,p))continue;let n=r.attributeNamePrefix+e;if(e.length)if(r.transformAttributeName&&(n=r.transformAttributeName(n)),n=bt(n,r),void 0!==i[t][4]){const i=h[t],s=r.attributeValueProcessor(e,i,p);a[n]=null==s?i:typeof s!=typeof i||s!==i?s:xt(i,r.parseAttributeValue,r.numberParseOptions),c=!0}else r.allowBooleanAttributes&&(a[n]=!0,c=!0)}if(!c)return;if(r.attributesGroupName){const t={};return t[r.attributesGroupName]=a,t}return a}}const ht=function(t){t=t.replace(/\\r\\n?/g,\"\\n\");const e=new O(\"!xml\");let n=e,i=\"\";this.matcher.reset(),this.entityDecoder.reset(),this.entityExpansionCount=0,this.currentExpandedLength=0;const s=this.options,r=new $(s.processEntities),o=t.length;for(let a=0;a<o;a++)if(\"<\"===t[a]){const h=t.charCodeAt(a+1);if(47===h){const e=dt(t,\">\",a,\"Closing Tag is not closed.\");let r=t.substring(a+2,e).trim();if(s.removeNSPrefix){const t=r.indexOf(\":\");-1!==t&&(r=r.substr(t+1))}r=Nt(s.transformTagName,r,\"\",s).tagName,n&&(i=this.saveTextToParentTag(i,n,this.readonlyMatcher));const o=this.matcher.getCurrentTag();if(r&&s.unpairedTagsSet.has(r))throw new Error(`Unpaired tag can not be used as closing tag: </${r}>`);o&&s.unpairedTagsSet.has(o)&&(this.matcher.pop(),this.tagsNodeStack.pop()),this.matcher.pop(),this.isCurrentNodeStopNode=!1,n=this.tagsNodeStack.pop(),i=\"\",a=e}else if(63===h){let e=gt(t,a,!1,\"?>\");if(!e)throw new Error(\"Pi Tag is not closed.\");i=this.saveTextToParentTag(i,n,this.readonlyMatcher);const r=this.buildAttributesMap(e.tagExp,this.matcher,e.tagName,!0);if(r){const t=r[this.options.attributeNamePrefix+\"version\"];this.entityDecoder.setXmlVersion(Number(t)||1)}if(s.ignoreDeclaration&&\"?xml\"===e.tagName||s.ignorePiTags);else{const t=new O(e.tagName);t.add(s.textNodeName,\"\"),e.tagName!==e.tagExp&&e.attrExpPresent&&!0!==s.ignoreAttributes&&(t[\":@\"]=r),this.addChild(n,t,this.readonlyMatcher,a)}a=e.closeIndex+1}else if(33===h&&45===t.charCodeAt(a+2)&&45===t.charCodeAt(a+3)){const e=dt(t,\"--\\x3e\",a+4,\"Comment is not closed.\");if(s.commentPropName){const r=t.substring(a+4,e-2);i=this.saveTextToParentTag(i,n,this.readonlyMatcher),n.add(s.commentPropName,[{[s.textNodeName]:r}])}a=e}else if(33===h&&68===t.charCodeAt(a+2)){const e=r.readDocType(t,a);this.entityDecoder.addInputEntities(e.entities),a=e.i}else if(33===h&&91===t.charCodeAt(a+2)){const e=dt(t,\"]]>\",a,\"CDATA is not closed.\")-2,r=t.substring(a+9,e);i=this.saveTextToParentTag(i,n,this.readonlyMatcher);let o=this.parseTextData(r,n.tagname,this.readonlyMatcher,!0,!1,!0,!0);null==o&&(o=\"\"),s.cdataPropName?n.add(s.cdataPropName,[{[s.textNodeName]:r}]):n.add(s.textNodeName,o),a=e+2}else{let r=gt(t,a,s.removeNSPrefix);if(!r){const e=t.substring(Math.max(0,a-50),Math.min(o,a+50));throw new Error(`readTagExp returned undefined at position ${a}. Context: \"${e}\"`)}let h=r.tagName;const l=r.rawTagName;let u=r.tagExp,p=r.attrExpPresent,c=r.closeIndex;if(({tagName:h,tagExp:u}=Nt(s.transformTagName,h,u,s)),s.strictReservedNames&&(h===s.commentPropName||h===s.cdataPropName||h===s.textNodeName||h===s.attributesGroupName))throw new Error(`Invalid tag name: ${h}`);n&&i&&\"!xml\"!==n.tagname&&(i=this.saveTextToParentTag(i,n,this.readonlyMatcher,!1));const d=n;d&&s.unpairedTagsSet.has(d.tagname)&&(n=this.tagsNodeStack.pop(),this.matcher.pop());let f=!1;u.length>0&&u.lastIndexOf(\"/\")===u.length-1&&(f=!0,\"/\"===h[h.length-1]?(h=h.substr(0,h.length-1),u=h):u=u.substr(0,u.length-1),p=h!==u);let g,m=null,x={};g=nt(l),h!==e.tagname&&this.matcher.push(h,{},g),h!==u&&p&&(m=this.buildAttributesMap(u,this.matcher,h),m&&(x=et(m,s))),h!==e.tagname&&(this.isCurrentNodeStopNode=this.isItStopNode());const N=a;if(this.isCurrentNodeStopNode){let e=\"\";if(f)a=r.closeIndex;else if(s.unpairedTagsSet.has(h))a=r.closeIndex;else{const n=this.readStopNodeData(t,l,c+1);if(!n)throw new Error(`Unexpected end of ${l}`);a=n.i,e=n.tagContent}const i=new O(h);m&&(i[\":@\"]=m),i.add(s.textNodeName,e),this.matcher.pop(),this.isCurrentNodeStopNode=!1,this.addChild(n,i,this.readonlyMatcher,N)}else{if(f){({tagName:h,tagExp:u}=Nt(s.transformTagName,h,u,s));const t=new O(h);m&&(t[\":@\"]=m),this.addChild(n,t,this.readonlyMatcher,N),this.matcher.pop(),this.isCurrentNodeStopNode=!1}else{if(s.unpairedTagsSet.has(h)){const t=new O(h);m&&(t[\":@\"]=m),this.addChild(n,t,this.readonlyMatcher,N),this.matcher.pop(),this.isCurrentNodeStopNode=!1,a=r.closeIndex;continue}{const t=new O(h);if(this.tagsNodeStack.length>s.maxNestedTags)throw new Error(\"Maximum nested tags exceeded\");this.tagsNodeStack.push(n),m&&(t[\":@\"]=m),this.addChild(n,t,this.readonlyMatcher,N),n=t}}i=\"\",a=c}}}else i+=t[a];return e.child};function lt(t,e,n,i){this.options.captureMetaData||(i=void 0);const s=this.options.jPath?n.toString():n,r=this.options.updateTag(e.tagname,s,e[\":@\"]);!1===r||(\"string\"==typeof r?(e.tagname=r,t.addChild(e,i)):t.addChild(e,i))}function ut(t,e,n){const i=this.options.processEntities;if(!i||!i.enabled)return t;if(i.allowedTags){const s=this.options.jPath?n.toString():n;if(!(Array.isArray(i.allowedTags)?i.allowedTags.includes(e):i.allowedTags(e,s)))return t}if(i.tagFilter){const s=this.options.jPath?n.toString():n;if(!i.tagFilter(e,s))return t}return this.entityDecoder.decode(t)}function pt(t,e,n,i){return t&&(void 0===i&&(i=0===e.child.length),void 0!==(t=this.parseTextData(t,e.tagname,n,!1,!!e[\":@\"]&&0!==Object.keys(e[\":@\"]).length,i))&&\"\"!==t&&e.add(this.options.textNodeName,t),t=\"\"),t}function ct(){return 0!==this.stopNodeExpressionsSet.size&&this.matcher.matchesAny(this.stopNodeExpressionsSet)}function dt(t,e,n,i){const s=t.indexOf(e,n);if(-1===s)throw new Error(i);return s+e.length-1}function ft(t,e,n,i){const s=t.indexOf(e,n);if(-1===s)throw new Error(i);return s}function gt(t,e,n,i=\">\"){const s=function(t,e,n=\">\"){let i=0;const s=[],r=t.length,o=n.charCodeAt(0),a=n.length>1?n.charCodeAt(1):-1;for(let n=e;n<r;n++){const e=t.charCodeAt(n);if(i)e===i&&(i=0);else if(34===e||39===e)i=e;else if(e===o){if(-1===a)return{data:String.fromCharCode(...s),index:n};if(t.charCodeAt(n+1)===a)return{data:String.fromCharCode(...s),index:n}}else if(9===e){s.push(32);continue}s.push(e)}}(t,e+1,i);if(!s)return;let r=s.data;const o=s.index,a=r.search(/\\s/);let h=r,l=!0;-1!==a&&(h=r.substring(0,a),r=r.substring(a+1).trimStart());const u=h;if(n){const t=h.indexOf(\":\");-1!==t&&(h=h.substr(t+1),l=h!==s.data.substr(t+1))}return{tagName:h,tagExp:r,closeIndex:o,attrExpPresent:l,rawTagName:u}}function mt(t,e,n){const i=n;let s=1;const r=t.length;for(;n<r;n++)if(\"<\"===t[n]){const r=t.charCodeAt(n+1);if(47===r){const r=ft(t,\">\",n,`${e} is not closed`);if(t.substring(n+2,r).trim()===e&&(s--,0===s))return{tagContent:t.substring(i,n),i:r};n=r}else if(63===r)n=dt(t,\"?>\",n+1,\"StopNode is not closed.\");else if(33===r&&45===t.charCodeAt(n+2)&&45===t.charCodeAt(n+3))n=dt(t,\"--\\x3e\",n+3,\"StopNode is not closed.\");else if(33===r&&91===t.charCodeAt(n+2))n=dt(t,\"]]>\",n,\"StopNode is not closed.\")-2;else{const i=gt(t,n,\">\");i&&((i&&i.tagName)===e&&\"/\"!==i.tagExp[i.tagExp.length-1]&&s++,n=i.closeIndex)}}}function xt(t,e,n){if(e&&\"string\"==typeof t){const e=t.trim();return\"true\"===e||\"false\"!==e&&function(t,e={}){if(e=Object.assign({},L,e),!t||\"string\"!=typeof t)return t;let n=t.trim();if(0===n.length)return t;if(void 0!==e.skipLike&&e.skipLike.test(n))return t;if(\"0\"===n)return 0;if(e.hex&&j.test(n))return function(t){if(parseInt)return parseInt(t,16);if(Number.parseInt)return Number.parseInt(t,16);if(window&&window.parseInt)return window.parseInt(t,16);throw new Error(\"parseInt, Number.parseInt, window.parseInt are not supported\")}(n);if(isFinite(n)){if(n.includes(\"e\")||n.includes(\"E\"))return function(t,e,n){if(!n.eNotation)return t;const i=e.match(k);if(i){let s=i[1]||\"\";const r=-1===i[3].indexOf(\"e\")?\"E\":\"e\",o=i[2],a=s?t[o.length+1]===r:t[o.length]===r;return o.length>1&&a?t:(1!==o.length||!i[3].startsWith(`.${r}`)&&i[3][0]!==r)&&o.length>0?n.leadingZeros&&!a?(e=(i[1]||\"\")+i[3],Number(e)):t:Number(e)}return t}(t,n,e);{const s=V.exec(n);if(s){const r=s[1]||\"\",o=s[2];let a=(i=s[3])&&-1!==i.indexOf(\".\")?(\".\"===(i=i.replace(/0+$/,\"\"))?i=\"0\":\".\"===i[0]?i=\"0\"+i:\".\"===i[i.length-1]&&(i=i.substring(0,i.length-1)),i):i;const h=r?\".\"===t[o.length+1]:\".\"===t[o.length];if(!e.leadingZeros&&(o.length>1||1===o.length&&!h))return t;{const i=Number(n),s=String(i);if(0===i)return i;if(-1!==s.search(/[eE]/))return e.eNotation?i:t;if(-1!==n.indexOf(\".\"))return\"0\"===s||s===a||s===`${r}${a}`?i:t;let h=o?a:n;return o?h===s||r+h===s?i:t:h===s||h===r+s?i:t}}return t}}var i;return function(t,e,n){const i=e===1/0;switch(n.infinity.toLowerCase()){case\"null\":return null;case\"infinity\":return e;case\"string\":return i?\"Infinity\":\"-Infinity\";default:return t}}(t,Number(n),e)}(t,n)}return void 0!==t?t:\"\"}function Nt(t,e,n,i){if(t){const i=t(e);n===e&&(n=i),e=i}return{tagName:e=bt(e,i),tagExp:n}}function bt(t,e){if(a.includes(t))throw new Error(`[SECURITY] Invalid name: \"${t}\" is a reserved JavaScript keyword that could cause prototype pollution`);return o.includes(t)?e.onDangerousProperty(t):t}const yt=O.getMetaDataSymbol();function Et(t,e){if(!t||\"object\"!=typeof t)return{};if(!e)return t;const n={};for(const i in t)i.startsWith(e)?n[i.substring(e.length)]=t[i]:n[i]=t[i];return n}function wt(t,e,n,i){return vt(t,e,n,i)}function vt(t,e,n,i){let s;const r={};for(let o=0;o<t.length;o++){const a=t[o],h=St(a);if(void 0!==h&&h!==e.textNodeName){const t=Et(a[\":@\"]||{},e.attributeNamePrefix);n.push(h,t)}if(h===e.textNodeName)void 0===s?s=a[h]:s+=\"\"+a[h];else{if(void 0===h)continue;if(a[h]){let t=vt(a[h],e,n,i);const s=At(t,e);if(a[\":@\"]?_t(t,a[\":@\"],i,e):1!==Object.keys(t).length||void 0===t[e.textNodeName]||e.alwaysCreateTextNode?0===Object.keys(t).length&&(e.alwaysCreateTextNode?t[e.textNodeName]=\"\":t=\"\"):t=t[e.textNodeName],void 0!==a[yt]&&\"object\"==typeof t&&null!==t&&(t[yt]=a[yt]),void 0!==r[h]&&Object.prototype.hasOwnProperty.call(r,h))Array.isArray(r[h])||(r[h]=[r[h]]),r[h].push(t);else{const n=e.jPath?i.toString():i;e.isArray(h,n,s)?r[h]=[t]:r[h]=t}void 0!==h&&h!==e.textNodeName&&n.pop()}}}return\"string\"==typeof s?s.length>0&&(r[e.textNodeName]=s):void 0!==s&&(r[e.textNodeName]=s),r}function St(t){const e=Object.keys(t);for(let t=0;t<e.length;t++){const n=e[t];if(\":@\"!==n)return n}}function _t(t,e,n,i){if(e){const s=Object.keys(e),r=s.length;for(let o=0;o<r;o++){const r=s[o],a=r.startsWith(i.attributeNamePrefix)?r.substring(i.attributeNamePrefix.length):r,h=i.jPath?n.toString()+\".\"+a:n;i.isArray(r,h,!0,!0)?t[r]=[e[r]]:t[r]=e[r]}}}function At(t,e){const{textNodeName:n}=e,i=Object.keys(t).length;return 0===i||!(1!==i||!t[n]&&\"boolean\"!=typeof t[n]&&0!==t[n])}class Tt{constructor(t){this.externalEntities={},this.options=C(t)}parse(t,e){if(\"string\"!=typeof t&&t.toString)t=t.toString();else if(\"string\"!=typeof t)throw new Error(\"XML data is accepted in String or Bytes[] form.\");if(e){!0===e&&(e={});const n=l(t,e);if(!0!==n)throw Error(`${n.err.msg}:${n.err.line}:${n.err.col}`)}const n=new it(this.options);n.entityDecoder.setExternalEntities(this.externalEntities);const i=n.parseXml(t);return this.options.preserveOrder||void 0===i?i:wt(i,this.options,n.matcher,n.readonlyMatcher)}addEntity(t,e){if(-1!==e.indexOf(\"&\"))throw new Error(\"Entity value can't have '&'\");if(-1!==t.indexOf(\"&\")||-1!==t.indexOf(\";\"))throw new Error(\"An entity must be set without '&' and ';'. Eg. use '#xD' for '&#xD;'\");if(\"&\"===e)throw new Error(\"An entity with value '&' is not permitted\");this.externalEntities[t]=e}static getMetaDataSymbol(){return O.getMetaDataSymbol()}}function Ct(t,e){let n=\"\";e.format&&e.indentBy.length>0&&(n=\"\\n\");const i=[];if(e.stopNodes&&Array.isArray(e.stopNodes))for(let t=0;t<e.stopNodes.length;t++){const n=e.stopNodes[t];\"string\"==typeof n?i.push(new G(n)):n instanceof G&&i.push(n)}return Pt(t,e,n,new R,i)}function Pt(t,e,n,i,s){let r=\"\",o=!1;if(e.maxNestedTags&&i.getDepth()>e.maxNestedTags)throw new Error(\"Maximum nested tags exceeded\");if(!Array.isArray(t)){if(null!=t){let n=t.toString();return n=Vt(n,e),n}return\"\"}for(let a=0;a<t.length;a++){const h=t[a],l=Dt(h);if(void 0===l)continue;const u=Ot(h[\":@\"],e);i.push(l,u);const p=jt(i,s);if(l===e.textNodeName){let t=h[l];p||(t=e.tagValueProcessor(l,t),t=Vt(t,e)),o&&(r+=n),r+=t,o=!1,i.pop();continue}if(l===e.cdataPropName){o&&(r+=n);const t=h[l][0][e.textNodeName];r+=`<![CDATA[${String(t).replace(/\\]\\]>/g,\"]]]]><![CDATA[>\")}]]>`,o=!1,i.pop();continue}if(l===e.commentPropName){const t=h[l][0][e.textNodeName];r+=n+`\\x3c!--${String(t).replace(/--/g,\"- -\").replace(/-$/,\"- \")}--\\x3e`,o=!0,i.pop();continue}if(\"?\"===l[0]){const t=Mt(h[\":@\"],e,p),s=\"?xml\"===l?\"\":n;let a=h[l][0][e.textNodeName];a=0!==a.length?\" \"+a:\"\",r+=s+`<${l}${a}${t}?>`,o=!0,i.pop();continue}let c=n;\"\"!==c&&(c+=e.indentBy);const d=n+`<${l}${Mt(h[\":@\"],e,p)}`;let f;f=p?$t(h[l],e):Pt(h[l],e,c,i,s),-1!==e.unpairedTags.indexOf(l)?e.suppressUnpairedNode?r+=d+\">\":r+=d+\"/>\":f&&0!==f.length||!e.suppressEmptyNode?f&&f.endsWith(\">\")?r+=d+`>${f}${n}</${l}>`:(r+=d+\">\",f&&\"\"!==n&&(f.includes(\"/>\")||f.includes(\"</\"))?r+=n+e.indentBy+f+n:r+=f,r+=`</${l}>`):r+=d+\"/>\",o=!0,i.pop()}return r}function Ot(t,e){if(!t||e.ignoreAttributes)return null;const n={};let i=!1;for(let s in t)Object.prototype.hasOwnProperty.call(t,s)&&(n[s.startsWith(e.attributeNamePrefix)?s.substr(e.attributeNamePrefix.length):s]=t[s],i=!0);return i?n:null}function $t(t,e){if(!Array.isArray(t))return null!=t?t.toString():\"\";let n=\"\";for(let i=0;i<t.length;i++){const s=t[i],r=Dt(s);if(r===e.textNodeName)n+=s[r];else if(r===e.cdataPropName)n+=s[r][0][e.textNodeName];else if(r===e.commentPropName)n+=s[r][0][e.textNodeName];else{if(r&&\"?\"===r[0])continue;if(r){const t=It(s[\":@\"],e),i=$t(s[r],e);i&&0!==i.length?n+=`<${r}${t}>${i}</${r}>`:n+=`<${r}${t}/>`}}}return n}function It(t,e){let n=\"\";if(t&&!e.ignoreAttributes)for(let i in t){if(!Object.prototype.hasOwnProperty.call(t,i))continue;let s=t[i];!0===s&&e.suppressBooleanAttributes?n+=` ${i.substr(e.attributeNamePrefix.length)}`:n+=` ${i.substr(e.attributeNamePrefix.length)}=\"${s}\"`}return n}function Dt(t){const e=Object.keys(t);for(let n=0;n<e.length;n++){const i=e[n];if(Object.prototype.hasOwnProperty.call(t,i)&&\":@\"!==i)return i}}function Mt(t,e,n){let i=\"\";if(t&&!e.ignoreAttributes)for(let s in t){if(!Object.prototype.hasOwnProperty.call(t,s))continue;let r;n?r=t[s]:(r=e.attributeValueProcessor(s,t[s]),r=Vt(r,e)),!0===r&&e.suppressBooleanAttributes?i+=` ${s.substr(e.attributeNamePrefix.length)}`:i+=` ${s.substr(e.attributeNamePrefix.length)}=\"${r}\"`}return i}function jt(t,e){if(!e||0===e.length)return!1;for(let n=0;n<e.length;n++)if(t.matches(e[n]))return!0;return!1}function Vt(t,e){if(t&&t.length>0&&e.processEntities)for(let n=0;n<e.entities.length;n++){const i=e.entities[n];t=t.replace(i.regex,i.val)}return t}const Lt={attributeNamePrefix:\"@_\",attributesGroupName:!1,textNodeName:\"#text\",ignoreAttributes:!0,cdataPropName:!1,format:!1,indentBy:\"  \",suppressEmptyNode:!1,suppressUnpairedNode:!0,suppressBooleanAttributes:!0,tagValueProcessor:function(t,e){return e},attributeValueProcessor:function(t,e){return e},preserveOrder:!1,commentPropName:!1,unpairedTags:[],entities:[{regex:new RegExp(\"&\",\"g\"),val:\"&amp;\"},{regex:new RegExp(\">\",\"g\"),val:\"&gt;\"},{regex:new RegExp(\"<\",\"g\"),val:\"&lt;\"},{regex:new RegExp(\"'\",\"g\"),val:\"&apos;\"},{regex:new RegExp('\"',\"g\"),val:\"&quot;\"}],processEntities:!0,stopNodes:[],oneListGroup:!1,maxNestedTags:100,jPath:!0};function kt(t){if(this.options=Object.assign({},Lt,t),this.options.stopNodes&&Array.isArray(this.options.stopNodes)&&(this.options.stopNodes=this.options.stopNodes.map(t=>\"string\"==typeof t&&t.startsWith(\"*.\")?\"..\"+t.substring(2):t)),this.stopNodeExpressions=[],this.options.stopNodes&&Array.isArray(this.options.stopNodes))for(let t=0;t<this.options.stopNodes.length;t++){const e=this.options.stopNodes[t];\"string\"==typeof e?this.stopNodeExpressions.push(new G(e)):e instanceof G&&this.stopNodeExpressions.push(e)}var e;!0===this.options.ignoreAttributes||this.options.attributesGroupName?this.isAttribute=function(){return!1}:(this.ignoreAttributesFn=\"function\"==typeof(e=this.options.ignoreAttributes)?e:Array.isArray(e)?t=>{for(const n of e){if(\"string\"==typeof n&&t===n)return!0;if(n instanceof RegExp&&n.test(t))return!0}}:()=>!1,this.attrPrefixLen=this.options.attributeNamePrefix.length,this.isAttribute=Gt),this.processTextOrObjNode=Ft,this.options.format?(this.indentate=Rt,this.tagEndChar=\">\\n\",this.newLine=\"\\n\"):(this.indentate=function(){return\"\"},this.tagEndChar=\">\",this.newLine=\"\")}function Ft(t,e,n,i){const s=this.extractAttributes(t);if(i.push(e,s),this.checkStopNode(i)){const s=this.buildRawContent(t),r=this.buildAttributesForStopNode(t);return i.pop(),this.buildObjectNode(s,e,r,n)}const r=this.j2x(t,n+1,i);return i.pop(),void 0!==t[this.options.textNodeName]&&1===Object.keys(t).length?this.buildTextValNode(t[this.options.textNodeName],e,r.attrStr,n,i):this.buildObjectNode(r.val,e,r.attrStr,n)}function Rt(t){return this.options.indentBy.repeat(t)}function Gt(t){return!(!t.startsWith(this.options.attributeNamePrefix)||t===this.options.textNodeName)&&t.substr(this.attrPrefixLen)}kt.prototype.build=function(t){if(this.options.preserveOrder)return Ct(t,this.options);{Array.isArray(t)&&this.options.arrayNodeName&&this.options.arrayNodeName.length>1&&(t={[this.options.arrayNodeName]:t});const e=new R;return this.j2x(t,0,e).val}},kt.prototype.j2x=function(t,e,n){let i=\"\",s=\"\";if(this.options.maxNestedTags&&n.getDepth()>=this.options.maxNestedTags)throw new Error(\"Maximum nested tags exceeded\");const r=this.options.jPath?n.toString():n,o=this.checkStopNode(n);for(let a in t)if(Object.prototype.hasOwnProperty.call(t,a))if(void 0===t[a])this.isAttribute(a)&&(s+=\"\");else if(null===t[a])this.isAttribute(a)||a===this.options.cdataPropName?s+=\"\":\"?\"===a[0]?s+=this.indentate(e)+\"<\"+a+\"?\"+this.tagEndChar:s+=this.indentate(e)+\"<\"+a+\"/\"+this.tagEndChar;else if(t[a]instanceof Date)s+=this.buildTextValNode(t[a],a,\"\",e,n);else if(\"object\"!=typeof t[a]){const h=this.isAttribute(a);if(h&&!this.ignoreAttributesFn(h,r))i+=this.buildAttrPairStr(h,\"\"+t[a],o);else if(!h)if(a===this.options.textNodeName){let e=this.options.tagValueProcessor(a,\"\"+t[a]);s+=this.replaceEntitiesValue(e)}else{n.push(a);const i=this.checkStopNode(n);if(n.pop(),i){const n=\"\"+t[a];s+=\"\"===n?this.indentate(e)+\"<\"+a+this.closeTag(a)+this.tagEndChar:this.indentate(e)+\"<\"+a+\">\"+n+\"</\"+a+this.tagEndChar}else s+=this.buildTextValNode(t[a],a,\"\",e,n)}}else if(Array.isArray(t[a])){const i=t[a].length;let r=\"\",o=\"\";for(let h=0;h<i;h++){const i=t[a][h];if(void 0===i);else if(null===i)\"?\"===a[0]?s+=this.indentate(e)+\"<\"+a+\"?\"+this.tagEndChar:s+=this.indentate(e)+\"<\"+a+\"/\"+this.tagEndChar;else if(\"object\"==typeof i)if(this.options.oneListGroup){n.push(a);const t=this.j2x(i,e+1,n);n.pop(),r+=t.val,this.options.attributesGroupName&&i.hasOwnProperty(this.options.attributesGroupName)&&(o+=t.attrStr)}else r+=this.processTextOrObjNode(i,a,e,n);else if(this.options.oneListGroup){let t=this.options.tagValueProcessor(a,i);t=this.replaceEntitiesValue(t),r+=t}else{n.push(a);const t=this.checkStopNode(n);if(n.pop(),t){const t=\"\"+i;r+=\"\"===t?this.indentate(e)+\"<\"+a+this.closeTag(a)+this.tagEndChar:this.indentate(e)+\"<\"+a+\">\"+t+\"</\"+a+this.tagEndChar}else r+=this.buildTextValNode(i,a,\"\",e,n)}}this.options.oneListGroup&&(r=this.buildObjectNode(r,a,o,e)),s+=r}else if(this.options.attributesGroupName&&a===this.options.attributesGroupName){const e=Object.keys(t[a]),n=e.length;for(let s=0;s<n;s++)i+=this.buildAttrPairStr(e[s],\"\"+t[a][e[s]],o)}else s+=this.processTextOrObjNode(t[a],a,e,n);return{attrStr:i,val:s}},kt.prototype.buildAttrPairStr=function(t,e,n){return n||(e=this.options.attributeValueProcessor(t,\"\"+e),e=this.replaceEntitiesValue(e)),this.options.suppressBooleanAttributes&&\"true\"===e?\" \"+t:\" \"+t+'=\"'+e+'\"'},kt.prototype.extractAttributes=function(t){if(!t||\"object\"!=typeof t)return null;const e={};let n=!1;if(this.options.attributesGroupName&&t[this.options.attributesGroupName]){const i=t[this.options.attributesGroupName];for(let t in i)Object.prototype.hasOwnProperty.call(i,t)&&(e[t.startsWith(this.options.attributeNamePrefix)?t.substring(this.options.attributeNamePrefix.length):t]=i[t],n=!0)}else for(let i in t){if(!Object.prototype.hasOwnProperty.call(t,i))continue;const s=this.isAttribute(i);s&&(e[s]=t[i],n=!0)}return n?e:null},kt.prototype.buildRawContent=function(t){if(\"string\"==typeof t)return t;if(\"object\"!=typeof t||null===t)return String(t);if(void 0!==t[this.options.textNodeName])return t[this.options.textNodeName];let e=\"\";for(let n in t){if(!Object.prototype.hasOwnProperty.call(t,n))continue;if(this.isAttribute(n))continue;if(this.options.attributesGroupName&&n===this.options.attributesGroupName)continue;const i=t[n];if(n===this.options.textNodeName)e+=i;else if(Array.isArray(i)){for(let t of i)if(\"string\"==typeof t||\"number\"==typeof t)e+=`<${n}>${t}</${n}>`;else if(\"object\"==typeof t&&null!==t){const i=this.buildRawContent(t),s=this.buildAttributesForStopNode(t);e+=\"\"===i?`<${n}${s}/>`:`<${n}${s}>${i}</${n}>`}}else if(\"object\"==typeof i&&null!==i){const t=this.buildRawContent(i),s=this.buildAttributesForStopNode(i);e+=\"\"===t?`<${n}${s}/>`:`<${n}${s}>${t}</${n}>`}else e+=`<${n}>${i}</${n}>`}return e},kt.prototype.buildAttributesForStopNode=function(t){if(!t||\"object\"!=typeof t)return\"\";let e=\"\";if(this.options.attributesGroupName&&t[this.options.attributesGroupName]){const n=t[this.options.attributesGroupName];for(let t in n){if(!Object.prototype.hasOwnProperty.call(n,t))continue;const i=t.startsWith(this.options.attributeNamePrefix)?t.substring(this.options.attributeNamePrefix.length):t,s=n[t];!0===s&&this.options.suppressBooleanAttributes?e+=\" \"+i:e+=\" \"+i+'=\"'+s+'\"'}}else for(let n in t){if(!Object.prototype.hasOwnProperty.call(t,n))continue;const i=this.isAttribute(n);if(i){const s=t[n];!0===s&&this.options.suppressBooleanAttributes?e+=\" \"+i:e+=\" \"+i+'=\"'+s+'\"'}}return e},kt.prototype.buildObjectNode=function(t,e,n,i){if(\"\"===t)return\"?\"===e[0]?this.indentate(i)+\"<\"+e+n+\"?\"+this.tagEndChar:this.indentate(i)+\"<\"+e+n+this.closeTag(e)+this.tagEndChar;{let s=\"</\"+e+this.tagEndChar,r=\"\";return\"?\"===e[0]&&(r=\"?\",s=\"\"),!n&&\"\"!==n||-1!==t.indexOf(\"<\")?!1!==this.options.commentPropName&&e===this.options.commentPropName&&0===r.length?this.indentate(i)+`\\x3c!--${t}--\\x3e`+this.newLine:this.indentate(i)+\"<\"+e+n+r+this.tagEndChar+t+this.indentate(i)+s:this.indentate(i)+\"<\"+e+n+r+\">\"+t+s}},kt.prototype.closeTag=function(t){let e=\"\";return-1!==this.options.unpairedTags.indexOf(t)?this.options.suppressUnpairedNode||(e=\"/\"):e=this.options.suppressEmptyNode?\"/\":`></${t}`,e},kt.prototype.checkStopNode=function(t){if(!this.stopNodeExpressions||0===this.stopNodeExpressions.length)return!1;for(let e=0;e<this.stopNodeExpressions.length;e++)if(t.matches(this.stopNodeExpressions[e]))return!0;return!1},kt.prototype.buildTextValNode=function(t,e,n,i,s){if(!1!==this.options.cdataPropName&&e===this.options.cdataPropName){const e=String(t).replace(/\\]\\]>/g,\"]]]]><![CDATA[>\");return this.indentate(i)+`<![CDATA[${e}]]>`+this.newLine}if(!1!==this.options.commentPropName&&e===this.options.commentPropName){const e=String(t).replace(/--/g,\"- -\").replace(/-$/,\"- \");return this.indentate(i)+`\\x3c!--${e}--\\x3e`+this.newLine}if(\"?\"===e[0])return this.indentate(i)+\"<\"+e+n+\"?\"+this.tagEndChar;{let s=this.options.tagValueProcessor(e,t);return s=this.replaceEntitiesValue(s),\"\"===s?this.indentate(i)+\"<\"+e+n+this.closeTag(e)+this.tagEndChar:this.indentate(i)+\"<\"+e+n+\">\"+s+\"</\"+e+this.tagEndChar}},kt.prototype.replaceEntitiesValue=function(t){if(t&&t.length>0&&this.options.processEntities)for(let e=0;e<this.options.entities.length;e++){const n=this.options.entities[e];t=t.replace(n.regex,n.val)}return t};const Bt=kt,Ut={validate:l};module.exports=e})();", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.parseXML = parseXML;\nconst fast_xml_parser_1 = require(\"fast-xml-parser\");\nconst parser = new fast_xml_parser_1.XMLParser({\n    attributeNamePrefix: \"\",\n    processEntities: {\n        enabled: true,\n        maxTotalExpansions: Infinity,\n    },\n    htmlEntities: true,\n    ignoreAttributes: false,\n    ignoreDeclaration: true,\n    parseTagValue: false,\n    trimValues: false,\n    tagValueProcessor: (_, val) => (val.trim() === \"\" && val.includes(\"\\n\") ? \"\" : undefined),\n    maxNestedTags: Infinity,\n});\nfunction parseXML(xmlString) {\n    return parser.parse(xmlString, true);\n}\n", "'use strict';\n\nvar xmlParser = require('./xml-parser');\n\nconst ATTR_ESCAPE_RE = /[&<>\"]/g;\nconst ATTR_ESCAPE_MAP = {\n    \"&\": \"&amp;\",\n    \"<\": \"&lt;\",\n    \">\": \"&gt;\",\n    '\"': \"&quot;\",\n};\nfunction escapeAttribute(value) {\n    return value.replace(ATTR_ESCAPE_RE, (ch) => ATTR_ESCAPE_MAP[ch]);\n}\n\nconst ELEMENT_ESCAPE_RE = /[&\"'<>\\r\\n\\u0085\\u2028]/g;\nconst ELEMENT_ESCAPE_MAP = {\n    \"&\": \"&amp;\",\n    '\"': \"&quot;\",\n    \"'\": \"&apos;\",\n    \"<\": \"&lt;\",\n    \">\": \"&gt;\",\n    \"\\r\": \"&#x0D;\",\n    \"\\n\": \"&#x0A;\",\n    \"\\u0085\": \"&#x85;\",\n    \"\\u2028\": \"&#x2028;\",\n};\nfunction escapeElement(value) {\n    return value.replace(ELEMENT_ESCAPE_RE, (ch) => ELEMENT_ESCAPE_MAP[ch]);\n}\n\nclass XmlText {\n    value;\n    constructor(value) {\n        this.value = value;\n    }\n    toString() {\n        return escapeElement(\"\" + this.value);\n    }\n}\n\nclass XmlNode {\n    name;\n    children;\n    attributes = {};\n    static of(name, childText, withName) {\n        const node = new XmlNode(name);\n        if (childText !== undefined) {\n            node.addChildNode(new XmlText(childText));\n        }\n        if (withName !== undefined) {\n            node.withName(withName);\n        }\n        return node;\n    }\n    constructor(name, children = []) {\n        this.name = name;\n        this.children = children;\n    }\n    withName(name) {\n        this.name = name;\n        return this;\n    }\n    addAttribute(name, value) {\n        this.attributes[name] = value;\n        return this;\n    }\n    addChildNode(child) {\n        this.children.push(child);\n        return this;\n    }\n    removeAttribute(name) {\n        delete this.attributes[name];\n        return this;\n    }\n    n(name) {\n        this.name = name;\n        return this;\n    }\n    c(child) {\n        this.children.push(child);\n        return this;\n    }\n    a(name, value) {\n        if (value != null) {\n            this.attributes[name] = value;\n        }\n        return this;\n    }\n    cc(input, field, withName = field) {\n        if (input[field] != null) {\n            const node = XmlNode.of(field, input[field]).withName(withName);\n            this.c(node);\n        }\n    }\n    l(input, listName, memberName, valueProvider) {\n        if (input[listName] != null) {\n            const nodes = valueProvider();\n            nodes.map((node) => {\n                node.withName(memberName);\n                this.c(node);\n            });\n        }\n    }\n    lc(input, listName, memberName, valueProvider) {\n        if (input[listName] != null) {\n            const nodes = valueProvider();\n            const containerNode = new XmlNode(memberName);\n            nodes.map((node) => {\n                containerNode.c(node);\n            });\n            this.c(containerNode);\n        }\n    }\n    toString() {\n        const hasChildren = Boolean(this.children.length);\n        let xmlText = `<${this.name}`;\n        const attributes = this.attributes;\n        for (const attributeName of Object.keys(attributes)) {\n            const attribute = attributes[attributeName];\n            if (attribute != null) {\n                xmlText += ` ${attributeName}=\"${escapeAttribute(\"\" + attribute)}\"`;\n            }\n        }\n        return (xmlText += !hasChildren ? \"/>\" : `>${this.children.map((c) => c.toString()).join(\"\")}</${this.name}>`);\n    }\n}\n\nexports.parseXML = xmlParser.parseXML;\nexports.XmlNode = XmlNode;\nexports.XmlText = XmlText;\n", "import { parseXML } from \"@aws-sdk/xml-builder\";\nimport { FromStringShapeDeserializer } from \"@smithy/core/protocols\";\nimport { NormalizedSchema } from \"@smithy/core/schema\";\nimport { getValueFromTextNode } from \"@smithy/smithy-client\";\nimport { toUtf8 } from \"@smithy/util-utf8\";\nimport { SerdeContextConfig } from \"../ConfigurableSerdeContext\";\nimport { UnionSerde } from \"../UnionSerde\";\nexport class XmlShapeDeserializer extends SerdeContextConfig {\n    settings;\n    stringDeserializer;\n    constructor(settings) {\n        super();\n        this.settings = settings;\n        this.stringDeserializer = new FromStringShapeDeserializer(settings);\n    }\n    setSerdeContext(serdeContext) {\n        this.serdeContext = serdeContext;\n        this.stringDeserializer.setSerdeContext(serdeContext);\n    }\n    read(schema, bytes, key) {\n        const ns = NormalizedSchema.of(schema);\n        const memberSchemas = ns.getMemberSchemas();\n        const isEventPayload = ns.isStructSchema() &&\n            ns.isMemberSchema() &&\n            !!Object.values(memberSchemas).find((memberNs) => {\n                return !!memberNs.getMemberTraits().eventPayload;\n            });\n        if (isEventPayload) {\n            const output = {};\n            const memberName = Object.keys(memberSchemas)[0];\n            const eventMemberSchema = memberSchemas[memberName];\n            if (eventMemberSchema.isBlobSchema()) {\n                output[memberName] = bytes;\n            }\n            else {\n                output[memberName] = this.read(memberSchemas[memberName], bytes);\n            }\n            return output;\n        }\n        const xmlString = (this.serdeContext?.utf8Encoder ?? toUtf8)(bytes);\n        const parsedObject = this.parseXml(xmlString);\n        return this.readSchema(schema, key ? parsedObject[key] : parsedObject);\n    }\n    readSchema(_schema, value) {\n        const ns = NormalizedSchema.of(_schema);\n        if (ns.isUnitSchema()) {\n            return;\n        }\n        const traits = ns.getMergedTraits();\n        if (ns.isListSchema() && !Array.isArray(value)) {\n            return this.readSchema(ns, [value]);\n        }\n        if (value == null) {\n            return value;\n        }\n        if (typeof value === \"object\") {\n            const flat = !!traits.xmlFlattened;\n            if (ns.isListSchema()) {\n                const listValue = ns.getValueSchema();\n                const buffer = [];\n                const sourceKey = listValue.getMergedTraits().xmlName ?? \"member\";\n                const source = flat ? value : (value[0] ?? value)[sourceKey];\n                if (source == null) {\n                    return buffer;\n                }\n                const sourceArray = Array.isArray(source) ? source : [source];\n                for (const v of sourceArray) {\n                    buffer.push(this.readSchema(listValue, v));\n                }\n                return buffer;\n            }\n            const buffer = {};\n            if (ns.isMapSchema()) {\n                const keyNs = ns.getKeySchema();\n                const memberNs = ns.getValueSchema();\n                let entries;\n                if (flat) {\n                    entries = Array.isArray(value) ? value : [value];\n                }\n                else {\n                    entries = Array.isArray(value.entry) ? value.entry : [value.entry];\n                }\n                const keyProperty = keyNs.getMergedTraits().xmlName ?? \"key\";\n                const valueProperty = memberNs.getMergedTraits().xmlName ?? \"value\";\n                for (const entry of entries) {\n                    const key = entry[keyProperty];\n                    const value = entry[valueProperty];\n                    buffer[key] = this.readSchema(memberNs, value);\n                }\n                return buffer;\n            }\n            if (ns.isStructSchema()) {\n                const union = ns.isUnionSchema();\n                let unionSerde;\n                if (union) {\n                    unionSerde = new UnionSerde(value, buffer);\n                }\n                for (const [memberName, memberSchema] of ns.structIterator()) {\n                    const memberTraits = memberSchema.getMergedTraits();\n                    const xmlObjectKey = !memberTraits.httpPayload\n                        ? memberSchema.getMemberTraits().xmlName ?? memberName\n                        : memberTraits.xmlName ?? memberSchema.getName();\n                    if (union) {\n                        unionSerde.mark(xmlObjectKey);\n                    }\n                    if (value[xmlObjectKey] != null) {\n                        buffer[memberName] = this.readSchema(memberSchema, value[xmlObjectKey]);\n                    }\n                }\n                if (union) {\n                    unionSerde.writeUnknown();\n                }\n                return buffer;\n            }\n            if (ns.isDocumentSchema()) {\n                return value;\n            }\n            throw new Error(`@aws-sdk/core/protocols - xml deserializer unhandled schema type for ${ns.getName(true)}`);\n        }\n        if (ns.isListSchema()) {\n            return [];\n        }\n        if (ns.isMapSchema() || ns.isStructSchema()) {\n            return {};\n        }\n        return this.stringDeserializer.read(ns, value);\n    }\n    parseXml(xml) {\n        if (xml.length) {\n            let parsedObj;\n            try {\n                parsedObj = parseXML(xml);\n            }\n            catch (e) {\n                if (e && typeof e === \"object\") {\n                    Object.defineProperty(e, \"$responseBodyText\", {\n                        value: xml,\n                    });\n                }\n                throw e;\n            }\n            const textNodeName = \"#text\";\n            const key = Object.keys(parsedObj)[0];\n            const parsedObjToReturn = parsedObj[key];\n            if (parsedObjToReturn[textNodeName]) {\n                parsedObjToReturn[key] = parsedObjToReturn[textNodeName];\n                delete parsedObjToReturn[textNodeName];\n            }\n            return getValueFromTextNode(parsedObjToReturn);\n        }\n        return {};\n    }\n}\n", "import { determineTimestampFormat, extendedEncodeURIComponent } from \"@smithy/core/protocols\";\nimport { NormalizedSchema } from \"@smithy/core/schema\";\nimport { generateIdempotencyToken, NumericValue } from \"@smithy/core/serde\";\nimport { dateToUtcString } from \"@smithy/smithy-client\";\nimport { toBase64 } from \"@smithy/util-base64\";\nimport { SerdeContextConfig } from \"../ConfigurableSerdeContext\";\nexport class QueryShapeSerializer extends SerdeContextConfig {\n    settings;\n    buffer;\n    constructor(settings) {\n        super();\n        this.settings = settings;\n    }\n    write(schema, value, prefix = \"\") {\n        if (this.buffer === undefined) {\n            this.buffer = \"\";\n        }\n        const ns = NormalizedSchema.of(schema);\n        if (prefix && !prefix.endsWith(\".\")) {\n            prefix += \".\";\n        }\n        if (ns.isBlobSchema()) {\n            if (typeof value === \"string\" || value instanceof Uint8Array) {\n                this.writeKey(prefix);\n                this.writeValue((this.serdeContext?.base64Encoder ?? toBase64)(value));\n            }\n        }\n        else if (ns.isBooleanSchema() || ns.isNumericSchema() || ns.isStringSchema()) {\n            if (value != null) {\n                this.writeKey(prefix);\n                this.writeValue(String(value));\n            }\n            else if (ns.isIdempotencyToken()) {\n                this.writeKey(prefix);\n                this.writeValue(generateIdempotencyToken());\n            }\n        }\n        else if (ns.isBigIntegerSchema()) {\n            if (value != null) {\n                this.writeKey(prefix);\n                this.writeValue(String(value));\n            }\n        }\n        else if (ns.isBigDecimalSchema()) {\n            if (value != null) {\n                this.writeKey(prefix);\n                this.writeValue(value instanceof NumericValue ? value.string : String(value));\n            }\n        }\n        else if (ns.isTimestampSchema()) {\n            if (value instanceof Date) {\n                this.writeKey(prefix);\n                const format = determineTimestampFormat(ns, this.settings);\n                switch (format) {\n                    case 5:\n                        this.writeValue(value.toISOString().replace(\".000Z\", \"Z\"));\n                        break;\n                    case 6:\n                        this.writeValue(dateToUtcString(value));\n                        break;\n                    case 7:\n                        this.writeValue(String(value.getTime() / 1000));\n                        break;\n                }\n            }\n        }\n        else if (ns.isDocumentSchema()) {\n            if (Array.isArray(value)) {\n                this.write(64 | 15, value, prefix);\n            }\n            else if (value instanceof Date) {\n                this.write(4, value, prefix);\n            }\n            else if (value instanceof Uint8Array) {\n                this.write(21, value, prefix);\n            }\n            else if (value && typeof value === \"object\") {\n                this.write(128 | 15, value, prefix);\n            }\n            else {\n                this.writeKey(prefix);\n                this.writeValue(String(value));\n            }\n        }\n        else if (ns.isListSchema()) {\n            if (Array.isArray(value)) {\n                if (value.length === 0) {\n                    if (this.settings.serializeEmptyLists) {\n                        this.writeKey(prefix);\n                        this.writeValue(\"\");\n                    }\n                }\n                else {\n                    const member = ns.getValueSchema();\n                    const flat = this.settings.flattenLists || ns.getMergedTraits().xmlFlattened;\n                    let i = 1;\n                    for (const item of value) {\n                        if (item == null) {\n                            continue;\n                        }\n                        const traits = member.getMergedTraits();\n                        const suffix = this.getKey(\"member\", traits.xmlName, traits.ec2QueryName);\n                        const key = flat ? `${prefix}${i}` : `${prefix}${suffix}.${i}`;\n                        this.write(member, item, key);\n                        ++i;\n                    }\n                }\n            }\n        }\n        else if (ns.isMapSchema()) {\n            if (value && typeof value === \"object\") {\n                const keySchema = ns.getKeySchema();\n                const memberSchema = ns.getValueSchema();\n                const flat = ns.getMergedTraits().xmlFlattened;\n                let i = 1;\n                for (const k in value) {\n                    const v = value[k];\n                    if (v == null) {\n                        continue;\n                    }\n                    const keyTraits = keySchema.getMergedTraits();\n                    const keySuffix = this.getKey(\"key\", keyTraits.xmlName, keyTraits.ec2QueryName);\n                    const key = flat ? `${prefix}${i}.${keySuffix}` : `${prefix}entry.${i}.${keySuffix}`;\n                    const valTraits = memberSchema.getMergedTraits();\n                    const valueSuffix = this.getKey(\"value\", valTraits.xmlName, valTraits.ec2QueryName);\n                    const valueKey = flat ? `${prefix}${i}.${valueSuffix}` : `${prefix}entry.${i}.${valueSuffix}`;\n                    this.write(keySchema, k, key);\n                    this.write(memberSchema, v, valueKey);\n                    ++i;\n                }\n            }\n        }\n        else if (ns.isStructSchema()) {\n            if (value && typeof value === \"object\") {\n                let didWriteMember = false;\n                for (const [memberName, member] of ns.structIterator()) {\n                    if (value[memberName] == null && !member.isIdempotencyToken()) {\n                        continue;\n                    }\n                    const traits = member.getMergedTraits();\n                    const suffix = this.getKey(memberName, traits.xmlName, traits.ec2QueryName, \"struct\");\n                    const key = `${prefix}${suffix}`;\n                    this.write(member, value[memberName], key);\n                    didWriteMember = true;\n                }\n                if (!didWriteMember && ns.isUnionSchema()) {\n                    const { $unknown } = value;\n                    if (Array.isArray($unknown)) {\n                        const [k, v] = $unknown;\n                        const key = `${prefix}${k}`;\n                        this.write(15, v, key);\n                    }\n                }\n            }\n        }\n        else if (ns.isUnitSchema()) {\n        }\n        else {\n            throw new Error(`@aws-sdk/core/protocols - QuerySerializer unrecognized schema type ${ns.getName(true)}`);\n        }\n    }\n    flush() {\n        if (this.buffer === undefined) {\n            throw new Error(\"@aws-sdk/core/protocols - QuerySerializer cannot flush with nothing written to buffer.\");\n        }\n        const str = this.buffer;\n        delete this.buffer;\n        return str;\n    }\n    getKey(memberName, xmlName, ec2QueryName, keySource) {\n        const { ec2, capitalizeKeys } = this.settings;\n        if (ec2 && ec2QueryName) {\n            return ec2QueryName;\n        }\n        const key = xmlName ?? memberName;\n        if (capitalizeKeys && keySource === \"struct\") {\n            return key[0].toUpperCase() + key.slice(1);\n        }\n        return key;\n    }\n    writeKey(key) {\n        if (key.endsWith(\".\")) {\n            key = key.slice(0, key.length - 1);\n        }\n        this.buffer += `&${extendedEncodeURIComponent(key)}=`;\n    }\n    writeValue(value) {\n        this.buffer += extendedEncodeURIComponent(value);\n    }\n}\n", "import { collectBody, RpcProtocol } from \"@smithy/core/protocols\";\nimport { deref, NormalizedSchema } from \"@smithy/core/schema\";\nimport { ProtocolLib } from \"../ProtocolLib\";\nimport { XmlShapeDeserializer } from \"../xml/XmlShapeDeserializer\";\nimport { QueryShapeSerializer } from \"./QueryShapeSerializer\";\nexport class AwsQueryProtocol extends RpcProtocol {\n    options;\n    serializer;\n    deserializer;\n    mixin = new ProtocolLib();\n    constructor(options) {\n        super({\n            defaultNamespace: options.defaultNamespace,\n            errorTypeRegistries: options.errorTypeRegistries,\n        });\n        this.options = options;\n        const settings = {\n            timestampFormat: {\n                useTrait: true,\n                default: 5,\n            },\n            httpBindings: false,\n            xmlNamespace: options.xmlNamespace,\n            serviceNamespace: options.defaultNamespace,\n            serializeEmptyLists: true,\n        };\n        this.serializer = new QueryShapeSerializer(settings);\n        this.deserializer = new XmlShapeDeserializer(settings);\n    }\n    getShapeId() {\n        return \"aws.protocols#awsQuery\";\n    }\n    setSerdeContext(serdeContext) {\n        this.serializer.setSerdeContext(serdeContext);\n        this.deserializer.setSerdeContext(serdeContext);\n    }\n    getPayloadCodec() {\n        throw new Error(\"AWSQuery protocol has no payload codec.\");\n    }\n    async serializeRequest(operationSchema, input, context) {\n        const request = await super.serializeRequest(operationSchema, input, context);\n        if (!request.path.endsWith(\"/\")) {\n            request.path += \"/\";\n        }\n        request.headers[\"content-type\"] = \"application/x-www-form-urlencoded\";\n        if (deref(operationSchema.input) === \"unit\" || !request.body) {\n            request.body = \"\";\n        }\n        const action = operationSchema.name.split(\"#\")[1] ?? operationSchema.name;\n        request.body = `Action=${action}&Version=${this.options.version}` + request.body;\n        if (request.body.endsWith(\"&\")) {\n            request.body = request.body.slice(-1);\n        }\n        return request;\n    }\n    async deserializeResponse(operationSchema, context, response) {\n        const deserializer = this.deserializer;\n        const ns = NormalizedSchema.of(operationSchema.output);\n        const dataObject = {};\n        if (response.statusCode >= 300) {\n            const bytes = await collectBody(response.body, context);\n            if (bytes.byteLength > 0) {\n                Object.assign(dataObject, await deserializer.read(15, bytes));\n            }\n            await this.handleError(operationSchema, context, response, dataObject, this.deserializeMetadata(response));\n        }\n        for (const header in response.headers) {\n            const value = response.headers[header];\n            delete response.headers[header];\n            response.headers[header.toLowerCase()] = value;\n        }\n        const shortName = operationSchema.name.split(\"#\")[1] ?? operationSchema.name;\n        const awsQueryResultKey = ns.isStructSchema() && this.useNestedResult() ? shortName + \"Result\" : undefined;\n        const bytes = await collectBody(response.body, context);\n        if (bytes.byteLength > 0) {\n            Object.assign(dataObject, await deserializer.read(ns, bytes, awsQueryResultKey));\n        }\n        dataObject.$metadata = this.deserializeMetadata(response);\n        return dataObject;\n    }\n    useNestedResult() {\n        return true;\n    }\n    async handleError(operationSchema, context, response, dataObject, metadata) {\n        const errorIdentifier = this.loadQueryErrorCode(response, dataObject) ?? \"Unknown\";\n        this.mixin.compose(this.compositeErrorRegistry, errorIdentifier, this.options.defaultNamespace);\n        const errorData = this.loadQueryError(dataObject) ?? {};\n        const message = this.loadQueryErrorMessage(dataObject);\n        errorData.message = message;\n        errorData.Error = {\n            Type: errorData.Type,\n            Code: errorData.Code,\n            Message: message,\n        };\n        const { errorSchema, errorMetadata } = await this.mixin.getErrorSchemaOrThrowBaseException(errorIdentifier, this.options.defaultNamespace, response, errorData, metadata, this.mixin.findQueryCompatibleError);\n        const ns = NormalizedSchema.of(errorSchema);\n        const ErrorCtor = this.compositeErrorRegistry.getErrorCtor(errorSchema) ?? Error;\n        const exception = new ErrorCtor(message);\n        const output = {\n            Type: errorData.Error.Type,\n            Code: errorData.Error.Code,\n            Error: errorData.Error,\n        };\n        for (const [name, member] of ns.structIterator()) {\n            const target = member.getMergedTraits().xmlName ?? name;\n            const value = errorData[target] ?? dataObject[target];\n            output[name] = this.deserializer.readSchema(member, value);\n        }\n        throw this.mixin.decorateServiceException(Object.assign(exception, errorMetadata, {\n            $fault: ns.getMergedTraits().error,\n            message,\n        }, output), dataObject);\n    }\n    loadQueryErrorCode(output, data) {\n        const code = (data.Errors?.[0]?.Error ?? data.Errors?.Error ?? data.Error)?.Code;\n        if (code !== undefined) {\n            return code;\n        }\n        if (output.statusCode == 404) {\n            return \"NotFound\";\n        }\n    }\n    loadQueryError(data) {\n        return data.Errors?.[0]?.Error ?? data.Errors?.Error ?? data.Error;\n    }\n    loadQueryErrorMessage(data) {\n        const errorData = this.loadQueryError(data);\n        return errorData?.message ?? errorData?.Message ?? data.message ?? data.Message ?? \"Unknown\";\n    }\n    getDefaultContentType() {\n        return \"application/x-www-form-urlencoded\";\n    }\n}\n", "import { AwsQueryProtocol } from \"./AwsQueryProtocol\";\nexport class AwsEc2QueryProtocol extends AwsQueryProtocol {\n    options;\n    constructor(options) {\n        super(options);\n        this.options = options;\n        const ec2Settings = {\n            capitalizeKeys: true,\n            flattenLists: true,\n            serializeEmptyLists: false,\n            ec2: true,\n        };\n        Object.assign(this.serializer.settings, ec2Settings);\n    }\n    getShapeId() {\n        return \"aws.protocols#ec2Query\";\n    }\n    useNestedResult() {\n        return false;\n    }\n}\n", "export {};\n", "import { parseXML } from \"@aws-sdk/xml-builder\";\nimport { getValueFromTextNode } from \"@smithy/smithy-client\";\nimport { collectBodyString } from \"../common\";\nexport const parseXmlBody = (streamBody, context) => collectBodyString(streamBody, context).then((encoded) => {\n    if (encoded.length) {\n        let parsedObj;\n        try {\n            parsedObj = parseXML(encoded);\n        }\n        catch (e) {\n            if (e && typeof e === \"object\") {\n                Object.defineProperty(e, \"$responseBodyText\", {\n                    value: encoded,\n                });\n            }\n            throw e;\n        }\n        const textNodeName = \"#text\";\n        const key = Object.keys(parsedObj)[0];\n        const parsedObjToReturn = parsedObj[key];\n        if (parsedObjToReturn[textNodeName]) {\n            parsedObjToReturn[key] = parsedObjToReturn[textNodeName];\n            delete parsedObjToReturn[textNodeName];\n        }\n        return getValueFromTextNode(parsedObjToReturn);\n    }\n    return {};\n});\nexport const parseXmlErrorBody = async (errorBody, context) => {\n    const value = await parseXmlBody(errorBody, context);\n    if (value.Error) {\n        value.Error.message = value.Error.message ?? value.Error.Message;\n    }\n    return value;\n};\nexport const loadRestXmlErrorCode = (output, data) => {\n    if (data?.Error?.Code !== undefined) {\n        return data.Error.Code;\n    }\n    if (data?.Code !== undefined) {\n        return data.Code;\n    }\n    if (output.statusCode == 404) {\n        return \"NotFound\";\n    }\n};\n", "import { XmlNode, XmlText } from \"@aws-sdk/xml-builder\";\nimport { determineTimestampFormat } from \"@smithy/core/protocols\";\nimport { NormalizedSchema } from \"@smithy/core/schema\";\nimport { generateIdempotencyToken, NumericValue } from \"@smithy/core/serde\";\nimport { dateToUtcString } from \"@smithy/smithy-client\";\nimport { fromBase64, toBase64 } from \"@smithy/util-base64\";\nimport { SerdeContextConfig } from \"../ConfigurableSerdeContext\";\nexport class XmlShapeSerializer extends SerdeContextConfig {\n    settings;\n    stringBuffer;\n    byteBuffer;\n    buffer;\n    constructor(settings) {\n        super();\n        this.settings = settings;\n    }\n    write(schema, value) {\n        const ns = NormalizedSchema.of(schema);\n        if (ns.isStringSchema() && typeof value === \"string\") {\n            this.stringBuffer = value;\n        }\n        else if (ns.isBlobSchema()) {\n            this.byteBuffer =\n                \"byteLength\" in value\n                    ? value\n                    : (this.serdeContext?.base64Decoder ?? fromBase64)(value);\n        }\n        else {\n            this.buffer = this.writeStruct(ns, value, undefined);\n            const traits = ns.getMergedTraits();\n            if (traits.httpPayload && !traits.xmlName) {\n                this.buffer.withName(ns.getName());\n            }\n        }\n    }\n    flush() {\n        if (this.byteBuffer !== undefined) {\n            const bytes = this.byteBuffer;\n            delete this.byteBuffer;\n            return bytes;\n        }\n        if (this.stringBuffer !== undefined) {\n            const str = this.stringBuffer;\n            delete this.stringBuffer;\n            return str;\n        }\n        const buffer = this.buffer;\n        if (this.settings.xmlNamespace) {\n            if (!buffer?.attributes?.[\"xmlns\"]) {\n                buffer.addAttribute(\"xmlns\", this.settings.xmlNamespace);\n            }\n        }\n        delete this.buffer;\n        return buffer.toString();\n    }\n    writeStruct(ns, value, parentXmlns) {\n        const traits = ns.getMergedTraits();\n        const name = ns.isMemberSchema() && !traits.httpPayload\n            ? ns.getMemberTraits().xmlName ?? ns.getMemberName()\n            : traits.xmlName ?? ns.getName();\n        if (!name || !ns.isStructSchema()) {\n            throw new Error(`@aws-sdk/core/protocols - xml serializer, cannot write struct with empty name or non-struct, schema=${ns.getName(true)}.`);\n        }\n        const structXmlNode = XmlNode.of(name);\n        const [xmlnsAttr, xmlns] = this.getXmlnsAttribute(ns, parentXmlns);\n        for (const [memberName, memberSchema] of ns.structIterator()) {\n            const val = value[memberName];\n            if (val != null || memberSchema.isIdempotencyToken()) {\n                if (memberSchema.getMergedTraits().xmlAttribute) {\n                    structXmlNode.addAttribute(memberSchema.getMergedTraits().xmlName ?? memberName, this.writeSimple(memberSchema, val));\n                    continue;\n                }\n                if (memberSchema.isListSchema()) {\n                    this.writeList(memberSchema, val, structXmlNode, xmlns);\n                }\n                else if (memberSchema.isMapSchema()) {\n                    this.writeMap(memberSchema, val, structXmlNode, xmlns);\n                }\n                else if (memberSchema.isStructSchema()) {\n                    structXmlNode.addChildNode(this.writeStruct(memberSchema, val, xmlns));\n                }\n                else {\n                    const memberNode = XmlNode.of(memberSchema.getMergedTraits().xmlName ?? memberSchema.getMemberName());\n                    this.writeSimpleInto(memberSchema, val, memberNode, xmlns);\n                    structXmlNode.addChildNode(memberNode);\n                }\n            }\n        }\n        const { $unknown } = value;\n        if ($unknown && ns.isUnionSchema() && Array.isArray($unknown) && Object.keys(value).length === 1) {\n            const [k, v] = $unknown;\n            const node = XmlNode.of(k);\n            if (typeof v !== \"string\") {\n                if (value instanceof XmlNode || value instanceof XmlText) {\n                    structXmlNode.addChildNode(value);\n                }\n                else {\n                    throw new Error(`@aws-sdk - $unknown union member in XML requires ` +\n                        `value of type string, @aws-sdk/xml-builder::XmlNode or XmlText.`);\n                }\n            }\n            this.writeSimpleInto(0, v, node, xmlns);\n            structXmlNode.addChildNode(node);\n        }\n        if (xmlns) {\n            structXmlNode.addAttribute(xmlnsAttr, xmlns);\n        }\n        return structXmlNode;\n    }\n    writeList(listMember, array, container, parentXmlns) {\n        if (!listMember.isMemberSchema()) {\n            throw new Error(`@aws-sdk/core/protocols - xml serializer, cannot write non-member list: ${listMember.getName(true)}`);\n        }\n        const listTraits = listMember.getMergedTraits();\n        const listValueSchema = listMember.getValueSchema();\n        const listValueTraits = listValueSchema.getMergedTraits();\n        const sparse = !!listValueTraits.sparse;\n        const flat = !!listTraits.xmlFlattened;\n        const [xmlnsAttr, xmlns] = this.getXmlnsAttribute(listMember, parentXmlns);\n        const writeItem = (container, value) => {\n            if (listValueSchema.isListSchema()) {\n                this.writeList(listValueSchema, Array.isArray(value) ? value : [value], container, xmlns);\n            }\n            else if (listValueSchema.isMapSchema()) {\n                this.writeMap(listValueSchema, value, container, xmlns);\n            }\n            else if (listValueSchema.isStructSchema()) {\n                const struct = this.writeStruct(listValueSchema, value, xmlns);\n                container.addChildNode(struct.withName(flat ? listTraits.xmlName ?? listMember.getMemberName() : listValueTraits.xmlName ?? \"member\"));\n            }\n            else {\n                const listItemNode = XmlNode.of(flat ? listTraits.xmlName ?? listMember.getMemberName() : listValueTraits.xmlName ?? \"member\");\n                this.writeSimpleInto(listValueSchema, value, listItemNode, xmlns);\n                container.addChildNode(listItemNode);\n            }\n        };\n        if (flat) {\n            for (const value of array) {\n                if (sparse || value != null) {\n                    writeItem(container, value);\n                }\n            }\n        }\n        else {\n            const listNode = XmlNode.of(listTraits.xmlName ?? listMember.getMemberName());\n            if (xmlns) {\n                listNode.addAttribute(xmlnsAttr, xmlns);\n            }\n            for (const value of array) {\n                if (sparse || value != null) {\n                    writeItem(listNode, value);\n                }\n            }\n            container.addChildNode(listNode);\n        }\n    }\n    writeMap(mapMember, map, container, parentXmlns, containerIsMap = false) {\n        if (!mapMember.isMemberSchema()) {\n            throw new Error(`@aws-sdk/core/protocols - xml serializer, cannot write non-member map: ${mapMember.getName(true)}`);\n        }\n        const mapTraits = mapMember.getMergedTraits();\n        const mapKeySchema = mapMember.getKeySchema();\n        const mapKeyTraits = mapKeySchema.getMergedTraits();\n        const keyTag = mapKeyTraits.xmlName ?? \"key\";\n        const mapValueSchema = mapMember.getValueSchema();\n        const mapValueTraits = mapValueSchema.getMergedTraits();\n        const valueTag = mapValueTraits.xmlName ?? \"value\";\n        const sparse = !!mapValueTraits.sparse;\n        const flat = !!mapTraits.xmlFlattened;\n        const [xmlnsAttr, xmlns] = this.getXmlnsAttribute(mapMember, parentXmlns);\n        const addKeyValue = (entry, key, val) => {\n            const keyNode = XmlNode.of(keyTag, key);\n            const [keyXmlnsAttr, keyXmlns] = this.getXmlnsAttribute(mapKeySchema, xmlns);\n            if (keyXmlns) {\n                keyNode.addAttribute(keyXmlnsAttr, keyXmlns);\n            }\n            entry.addChildNode(keyNode);\n            let valueNode = XmlNode.of(valueTag);\n            if (mapValueSchema.isListSchema()) {\n                this.writeList(mapValueSchema, val, valueNode, xmlns);\n            }\n            else if (mapValueSchema.isMapSchema()) {\n                this.writeMap(mapValueSchema, val, valueNode, xmlns, true);\n            }\n            else if (mapValueSchema.isStructSchema()) {\n                valueNode = this.writeStruct(mapValueSchema, val, xmlns);\n            }\n            else {\n                this.writeSimpleInto(mapValueSchema, val, valueNode, xmlns);\n            }\n            entry.addChildNode(valueNode);\n        };\n        if (flat) {\n            for (const key in map) {\n                const val = map[key];\n                if (sparse || val != null) {\n                    const entry = XmlNode.of(mapTraits.xmlName ?? mapMember.getMemberName());\n                    addKeyValue(entry, key, val);\n                    container.addChildNode(entry);\n                }\n            }\n        }\n        else {\n            let mapNode;\n            if (!containerIsMap) {\n                mapNode = XmlNode.of(mapTraits.xmlName ?? mapMember.getMemberName());\n                if (xmlns) {\n                    mapNode.addAttribute(xmlnsAttr, xmlns);\n                }\n                container.addChildNode(mapNode);\n            }\n            for (const key in map) {\n                const val = map[key];\n                if (sparse || val != null) {\n                    const entry = XmlNode.of(\"entry\");\n                    addKeyValue(entry, key, val);\n                    (containerIsMap ? container : mapNode).addChildNode(entry);\n                }\n            }\n        }\n    }\n    writeSimple(_schema, value) {\n        if (null === value) {\n            throw new Error(\"@aws-sdk/core/protocols - (XML serializer) cannot write null value.\");\n        }\n        const ns = NormalizedSchema.of(_schema);\n        let nodeContents = null;\n        if (value && typeof value === \"object\") {\n            if (ns.isBlobSchema()) {\n                nodeContents = (this.serdeContext?.base64Encoder ?? toBase64)(value);\n            }\n            else if (ns.isTimestampSchema() && value instanceof Date) {\n                const format = determineTimestampFormat(ns, this.settings);\n                switch (format) {\n                    case 5:\n                        nodeContents = value.toISOString().replace(\".000Z\", \"Z\");\n                        break;\n                    case 6:\n                        nodeContents = dateToUtcString(value);\n                        break;\n                    case 7:\n                        nodeContents = String(value.getTime() / 1000);\n                        break;\n                    default:\n                        console.warn(\"Missing timestamp format, using http date\", value);\n                        nodeContents = dateToUtcString(value);\n                        break;\n                }\n            }\n            else if (ns.isBigDecimalSchema() && value) {\n                if (value instanceof NumericValue) {\n                    return value.string;\n                }\n                return String(value);\n            }\n            else if (ns.isMapSchema() || ns.isListSchema()) {\n                throw new Error(\"@aws-sdk/core/protocols - xml serializer, cannot call _write() on List/Map schema, call writeList or writeMap() instead.\");\n            }\n            else {\n                throw new Error(`@aws-sdk/core/protocols - xml serializer, unhandled schema type for object value and schema: ${ns.getName(true)}`);\n            }\n        }\n        if (ns.isBooleanSchema() || ns.isNumericSchema() || ns.isBigIntegerSchema() || ns.isBigDecimalSchema()) {\n            nodeContents = String(value);\n        }\n        if (ns.isStringSchema()) {\n            if (value === undefined && ns.isIdempotencyToken()) {\n                nodeContents = generateIdempotencyToken();\n            }\n            else {\n                nodeContents = String(value);\n            }\n        }\n        if (nodeContents === null) {\n            throw new Error(`Unhandled schema-value pair ${ns.getName(true)}=${value}`);\n        }\n        return nodeContents;\n    }\n    writeSimpleInto(_schema, value, into, parentXmlns) {\n        const nodeContents = this.writeSimple(_schema, value);\n        const ns = NormalizedSchema.of(_schema);\n        const content = new XmlText(nodeContents);\n        const [xmlnsAttr, xmlns] = this.getXmlnsAttribute(ns, parentXmlns);\n        if (xmlns) {\n            into.addAttribute(xmlnsAttr, xmlns);\n        }\n        into.addChildNode(content);\n    }\n    getXmlnsAttribute(ns, parentXmlns) {\n        const traits = ns.getMergedTraits();\n        const [prefix, xmlns] = traits.xmlNamespace ?? [];\n        if (xmlns && xmlns !== parentXmlns) {\n            return [prefix ? `xmlns:${prefix}` : \"xmlns\", xmlns];\n        }\n        return [void 0, void 0];\n    }\n}\n", "import { SerdeContextConfig } from \"../ConfigurableSerdeContext\";\nimport { XmlShapeDeserializer } from \"./XmlShapeDeserializer\";\nimport { XmlShapeSerializer } from \"./XmlShapeSerializer\";\nexport class XmlCodec extends SerdeContextConfig {\n    settings;\n    constructor(settings) {\n        super();\n        this.settings = settings;\n    }\n    createSerializer() {\n        const serializer = new XmlShapeSerializer(this.settings);\n        serializer.setSerdeContext(this.serdeContext);\n        return serializer;\n    }\n    createDeserializer() {\n        const deserializer = new XmlShapeDeserializer(this.settings);\n        deserializer.setSerdeContext(this.serdeContext);\n        return deserializer;\n    }\n}\n", "import { HttpBindingProtocol, HttpInterceptingShapeDeserializer, HttpInterceptingShapeSerializer, } from \"@smithy/core/protocols\";\nimport { NormalizedSchema } from \"@smithy/core/schema\";\nimport { ProtocolLib } from \"../ProtocolLib\";\nimport { loadRestXmlErrorCode } from \"./parseXmlBody\";\nimport { XmlCodec } from \"./XmlCodec\";\nexport class AwsRestXmlProtocol extends HttpBindingProtocol {\n    codec;\n    serializer;\n    deserializer;\n    mixin = new ProtocolLib();\n    constructor(options) {\n        super(options);\n        const settings = {\n            timestampFormat: {\n                useTrait: true,\n                default: 5,\n            },\n            httpBindings: true,\n            xmlNamespace: options.xmlNamespace,\n            serviceNamespace: options.defaultNamespace,\n        };\n        this.codec = new XmlCodec(settings);\n        this.serializer = new HttpInterceptingShapeSerializer(this.codec.createSerializer(), settings);\n        this.deserializer = new HttpInterceptingShapeDeserializer(this.codec.createDeserializer(), settings);\n    }\n    getPayloadCodec() {\n        return this.codec;\n    }\n    getShapeId() {\n        return \"aws.protocols#restXml\";\n    }\n    async serializeRequest(operationSchema, input, context) {\n        const request = await super.serializeRequest(operationSchema, input, context);\n        const inputSchema = NormalizedSchema.of(operationSchema.input);\n        if (!request.headers[\"content-type\"]) {\n            const contentType = this.mixin.resolveRestContentType(this.getDefaultContentType(), inputSchema);\n            if (contentType) {\n                request.headers[\"content-type\"] = contentType;\n            }\n        }\n        if (typeof request.body === \"string\" &&\n            request.headers[\"content-type\"] === this.getDefaultContentType() &&\n            !request.body.startsWith(\"<?xml \") &&\n            !this.hasUnstructuredPayloadBinding(inputSchema)) {\n            request.body = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>' + request.body;\n        }\n        return request;\n    }\n    async deserializeResponse(operationSchema, context, response) {\n        return super.deserializeResponse(operationSchema, context, response);\n    }\n    async handleError(operationSchema, context, response, dataObject, metadata) {\n        const errorIdentifier = loadRestXmlErrorCode(response, dataObject) ?? \"Unknown\";\n        this.mixin.compose(this.compositeErrorRegistry, errorIdentifier, this.options.defaultNamespace);\n        if (dataObject.Error && typeof dataObject.Error === \"object\") {\n            for (const key of Object.keys(dataObject.Error)) {\n                dataObject[key] = dataObject.Error[key];\n                if (key.toLowerCase() === \"message\") {\n                    dataObject.message = dataObject.Error[key];\n                }\n            }\n        }\n        if (dataObject.RequestId && !metadata.requestId) {\n            metadata.requestId = dataObject.RequestId;\n        }\n        const { errorSchema, errorMetadata } = await this.mixin.getErrorSchemaOrThrowBaseException(errorIdentifier, this.options.defaultNamespace, response, dataObject, metadata);\n        const ns = NormalizedSchema.of(errorSchema);\n        const message = dataObject.Error?.message ??\n            dataObject.Error?.Message ??\n            dataObject.message ??\n            dataObject.Message ??\n            \"UnknownError\";\n        const ErrorCtor = this.compositeErrorRegistry.getErrorCtor(errorSchema) ?? Error;\n        const exception = new ErrorCtor(message);\n        await this.deserializeHttpMessage(errorSchema, context, response, dataObject);\n        const output = {};\n        const errorDeserializer = this.codec.createDeserializer();\n        for (const [name, member] of ns.structIterator()) {\n            const target = member.getMergedTraits().xmlName ?? name;\n            const value = dataObject.Error?.[target] ?? dataObject[target];\n            output[name] = errorDeserializer.readSchema(member, value);\n        }\n        throw this.mixin.decorateServiceException(Object.assign(exception, errorMetadata, {\n            $fault: ns.getMergedTraits().error,\n            message,\n        }, output), dataObject);\n    }\n    getDefaultContentType() {\n        return \"application/xml\";\n    }\n    hasUnstructuredPayloadBinding(ns) {\n        for (const [, member] of ns.structIterator()) {\n            if (member.getMergedTraits().httpPayload) {\n                return !(member.isStructSchema() || member.isMapSchema() || member.isListSchema());\n            }\n        }\n        return false;\n    }\n}\n", "export * from \"./cbor/AwsSmithyRpcV2CborProtocol\";\nexport * from \"./coercing-serializers\";\nexport * from \"./json/AwsJson1_0Protocol\";\nexport * from \"./json/AwsJson1_1Protocol\";\nexport * from \"./json/AwsJsonRpcProtocol\";\nexport * from \"./json/AwsRestJsonProtocol\";\nexport * from \"./json/JsonCodec\";\nexport * from \"./json/JsonShapeDeserializer\";\nexport * from \"./json/JsonShapeSerializer\";\nexport * from \"./json/awsExpectUnion\";\nexport * from \"./json/parseJsonBody\";\nexport * from \"./query/AwsEc2QueryProtocol\";\nexport * from \"./query/AwsQueryProtocol\";\nexport * from \"./query/QuerySerializerSettings\";\nexport * from \"./query/QueryShapeSerializer\";\nexport * from \"./xml/AwsRestXmlProtocol\";\nexport * from \"./xml/XmlCodec\";\nexport * from \"./xml/XmlShapeDeserializer\";\nexport * from \"./xml/XmlShapeSerializer\";\nexport * from \"./xml/parseXmlBody\";\n", "import { BinaryDecisionDiagram } from \"@smithy/util-endpoints\";\nconst k = \"ref\";\nconst a = -1, b = true, c = \"isSet\", d = \"PartitionResult\", e = \"booleanEquals\", f = \"getAttr\", g = { [k]: \"Endpoint\" }, h = { [k]: d }, i = {}, j = [{ [k]: \"Region\" }];\nconst _data = {\n    conditions: [\n        [c, [g]],\n        [c, j],\n        [\"aws.partition\", j, d],\n        [e, [{ [k]: \"UseFIPS\" }, b]],\n        [e, [{ [k]: \"UseDualStack\" }, b]],\n        [e, [{ fn: f, argv: [h, \"supportsDualStack\"] }, b]],\n        [e, [{ fn: f, argv: [h, \"supportsFIPS\"] }, b]],\n        [\"stringEquals\", [{ fn: f, argv: [h, \"name\"] }, \"aws-us-gov\"]],\n    ],\n    results: [\n        [a],\n        [a, \"Invalid Configuration: FIPS and custom endpoint are not supported\"],\n        [a, \"Invalid Configuration: Dualstack and custom endpoint are not supported\"],\n        [g, i],\n        [\"https://oidc-fips.{Region}.{PartitionResult#dualStackDnsSuffix}\", i],\n        [a, \"FIPS and DualStack are enabled, but this partition does not support one or both\"],\n        [\"https://oidc.{Region}.amazonaws.com\", i],\n        [\"https://oidc-fips.{Region}.{PartitionResult#dnsSuffix}\", i],\n        [a, \"FIPS is enabled but this partition does not support FIPS\"],\n        [\"https://oidc.{Region}.{PartitionResult#dualStackDnsSuffix}\", i],\n        [a, \"DualStack is enabled but this partition does not support DualStack\"],\n        [\"https://oidc.{Region}.{PartitionResult#dnsSuffix}\", i],\n        [a, \"Invalid Configuration: Missing Region\"],\n    ],\n};\nconst root = 2;\nconst r = 100_000_000;\nconst nodes = new Int32Array([\n    -1,\n    1,\n    -1,\n    0,\n    13,\n    3,\n    1,\n    4,\n    r + 12,\n    2,\n    5,\n    r + 12,\n    3,\n    8,\n    6,\n    4,\n    7,\n    r + 11,\n    5,\n    r + 9,\n    r + 10,\n    4,\n    11,\n    9,\n    6,\n    10,\n    r + 8,\n    7,\n    r + 6,\n    r + 7,\n    5,\n    12,\n    r + 5,\n    6,\n    r + 4,\n    r + 5,\n    3,\n    r + 1,\n    14,\n    4,\n    r + 2,\n    r + 3,\n]);\nexport const bdd = BinaryDecisionDiagram.from(nodes, root, _data.conditions, _data.results);\n", "import { awsEndpointFunctions } from \"@aws-sdk/util-endpoints\";\nimport { customEndpointFunctions, decideEndpoint, EndpointCache } from \"@smithy/util-endpoints\";\nimport { bdd } from \"./bdd\";\nconst cache = new EndpointCache({\n    size: 50,\n    params: [\"Endpoint\", \"Region\", \"UseDualStack\", \"UseFIPS\"],\n});\nexport const defaultEndpointResolver = (endpointParams, context = {}) => {\n    return cache.get(endpointParams, () => decideEndpoint(bdd, {\n        endpointParams: endpointParams,\n        logger: context.logger,\n    }));\n};\ncustomEndpointFunctions.aws = awsEndpointFunctions;\n", "import { ServiceException as __ServiceException, } from \"@smithy/smithy-client\";\nexport { __ServiceException };\nexport class SSOOIDCServiceException extends __ServiceException {\n    constructor(options) {\n        super(options);\n        Object.setPrototypeOf(this, SSOOIDCServiceException.prototype);\n    }\n}\n", "import { SSOOIDCServiceException as __BaseException } from \"./SSOOIDCServiceException\";\nexport class AccessDeniedException extends __BaseException {\n    name = \"AccessDeniedException\";\n    $fault = \"client\";\n    error;\n    reason;\n    error_description;\n    constructor(opts) {\n        super({\n            name: \"AccessDeniedException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, AccessDeniedException.prototype);\n        this.error = opts.error;\n        this.reason = opts.reason;\n        this.error_description = opts.error_description;\n    }\n}\nexport class AuthorizationPendingException extends __BaseException {\n    name = \"AuthorizationPendingException\";\n    $fault = \"client\";\n    error;\n    error_description;\n    constructor(opts) {\n        super({\n            name: \"AuthorizationPendingException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, AuthorizationPendingException.prototype);\n        this.error = opts.error;\n        this.error_description = opts.error_description;\n    }\n}\nexport class ExpiredTokenException extends __BaseException {\n    name = \"ExpiredTokenException\";\n    $fault = \"client\";\n    error;\n    error_description;\n    constructor(opts) {\n        super({\n            name: \"ExpiredTokenException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, ExpiredTokenException.prototype);\n        this.error = opts.error;\n        this.error_description = opts.error_description;\n    }\n}\nexport class InternalServerException extends __BaseException {\n    name = \"InternalServerException\";\n    $fault = \"server\";\n    error;\n    error_description;\n    constructor(opts) {\n        super({\n            name: \"InternalServerException\",\n            $fault: \"server\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, InternalServerException.prototype);\n        this.error = opts.error;\n        this.error_description = opts.error_description;\n    }\n}\nexport class InvalidClientException extends __BaseException {\n    name = \"InvalidClientException\";\n    $fault = \"client\";\n    error;\n    error_description;\n    constructor(opts) {\n        super({\n            name: \"InvalidClientException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, InvalidClientException.prototype);\n        this.error = opts.error;\n        this.error_description = opts.error_description;\n    }\n}\nexport class InvalidGrantException extends __BaseException {\n    name = \"InvalidGrantException\";\n    $fault = \"client\";\n    error;\n    error_description;\n    constructor(opts) {\n        super({\n            name: \"InvalidGrantException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, InvalidGrantException.prototype);\n        this.error = opts.error;\n        this.error_description = opts.error_description;\n    }\n}\nexport class InvalidRequestException extends __BaseException {\n    name = \"InvalidRequestException\";\n    $fault = \"client\";\n    error;\n    reason;\n    error_description;\n    constructor(opts) {\n        super({\n            name: \"InvalidRequestException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, InvalidRequestException.prototype);\n        this.error = opts.error;\n        this.reason = opts.reason;\n        this.error_description = opts.error_description;\n    }\n}\nexport class InvalidScopeException extends __BaseException {\n    name = \"InvalidScopeException\";\n    $fault = \"client\";\n    error;\n    error_description;\n    constructor(opts) {\n        super({\n            name: \"InvalidScopeException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, InvalidScopeException.prototype);\n        this.error = opts.error;\n        this.error_description = opts.error_description;\n    }\n}\nexport class SlowDownException extends __BaseException {\n    name = \"SlowDownException\";\n    $fault = \"client\";\n    error;\n    error_description;\n    constructor(opts) {\n        super({\n            name: \"SlowDownException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, SlowDownException.prototype);\n        this.error = opts.error;\n        this.error_description = opts.error_description;\n    }\n}\nexport class UnauthorizedClientException extends __BaseException {\n    name = \"UnauthorizedClientException\";\n    $fault = \"client\";\n    error;\n    error_description;\n    constructor(opts) {\n        super({\n            name: \"UnauthorizedClientException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, UnauthorizedClientException.prototype);\n        this.error = opts.error;\n        this.error_description = opts.error_description;\n    }\n}\nexport class UnsupportedGrantTypeException extends __BaseException {\n    name = \"UnsupportedGrantTypeException\";\n    $fault = \"client\";\n    error;\n    error_description;\n    constructor(opts) {\n        super({\n            name: \"UnsupportedGrantTypeException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, UnsupportedGrantTypeException.prototype);\n        this.error = opts.error;\n        this.error_description = opts.error_description;\n    }\n}\n", "const _ADE = \"AccessDeniedException\";\nconst _APE = \"AuthorizationPendingException\";\nconst _AT = \"AccessToken\";\nconst _CS = \"ClientSecret\";\nconst _CT = \"CreateToken\";\nconst _CTR = \"CreateTokenRequest\";\nconst _CTRr = \"CreateTokenResponse\";\nconst _CV = \"CodeVerifier\";\nconst _ETE = \"ExpiredTokenException\";\nconst _ICE = \"InvalidClientException\";\nconst _IGE = \"InvalidGrantException\";\nconst _IRE = \"InvalidRequestException\";\nconst _ISE = \"InternalServerException\";\nconst _ISEn = \"InvalidScopeException\";\nconst _IT = \"IdToken\";\nconst _RT = \"RefreshToken\";\nconst _SDE = \"SlowDownException\";\nconst _UCE = \"UnauthorizedClientException\";\nconst _UGTE = \"UnsupportedGrantTypeException\";\nconst _aT = \"accessToken\";\nconst _c = \"client\";\nconst _cI = \"clientId\";\nconst _cS = \"clientSecret\";\nconst _cV = \"codeVerifier\";\nconst _co = \"code\";\nconst _dC = \"deviceCode\";\nconst _e = \"error\";\nconst _eI = \"expiresIn\";\nconst _ed = \"error_description\";\nconst _gT = \"grantType\";\nconst _h = \"http\";\nconst _hE = \"httpError\";\nconst _iT = \"idToken\";\nconst _r = \"reason\";\nconst _rT = \"refreshToken\";\nconst _rU = \"redirectUri\";\nconst _s = \"smithy.ts.sdk.synthetic.com.amazonaws.ssooidc\";\nconst _sc = \"scope\";\nconst _se = \"server\";\nconst _tT = \"tokenType\";\nconst n0 = \"com.amazonaws.ssooidc\";\nimport { TypeRegistry } from \"@smithy/core/schema\";\nimport { AccessDeniedException, AuthorizationPendingException, ExpiredTokenException, InternalServerException, InvalidClientException, InvalidGrantException, InvalidRequestException, InvalidScopeException, SlowDownException, UnauthorizedClientException, UnsupportedGrantTypeException, } from \"../models/errors\";\nimport { SSOOIDCServiceException } from \"../models/SSOOIDCServiceException\";\nconst _s_registry = TypeRegistry.for(_s);\nexport var SSOOIDCServiceException$ = [-3, _s, \"SSOOIDCServiceException\", 0, [], []];\n_s_registry.registerError(SSOOIDCServiceException$, SSOOIDCServiceException);\nconst n0_registry = TypeRegistry.for(n0);\nexport var AccessDeniedException$ = [\n    -3,\n    n0,\n    _ADE,\n    { [_e]: _c, [_hE]: 400 },\n    [_e, _r, _ed],\n    [0, 0, 0],\n];\nn0_registry.registerError(AccessDeniedException$, AccessDeniedException);\nexport var AuthorizationPendingException$ = [\n    -3,\n    n0,\n    _APE,\n    { [_e]: _c, [_hE]: 400 },\n    [_e, _ed],\n    [0, 0],\n];\nn0_registry.registerError(AuthorizationPendingException$, AuthorizationPendingException);\nexport var ExpiredTokenException$ = [-3, n0, _ETE, { [_e]: _c, [_hE]: 400 }, [_e, _ed], [0, 0]];\nn0_registry.registerError(ExpiredTokenException$, ExpiredTokenException);\nexport var InternalServerException$ = [-3, n0, _ISE, { [_e]: _se, [_hE]: 500 }, [_e, _ed], [0, 0]];\nn0_registry.registerError(InternalServerException$, InternalServerException);\nexport var InvalidClientException$ = [-3, n0, _ICE, { [_e]: _c, [_hE]: 401 }, [_e, _ed], [0, 0]];\nn0_registry.registerError(InvalidClientException$, InvalidClientException);\nexport var InvalidGrantException$ = [-3, n0, _IGE, { [_e]: _c, [_hE]: 400 }, [_e, _ed], [0, 0]];\nn0_registry.registerError(InvalidGrantException$, InvalidGrantException);\nexport var InvalidRequestException$ = [\n    -3,\n    n0,\n    _IRE,\n    { [_e]: _c, [_hE]: 400 },\n    [_e, _r, _ed],\n    [0, 0, 0],\n];\nn0_registry.registerError(InvalidRequestException$, InvalidRequestException);\nexport var InvalidScopeException$ = [-3, n0, _ISEn, { [_e]: _c, [_hE]: 400 }, [_e, _ed], [0, 0]];\nn0_registry.registerError(InvalidScopeException$, InvalidScopeException);\nexport var SlowDownException$ = [-3, n0, _SDE, { [_e]: _c, [_hE]: 400 }, [_e, _ed], [0, 0]];\nn0_registry.registerError(SlowDownException$, SlowDownException);\nexport var UnauthorizedClientException$ = [\n    -3,\n    n0,\n    _UCE,\n    { [_e]: _c, [_hE]: 400 },\n    [_e, _ed],\n    [0, 0],\n];\nn0_registry.registerError(UnauthorizedClientException$, UnauthorizedClientException);\nexport var UnsupportedGrantTypeException$ = [\n    -3,\n    n0,\n    _UGTE,\n    { [_e]: _c, [_hE]: 400 },\n    [_e, _ed],\n    [0, 0],\n];\nn0_registry.registerError(UnsupportedGrantTypeException$, UnsupportedGrantTypeException);\nexport const errorTypeRegistries = [_s_registry, n0_registry];\nvar AccessToken = [0, n0, _AT, 8, 0];\nvar ClientSecret = [0, n0, _CS, 8, 0];\nvar CodeVerifier = [0, n0, _CV, 8, 0];\nvar IdToken = [0, n0, _IT, 8, 0];\nvar RefreshToken = [0, n0, _RT, 8, 0];\nexport var CreateTokenRequest$ = [\n    3,\n    n0,\n    _CTR,\n    0,\n    [_cI, _cS, _gT, _dC, _co, _rT, _sc, _rU, _cV],\n    [0, [() => ClientSecret, 0], 0, 0, 0, [() => RefreshToken, 0], 64 | 0, 0, [() => CodeVerifier, 0]],\n    3,\n];\nexport var CreateTokenResponse$ = [\n    3,\n    n0,\n    _CTRr,\n    0,\n    [_aT, _tT, _eI, _rT, _iT],\n    [[() => AccessToken, 0], 0, 1, [() => RefreshToken, 0], [() => IdToken, 0]],\n];\nvar Scopes = 64 | 0;\nexport var CreateToken$ = [\n    9,\n    n0,\n    _CT,\n    { [_h]: [\"POST\", \"/token\", 200] },\n    () => CreateTokenRequest$,\n    () => CreateTokenResponse$,\n];\n", "import { AwsSdkSigV4Signer } from \"@aws-sdk/core/httpAuthSchemes\";\nimport { AwsRestJsonProtocol } from \"@aws-sdk/core/protocols\";\nimport { NoAuthSigner } from \"@smithy/core\";\nimport { NoOpLogger } from \"@smithy/smithy-client\";\nimport { parseUrl } from \"@smithy/url-parser\";\nimport { fromBase64, toBase64 } from \"@smithy/util-base64\";\nimport { fromUtf8, toUtf8 } from \"@smithy/util-utf8\";\nimport { defaultSSOOIDCHttpAuthSchemeProvider } from \"./auth/httpAuthSchemeProvider\";\nimport { defaultEndpointResolver } from \"./endpoint/endpointResolver\";\nimport { errorTypeRegistries } from \"./schemas/schemas_0\";\nexport const getRuntimeConfig = (config) => {\n    return {\n        apiVersion: \"2019-06-10\",\n        base64Decoder: config?.base64Decoder ?? fromBase64,\n        base64Encoder: config?.base64Encoder ?? toBase64,\n        disableHostPrefix: config?.disableHostPrefix ?? false,\n        endpointProvider: config?.endpointProvider ?? defaultEndpointResolver,\n        extensions: config?.extensions ?? [],\n        httpAuthSchemeProvider: config?.httpAuthSchemeProvider ?? defaultSSOOIDCHttpAuthSchemeProvider,\n        httpAuthSchemes: config?.httpAuthSchemes ?? [\n            {\n                schemeId: \"aws.auth#sigv4\",\n                identityProvider: (ipc) => ipc.getIdentityProvider(\"aws.auth#sigv4\"),\n                signer: new AwsSdkSigV4Signer(),\n            },\n            {\n                schemeId: \"smithy.api#noAuth\",\n                identityProvider: (ipc) => ipc.getIdentityProvider(\"smithy.api#noAuth\") || (async () => ({})),\n                signer: new NoAuthSigner(),\n            },\n        ],\n        logger: config?.logger ?? new NoOpLogger(),\n        protocol: config?.protocol ?? AwsRestJsonProtocol,\n        protocolSettings: config?.protocolSettings ?? {\n            defaultNamespace: \"com.amazonaws.ssooidc\",\n            errorTypeRegistries,\n            version: \"2019-06-10\",\n            serviceTarget: \"AWSSSOOIDCService\",\n        },\n        serviceId: config?.serviceId ?? \"SSO OIDC\",\n        urlParser: config?.urlParser ?? parseUrl,\n        utf8Decoder: config?.utf8Decoder ?? fromUtf8,\n        utf8Encoder: config?.utf8Encoder ?? toUtf8,\n    };\n};\n", "import packageInfo from \"../../../package.json\";\nimport { emitWarningIfUnsupportedVersion as awsCheckVersion } from \"@aws-sdk/core/client\";\nimport { NODE_AUTH_SCHEME_PREFERENCE_OPTIONS } from \"@aws-sdk/core/httpAuthSchemes\";\nimport { createDefaultUserAgentProvider, NODE_APP_ID_CONFIG_OPTIONS } from \"@aws-sdk/util-user-agent-node\";\nimport { NODE_REGION_CONFIG_FILE_OPTIONS, NODE_REGION_CONFIG_OPTIONS, NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS, NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS, } from \"@smithy/config-resolver\";\nimport { Hash } from \"@smithy/hash-node\";\nimport { NODE_MAX_ATTEMPT_CONFIG_OPTIONS, NODE_RETRY_MODE_CONFIG_OPTIONS } from \"@smithy/middleware-retry\";\nimport { loadConfig as loadNodeConfig } from \"@smithy/node-config-provider\";\nimport { NodeHttpHandler as RequestHandler, streamCollector } from \"@smithy/node-http-handler\";\nimport { emitWarningIfUnsupportedVersion, loadConfigsForDefaultMode } from \"@smithy/smithy-client\";\nimport { calculateBodyLength } from \"@smithy/util-body-length-node\";\nimport { resolveDefaultsModeConfig } from \"@smithy/util-defaults-mode-node\";\nimport { DEFAULT_RETRY_MODE } from \"@smithy/util-retry\";\nimport { getRuntimeConfig as getSharedRuntimeConfig } from \"./runtimeConfig.shared\";\nexport const getRuntimeConfig = (config) => {\n    emitWarningIfUnsupportedVersion(process.version);\n    const defaultsMode = resolveDefaultsModeConfig(config);\n    const defaultConfigProvider = () => defaultsMode().then(loadConfigsForDefaultMode);\n    const clientSharedValues = getSharedRuntimeConfig(config);\n    awsCheckVersion(process.version);\n    const loaderConfig = {\n        profile: config?.profile,\n        logger: clientSharedValues.logger,\n    };\n    return {\n        ...clientSharedValues,\n        ...config,\n        runtime: \"node\",\n        defaultsMode,\n        authSchemePreference: config?.authSchemePreference ?? loadNodeConfig(NODE_AUTH_SCHEME_PREFERENCE_OPTIONS, loaderConfig),\n        bodyLengthChecker: config?.bodyLengthChecker ?? calculateBodyLength,\n        defaultUserAgentProvider: config?.defaultUserAgentProvider ??\n            createDefaultUserAgentProvider({ serviceId: clientSharedValues.serviceId, clientVersion: packageInfo.version }),\n        maxAttempts: config?.maxAttempts ?? loadNodeConfig(NODE_MAX_ATTEMPT_CONFIG_OPTIONS, config),\n        region: config?.region ??\n            loadNodeConfig(NODE_REGION_CONFIG_OPTIONS, { ...NODE_REGION_CONFIG_FILE_OPTIONS, ...loaderConfig }),\n        requestHandler: RequestHandler.create(config?.requestHandler ?? defaultConfigProvider),\n        retryMode: config?.retryMode ??\n            loadNodeConfig({\n                ...NODE_RETRY_MODE_CONFIG_OPTIONS,\n                default: async () => (await defaultConfigProvider()).retryMode || DEFAULT_RETRY_MODE,\n            }, config),\n        sha256: config?.sha256 ?? Hash.bind(null, \"sha256\"),\n        streamCollector: config?.streamCollector ?? streamCollector,\n        useDualstackEndpoint: config?.useDualstackEndpoint ?? loadNodeConfig(NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS, loaderConfig),\n        useFipsEndpoint: config?.useFipsEndpoint ?? loadNodeConfig(NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS, loaderConfig),\n        userAgentAppId: config?.userAgentAppId ?? loadNodeConfig(NODE_APP_ID_CONFIG_OPTIONS, loaderConfig),\n    };\n};\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.warning = void 0;\nexports.stsRegionDefaultResolver = stsRegionDefaultResolver;\nconst config_resolver_1 = require(\"@smithy/config-resolver\");\nconst node_config_provider_1 = require(\"@smithy/node-config-provider\");\nfunction stsRegionDefaultResolver(loaderConfig = {}) {\n    return (0, node_config_provider_1.loadConfig)({\n        ...config_resolver_1.NODE_REGION_CONFIG_OPTIONS,\n        async default() {\n            if (!exports.warning.silence) {\n                console.warn(\"@aws-sdk - WARN - default STS region of us-east-1 used. See @aws-sdk/credential-providers README and set a region explicitly.\");\n            }\n            return \"us-east-1\";\n        },\n    }, { ...config_resolver_1.NODE_REGION_CONFIG_FILE_OPTIONS, ...loaderConfig });\n}\nexports.warning = {\n    silence: false,\n};\n", "'use strict';\n\nvar stsRegionDefaultResolver = require('./regionConfig/stsRegionDefaultResolver');\nvar configResolver = require('@smithy/config-resolver');\n\nconst getAwsRegionExtensionConfiguration = (runtimeConfig) => {\n    return {\n        setRegion(region) {\n            runtimeConfig.region = region;\n        },\n        region() {\n            return runtimeConfig.region;\n        },\n    };\n};\nconst resolveAwsRegionExtensionConfiguration = (awsRegionExtensionConfiguration) => {\n    return {\n        region: awsRegionExtensionConfiguration.region(),\n    };\n};\n\nexports.NODE_REGION_CONFIG_FILE_OPTIONS = configResolver.NODE_REGION_CONFIG_FILE_OPTIONS;\nexports.NODE_REGION_CONFIG_OPTIONS = configResolver.NODE_REGION_CONFIG_OPTIONS;\nexports.REGION_ENV_NAME = configResolver.REGION_ENV_NAME;\nexports.REGION_INI_NAME = configResolver.REGION_INI_NAME;\nexports.resolveRegionConfig = configResolver.resolveRegionConfig;\nexports.getAwsRegionExtensionConfiguration = getAwsRegionExtensionConfiguration;\nexports.resolveAwsRegionExtensionConfiguration = resolveAwsRegionExtensionConfiguration;\nObject.prototype.hasOwnProperty.call(stsRegionDefaultResolver, '__proto__') &&\n    !Object.prototype.hasOwnProperty.call(exports, '__proto__') &&\n    Object.defineProperty(exports, '__proto__', {\n        enumerable: true,\n        value: stsRegionDefaultResolver['__proto__']\n    });\n\nObject.keys(stsRegionDefaultResolver).forEach(function (k) {\n    if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) exports[k] = stsRegionDefaultResolver[k];\n});\n", "export const getHttpAuthExtensionConfiguration = (runtimeConfig) => {\n    const _httpAuthSchemes = runtimeConfig.httpAuthSchemes;\n    let _httpAuthSchemeProvider = runtimeConfig.httpAuthSchemeProvider;\n    let _credentials = runtimeConfig.credentials;\n    return {\n        setHttpAuthScheme(httpAuthScheme) {\n            const index = _httpAuthSchemes.findIndex((scheme) => scheme.schemeId === httpAuthScheme.schemeId);\n            if (index === -1) {\n                _httpAuthSchemes.push(httpAuthScheme);\n            }\n            else {\n                _httpAuthSchemes.splice(index, 1, httpAuthScheme);\n            }\n        },\n        httpAuthSchemes() {\n            return _httpAuthSchemes;\n        },\n        setHttpAuthSchemeProvider(httpAuthSchemeProvider) {\n            _httpAuthSchemeProvider = httpAuthSchemeProvider;\n        },\n        httpAuthSchemeProvider() {\n            return _httpAuthSchemeProvider;\n        },\n        setCredentials(credentials) {\n            _credentials = credentials;\n        },\n        credentials() {\n            return _credentials;\n        },\n    };\n};\nexport const resolveHttpAuthRuntimeConfig = (config) => {\n    return {\n        httpAuthSchemes: config.httpAuthSchemes(),\n        httpAuthSchemeProvider: config.httpAuthSchemeProvider(),\n        credentials: config.credentials(),\n    };\n};\n", "import { getAwsRegionExtensionConfiguration, resolveAwsRegionExtensionConfiguration, } from \"@aws-sdk/region-config-resolver\";\nimport { getHttpHandlerExtensionConfiguration, resolveHttpHandlerRuntimeConfig } from \"@smithy/protocol-http\";\nimport { getDefaultExtensionConfiguration, resolveDefaultRuntimeConfig } from \"@smithy/smithy-client\";\nimport { getHttpAuthExtensionConfiguration, resolveHttpAuthRuntimeConfig } from \"./auth/httpAuthExtensionConfiguration\";\nexport const resolveRuntimeExtensions = (runtimeConfig, extensions) => {\n    const extensionConfiguration = Object.assign(getAwsRegionExtensionConfiguration(runtimeConfig), getDefaultExtensionConfiguration(runtimeConfig), getHttpHandlerExtensionConfiguration(runtimeConfig), getHttpAuthExtensionConfiguration(runtimeConfig));\n    extensions.forEach((extension) => extension.configure(extensionConfiguration));\n    return Object.assign(runtimeConfig, resolveAwsRegionExtensionConfiguration(extensionConfiguration), resolveDefaultRuntimeConfig(extensionConfiguration), resolveHttpHandlerRuntimeConfig(extensionConfiguration), resolveHttpAuthRuntimeConfig(extensionConfiguration));\n};\n", "import { getHostHeaderPlugin, resolveHostHeaderConfig, } from \"@aws-sdk/middleware-host-header\";\nimport { getLoggerPlugin } from \"@aws-sdk/middleware-logger\";\nimport { getRecursionDetectionPlugin } from \"@aws-sdk/middleware-recursion-detection\";\nimport { getUserAgentPlugin, resolveUserAgentConfig, } from \"@aws-sdk/middleware-user-agent\";\nimport { resolveRegionConfig } from \"@smithy/config-resolver\";\nimport { DefaultIdentityProviderConfig, getHttpAuthSchemeEndpointRuleSetPlugin, getHttpSigningPlugin, } from \"@smithy/core\";\nimport { getSchemaSerdePlugin } from \"@smithy/core/schema\";\nimport { getContentLengthPlugin } from \"@smithy/middleware-content-length\";\nimport { resolveEndpointConfig, } from \"@smithy/middleware-endpoint\";\nimport { getRetryPlugin, resolveRetryConfig, } from \"@smithy/middleware-retry\";\nimport { Client as __Client, } from \"@smithy/smithy-client\";\nimport { defaultSSOOIDCHttpAuthSchemeParametersProvider, resolveHttpAuthSchemeConfig, } from \"./auth/httpAuthSchemeProvider\";\nimport { resolveClientEndpointParameters, } from \"./endpoint/EndpointParameters\";\nimport { getRuntimeConfig as __getRuntimeConfig } from \"./runtimeConfig\";\nimport { resolveRuntimeExtensions } from \"./runtimeExtensions\";\nexport { __Client };\nexport class SSOOIDCClient extends __Client {\n    config;\n    constructor(...[configuration]) {\n        const _config_0 = __getRuntimeConfig(configuration || {});\n        super(_config_0);\n        this.initConfig = _config_0;\n        const _config_1 = resolveClientEndpointParameters(_config_0);\n        const _config_2 = resolveUserAgentConfig(_config_1);\n        const _config_3 = resolveRetryConfig(_config_2);\n        const _config_4 = resolveRegionConfig(_config_3);\n        const _config_5 = resolveHostHeaderConfig(_config_4);\n        const _config_6 = resolveEndpointConfig(_config_5);\n        const _config_7 = resolveHttpAuthSchemeConfig(_config_6);\n        const _config_8 = resolveRuntimeExtensions(_config_7, configuration?.extensions || []);\n        this.config = _config_8;\n        this.middlewareStack.use(getSchemaSerdePlugin(this.config));\n        this.middlewareStack.use(getUserAgentPlugin(this.config));\n        this.middlewareStack.use(getRetryPlugin(this.config));\n        this.middlewareStack.use(getContentLengthPlugin(this.config));\n        this.middlewareStack.use(getHostHeaderPlugin(this.config));\n        this.middlewareStack.use(getLoggerPlugin(this.config));\n        this.middlewareStack.use(getRecursionDetectionPlugin(this.config));\n        this.middlewareStack.use(getHttpAuthSchemeEndpointRuleSetPlugin(this.config, {\n            httpAuthSchemeParametersProvider: defaultSSOOIDCHttpAuthSchemeParametersProvider,\n            identityProviderConfigProvider: async (config) => new DefaultIdentityProviderConfig({\n                \"aws.auth#sigv4\": config.credentials,\n            }),\n        }));\n        this.middlewareStack.use(getHttpSigningPlugin(this.config));\n    }\n    destroy() {\n        super.destroy();\n    }\n}\n", "import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { CreateToken$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class CreateTokenCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSSSOOIDCService\", \"CreateToken\", {})\n    .n(\"SSOOIDCClient\", \"CreateTokenCommand\")\n    .sc(CreateToken$)\n    .build() {\n}\n", "import { createAggregatedClient } from \"@smithy/smithy-client\";\nimport { CreateTokenCommand, } from \"./commands/CreateTokenCommand\";\nimport { SSOOIDCClient } from \"./SSOOIDCClient\";\nconst commands = {\n    CreateTokenCommand,\n};\nexport class SSOOIDC extends SSOOIDCClient {\n}\ncreateAggregatedClient(commands, SSOOIDC);\n", "export * from \"./CreateTokenCommand\";\n", "export const AccessDeniedExceptionReason = {\n    KMS_ACCESS_DENIED: \"KMS_AccessDeniedException\",\n};\nexport const InvalidRequestExceptionReason = {\n    KMS_DISABLED_KEY: \"KMS_DisabledException\",\n    KMS_INVALID_KEY_USAGE: \"KMS_InvalidKeyUsageException\",\n    KMS_INVALID_STATE: \"KMS_InvalidStateException\",\n    KMS_KEY_NOT_FOUND: \"KMS_NotFoundException\",\n};\n", "export {};\n", "export * from \"./SSOOIDCClient\";\nexport * from \"./SSOOIDC\";\nexport * from \"./commands\";\nexport * from \"./schemas/schemas_0\";\nexport * from \"./models/enums\";\nexport * from \"./models/errors\";\nexport * from \"./models/models_0\";\nexport { SSOOIDCServiceException } from \"./models/SSOOIDCServiceException\";\n", "'use strict';\n\nvar client = require('@aws-sdk/core/client');\nvar httpAuthSchemes = require('@aws-sdk/core/httpAuthSchemes');\nvar propertyProvider = require('@smithy/property-provider');\nvar sharedIniFileLoader = require('@smithy/shared-ini-file-loader');\nvar node_fs = require('node:fs');\n\nconst fromEnvSigningName = ({ logger, signingName } = {}) => async () => {\n    logger?.debug?.(\"@aws-sdk/token-providers - fromEnvSigningName\");\n    if (!signingName) {\n        throw new propertyProvider.TokenProviderError(\"Please pass 'signingName' to compute environment variable key\", { logger });\n    }\n    const bearerTokenKey = httpAuthSchemes.getBearerTokenEnvKey(signingName);\n    if (!(bearerTokenKey in process.env)) {\n        throw new propertyProvider.TokenProviderError(`Token not present in '${bearerTokenKey}' environment variable`, { logger });\n    }\n    const token = { token: process.env[bearerTokenKey] };\n    client.setTokenFeature(token, \"BEARER_SERVICE_ENV_VARS\", \"3\");\n    return token;\n};\n\nconst EXPIRE_WINDOW_MS = 5 * 60 * 1000;\nconst REFRESH_MESSAGE = `To refresh this SSO session run 'aws sso login' with the corresponding profile.`;\n\nconst getSsoOidcClient = async (ssoRegion, init = {}, callerClientConfig) => {\n    const { SSOOIDCClient } = await import('@aws-sdk/nested-clients/sso-oidc');\n    const coalesce = (prop) => init.clientConfig?.[prop] ?? init.parentClientConfig?.[prop] ?? callerClientConfig?.[prop];\n    const ssoOidcClient = new SSOOIDCClient(Object.assign({}, init.clientConfig ?? {}, {\n        region: ssoRegion ?? init.clientConfig?.region,\n        logger: coalesce(\"logger\"),\n        userAgentAppId: coalesce(\"userAgentAppId\"),\n    }));\n    return ssoOidcClient;\n};\n\nconst getNewSsoOidcToken = async (ssoToken, ssoRegion, init = {}, callerClientConfig) => {\n    const { CreateTokenCommand } = await import('@aws-sdk/nested-clients/sso-oidc');\n    const ssoOidcClient = await getSsoOidcClient(ssoRegion, init, callerClientConfig);\n    return ssoOidcClient.send(new CreateTokenCommand({\n        clientId: ssoToken.clientId,\n        clientSecret: ssoToken.clientSecret,\n        refreshToken: ssoToken.refreshToken,\n        grantType: \"refresh_token\",\n    }));\n};\n\nconst validateTokenExpiry = (token) => {\n    if (token.expiration && token.expiration.getTime() < Date.now()) {\n        throw new propertyProvider.TokenProviderError(`Token is expired. ${REFRESH_MESSAGE}`, false);\n    }\n};\n\nconst validateTokenKey = (key, value, forRefresh = false) => {\n    if (typeof value === \"undefined\") {\n        throw new propertyProvider.TokenProviderError(`Value not present for '${key}' in SSO Token${forRefresh ? \". Cannot refresh\" : \"\"}. ${REFRESH_MESSAGE}`, false);\n    }\n};\n\nconst { writeFile } = node_fs.promises;\nconst writeSSOTokenToFile = (id, ssoToken) => {\n    const tokenFilepath = sharedIniFileLoader.getSSOTokenFilepath(id);\n    const tokenString = JSON.stringify(ssoToken, null, 2);\n    return writeFile(tokenFilepath, tokenString);\n};\n\nconst lastRefreshAttemptTime = new Date(0);\nconst fromSso = (init = {}) => async ({ callerClientConfig } = {}) => {\n    init.logger?.debug(\"@aws-sdk/token-providers - fromSso\");\n    const profiles = await sharedIniFileLoader.parseKnownFiles(init);\n    const profileName = sharedIniFileLoader.getProfileName({\n        profile: init.profile ?? callerClientConfig?.profile,\n    });\n    const profile = profiles[profileName];\n    if (!profile) {\n        throw new propertyProvider.TokenProviderError(`Profile '${profileName}' could not be found in shared credentials file.`, false);\n    }\n    else if (!profile[\"sso_session\"]) {\n        throw new propertyProvider.TokenProviderError(`Profile '${profileName}' is missing required property 'sso_session'.`);\n    }\n    const ssoSessionName = profile[\"sso_session\"];\n    const ssoSessions = await sharedIniFileLoader.loadSsoSessionData(init);\n    const ssoSession = ssoSessions[ssoSessionName];\n    if (!ssoSession) {\n        throw new propertyProvider.TokenProviderError(`Sso session '${ssoSessionName}' could not be found in shared credentials file.`, false);\n    }\n    for (const ssoSessionRequiredKey of [\"sso_start_url\", \"sso_region\"]) {\n        if (!ssoSession[ssoSessionRequiredKey]) {\n            throw new propertyProvider.TokenProviderError(`Sso session '${ssoSessionName}' is missing required property '${ssoSessionRequiredKey}'.`, false);\n        }\n    }\n    ssoSession[\"sso_start_url\"];\n    const ssoRegion = ssoSession[\"sso_region\"];\n    let ssoToken;\n    try {\n        ssoToken = await sharedIniFileLoader.getSSOTokenFromFile(ssoSessionName);\n    }\n    catch (e) {\n        throw new propertyProvider.TokenProviderError(`The SSO session token associated with profile=${profileName} was not found or is invalid. ${REFRESH_MESSAGE}`, false);\n    }\n    validateTokenKey(\"accessToken\", ssoToken.accessToken);\n    validateTokenKey(\"expiresAt\", ssoToken.expiresAt);\n    const { accessToken, expiresAt } = ssoToken;\n    const existingToken = { token: accessToken, expiration: new Date(expiresAt) };\n    if (existingToken.expiration.getTime() - Date.now() > EXPIRE_WINDOW_MS) {\n        return existingToken;\n    }\n    if (Date.now() - lastRefreshAttemptTime.getTime() < 30 * 1000) {\n        validateTokenExpiry(existingToken);\n        return existingToken;\n    }\n    validateTokenKey(\"clientId\", ssoToken.clientId, true);\n    validateTokenKey(\"clientSecret\", ssoToken.clientSecret, true);\n    validateTokenKey(\"refreshToken\", ssoToken.refreshToken, true);\n    try {\n        lastRefreshAttemptTime.setTime(Date.now());\n        const newSsoOidcToken = await getNewSsoOidcToken(ssoToken, ssoRegion, init, callerClientConfig);\n        validateTokenKey(\"accessToken\", newSsoOidcToken.accessToken);\n        validateTokenKey(\"expiresIn\", newSsoOidcToken.expiresIn);\n        const newTokenExpiration = new Date(Date.now() + newSsoOidcToken.expiresIn * 1000);\n        try {\n            await writeSSOTokenToFile(ssoSessionName, {\n                ...ssoToken,\n                accessToken: newSsoOidcToken.accessToken,\n                expiresAt: newTokenExpiration.toISOString(),\n                refreshToken: newSsoOidcToken.refreshToken,\n            });\n        }\n        catch (error) {\n        }\n        return {\n            token: newSsoOidcToken.accessToken,\n            expiration: newTokenExpiration,\n        };\n    }\n    catch (error) {\n        validateTokenExpiry(existingToken);\n        return existingToken;\n    }\n};\n\nconst fromStatic = ({ token, logger }) => async () => {\n    logger?.debug(\"@aws-sdk/token-providers - fromStatic\");\n    if (!token || !token.token) {\n        throw new propertyProvider.TokenProviderError(`Please pass a valid token to fromStatic`, false);\n    }\n    return token;\n};\n\nconst nodeProvider = (init = {}) => propertyProvider.memoize(propertyProvider.chain(fromSso(init), async () => {\n    throw new propertyProvider.TokenProviderError(\"Could not load token from any providers\", false);\n}), (token) => token.expiration !== undefined && token.expiration.getTime() - Date.now() < 300000, (token) => token.expiration !== undefined);\n\nexports.fromEnvSigningName = fromEnvSigningName;\nexports.fromSso = fromSso;\nexports.fromStatic = fromStatic;\nexports.nodeProvider = nodeProvider;\n", "import { resolveAwsSdkSigV4Config } from \"@aws-sdk/core/httpAuthSchemes\";\nimport { getSmithyContext, normalizeProvider } from \"@smithy/util-middleware\";\nexport const defaultSSOHttpAuthSchemeParametersProvider = async (config, context, input) => {\n    return {\n        operation: getSmithyContext(context).operation,\n        region: (await normalizeProvider(config.region)()) ||\n            (() => {\n                throw new Error(\"expected `region` to be configured for `aws.auth#sigv4`\");\n            })(),\n    };\n};\nfunction createAwsAuthSigv4HttpAuthOption(authParameters) {\n    return {\n        schemeId: \"aws.auth#sigv4\",\n        signingProperties: {\n            name: \"awsssoportal\",\n            region: authParameters.region,\n        },\n        propertiesExtractor: (config, context) => ({\n            signingProperties: {\n                config,\n                context,\n            },\n        }),\n    };\n}\nfunction createSmithyApiNoAuthHttpAuthOption(authParameters) {\n    return {\n        schemeId: \"smithy.api#noAuth\",\n    };\n}\nexport const defaultSSOHttpAuthSchemeProvider = (authParameters) => {\n    const options = [];\n    switch (authParameters.operation) {\n        case \"GetRoleCredentials\": {\n            options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n            break;\n        }\n        default: {\n            options.push(createAwsAuthSigv4HttpAuthOption(authParameters));\n        }\n    }\n    return options;\n};\nexport const resolveHttpAuthSchemeConfig = (config) => {\n    const config_0 = resolveAwsSdkSigV4Config(config);\n    return Object.assign(config_0, {\n        authSchemePreference: normalizeProvider(config.authSchemePreference ?? []),\n    });\n};\n", "export const resolveClientEndpointParameters = (options) => {\n    return Object.assign(options, {\n        useDualstackEndpoint: options.useDualstackEndpoint ?? false,\n        useFipsEndpoint: options.useFipsEndpoint ?? false,\n        defaultSigningName: \"awsssoportal\",\n    });\n};\nexport const commonParams = {\n    UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n    Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n    Region: { type: \"builtInParams\", name: \"region\" },\n    UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n};\n", "import { BinaryDecisionDiagram } from \"@smithy/util-endpoints\";\nconst k = \"ref\";\nconst a = -1, b = true, c = \"isSet\", d = \"PartitionResult\", e = \"booleanEquals\", f = \"getAttr\", g = { [k]: \"Endpoint\" }, h = { [k]: d }, i = {}, j = [{ [k]: \"Region\" }];\nconst _data = {\n    conditions: [\n        [c, [g]],\n        [c, j],\n        [\"aws.partition\", j, d],\n        [e, [{ [k]: \"UseFIPS\" }, b]],\n        [e, [{ [k]: \"UseDualStack\" }, b]],\n        [e, [{ fn: f, argv: [h, \"supportsDualStack\"] }, b]],\n        [e, [{ fn: f, argv: [h, \"supportsFIPS\"] }, b]],\n        [\"stringEquals\", [{ fn: f, argv: [h, \"name\"] }, \"aws-us-gov\"]],\n    ],\n    results: [\n        [a],\n        [a, \"Invalid Configuration: FIPS and custom endpoint are not supported\"],\n        [a, \"Invalid Configuration: Dualstack and custom endpoint are not supported\"],\n        [g, i],\n        [\"https://portal.sso-fips.{Region}.{PartitionResult#dualStackDnsSuffix}\", i],\n        [a, \"FIPS and DualStack are enabled, but this partition does not support one or both\"],\n        [\"https://portal.sso.{Region}.amazonaws.com\", i],\n        [\"https://portal.sso-fips.{Region}.{PartitionResult#dnsSuffix}\", i],\n        [a, \"FIPS is enabled but this partition does not support FIPS\"],\n        [\"https://portal.sso.{Region}.{PartitionResult#dualStackDnsSuffix}\", i],\n        [a, \"DualStack is enabled but this partition does not support DualStack\"],\n        [\"https://portal.sso.{Region}.{PartitionResult#dnsSuffix}\", i],\n        [a, \"Invalid Configuration: Missing Region\"],\n    ],\n};\nconst root = 2;\nconst r = 100_000_000;\nconst nodes = new Int32Array([\n    -1,\n    1,\n    -1,\n    0,\n    13,\n    3,\n    1,\n    4,\n    r + 12,\n    2,\n    5,\n    r + 12,\n    3,\n    8,\n    6,\n    4,\n    7,\n    r + 11,\n    5,\n    r + 9,\n    r + 10,\n    4,\n    11,\n    9,\n    6,\n    10,\n    r + 8,\n    7,\n    r + 6,\n    r + 7,\n    5,\n    12,\n    r + 5,\n    6,\n    r + 4,\n    r + 5,\n    3,\n    r + 1,\n    14,\n    4,\n    r + 2,\n    r + 3,\n]);\nexport const bdd = BinaryDecisionDiagram.from(nodes, root, _data.conditions, _data.results);\n", "import { awsEndpointFunctions } from \"@aws-sdk/util-endpoints\";\nimport { customEndpointFunctions, decideEndpoint, EndpointCache } from \"@smithy/util-endpoints\";\nimport { bdd } from \"./bdd\";\nconst cache = new EndpointCache({\n    size: 50,\n    params: [\"Endpoint\", \"Region\", \"UseDualStack\", \"UseFIPS\"],\n});\nexport const defaultEndpointResolver = (endpointParams, context = {}) => {\n    return cache.get(endpointParams, () => decideEndpoint(bdd, {\n        endpointParams: endpointParams,\n        logger: context.logger,\n    }));\n};\ncustomEndpointFunctions.aws = awsEndpointFunctions;\n", "import { ServiceException as __ServiceException, } from \"@smithy/smithy-client\";\nexport { __ServiceException };\nexport class SSOServiceException extends __ServiceException {\n    constructor(options) {\n        super(options);\n        Object.setPrototypeOf(this, SSOServiceException.prototype);\n    }\n}\n", "import { SSOServiceException as __BaseException } from \"./SSOServiceException\";\nexport class InvalidRequestException extends __BaseException {\n    name = \"InvalidRequestException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"InvalidRequestException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, InvalidRequestException.prototype);\n    }\n}\nexport class ResourceNotFoundException extends __BaseException {\n    name = \"ResourceNotFoundException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"ResourceNotFoundException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, ResourceNotFoundException.prototype);\n    }\n}\nexport class TooManyRequestsException extends __BaseException {\n    name = \"TooManyRequestsException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"TooManyRequestsException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, TooManyRequestsException.prototype);\n    }\n}\nexport class UnauthorizedException extends __BaseException {\n    name = \"UnauthorizedException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"UnauthorizedException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, UnauthorizedException.prototype);\n    }\n}\n", "const _ATT = \"AccessTokenType\";\nconst _GRC = \"GetRoleCredentials\";\nconst _GRCR = \"GetRoleCredentialsRequest\";\nconst _GRCRe = \"GetRoleCredentialsResponse\";\nconst _IRE = \"InvalidRequestException\";\nconst _RC = \"RoleCredentials\";\nconst _RNFE = \"ResourceNotFoundException\";\nconst _SAKT = \"SecretAccessKeyType\";\nconst _STT = \"SessionTokenType\";\nconst _TMRE = \"TooManyRequestsException\";\nconst _UE = \"UnauthorizedException\";\nconst _aI = \"accountId\";\nconst _aKI = \"accessKeyId\";\nconst _aT = \"accessToken\";\nconst _ai = \"account_id\";\nconst _c = \"client\";\nconst _e = \"error\";\nconst _ex = \"expiration\";\nconst _h = \"http\";\nconst _hE = \"httpError\";\nconst _hH = \"httpHeader\";\nconst _hQ = \"httpQuery\";\nconst _m = \"message\";\nconst _rC = \"roleCredentials\";\nconst _rN = \"roleName\";\nconst _rn = \"role_name\";\nconst _s = \"smithy.ts.sdk.synthetic.com.amazonaws.sso\";\nconst _sAK = \"secretAccessKey\";\nconst _sT = \"sessionToken\";\nconst _xasbt = \"x-amz-sso_bearer_token\";\nconst n0 = \"com.amazonaws.sso\";\nimport { TypeRegistry } from \"@smithy/core/schema\";\nimport { InvalidRequestException, ResourceNotFoundException, TooManyRequestsException, UnauthorizedException, } from \"../models/errors\";\nimport { SSOServiceException } from \"../models/SSOServiceException\";\nconst _s_registry = TypeRegistry.for(_s);\nexport var SSOServiceException$ = [-3, _s, \"SSOServiceException\", 0, [], []];\n_s_registry.registerError(SSOServiceException$, SSOServiceException);\nconst n0_registry = TypeRegistry.for(n0);\nexport var InvalidRequestException$ = [-3, n0, _IRE, { [_e]: _c, [_hE]: 400 }, [_m], [0]];\nn0_registry.registerError(InvalidRequestException$, InvalidRequestException);\nexport var ResourceNotFoundException$ = [-3, n0, _RNFE, { [_e]: _c, [_hE]: 404 }, [_m], [0]];\nn0_registry.registerError(ResourceNotFoundException$, ResourceNotFoundException);\nexport var TooManyRequestsException$ = [-3, n0, _TMRE, { [_e]: _c, [_hE]: 429 }, [_m], [0]];\nn0_registry.registerError(TooManyRequestsException$, TooManyRequestsException);\nexport var UnauthorizedException$ = [-3, n0, _UE, { [_e]: _c, [_hE]: 401 }, [_m], [0]];\nn0_registry.registerError(UnauthorizedException$, UnauthorizedException);\nexport const errorTypeRegistries = [_s_registry, n0_registry];\nvar AccessTokenType = [0, n0, _ATT, 8, 0];\nvar SecretAccessKeyType = [0, n0, _SAKT, 8, 0];\nvar SessionTokenType = [0, n0, _STT, 8, 0];\nexport var GetRoleCredentialsRequest$ = [\n    3,\n    n0,\n    _GRCR,\n    0,\n    [_rN, _aI, _aT],\n    [\n        [0, { [_hQ]: _rn }],\n        [0, { [_hQ]: _ai }],\n        [() => AccessTokenType, { [_hH]: _xasbt }],\n    ],\n    3,\n];\nexport var GetRoleCredentialsResponse$ = [\n    3,\n    n0,\n    _GRCRe,\n    0,\n    [_rC],\n    [[() => RoleCredentials$, 0]],\n];\nexport var RoleCredentials$ = [\n    3,\n    n0,\n    _RC,\n    0,\n    [_aKI, _sAK, _sT, _ex],\n    [0, [() => SecretAccessKeyType, 0], [() => SessionTokenType, 0], 1],\n];\nexport var GetRoleCredentials$ = [\n    9,\n    n0,\n    _GRC,\n    { [_h]: [\"GET\", \"/federation/credentials\", 200] },\n    () => GetRoleCredentialsRequest$,\n    () => GetRoleCredentialsResponse$,\n];\n", "import { AwsSdkSigV4Signer } from \"@aws-sdk/core/httpAuthSchemes\";\nimport { AwsRestJsonProtocol } from \"@aws-sdk/core/protocols\";\nimport { NoAuthSigner } from \"@smithy/core\";\nimport { NoOpLogger } from \"@smithy/smithy-client\";\nimport { parseUrl } from \"@smithy/url-parser\";\nimport { fromBase64, toBase64 } from \"@smithy/util-base64\";\nimport { fromUtf8, toUtf8 } from \"@smithy/util-utf8\";\nimport { defaultSSOHttpAuthSchemeProvider } from \"./auth/httpAuthSchemeProvider\";\nimport { defaultEndpointResolver } from \"./endpoint/endpointResolver\";\nimport { errorTypeRegistries } from \"./schemas/schemas_0\";\nexport const getRuntimeConfig = (config) => {\n    return {\n        apiVersion: \"2019-06-10\",\n        base64Decoder: config?.base64Decoder ?? fromBase64,\n        base64Encoder: config?.base64Encoder ?? toBase64,\n        disableHostPrefix: config?.disableHostPrefix ?? false,\n        endpointProvider: config?.endpointProvider ?? defaultEndpointResolver,\n        extensions: config?.extensions ?? [],\n        httpAuthSchemeProvider: config?.httpAuthSchemeProvider ?? defaultSSOHttpAuthSchemeProvider,\n        httpAuthSchemes: config?.httpAuthSchemes ?? [\n            {\n                schemeId: \"aws.auth#sigv4\",\n                identityProvider: (ipc) => ipc.getIdentityProvider(\"aws.auth#sigv4\"),\n                signer: new AwsSdkSigV4Signer(),\n            },\n            {\n                schemeId: \"smithy.api#noAuth\",\n                identityProvider: (ipc) => ipc.getIdentityProvider(\"smithy.api#noAuth\") || (async () => ({})),\n                signer: new NoAuthSigner(),\n            },\n        ],\n        logger: config?.logger ?? new NoOpLogger(),\n        protocol: config?.protocol ?? AwsRestJsonProtocol,\n        protocolSettings: config?.protocolSettings ?? {\n            defaultNamespace: \"com.amazonaws.sso\",\n            errorTypeRegistries,\n            version: \"2019-06-10\",\n            serviceTarget: \"SWBPortalService\",\n        },\n        serviceId: config?.serviceId ?? \"SSO\",\n        urlParser: config?.urlParser ?? parseUrl,\n        utf8Decoder: config?.utf8Decoder ?? fromUtf8,\n        utf8Encoder: config?.utf8Encoder ?? toUtf8,\n    };\n};\n", "import packageInfo from \"../../../package.json\";\nimport { emitWarningIfUnsupportedVersion as awsCheckVersion } from \"@aws-sdk/core/client\";\nimport { NODE_AUTH_SCHEME_PREFERENCE_OPTIONS } from \"@aws-sdk/core/httpAuthSchemes\";\nimport { createDefaultUserAgentProvider, NODE_APP_ID_CONFIG_OPTIONS } from \"@aws-sdk/util-user-agent-node\";\nimport { NODE_REGION_CONFIG_FILE_OPTIONS, NODE_REGION_CONFIG_OPTIONS, NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS, NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS, } from \"@smithy/config-resolver\";\nimport { Hash } from \"@smithy/hash-node\";\nimport { NODE_MAX_ATTEMPT_CONFIG_OPTIONS, NODE_RETRY_MODE_CONFIG_OPTIONS } from \"@smithy/middleware-retry\";\nimport { loadConfig as loadNodeConfig } from \"@smithy/node-config-provider\";\nimport { NodeHttpHandler as RequestHandler, streamCollector } from \"@smithy/node-http-handler\";\nimport { emitWarningIfUnsupportedVersion, loadConfigsForDefaultMode } from \"@smithy/smithy-client\";\nimport { calculateBodyLength } from \"@smithy/util-body-length-node\";\nimport { resolveDefaultsModeConfig } from \"@smithy/util-defaults-mode-node\";\nimport { DEFAULT_RETRY_MODE } from \"@smithy/util-retry\";\nimport { getRuntimeConfig as getSharedRuntimeConfig } from \"./runtimeConfig.shared\";\nexport const getRuntimeConfig = (config) => {\n    emitWarningIfUnsupportedVersion(process.version);\n    const defaultsMode = resolveDefaultsModeConfig(config);\n    const defaultConfigProvider = () => defaultsMode().then(loadConfigsForDefaultMode);\n    const clientSharedValues = getSharedRuntimeConfig(config);\n    awsCheckVersion(process.version);\n    const loaderConfig = {\n        profile: config?.profile,\n        logger: clientSharedValues.logger,\n    };\n    return {\n        ...clientSharedValues,\n        ...config,\n        runtime: \"node\",\n        defaultsMode,\n        authSchemePreference: config?.authSchemePreference ?? loadNodeConfig(NODE_AUTH_SCHEME_PREFERENCE_OPTIONS, loaderConfig),\n        bodyLengthChecker: config?.bodyLengthChecker ?? calculateBodyLength,\n        defaultUserAgentProvider: config?.defaultUserAgentProvider ??\n            createDefaultUserAgentProvider({ serviceId: clientSharedValues.serviceId, clientVersion: packageInfo.version }),\n        maxAttempts: config?.maxAttempts ?? loadNodeConfig(NODE_MAX_ATTEMPT_CONFIG_OPTIONS, config),\n        region: config?.region ??\n            loadNodeConfig(NODE_REGION_CONFIG_OPTIONS, { ...NODE_REGION_CONFIG_FILE_OPTIONS, ...loaderConfig }),\n        requestHandler: RequestHandler.create(config?.requestHandler ?? defaultConfigProvider),\n        retryMode: config?.retryMode ??\n            loadNodeConfig({\n                ...NODE_RETRY_MODE_CONFIG_OPTIONS,\n                default: async () => (await defaultConfigProvider()).retryMode || DEFAULT_RETRY_MODE,\n            }, config),\n        sha256: config?.sha256 ?? Hash.bind(null, \"sha256\"),\n        streamCollector: config?.streamCollector ?? streamCollector,\n        useDualstackEndpoint: config?.useDualstackEndpoint ?? loadNodeConfig(NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS, loaderConfig),\n        useFipsEndpoint: config?.useFipsEndpoint ?? loadNodeConfig(NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS, loaderConfig),\n        userAgentAppId: config?.userAgentAppId ?? loadNodeConfig(NODE_APP_ID_CONFIG_OPTIONS, loaderConfig),\n    };\n};\n", "export const getHttpAuthExtensionConfiguration = (runtimeConfig) => {\n    const _httpAuthSchemes = runtimeConfig.httpAuthSchemes;\n    let _httpAuthSchemeProvider = runtimeConfig.httpAuthSchemeProvider;\n    let _credentials = runtimeConfig.credentials;\n    return {\n        setHttpAuthScheme(httpAuthScheme) {\n            const index = _httpAuthSchemes.findIndex((scheme) => scheme.schemeId === httpAuthScheme.schemeId);\n            if (index === -1) {\n                _httpAuthSchemes.push(httpAuthScheme);\n            }\n            else {\n                _httpAuthSchemes.splice(index, 1, httpAuthScheme);\n            }\n        },\n        httpAuthSchemes() {\n            return _httpAuthSchemes;\n        },\n        setHttpAuthSchemeProvider(httpAuthSchemeProvider) {\n            _httpAuthSchemeProvider = httpAuthSchemeProvider;\n        },\n        httpAuthSchemeProvider() {\n            return _httpAuthSchemeProvider;\n        },\n        setCredentials(credentials) {\n            _credentials = credentials;\n        },\n        credentials() {\n            return _credentials;\n        },\n    };\n};\nexport const resolveHttpAuthRuntimeConfig = (config) => {\n    return {\n        httpAuthSchemes: config.httpAuthSchemes(),\n        httpAuthSchemeProvider: config.httpAuthSchemeProvider(),\n        credentials: config.credentials(),\n    };\n};\n", "import { getAwsRegionExtensionConfiguration, resolveAwsRegionExtensionConfiguration, } from \"@aws-sdk/region-config-resolver\";\nimport { getHttpHandlerExtensionConfiguration, resolveHttpHandlerRuntimeConfig } from \"@smithy/protocol-http\";\nimport { getDefaultExtensionConfiguration, resolveDefaultRuntimeConfig } from \"@smithy/smithy-client\";\nimport { getHttpAuthExtensionConfiguration, resolveHttpAuthRuntimeConfig } from \"./auth/httpAuthExtensionConfiguration\";\nexport const resolveRuntimeExtensions = (runtimeConfig, extensions) => {\n    const extensionConfiguration = Object.assign(getAwsRegionExtensionConfiguration(runtimeConfig), getDefaultExtensionConfiguration(runtimeConfig), getHttpHandlerExtensionConfiguration(runtimeConfig), getHttpAuthExtensionConfiguration(runtimeConfig));\n    extensions.forEach((extension) => extension.configure(extensionConfiguration));\n    return Object.assign(runtimeConfig, resolveAwsRegionExtensionConfiguration(extensionConfiguration), resolveDefaultRuntimeConfig(extensionConfiguration), resolveHttpHandlerRuntimeConfig(extensionConfiguration), resolveHttpAuthRuntimeConfig(extensionConfiguration));\n};\n", "import { getHostHeaderPlugin, resolveHostHeaderConfig, } from \"@aws-sdk/middleware-host-header\";\nimport { getLoggerPlugin } from \"@aws-sdk/middleware-logger\";\nimport { getRecursionDetectionPlugin } from \"@aws-sdk/middleware-recursion-detection\";\nimport { getUserAgentPlugin, resolveUserAgentConfig, } from \"@aws-sdk/middleware-user-agent\";\nimport { resolveRegionConfig } from \"@smithy/config-resolver\";\nimport { DefaultIdentityProviderConfig, getHttpAuthSchemeEndpointRuleSetPlugin, getHttpSigningPlugin, } from \"@smithy/core\";\nimport { getSchemaSerdePlugin } from \"@smithy/core/schema\";\nimport { getContentLengthPlugin } from \"@smithy/middleware-content-length\";\nimport { resolveEndpointConfig, } from \"@smithy/middleware-endpoint\";\nimport { getRetryPlugin, resolveRetryConfig, } from \"@smithy/middleware-retry\";\nimport { Client as __Client, } from \"@smithy/smithy-client\";\nimport { defaultSSOHttpAuthSchemeParametersProvider, resolveHttpAuthSchemeConfig, } from \"./auth/httpAuthSchemeProvider\";\nimport { resolveClientEndpointParameters, } from \"./endpoint/EndpointParameters\";\nimport { getRuntimeConfig as __getRuntimeConfig } from \"./runtimeConfig\";\nimport { resolveRuntimeExtensions } from \"./runtimeExtensions\";\nexport { __Client };\nexport class SSOClient extends __Client {\n    config;\n    constructor(...[configuration]) {\n        const _config_0 = __getRuntimeConfig(configuration || {});\n        super(_config_0);\n        this.initConfig = _config_0;\n        const _config_1 = resolveClientEndpointParameters(_config_0);\n        const _config_2 = resolveUserAgentConfig(_config_1);\n        const _config_3 = resolveRetryConfig(_config_2);\n        const _config_4 = resolveRegionConfig(_config_3);\n        const _config_5 = resolveHostHeaderConfig(_config_4);\n        const _config_6 = resolveEndpointConfig(_config_5);\n        const _config_7 = resolveHttpAuthSchemeConfig(_config_6);\n        const _config_8 = resolveRuntimeExtensions(_config_7, configuration?.extensions || []);\n        this.config = _config_8;\n        this.middlewareStack.use(getSchemaSerdePlugin(this.config));\n        this.middlewareStack.use(getUserAgentPlugin(this.config));\n        this.middlewareStack.use(getRetryPlugin(this.config));\n        this.middlewareStack.use(getContentLengthPlugin(this.config));\n        this.middlewareStack.use(getHostHeaderPlugin(this.config));\n        this.middlewareStack.use(getLoggerPlugin(this.config));\n        this.middlewareStack.use(getRecursionDetectionPlugin(this.config));\n        this.middlewareStack.use(getHttpAuthSchemeEndpointRuleSetPlugin(this.config, {\n            httpAuthSchemeParametersProvider: defaultSSOHttpAuthSchemeParametersProvider,\n            identityProviderConfigProvider: async (config) => new DefaultIdentityProviderConfig({\n                \"aws.auth#sigv4\": config.credentials,\n            }),\n        }));\n        this.middlewareStack.use(getHttpSigningPlugin(this.config));\n    }\n    destroy() {\n        super.destroy();\n    }\n}\n", "import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { GetRoleCredentials$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class GetRoleCredentialsCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"SWBPortalService\", \"GetRoleCredentials\", {})\n    .n(\"SSOClient\", \"GetRoleCredentialsCommand\")\n    .sc(GetRoleCredentials$)\n    .build() {\n}\n", "import { createAggregatedClient } from \"@smithy/smithy-client\";\nimport { GetRoleCredentialsCommand, } from \"./commands/GetRoleCredentialsCommand\";\nimport { SSOClient } from \"./SSOClient\";\nconst commands = {\n    GetRoleCredentialsCommand,\n};\nexport class SSO extends SSOClient {\n}\ncreateAggregatedClient(commands, SSO);\n", "export * from \"./GetRoleCredentialsCommand\";\n", "export {};\n", "export * from \"./SSOClient\";\nexport * from \"./SSO\";\nexport * from \"./commands\";\nexport * from \"./schemas/schemas_0\";\nexport * from \"./models/errors\";\nexport * from \"./models/models_0\";\nexport { SSOServiceException } from \"./models/SSOServiceException\";\n", "'use strict';\n\nvar sso = require('@aws-sdk/nested-clients/sso');\n\n\n\nexports.GetRoleCredentialsCommand = sso.GetRoleCredentialsCommand;\nexports.SSOClient = sso.SSOClient;\n", "'use strict';\n\nvar propertyProvider = require('@smithy/property-provider');\nvar sharedIniFileLoader = require('@smithy/shared-ini-file-loader');\nvar client = require('@aws-sdk/core/client');\nvar tokenProviders = require('@aws-sdk/token-providers');\n\nconst isSsoProfile = (arg) => arg &&\n    (typeof arg.sso_start_url === \"string\" ||\n        typeof arg.sso_account_id === \"string\" ||\n        typeof arg.sso_session === \"string\" ||\n        typeof arg.sso_region === \"string\" ||\n        typeof arg.sso_role_name === \"string\");\n\nconst SHOULD_FAIL_CREDENTIAL_CHAIN = false;\nconst resolveSSOCredentials = async ({ ssoStartUrl, ssoSession, ssoAccountId, ssoRegion, ssoRoleName, ssoClient, clientConfig, parentClientConfig, callerClientConfig, profile, filepath, configFilepath, ignoreCache, logger, }) => {\n    let token;\n    const refreshMessage = `To refresh this SSO session run aws sso login with the corresponding profile.`;\n    if (ssoSession) {\n        try {\n            const _token = await tokenProviders.fromSso({\n                profile,\n                filepath,\n                configFilepath,\n                ignoreCache,\n            })();\n            token = {\n                accessToken: _token.token,\n                expiresAt: new Date(_token.expiration).toISOString(),\n            };\n        }\n        catch (e) {\n            throw new propertyProvider.CredentialsProviderError(e.message, {\n                tryNextLink: SHOULD_FAIL_CREDENTIAL_CHAIN,\n                logger,\n            });\n        }\n    }\n    else {\n        try {\n            token = await sharedIniFileLoader.getSSOTokenFromFile(ssoStartUrl);\n        }\n        catch (e) {\n            throw new propertyProvider.CredentialsProviderError(`The SSO session associated with this profile is invalid. ${refreshMessage}`, {\n                tryNextLink: SHOULD_FAIL_CREDENTIAL_CHAIN,\n                logger,\n            });\n        }\n    }\n    if (new Date(token.expiresAt).getTime() - Date.now() <= 0) {\n        throw new propertyProvider.CredentialsProviderError(`The SSO session associated with this profile has expired. ${refreshMessage}`, {\n            tryNextLink: SHOULD_FAIL_CREDENTIAL_CHAIN,\n            logger,\n        });\n    }\n    const { accessToken } = token;\n    const { SSOClient, GetRoleCredentialsCommand } = await Promise.resolve().then(function () { return require('./loadSso-BKDNrsal.js'); });\n    const sso = ssoClient ||\n        new SSOClient(Object.assign({}, clientConfig ?? {}, {\n            logger: clientConfig?.logger ?? callerClientConfig?.logger ?? parentClientConfig?.logger,\n            region: clientConfig?.region ?? ssoRegion,\n            userAgentAppId: clientConfig?.userAgentAppId ?? callerClientConfig?.userAgentAppId ?? parentClientConfig?.userAgentAppId,\n        }));\n    let ssoResp;\n    try {\n        ssoResp = await sso.send(new GetRoleCredentialsCommand({\n            accountId: ssoAccountId,\n            roleName: ssoRoleName,\n            accessToken,\n        }));\n    }\n    catch (e) {\n        throw new propertyProvider.CredentialsProviderError(e, {\n            tryNextLink: SHOULD_FAIL_CREDENTIAL_CHAIN,\n            logger,\n        });\n    }\n    const { roleCredentials: { accessKeyId, secretAccessKey, sessionToken, expiration, credentialScope, accountId } = {}, } = ssoResp;\n    if (!accessKeyId || !secretAccessKey || !sessionToken || !expiration) {\n        throw new propertyProvider.CredentialsProviderError(\"SSO returns an invalid temporary credential.\", {\n            tryNextLink: SHOULD_FAIL_CREDENTIAL_CHAIN,\n            logger,\n        });\n    }\n    const credentials = {\n        accessKeyId,\n        secretAccessKey,\n        sessionToken,\n        expiration: new Date(expiration),\n        ...(credentialScope && { credentialScope }),\n        ...(accountId && { accountId }),\n    };\n    if (ssoSession) {\n        client.setCredentialFeature(credentials, \"CREDENTIALS_SSO\", \"s\");\n    }\n    else {\n        client.setCredentialFeature(credentials, \"CREDENTIALS_SSO_LEGACY\", \"u\");\n    }\n    return credentials;\n};\n\nconst validateSsoProfile = (profile, logger) => {\n    const { sso_start_url, sso_account_id, sso_region, sso_role_name } = profile;\n    if (!sso_start_url || !sso_account_id || !sso_region || !sso_role_name) {\n        throw new propertyProvider.CredentialsProviderError(`Profile is configured with invalid SSO credentials. Required parameters \"sso_account_id\", ` +\n            `\"sso_region\", \"sso_role_name\", \"sso_start_url\". Got ${Object.keys(profile).join(\", \")}\\nReference: https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sso.html`, { tryNextLink: false, logger });\n    }\n    return profile;\n};\n\nconst fromSSO = (init = {}) => async ({ callerClientConfig } = {}) => {\n    init.logger?.debug(\"@aws-sdk/credential-provider-sso - fromSSO\");\n    const { ssoStartUrl, ssoAccountId, ssoRegion, ssoRoleName, ssoSession } = init;\n    const { ssoClient } = init;\n    const profileName = sharedIniFileLoader.getProfileName({\n        profile: init.profile ?? callerClientConfig?.profile,\n    });\n    if (!ssoStartUrl && !ssoAccountId && !ssoRegion && !ssoRoleName && !ssoSession) {\n        const profiles = await sharedIniFileLoader.parseKnownFiles(init);\n        const profile = profiles[profileName];\n        if (!profile) {\n            throw new propertyProvider.CredentialsProviderError(`Profile ${profileName} was not found.`, { logger: init.logger });\n        }\n        if (!isSsoProfile(profile)) {\n            throw new propertyProvider.CredentialsProviderError(`Profile ${profileName} is not configured with SSO credentials.`, {\n                logger: init.logger,\n            });\n        }\n        if (profile?.sso_session) {\n            const ssoSessions = await sharedIniFileLoader.loadSsoSessionData(init);\n            const session = ssoSessions[profile.sso_session];\n            const conflictMsg = ` configurations in profile ${profileName} and sso-session ${profile.sso_session}`;\n            if (ssoRegion && ssoRegion !== session.sso_region) {\n                throw new propertyProvider.CredentialsProviderError(`Conflicting SSO region` + conflictMsg, {\n                    tryNextLink: false,\n                    logger: init.logger,\n                });\n            }\n            if (ssoStartUrl && ssoStartUrl !== session.sso_start_url) {\n                throw new propertyProvider.CredentialsProviderError(`Conflicting SSO start_url` + conflictMsg, {\n                    tryNextLink: false,\n                    logger: init.logger,\n                });\n            }\n            profile.sso_region = session.sso_region;\n            profile.sso_start_url = session.sso_start_url;\n        }\n        const { sso_start_url, sso_account_id, sso_region, sso_role_name, sso_session } = validateSsoProfile(profile, init.logger);\n        return resolveSSOCredentials({\n            ssoStartUrl: sso_start_url,\n            ssoSession: sso_session,\n            ssoAccountId: sso_account_id,\n            ssoRegion: sso_region,\n            ssoRoleName: sso_role_name,\n            ssoClient: ssoClient,\n            clientConfig: init.clientConfig,\n            parentClientConfig: init.parentClientConfig,\n            callerClientConfig: init.callerClientConfig,\n            profile: profileName,\n            filepath: init.filepath,\n            configFilepath: init.configFilepath,\n            ignoreCache: init.ignoreCache,\n            logger: init.logger,\n        });\n    }\n    else if (!ssoStartUrl || !ssoAccountId || !ssoRegion || !ssoRoleName) {\n        throw new propertyProvider.CredentialsProviderError(\"Incomplete configuration. The fromSSO() argument hash must include \" +\n            '\"ssoStartUrl\", \"ssoAccountId\", \"ssoRegion\", \"ssoRoleName\"', { tryNextLink: false, logger: init.logger });\n    }\n    else {\n        return resolveSSOCredentials({\n            ssoStartUrl,\n            ssoSession,\n            ssoAccountId,\n            ssoRegion,\n            ssoRoleName,\n            ssoClient,\n            clientConfig: init.clientConfig,\n            parentClientConfig: init.parentClientConfig,\n            callerClientConfig: init.callerClientConfig,\n            profile: profileName,\n            filepath: init.filepath,\n            configFilepath: init.configFilepath,\n            ignoreCache: init.ignoreCache,\n            logger: init.logger,\n        });\n    }\n};\n\nexports.fromSSO = fromSSO;\nexports.isSsoProfile = isSsoProfile;\nexports.validateSsoProfile = validateSsoProfile;\n", "import { resolveAwsSdkSigV4Config } from \"@aws-sdk/core/httpAuthSchemes\";\nimport { getSmithyContext, normalizeProvider } from \"@smithy/util-middleware\";\nexport const defaultSigninHttpAuthSchemeParametersProvider = async (config, context, input) => {\n    return {\n        operation: getSmithyContext(context).operation,\n        region: (await normalizeProvider(config.region)()) ||\n            (() => {\n                throw new Error(\"expected `region` to be configured for `aws.auth#sigv4`\");\n            })(),\n    };\n};\nfunction createAwsAuthSigv4HttpAuthOption(authParameters) {\n    return {\n        schemeId: \"aws.auth#sigv4\",\n        signingProperties: {\n            name: \"signin\",\n            region: authParameters.region,\n        },\n        propertiesExtractor: (config, context) => ({\n            signingProperties: {\n                config,\n                context,\n            },\n        }),\n    };\n}\nfunction createSmithyApiNoAuthHttpAuthOption(authParameters) {\n    return {\n        schemeId: \"smithy.api#noAuth\",\n    };\n}\nexport const defaultSigninHttpAuthSchemeProvider = (authParameters) => {\n    const options = [];\n    switch (authParameters.operation) {\n        case \"CreateOAuth2Token\": {\n            options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n            break;\n        }\n        default: {\n            options.push(createAwsAuthSigv4HttpAuthOption(authParameters));\n        }\n    }\n    return options;\n};\nexport const resolveHttpAuthSchemeConfig = (config) => {\n    const config_0 = resolveAwsSdkSigV4Config(config);\n    return Object.assign(config_0, {\n        authSchemePreference: normalizeProvider(config.authSchemePreference ?? []),\n    });\n};\n", "export const resolveClientEndpointParameters = (options) => {\n    return Object.assign(options, {\n        useDualstackEndpoint: options.useDualstackEndpoint ?? false,\n        useFipsEndpoint: options.useFipsEndpoint ?? false,\n        defaultSigningName: \"signin\",\n    });\n};\nexport const commonParams = {\n    UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n    Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n    Region: { type: \"builtInParams\", name: \"region\" },\n    UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n};\n", "import { BinaryDecisionDiagram } from \"@smithy/util-endpoints\";\nconst m = \"ref\";\nconst a = -1, b = true, c = \"isSet\", d = \"PartitionResult\", e = \"booleanEquals\", f = \"getAttr\", g = \"stringEquals\", h = { [m]: \"Endpoint\" }, i = { [m]: d }, j = { fn: f, argv: [i, \"name\"] }, k = {}, l = [{ [m]: \"Region\" }];\nconst _data = {\n    conditions: [\n        [c, [h]],\n        [c, l],\n        [\"aws.partition\", l, d],\n        [e, [{ [m]: \"UseFIPS\" }, b]],\n        [e, [{ [m]: \"UseDualStack\" }, b]],\n        [e, [{ fn: f, argv: [i, \"supportsDualStack\"] }, b]],\n        [e, [{ fn: f, argv: [i, \"supportsFIPS\"] }, b]],\n        [g, [j, \"aws\"]],\n        [g, [j, \"aws-cn\"]],\n        [g, [j, \"aws-us-gov\"]],\n    ],\n    results: [\n        [a],\n        [a, \"Invalid Configuration: FIPS and custom endpoint are not supported\"],\n        [a, \"Invalid Configuration: Dualstack and custom endpoint are not supported\"],\n        [h, k],\n        [\"https://{Region}.signin.aws.amazon.com\", k],\n        [\"https://{Region}.signin.amazonaws.cn\", k],\n        [\"https://{Region}.signin.amazonaws-us-gov.com\", k],\n        [\"https://signin-fips.{Region}.{PartitionResult#dualStackDnsSuffix}\", k],\n        [a, \"FIPS and DualStack are enabled, but this partition does not support one or both\"],\n        [\"https://signin-fips.{Region}.{PartitionResult#dnsSuffix}\", k],\n        [a, \"FIPS is enabled but this partition does not support FIPS\"],\n        [\"https://signin.{Region}.{PartitionResult#dualStackDnsSuffix}\", k],\n        [a, \"DualStack is enabled but this partition does not support DualStack\"],\n        [\"https://signin.{Region}.{PartitionResult#dnsSuffix}\", k],\n        [a, \"Invalid Configuration: Missing Region\"],\n    ],\n};\nconst root = 2;\nconst r = 100_000_000;\nconst nodes = new Int32Array([\n    -1,\n    1,\n    -1,\n    0,\n    15,\n    3,\n    1,\n    4,\n    r + 14,\n    2,\n    5,\n    r + 14,\n    3,\n    11,\n    6,\n    4,\n    10,\n    7,\n    7,\n    r + 4,\n    8,\n    8,\n    r + 5,\n    9,\n    9,\n    r + 6,\n    r + 13,\n    5,\n    r + 11,\n    r + 12,\n    4,\n    13,\n    12,\n    6,\n    r + 9,\n    r + 10,\n    5,\n    14,\n    r + 8,\n    6,\n    r + 7,\n    r + 8,\n    3,\n    r + 1,\n    16,\n    4,\n    r + 2,\n    r + 3,\n]);\nexport const bdd = BinaryDecisionDiagram.from(nodes, root, _data.conditions, _data.results);\n", "import { awsEndpointFunctions } from \"@aws-sdk/util-endpoints\";\nimport { customEndpointFunctions, decideEndpoint, EndpointCache } from \"@smithy/util-endpoints\";\nimport { bdd } from \"./bdd\";\nconst cache = new EndpointCache({\n    size: 50,\n    params: [\"Endpoint\", \"Region\", \"UseDualStack\", \"UseFIPS\"],\n});\nexport const defaultEndpointResolver = (endpointParams, context = {}) => {\n    return cache.get(endpointParams, () => decideEndpoint(bdd, {\n        endpointParams: endpointParams,\n        logger: context.logger,\n    }));\n};\ncustomEndpointFunctions.aws = awsEndpointFunctions;\n", "import { ServiceException as __ServiceException, } from \"@smithy/smithy-client\";\nexport { __ServiceException };\nexport class SigninServiceException extends __ServiceException {\n    constructor(options) {\n        super(options);\n        Object.setPrototypeOf(this, SigninServiceException.prototype);\n    }\n}\n", "import { SigninServiceException as __BaseException } from \"./SigninServiceException\";\nexport class AccessDeniedException extends __BaseException {\n    name = \"AccessDeniedException\";\n    $fault = \"client\";\n    error;\n    constructor(opts) {\n        super({\n            name: \"AccessDeniedException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, AccessDeniedException.prototype);\n        this.error = opts.error;\n    }\n}\nexport class InternalServerException extends __BaseException {\n    name = \"InternalServerException\";\n    $fault = \"server\";\n    error;\n    constructor(opts) {\n        super({\n            name: \"InternalServerException\",\n            $fault: \"server\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, InternalServerException.prototype);\n        this.error = opts.error;\n    }\n}\nexport class TooManyRequestsError extends __BaseException {\n    name = \"TooManyRequestsError\";\n    $fault = \"client\";\n    error;\n    constructor(opts) {\n        super({\n            name: \"TooManyRequestsError\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, TooManyRequestsError.prototype);\n        this.error = opts.error;\n    }\n}\nexport class ValidationException extends __BaseException {\n    name = \"ValidationException\";\n    $fault = \"client\";\n    error;\n    constructor(opts) {\n        super({\n            name: \"ValidationException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, ValidationException.prototype);\n        this.error = opts.error;\n    }\n}\n", "const _ADE = \"AccessDeniedException\";\nconst _AT = \"AccessToken\";\nconst _COAT = \"CreateOAuth2Token\";\nconst _COATR = \"CreateOAuth2TokenRequest\";\nconst _COATRB = \"CreateOAuth2TokenRequestBody\";\nconst _COATRBr = \"CreateOAuth2TokenResponseBody\";\nconst _COATRr = \"CreateOAuth2TokenResponse\";\nconst _ISE = \"InternalServerException\";\nconst _RT = \"RefreshToken\";\nconst _TMRE = \"TooManyRequestsError\";\nconst _VE = \"ValidationException\";\nconst _aKI = \"accessKeyId\";\nconst _aT = \"accessToken\";\nconst _c = \"client\";\nconst _cI = \"clientId\";\nconst _cV = \"codeVerifier\";\nconst _co = \"code\";\nconst _e = \"error\";\nconst _eI = \"expiresIn\";\nconst _gT = \"grantType\";\nconst _h = \"http\";\nconst _hE = \"httpError\";\nconst _iT = \"idToken\";\nconst _jN = \"jsonName\";\nconst _m = \"message\";\nconst _rT = \"refreshToken\";\nconst _rU = \"redirectUri\";\nconst _s = \"smithy.ts.sdk.synthetic.com.amazonaws.signin\";\nconst _sAK = \"secretAccessKey\";\nconst _sT = \"sessionToken\";\nconst _se = \"server\";\nconst _tI = \"tokenInput\";\nconst _tO = \"tokenOutput\";\nconst _tT = \"tokenType\";\nconst n0 = \"com.amazonaws.signin\";\nimport { TypeRegistry } from \"@smithy/core/schema\";\nimport { AccessDeniedException, InternalServerException, TooManyRequestsError, ValidationException, } from \"../models/errors\";\nimport { SigninServiceException } from \"../models/SigninServiceException\";\nconst _s_registry = TypeRegistry.for(_s);\nexport var SigninServiceException$ = [-3, _s, \"SigninServiceException\", 0, [], []];\n_s_registry.registerError(SigninServiceException$, SigninServiceException);\nconst n0_registry = TypeRegistry.for(n0);\nexport var AccessDeniedException$ = [-3, n0, _ADE, { [_e]: _c }, [_e, _m], [0, 0], 2];\nn0_registry.registerError(AccessDeniedException$, AccessDeniedException);\nexport var InternalServerException$ = [-3, n0, _ISE, { [_e]: _se, [_hE]: 500 }, [_e, _m], [0, 0], 2];\nn0_registry.registerError(InternalServerException$, InternalServerException);\nexport var TooManyRequestsError$ = [-3, n0, _TMRE, { [_e]: _c, [_hE]: 429 }, [_e, _m], [0, 0], 2];\nn0_registry.registerError(TooManyRequestsError$, TooManyRequestsError);\nexport var ValidationException$ = [-3, n0, _VE, { [_e]: _c, [_hE]: 400 }, [_e, _m], [0, 0], 2];\nn0_registry.registerError(ValidationException$, ValidationException);\nexport const errorTypeRegistries = [_s_registry, n0_registry];\nvar RefreshToken = [0, n0, _RT, 8, 0];\nexport var AccessToken$ = [\n    3,\n    n0,\n    _AT,\n    8,\n    [_aKI, _sAK, _sT],\n    [\n        [0, { [_jN]: _aKI }],\n        [0, { [_jN]: _sAK }],\n        [0, { [_jN]: _sT }],\n    ],\n    3,\n];\nexport var CreateOAuth2TokenRequest$ = [\n    3,\n    n0,\n    _COATR,\n    0,\n    [_tI],\n    [[() => CreateOAuth2TokenRequestBody$, 16]],\n    1,\n];\nexport var CreateOAuth2TokenRequestBody$ = [\n    3,\n    n0,\n    _COATRB,\n    0,\n    [_cI, _gT, _co, _rU, _cV, _rT],\n    [\n        [0, { [_jN]: _cI }],\n        [0, { [_jN]: _gT }],\n        0,\n        [0, { [_jN]: _rU }],\n        [0, { [_jN]: _cV }],\n        [() => RefreshToken, { [_jN]: _rT }],\n    ],\n    2,\n];\nexport var CreateOAuth2TokenResponse$ = [\n    3,\n    n0,\n    _COATRr,\n    0,\n    [_tO],\n    [[() => CreateOAuth2TokenResponseBody$, 16]],\n    1,\n];\nexport var CreateOAuth2TokenResponseBody$ = [\n    3,\n    n0,\n    _COATRBr,\n    0,\n    [_aT, _tT, _eI, _rT, _iT],\n    [\n        [() => AccessToken$, { [_jN]: _aT }],\n        [0, { [_jN]: _tT }],\n        [1, { [_jN]: _eI }],\n        [() => RefreshToken, { [_jN]: _rT }],\n        [0, { [_jN]: _iT }],\n    ],\n    4,\n];\nexport var CreateOAuth2Token$ = [\n    9,\n    n0,\n    _COAT,\n    { [_h]: [\"POST\", \"/v1/token\", 200] },\n    () => CreateOAuth2TokenRequest$,\n    () => CreateOAuth2TokenResponse$,\n];\n", "import { AwsSdkSigV4Signer } from \"@aws-sdk/core/httpAuthSchemes\";\nimport { AwsRestJsonProtocol } from \"@aws-sdk/core/protocols\";\nimport { NoAuthSigner } from \"@smithy/core\";\nimport { NoOpLogger } from \"@smithy/smithy-client\";\nimport { parseUrl } from \"@smithy/url-parser\";\nimport { fromBase64, toBase64 } from \"@smithy/util-base64\";\nimport { fromUtf8, toUtf8 } from \"@smithy/util-utf8\";\nimport { defaultSigninHttpAuthSchemeProvider } from \"./auth/httpAuthSchemeProvider\";\nimport { defaultEndpointResolver } from \"./endpoint/endpointResolver\";\nimport { errorTypeRegistries } from \"./schemas/schemas_0\";\nexport const getRuntimeConfig = (config) => {\n    return {\n        apiVersion: \"2023-01-01\",\n        base64Decoder: config?.base64Decoder ?? fromBase64,\n        base64Encoder: config?.base64Encoder ?? toBase64,\n        disableHostPrefix: config?.disableHostPrefix ?? false,\n        endpointProvider: config?.endpointProvider ?? defaultEndpointResolver,\n        extensions: config?.extensions ?? [],\n        httpAuthSchemeProvider: config?.httpAuthSchemeProvider ?? defaultSigninHttpAuthSchemeProvider,\n        httpAuthSchemes: config?.httpAuthSchemes ?? [\n            {\n                schemeId: \"aws.auth#sigv4\",\n                identityProvider: (ipc) => ipc.getIdentityProvider(\"aws.auth#sigv4\"),\n                signer: new AwsSdkSigV4Signer(),\n            },\n            {\n                schemeId: \"smithy.api#noAuth\",\n                identityProvider: (ipc) => ipc.getIdentityProvider(\"smithy.api#noAuth\") || (async () => ({})),\n                signer: new NoAuthSigner(),\n            },\n        ],\n        logger: config?.logger ?? new NoOpLogger(),\n        protocol: config?.protocol ?? AwsRestJsonProtocol,\n        protocolSettings: config?.protocolSettings ?? {\n            defaultNamespace: \"com.amazonaws.signin\",\n            errorTypeRegistries,\n            version: \"2023-01-01\",\n            serviceTarget: \"Signin\",\n        },\n        serviceId: config?.serviceId ?? \"Signin\",\n        urlParser: config?.urlParser ?? parseUrl,\n        utf8Decoder: config?.utf8Decoder ?? fromUtf8,\n        utf8Encoder: config?.utf8Encoder ?? toUtf8,\n    };\n};\n", "import packageInfo from \"../../../package.json\";\nimport { emitWarningIfUnsupportedVersion as awsCheckVersion } from \"@aws-sdk/core/client\";\nimport { NODE_AUTH_SCHEME_PREFERENCE_OPTIONS } from \"@aws-sdk/core/httpAuthSchemes\";\nimport { createDefaultUserAgentProvider, NODE_APP_ID_CONFIG_OPTIONS } from \"@aws-sdk/util-user-agent-node\";\nimport { NODE_REGION_CONFIG_FILE_OPTIONS, NODE_REGION_CONFIG_OPTIONS, NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS, NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS, } from \"@smithy/config-resolver\";\nimport { Hash } from \"@smithy/hash-node\";\nimport { NODE_MAX_ATTEMPT_CONFIG_OPTIONS, NODE_RETRY_MODE_CONFIG_OPTIONS } from \"@smithy/middleware-retry\";\nimport { loadConfig as loadNodeConfig } from \"@smithy/node-config-provider\";\nimport { NodeHttpHandler as RequestHandler, streamCollector } from \"@smithy/node-http-handler\";\nimport { emitWarningIfUnsupportedVersion, loadConfigsForDefaultMode } from \"@smithy/smithy-client\";\nimport { calculateBodyLength } from \"@smithy/util-body-length-node\";\nimport { resolveDefaultsModeConfig } from \"@smithy/util-defaults-mode-node\";\nimport { DEFAULT_RETRY_MODE } from \"@smithy/util-retry\";\nimport { getRuntimeConfig as getSharedRuntimeConfig } from \"./runtimeConfig.shared\";\nexport const getRuntimeConfig = (config) => {\n    emitWarningIfUnsupportedVersion(process.version);\n    const defaultsMode = resolveDefaultsModeConfig(config);\n    const defaultConfigProvider = () => defaultsMode().then(loadConfigsForDefaultMode);\n    const clientSharedValues = getSharedRuntimeConfig(config);\n    awsCheckVersion(process.version);\n    const loaderConfig = {\n        profile: config?.profile,\n        logger: clientSharedValues.logger,\n    };\n    return {\n        ...clientSharedValues,\n        ...config,\n        runtime: \"node\",\n        defaultsMode,\n        authSchemePreference: config?.authSchemePreference ?? loadNodeConfig(NODE_AUTH_SCHEME_PREFERENCE_OPTIONS, loaderConfig),\n        bodyLengthChecker: config?.bodyLengthChecker ?? calculateBodyLength,\n        defaultUserAgentProvider: config?.defaultUserAgentProvider ??\n            createDefaultUserAgentProvider({ serviceId: clientSharedValues.serviceId, clientVersion: packageInfo.version }),\n        maxAttempts: config?.maxAttempts ?? loadNodeConfig(NODE_MAX_ATTEMPT_CONFIG_OPTIONS, config),\n        region: config?.region ??\n            loadNodeConfig(NODE_REGION_CONFIG_OPTIONS, { ...NODE_REGION_CONFIG_FILE_OPTIONS, ...loaderConfig }),\n        requestHandler: RequestHandler.create(config?.requestHandler ?? defaultConfigProvider),\n        retryMode: config?.retryMode ??\n            loadNodeConfig({\n                ...NODE_RETRY_MODE_CONFIG_OPTIONS,\n                default: async () => (await defaultConfigProvider()).retryMode || DEFAULT_RETRY_MODE,\n            }, config),\n        sha256: config?.sha256 ?? Hash.bind(null, \"sha256\"),\n        streamCollector: config?.streamCollector ?? streamCollector,\n        useDualstackEndpoint: config?.useDualstackEndpoint ?? loadNodeConfig(NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS, loaderConfig),\n        useFipsEndpoint: config?.useFipsEndpoint ?? loadNodeConfig(NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS, loaderConfig),\n        userAgentAppId: config?.userAgentAppId ?? loadNodeConfig(NODE_APP_ID_CONFIG_OPTIONS, loaderConfig),\n    };\n};\n", "export const getHttpAuthExtensionConfiguration = (runtimeConfig) => {\n    const _httpAuthSchemes = runtimeConfig.httpAuthSchemes;\n    let _httpAuthSchemeProvider = runtimeConfig.httpAuthSchemeProvider;\n    let _credentials = runtimeConfig.credentials;\n    return {\n        setHttpAuthScheme(httpAuthScheme) {\n            const index = _httpAuthSchemes.findIndex((scheme) => scheme.schemeId === httpAuthScheme.schemeId);\n            if (index === -1) {\n                _httpAuthSchemes.push(httpAuthScheme);\n            }\n            else {\n                _httpAuthSchemes.splice(index, 1, httpAuthScheme);\n            }\n        },\n        httpAuthSchemes() {\n            return _httpAuthSchemes;\n        },\n        setHttpAuthSchemeProvider(httpAuthSchemeProvider) {\n            _httpAuthSchemeProvider = httpAuthSchemeProvider;\n        },\n        httpAuthSchemeProvider() {\n            return _httpAuthSchemeProvider;\n        },\n        setCredentials(credentials) {\n            _credentials = credentials;\n        },\n        credentials() {\n            return _credentials;\n        },\n    };\n};\nexport const resolveHttpAuthRuntimeConfig = (config) => {\n    return {\n        httpAuthSchemes: config.httpAuthSchemes(),\n        httpAuthSchemeProvider: config.httpAuthSchemeProvider(),\n        credentials: config.credentials(),\n    };\n};\n", "import { getAwsRegionExtensionConfiguration, resolveAwsRegionExtensionConfiguration, } from \"@aws-sdk/region-config-resolver\";\nimport { getHttpHandlerExtensionConfiguration, resolveHttpHandlerRuntimeConfig } from \"@smithy/protocol-http\";\nimport { getDefaultExtensionConfiguration, resolveDefaultRuntimeConfig } from \"@smithy/smithy-client\";\nimport { getHttpAuthExtensionConfiguration, resolveHttpAuthRuntimeConfig } from \"./auth/httpAuthExtensionConfiguration\";\nexport const resolveRuntimeExtensions = (runtimeConfig, extensions) => {\n    const extensionConfiguration = Object.assign(getAwsRegionExtensionConfiguration(runtimeConfig), getDefaultExtensionConfiguration(runtimeConfig), getHttpHandlerExtensionConfiguration(runtimeConfig), getHttpAuthExtensionConfiguration(runtimeConfig));\n    extensions.forEach((extension) => extension.configure(extensionConfiguration));\n    return Object.assign(runtimeConfig, resolveAwsRegionExtensionConfiguration(extensionConfiguration), resolveDefaultRuntimeConfig(extensionConfiguration), resolveHttpHandlerRuntimeConfig(extensionConfiguration), resolveHttpAuthRuntimeConfig(extensionConfiguration));\n};\n", "import { getHostHeaderPlugin, resolveHostHeaderConfig, } from \"@aws-sdk/middleware-host-header\";\nimport { getLoggerPlugin } from \"@aws-sdk/middleware-logger\";\nimport { getRecursionDetectionPlugin } from \"@aws-sdk/middleware-recursion-detection\";\nimport { getUserAgentPlugin, resolveUserAgentConfig, } from \"@aws-sdk/middleware-user-agent\";\nimport { resolveRegionConfig } from \"@smithy/config-resolver\";\nimport { DefaultIdentityProviderConfig, getHttpAuthSchemeEndpointRuleSetPlugin, getHttpSigningPlugin, } from \"@smithy/core\";\nimport { getSchemaSerdePlugin } from \"@smithy/core/schema\";\nimport { getContentLengthPlugin } from \"@smithy/middleware-content-length\";\nimport { resolveEndpointConfig, } from \"@smithy/middleware-endpoint\";\nimport { getRetryPlugin, resolveRetryConfig, } from \"@smithy/middleware-retry\";\nimport { Client as __Client, } from \"@smithy/smithy-client\";\nimport { defaultSigninHttpAuthSchemeParametersProvider, resolveHttpAuthSchemeConfig, } from \"./auth/httpAuthSchemeProvider\";\nimport { resolveClientEndpointParameters, } from \"./endpoint/EndpointParameters\";\nimport { getRuntimeConfig as __getRuntimeConfig } from \"./runtimeConfig\";\nimport { resolveRuntimeExtensions } from \"./runtimeExtensions\";\nexport { __Client };\nexport class SigninClient extends __Client {\n    config;\n    constructor(...[configuration]) {\n        const _config_0 = __getRuntimeConfig(configuration || {});\n        super(_config_0);\n        this.initConfig = _config_0;\n        const _config_1 = resolveClientEndpointParameters(_config_0);\n        const _config_2 = resolveUserAgentConfig(_config_1);\n        const _config_3 = resolveRetryConfig(_config_2);\n        const _config_4 = resolveRegionConfig(_config_3);\n        const _config_5 = resolveHostHeaderConfig(_config_4);\n        const _config_6 = resolveEndpointConfig(_config_5);\n        const _config_7 = resolveHttpAuthSchemeConfig(_config_6);\n        const _config_8 = resolveRuntimeExtensions(_config_7, configuration?.extensions || []);\n        this.config = _config_8;\n        this.middlewareStack.use(getSchemaSerdePlugin(this.config));\n        this.middlewareStack.use(getUserAgentPlugin(this.config));\n        this.middlewareStack.use(getRetryPlugin(this.config));\n        this.middlewareStack.use(getContentLengthPlugin(this.config));\n        this.middlewareStack.use(getHostHeaderPlugin(this.config));\n        this.middlewareStack.use(getLoggerPlugin(this.config));\n        this.middlewareStack.use(getRecursionDetectionPlugin(this.config));\n        this.middlewareStack.use(getHttpAuthSchemeEndpointRuleSetPlugin(this.config, {\n            httpAuthSchemeParametersProvider: defaultSigninHttpAuthSchemeParametersProvider,\n            identityProviderConfigProvider: async (config) => new DefaultIdentityProviderConfig({\n                \"aws.auth#sigv4\": config.credentials,\n            }),\n        }));\n        this.middlewareStack.use(getHttpSigningPlugin(this.config));\n    }\n    destroy() {\n        super.destroy();\n    }\n}\n", "import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { CreateOAuth2Token$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class CreateOAuth2TokenCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"Signin\", \"CreateOAuth2Token\", {})\n    .n(\"SigninClient\", \"CreateOAuth2TokenCommand\")\n    .sc(CreateOAuth2Token$)\n    .build() {\n}\n", "import { createAggregatedClient } from \"@smithy/smithy-client\";\nimport { CreateOAuth2TokenCommand, } from \"./commands/CreateOAuth2TokenCommand\";\nimport { SigninClient } from \"./SigninClient\";\nconst commands = {\n    CreateOAuth2TokenCommand,\n};\nexport class Signin extends SigninClient {\n}\ncreateAggregatedClient(commands, Signin);\n", "export * from \"./CreateOAuth2TokenCommand\";\n", "export const OAuth2ErrorCode = {\n    AUTHCODE_EXPIRED: \"AUTHCODE_EXPIRED\",\n    INSUFFICIENT_PERMISSIONS: \"INSUFFICIENT_PERMISSIONS\",\n    INVALID_REQUEST: \"INVALID_REQUEST\",\n    SERVER_ERROR: \"server_error\",\n    TOKEN_EXPIRED: \"TOKEN_EXPIRED\",\n    USER_CREDENTIALS_CHANGED: \"USER_CREDENTIALS_CHANGED\",\n};\n", "export {};\n", "export * from \"./SigninClient\";\nexport * from \"./Signin\";\nexport * from \"./commands\";\nexport * from \"./schemas/schemas_0\";\nexport * from \"./models/enums\";\nexport * from \"./models/errors\";\nexport * from \"./models/models_0\";\nexport { SigninServiceException } from \"./models/SigninServiceException\";\n", "'use strict';\n\nvar client = require('@aws-sdk/core/client');\nvar propertyProvider = require('@smithy/property-provider');\nvar sharedIniFileLoader = require('@smithy/shared-ini-file-loader');\nvar protocolHttp = require('@smithy/protocol-http');\nvar node_crypto = require('node:crypto');\nvar node_fs = require('node:fs');\nvar node_os = require('node:os');\nvar node_path = require('node:path');\n\nclass LoginCredentialsFetcher {\n    profileData;\n    init;\n    callerClientConfig;\n    static REFRESH_THRESHOLD = 5 * 60 * 1000;\n    constructor(profileData, init, callerClientConfig) {\n        this.profileData = profileData;\n        this.init = init;\n        this.callerClientConfig = callerClientConfig;\n    }\n    async loadCredentials() {\n        const token = await this.loadToken();\n        if (!token) {\n            throw new propertyProvider.CredentialsProviderError(`Failed to load a token for session ${this.loginSession}, please re-authenticate using aws login`, { tryNextLink: false, logger: this.logger });\n        }\n        const accessToken = token.accessToken;\n        const now = Date.now();\n        const expiryTime = new Date(accessToken.expiresAt).getTime();\n        const timeUntilExpiry = expiryTime - now;\n        if (timeUntilExpiry <= LoginCredentialsFetcher.REFRESH_THRESHOLD) {\n            return this.refresh(token);\n        }\n        return {\n            accessKeyId: accessToken.accessKeyId,\n            secretAccessKey: accessToken.secretAccessKey,\n            sessionToken: accessToken.sessionToken,\n            accountId: accessToken.accountId,\n            expiration: new Date(accessToken.expiresAt),\n        };\n    }\n    get logger() {\n        return this.init?.logger;\n    }\n    get loginSession() {\n        return this.profileData.login_session;\n    }\n    async refresh(token) {\n        const { SigninClient, CreateOAuth2TokenCommand } = await import('@aws-sdk/nested-clients/signin');\n        const { logger, userAgentAppId } = this.callerClientConfig ?? {};\n        const isH2 = (requestHandler) => {\n            return requestHandler?.metadata?.handlerProtocol === \"h2\";\n        };\n        const requestHandler = isH2(this.callerClientConfig?.requestHandler)\n            ? undefined\n            : this.callerClientConfig?.requestHandler;\n        const region = this.profileData.region ?? (await this.callerClientConfig?.region?.()) ?? process.env.AWS_REGION;\n        const client = new SigninClient({\n            credentials: {\n                accessKeyId: \"\",\n                secretAccessKey: \"\",\n            },\n            region,\n            requestHandler,\n            logger,\n            userAgentAppId,\n            ...this.init?.clientConfig,\n        });\n        this.createDPoPInterceptor(client.middlewareStack);\n        const commandInput = {\n            tokenInput: {\n                clientId: token.clientId,\n                refreshToken: token.refreshToken,\n                grantType: \"refresh_token\",\n            },\n        };\n        try {\n            const response = await client.send(new CreateOAuth2TokenCommand(commandInput));\n            const { accessKeyId, secretAccessKey, sessionToken } = response.tokenOutput?.accessToken ?? {};\n            const { refreshToken, expiresIn } = response.tokenOutput ?? {};\n            if (!accessKeyId || !secretAccessKey || !sessionToken || !refreshToken) {\n                throw new propertyProvider.CredentialsProviderError(\"Token refresh response missing required fields\", {\n                    logger: this.logger,\n                    tryNextLink: false,\n                });\n            }\n            const expiresInMs = (expiresIn ?? 900) * 1000;\n            const expiration = new Date(Date.now() + expiresInMs);\n            const updatedToken = {\n                ...token,\n                accessToken: {\n                    ...token.accessToken,\n                    accessKeyId: accessKeyId,\n                    secretAccessKey: secretAccessKey,\n                    sessionToken: sessionToken,\n                    expiresAt: expiration.toISOString(),\n                },\n                refreshToken: refreshToken,\n            };\n            await this.saveToken(updatedToken);\n            const newAccessToken = updatedToken.accessToken;\n            return {\n                accessKeyId: newAccessToken.accessKeyId,\n                secretAccessKey: newAccessToken.secretAccessKey,\n                sessionToken: newAccessToken.sessionToken,\n                accountId: newAccessToken.accountId,\n                expiration,\n            };\n        }\n        catch (error) {\n            if (error.name === \"AccessDeniedException\") {\n                const errorType = error.error;\n                let message;\n                switch (errorType) {\n                    case \"TOKEN_EXPIRED\":\n                        message = \"Your session has expired. Please reauthenticate.\";\n                        break;\n                    case \"USER_CREDENTIALS_CHANGED\":\n                        message =\n                            \"Unable to refresh credentials because of a change in your password. Please reauthenticate with your new password.\";\n                        break;\n                    case \"INSUFFICIENT_PERMISSIONS\":\n                        message =\n                            \"Unable to refresh credentials due to insufficient permissions. You may be missing permission for the 'CreateOAuth2Token' action.\";\n                        break;\n                    default:\n                        message = `Failed to refresh token: ${String(error)}. Please re-authenticate using \\`aws login\\``;\n                }\n                throw new propertyProvider.CredentialsProviderError(message, { logger: this.logger, tryNextLink: false });\n            }\n            throw new propertyProvider.CredentialsProviderError(`Failed to refresh token: ${String(error)}. Please re-authenticate using aws login`, { logger: this.logger });\n        }\n    }\n    async loadToken() {\n        const tokenFilePath = this.getTokenFilePath();\n        try {\n            let tokenData;\n            try {\n                tokenData = await sharedIniFileLoader.readFile(tokenFilePath, { ignoreCache: this.init?.ignoreCache });\n            }\n            catch {\n                tokenData = await node_fs.promises.readFile(tokenFilePath, \"utf8\");\n            }\n            const token = JSON.parse(tokenData);\n            const missingFields = [\"accessToken\", \"clientId\", \"refreshToken\", \"dpopKey\"].filter((k) => !token[k]);\n            if (!token.accessToken?.accountId) {\n                missingFields.push(\"accountId\");\n            }\n            if (missingFields.length > 0) {\n                throw new propertyProvider.CredentialsProviderError(`Token validation failed, missing fields: ${missingFields.join(\", \")}`, {\n                    logger: this.logger,\n                    tryNextLink: false,\n                });\n            }\n            return token;\n        }\n        catch (error) {\n            throw new propertyProvider.CredentialsProviderError(`Failed to load token from ${tokenFilePath}: ${String(error)}`, {\n                logger: this.logger,\n                tryNextLink: false,\n            });\n        }\n    }\n    async saveToken(token) {\n        const tokenFilePath = this.getTokenFilePath();\n        const directory = node_path.dirname(tokenFilePath);\n        try {\n            await node_fs.promises.mkdir(directory, { recursive: true });\n        }\n        catch (error) {\n        }\n        await node_fs.promises.writeFile(tokenFilePath, JSON.stringify(token, null, 2), \"utf8\");\n    }\n    getTokenFilePath() {\n        const directory = process.env.AWS_LOGIN_CACHE_DIRECTORY ?? node_path.join(node_os.homedir(), \".aws\", \"login\", \"cache\");\n        const loginSessionBytes = Buffer.from(this.loginSession, \"utf8\");\n        const loginSessionSha256 = node_crypto.createHash(\"sha256\").update(loginSessionBytes).digest(\"hex\");\n        return node_path.join(directory, `${loginSessionSha256}.json`);\n    }\n    derToRawSignature(derSignature) {\n        let offset = 2;\n        if (derSignature[offset] !== 0x02) {\n            throw new Error(\"Invalid DER signature\");\n        }\n        offset++;\n        const rLength = derSignature[offset++];\n        let r = derSignature.subarray(offset, offset + rLength);\n        offset += rLength;\n        if (derSignature[offset] !== 0x02) {\n            throw new Error(\"Invalid DER signature\");\n        }\n        offset++;\n        const sLength = derSignature[offset++];\n        let s = derSignature.subarray(offset, offset + sLength);\n        r = r[0] === 0x00 ? r.subarray(1) : r;\n        s = s[0] === 0x00 ? s.subarray(1) : s;\n        const rPadded = Buffer.concat([Buffer.alloc(32 - r.length), r]);\n        const sPadded = Buffer.concat([Buffer.alloc(32 - s.length), s]);\n        return Buffer.concat([rPadded, sPadded]);\n    }\n    createDPoPInterceptor(middlewareStack) {\n        middlewareStack.add((next) => async (args) => {\n            if (protocolHttp.HttpRequest.isInstance(args.request)) {\n                const request = args.request;\n                const actualEndpoint = `${request.protocol}//${request.hostname}${request.port ? `:${request.port}` : \"\"}${request.path}`;\n                const dpop = await this.generateDpop(request.method, actualEndpoint);\n                request.headers = {\n                    ...request.headers,\n                    DPoP: dpop,\n                };\n            }\n            return next(args);\n        }, {\n            step: \"finalizeRequest\",\n            name: \"dpopInterceptor\",\n            override: true,\n        });\n    }\n    async generateDpop(method = \"POST\", endpoint) {\n        const token = await this.loadToken();\n        try {\n            const privateKey = node_crypto.createPrivateKey({\n                key: token.dpopKey,\n                format: \"pem\",\n                type: \"sec1\",\n            });\n            const publicKey = node_crypto.createPublicKey(privateKey);\n            const publicDer = publicKey.export({ format: \"der\", type: \"spki\" });\n            let pointStart = -1;\n            for (let i = 0; i < publicDer.length; i++) {\n                if (publicDer[i] === 0x04) {\n                    pointStart = i;\n                    break;\n                }\n            }\n            const x = publicDer.slice(pointStart + 1, pointStart + 33);\n            const y = publicDer.slice(pointStart + 33, pointStart + 65);\n            const header = {\n                alg: \"ES256\",\n                typ: \"dpop+jwt\",\n                jwk: {\n                    kty: \"EC\",\n                    crv: \"P-256\",\n                    x: x.toString(\"base64url\"),\n                    y: y.toString(\"base64url\"),\n                },\n            };\n            const payload = {\n                jti: crypto.randomUUID(),\n                htm: method,\n                htu: endpoint,\n                iat: Math.floor(Date.now() / 1000),\n            };\n            const headerB64 = Buffer.from(JSON.stringify(header)).toString(\"base64url\");\n            const payloadB64 = Buffer.from(JSON.stringify(payload)).toString(\"base64url\");\n            const message = `${headerB64}.${payloadB64}`;\n            const asn1Signature = node_crypto.sign(\"sha256\", Buffer.from(message), privateKey);\n            const rawSignature = this.derToRawSignature(asn1Signature);\n            const signatureB64 = rawSignature.toString(\"base64url\");\n            return `${message}.${signatureB64}`;\n        }\n        catch (error) {\n            throw new propertyProvider.CredentialsProviderError(`Failed to generate Dpop proof: ${error instanceof Error ? error.message : String(error)}`, { logger: this.logger, tryNextLink: false });\n        }\n    }\n}\n\nconst fromLoginCredentials = (init) => async ({ callerClientConfig } = {}) => {\n    init?.logger?.debug?.(\"@aws-sdk/credential-providers - fromLoginCredentials\");\n    const profiles = await sharedIniFileLoader.parseKnownFiles(init || {});\n    const profileName = sharedIniFileLoader.getProfileName({\n        profile: init?.profile ?? callerClientConfig?.profile,\n    });\n    const profile = profiles[profileName];\n    if (!profile?.login_session) {\n        throw new propertyProvider.CredentialsProviderError(`Profile ${profileName} does not contain login_session.`, {\n            tryNextLink: true,\n            logger: init?.logger,\n        });\n    }\n    const fetcher = new LoginCredentialsFetcher(profile, init, callerClientConfig);\n    const credentials = await fetcher.loadCredentials();\n    return client.setCredentialFeature(credentials, \"CREDENTIALS_LOGIN\", \"AD\");\n};\n\nexports.fromLoginCredentials = fromLoginCredentials;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toStream = toStream;\nconst node_stream_1 = require(\"node:stream\");\nfunction toStream(bytes) {\n    return node_stream_1.Readable.from(Buffer.from(bytes));\n}\n", "'use strict';\n\nconst validate = (str) => typeof str === \"string\" && str.indexOf(\"arn:\") === 0 && str.split(\":\").length >= 6;\nconst parse = (arn) => {\n    const segments = arn.split(\":\");\n    if (segments.length < 6 || segments[0] !== \"arn\")\n        throw new Error(\"Malformed ARN\");\n    const [, partition, service, region, accountId, ...resource] = segments;\n    return {\n        partition,\n        service,\n        region,\n        accountId,\n        resource: resource.join(\":\"),\n    };\n};\nconst build = (arnObject) => {\n    const { partition = \"aws\", service, region, accountId, resource } = arnObject;\n    if ([service, region, accountId, resource].some((segment) => typeof segment !== \"string\")) {\n        throw new Error(\"Input ARN object is invalid\");\n    }\n    return `arn:${partition}:${service}:${region}:${accountId}:${resource}`;\n};\n\nexports.build = build;\nexports.parse = parse;\nexports.validate = validate;\n", "'use strict';\n\nvar protocolHttp = require('@smithy/protocol-http');\nvar smithyClient = require('@smithy/smithy-client');\nvar toStream = require('./toStream');\nvar utilArnParser = require('@aws-sdk/util-arn-parser');\nvar protocols = require('@aws-sdk/core/protocols');\nvar schema = require('@smithy/core/schema');\nvar signatureV4 = require('@smithy/signature-v4');\nvar utilConfigProvider = require('@smithy/util-config-provider');\nvar client = require('@aws-sdk/core/client');\nvar core = require('@smithy/core');\nvar utilMiddleware = require('@smithy/util-middleware');\n\nconst CONTENT_LENGTH_HEADER = \"content-length\";\nconst DECODED_CONTENT_LENGTH_HEADER = \"x-amz-decoded-content-length\";\nfunction checkContentLengthHeader() {\n    return (next, context) => async (args) => {\n        const { request } = args;\n        if (protocolHttp.HttpRequest.isInstance(request)) {\n            if (!(CONTENT_LENGTH_HEADER in request.headers) && !(DECODED_CONTENT_LENGTH_HEADER in request.headers)) {\n                const message = `Are you using a Stream of unknown length as the Body of a PutObject request? Consider using Upload instead from @aws-sdk/lib-storage.`;\n                if (typeof context?.logger?.warn === \"function\" && !(context.logger instanceof smithyClient.NoOpLogger)) {\n                    context.logger.warn(message);\n                }\n                else {\n                    console.warn(message);\n                }\n            }\n        }\n        return next({ ...args });\n    };\n}\nconst checkContentLengthHeaderMiddlewareOptions = {\n    step: \"finalizeRequest\",\n    tags: [\"CHECK_CONTENT_LENGTH_HEADER\"],\n    name: \"getCheckContentLengthHeaderPlugin\",\n    override: true,\n};\nconst getCheckContentLengthHeaderPlugin = (unused) => ({\n    applyToStack: (clientStack) => {\n        clientStack.add(checkContentLengthHeader(), checkContentLengthHeaderMiddlewareOptions);\n    },\n});\n\nconst regionRedirectEndpointMiddleware = (config) => {\n    return (next, context) => async (args) => {\n        const originalRegion = await config.region();\n        const regionProviderRef = config.region;\n        let unlock = () => { };\n        if (context.__s3RegionRedirect) {\n            Object.defineProperty(config, \"region\", {\n                writable: false,\n                value: async () => {\n                    return context.__s3RegionRedirect;\n                },\n            });\n            unlock = () => Object.defineProperty(config, \"region\", {\n                writable: true,\n                value: regionProviderRef,\n            });\n        }\n        try {\n            const result = await next(args);\n            if (context.__s3RegionRedirect) {\n                unlock();\n                const region = await config.region();\n                if (originalRegion !== region) {\n                    throw new Error(\"Region was not restored following S3 region redirect.\");\n                }\n            }\n            return result;\n        }\n        catch (e) {\n            unlock();\n            throw e;\n        }\n    };\n};\nconst regionRedirectEndpointMiddlewareOptions = {\n    tags: [\"REGION_REDIRECT\", \"S3\"],\n    name: \"regionRedirectEndpointMiddleware\",\n    override: true,\n    relation: \"before\",\n    toMiddleware: \"endpointV2Middleware\",\n};\n\nfunction regionRedirectMiddleware(clientConfig) {\n    return (next, context) => async (args) => {\n        try {\n            return await next(args);\n        }\n        catch (err) {\n            if (clientConfig.followRegionRedirects) {\n                const statusCode = err?.$metadata?.httpStatusCode;\n                const isHeadBucket = context.commandName === \"HeadBucketCommand\";\n                const bucketRegionHeader = err?.$response?.headers?.[\"x-amz-bucket-region\"];\n                if (bucketRegionHeader) {\n                    if (statusCode === 301 ||\n                        (statusCode === 400 && (err?.name === \"IllegalLocationConstraintException\" || isHeadBucket))) {\n                        try {\n                            const actualRegion = bucketRegionHeader;\n                            context.logger?.debug(`Redirecting from ${await clientConfig.region()} to ${actualRegion}`);\n                            context.__s3RegionRedirect = actualRegion;\n                        }\n                        catch (e) {\n                            throw new Error(\"Region redirect failed: \" + e);\n                        }\n                        return next(args);\n                    }\n                }\n            }\n            throw err;\n        }\n    };\n}\nconst regionRedirectMiddlewareOptions = {\n    step: \"initialize\",\n    tags: [\"REGION_REDIRECT\", \"S3\"],\n    name: \"regionRedirectMiddleware\",\n    override: true,\n};\nconst getRegionRedirectMiddlewarePlugin = (clientConfig) => ({\n    applyToStack: (clientStack) => {\n        clientStack.add(regionRedirectMiddleware(clientConfig), regionRedirectMiddlewareOptions);\n        clientStack.addRelativeTo(regionRedirectEndpointMiddleware(clientConfig), regionRedirectEndpointMiddlewareOptions);\n    },\n});\n\nconst s3ExpiresMiddleware = (config) => {\n    return (next, context) => async (args) => {\n        const result = await next(args);\n        const { response } = result;\n        if (protocolHttp.HttpResponse.isInstance(response)) {\n            if (response.headers.expires) {\n                response.headers.expiresstring = response.headers.expires;\n                try {\n                    smithyClient.parseRfc7231DateTime(response.headers.expires);\n                }\n                catch (e) {\n                    context.logger?.warn(`AWS SDK Warning for ${context.clientName}::${context.commandName} response parsing (${response.headers.expires}): ${e}`);\n                    delete response.headers.expires;\n                }\n            }\n        }\n        return result;\n    };\n};\nconst s3ExpiresMiddlewareOptions = {\n    tags: [\"S3\"],\n    name: \"s3ExpiresMiddleware\",\n    override: true,\n    relation: \"after\",\n    toMiddleware: \"deserializerMiddleware\",\n};\nconst getS3ExpiresMiddlewarePlugin = (clientConfig) => ({\n    applyToStack: (clientStack) => {\n        clientStack.addRelativeTo(s3ExpiresMiddleware(), s3ExpiresMiddlewareOptions);\n    },\n});\n\nclass S3ExpressIdentityCache {\n    data;\n    lastPurgeTime = Date.now();\n    static EXPIRED_CREDENTIAL_PURGE_INTERVAL_MS = 30_000;\n    constructor(data = {}) {\n        this.data = data;\n    }\n    get(key) {\n        const entry = this.data[key];\n        if (!entry) {\n            return;\n        }\n        return entry;\n    }\n    set(key, entry) {\n        this.data[key] = entry;\n        return entry;\n    }\n    delete(key) {\n        delete this.data[key];\n    }\n    async purgeExpired() {\n        const now = Date.now();\n        if (this.lastPurgeTime + S3ExpressIdentityCache.EXPIRED_CREDENTIAL_PURGE_INTERVAL_MS > now) {\n            return;\n        }\n        for (const key in this.data) {\n            const entry = this.data[key];\n            if (!entry.isRefreshing) {\n                const credential = await entry.identity;\n                if (credential.expiration) {\n                    if (credential.expiration.getTime() < now) {\n                        delete this.data[key];\n                    }\n                }\n            }\n        }\n    }\n}\n\nclass S3ExpressIdentityCacheEntry {\n    _identity;\n    isRefreshing;\n    accessed;\n    constructor(_identity, isRefreshing = false, accessed = Date.now()) {\n        this._identity = _identity;\n        this.isRefreshing = isRefreshing;\n        this.accessed = accessed;\n    }\n    get identity() {\n        this.accessed = Date.now();\n        return this._identity;\n    }\n}\n\nclass S3ExpressIdentityProviderImpl {\n    createSessionFn;\n    cache;\n    static REFRESH_WINDOW_MS = 60_000;\n    constructor(createSessionFn, cache = new S3ExpressIdentityCache()) {\n        this.createSessionFn = createSessionFn;\n        this.cache = cache;\n    }\n    async getS3ExpressIdentity(awsIdentity, identityProperties) {\n        const key = identityProperties.Bucket;\n        const { cache } = this;\n        const entry = cache.get(key);\n        if (entry) {\n            return entry.identity.then((identity) => {\n                const isExpired = (identity.expiration?.getTime() ?? 0) < Date.now();\n                if (isExpired) {\n                    return cache.set(key, new S3ExpressIdentityCacheEntry(this.getIdentity(key))).identity;\n                }\n                const isExpiringSoon = (identity.expiration?.getTime() ?? 0) < Date.now() + S3ExpressIdentityProviderImpl.REFRESH_WINDOW_MS;\n                if (isExpiringSoon && !entry.isRefreshing) {\n                    entry.isRefreshing = true;\n                    this.getIdentity(key).then((id) => {\n                        cache.set(key, new S3ExpressIdentityCacheEntry(Promise.resolve(id)));\n                    });\n                }\n                return identity;\n            });\n        }\n        return cache.set(key, new S3ExpressIdentityCacheEntry(this.getIdentity(key))).identity;\n    }\n    async getIdentity(key) {\n        await this.cache.purgeExpired().catch((error) => {\n            console.warn(\"Error while clearing expired entries in S3ExpressIdentityCache: \\n\" + error);\n        });\n        const session = await this.createSessionFn(key);\n        if (!session.Credentials?.AccessKeyId || !session.Credentials?.SecretAccessKey) {\n            throw new Error(\"s3#createSession response credential missing AccessKeyId or SecretAccessKey.\");\n        }\n        const identity = {\n            accessKeyId: session.Credentials.AccessKeyId,\n            secretAccessKey: session.Credentials.SecretAccessKey,\n            sessionToken: session.Credentials.SessionToken,\n            expiration: session.Credentials.Expiration ? new Date(session.Credentials.Expiration) : undefined,\n        };\n        return identity;\n    }\n}\n\nconst S3_EXPRESS_BUCKET_TYPE = \"Directory\";\nconst S3_EXPRESS_BACKEND = \"S3Express\";\nconst S3_EXPRESS_AUTH_SCHEME = \"sigv4-s3express\";\nconst SESSION_TOKEN_QUERY_PARAM = \"X-Amz-S3session-Token\";\nconst SESSION_TOKEN_HEADER = SESSION_TOKEN_QUERY_PARAM.toLowerCase();\nconst NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_ENV_NAME = \"AWS_S3_DISABLE_EXPRESS_SESSION_AUTH\";\nconst NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_INI_NAME = \"s3_disable_express_session_auth\";\nconst NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_OPTIONS = {\n    environmentVariableSelector: (env) => utilConfigProvider.booleanSelector(env, NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_ENV_NAME, utilConfigProvider.SelectorType.ENV),\n    configFileSelector: (profile) => utilConfigProvider.booleanSelector(profile, NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_INI_NAME, utilConfigProvider.SelectorType.CONFIG),\n    default: false,\n};\n\nclass SignatureV4S3Express extends signatureV4.SignatureV4 {\n    async signWithCredentials(requestToSign, credentials, options) {\n        const credentialsWithoutSessionToken = getCredentialsWithoutSessionToken(credentials);\n        requestToSign.headers[SESSION_TOKEN_HEADER] = credentials.sessionToken;\n        const privateAccess = this;\n        setSingleOverride(privateAccess, credentialsWithoutSessionToken);\n        return privateAccess.signRequest(requestToSign, options ?? {});\n    }\n    async presignWithCredentials(requestToSign, credentials, options) {\n        const credentialsWithoutSessionToken = getCredentialsWithoutSessionToken(credentials);\n        delete requestToSign.headers[SESSION_TOKEN_HEADER];\n        requestToSign.headers[SESSION_TOKEN_QUERY_PARAM] = credentials.sessionToken;\n        requestToSign.query = requestToSign.query ?? {};\n        requestToSign.query[SESSION_TOKEN_QUERY_PARAM] = credentials.sessionToken;\n        const privateAccess = this;\n        setSingleOverride(privateAccess, credentialsWithoutSessionToken);\n        return this.presign(requestToSign, options);\n    }\n}\nfunction getCredentialsWithoutSessionToken(credentials) {\n    const credentialsWithoutSessionToken = {\n        accessKeyId: credentials.accessKeyId,\n        secretAccessKey: credentials.secretAccessKey,\n        expiration: credentials.expiration,\n    };\n    return credentialsWithoutSessionToken;\n}\nfunction setSingleOverride(privateAccess, credentialsWithoutSessionToken) {\n    const id = setTimeout(() => {\n        throw new Error(\"SignatureV4S3Express credential override was created but not called.\");\n    }, 10);\n    const currentCredentialProvider = privateAccess.credentialProvider;\n    const overrideCredentialsProviderOnce = () => {\n        clearTimeout(id);\n        privateAccess.credentialProvider = currentCredentialProvider;\n        return Promise.resolve(credentialsWithoutSessionToken);\n    };\n    privateAccess.credentialProvider = overrideCredentialsProviderOnce;\n}\n\nconst s3ExpressMiddleware = (options) => {\n    return (next, context) => async (args) => {\n        if (context.endpointV2) {\n            const endpoint = context.endpointV2;\n            const isS3ExpressAuth = endpoint.properties?.authSchemes?.[0]?.name === S3_EXPRESS_AUTH_SCHEME;\n            const isS3ExpressBucket = endpoint.properties?.backend === S3_EXPRESS_BACKEND ||\n                endpoint.properties?.bucketType === S3_EXPRESS_BUCKET_TYPE;\n            if (isS3ExpressBucket) {\n                client.setFeature(context, \"S3_EXPRESS_BUCKET\", \"J\");\n                context.isS3ExpressBucket = true;\n            }\n            if (isS3ExpressAuth) {\n                const requestBucket = args.input.Bucket;\n                if (requestBucket) {\n                    const s3ExpressIdentity = await options.s3ExpressIdentityProvider.getS3ExpressIdentity(await options.credentials(), {\n                        Bucket: requestBucket,\n                    });\n                    context.s3ExpressIdentity = s3ExpressIdentity;\n                    if (protocolHttp.HttpRequest.isInstance(args.request) && s3ExpressIdentity.sessionToken) {\n                        args.request.headers[SESSION_TOKEN_HEADER] = s3ExpressIdentity.sessionToken;\n                    }\n                }\n            }\n        }\n        return next(args);\n    };\n};\nconst s3ExpressMiddlewareOptions = {\n    name: \"s3ExpressMiddleware\",\n    step: \"build\",\n    tags: [\"S3\", \"S3_EXPRESS\"],\n    override: true,\n};\nconst getS3ExpressPlugin = (options) => ({\n    applyToStack: (clientStack) => {\n        clientStack.add(s3ExpressMiddleware(options), s3ExpressMiddlewareOptions);\n    },\n});\n\nconst signS3Express = async (s3ExpressIdentity, signingOptions, request, sigV4MultiRegionSigner) => {\n    const signedRequest = await sigV4MultiRegionSigner.signWithCredentials(request, s3ExpressIdentity, {});\n    if (signedRequest.headers[\"X-Amz-Security-Token\"] || signedRequest.headers[\"x-amz-security-token\"]) {\n        throw new Error(\"X-Amz-Security-Token must not be set for s3-express requests.\");\n    }\n    return signedRequest;\n};\n\nconst defaultErrorHandler = (signingProperties) => (error) => {\n    throw error;\n};\nconst defaultSuccessHandler = (httpResponse, signingProperties) => { };\nconst s3ExpressHttpSigningMiddlewareOptions = core.httpSigningMiddlewareOptions;\nconst s3ExpressHttpSigningMiddleware = (config) => (next, context) => async (args) => {\n    if (!protocolHttp.HttpRequest.isInstance(args.request)) {\n        return next(args);\n    }\n    const smithyContext = utilMiddleware.getSmithyContext(context);\n    const scheme = smithyContext.selectedHttpAuthScheme;\n    if (!scheme) {\n        throw new Error(`No HttpAuthScheme was selected: unable to sign request`);\n    }\n    const { httpAuthOption: { signingProperties = {} }, identity, signer, } = scheme;\n    let request;\n    if (context.s3ExpressIdentity) {\n        request = await signS3Express(context.s3ExpressIdentity, signingProperties, args.request, await config.signer());\n    }\n    else {\n        request = await signer.sign(args.request, identity, signingProperties);\n    }\n    const output = await next({\n        ...args,\n        request,\n    }).catch((signer.errorHandler || defaultErrorHandler)(signingProperties));\n    (signer.successHandler || defaultSuccessHandler)(output.response, signingProperties);\n    return output;\n};\nconst getS3ExpressHttpSigningPlugin = (config) => ({\n    applyToStack: (clientStack) => {\n        clientStack.addRelativeTo(s3ExpressHttpSigningMiddleware(config), core.httpSigningMiddlewareOptions);\n    },\n});\n\nconst resolveS3Config = (input, { session, }) => {\n    const [s3ClientProvider, CreateSessionCommandCtor] = session;\n    const { forcePathStyle, useAccelerateEndpoint, disableMultiregionAccessPoints, followRegionRedirects, s3ExpressIdentityProvider, bucketEndpoint, expectContinueHeader, } = input;\n    return Object.assign(input, {\n        forcePathStyle: forcePathStyle ?? false,\n        useAccelerateEndpoint: useAccelerateEndpoint ?? false,\n        disableMultiregionAccessPoints: disableMultiregionAccessPoints ?? false,\n        followRegionRedirects: followRegionRedirects ?? false,\n        s3ExpressIdentityProvider: s3ExpressIdentityProvider ??\n            new S3ExpressIdentityProviderImpl(async (key) => s3ClientProvider().send(new CreateSessionCommandCtor({\n                Bucket: key,\n            }))),\n        bucketEndpoint: bucketEndpoint ?? false,\n        expectContinueHeader: expectContinueHeader ?? 2_097_152,\n    });\n};\n\nconst THROW_IF_EMPTY_BODY = {\n    CopyObjectCommand: true,\n    UploadPartCopyCommand: true,\n    CompleteMultipartUploadCommand: true,\n};\nconst throw200ExceptionsMiddleware = (config) => (next, context) => async (args) => {\n    const result = await next(args);\n    const { response } = result;\n    if (!protocolHttp.HttpResponse.isInstance(response)) {\n        return result;\n    }\n    const { statusCode, body } = response;\n    if (statusCode < 200 || statusCode >= 300) {\n        return result;\n    }\n    const bodyBytes = await collectBody(body, config);\n    response.body = toStream.toStream(bodyBytes);\n    if (bodyBytes.length === 0 && THROW_IF_EMPTY_BODY[context.commandName]) {\n        const err = new Error(\"S3 aborted request\");\n        err.$metadata = {\n            httpStatusCode: 503,\n        };\n        err.name = \"InternalError\";\n        throw err;\n    }\n    const bodyStringTail = config.utf8Encoder(bodyBytes.subarray(bodyBytes.length - 16));\n    if (bodyStringTail && bodyStringTail.endsWith(\"</Error>\")) {\n        response.statusCode = 503;\n    }\n    return result;\n};\nconst collectBody = (streamBody = new Uint8Array(), context) => {\n    if (streamBody instanceof Uint8Array) {\n        return Promise.resolve(streamBody);\n    }\n    return context.streamCollector(streamBody) || Promise.resolve(new Uint8Array());\n};\nconst throw200ExceptionsMiddlewareOptions = {\n    relation: \"after\",\n    toMiddleware: \"deserializerMiddleware\",\n    tags: [\"THROW_200_EXCEPTIONS\", \"S3\"],\n    name: \"throw200ExceptionsMiddleware\",\n    override: true,\n};\nconst getThrow200ExceptionsPlugin = (config) => ({\n    applyToStack: (clientStack) => {\n        clientStack.addRelativeTo(throw200ExceptionsMiddleware(config), throw200ExceptionsMiddlewareOptions);\n    },\n});\n\nfunction bucketEndpointMiddleware(options) {\n    return (next, context) => async (args) => {\n        if (options.bucketEndpoint) {\n            const endpoint = context.endpointV2;\n            if (endpoint) {\n                const bucket = args.input.Bucket;\n                if (typeof bucket === \"string\") {\n                    try {\n                        const bucketEndpointUrl = new URL(bucket);\n                        context.endpointV2 = {\n                            ...endpoint,\n                            url: bucketEndpointUrl,\n                        };\n                    }\n                    catch (e) {\n                        const warning = `@aws-sdk/middleware-sdk-s3: bucketEndpoint=true was set but Bucket=${bucket} could not be parsed as URL.`;\n                        if (context.logger?.constructor?.name === \"NoOpLogger\") {\n                            console.warn(warning);\n                        }\n                        else {\n                            context.logger?.warn?.(warning);\n                        }\n                        throw e;\n                    }\n                }\n            }\n        }\n        return next(args);\n    };\n}\nconst bucketEndpointMiddlewareOptions = {\n    name: \"bucketEndpointMiddleware\",\n    override: true,\n    relation: \"after\",\n    toMiddleware: \"endpointV2Middleware\",\n};\n\nfunction validateBucketNameMiddleware({ bucketEndpoint }) {\n    return (next) => async (args) => {\n        const { input: { Bucket }, } = args;\n        if (!bucketEndpoint && typeof Bucket === \"string\" && !utilArnParser.validate(Bucket) && Bucket.indexOf(\"/\") >= 0) {\n            const err = new Error(`Bucket name shouldn't contain '/', received '${Bucket}'`);\n            err.name = \"InvalidBucketName\";\n            throw err;\n        }\n        return next({ ...args });\n    };\n}\nconst validateBucketNameMiddlewareOptions = {\n    step: \"initialize\",\n    tags: [\"VALIDATE_BUCKET_NAME\"],\n    name: \"validateBucketNameMiddleware\",\n    override: true,\n};\nconst getValidateBucketNamePlugin = (options) => ({\n    applyToStack: (clientStack) => {\n        clientStack.add(validateBucketNameMiddleware(options), validateBucketNameMiddlewareOptions);\n        clientStack.addRelativeTo(bucketEndpointMiddleware(options), bucketEndpointMiddlewareOptions);\n    },\n});\n\nclass S3RestXmlProtocol extends protocols.AwsRestXmlProtocol {\n    async serializeRequest(operationSchema, input, context) {\n        const request = await super.serializeRequest(operationSchema, input, context);\n        const ns = schema.NormalizedSchema.of(operationSchema.input);\n        const staticStructureSchema = ns.getSchema();\n        let bucketMemberIndex = 0;\n        const requiredMemberCount = staticStructureSchema[6] ?? 0;\n        if (input && typeof input === \"object\") {\n            for (const [memberName, memberNs] of ns.structIterator()) {\n                if (++bucketMemberIndex > requiredMemberCount) {\n                    break;\n                }\n                if (memberName === \"Bucket\") {\n                    if (!input.Bucket && memberNs.getMergedTraits().httpLabel) {\n                        throw new Error(`No value provided for input HTTP label: Bucket.`);\n                    }\n                    break;\n                }\n            }\n        }\n        return request;\n    }\n}\n\nexports.NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_OPTIONS = NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_OPTIONS;\nexports.S3ExpressIdentityCache = S3ExpressIdentityCache;\nexports.S3ExpressIdentityCacheEntry = S3ExpressIdentityCacheEntry;\nexports.S3ExpressIdentityProviderImpl = S3ExpressIdentityProviderImpl;\nexports.S3RestXmlProtocol = S3RestXmlProtocol;\nexports.SignatureV4S3Express = SignatureV4S3Express;\nexports.checkContentLengthHeader = checkContentLengthHeader;\nexports.checkContentLengthHeaderMiddlewareOptions = checkContentLengthHeaderMiddlewareOptions;\nexports.getCheckContentLengthHeaderPlugin = getCheckContentLengthHeaderPlugin;\nexports.getRegionRedirectMiddlewarePlugin = getRegionRedirectMiddlewarePlugin;\nexports.getS3ExpiresMiddlewarePlugin = getS3ExpiresMiddlewarePlugin;\nexports.getS3ExpressHttpSigningPlugin = getS3ExpressHttpSigningPlugin;\nexports.getS3ExpressPlugin = getS3ExpressPlugin;\nexports.getThrow200ExceptionsPlugin = getThrow200ExceptionsPlugin;\nexports.getValidateBucketNamePlugin = getValidateBucketNamePlugin;\nexports.regionRedirectEndpointMiddleware = regionRedirectEndpointMiddleware;\nexports.regionRedirectEndpointMiddlewareOptions = regionRedirectEndpointMiddlewareOptions;\nexports.regionRedirectMiddleware = regionRedirectMiddleware;\nexports.regionRedirectMiddlewareOptions = regionRedirectMiddlewareOptions;\nexports.resolveS3Config = resolveS3Config;\nexports.s3ExpiresMiddleware = s3ExpiresMiddleware;\nexports.s3ExpiresMiddlewareOptions = s3ExpiresMiddlewareOptions;\nexports.s3ExpressHttpSigningMiddleware = s3ExpressHttpSigningMiddleware;\nexports.s3ExpressHttpSigningMiddlewareOptions = s3ExpressHttpSigningMiddlewareOptions;\nexports.s3ExpressMiddleware = s3ExpressMiddleware;\nexports.s3ExpressMiddlewareOptions = s3ExpressMiddlewareOptions;\nexports.throw200ExceptionsMiddleware = throw200ExceptionsMiddleware;\nexports.throw200ExceptionsMiddlewareOptions = throw200ExceptionsMiddlewareOptions;\nexports.validateBucketNameMiddleware = validateBucketNameMiddleware;\nexports.validateBucketNameMiddlewareOptions = validateBucketNameMiddlewareOptions;\n", "'use strict';\n\nvar middlewareSdkS3 = require('@aws-sdk/middleware-sdk-s3');\nvar signatureV4 = require('@smithy/signature-v4');\n\nconst signatureV4CrtContainer = {\n    CrtSignerV4: null,\n};\n\nclass SignatureV4MultiRegion {\n    sigv4aSigner;\n    sigv4Signer;\n    signerOptions;\n    static sigv4aDependency() {\n        if (typeof signatureV4CrtContainer.CrtSignerV4 === \"function\") {\n            return \"crt\";\n        }\n        else if (typeof signatureV4.signatureV4aContainer.SignatureV4a === \"function\") {\n            return \"js\";\n        }\n        return \"none\";\n    }\n    constructor(options) {\n        this.sigv4Signer = new middlewareSdkS3.SignatureV4S3Express(options);\n        this.signerOptions = options;\n    }\n    async sign(requestToSign, options = {}) {\n        if (options.signingRegion === \"*\") {\n            return this.getSigv4aSigner().sign(requestToSign, options);\n        }\n        return this.sigv4Signer.sign(requestToSign, options);\n    }\n    async signWithCredentials(requestToSign, credentials, options = {}) {\n        if (options.signingRegion === \"*\") {\n            const signer = this.getSigv4aSigner();\n            const CrtSignerV4 = signatureV4CrtContainer.CrtSignerV4;\n            if (CrtSignerV4 && signer instanceof CrtSignerV4) {\n                return signer.signWithCredentials(requestToSign, credentials, options);\n            }\n            else {\n                throw new Error(`signWithCredentials with signingRegion '*' is only supported when using the CRT dependency @aws-sdk/signature-v4-crt. ` +\n                    `Please check whether you have installed the \"@aws-sdk/signature-v4-crt\" package explicitly. ` +\n                    `You must also register the package by calling [require(\"@aws-sdk/signature-v4-crt\");] ` +\n                    `or an ESM equivalent such as [import \"@aws-sdk/signature-v4-crt\";]. ` +\n                    `For more information please go to https://github.com/aws/aws-sdk-js-v3#functionality-requiring-aws-common-runtime-crt`);\n            }\n        }\n        return this.sigv4Signer.signWithCredentials(requestToSign, credentials, options);\n    }\n    async presign(originalRequest, options = {}) {\n        if (options.signingRegion === \"*\") {\n            const signer = this.getSigv4aSigner();\n            const CrtSignerV4 = signatureV4CrtContainer.CrtSignerV4;\n            if (CrtSignerV4 && signer instanceof CrtSignerV4) {\n                return signer.presign(originalRequest, options);\n            }\n            else {\n                throw new Error(`presign with signingRegion '*' is only supported when using the CRT dependency @aws-sdk/signature-v4-crt. ` +\n                    `Please check whether you have installed the \"@aws-sdk/signature-v4-crt\" package explicitly. ` +\n                    `You must also register the package by calling [require(\"@aws-sdk/signature-v4-crt\");] ` +\n                    `or an ESM equivalent such as [import \"@aws-sdk/signature-v4-crt\";]. ` +\n                    `For more information please go to https://github.com/aws/aws-sdk-js-v3#functionality-requiring-aws-common-runtime-crt`);\n            }\n        }\n        return this.sigv4Signer.presign(originalRequest, options);\n    }\n    async presignWithCredentials(originalRequest, credentials, options = {}) {\n        if (options.signingRegion === \"*\") {\n            throw new Error(\"Method presignWithCredentials is not supported for [signingRegion=*].\");\n        }\n        return this.sigv4Signer.presignWithCredentials(originalRequest, credentials, options);\n    }\n    getSigv4aSigner() {\n        if (!this.sigv4aSigner) {\n            const CrtSignerV4 = signatureV4CrtContainer.CrtSignerV4;\n            const JsSigV4aSigner = signatureV4.signatureV4aContainer.SignatureV4a;\n            if (this.signerOptions.runtime === \"node\") {\n                if (!CrtSignerV4 && !JsSigV4aSigner) {\n                    throw new Error(\"Neither CRT nor JS SigV4a implementation is available. \" +\n                        \"Please load either @aws-sdk/signature-v4-crt or @aws-sdk/signature-v4a. \" +\n                        \"For more information please go to \" +\n                        \"https://github.com/aws/aws-sdk-js-v3#functionality-requiring-aws-common-runtime-crt\");\n                }\n                if (CrtSignerV4 && typeof CrtSignerV4 === \"function\") {\n                    this.sigv4aSigner = new CrtSignerV4({\n                        ...this.signerOptions,\n                        signingAlgorithm: 1,\n                    });\n                }\n                else if (JsSigV4aSigner && typeof JsSigV4aSigner === \"function\") {\n                    this.sigv4aSigner = new JsSigV4aSigner({\n                        ...this.signerOptions,\n                    });\n                }\n                else {\n                    throw new Error(\"Available SigV4a implementation is not a valid constructor. \" +\n                        \"Please ensure you've properly imported @aws-sdk/signature-v4-crt or @aws-sdk/signature-v4a.\" +\n                        \"For more information please go to \" +\n                        \"https://github.com/aws/aws-sdk-js-v3#functionality-requiring-aws-common-runtime-crt\");\n                }\n            }\n            else {\n                if (!JsSigV4aSigner || typeof JsSigV4aSigner !== \"function\") {\n                    throw new Error(\"JS SigV4a implementation is not available or not a valid constructor. \" +\n                        \"Please check whether you have installed the @aws-sdk/signature-v4a package explicitly. The CRT implementation is not available for browsers. \" +\n                        \"You must also register the package by calling [require('@aws-sdk/signature-v4a');] \" +\n                        \"or an ESM equivalent such as [import '@aws-sdk/signature-v4a';]. \" +\n                        \"For more information please go to \" +\n                        \"https://github.com/aws/aws-sdk-js-v3#using-javascript-non-crt-implementation-of-sigv4a\");\n                }\n                this.sigv4aSigner = new JsSigV4aSigner({\n                    ...this.signerOptions,\n                });\n            }\n        }\n        return this.sigv4aSigner;\n    }\n}\n\nexports.SignatureV4MultiRegion = SignatureV4MultiRegion;\nexports.signatureV4CrtContainer = signatureV4CrtContainer;\n", "import { BinaryDecisionDiagram } from \"@smithy/util-endpoints\";\nconst q = \"ref\";\nconst a = -1, b = true, c = \"isSet\", d = \"PartitionResult\", e = \"booleanEquals\", f = \"stringEquals\", g = \"getAttr\", h = \"us-east-1\", i = \"sigv4\", j = \"sts\", k = \"https://sts.{Region}.{PartitionResult#dnsSuffix}\", l = { [q]: \"Endpoint\" }, m = { [q]: \"Region\" }, n = { [q]: d }, o = {}, p = [m];\nconst _data = {\n    conditions: [\n        [c, [l]],\n        [c, p],\n        [\"aws.partition\", p, d],\n        [e, [{ [q]: \"UseFIPS\" }, b]],\n        [e, [{ [q]: \"UseDualStack\" }, b]],\n        [f, [m, \"aws-global\"]],\n        [e, [{ [q]: \"UseGlobalEndpoint\" }, b]],\n        [f, [m, \"eu-central-1\"]],\n        [e, [{ fn: g, argv: [n, \"supportsDualStack\"] }, b]],\n        [e, [{ fn: g, argv: [n, \"supportsFIPS\"] }, b]],\n        [f, [m, \"ap-south-1\"]],\n        [f, [m, \"eu-north-1\"]],\n        [f, [m, \"eu-west-1\"]],\n        [f, [m, \"eu-west-2\"]],\n        [f, [m, \"eu-west-3\"]],\n        [f, [m, \"sa-east-1\"]],\n        [f, [m, h]],\n        [f, [m, \"us-east-2\"]],\n        [f, [m, \"us-west-2\"]],\n        [f, [m, \"us-west-1\"]],\n        [f, [m, \"ca-central-1\"]],\n        [f, [m, \"ap-southeast-1\"]],\n        [f, [m, \"ap-northeast-1\"]],\n        [f, [m, \"ap-southeast-2\"]],\n        [f, [{ fn: g, argv: [n, \"name\"] }, \"aws-us-gov\"]],\n    ],\n    results: [\n        [a],\n        [\"https://sts.amazonaws.com\", { authSchemes: [{ name: i, signingName: j, signingRegion: h }] }],\n        [k, { authSchemes: [{ name: i, signingName: j, signingRegion: \"{Region}\" }] }],\n        [a, \"Invalid Configuration: FIPS and custom endpoint are not supported\"],\n        [a, \"Invalid Configuration: Dualstack and custom endpoint are not supported\"],\n        [l, o],\n        [\"https://sts-fips.{Region}.{PartitionResult#dualStackDnsSuffix}\", o],\n        [a, \"FIPS and DualStack are enabled, but this partition does not support one or both\"],\n        [\"https://sts.{Region}.amazonaws.com\", o],\n        [\"https://sts-fips.{Region}.{PartitionResult#dnsSuffix}\", o],\n        [a, \"FIPS is enabled but this partition does not support FIPS\"],\n        [\"https://sts.{Region}.{PartitionResult#dualStackDnsSuffix}\", o],\n        [a, \"DualStack is enabled but this partition does not support DualStack\"],\n        [k, o],\n        [a, \"Invalid Configuration: Missing Region\"],\n    ],\n};\nconst root = 2;\nconst r = 100_000_000;\nconst nodes = new Int32Array([\n    -1,\n    1,\n    -1,\n    0,\n    30,\n    3,\n    1,\n    4,\n    r + 14,\n    2,\n    5,\n    r + 14,\n    3,\n    25,\n    6,\n    4,\n    24,\n    7,\n    5,\n    r + 1,\n    8,\n    6,\n    9,\n    r + 13,\n    7,\n    r + 1,\n    10,\n    10,\n    r + 1,\n    11,\n    11,\n    r + 1,\n    12,\n    12,\n    r + 1,\n    13,\n    13,\n    r + 1,\n    14,\n    14,\n    r + 1,\n    15,\n    15,\n    r + 1,\n    16,\n    16,\n    r + 1,\n    17,\n    17,\n    r + 1,\n    18,\n    18,\n    r + 1,\n    19,\n    19,\n    r + 1,\n    20,\n    20,\n    r + 1,\n    21,\n    21,\n    r + 1,\n    22,\n    22,\n    r + 1,\n    23,\n    23,\n    r + 1,\n    r + 2,\n    8,\n    r + 11,\n    r + 12,\n    4,\n    28,\n    26,\n    9,\n    27,\n    r + 10,\n    24,\n    r + 8,\n    r + 9,\n    8,\n    29,\n    r + 7,\n    9,\n    r + 6,\n    r + 7,\n    3,\n    r + 3,\n    31,\n    4,\n    r + 4,\n    r + 5,\n]);\nexport const bdd = BinaryDecisionDiagram.from(nodes, root, _data.conditions, _data.results);\n", "import { awsEndpointFunctions } from \"@aws-sdk/util-endpoints\";\nimport { customEndpointFunctions, decideEndpoint, EndpointCache } from \"@smithy/util-endpoints\";\nimport { bdd } from \"./bdd\";\nconst cache = new EndpointCache({\n    size: 50,\n    params: [\"Endpoint\", \"Region\", \"UseDualStack\", \"UseFIPS\", \"UseGlobalEndpoint\"],\n});\nexport const defaultEndpointResolver = (endpointParams, context = {}) => {\n    return cache.get(endpointParams, () => decideEndpoint(bdd, {\n        endpointParams: endpointParams,\n        logger: context.logger,\n    }));\n};\ncustomEndpointFunctions.aws = awsEndpointFunctions;\n", "import { resolveAwsSdkSigV4AConfig, resolveAwsSdkSigV4Config } from \"@aws-sdk/core/httpAuthSchemes\";\nimport { SignatureV4MultiRegion } from \"@aws-sdk/signature-v4-multi-region\";\nimport { resolveParams } from \"@smithy/middleware-endpoint\";\nimport { getSmithyContext, normalizeProvider } from \"@smithy/util-middleware\";\nimport { defaultEndpointResolver } from \"../endpoint/endpointResolver\";\nimport { STSClient } from \"../STSClient\";\nconst createEndpointRuleSetHttpAuthSchemeParametersProvider = (defaultHttpAuthSchemeParametersProvider) => async (config, context, input) => {\n    if (!input) {\n        throw new Error(\"Could not find `input` for `defaultEndpointRuleSetHttpAuthSchemeParametersProvider`\");\n    }\n    const defaultParameters = await defaultHttpAuthSchemeParametersProvider(config, context, input);\n    const instructionsFn = getSmithyContext(context)?.commandInstance?.constructor\n        ?.getEndpointParameterInstructions;\n    if (!instructionsFn) {\n        throw new Error(`getEndpointParameterInstructions() is not defined on '${context.commandName}'`);\n    }\n    const endpointParameters = await resolveParams(input, { getEndpointParameterInstructions: instructionsFn }, config);\n    return Object.assign(defaultParameters, endpointParameters);\n};\nconst _defaultSTSHttpAuthSchemeParametersProvider = async (config, context, input) => {\n    return {\n        operation: getSmithyContext(context).operation,\n        region: (await normalizeProvider(config.region)()) ||\n            (() => {\n                throw new Error(\"expected `region` to be configured for `aws.auth#sigv4`\");\n            })(),\n    };\n};\nexport const defaultSTSHttpAuthSchemeParametersProvider = createEndpointRuleSetHttpAuthSchemeParametersProvider(_defaultSTSHttpAuthSchemeParametersProvider);\nfunction createAwsAuthSigv4HttpAuthOption(authParameters) {\n    return {\n        schemeId: \"aws.auth#sigv4\",\n        signingProperties: {\n            name: \"sts\",\n            region: authParameters.region,\n        },\n        propertiesExtractor: (config, context) => ({\n            signingProperties: {\n                config,\n                context,\n            },\n        }),\n    };\n}\nfunction createAwsAuthSigv4aHttpAuthOption(authParameters) {\n    return {\n        schemeId: \"aws.auth#sigv4a\",\n        signingProperties: {\n            name: \"sts\",\n            region: authParameters.region,\n        },\n        propertiesExtractor: (config, context) => ({\n            signingProperties: {\n                config,\n                context,\n            },\n        }),\n    };\n}\nfunction createSmithyApiNoAuthHttpAuthOption(authParameters) {\n    return {\n        schemeId: \"smithy.api#noAuth\",\n    };\n}\nconst createEndpointRuleSetHttpAuthSchemeProvider = (defaultEndpointResolver, defaultHttpAuthSchemeResolver, createHttpAuthOptionFunctions) => {\n    const endpointRuleSetHttpAuthSchemeProvider = (authParameters) => {\n        const endpoint = defaultEndpointResolver(authParameters);\n        const authSchemes = endpoint.properties?.authSchemes;\n        if (!authSchemes) {\n            return defaultHttpAuthSchemeResolver(authParameters);\n        }\n        const options = [];\n        for (const scheme of authSchemes) {\n            const { name: resolvedName, properties = {}, ...rest } = scheme;\n            const name = resolvedName.toLowerCase();\n            if (resolvedName !== name) {\n                console.warn(`HttpAuthScheme has been normalized with lowercasing: '${resolvedName}' to '${name}'`);\n            }\n            let schemeId;\n            if (name === \"sigv4a\") {\n                schemeId = \"aws.auth#sigv4a\";\n                const sigv4Present = authSchemes.find((s) => {\n                    const name = s.name.toLowerCase();\n                    return name !== \"sigv4a\" && name.startsWith(\"sigv4\");\n                });\n                if (SignatureV4MultiRegion.sigv4aDependency() === \"none\" && sigv4Present) {\n                    continue;\n                }\n            }\n            else if (name.startsWith(\"sigv4\")) {\n                schemeId = \"aws.auth#sigv4\";\n            }\n            else {\n                throw new Error(`Unknown HttpAuthScheme found in '@smithy.rules#endpointRuleSet': '${name}'`);\n            }\n            const createOption = createHttpAuthOptionFunctions[schemeId];\n            if (!createOption) {\n                throw new Error(`Could not find HttpAuthOption create function for '${schemeId}'`);\n            }\n            const option = createOption(authParameters);\n            option.schemeId = schemeId;\n            option.signingProperties = { ...(option.signingProperties || {}), ...rest, ...properties };\n            options.push(option);\n        }\n        return options;\n    };\n    return endpointRuleSetHttpAuthSchemeProvider;\n};\nconst _defaultSTSHttpAuthSchemeProvider = (authParameters) => {\n    const options = [];\n    switch (authParameters.operation) {\n        case \"AssumeRoleWithWebIdentity\": {\n            options.push(createSmithyApiNoAuthHttpAuthOption(authParameters));\n            options.push(createAwsAuthSigv4aHttpAuthOption(authParameters));\n            break;\n        }\n        default: {\n            options.push(createAwsAuthSigv4HttpAuthOption(authParameters));\n            options.push(createAwsAuthSigv4aHttpAuthOption(authParameters));\n        }\n    }\n    return options;\n};\nexport const defaultSTSHttpAuthSchemeProvider = createEndpointRuleSetHttpAuthSchemeProvider(defaultEndpointResolver, _defaultSTSHttpAuthSchemeProvider, {\n    \"aws.auth#sigv4\": createAwsAuthSigv4HttpAuthOption,\n    \"aws.auth#sigv4a\": createAwsAuthSigv4aHttpAuthOption,\n    \"smithy.api#noAuth\": createSmithyApiNoAuthHttpAuthOption,\n});\nexport const resolveStsAuthConfig = (input) => Object.assign(input, {\n    stsClientCtor: STSClient,\n});\nexport const resolveHttpAuthSchemeConfig = (config) => {\n    const config_0 = resolveStsAuthConfig(config);\n    const config_1 = resolveAwsSdkSigV4Config(config_0);\n    const config_2 = resolveAwsSdkSigV4AConfig(config_1);\n    return Object.assign(config_2, {\n        authSchemePreference: normalizeProvider(config.authSchemePreference ?? []),\n    });\n};\n", "export const resolveClientEndpointParameters = (options) => {\n    return Object.assign(options, {\n        useDualstackEndpoint: options.useDualstackEndpoint ?? false,\n        useFipsEndpoint: options.useFipsEndpoint ?? false,\n        useGlobalEndpoint: options.useGlobalEndpoint ?? false,\n        defaultSigningName: \"sts\",\n    });\n};\nexport const commonParams = {\n    UseGlobalEndpoint: { type: \"builtInParams\", name: \"useGlobalEndpoint\" },\n    UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n    Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n    Region: { type: \"builtInParams\", name: \"region\" },\n    UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n};\n", "import { ServiceException as __ServiceException, } from \"@smithy/smithy-client\";\nexport { __ServiceException };\nexport class STSServiceException extends __ServiceException {\n    constructor(options) {\n        super(options);\n        Object.setPrototypeOf(this, STSServiceException.prototype);\n    }\n}\n", "import { STSServiceException as __BaseException } from \"./STSServiceException\";\nexport class ExpiredTokenException extends __BaseException {\n    name = \"ExpiredTokenException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"ExpiredTokenException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, ExpiredTokenException.prototype);\n    }\n}\nexport class MalformedPolicyDocumentException extends __BaseException {\n    name = \"MalformedPolicyDocumentException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"MalformedPolicyDocumentException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, MalformedPolicyDocumentException.prototype);\n    }\n}\nexport class PackedPolicyTooLargeException extends __BaseException {\n    name = \"PackedPolicyTooLargeException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"PackedPolicyTooLargeException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, PackedPolicyTooLargeException.prototype);\n    }\n}\nexport class RegionDisabledException extends __BaseException {\n    name = \"RegionDisabledException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"RegionDisabledException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, RegionDisabledException.prototype);\n    }\n}\nexport class IDPRejectedClaimException extends __BaseException {\n    name = \"IDPRejectedClaimException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"IDPRejectedClaimException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, IDPRejectedClaimException.prototype);\n    }\n}\nexport class InvalidIdentityTokenException extends __BaseException {\n    name = \"InvalidIdentityTokenException\";\n    $fault = \"client\";\n    constructor(opts) {\n        super({\n            name: \"InvalidIdentityTokenException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, InvalidIdentityTokenException.prototype);\n    }\n}\nexport class IDPCommunicationErrorException extends __BaseException {\n    name = \"IDPCommunicationErrorException\";\n    $fault = \"client\";\n    $retryable = {};\n    constructor(opts) {\n        super({\n            name: \"IDPCommunicationErrorException\",\n            $fault: \"client\",\n            ...opts,\n        });\n        Object.setPrototypeOf(this, IDPCommunicationErrorException.prototype);\n    }\n}\n", "const _A = \"Arn\";\nconst _AKI = \"AccessKeyId\";\nconst _AR = \"AssumeRole\";\nconst _ARI = \"AssumedRoleId\";\nconst _ARR = \"AssumeRoleRequest\";\nconst _ARRs = \"AssumeRoleResponse\";\nconst _ARU = \"AssumedRoleUser\";\nconst _ARWWI = \"AssumeRoleWithWebIdentity\";\nconst _ARWWIR = \"AssumeRoleWithWebIdentityRequest\";\nconst _ARWWIRs = \"AssumeRoleWithWebIdentityResponse\";\nconst _Au = \"Audience\";\nconst _C = \"Credentials\";\nconst _CA = \"ContextAssertion\";\nconst _DS = \"DurationSeconds\";\nconst _E = \"Expiration\";\nconst _EI = \"ExternalId\";\nconst _ETE = \"ExpiredTokenException\";\nconst _IDPCEE = \"IDPCommunicationErrorException\";\nconst _IDPRCE = \"IDPRejectedClaimException\";\nconst _IITE = \"InvalidIdentityTokenException\";\nconst _K = \"Key\";\nconst _MPDE = \"MalformedPolicyDocumentException\";\nconst _P = \"Policy\";\nconst _PA = \"PolicyArns\";\nconst _PAr = \"ProviderArn\";\nconst _PC = \"ProvidedContexts\";\nconst _PCLT = \"ProvidedContextsListType\";\nconst _PCr = \"ProvidedContext\";\nconst _PDT = \"PolicyDescriptorType\";\nconst _PI = \"ProviderId\";\nconst _PPS = \"PackedPolicySize\";\nconst _PPTLE = \"PackedPolicyTooLargeException\";\nconst _Pr = \"Provider\";\nconst _RA = \"RoleArn\";\nconst _RDE = \"RegionDisabledException\";\nconst _RSN = \"RoleSessionName\";\nconst _SAK = \"SecretAccessKey\";\nconst _SFWIT = \"SubjectFromWebIdentityToken\";\nconst _SI = \"SourceIdentity\";\nconst _SN = \"SerialNumber\";\nconst _ST = \"SessionToken\";\nconst _T = \"Tags\";\nconst _TC = \"TokenCode\";\nconst _TTK = \"TransitiveTagKeys\";\nconst _Ta = \"Tag\";\nconst _V = \"Value\";\nconst _WIT = \"WebIdentityToken\";\nconst _a = \"arn\";\nconst _aKST = \"accessKeySecretType\";\nconst _aQE = \"awsQueryError\";\nconst _c = \"client\";\nconst _cTT = \"clientTokenType\";\nconst _e = \"error\";\nconst _hE = \"httpError\";\nconst _m = \"message\";\nconst _pDLT = \"policyDescriptorListType\";\nconst _s = \"smithy.ts.sdk.synthetic.com.amazonaws.sts\";\nconst _tLT = \"tagListType\";\nconst n0 = \"com.amazonaws.sts\";\nimport { TypeRegistry } from \"@smithy/core/schema\";\nimport { ExpiredTokenException, IDPCommunicationErrorException, IDPRejectedClaimException, InvalidIdentityTokenException, MalformedPolicyDocumentException, PackedPolicyTooLargeException, RegionDisabledException, } from \"../models/errors\";\nimport { STSServiceException } from \"../models/STSServiceException\";\nconst _s_registry = TypeRegistry.for(_s);\nexport var STSServiceException$ = [-3, _s, \"STSServiceException\", 0, [], []];\n_s_registry.registerError(STSServiceException$, STSServiceException);\nconst n0_registry = TypeRegistry.for(n0);\nexport var ExpiredTokenException$ = [\n    -3,\n    n0,\n    _ETE,\n    { [_aQE]: [`ExpiredTokenException`, 400], [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0],\n];\nn0_registry.registerError(ExpiredTokenException$, ExpiredTokenException);\nexport var IDPCommunicationErrorException$ = [\n    -3,\n    n0,\n    _IDPCEE,\n    { [_aQE]: [`IDPCommunicationError`, 400], [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0],\n];\nn0_registry.registerError(IDPCommunicationErrorException$, IDPCommunicationErrorException);\nexport var IDPRejectedClaimException$ = [\n    -3,\n    n0,\n    _IDPRCE,\n    { [_aQE]: [`IDPRejectedClaim`, 403], [_e]: _c, [_hE]: 403 },\n    [_m],\n    [0],\n];\nn0_registry.registerError(IDPRejectedClaimException$, IDPRejectedClaimException);\nexport var InvalidIdentityTokenException$ = [\n    -3,\n    n0,\n    _IITE,\n    { [_aQE]: [`InvalidIdentityToken`, 400], [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0],\n];\nn0_registry.registerError(InvalidIdentityTokenException$, InvalidIdentityTokenException);\nexport var MalformedPolicyDocumentException$ = [\n    -3,\n    n0,\n    _MPDE,\n    { [_aQE]: [`MalformedPolicyDocument`, 400], [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0],\n];\nn0_registry.registerError(MalformedPolicyDocumentException$, MalformedPolicyDocumentException);\nexport var PackedPolicyTooLargeException$ = [\n    -3,\n    n0,\n    _PPTLE,\n    { [_aQE]: [`PackedPolicyTooLarge`, 400], [_e]: _c, [_hE]: 400 },\n    [_m],\n    [0],\n];\nn0_registry.registerError(PackedPolicyTooLargeException$, PackedPolicyTooLargeException);\nexport var RegionDisabledException$ = [\n    -3,\n    n0,\n    _RDE,\n    { [_aQE]: [`RegionDisabledException`, 403], [_e]: _c, [_hE]: 403 },\n    [_m],\n    [0],\n];\nn0_registry.registerError(RegionDisabledException$, RegionDisabledException);\nexport const errorTypeRegistries = [_s_registry, n0_registry];\nvar accessKeySecretType = [0, n0, _aKST, 8, 0];\nvar clientTokenType = [0, n0, _cTT, 8, 0];\nexport var AssumedRoleUser$ = [3, n0, _ARU, 0, [_ARI, _A], [0, 0], 2];\nexport var AssumeRoleRequest$ = [\n    3,\n    n0,\n    _ARR,\n    0,\n    [_RA, _RSN, _PA, _P, _DS, _T, _TTK, _EI, _SN, _TC, _SI, _PC],\n    [0, 0, () => policyDescriptorListType, 0, 1, () => tagListType, 64 | 0, 0, 0, 0, 0, () => ProvidedContextsListType],\n    2,\n];\nexport var AssumeRoleResponse$ = [\n    3,\n    n0,\n    _ARRs,\n    0,\n    [_C, _ARU, _PPS, _SI],\n    [[() => Credentials$, 0], () => AssumedRoleUser$, 1, 0],\n];\nexport var AssumeRoleWithWebIdentityRequest$ = [\n    3,\n    n0,\n    _ARWWIR,\n    0,\n    [_RA, _RSN, _WIT, _PI, _PA, _P, _DS],\n    [0, 0, [() => clientTokenType, 0], 0, () => policyDescriptorListType, 0, 1],\n    3,\n];\nexport var AssumeRoleWithWebIdentityResponse$ = [\n    3,\n    n0,\n    _ARWWIRs,\n    0,\n    [_C, _SFWIT, _ARU, _PPS, _Pr, _Au, _SI],\n    [[() => Credentials$, 0], 0, () => AssumedRoleUser$, 1, 0, 0, 0],\n];\nexport var Credentials$ = [\n    3,\n    n0,\n    _C,\n    0,\n    [_AKI, _SAK, _ST, _E],\n    [0, [() => accessKeySecretType, 0], 0, 4],\n    4,\n];\nexport var PolicyDescriptorType$ = [3, n0, _PDT, 0, [_a], [0]];\nexport var ProvidedContext$ = [3, n0, _PCr, 0, [_PAr, _CA], [0, 0]];\nexport var Tag$ = [3, n0, _Ta, 0, [_K, _V], [0, 0], 2];\nvar policyDescriptorListType = [1, n0, _pDLT, 0, () => PolicyDescriptorType$];\nvar ProvidedContextsListType = [1, n0, _PCLT, 0, () => ProvidedContext$];\nvar tagKeyListType = 64 | 0;\nvar tagListType = [1, n0, _tLT, 0, () => Tag$];\nexport var AssumeRole$ = [9, n0, _AR, 0, () => AssumeRoleRequest$, () => AssumeRoleResponse$];\nexport var AssumeRoleWithWebIdentity$ = [\n    9,\n    n0,\n    _ARWWI,\n    0,\n    () => AssumeRoleWithWebIdentityRequest$,\n    () => AssumeRoleWithWebIdentityResponse$,\n];\n", "import { AwsSdkSigV4ASigner, AwsSdkSigV4Signer } from \"@aws-sdk/core/httpAuthSchemes\";\nimport { AwsQueryProtocol } from \"@aws-sdk/core/protocols\";\nimport { SignatureV4MultiRegion } from \"@aws-sdk/signature-v4-multi-region\";\nimport { NoAuthSigner } from \"@smithy/core\";\nimport { NoOpLogger } from \"@smithy/smithy-client\";\nimport { parseUrl } from \"@smithy/url-parser\";\nimport { fromBase64, toBase64 } from \"@smithy/util-base64\";\nimport { fromUtf8, toUtf8 } from \"@smithy/util-utf8\";\nimport { defaultSTSHttpAuthSchemeProvider } from \"./auth/httpAuthSchemeProvider\";\nimport { defaultEndpointResolver } from \"./endpoint/endpointResolver\";\nimport { errorTypeRegistries } from \"./schemas/schemas_0\";\nexport const getRuntimeConfig = (config) => {\n    return {\n        apiVersion: \"2011-06-15\",\n        base64Decoder: config?.base64Decoder ?? fromBase64,\n        base64Encoder: config?.base64Encoder ?? toBase64,\n        disableHostPrefix: config?.disableHostPrefix ?? false,\n        endpointProvider: config?.endpointProvider ?? defaultEndpointResolver,\n        extensions: config?.extensions ?? [],\n        httpAuthSchemeProvider: config?.httpAuthSchemeProvider ?? defaultSTSHttpAuthSchemeProvider,\n        httpAuthSchemes: config?.httpAuthSchemes ?? [\n            {\n                schemeId: \"aws.auth#sigv4\",\n                identityProvider: (ipc) => ipc.getIdentityProvider(\"aws.auth#sigv4\"),\n                signer: new AwsSdkSigV4Signer(),\n            },\n            {\n                schemeId: \"aws.auth#sigv4a\",\n                identityProvider: (ipc) => ipc.getIdentityProvider(\"aws.auth#sigv4a\"),\n                signer: new AwsSdkSigV4ASigner(),\n            },\n            {\n                schemeId: \"smithy.api#noAuth\",\n                identityProvider: (ipc) => ipc.getIdentityProvider(\"smithy.api#noAuth\") || (async () => ({})),\n                signer: new NoAuthSigner(),\n            },\n        ],\n        logger: config?.logger ?? new NoOpLogger(),\n        protocol: config?.protocol ?? AwsQueryProtocol,\n        protocolSettings: config?.protocolSettings ?? {\n            defaultNamespace: \"com.amazonaws.sts\",\n            errorTypeRegistries,\n            xmlNamespace: \"https://sts.amazonaws.com/doc/2011-06-15/\",\n            version: \"2011-06-15\",\n            serviceTarget: \"AWSSecurityTokenServiceV20110615\",\n        },\n        serviceId: config?.serviceId ?? \"STS\",\n        signerConstructor: config?.signerConstructor ?? SignatureV4MultiRegion,\n        urlParser: config?.urlParser ?? parseUrl,\n        utf8Decoder: config?.utf8Decoder ?? fromUtf8,\n        utf8Encoder: config?.utf8Encoder ?? toUtf8,\n    };\n};\n", "import packageInfo from \"../../../package.json\";\nimport { emitWarningIfUnsupportedVersion as awsCheckVersion } from \"@aws-sdk/core/client\";\nimport { AwsSdkSigV4ASigner, AwsSdkSigV4Signer, NODE_AUTH_SCHEME_PREFERENCE_OPTIONS, NODE_SIGV4A_CONFIG_OPTIONS, } from \"@aws-sdk/core/httpAuthSchemes\";\nimport { createDefaultUserAgentProvider, NODE_APP_ID_CONFIG_OPTIONS } from \"@aws-sdk/util-user-agent-node\";\nimport { NODE_REGION_CONFIG_FILE_OPTIONS, NODE_REGION_CONFIG_OPTIONS, NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS, NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS, } from \"@smithy/config-resolver\";\nimport { NoAuthSigner } from \"@smithy/core\";\nimport { Hash } from \"@smithy/hash-node\";\nimport { NODE_MAX_ATTEMPT_CONFIG_OPTIONS, NODE_RETRY_MODE_CONFIG_OPTIONS } from \"@smithy/middleware-retry\";\nimport { loadConfig as loadNodeConfig } from \"@smithy/node-config-provider\";\nimport { NodeHttpHandler as RequestHandler, streamCollector } from \"@smithy/node-http-handler\";\nimport { emitWarningIfUnsupportedVersion, loadConfigsForDefaultMode } from \"@smithy/smithy-client\";\nimport { calculateBodyLength } from \"@smithy/util-body-length-node\";\nimport { resolveDefaultsModeConfig } from \"@smithy/util-defaults-mode-node\";\nimport { DEFAULT_RETRY_MODE } from \"@smithy/util-retry\";\nimport { getRuntimeConfig as getSharedRuntimeConfig } from \"./runtimeConfig.shared\";\nexport const getRuntimeConfig = (config) => {\n    emitWarningIfUnsupportedVersion(process.version);\n    const defaultsMode = resolveDefaultsModeConfig(config);\n    const defaultConfigProvider = () => defaultsMode().then(loadConfigsForDefaultMode);\n    const clientSharedValues = getSharedRuntimeConfig(config);\n    awsCheckVersion(process.version);\n    const loaderConfig = {\n        profile: config?.profile,\n        logger: clientSharedValues.logger,\n    };\n    return {\n        ...clientSharedValues,\n        ...config,\n        runtime: \"node\",\n        defaultsMode,\n        authSchemePreference: config?.authSchemePreference ?? loadNodeConfig(NODE_AUTH_SCHEME_PREFERENCE_OPTIONS, loaderConfig),\n        bodyLengthChecker: config?.bodyLengthChecker ?? calculateBodyLength,\n        defaultUserAgentProvider: config?.defaultUserAgentProvider ??\n            createDefaultUserAgentProvider({ serviceId: clientSharedValues.serviceId, clientVersion: packageInfo.version }),\n        httpAuthSchemes: config?.httpAuthSchemes ?? [\n            {\n                schemeId: \"aws.auth#sigv4\",\n                identityProvider: (ipc) => ipc.getIdentityProvider(\"aws.auth#sigv4\") ||\n                    (async (idProps) => await config.credentialDefaultProvider(idProps?.__config || {})()),\n                signer: new AwsSdkSigV4Signer(),\n            },\n            {\n                schemeId: \"aws.auth#sigv4a\",\n                identityProvider: (ipc) => ipc.getIdentityProvider(\"aws.auth#sigv4a\"),\n                signer: new AwsSdkSigV4ASigner(),\n            },\n            {\n                schemeId: \"smithy.api#noAuth\",\n                identityProvider: (ipc) => ipc.getIdentityProvider(\"smithy.api#noAuth\") || (async () => ({})),\n                signer: new NoAuthSigner(),\n            },\n        ],\n        maxAttempts: config?.maxAttempts ?? loadNodeConfig(NODE_MAX_ATTEMPT_CONFIG_OPTIONS, config),\n        region: config?.region ??\n            loadNodeConfig(NODE_REGION_CONFIG_OPTIONS, { ...NODE_REGION_CONFIG_FILE_OPTIONS, ...loaderConfig }),\n        requestHandler: RequestHandler.create(config?.requestHandler ?? defaultConfigProvider),\n        retryMode: config?.retryMode ??\n            loadNodeConfig({\n                ...NODE_RETRY_MODE_CONFIG_OPTIONS,\n                default: async () => (await defaultConfigProvider()).retryMode || DEFAULT_RETRY_MODE,\n            }, config),\n        sha256: config?.sha256 ?? Hash.bind(null, \"sha256\"),\n        sigv4aSigningRegionSet: config?.sigv4aSigningRegionSet ?? loadNodeConfig(NODE_SIGV4A_CONFIG_OPTIONS, loaderConfig),\n        streamCollector: config?.streamCollector ?? streamCollector,\n        useDualstackEndpoint: config?.useDualstackEndpoint ?? loadNodeConfig(NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS, loaderConfig),\n        useFipsEndpoint: config?.useFipsEndpoint ?? loadNodeConfig(NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS, loaderConfig),\n        userAgentAppId: config?.userAgentAppId ?? loadNodeConfig(NODE_APP_ID_CONFIG_OPTIONS, loaderConfig),\n    };\n};\n", "export const getHttpAuthExtensionConfiguration = (runtimeConfig) => {\n    const _httpAuthSchemes = runtimeConfig.httpAuthSchemes;\n    let _httpAuthSchemeProvider = runtimeConfig.httpAuthSchemeProvider;\n    let _credentials = runtimeConfig.credentials;\n    return {\n        setHttpAuthScheme(httpAuthScheme) {\n            const index = _httpAuthSchemes.findIndex((scheme) => scheme.schemeId === httpAuthScheme.schemeId);\n            if (index === -1) {\n                _httpAuthSchemes.push(httpAuthScheme);\n            }\n            else {\n                _httpAuthSchemes.splice(index, 1, httpAuthScheme);\n            }\n        },\n        httpAuthSchemes() {\n            return _httpAuthSchemes;\n        },\n        setHttpAuthSchemeProvider(httpAuthSchemeProvider) {\n            _httpAuthSchemeProvider = httpAuthSchemeProvider;\n        },\n        httpAuthSchemeProvider() {\n            return _httpAuthSchemeProvider;\n        },\n        setCredentials(credentials) {\n            _credentials = credentials;\n        },\n        credentials() {\n            return _credentials;\n        },\n    };\n};\nexport const resolveHttpAuthRuntimeConfig = (config) => {\n    return {\n        httpAuthSchemes: config.httpAuthSchemes(),\n        httpAuthSchemeProvider: config.httpAuthSchemeProvider(),\n        credentials: config.credentials(),\n    };\n};\n", "import { getAwsRegionExtensionConfiguration, resolveAwsRegionExtensionConfiguration, } from \"@aws-sdk/region-config-resolver\";\nimport { getHttpHandlerExtensionConfiguration, resolveHttpHandlerRuntimeConfig } from \"@smithy/protocol-http\";\nimport { getDefaultExtensionConfiguration, resolveDefaultRuntimeConfig } from \"@smithy/smithy-client\";\nimport { getHttpAuthExtensionConfiguration, resolveHttpAuthRuntimeConfig } from \"./auth/httpAuthExtensionConfiguration\";\nexport const resolveRuntimeExtensions = (runtimeConfig, extensions) => {\n    const extensionConfiguration = Object.assign(getAwsRegionExtensionConfiguration(runtimeConfig), getDefaultExtensionConfiguration(runtimeConfig), getHttpHandlerExtensionConfiguration(runtimeConfig), getHttpAuthExtensionConfiguration(runtimeConfig));\n    extensions.forEach((extension) => extension.configure(extensionConfiguration));\n    return Object.assign(runtimeConfig, resolveAwsRegionExtensionConfiguration(extensionConfiguration), resolveDefaultRuntimeConfig(extensionConfiguration), resolveHttpHandlerRuntimeConfig(extensionConfiguration), resolveHttpAuthRuntimeConfig(extensionConfiguration));\n};\n", "import { getHostHeaderPlugin, resolveHostHeaderConfig, } from \"@aws-sdk/middleware-host-header\";\nimport { getLoggerPlugin } from \"@aws-sdk/middleware-logger\";\nimport { getRecursionDetectionPlugin } from \"@aws-sdk/middleware-recursion-detection\";\nimport { getUserAgentPlugin, resolveUserAgentConfig, } from \"@aws-sdk/middleware-user-agent\";\nimport { resolveRegionConfig } from \"@smithy/config-resolver\";\nimport { DefaultIdentityProviderConfig, getHttpAuthSchemeEndpointRuleSetPlugin, getHttpSigningPlugin, } from \"@smithy/core\";\nimport { getSchemaSerdePlugin } from \"@smithy/core/schema\";\nimport { getContentLengthPlugin } from \"@smithy/middleware-content-length\";\nimport { resolveEndpointConfig, } from \"@smithy/middleware-endpoint\";\nimport { getRetryPlugin, resolveRetryConfig, } from \"@smithy/middleware-retry\";\nimport { Client as __Client, } from \"@smithy/smithy-client\";\nimport { defaultSTSHttpAuthSchemeParametersProvider, resolveHttpAuthSchemeConfig, } from \"./auth/httpAuthSchemeProvider\";\nimport { resolveClientEndpointParameters, } from \"./endpoint/EndpointParameters\";\nimport { getRuntimeConfig as __getRuntimeConfig } from \"./runtimeConfig\";\nimport { resolveRuntimeExtensions } from \"./runtimeExtensions\";\nexport { __Client };\nexport class STSClient extends __Client {\n    config;\n    constructor(...[configuration]) {\n        const _config_0 = __getRuntimeConfig(configuration || {});\n        super(_config_0);\n        this.initConfig = _config_0;\n        const _config_1 = resolveClientEndpointParameters(_config_0);\n        const _config_2 = resolveUserAgentConfig(_config_1);\n        const _config_3 = resolveRetryConfig(_config_2);\n        const _config_4 = resolveRegionConfig(_config_3);\n        const _config_5 = resolveHostHeaderConfig(_config_4);\n        const _config_6 = resolveEndpointConfig(_config_5);\n        const _config_7 = resolveHttpAuthSchemeConfig(_config_6);\n        const _config_8 = resolveRuntimeExtensions(_config_7, configuration?.extensions || []);\n        this.config = _config_8;\n        this.middlewareStack.use(getSchemaSerdePlugin(this.config));\n        this.middlewareStack.use(getUserAgentPlugin(this.config));\n        this.middlewareStack.use(getRetryPlugin(this.config));\n        this.middlewareStack.use(getContentLengthPlugin(this.config));\n        this.middlewareStack.use(getHostHeaderPlugin(this.config));\n        this.middlewareStack.use(getLoggerPlugin(this.config));\n        this.middlewareStack.use(getRecursionDetectionPlugin(this.config));\n        this.middlewareStack.use(getHttpAuthSchemeEndpointRuleSetPlugin(this.config, {\n            httpAuthSchemeParametersProvider: defaultSTSHttpAuthSchemeParametersProvider,\n            identityProviderConfigProvider: async (config) => new DefaultIdentityProviderConfig({\n                \"aws.auth#sigv4\": config.credentials,\n                \"aws.auth#sigv4a\": config.credentials,\n            }),\n        }));\n        this.middlewareStack.use(getHttpSigningPlugin(this.config));\n    }\n    destroy() {\n        super.destroy();\n    }\n}\n", "import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { AssumeRole$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class AssumeRoleCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSSecurityTokenServiceV20110615\", \"AssumeRole\", {})\n    .n(\"STSClient\", \"AssumeRoleCommand\")\n    .sc(AssumeRole$)\n    .build() {\n}\n", "import { getEndpointPlugin } from \"@smithy/middleware-endpoint\";\nimport { Command as $Command } from \"@smithy/smithy-client\";\nimport { commonParams } from \"../endpoint/EndpointParameters\";\nimport { AssumeRoleWithWebIdentity$ } from \"../schemas/schemas_0\";\nexport { $Command };\nexport class AssumeRoleWithWebIdentityCommand extends $Command\n    .classBuilder()\n    .ep(commonParams)\n    .m(function (Command, cs, config, o) {\n    return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())];\n})\n    .s(\"AWSSecurityTokenServiceV20110615\", \"AssumeRoleWithWebIdentity\", {})\n    .n(\"STSClient\", \"AssumeRoleWithWebIdentityCommand\")\n    .sc(AssumeRoleWithWebIdentity$)\n    .build() {\n}\n", "import { createAggregatedClient } from \"@smithy/smithy-client\";\nimport { AssumeRoleCommand, } from \"./commands/AssumeRoleCommand\";\nimport { AssumeRoleWithWebIdentityCommand, } from \"./commands/AssumeRoleWithWebIdentityCommand\";\nimport { STSClient } from \"./STSClient\";\nconst commands = {\n    AssumeRoleCommand,\n    AssumeRoleWithWebIdentityCommand,\n};\nexport class STS extends STSClient {\n}\ncreateAggregatedClient(commands, STS);\n", "export * from \"./AssumeRoleCommand\";\nexport * from \"./AssumeRoleWithWebIdentityCommand\";\n", "export {};\n", "import { setCredentialFeature } from \"@aws-sdk/core/client\";\nimport { stsRegionDefaultResolver } from \"@aws-sdk/region-config-resolver\";\nimport { AssumeRoleCommand } from \"./commands/AssumeRoleCommand\";\nimport { AssumeRoleWithWebIdentityCommand } from \"./commands/AssumeRoleWithWebIdentityCommand\";\nconst getAccountIdFromAssumedRoleUser = (assumedRoleUser) => {\n    if (typeof assumedRoleUser?.Arn === \"string\") {\n        const arnComponents = assumedRoleUser.Arn.split(\":\");\n        if (arnComponents.length > 4 && arnComponents[4] !== \"\") {\n            return arnComponents[4];\n        }\n    }\n    return undefined;\n};\nconst resolveRegion = async (_region, _parentRegion, credentialProviderLogger, loaderConfig = {}) => {\n    const region = typeof _region === \"function\" ? await _region() : _region;\n    const parentRegion = typeof _parentRegion === \"function\" ? await _parentRegion() : _parentRegion;\n    let stsDefaultRegion = \"\";\n    const resolvedRegion = region ?? parentRegion ?? (stsDefaultRegion = await stsRegionDefaultResolver(loaderConfig)());\n    credentialProviderLogger?.debug?.(\"@aws-sdk/client-sts::resolveRegion\", \"accepting first of:\", `${region} (credential provider clientConfig)`, `${parentRegion} (contextual client)`, `${stsDefaultRegion} (STS default: AWS_REGION, profile region, or us-east-1)`);\n    return resolvedRegion;\n};\nexport const getDefaultRoleAssumer = (stsOptions, STSClient) => {\n    let stsClient;\n    let closureSourceCreds;\n    return async (sourceCreds, params) => {\n        closureSourceCreds = sourceCreds;\n        if (!stsClient) {\n            const { logger = stsOptions?.parentClientConfig?.logger, profile = stsOptions?.parentClientConfig?.profile, region, requestHandler = stsOptions?.parentClientConfig?.requestHandler, credentialProviderLogger, userAgentAppId = stsOptions?.parentClientConfig?.userAgentAppId, } = stsOptions;\n            const resolvedRegion = await resolveRegion(region, stsOptions?.parentClientConfig?.region, credentialProviderLogger, {\n                logger,\n                profile,\n            });\n            const isCompatibleRequestHandler = !isH2(requestHandler);\n            stsClient = new STSClient({\n                ...stsOptions,\n                userAgentAppId,\n                profile,\n                credentialDefaultProvider: () => async () => closureSourceCreds,\n                region: resolvedRegion,\n                requestHandler: isCompatibleRequestHandler ? requestHandler : undefined,\n                logger: logger,\n            });\n        }\n        const { Credentials, AssumedRoleUser } = await stsClient.send(new AssumeRoleCommand(params));\n        if (!Credentials || !Credentials.AccessKeyId || !Credentials.SecretAccessKey) {\n            throw new Error(`Invalid response from STS.assumeRole call with role ${params.RoleArn}`);\n        }\n        const accountId = getAccountIdFromAssumedRoleUser(AssumedRoleUser);\n        const credentials = {\n            accessKeyId: Credentials.AccessKeyId,\n            secretAccessKey: Credentials.SecretAccessKey,\n            sessionToken: Credentials.SessionToken,\n            expiration: Credentials.Expiration,\n            ...(Credentials.CredentialScope && { credentialScope: Credentials.CredentialScope }),\n            ...(accountId && { accountId }),\n        };\n        setCredentialFeature(credentials, \"CREDENTIALS_STS_ASSUME_ROLE\", \"i\");\n        return credentials;\n    };\n};\nexport const getDefaultRoleAssumerWithWebIdentity = (stsOptions, STSClient) => {\n    let stsClient;\n    return async (params) => {\n        if (!stsClient) {\n            const { logger = stsOptions?.parentClientConfig?.logger, profile = stsOptions?.parentClientConfig?.profile, region, requestHandler = stsOptions?.parentClientConfig?.requestHandler, credentialProviderLogger, userAgentAppId = stsOptions?.parentClientConfig?.userAgentAppId, } = stsOptions;\n            const resolvedRegion = await resolveRegion(region, stsOptions?.parentClientConfig?.region, credentialProviderLogger, {\n                logger,\n                profile,\n            });\n            const isCompatibleRequestHandler = !isH2(requestHandler);\n            stsClient = new STSClient({\n                ...stsOptions,\n                userAgentAppId,\n                profile,\n                region: resolvedRegion,\n                requestHandler: isCompatibleRequestHandler ? requestHandler : undefined,\n                logger: logger,\n            });\n        }\n        const { Credentials, AssumedRoleUser } = await stsClient.send(new AssumeRoleWithWebIdentityCommand(params));\n        if (!Credentials || !Credentials.AccessKeyId || !Credentials.SecretAccessKey) {\n            throw new Error(`Invalid response from STS.assumeRoleWithWebIdentity call with role ${params.RoleArn}`);\n        }\n        const accountId = getAccountIdFromAssumedRoleUser(AssumedRoleUser);\n        const credentials = {\n            accessKeyId: Credentials.AccessKeyId,\n            secretAccessKey: Credentials.SecretAccessKey,\n            sessionToken: Credentials.SessionToken,\n            expiration: Credentials.Expiration,\n            ...(Credentials.CredentialScope && { credentialScope: Credentials.CredentialScope }),\n            ...(accountId && { accountId }),\n        };\n        if (accountId) {\n            setCredentialFeature(credentials, \"RESOLVED_ACCOUNT_ID\", \"T\");\n        }\n        setCredentialFeature(credentials, \"CREDENTIALS_STS_ASSUME_ROLE_WEB_ID\", \"k\");\n        return credentials;\n    };\n};\nexport const decorateDefaultCredentialProvider = (provider) => (input) => provider({\n    roleAssumer: getDefaultRoleAssumer(input, input.stsClientCtor),\n    roleAssumerWithWebIdentity: getDefaultRoleAssumerWithWebIdentity(input, input.stsClientCtor),\n    ...input,\n});\nconst isH2 = (requestHandler) => {\n    return requestHandler?.metadata?.handlerProtocol === \"h2\";\n};\n", "import { getDefaultRoleAssumer as StsGetDefaultRoleAssumer, getDefaultRoleAssumerWithWebIdentity as StsGetDefaultRoleAssumerWithWebIdentity, } from \"./defaultStsRoleAssumers\";\nimport { STSClient } from \"./STSClient\";\nconst getCustomizableStsClientCtor = (baseCtor, customizations) => {\n    if (!customizations)\n        return baseCtor;\n    else\n        return class CustomizableSTSClient extends baseCtor {\n            constructor(config) {\n                super(config);\n                for (const customization of customizations) {\n                    this.middlewareStack.use(customization);\n                }\n            }\n        };\n};\nexport const getDefaultRoleAssumer = (stsOptions = {}, stsPlugins) => StsGetDefaultRoleAssumer(stsOptions, getCustomizableStsClientCtor(STSClient, stsPlugins));\nexport const getDefaultRoleAssumerWithWebIdentity = (stsOptions = {}, stsPlugins) => StsGetDefaultRoleAssumerWithWebIdentity(stsOptions, getCustomizableStsClientCtor(STSClient, stsPlugins));\nexport const decorateDefaultCredentialProvider = (provider) => (input) => provider({\n    roleAssumer: getDefaultRoleAssumer(input),\n    roleAssumerWithWebIdentity: getDefaultRoleAssumerWithWebIdentity(input),\n    ...input,\n});\n", "export * from \"./STSClient\";\nexport * from \"./STS\";\nexport * from \"./commands\";\nexport * from \"./schemas/schemas_0\";\nexport * from \"./models/errors\";\nexport * from \"./models/models_0\";\nexport * from \"./defaultRoleAssumers\";\nexport { STSServiceException } from \"./models/STSServiceException\";\n", "'use strict';\n\nvar sharedIniFileLoader = require('@smithy/shared-ini-file-loader');\nvar propertyProvider = require('@smithy/property-provider');\nvar node_child_process = require('node:child_process');\nvar node_util = require('node:util');\nvar client = require('@aws-sdk/core/client');\n\nconst getValidatedProcessCredentials = (profileName, data, profiles) => {\n    if (data.Version !== 1) {\n        throw Error(`Profile ${profileName} credential_process did not return Version 1.`);\n    }\n    if (data.AccessKeyId === undefined || data.SecretAccessKey === undefined) {\n        throw Error(`Profile ${profileName} credential_process returned invalid credentials.`);\n    }\n    if (data.Expiration) {\n        const currentTime = new Date();\n        const expireTime = new Date(data.Expiration);\n        if (expireTime < currentTime) {\n            throw Error(`Profile ${profileName} credential_process returned expired credentials.`);\n        }\n    }\n    let accountId = data.AccountId;\n    if (!accountId && profiles?.[profileName]?.aws_account_id) {\n        accountId = profiles[profileName].aws_account_id;\n    }\n    const credentials = {\n        accessKeyId: data.AccessKeyId,\n        secretAccessKey: data.SecretAccessKey,\n        ...(data.SessionToken && { sessionToken: data.SessionToken }),\n        ...(data.Expiration && { expiration: new Date(data.Expiration) }),\n        ...(data.CredentialScope && { credentialScope: data.CredentialScope }),\n        ...(accountId && { accountId }),\n    };\n    client.setCredentialFeature(credentials, \"CREDENTIALS_PROCESS\", \"w\");\n    return credentials;\n};\n\nconst resolveProcessCredentials = async (profileName, profiles, logger) => {\n    const profile = profiles[profileName];\n    if (profiles[profileName]) {\n        const credentialProcess = profile[\"credential_process\"];\n        if (credentialProcess !== undefined) {\n            const execPromise = node_util.promisify(sharedIniFileLoader.externalDataInterceptor?.getTokenRecord?.().exec ?? node_child_process.exec);\n            try {\n                const { stdout } = await execPromise(credentialProcess);\n                let data;\n                try {\n                    data = JSON.parse(stdout.trim());\n                }\n                catch {\n                    throw Error(`Profile ${profileName} credential_process returned invalid JSON.`);\n                }\n                return getValidatedProcessCredentials(profileName, data, profiles);\n            }\n            catch (error) {\n                throw new propertyProvider.CredentialsProviderError(error.message, { logger });\n            }\n        }\n        else {\n            throw new propertyProvider.CredentialsProviderError(`Profile ${profileName} did not contain credential_process.`, { logger });\n        }\n    }\n    else {\n        throw new propertyProvider.CredentialsProviderError(`Profile ${profileName} could not be found in shared credentials file.`, {\n            logger,\n        });\n    }\n};\n\nconst fromProcess = (init = {}) => async ({ callerClientConfig } = {}) => {\n    init.logger?.debug(\"@aws-sdk/credential-provider-process - fromProcess\");\n    const profiles = await sharedIniFileLoader.parseKnownFiles(init);\n    return resolveProcessCredentials(sharedIniFileLoader.getProfileName({\n        profile: init.profile ?? callerClientConfig?.profile,\n    }), profiles, init.logger);\n};\n\nexports.fromProcess = fromProcess;\n", "\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    var desc = Object.getOwnPropertyDescriptor(m, k);\n    if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n      desc = { enumerable: true, get: function() { return m[k]; } };\n    }\n    Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n    Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n    o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || (function () {\n    var ownKeys = function(o) {\n        ownKeys = Object.getOwnPropertyNames || function (o) {\n            var ar = [];\n            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n            return ar;\n        };\n        return ownKeys(o);\n    };\n    return function (mod) {\n        if (mod && mod.__esModule) return mod;\n        var result = {};\n        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n        __setModuleDefault(result, mod);\n        return result;\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromWebToken = void 0;\nconst fromWebToken = (init) => async (awsIdentityProperties) => {\n    init.logger?.debug(\"@aws-sdk/credential-provider-web-identity - fromWebToken\");\n    const { roleArn, roleSessionName, webIdentityToken, providerId, policyArns, policy, durationSeconds } = init;\n    let { roleAssumerWithWebIdentity } = init;\n    if (!roleAssumerWithWebIdentity) {\n        const { getDefaultRoleAssumerWithWebIdentity } = await Promise.resolve().then(() => __importStar(require(\"@aws-sdk/nested-clients/sts\")));\n        roleAssumerWithWebIdentity = getDefaultRoleAssumerWithWebIdentity({\n            ...init.clientConfig,\n            credentialProviderLogger: init.logger,\n            parentClientConfig: {\n                ...awsIdentityProperties?.callerClientConfig,\n                ...init.parentClientConfig,\n            },\n        }, init.clientPlugins);\n    }\n    return roleAssumerWithWebIdentity({\n        RoleArn: roleArn,\n        RoleSessionName: roleSessionName ?? `aws-sdk-js-session-${Date.now()}`,\n        WebIdentityToken: webIdentityToken,\n        ProviderId: providerId,\n        PolicyArns: policyArns,\n        Policy: policy,\n        DurationSeconds: durationSeconds,\n    });\n};\nexports.fromWebToken = fromWebToken;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromTokenFile = void 0;\nconst client_1 = require(\"@aws-sdk/core/client\");\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst shared_ini_file_loader_1 = require(\"@smithy/shared-ini-file-loader\");\nconst node_fs_1 = require(\"node:fs\");\nconst fromWebToken_1 = require(\"./fromWebToken\");\nconst ENV_TOKEN_FILE = \"AWS_WEB_IDENTITY_TOKEN_FILE\";\nconst ENV_ROLE_ARN = \"AWS_ROLE_ARN\";\nconst ENV_ROLE_SESSION_NAME = \"AWS_ROLE_SESSION_NAME\";\nconst fromTokenFile = (init = {}) => async (awsIdentityProperties) => {\n    init.logger?.debug(\"@aws-sdk/credential-provider-web-identity - fromTokenFile\");\n    const webIdentityTokenFile = init?.webIdentityTokenFile ?? process.env[ENV_TOKEN_FILE];\n    const roleArn = init?.roleArn ?? process.env[ENV_ROLE_ARN];\n    const roleSessionName = init?.roleSessionName ?? process.env[ENV_ROLE_SESSION_NAME];\n    if (!webIdentityTokenFile || !roleArn) {\n        throw new property_provider_1.CredentialsProviderError(\"Web identity configuration not specified\", {\n            logger: init.logger,\n        });\n    }\n    const credentials = await (0, fromWebToken_1.fromWebToken)({\n        ...init,\n        webIdentityToken: shared_ini_file_loader_1.externalDataInterceptor?.getTokenRecord?.()[webIdentityTokenFile] ??\n            (0, node_fs_1.readFileSync)(webIdentityTokenFile, { encoding: \"ascii\" }),\n        roleArn,\n        roleSessionName,\n    })(awsIdentityProperties);\n    if (webIdentityTokenFile === process.env[ENV_TOKEN_FILE]) {\n        (0, client_1.setCredentialFeature)(credentials, \"CREDENTIALS_ENV_VARS_STS_WEB_ID_TOKEN\", \"h\");\n    }\n    return credentials;\n};\nexports.fromTokenFile = fromTokenFile;\n", "'use strict';\n\nvar fromTokenFile = require('./fromTokenFile');\nvar fromWebToken = require('./fromWebToken');\n\n\n\nObject.prototype.hasOwnProperty.call(fromTokenFile, '__proto__') &&\n\t!Object.prototype.hasOwnProperty.call(exports, '__proto__') &&\n\tObject.defineProperty(exports, '__proto__', {\n\t\tenumerable: true,\n\t\tvalue: fromTokenFile['__proto__']\n\t});\n\nObject.keys(fromTokenFile).forEach(function (k) {\n\tif (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) exports[k] = fromTokenFile[k];\n});\nObject.prototype.hasOwnProperty.call(fromWebToken, '__proto__') &&\n\t!Object.prototype.hasOwnProperty.call(exports, '__proto__') &&\n\tObject.defineProperty(exports, '__proto__', {\n\t\tenumerable: true,\n\t\tvalue: fromWebToken['__proto__']\n\t});\n\nObject.keys(fromWebToken).forEach(function (k) {\n\tif (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) exports[k] = fromWebToken[k];\n});\n", "'use strict';\n\nvar sharedIniFileLoader = require('@smithy/shared-ini-file-loader');\nvar propertyProvider = require('@smithy/property-provider');\nvar client = require('@aws-sdk/core/client');\nvar credentialProviderLogin = require('@aws-sdk/credential-provider-login');\n\nconst resolveCredentialSource = (credentialSource, profileName, logger) => {\n    const sourceProvidersMap = {\n        EcsContainer: async (options) => {\n            const { fromHttp } = await import('@aws-sdk/credential-provider-http');\n            const { fromContainerMetadata } = await import('@smithy/credential-provider-imds');\n            logger?.debug(\"@aws-sdk/credential-provider-ini - credential_source is EcsContainer\");\n            return async () => propertyProvider.chain(fromHttp(options ?? {}), fromContainerMetadata(options))().then(setNamedProvider);\n        },\n        Ec2InstanceMetadata: async (options) => {\n            logger?.debug(\"@aws-sdk/credential-provider-ini - credential_source is Ec2InstanceMetadata\");\n            const { fromInstanceMetadata } = await import('@smithy/credential-provider-imds');\n            return async () => fromInstanceMetadata(options)().then(setNamedProvider);\n        },\n        Environment: async (options) => {\n            logger?.debug(\"@aws-sdk/credential-provider-ini - credential_source is Environment\");\n            const { fromEnv } = await import('@aws-sdk/credential-provider-env');\n            return async () => fromEnv(options)().then(setNamedProvider);\n        },\n    };\n    if (credentialSource in sourceProvidersMap) {\n        return sourceProvidersMap[credentialSource];\n    }\n    else {\n        throw new propertyProvider.CredentialsProviderError(`Unsupported credential source in profile ${profileName}. Got ${credentialSource}, ` +\n            `expected EcsContainer or Ec2InstanceMetadata or Environment.`, { logger });\n    }\n};\nconst setNamedProvider = (creds) => client.setCredentialFeature(creds, \"CREDENTIALS_PROFILE_NAMED_PROVIDER\", \"p\");\n\nconst isAssumeRoleProfile = (arg, { profile = \"default\", logger } = {}) => {\n    return (Boolean(arg) &&\n        typeof arg === \"object\" &&\n        typeof arg.role_arn === \"string\" &&\n        [\"undefined\", \"string\"].indexOf(typeof arg.role_session_name) > -1 &&\n        [\"undefined\", \"string\"].indexOf(typeof arg.external_id) > -1 &&\n        [\"undefined\", \"string\"].indexOf(typeof arg.mfa_serial) > -1 &&\n        (isAssumeRoleWithSourceProfile(arg, { profile, logger }) || isCredentialSourceProfile(arg, { profile, logger })));\n};\nconst isAssumeRoleWithSourceProfile = (arg, { profile, logger }) => {\n    const withSourceProfile = typeof arg.source_profile === \"string\" && typeof arg.credential_source === \"undefined\";\n    if (withSourceProfile) {\n        logger?.debug?.(`    ${profile} isAssumeRoleWithSourceProfile source_profile=${arg.source_profile}`);\n    }\n    return withSourceProfile;\n};\nconst isCredentialSourceProfile = (arg, { profile, logger }) => {\n    const withProviderProfile = typeof arg.credential_source === \"string\" && typeof arg.source_profile === \"undefined\";\n    if (withProviderProfile) {\n        logger?.debug?.(`    ${profile} isCredentialSourceProfile credential_source=${arg.credential_source}`);\n    }\n    return withProviderProfile;\n};\nconst resolveAssumeRoleCredentials = async (profileName, profiles, options, callerClientConfig, visitedProfiles = {}, resolveProfileData) => {\n    options.logger?.debug(\"@aws-sdk/credential-provider-ini - resolveAssumeRoleCredentials (STS)\");\n    const profileData = profiles[profileName];\n    const { source_profile, region } = profileData;\n    if (!options.roleAssumer) {\n        const { getDefaultRoleAssumer } = await import('@aws-sdk/nested-clients/sts');\n        options.roleAssumer = getDefaultRoleAssumer({\n            ...options.clientConfig,\n            credentialProviderLogger: options.logger,\n            parentClientConfig: {\n                ...callerClientConfig,\n                ...options?.parentClientConfig,\n                region: region ?? options?.parentClientConfig?.region ?? callerClientConfig?.region,\n            },\n        }, options.clientPlugins);\n    }\n    if (source_profile && source_profile in visitedProfiles) {\n        throw new propertyProvider.CredentialsProviderError(`Detected a cycle attempting to resolve credentials for profile` +\n            ` ${sharedIniFileLoader.getProfileName(options)}. Profiles visited: ` +\n            Object.keys(visitedProfiles).join(\", \"), { logger: options.logger });\n    }\n    options.logger?.debug(`@aws-sdk/credential-provider-ini - finding credential resolver using ${source_profile ? `source_profile=[${source_profile}]` : `profile=[${profileName}]`}`);\n    const sourceCredsProvider = source_profile\n        ? resolveProfileData(source_profile, profiles, options, callerClientConfig, {\n            ...visitedProfiles,\n            [source_profile]: true,\n        }, isCredentialSourceWithoutRoleArn(profiles[source_profile] ?? {}))\n        : (await resolveCredentialSource(profileData.credential_source, profileName, options.logger)(options))();\n    if (isCredentialSourceWithoutRoleArn(profileData)) {\n        return sourceCredsProvider.then((creds) => client.setCredentialFeature(creds, \"CREDENTIALS_PROFILE_SOURCE_PROFILE\", \"o\"));\n    }\n    else {\n        const params = {\n            RoleArn: profileData.role_arn,\n            RoleSessionName: profileData.role_session_name || `aws-sdk-js-${Date.now()}`,\n            ExternalId: profileData.external_id,\n            DurationSeconds: parseInt(profileData.duration_seconds || \"3600\", 10),\n        };\n        const { mfa_serial } = profileData;\n        if (mfa_serial) {\n            if (!options.mfaCodeProvider) {\n                throw new propertyProvider.CredentialsProviderError(`Profile ${profileName} requires multi-factor authentication, but no MFA code callback was provided.`, { logger: options.logger, tryNextLink: false });\n            }\n            params.SerialNumber = mfa_serial;\n            params.TokenCode = await options.mfaCodeProvider(mfa_serial);\n        }\n        const sourceCreds = await sourceCredsProvider;\n        return options.roleAssumer(sourceCreds, params).then((creds) => client.setCredentialFeature(creds, \"CREDENTIALS_PROFILE_SOURCE_PROFILE\", \"o\"));\n    }\n};\nconst isCredentialSourceWithoutRoleArn = (section) => {\n    return !section.role_arn && !!section.credential_source;\n};\n\nconst isLoginProfile = (data) => {\n    return Boolean(data && data.login_session);\n};\nconst resolveLoginCredentials = async (profileName, options, callerClientConfig) => {\n    const credentials = await credentialProviderLogin.fromLoginCredentials({\n        ...options,\n        profile: profileName,\n    })({ callerClientConfig });\n    return client.setCredentialFeature(credentials, \"CREDENTIALS_PROFILE_LOGIN\", \"AC\");\n};\n\nconst isProcessProfile = (arg) => Boolean(arg) && typeof arg === \"object\" && typeof arg.credential_process === \"string\";\nconst resolveProcessCredentials = async (options, profile) => import('@aws-sdk/credential-provider-process').then(({ fromProcess }) => fromProcess({\n    ...options,\n    profile,\n})().then((creds) => client.setCredentialFeature(creds, \"CREDENTIALS_PROFILE_PROCESS\", \"v\")));\n\nconst resolveSsoCredentials = async (profile, profileData, options = {}, callerClientConfig) => {\n    const { fromSSO } = await import('@aws-sdk/credential-provider-sso');\n    return fromSSO({\n        profile,\n        logger: options.logger,\n        parentClientConfig: options.parentClientConfig,\n        clientConfig: options.clientConfig,\n    })({\n        callerClientConfig,\n    }).then((creds) => {\n        if (profileData.sso_session) {\n            return client.setCredentialFeature(creds, \"CREDENTIALS_PROFILE_SSO\", \"r\");\n        }\n        else {\n            return client.setCredentialFeature(creds, \"CREDENTIALS_PROFILE_SSO_LEGACY\", \"t\");\n        }\n    });\n};\nconst isSsoProfile = (arg) => arg &&\n    (typeof arg.sso_start_url === \"string\" ||\n        typeof arg.sso_account_id === \"string\" ||\n        typeof arg.sso_session === \"string\" ||\n        typeof arg.sso_region === \"string\" ||\n        typeof arg.sso_role_name === \"string\");\n\nconst isStaticCredsProfile = (arg) => Boolean(arg) &&\n    typeof arg === \"object\" &&\n    typeof arg.aws_access_key_id === \"string\" &&\n    typeof arg.aws_secret_access_key === \"string\" &&\n    [\"undefined\", \"string\"].indexOf(typeof arg.aws_session_token) > -1 &&\n    [\"undefined\", \"string\"].indexOf(typeof arg.aws_account_id) > -1;\nconst resolveStaticCredentials = async (profile, options) => {\n    options?.logger?.debug(\"@aws-sdk/credential-provider-ini - resolveStaticCredentials\");\n    const credentials = {\n        accessKeyId: profile.aws_access_key_id,\n        secretAccessKey: profile.aws_secret_access_key,\n        sessionToken: profile.aws_session_token,\n        ...(profile.aws_credential_scope && { credentialScope: profile.aws_credential_scope }),\n        ...(profile.aws_account_id && { accountId: profile.aws_account_id }),\n    };\n    return client.setCredentialFeature(credentials, \"CREDENTIALS_PROFILE\", \"n\");\n};\n\nconst isWebIdentityProfile = (arg) => Boolean(arg) &&\n    typeof arg === \"object\" &&\n    typeof arg.web_identity_token_file === \"string\" &&\n    typeof arg.role_arn === \"string\" &&\n    [\"undefined\", \"string\"].indexOf(typeof arg.role_session_name) > -1;\nconst resolveWebIdentityCredentials = async (profile, options, callerClientConfig) => import('@aws-sdk/credential-provider-web-identity').then(({ fromTokenFile }) => fromTokenFile({\n    webIdentityTokenFile: profile.web_identity_token_file,\n    roleArn: profile.role_arn,\n    roleSessionName: profile.role_session_name,\n    roleAssumerWithWebIdentity: options.roleAssumerWithWebIdentity,\n    logger: options.logger,\n    parentClientConfig: options.parentClientConfig,\n})({\n    callerClientConfig,\n}).then((creds) => client.setCredentialFeature(creds, \"CREDENTIALS_PROFILE_STS_WEB_ID_TOKEN\", \"q\")));\n\nconst resolveProfileData = async (profileName, profiles, options, callerClientConfig, visitedProfiles = {}, isAssumeRoleRecursiveCall = false) => {\n    const data = profiles[profileName];\n    if (Object.keys(visitedProfiles).length > 0 && isStaticCredsProfile(data)) {\n        return resolveStaticCredentials(data, options);\n    }\n    if (isAssumeRoleRecursiveCall || isAssumeRoleProfile(data, { profile: profileName, logger: options.logger })) {\n        return resolveAssumeRoleCredentials(profileName, profiles, options, callerClientConfig, visitedProfiles, resolveProfileData);\n    }\n    if (isStaticCredsProfile(data)) {\n        return resolveStaticCredentials(data, options);\n    }\n    if (isWebIdentityProfile(data)) {\n        return resolveWebIdentityCredentials(data, options, callerClientConfig);\n    }\n    if (isProcessProfile(data)) {\n        return resolveProcessCredentials(options, profileName);\n    }\n    if (isSsoProfile(data)) {\n        return await resolveSsoCredentials(profileName, data, options, callerClientConfig);\n    }\n    if (isLoginProfile(data)) {\n        return resolveLoginCredentials(profileName, options, callerClientConfig);\n    }\n    throw new propertyProvider.CredentialsProviderError(`Could not resolve credentials using profile: [${profileName}] in configuration/credentials file(s).`, { logger: options.logger });\n};\n\nconst fromIni = (init = {}) => async ({ callerClientConfig } = {}) => {\n    init.logger?.debug(\"@aws-sdk/credential-provider-ini - fromIni\");\n    const profiles = await sharedIniFileLoader.parseKnownFiles(init);\n    return resolveProfileData(sharedIniFileLoader.getProfileName({\n        profile: init.profile ?? callerClientConfig?.profile,\n    }), profiles, init, callerClientConfig);\n};\n\nexports.fromIni = fromIni;\n", "'use strict';\n\nvar credentialProviderEnv = require('@aws-sdk/credential-provider-env');\nvar propertyProvider = require('@smithy/property-provider');\nvar sharedIniFileLoader = require('@smithy/shared-ini-file-loader');\n\nconst ENV_IMDS_DISABLED = \"AWS_EC2_METADATA_DISABLED\";\nconst remoteProvider = async (init) => {\n    const { ENV_CMDS_FULL_URI, ENV_CMDS_RELATIVE_URI, fromContainerMetadata, fromInstanceMetadata } = await import('@smithy/credential-provider-imds');\n    if (process.env[ENV_CMDS_RELATIVE_URI] || process.env[ENV_CMDS_FULL_URI]) {\n        init.logger?.debug(\"@aws-sdk/credential-provider-node - remoteProvider::fromHttp/fromContainerMetadata\");\n        const { fromHttp } = await import('@aws-sdk/credential-provider-http');\n        return propertyProvider.chain(fromHttp(init), fromContainerMetadata(init));\n    }\n    if (process.env[ENV_IMDS_DISABLED] && process.env[ENV_IMDS_DISABLED] !== \"false\") {\n        return async () => {\n            throw new propertyProvider.CredentialsProviderError(\"EC2 Instance Metadata Service access disabled\", { logger: init.logger });\n        };\n    }\n    init.logger?.debug(\"@aws-sdk/credential-provider-node - remoteProvider::fromInstanceMetadata\");\n    return fromInstanceMetadata(init);\n};\n\nfunction memoizeChain(providers, treatAsExpired) {\n    const chain = internalCreateChain(providers);\n    let activeLock;\n    let passiveLock;\n    let credentials;\n    const provider = async (options) => {\n        if (options?.forceRefresh) {\n            return await chain(options);\n        }\n        if (credentials?.expiration) {\n            if (credentials?.expiration?.getTime() < Date.now()) {\n                credentials = undefined;\n            }\n        }\n        if (activeLock) {\n            await activeLock;\n        }\n        else if (!credentials || treatAsExpired?.(credentials)) {\n            if (credentials) {\n                if (!passiveLock) {\n                    passiveLock = chain(options)\n                        .then((c) => {\n                        credentials = c;\n                    })\n                        .finally(() => {\n                        passiveLock = undefined;\n                    });\n                }\n            }\n            else {\n                activeLock = chain(options)\n                    .then((c) => {\n                    credentials = c;\n                })\n                    .finally(() => {\n                    activeLock = undefined;\n                });\n                return provider(options);\n            }\n        }\n        return credentials;\n    };\n    return provider;\n}\nconst internalCreateChain = (providers) => async (awsIdentityProperties) => {\n    let lastProviderError;\n    for (const provider of providers) {\n        try {\n            return await provider(awsIdentityProperties);\n        }\n        catch (err) {\n            lastProviderError = err;\n            if (err?.tryNextLink) {\n                continue;\n            }\n            throw err;\n        }\n    }\n    throw lastProviderError;\n};\n\nlet multipleCredentialSourceWarningEmitted = false;\nconst defaultProvider = (init = {}) => memoizeChain([\n    async () => {\n        const profile = init.profile ?? process.env[sharedIniFileLoader.ENV_PROFILE];\n        if (profile) {\n            const envStaticCredentialsAreSet = process.env[credentialProviderEnv.ENV_KEY] && process.env[credentialProviderEnv.ENV_SECRET];\n            if (envStaticCredentialsAreSet) {\n                if (!multipleCredentialSourceWarningEmitted) {\n                    const warnFn = init.logger?.warn && init.logger?.constructor?.name !== \"NoOpLogger\"\n                        ? init.logger.warn.bind(init.logger)\n                        : console.warn;\n                    warnFn(`@aws-sdk/credential-provider-node - defaultProvider::fromEnv WARNING:\n    Multiple credential sources detected: \n    Both AWS_PROFILE and the pair AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY static credentials are set.\n    This SDK will proceed with the AWS_PROFILE value.\n    \n    However, a future version may change this behavior to prefer the ENV static credentials.\n    Please ensure that your environment only sets either the AWS_PROFILE or the\n    AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY pair.\n`);\n                    multipleCredentialSourceWarningEmitted = true;\n                }\n            }\n            throw new propertyProvider.CredentialsProviderError(\"AWS_PROFILE is set, skipping fromEnv provider.\", {\n                logger: init.logger,\n                tryNextLink: true,\n            });\n        }\n        init.logger?.debug(\"@aws-sdk/credential-provider-node - defaultProvider::fromEnv\");\n        return credentialProviderEnv.fromEnv(init)();\n    },\n    async (awsIdentityProperties) => {\n        init.logger?.debug(\"@aws-sdk/credential-provider-node - defaultProvider::fromSSO\");\n        const { ssoStartUrl, ssoAccountId, ssoRegion, ssoRoleName, ssoSession } = init;\n        if (!ssoStartUrl && !ssoAccountId && !ssoRegion && !ssoRoleName && !ssoSession) {\n            throw new propertyProvider.CredentialsProviderError(\"Skipping SSO provider in default chain (inputs do not include SSO fields).\", { logger: init.logger });\n        }\n        const { fromSSO } = await import('@aws-sdk/credential-provider-sso');\n        return fromSSO(init)(awsIdentityProperties);\n    },\n    async (awsIdentityProperties) => {\n        init.logger?.debug(\"@aws-sdk/credential-provider-node - defaultProvider::fromIni\");\n        const { fromIni } = await import('@aws-sdk/credential-provider-ini');\n        return fromIni(init)(awsIdentityProperties);\n    },\n    async (awsIdentityProperties) => {\n        init.logger?.debug(\"@aws-sdk/credential-provider-node - defaultProvider::fromProcess\");\n        const { fromProcess } = await import('@aws-sdk/credential-provider-process');\n        return fromProcess(init)(awsIdentityProperties);\n    },\n    async (awsIdentityProperties) => {\n        init.logger?.debug(\"@aws-sdk/credential-provider-node - defaultProvider::fromTokenFile\");\n        const { fromTokenFile } = await import('@aws-sdk/credential-provider-web-identity');\n        return fromTokenFile(init)(awsIdentityProperties);\n    },\n    async () => {\n        init.logger?.debug(\"@aws-sdk/credential-provider-node - defaultProvider::remoteProvider\");\n        return (await remoteProvider(init))();\n    },\n    async () => {\n        throw new propertyProvider.CredentialsProviderError(\"Could not load credentials from any providers\", {\n            tryNextLink: false,\n            logger: init.logger,\n        });\n    },\n], credentialsTreatedAsExpired);\nconst credentialsWillNeedRefresh = (credentials) => credentials?.expiration !== undefined;\nconst credentialsTreatedAsExpired = (credentials) => credentials?.expiration !== undefined && credentials.expiration.getTime() - Date.now() < 300000;\n\nexports.credentialsTreatedAsExpired = credentialsTreatedAsExpired;\nexports.credentialsWillNeedRefresh = credentialsWillNeedRefresh;\nexports.defaultProvider = defaultProvider;\n", "// @aws-sdk/credential-provider-node and @smithy/node-http-handler are imported\n// dynamically in getAWSClientProxyConfig() to defer ~929KB of AWS SDK.\n// undici is lazy-required inside getProxyAgent/configureGlobalAgents to defer\n// ~1.5MB when no HTTPS_PROXY/mTLS env vars are set (the common case).\nimport axios, { type AxiosInstance } from 'axios'\nimport type { LookupOptions } from 'dns'\nimport type { Agent } from 'http'\nimport { HttpsProxyAgent, type HttpsProxyAgentOptions } from 'https-proxy-agent'\nimport memoize from 'lodash-es/memoize.js'\nimport type * as undici from 'undici'\nimport { getCACertificates } from './caCerts.js'\nimport { logForDebugging } from './debug.js'\nimport { isEnvTruthy } from './envUtils.js'\nimport {\n  getMTLSAgent,\n  getMTLSConfig,\n  getTLSFetchOptions,\n  type TLSConfig,\n} from './mtls.js'\n\n// Disable fetch keep-alive after a stale-pool ECONNRESET so retries open a\n// fresh TCP connection instead of reusing the dead pooled socket. Sticky for\n// the process lifetime \u2014 once the pool is known-bad, don't trust it again.\n// Works under Bun (native fetch respects keepalive:false for pooling).\n// Under Node/undici, keepalive is a no-op for pooling, but undici\n// naturally evicts dead sockets from the pool on ECONNRESET.\nlet keepAliveDisabled = false\n\nexport function disableKeepAlive(): void {\n  keepAliveDisabled = true\n}\n\nexport function _resetKeepAliveForTesting(): void {\n  keepAliveDisabled = false\n}\n\n/**\n * Convert dns.LookupOptions.family to a numeric address family value\n * Handles: 0 | 4 | 6 | 'IPv4' | 'IPv6' | undefined\n */\nexport function getAddressFamily(options: LookupOptions): 0 | 4 | 6 {\n  switch (options.family) {\n    case 0:\n    case 4:\n    case 6:\n      return options.family\n    case 'IPv6':\n      return 6\n    case 'IPv4':\n    case undefined:\n      return 4\n    default:\n      throw new Error(`Unsupported address family: ${options.family}`)\n  }\n}\n\ntype EnvLike = Record<string, string | undefined>\n\n/**\n * Get the active proxy URL if one is configured\n * Prefers lowercase variants over uppercase (https_proxy > HTTPS_PROXY > http_proxy > HTTP_PROXY)\n * @param env Environment variables to check (defaults to process.env for production use)\n */\nexport function getProxyUrl(env: EnvLike = process.env): string | undefined {\n  return env.https_proxy || env.HTTPS_PROXY || env.http_proxy || env.HTTP_PROXY\n}\n\n/**\n * Get the NO_PROXY environment variable value\n * Prefers lowercase over uppercase (no_proxy > NO_PROXY)\n * @param env Environment variables to check (defaults to process.env for production use)\n */\nexport function getNoProxy(env: EnvLike = process.env): string | undefined {\n  return env.no_proxy || env.NO_PROXY\n}\n\n/**\n * Check if a URL should bypass the proxy based on NO_PROXY environment variable\n * Supports:\n * - Exact hostname matches (e.g., \"localhost\")\n * - Domain suffix matches with leading dot (e.g., \".example.com\")\n * - Wildcard \"*\" to bypass all\n * - Port-specific matches (e.g., \"example.com:8080\")\n * - IP addresses (e.g., \"127.0.0.1\")\n * @param urlString URL to check\n * @param noProxy NO_PROXY value (defaults to getNoProxy() for production use)\n */\nexport function shouldBypassProxy(\n  urlString: string,\n  noProxy: string | undefined = getNoProxy(),\n): boolean {\n  if (!noProxy) return false\n\n  // Handle wildcard\n  if (noProxy === '*') return true\n\n  try {\n    const url = new URL(urlString)\n    const hostname = url.hostname.toLowerCase()\n    const port = url.port || (url.protocol === 'https:' ? '443' : '80')\n    const hostWithPort = `${hostname}:${port}`\n\n    // Split by comma or space and trim each entry\n    const noProxyList = noProxy.split(/[,\\s]+/).filter(Boolean)\n\n    return noProxyList.some(pattern => {\n      pattern = pattern.toLowerCase().trim()\n\n      // Check for port-specific match\n      if (pattern.includes(':')) {\n        return hostWithPort === pattern\n      }\n\n      // Check for domain suffix match (with or without leading dot)\n      if (pattern.startsWith('.')) {\n        // Pattern \".example.com\" should match \"sub.example.com\" and \"example.com\"\n        // but NOT \"notexample.com\"\n        const suffix = pattern\n        return hostname === pattern.substring(1) || hostname.endsWith(suffix)\n      }\n\n      // Check for exact hostname match or IP address\n      return hostname === pattern\n    })\n  } catch {\n    // If URL parsing fails, don't bypass proxy\n    return false\n  }\n}\n\n/**\n * Create an HttpsProxyAgent with optional mTLS configuration\n * Skips local DNS resolution to let the proxy handle it\n */\nfunction createHttpsProxyAgent(\n  proxyUrl: string,\n  extra: HttpsProxyAgentOptions<string> = {},\n): HttpsProxyAgent<string> {\n  const mtlsConfig = getMTLSConfig()\n  const caCerts = getCACertificates()\n\n  const agentOptions: HttpsProxyAgentOptions<string> = {\n    ...(mtlsConfig && {\n      cert: mtlsConfig.cert,\n      key: mtlsConfig.key,\n      passphrase: mtlsConfig.passphrase,\n    }),\n    ...(caCerts && { ca: caCerts }),\n  }\n\n  if (isEnvTruthy(process.env.CLAUDE_CODE_PROXY_RESOLVES_HOSTS)) {\n    // Skip local DNS resolution - let the proxy resolve hostnames\n    // This is needed for environments where DNS is not configured locally\n    // and instead handled by the proxy (as in sandboxes)\n    agentOptions.lookup = (hostname, options, callback) => {\n      callback(null, hostname, getAddressFamily(options))\n    }\n  }\n\n  return new HttpsProxyAgent(proxyUrl, { ...agentOptions, ...extra })\n}\n\n/**\n * Axios instance with its own proxy agent. Same NO_PROXY/mTLS/CA\n * resolution as the global interceptor, but agent options stay\n * scoped to this instance.\n */\nexport function createAxiosInstance(\n  extra: HttpsProxyAgentOptions<string> = {},\n): AxiosInstance {\n  const proxyUrl = getProxyUrl()\n  const mtlsAgent = getMTLSAgent()\n  const instance = axios.create({ proxy: false })\n\n  if (!proxyUrl) {\n    if (mtlsAgent) instance.defaults.httpsAgent = mtlsAgent\n    return instance\n  }\n\n  const proxyAgent = createHttpsProxyAgent(proxyUrl, extra)\n  instance.interceptors.request.use(config => {\n    if (config.url && shouldBypassProxy(config.url)) {\n      config.httpsAgent = mtlsAgent\n      config.httpAgent = mtlsAgent\n    } else {\n      config.httpsAgent = proxyAgent\n      config.httpAgent = proxyAgent\n    }\n    return config\n  })\n  return instance\n}\n\n/**\n * Get or create a memoized proxy agent for the given URI\n * Now respects NO_PROXY environment variable\n */\nexport const getProxyAgent = memoize((uri: string): undici.Dispatcher => {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  const undiciMod = require('undici') as typeof undici\n  const mtlsConfig = getMTLSConfig()\n  const caCerts = getCACertificates()\n\n  // Use EnvHttpProxyAgent to respect NO_PROXY\n  // This agent automatically checks NO_PROXY for each request\n  const proxyOptions: undici.EnvHttpProxyAgent.Options & {\n    requestTls?: {\n      cert?: string | Buffer\n      key?: string | Buffer\n      passphrase?: string\n      ca?: string | string[] | Buffer\n    }\n  } = {\n    // Override both HTTP and HTTPS proxy with the provided URI\n    httpProxy: uri,\n    httpsProxy: uri,\n    noProxy: process.env.NO_PROXY || process.env.no_proxy,\n  }\n\n  // Set both connect and requestTls so TLS options apply to both paths:\n  // - requestTls: used by ProxyAgent for the TLS connection through CONNECT tunnels\n  // - connect: used by Agent for direct (no-proxy) connections\n  if (mtlsConfig || caCerts) {\n    const tlsOpts = {\n      ...(mtlsConfig && {\n        cert: mtlsConfig.cert,\n        key: mtlsConfig.key,\n        passphrase: mtlsConfig.passphrase,\n      }),\n      ...(caCerts && { ca: caCerts }),\n    }\n    proxyOptions.connect = tlsOpts\n    proxyOptions.requestTls = tlsOpts\n  }\n\n  return new undiciMod.EnvHttpProxyAgent(proxyOptions)\n})\n\n/**\n * Get an HTTP agent configured for WebSocket proxy support\n * Returns undefined if no proxy is configured or URL should bypass proxy\n */\nexport function getWebSocketProxyAgent(url: string): Agent | undefined {\n  const proxyUrl = getProxyUrl()\n\n  if (!proxyUrl) {\n    return undefined\n  }\n\n  // Check if URL should bypass proxy\n  if (shouldBypassProxy(url)) {\n    return undefined\n  }\n\n  return createHttpsProxyAgent(proxyUrl)\n}\n\n/**\n * Get the proxy URL for WebSocket connections under Bun.\n * Bun's native WebSocket supports a `proxy` string option instead of Node's `agent`.\n * Returns undefined if no proxy is configured or URL should bypass proxy.\n */\nexport function getWebSocketProxyUrl(url: string): string | undefined {\n  const proxyUrl = getProxyUrl()\n\n  if (!proxyUrl) {\n    return undefined\n  }\n\n  if (shouldBypassProxy(url)) {\n    return undefined\n  }\n\n  return proxyUrl\n}\n\n/**\n * Get fetch options for the Anthropic SDK with proxy and mTLS configuration\n * Returns fetch options with appropriate dispatcher for proxy and/or mTLS\n *\n * @param opts.forAnthropicAPI - Enables ANTHROPIC_UNIX_SOCKET tunneling. This\n *   env var is set by `claude ssh` on the remote CLI to route API calls through\n *   an ssh -R forwarded unix socket to a local auth proxy. It MUST NOT leak\n *   into non-Anthropic-API fetch paths (MCP HTTP/SSE transports, etc.) or those\n *   requests get misrouted to api.anthropic.com. Only the Anthropic SDK client\n *   should pass `true` here.\n */\nexport function getProxyFetchOptions(opts?: { forAnthropicAPI?: boolean }): {\n  tls?: TLSConfig\n  dispatcher?: undici.Dispatcher\n  proxy?: string\n  unix?: string\n  keepalive?: false\n} {\n  const base = keepAliveDisabled ? ({ keepalive: false } as const) : {}\n\n  // ANTHROPIC_UNIX_SOCKET tunnels through the `claude ssh` auth proxy, which\n  // hardcodes the upstream to the Anthropic API. Scope to the Anthropic API\n  // client so MCP/SSE/other callers don't get their requests misrouted.\n  if (opts?.forAnthropicAPI) {\n    const unixSocket = process.env.ANTHROPIC_UNIX_SOCKET\n    if (unixSocket && typeof Bun !== 'undefined') {\n      return { ...base, unix: unixSocket }\n    }\n  }\n\n  const proxyUrl = getProxyUrl()\n\n  // If we have a proxy, use the proxy agent (which includes mTLS config)\n  if (proxyUrl) {\n    if (typeof Bun !== 'undefined') {\n      return { ...base, proxy: proxyUrl, ...getTLSFetchOptions() }\n    }\n    return { ...base, dispatcher: getProxyAgent(proxyUrl) }\n  }\n\n  // Otherwise, use TLS options directly if available\n  return { ...base, ...getTLSFetchOptions() }\n}\n\n/**\n * Configure global HTTP agents for both axios and undici\n * This ensures all HTTP requests use the proxy and/or mTLS if configured\n */\nlet proxyInterceptorId: number | undefined\n\nexport function configureGlobalAgents(): void {\n  const proxyUrl = getProxyUrl()\n  const mtlsAgent = getMTLSAgent()\n\n  // Eject previous interceptor to avoid stacking on repeated calls\n  if (proxyInterceptorId !== undefined) {\n    axios.interceptors.request.eject(proxyInterceptorId)\n    proxyInterceptorId = undefined\n  }\n\n  // Reset proxy-related defaults so reconfiguration is clean\n  axios.defaults.proxy = undefined\n  axios.defaults.httpAgent = undefined\n  axios.defaults.httpsAgent = undefined\n\n  if (proxyUrl) {\n    // workaround for https://github.com/axios/axios/issues/4531\n    axios.defaults.proxy = false\n\n    // Create proxy agent with mTLS options if available\n    const proxyAgent = createHttpsProxyAgent(proxyUrl)\n\n    // Add axios request interceptor to handle NO_PROXY\n    proxyInterceptorId = axios.interceptors.request.use(config => {\n      // Check if URL should bypass proxy based on NO_PROXY\n      if (config.url && shouldBypassProxy(config.url)) {\n        // Bypass proxy - use mTLS agent if configured, otherwise undefined\n        if (mtlsAgent) {\n          config.httpsAgent = mtlsAgent\n          config.httpAgent = mtlsAgent\n        } else {\n          // Remove any proxy agents to use direct connection\n          delete config.httpsAgent\n          delete config.httpAgent\n        }\n      } else {\n        // Use proxy agent\n        config.httpsAgent = proxyAgent\n        config.httpAgent = proxyAgent\n      }\n      return config\n    })\n\n    // Set global dispatcher that now respects NO_PROXY via EnvHttpProxyAgent\n    // eslint-disable-next-line @typescript-eslint/no-require-imports\n    ;(require('undici') as typeof undici).setGlobalDispatcher(\n      getProxyAgent(proxyUrl),\n    )\n  } else if (mtlsAgent) {\n    // No proxy but mTLS is configured\n    axios.defaults.httpsAgent = mtlsAgent\n\n    // Set undici global dispatcher with mTLS\n    const mtlsOptions = getTLSFetchOptions()\n    if (mtlsOptions.dispatcher) {\n      // eslint-disable-next-line @typescript-eslint/no-require-imports\n      ;(require('undici') as typeof undici).setGlobalDispatcher(\n        mtlsOptions.dispatcher,\n      )\n    }\n  }\n}\n\n/**\n * Get AWS SDK client configuration with proxy support\n * Returns configuration object that can be spread into AWS service client constructors\n */\nexport async function getAWSClientProxyConfig(): Promise<object> {\n  const proxyUrl = getProxyUrl()\n\n  if (!proxyUrl) {\n    return {}\n  }\n\n  const [{ NodeHttpHandler }, { defaultProvider }] = await Promise.all([\n    import('@smithy/node-http-handler'),\n    import('@aws-sdk/credential-provider-node'),\n  ])\n\n  const agent = createHttpsProxyAgent(proxyUrl)\n  const requestHandler = new NodeHttpHandler({\n    httpAgent: agent,\n    httpsAgent: agent,\n  })\n\n  return {\n    requestHandler,\n    credentials: defaultProvider({\n      clientConfig: { requestHandler },\n    }),\n  }\n}\n\n/**\n * Clear proxy agent cache.\n */\nexport function clearProxyCache(): void {\n  getProxyAgent.cache.clear?.()\n  logForDebugging('Cleared proxy agent cache')\n}\n", "import memoize from 'lodash-es/memoize.js'\nimport { refreshAndGetAwsCredentials } from '../auth.js'\nimport { getAWSRegion, isEnvTruthy } from '../envUtils.js'\nimport { logError } from '../log.js'\nimport { getAWSClientProxyConfig } from '../proxy.js'\n\nexport const getBedrockInferenceProfiles = memoize(async function (): Promise<\n  string[]\n> {\n  const [client, { ListInferenceProfilesCommand }] = await Promise.all([\n    createBedrockClient(),\n    import('@aws-sdk/client-bedrock'),\n  ])\n  const allProfiles = []\n  let nextToken: string | undefined\n\n  try {\n    do {\n      const command = new ListInferenceProfilesCommand({\n        ...(nextToken && { nextToken }),\n        typeEquals: 'SYSTEM_DEFINED',\n      })\n      const response = await client.send(command)\n\n      if (response.inferenceProfileSummaries) {\n        allProfiles.push(...response.inferenceProfileSummaries)\n      }\n\n      nextToken = response.nextToken\n    } while (nextToken)\n\n    // Filter for Anthropic models (SYSTEM_DEFINED filtering handled in query)\n    return allProfiles\n      .filter(profile => profile.inferenceProfileId?.includes('anthropic'))\n      .map(profile => profile.inferenceProfileId)\n      .filter(Boolean) as string[]\n  } catch (error) {\n    logError(error as Error)\n    throw error\n  }\n})\n\nexport function findFirstMatch(\n  profiles: string[],\n  substring: string,\n): string | null {\n  return profiles.find(p => p.includes(substring)) ?? null\n}\n\nasync function createBedrockClient() {\n  const { BedrockClient } = await import('@aws-sdk/client-bedrock')\n  // Match the Anthropic Bedrock SDK's region behavior exactly:\n  // - Reads AWS_REGION or AWS_DEFAULT_REGION env vars (not AWS config files)\n  // - Falls back to 'us-east-1' if neither is set\n  // This ensures we query profiles from the same region the client will use\n  const region = getAWSRegion()\n\n  const skipAuth = isEnvTruthy(process.env.CLAUDE_CODE_SKIP_BEDROCK_AUTH)\n\n  const clientConfig: ConstructorParameters<typeof BedrockClient>[0] = {\n    region,\n    ...(process.env.ANTHROPIC_BEDROCK_BASE_URL && {\n      endpoint: process.env.ANTHROPIC_BEDROCK_BASE_URL,\n    }),\n    ...(await getAWSClientProxyConfig()),\n    ...(skipAuth && {\n      requestHandler: new (\n        await import('@smithy/node-http-handler')\n      ).NodeHttpHandler(),\n      httpAuthSchemes: [\n        {\n          schemeId: 'smithy.api#noAuth',\n          identityProvider: () => async () => ({}),\n          signer: new (await import('@smithy/core')).NoAuthSigner(),\n        },\n      ],\n      httpAuthSchemeProvider: () => [{ schemeId: 'smithy.api#noAuth' }],\n    }),\n  }\n\n  if (!skipAuth && !process.env.AWS_BEARER_TOKEN_BEDROCK) {\n    // Only refresh credentials if not using API key authentication\n    const cachedCredentials = await refreshAndGetAwsCredentials()\n    if (cachedCredentials) {\n      clientConfig.credentials = {\n        accessKeyId: cachedCredentials.accessKeyId,\n        secretAccessKey: cachedCredentials.secretAccessKey,\n        sessionToken: cachedCredentials.sessionToken,\n      }\n    }\n  }\n\n  return new BedrockClient(clientConfig)\n}\n\nexport async function createBedrockRuntimeClient() {\n  const { BedrockRuntimeClient } = await import(\n    '@aws-sdk/client-bedrock-runtime'\n  )\n  const region = getAWSRegion()\n  const skipAuth = isEnvTruthy(process.env.CLAUDE_CODE_SKIP_BEDROCK_AUTH)\n\n  const clientConfig: ConstructorParameters<typeof BedrockRuntimeClient>[0] = {\n    region,\n    ...(process.env.ANTHROPIC_BEDROCK_BASE_URL && {\n      endpoint: process.env.ANTHROPIC_BEDROCK_BASE_URL,\n    }),\n    ...(await getAWSClientProxyConfig()),\n    ...(skipAuth && {\n      // BedrockRuntimeClient defaults to HTTP/2 without fallback\n      // proxy servers may not support this, so we explicitly force HTTP/1.1\n      requestHandler: new (\n        await import('@smithy/node-http-handler')\n      ).NodeHttpHandler(),\n      httpAuthSchemes: [\n        {\n          schemeId: 'smithy.api#noAuth',\n          identityProvider: () => async () => ({}),\n          signer: new (await import('@smithy/core')).NoAuthSigner(),\n        },\n      ],\n      httpAuthSchemeProvider: () => [{ schemeId: 'smithy.api#noAuth' }],\n    }),\n  }\n\n  if (!skipAuth && !process.env.AWS_BEARER_TOKEN_BEDROCK) {\n    // Only refresh credentials if not using API key authentication\n    const cachedCredentials = await refreshAndGetAwsCredentials()\n    if (cachedCredentials) {\n      clientConfig.credentials = {\n        accessKeyId: cachedCredentials.accessKeyId,\n        secretAccessKey: cachedCredentials.secretAccessKey,\n        sessionToken: cachedCredentials.sessionToken,\n      }\n    }\n  }\n\n  return new BedrockRuntimeClient(clientConfig)\n}\n\nexport const getInferenceProfileBackingModel = memoize(async function (\n  profileId: string,\n): Promise<string | null> {\n  try {\n    const [client, { GetInferenceProfileCommand }] = await Promise.all([\n      createBedrockClient(),\n      import('@aws-sdk/client-bedrock'),\n    ])\n    const command = new GetInferenceProfileCommand({\n      inferenceProfileIdentifier: profileId,\n    })\n    const response = await client.send(command)\n\n    if (!response.models || response.models.length === 0) {\n      return null\n    }\n\n    // Use the first model as the primary backing model for cost calculation\n    // In practice, application inference profiles typically load balance between\n    // similar models with the same cost structure\n    const primaryModel = response.models[0]\n    if (!primaryModel?.modelArn) {\n      return null\n    }\n\n    // Extract model name from ARN\n    // ARN format: arn:aws:bedrock:region:account:foundation-model/model-name\n    const lastSlashIndex = primaryModel.modelArn.lastIndexOf('/')\n    return lastSlashIndex >= 0\n      ? primaryModel.modelArn.substring(lastSlashIndex + 1)\n      : primaryModel.modelArn\n  } catch (error) {\n    logError(error as Error)\n    return null\n  }\n})\n\n/**\n * Check if a model ID is a foundation model (e.g., \"anthropic.claude-sonnet-4-5-20250929-v1:0\")\n */\nexport function isFoundationModel(modelId: string): boolean {\n  return modelId.startsWith('anthropic.')\n}\n\n/**\n * Cross-region inference profile prefixes for Bedrock.\n * These prefixes allow routing requests to models in specific regions.\n */\nconst BEDROCK_REGION_PREFIXES = ['us', 'eu', 'apac', 'global'] as const\n\n/**\n * Extract the model/inference profile ID from a Bedrock ARN.\n * If the input is not an ARN, returns it unchanged.\n *\n * ARN format: arn:aws:bedrock:<region>:<account>:inference-profile/<profile-id>\n * Also handles: arn:aws:bedrock:<region>:<account>:application-inference-profile/<profile-id>\n * And foundation model ARNs: arn:aws:bedrock:<region>::foundation-model/<model-id>\n */\nexport function extractModelIdFromArn(modelId: string): string {\n  if (!modelId.startsWith('arn:')) {\n    return modelId\n  }\n  const lastSlashIndex = modelId.lastIndexOf('/')\n  if (lastSlashIndex === -1) {\n    return modelId\n  }\n  return modelId.substring(lastSlashIndex + 1)\n}\n\nexport type BedrockRegionPrefix = (typeof BEDROCK_REGION_PREFIXES)[number]\n\n/**\n * Extract the region prefix from a Bedrock cross-region inference model ID.\n * Handles both plain model IDs and full ARN format.\n * For example:\n * - \"eu.anthropic.claude-sonnet-4-5-20250929-v1:0\" \u2192 \"eu\"\n * - \"us.anthropic.claude-3-7-sonnet-20250219-v1:0\" \u2192 \"us\"\n * - \"arn:aws:bedrock:ap-northeast-2:123:inference-profile/global.anthropic.claude-opus-4-6-v1\" \u2192 \"global\"\n * - \"anthropic.claude-3-5-sonnet-20241022-v2:0\" \u2192 undefined (foundation model)\n * - \"claude-sonnet-4-5-20250929\" \u2192 undefined (first-party format)\n */\nexport function getBedrockRegionPrefix(\n  modelId: string,\n): BedrockRegionPrefix | undefined {\n  // Extract the inference profile ID from ARN format if present\n  // ARN format: arn:aws:bedrock:<region>:<account>:inference-profile/<profile-id>\n  const effectiveModelId = extractModelIdFromArn(modelId)\n\n  for (const prefix of BEDROCK_REGION_PREFIXES) {\n    if (effectiveModelId.startsWith(`${prefix}.anthropic.`)) {\n      return prefix\n    }\n  }\n  return undefined\n}\n\n/**\n * Apply a region prefix to a Bedrock model ID.\n * If the model already has a different region prefix, it will be replaced.\n * If the model is a foundation model (anthropic.*), the prefix will be added.\n * If the model is not a Bedrock model, it will be returned as-is.\n *\n * For example:\n * - applyBedrockRegionPrefix(\"us.anthropic.claude-sonnet-4-5-v1:0\", \"eu\") \u2192 \"eu.anthropic.claude-sonnet-4-5-v1:0\"\n * - applyBedrockRegionPrefix(\"anthropic.claude-sonnet-4-5-v1:0\", \"eu\") \u2192 \"eu.anthropic.claude-sonnet-4-5-v1:0\"\n * - applyBedrockRegionPrefix(\"claude-sonnet-4-5-20250929\", \"eu\") \u2192 \"claude-sonnet-4-5-20250929\" (not a Bedrock model)\n */\nexport function applyBedrockRegionPrefix(\n  modelId: string,\n  prefix: BedrockRegionPrefix,\n): string {\n  // Check if it already has a region prefix and replace it\n  const existingPrefix = getBedrockRegionPrefix(modelId)\n  if (existingPrefix) {\n    return modelId.replace(`${existingPrefix}.`, `${prefix}.`)\n  }\n\n  // Check if it's a foundation model (anthropic.*) and add the prefix\n  if (isFoundationModel(modelId)) {\n    return `${prefix}.${modelId}`\n  }\n\n  // Not a Bedrock model format, return as-is\n  return modelId\n}\n", "import { existsSync, readFileSync } from 'fs'\nimport { homedir } from 'os'\nimport { join } from 'path'\n\ntype JsonRecord = Record<string, unknown>\n\nexport function loadOpenCodeApiKeyFromAuthFile(): string | null {\n  const fromContent = parseJsonObject(process.env.OPENCODE_AUTH_CONTENT)\n  if (fromContent) {\n    const key = readOpenCodeCredential(fromContent)\n    if (key) return key\n  }\n\n  for (const file of openCodeCredentialFiles()) {\n    const raw = readJsonFile(file)\n    if (!raw) continue\n    const key = readOpenCodeCredential(raw)\n    if (key) return key\n  }\n\n  return null\n}\n\nfunction openCodeCredentialFiles(): string[] {\n  const dataDirs = new Set<string>()\n  const xdgData = process.env.XDG_DATA_HOME\n  if (xdgData) dataDirs.add(join(xdgData, 'opencode'))\n  dataDirs.add(join(homedir(), '.local', 'share', 'opencode'))\n  if (process.env.LOCALAPPDATA) {\n    dataDirs.add(join(process.env.LOCALAPPDATA, 'opencode'))\n  }\n\n  const files: string[] = []\n  for (const dir of dataDirs) {\n    files.push(join(dir, 'account.json'))\n    files.push(join(dir, 'auth.json'))\n  }\n  return files\n}\n\nfunction readJsonFile(file: string): JsonRecord | null {\n  try {\n    if (!existsSync(file)) return null\n    return parseJsonObject(readFileSync(file, 'utf-8'))\n  } catch {\n    return null\n  }\n}\n\nfunction parseJsonObject(raw: string | undefined): JsonRecord | null {\n  if (!raw) return null\n  try {\n    const parsed = JSON.parse(raw)\n    return isRecord(parsed) ? parsed : null\n  } catch {\n    return null\n  }\n}\n\nfunction readOpenCodeCredential(raw: JsonRecord): string | null {\n  return readOpenCodeAccountJson(raw) ?? readOpenCodeLegacyAuth(raw)\n}\n\nfunction readOpenCodeLegacyAuth(raw: JsonRecord): string | null {\n  const credential = raw.opencode\n  if (!isRecord(credential)) return null\n  return credential.type === 'api' && typeof credential.key === 'string'\n    ? credential.key\n    : null\n}\n\nfunction readOpenCodeAccountJson(raw: JsonRecord): string | null {\n  if (raw.version !== 2 || !isRecord(raw.accounts)) return null\n\n  const activeID = isRecord(raw.active) && typeof raw.active.opencode === 'string'\n    ? raw.active.opencode\n    : undefined\n  if (activeID) {\n    const activeKey = readOpenCodeAccount(raw.accounts[activeID])\n    if (activeKey) return activeKey\n  }\n\n  for (const account of Object.values(raw.accounts)) {\n    const key = readOpenCodeAccount(account)\n    if (key) return key\n  }\n  return null\n}\n\nfunction readOpenCodeAccount(value: unknown): string | null {\n  if (!isRecord(value) || value.serviceID !== 'opencode') return null\n  const credential = value.credential\n  if (!isRecord(credential)) return null\n  return credential.type === 'api' && typeof credential.key === 'string'\n    ? credential.key\n    : null\n}\n\nfunction isRecord(value: unknown): value is JsonRecord {\n  return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n", "import { execFileNoThrow } from './execFileNoThrow.js'\n\nfunction validateUrl(url: string): void {\n  let parsedUrl: URL\n\n  try {\n    parsedUrl = new URL(url)\n  } catch (_error) {\n    throw new Error(`Invalid URL format: ${url}`)\n  }\n\n  // Validate URL protocol for security\n  if (parsedUrl.protocol !== 'http:' && parsedUrl.protocol !== 'https:') {\n    throw new Error(\n      `Invalid URL protocol: must use http:// or https://, got ${parsedUrl.protocol}`,\n    )\n  }\n}\n\n/**\n * Open a file or folder path using the system's default handler.\n * Uses `open` on macOS, `explorer` on Windows, `xdg-open` on Linux.\n */\nexport async function openPath(path: string): Promise<boolean> {\n  try {\n    const platform = process.platform\n    if (platform === 'win32') {\n      const { code } = await execFileNoThrow('explorer', [path])\n      return code === 0\n    }\n    const command = platform === 'darwin' ? 'open' : 'xdg-open'\n    const { code } = await execFileNoThrow(command, [path])\n    return code === 0\n  } catch (_) {\n    return false\n  }\n}\n\nexport async function openBrowser(url: string): Promise<boolean> {\n  try {\n    // Parse and validate the URL\n    validateUrl(url)\n\n    const browserEnv = process.env.BROWSER\n    const platform = process.platform\n\n    if (platform === 'win32') {\n      if (browserEnv) {\n        // browsers require shell, else they will treat this as a file:/// handle\n        const { code } = await execFileNoThrow(browserEnv, [`\"${url}\"`])\n        return code === 0\n      }\n      const { code } = await execFileNoThrow(\n        'rundll32',\n        ['url,OpenURL', url],\n        {},\n      )\n      return code === 0\n    } else {\n      const command =\n        browserEnv || (platform === 'darwin' ? 'open' : 'xdg-open')\n      const { code } = await execFileNoThrow(command, [url])\n      return code === 0\n    }\n  } catch (_) {\n    return false\n  }\n}\n", "/**\n * OpenAI OAuth2 PKCE flow for API access.\n *\n * Uses the same bundled OAuth client ID as OpenAI's Codex CLI\n * (a public PKCE client \u2014 no client secret needed).\n *\n * Flow:\n *   1. Generate PKCE code_verifier + code_challenge (S256)\n *   2. Start local HTTP server on 127.0.0.1:1455 for the redirect callback\n *   3. Open browser to OpenAI consent screen\n *   4. Exchange authorization code \u2192 id_token + access_token + refresh_token\n *   5. Token-exchange the id_token \u2192 API-capable access token\n *      (matches Codex's obtain_api_key() \u2014 the first access token is only\n *       valid for auth service calls, not the OpenAI API)\n *   6. Redirect browser to /success, store tokens, done\n *   7. Auto-refresh when expired\n *\n * No env vars required \u2014 works out of the box.\n * The user signs in with their ChatGPT / OpenAI account.\n */\n\nimport { createServer, type Server } from 'http'\nimport { randomBytes, createHash } from 'crypto'\nimport { execSync } from 'child_process'\nimport { saveProviderKey, loadProviderKey } from './api_key_manager.js'\nimport { openBrowser } from '../../../utils/browser.js'\n\n// \u2500\u2500\u2500 Bundled OAuth credentials (from openai/codex CLI) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Source: https://github.com/openai/codex \u2014 public PKCE client, no secret\nconst CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann'\n\n// \u2500\u2500\u2500 OAuth endpoints \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n// IMPORTANT: must be /oauth/authorize (not /authorize) \u2014 the shorter path\n// returns a blank / broken page in the browser.\nconst OPENAI_ISSUER = 'https://auth.openai.com'\nconst OPENAI_AUTH_URL = `${OPENAI_ISSUER}/oauth/authorize`\nconst OPENAI_TOKEN_URL = `${OPENAI_ISSUER}/oauth/token`\nconst REDIRECT_PATH = '/auth/callback'\nconst SUCCESS_PATH = '/success'\n// Codex CLI's registered port \u2014 OpenAI validates redirect URIs exactly\nconst DEFAULT_PORT = 1455\n\n// \u2500\u2500\u2500 Active server tracking \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Keeps a reference to the callback server so repeat /login calls can\n// close the stale one instead of failing with EADDRINUSE.\nlet _activeServer: Server | null = null\n\nfunction _cleanupActiveServer(): void {\n  if (_activeServer) {\n    try { _activeServer.close() } catch {}\n    _activeServer = null\n  }\n}\n\n/**\n * Force-close any TCP server in this process that is bound to the given port.\n * Handles the edge case where a previous /login created a callback server\n * with old code that didn't track it in _activeServer.\n */\nfunction _forceCloseServersOnPort(port: number): void {\n  try {\n    // Node internals: _getActiveHandles() returns all open handles\n    // (sockets, servers, timers, etc.) in the current event loop.\n    const handles = (process as any)._getActiveHandles?.() as any[] | undefined\n    if (!handles) return\n    for (const h of handles) {\n      // TCP servers have a .close() method and an address() that returns\n      // { port, address, family } when bound.\n      if (typeof h?.close === 'function' && typeof h?.address === 'function') {\n        try {\n          const addr = h.address()\n          if (addr && addr.port === port) {\n            h.close()\n          }\n        } catch { /* not a server or already closed */ }\n      }\n    }\n  } catch { /* _getActiveHandles may not exist in all runtimes */ }\n}\n\n// Clean up on process exit so we never leave a stale listener behind.\n// Only use 'exit' \u2014 adding SIGINT/SIGTERM listeners can interfere with\n// the main graceful shutdown flow in gracefulShutdown.ts.\nprocess.on('exit', _cleanupActiveServer)\n\n// Must match the scopes the Codex CLI public client is registered for.\n// Only these 4 are accepted \u2014 adding api.connectors.* or api.responses.*\n// triggers \"invalid_scope\" on the consent screen.\nconst SCOPES = 'openid profile email offline_access'\n\ninterface OpenAIOAuthTokens {\n  access_token: string\n  id_token?: string\n  refresh_token?: string\n  expires_in: number\n  token_type: string\n  scope?: string\n}\n\ninterface StoredOpenAITokens {\n  accessToken: string   // API key from token exchange (for api.openai.com)\n  sessionToken: string  // First-exchange access_token (for chatgpt.com/backend-api)\n  refreshToken: string\n  expiresAt: number     // Unix timestamp ms\n}\n\n// \u2500\u2500\u2500 PKCE Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction generateCodeVerifier(): string {\n  // 96 random bytes \u2192 128 base64url characters.\n  // Matches CLIProxyAPI's PKCE implementation exactly.\n  return randomBytes(96).toString('base64url')\n}\n\nfunction generateCodeChallenge(verifier: string): string {\n  return createHash('sha256').update(verifier).digest('base64url')\n}\n\n// \u2500\u2500\u2500 OAuth Flow \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Start the OpenAI OAuth PKCE flow.\n * Opens the user's browser to sign in with their OpenAI/ChatGPT account.\n * No configuration required \u2014 uses bundled Codex CLI credentials.\n */\nexport async function startOpenAIOAuthFlow(): Promise<{\n  accessToken: string\n  refreshToken: string\n}> {\n  const codeVerifier = generateCodeVerifier()\n  const codeChallenge = generateCodeChallenge(codeVerifier)\n  let state = randomBytes(16).toString('hex')\n\n  // Must use port 1455 \u2014 matches Codex CLI's registered redirect URI.\n  // OpenAI validates the redirect URI exactly, so we cannot fall back\n  // to a random free port.\n  const port = DEFAULT_PORT\n  const redirectUri = `http://localhost:${port}${REDIRECT_PATH}`\n\n  // Close any stale callback server from a previous /login attempt\n  // in this process before trying to bind the port.\n  _cleanupActiveServer()\n  _forceCloseServersOnPort(port)\n\n  // Start the callback server BEFORE opening the browser so the redirect\n  // always has something to talk to. If the port is in use, the retry\n  // logic below will try to free it automatically.\n  const callbackReady = startCallbackServer(port, state)\n\n  // Build authorization URL.\n  //   - `id_token_add_organizations=true` + `codex_cli_simplified_flow=true`\n  //     are required by OpenAI's Codex OAuth client \u2014 omitting either one\n  //     triggers a blank response page in the browser.\n  //   - `prompt=login` forces a fresh auth every time, which is how Codex\n  //     CLI and CLIProxyAPI both call it. Without this, re-running /login\n  //     can reuse a stale session cookie and dump the user on a broken\n  //     \"Continue with email / Google\" screen.\n  //   - No `originator` param \u2014 CLIProxyAPI doesn't send one, and adding\n  //     it was correlated with the email/google redirection error users\n  //     kept hitting.\n  const authUrl = new URL(OPENAI_AUTH_URL)\n  authUrl.searchParams.set('response_type', 'code')\n  authUrl.searchParams.set('client_id', CLIENT_ID)\n  authUrl.searchParams.set('redirect_uri', redirectUri)\n  authUrl.searchParams.set('scope', SCOPES)\n  authUrl.searchParams.set('code_challenge', codeChallenge)\n  authUrl.searchParams.set('code_challenge_method', 'S256')\n  authUrl.searchParams.set('id_token_add_organizations', 'true')\n  authUrl.searchParams.set('codex_cli_simplified_flow', 'true')\n  authUrl.searchParams.set('prompt', 'login')\n  authUrl.searchParams.set('state', state)\n\n  // Wait until the server is actually listening before opening the browser.\n  // If the port is in use, try to free it and retry once \u2014 this handles\n  // stale listeners from crashed sessions or the real Codex CLI.\n  let authCodePromise: Promise<string>\n  try {\n    ;({ authCodePromise } = await callbackReady)\n  } catch (err: any) {\n    if (err?.message?.includes('Port') && err?.message?.includes('in use')) {\n      // Try to free the port and retry once\n      const freed = await _tryFreePort(port)\n      if (freed) {\n        const retryState = randomBytes(16).toString('hex')\n        // Update the state in the auth URL (we haven't opened the browser yet)\n        state = retryState\n        authUrl.searchParams.set('state', retryState)\n        const retry = startCallbackServer(port, retryState)\n        ;({ authCodePromise } = await retry)\n      } else {\n        throw err\n      }\n    } else {\n      throw err\n    }\n  }\n\n  const authUrlString = authUrl.toString()\n  const opened = await openBrowser(authUrlString)\n  if (!opened) {\n    console.log(\n      `\\nOpen this URL in your browser to sign in with OpenAI:\\n${authUrlString}\\n`,\n    )\n  }\n\n  // Wait for the callback.\n  const authCode = await authCodePromise\n\n  // Step 1 \u2014 exchange authorization code for id_token + access_token + refresh_token.\n  const firstExchange = await fetch(OPENAI_TOKEN_URL, {\n    method: 'POST',\n    headers: {\n      'Content-Type': 'application/x-www-form-urlencoded',\n      'Accept': 'application/json',\n    },\n    body: new URLSearchParams({\n      grant_type: 'authorization_code',\n      code: authCode,\n      client_id: CLIENT_ID,\n      redirect_uri: redirectUri,\n      code_verifier: codeVerifier,\n    }),\n  })\n\n  if (!firstExchange.ok) {\n    const errText = await firstExchange.text()\n    throw new Error(`OpenAI token exchange failed: ${errText}`)\n  }\n\n  const firstTokens = (await firstExchange.json()) as OpenAIOAuthTokens\n\n  // Step 2 \u2014 token-exchange the id_token for an API-key access token.\n  // Matches Codex's `obtain_api_key()`. The first-exchange access_token\n  // is only valid for the auth service; API calls need the token we get\n  // from this second exchange.\n  let apiAccessToken = firstTokens.access_token\n  if (firstTokens.id_token) {\n    try {\n      const exchange = await fetch(OPENAI_TOKEN_URL, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/x-www-form-urlencoded',\n          'Accept': 'application/json',\n        },\n        body: new URLSearchParams({\n          grant_type: 'urn:ietf:params:oauth:grant-type:token-exchange',\n          client_id: CLIENT_ID,\n          requested_token: 'openai-api-key',\n          subject_token: firstTokens.id_token,\n          subject_token_type: 'urn:ietf:params:oauth:token-type:id_token',\n        }),\n      })\n      if (exchange.ok) {\n        const exchanged = (await exchange.json()) as OpenAIOAuthTokens\n        if (exchanged.access_token) {\n          apiAccessToken = exchanged.access_token\n        }\n      }\n    } catch {\n      // Fall back to first-exchange token.\n    }\n  }\n\n  // Store tokens \u2014 keep both the API key AND the session token.\n  // The session token (first-exchange) is used for chatgpt.com/backend-api\n  // which is the endpoint that accepts the Responses API for Codex models.\n  const stored: StoredOpenAITokens = {\n    accessToken: apiAccessToken,\n    sessionToken: firstTokens.access_token,\n    refreshToken: firstTokens.refresh_token ?? '',\n    expiresAt: Date.now() + firstTokens.expires_in * 1000,\n  }\n  saveProviderKey('openai_oauth', JSON.stringify(stored))\n\n  return {\n    accessToken: apiAccessToken,\n    refreshToken: firstTokens.refresh_token ?? '',\n  }\n}\n\n/**\n * Refresh an expired OpenAI OAuth access token.\n */\nexport async function refreshOpenAIToken(refreshToken: string): Promise<string> {\n  const response = await fetch(OPENAI_TOKEN_URL, {\n    method: 'POST',\n    headers: {\n      'Content-Type': 'application/x-www-form-urlencoded',\n      'Accept': 'application/json',\n    },\n    body: new URLSearchParams({\n      client_id: CLIENT_ID,\n      refresh_token: refreshToken,\n      grant_type: 'refresh_token',\n    }),\n  })\n\n  if (!response.ok) {\n    const errText = await response.text()\n    throw new Error(`OpenAI token refresh failed: ${errText}`)\n  }\n\n  const tokens = (await response.json()) as OpenAIOAuthTokens\n\n  // If the refresh response contains an id_token, do the second exchange\n  // again so the stored token is always API-capable.\n  let apiAccessToken = tokens.access_token\n  if (tokens.id_token) {\n    try {\n      const exchange = await fetch(OPENAI_TOKEN_URL, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/x-www-form-urlencoded',\n          'Accept': 'application/json',\n        },\n        body: new URLSearchParams({\n          grant_type: 'urn:ietf:params:oauth:grant-type:token-exchange',\n          client_id: CLIENT_ID,\n          requested_token: 'openai-api-key',\n          subject_token: tokens.id_token,\n          subject_token_type: 'urn:ietf:params:oauth:token-type:id_token',\n        }),\n      })\n      if (exchange.ok) {\n        const exchanged = (await exchange.json()) as OpenAIOAuthTokens\n        if (exchanged.access_token) {\n          apiAccessToken = exchanged.access_token\n        }\n      }\n    } catch {\n      // Fall back to the refresh-response access token.\n    }\n  }\n\n  // Update stored tokens \u2014 keep the session token (first-exchange access_token)\n  // for chatgpt.com/backend-api access.\n  const stored: StoredOpenAITokens = {\n    accessToken: apiAccessToken,\n    sessionToken: tokens.access_token,\n    refreshToken: tokens.refresh_token ?? refreshToken,\n    expiresAt: Date.now() + tokens.expires_in * 1000,\n  }\n  saveProviderKey('openai_oauth', JSON.stringify(stored))\n\n  return apiAccessToken\n}\n\n/**\n * Get the stored OpenAI session token (first-exchange access_token).\n * This is needed for the ChatGPT backend API (chatgpt.com/backend-api/codex)\n * which is the endpoint that accepts the Responses API for GPT-5 Codex models.\n * Returns null if no tokens are stored or expired.\n */\nexport function getOpenAISessionToken(): string | null {\n  const stored = loadProviderKey('openai_oauth')\n  if (!stored) return null\n  try {\n    const tokens = JSON.parse(stored) as StoredOpenAITokens\n    if (Date.now() > tokens.expiresAt - 5 * 60 * 1000) return null\n    return tokens.sessionToken || null\n  } catch {\n    return null\n  }\n}\n\n/**\n * Get a valid OpenAI OAuth access token, refreshing if expired.\n * Returns null if no OAuth tokens are stored.\n */\nexport async function getOpenAIOAuthToken(): Promise<string | null> {\n  const stored = loadProviderKey('openai_oauth')\n  if (!stored) return null\n\n  try {\n    const tokens = JSON.parse(stored) as StoredOpenAITokens\n\n    // Check if token is expired (with 5 min buffer)\n    if (Date.now() > tokens.expiresAt - 5 * 60 * 1000) {\n      if (tokens.refreshToken) {\n        return await refreshOpenAIToken(tokens.refreshToken)\n      }\n      return null // No refresh token, need full re-auth\n    }\n\n    return tokens.accessToken\n  } catch {\n    return null\n  }\n}\n\n// \u2500\u2500\u2500 Internal helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Try to free a port by killing whatever process is listening on it.\n * Returns true if the port was successfully freed (or is now free).\n *\n * This handles the common case where a previous claudex session crashed\n * and left a stale callback server behind, or the real Codex CLI is\n * occupying the port.  Tau is a standalone tool and should not\n * require users to hunt down stale listeners manually.\n */\nasync function _tryFreePort(port: number): Promise<boolean> {\n  try {\n    // \u2500\u2500 Step 1: Same-process stale server \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    // The most common case: a previous /login in THIS claudex session\n    // left a callback server alive. _cleanupActiveServer only works if\n    // the module-level _activeServer was set, but after a hot-reload or\n    // first run with new code the reference may be null even though an\n    // old server is still bound.  We use a brute-force approach: try to\n    // find the port owner's PID and compare with process.pid.  If it's\n    // us, we know there's a dangling server inside our own event loop\n    // that we can't reach via _activeServer.  In that case we create a\n    // throw-away connection to the port, which lets us confirm it's\n    // reachable, then we use the exclusive trick below.\n    const ownPid = String(process.pid)\n    let portOwnedBySelf = false\n\n    if (process.platform === 'win32') {\n      try {\n        const out = execSync(\n          `netstat -ano | findstr \":${port}\" | findstr \"LISTENING\"`,\n          { encoding: 'utf-8', timeout: 5000 },\n        )\n        const pids = new Set<string>()\n        for (const line of out.trim().split('\\n')) {\n          const parts = line.trim().split(/\\s+/)\n          const pid = parts[parts.length - 1]\n          if (pid && pid !== '0' && /^\\d+$/.test(pid)) pids.add(pid)\n        }\n\n        if (pids.has(ownPid)) {\n          portOwnedBySelf = true\n        }\n\n        // Kill only external processes (never ourselves)\n        for (const pid of pids) {\n          if (pid === ownPid) continue\n          try {\n            execSync(`taskkill /F /PID ${pid}`, {\n              encoding: 'utf-8',\n              timeout: 5000,\n              stdio: 'ignore',\n            })\n          } catch { /* process may already be gone */ }\n        }\n      } catch { /* netstat failed \u2014 port may already be free */ }\n    } else {\n      // macOS / Linux\n      try {\n        const pidOutput = execSync(`lsof -ti:${port} 2>/dev/null`, {\n          encoding: 'utf-8',\n          timeout: 5000,\n        }).trim()\n        if (pidOutput) {\n          const pids = pidOutput.split('\\n').map(p => p.trim())\n          if (pids.includes(ownPid)) {\n            portOwnedBySelf = true\n          }\n          // Kill only external processes\n          const externalPids = pids.filter(p => p !== ownPid).join(' ')\n          if (externalPids) {\n            execSync(`kill -9 ${externalPids}`, {\n              encoding: 'utf-8',\n              timeout: 5000,\n              stdio: 'ignore',\n            })\n          }\n        }\n      } catch { /* nothing found */ }\n    }\n\n    // \u2500\u2500 Step 2: Same-process \u2014 force-close the orphaned server \u2500\u2500\u2500\u2500\u2500\n    // When the stale server is in our own process, we can't taskkill\n    // ourselves. Instead, enumerate all active Node handles and close\n    // any TCP server bound to this port.\n    if (portOwnedBySelf) {\n      _forceCloseServersOnPort(port)\n      // Small delay for the OS to process the close\n      await new Promise(r => setTimeout(r, 300))\n    }\n\n    // Give the OS a moment to release the socket\n    await new Promise(r => setTimeout(r, 600))\n    return true\n  } catch {\n    return false\n  }\n}\n\n/**\n * Start the local callback server and return a promise for the auth code.\n *\n * Resolves once the server is actually listening (so the caller can open\n * the browser safely). The returned `authCodePromise` resolves when the\n * browser hits /auth/callback, or rejects on timeout / error / mismatched\n * state / port-in-use.\n *\n * We bind to all interfaces (dual-stack) so `localhost` works regardless\n * of whether the browser resolves it to ::1 (IPv6) or 127.0.0.1 (IPv4).\n * Matches CLIProxyAPI's `:port` binding.\n */\nfunction startCallbackServer(\n  port: number,\n  expectedState: string,\n): Promise<{ authCodePromise: Promise<string> }> {\n  return new Promise((resolveReady, rejectReady) => {\n    let resolveCode: (code: string) => void = () => {}\n    let rejectCode: (err: Error) => void = () => {}\n    const authCodePromise = new Promise<string>((res, rej) => {\n      resolveCode = res\n      rejectCode = rej\n    })\n\n    const timeout = setTimeout(\n      () => {\n        try {\n          server.close()\n        } catch {}\n        rejectCode(new Error('OAuth callback timed out after 5 minutes'))\n      },\n      5 * 60 * 1000,\n    )\n\n    const closeServer = () => {\n      try { server.close() } catch {}\n      if (_activeServer === server) _activeServer = null\n    }\n\n    const server = createServer((req, res) => {\n      const url = new URL(req.url ?? '', `http://localhost:${port}`)\n\n      if (url.pathname === REDIRECT_PATH) {\n        const code = url.searchParams.get('code')\n        const error = url.searchParams.get('error')\n        const state = url.searchParams.get('state')\n\n        if (error) {\n          res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' })\n          res.end(renderErrorPage(`OpenAI returned: ${error}`))\n          clearTimeout(timeout)\n          setTimeout(closeServer, 1000)\n          rejectCode(new Error(`OpenAI OAuth error: ${error}`))\n          return\n        }\n\n        if (state !== expectedState) {\n          res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' })\n          res.end(renderErrorPage('Invalid state parameter.'))\n          clearTimeout(timeout)\n          setTimeout(closeServer, 1000)\n          rejectCode(new Error('OpenAI OAuth error: invalid state parameter'))\n          return\n        }\n\n        if (code) {\n          // 302 \u2192 /success so the browser lands on a clean confirmation\n          // page instead of the inline HTML we'd otherwise return.\n          res.writeHead(302, { Location: SUCCESS_PATH })\n          res.end()\n          clearTimeout(timeout)\n          // Keep the server alive long enough to serve /success before\n          // closing \u2014 otherwise the browser sees \"connection refused\".\n          setTimeout(closeServer, 2000)\n          resolveCode(code)\n          return\n        }\n      }\n\n      if (url.pathname === SUCCESS_PATH) {\n        res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' })\n        res.end(renderSuccessPage())\n        return\n      }\n\n      res.writeHead(404)\n      res.end()\n    })\n\n    // Don't let the callback server keep the process alive if the user\n    // cancels / Ctrl-C's out of the login flow.\n    server.unref()\n\n    server.once('error', (err: NodeJS.ErrnoException) => {\n      clearTimeout(timeout)\n      if (err.code === 'EADDRINUSE') {\n        const msg =\n          `Port ${port} is in use \u2014 attempting to free it automatically. ` +\n          `If this keeps failing, check for stale node/codex processes ` +\n          `on port ${port}.`\n        rejectReady(new Error(msg))\n        rejectCode(new Error(msg))\n      } else {\n        rejectReady(err)\n        rejectCode(err)\n      }\n    })\n\n    // Track the server so we can clean it up on repeat /login or process exit.\n    _activeServer = server\n\n    // Bind to all interfaces (dual-stack) so `localhost` reaches us\n    // regardless of whether the browser resolves it to ::1 (IPv6) or\n    // 127.0.0.1 (IPv4). Matches CLIProxyAPI's `:port` binding.\n    server.listen(port, () => {\n      resolveReady({ authCodePromise })\n    })\n  })\n}\n\nfunction renderSuccessPage(): string {\n  return `<!doctype html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <title>Signed in - Tau</title>\n  <style>\n    :root { color-scheme: light dark; }\n    * { box-sizing: border-box; }\n    body {\n      font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;\n      display: flex; align-items: center; justify-content: center;\n      min-height: 100vh; margin: 0;\n      background: linear-gradient(135deg, #0f172a 0%, #1e293b 100%);\n      color: #e2e8f0;\n    }\n    .card {\n      background: rgba(30, 41, 59, 0.85);\n      border: 1px solid rgba(148, 163, 184, 0.2);\n      border-radius: 16px;\n      padding: 48px 64px;\n      text-align: center;\n      box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);\n      max-width: 420px;\n    }\n    h1 { margin: 0 0 12px; font-size: 26px; font-weight: 600; color: #f8fafc; }\n    p { margin: 0; color: #94a3b8; font-size: 15px; line-height: 1.5; }\n    .check {\n      width: 56px; height: 56px; margin: 0 auto 24px;\n      border-radius: 50%;\n      background: #10b981;\n      display: flex; align-items: center; justify-content: center;\n      font-size: 28px; color: white; font-weight: 700;\n    }\n  </style>\n</head>\n<body>\n  <main class=\"card\">\n    <div class=\"check\">&#10003;</div>\n    <h1>Signed in</h1>\n    <p>You can close this window and return to Tau.</p>\n  </main>\n  <script>setTimeout(function(){ try { window.close() } catch (_) {} }, 1500);</script>\n</body>\n</html>`\n}\n\nfunction renderErrorPage(msg: string): string {\n  return `<!doctype html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <title>Authentication failed - Tau</title>\n  <style>\n    body {\n      font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;\n      padding: 40px; background: #1e293b; color: #fee2e2;\n      min-height: 100vh; margin: 0;\n    }\n    h1 { color: #fca5a5; margin-bottom: 16px; }\n    code { background: #0f172a; padding: 2px 6px; border-radius: 4px; color: #e2e8f0; }\n    p { line-height: 1.6; max-width: 540px; }\n  </style>\n</head>\n<body>\n  <h1>Authentication failed</h1>\n  <p>${escapeHtml(msg)}</p>\n  <p>Return to Tau and run <code>/login</code> to try again.</p>\n</body>\n</html>`\n}\n\nfunction escapeHtml(s: string): string {\n  return s.replace(/[&<>\"']/g, c => {\n    const map: Record<string, string> = {\n      '&': '&amp;',\n      '<': '&lt;',\n      '>': '&gt;',\n      '\"': '&quot;',\n      \"'\": '&#39;',\n    }\n    return map[c] ?? c\n  })\n}\n", "/**\r\n * OAuth flows for the Phase 4 providers (v0.4.0):\r\n *\r\n *   - KiloCode       Custom device-auth flow (POST /api/device-auth/codes)\r\n *   - Cline          WorkOS device-code \u2192 Cline token register\n *   - iFlow          OAuth2 authorization-code + Basic Auth exchange\r\n *   - GitHub Copilot OAuth2 device-code flow\r\n *   - Kiro           AWS SSO OIDC device-code (Builder ID path)\r\n *   - Cursor         Native browser login (Cursor deep-link + auth poll)\r\n *\r\n * Each flow returns { accessToken, refreshToken } and writes the blob to\r\n * provider-keys.json under `<provider>_oauth`, matching the shape used by\r\n * every other third-party provider (see `google_oauth.ts`, `openai_oauth.ts`).\r\n *\r\n * All credentials / client IDs are hardcoded from the 9router reference\r\n * (same constants the Kiro/Cursor/Copilot desktop apps themselves ship).\r\n * These are \"public installed client\" values per Google/AWS/GitHub OAuth\r\n * spec \u2014 not confidential secrets \u2014 so they can live in source.\r\n */\r\n\r\nimport { createServer } from 'http'\r\nimport { randomBytes, createHash, randomUUID } from 'crypto'\r\nimport { saveProviderKey, loadProviderKey, deleteProviderKey } from './api_key_manager.js'\r\nimport { openBrowser } from '../../../utils/browser.js'\r\n\r\n// \u2500\u2500\u2500 Shared helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\ninterface StoredOAuthBlob {\r\n  accessToken: string\r\n  refreshToken?: string\r\n  expiresAt?: number  // epoch ms\r\n  /** Provider-specific extras (orgId, profileArn, clientId, region, \u2026). */\r\n  meta?: Record<string, unknown>\r\n}\r\n\r\nexport interface CopilotPlanInfo {\r\n  sku?: string\r\n  individual?: boolean\r\n  limitedUserQuotas?: {\r\n    chat?: number\r\n    completions?: number\r\n  }\r\n  limitedUserResetDate?: number\r\n}\r\n\r\ninterface KiroTokenPayload {\r\n  accessToken?: string\r\n  refreshToken?: string\r\n  expiresIn?: number\r\n  profileArn?: string | null\r\n}\r\n\r\nconst TOKEN_REFRESH_BUFFER_MS = 5 * 60 * 1000\r\n\r\nfunction _saveTokens(\r\n  storageKey: string,\r\n  tokens: { accessToken: string; refreshToken?: string; expiresIn?: number; meta?: Record<string, unknown> },\r\n): void {\r\n  const blob: StoredOAuthBlob = {\r\n    accessToken: tokens.accessToken,\r\n    refreshToken: tokens.refreshToken,\r\n    expiresAt: tokens.expiresIn ? Date.now() + tokens.expiresIn * 1000 : undefined,\r\n    meta: tokens.meta,\r\n  }\r\n  saveProviderKey(storageKey, JSON.stringify(blob))\r\n}\r\n\r\nfunction _loadTokens(storageKey: string): StoredOAuthBlob | null {\r\n  const raw = loadProviderKey(storageKey)\r\n  if (!raw) return null\r\n  try {\r\n    return JSON.parse(raw) as StoredOAuthBlob\r\n  } catch {\r\n    return null\r\n  }\r\n}\r\n\r\nfunction _pkce(): { verifier: string; challenge: string } {\r\n  const verifier = randomBytes(32).toString('base64url')\r\n  const challenge = createHash('sha256').update(verifier).digest('base64url')\r\n  return { verifier, challenge }\r\n}\r\n\r\nfunction _sleep(ms: number): Promise<void> {\r\n  return new Promise((resolve) => setTimeout(resolve, ms))\r\n}\r\n\r\nfunction _getJwtExpirySeconds(token: string): number | undefined {\r\n  const parts = token.split('.')\r\n  if (parts.length < 2) return undefined\r\n\r\n  try {\r\n    const payload = JSON.parse(Buffer.from(parts[1]!, 'base64url').toString('utf-8')) as {\r\n      exp?: number\r\n    }\r\n    if (typeof payload.exp !== 'number' || !Number.isFinite(payload.exp)) return undefined\r\n\r\n    const seconds = Math.floor(payload.exp - Date.now() / 1000)\r\n    return seconds > 0 ? seconds : undefined\r\n  } catch {\r\n    return undefined\r\n  }\r\n}\r\n\r\nfunction _getStringField(\r\n  data: Record<string, unknown>,\r\n  ...keys: string[]\r\n): string | undefined {\r\n  for (const key of keys) {\r\n    const value = data[key]\r\n    if (typeof value === 'string' && value.length > 0) return value\r\n  }\r\n  return undefined\r\n}\r\n\r\nfunction _getNumberField(\r\n  data: Record<string, unknown>,\r\n  ...keys: string[]\r\n): number | undefined {\r\n  for (const key of keys) {\r\n    const value = data[key]\r\n    if (typeof value === 'number' && Number.isFinite(value)) return value\r\n  }\r\n  return undefined\r\n}\r\n\r\nfunction _getExpiresInFromTimestamp(raw: unknown): number | undefined {\r\n  if (typeof raw !== 'string' || !raw) return undefined\r\n  const expiresAt = new Date(raw).getTime()\r\n  if (!Number.isFinite(expiresAt)) return undefined\r\n  return Math.max(60, Math.floor((expiresAt - Date.now()) / 1000))\r\n}\r\n\r\nexport function _normalizeKiroTokenPayload(data: Record<string, unknown>): KiroTokenPayload {\r\n  const accessToken = _getStringField(data, 'accessToken', 'access_token')\r\n  const refreshToken = _getStringField(data, 'refreshToken', 'refresh_token')\r\n  const profileArn = _getStringField(data, 'profileArn', 'profile_arn')\r\n  const expiresIn =\r\n    _getNumberField(data, 'expiresIn', 'expires_in')\r\n    ?? _getExpiresInFromTimestamp(data.expiresAt ?? data.expires_at)\r\n\r\n  return {\r\n    accessToken,\r\n    refreshToken,\r\n    expiresIn,\r\n    profileArn: profileArn ?? null,\r\n  }\r\n}\r\n\r\nasync function _reloadKiroLaneAuth(): Promise<void> {\r\n  const { reloadKiroLaneAuth } = await import('../providers/providerShim.js')\r\n  await reloadKiroLaneAuth()\r\n}\r\n\r\nasync function _reloadCopilotLaneAuth(): Promise<void> {\r\n  const { reloadCopilotLaneAuth } = await import('../providers/providerShim.js')\r\n  await reloadCopilotLaneAuth()\r\n}\r\n\r\nasync function _reloadCursorLaneAuth(): Promise<void> {\r\n  const { reloadCursorLaneAuth } = await import('../providers/providerShim.js')\r\n  await reloadCursorLaneAuth()\r\n}\r\n\r\nasync function _reloadClineLaneAuth(): Promise<void> {\r\n  const { reloadClineLaneAuth } = await import('../providers/providerShim.js')\r\n  await reloadClineLaneAuth()\r\n}\r\n\r\nasync function _reloadKiloLaneAuth(): Promise<void> {\r\n  const { reloadKiloLaneAuth } = await import('../providers/providerShim.js')\r\n  await reloadKiloLaneAuth()\r\n}\r\n\r\n/** Bind a local http server on the first available port, capture callback params. */\r\nfunction _startCallbackServer(\r\n  preferredPort: number,\r\n  redirectPath: string,\r\n): Promise<{ port: number; params: Promise<URLSearchParams> }> {\r\n  return new Promise((resolveBind, rejectBind) => {\r\n    let paramsResolve!: (p: URLSearchParams) => void\r\n    let paramsReject!: (e: Error) => void\r\n    const paramsPromise = new Promise<URLSearchParams>((res, rej) => {\r\n      paramsResolve = res\r\n      paramsReject = rej\r\n    })\r\n\r\n    const timeout = setTimeout(() => {\r\n      paramsReject(new Error('OAuth callback timed out after 5 minutes'))\r\n    }, 5 * 60 * 1000)\r\n\r\n    const server = createServer((req, res) => {\r\n      const url = new URL(req.url ?? '', 'http://localhost')\r\n      if (url.pathname === redirectPath || url.pathname === '/callback' || url.pathname === '/') {\r\n        res.writeHead(200, { 'Content-Type': 'text/html' })\r\n        res.end(\r\n          '<!DOCTYPE html><html><body style=\"font-family:system-ui;display:flex;align-items:center;justify-content:center;height:100vh;margin:0;background:#f8f9fa\">' +\r\n          '<div style=\"background:#fff;padding:48px;border-radius:16px;box-shadow:0 2px 12px rgba(0,0,0,.08);text-align:center\">' +\r\n          '<h1 style=\"color:#202124;margin:0 0 8px\">You\\'re all set</h1>' +\r\n          '<p style=\"color:#5f6368\">You can close this tab.</p>' +\r\n          '</div><script>setTimeout(()=>window.close(),1500)</script></body></html>',\r\n        )\r\n        clearTimeout(timeout)\r\n        server.close()\r\n        paramsResolve(url.searchParams)\r\n        return\r\n      }\r\n      res.writeHead(404)\r\n      res.end()\r\n    })\r\n\r\n    let triedFallback = false\r\n    const tryListen = (port: number) => {\r\n      server.removeAllListeners('error')\r\n      server.removeAllListeners('listening')\r\n      server.once('listening', () => {\r\n        const addr = server.address()\r\n        const actualPort = addr && typeof addr === 'object' ? addr.port : port\r\n        resolveBind({ port: actualPort, params: paramsPromise })\r\n      })\r\n      server.once('error', (err: NodeJS.ErrnoException) => {\r\n        if ((err.code === 'EACCES' || err.code === 'EADDRINUSE') && !triedFallback) {\r\n          triedFallback = true\r\n          tryListen(0)  // ephemeral port\r\n          return\r\n        }\r\n        clearTimeout(timeout)\r\n        rejectBind(err)\r\n      })\r\n      server.listen(port, '127.0.0.1')\r\n    }\r\n    tryListen(preferredPort)\r\n  })\r\n}\r\n\r\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n// KiloCode \u2014 custom device-auth flow\r\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\r\nconst KILOCODE_API_BASE = 'https://api.kilo.ai'\r\nconst KILOCODE_STORAGE = 'kilocode_oauth'\r\n\r\nexport async function startKiloCodeOAuth(): Promise<{\r\n  accessToken: string\r\n  refreshToken: string\r\n}> {\r\n  const initiateRes = await fetch(`${KILOCODE_API_BASE}/api/device-auth/codes`, {\r\n    method: 'POST',\r\n    headers: { 'Content-Type': 'application/json' },\r\n  })\r\n  if (!initiateRes.ok) {\r\n    const body = await initiateRes.text()\r\n    throw new Error(`KiloCode device auth failed: ${initiateRes.status} ${body}`)\r\n  }\r\n  const initData = await initiateRes.json() as {\r\n    code: string\r\n    verificationUrl: string\r\n    expiresIn?: number\r\n  }\r\n  const { code, verificationUrl } = initData\r\n  const expiresIn = initData.expiresIn ?? 300\r\n\r\n  await openBrowser(verificationUrl)\r\n\r\n  // Poll /api/device-auth/codes/<code> every 3s until approved or expired.\r\n  const pollUrl = `${KILOCODE_API_BASE}/api/device-auth/codes/${code}`\r\n  const deadline = Date.now() + expiresIn * 1000\r\n  while (Date.now() < deadline) {\r\n    await new Promise(r => setTimeout(r, 3000))\r\n    const res = await fetch(pollUrl)\r\n    if (res.status === 202) continue  // pending\r\n    if (res.status === 403) throw new Error('KiloCode authorization denied by user')\r\n    if (res.status === 410) throw new Error('KiloCode authorization code expired')\r\n    if (!res.ok) continue  // transient\r\n    const data = await res.json() as {\r\n      status?: string\r\n      token?: string\r\n      userEmail?: string\r\n    }\r\n    if (data.status === 'approved' && data.token) {\r\n      // Best-effort: fetch orgId for the X-Kilocode-OrganizationID header.\r\n      let orgId: string | null = null\r\n      try {\r\n        const profileRes = await fetch(`${KILOCODE_API_BASE}/api/profile`, {\r\n          headers: { Authorization: `Bearer ${data.token}` },\r\n        })\r\n        if (profileRes.ok) {\r\n          const profile = await profileRes.json() as {\r\n            organizations?: Array<{ id?: string }>\r\n          }\r\n          orgId = profile.organizations?.[0]?.id ?? null\r\n        }\r\n      } catch { /* best-effort */ }\r\n\r\n      _saveTokens(KILOCODE_STORAGE, {\r\n        accessToken: data.token,\r\n        meta: { email: data.userEmail, orgId },\r\n      })\r\n      // Flip the lane's in-memory auth so the current session picks up\r\n      // the new bearer without a restart (the Kilo lane caches credentials\r\n      // at init and on reload).\r\n      await _reloadKiloLaneAuth()\r\n      return { accessToken: data.token, refreshToken: '' }  // no refresh token\r\n    }\r\n  }\r\n  throw new Error('KiloCode authorization timed out')\r\n}\r\n\r\nexport function getKiloCodeOAuthToken(): string | null {\r\n  return _loadTokens(KILOCODE_STORAGE)?.accessToken ?? null\r\n}\r\n\r\nexport function getKiloCodeOrgId(): string | null {\r\n  const blob = _loadTokens(KILOCODE_STORAGE)\r\n  return (blob?.meta?.orgId as string) ?? null\r\n}\r\n\r\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n// Cline \u2014 WorkOS device-code flow registered with Cline's account API\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nconst CLINE_API_BASE = 'https://api.cline.bot'\nconst CLINE_STORAGE = 'cline_oauth'\nconst CLINE_WORKOS_API_BASE = 'https://api.workos.com'\nconst CLINE_WORKOS_CLIENT_ID = 'client_01K3A541FN8TA3EPPHTD2325AR'\nconst CLINE_DEVICE_AUTH_TIMEOUT_MS = 30_000\n\nexport interface ClineDeviceHandles {\n  userCode: string\n  verificationUri: string\n  verificationUriComplete?: string\n  deviceCode: string\n  interval: number\n  expiresIn: number\n}\n\ninterface ClineTokenResponseData {\n  accessToken?: string\n  refreshToken?: string\n  tokenType?: string\n  expiresAt?: string | number\n  userInfo?: {\n    email?: string\n    clineUserId?: string | null\n    subject?: string | null\n  }\n}\n\nfunction _expiresInFromClineExpiresAt(raw: unknown): number {\n  const expiresAtMs = typeof raw === 'string'\n    ? new Date(raw).getTime()\n    : typeof raw === 'number' ? raw : undefined\n  return expiresAtMs && Number.isFinite(expiresAtMs)\n    ? Math.max(60, Math.floor((expiresAtMs - Date.now()) / 1000))\n    : 3600\n}\n\nfunction _unwrapClineTokenResponse(data: unknown): ClineTokenResponseData {\n  const root = data && typeof data === 'object' ? data as Record<string, unknown> : {}\n  const envelopeData = root.data && typeof root.data === 'object'\n    ? root.data as Record<string, unknown>\n    : root\n  return envelopeData as ClineTokenResponseData\n}\n\nexport async function initiateClineOAuth(): Promise<ClineDeviceHandles> {\n  const res = await fetch(`${CLINE_WORKOS_API_BASE}/user_management/authorize/device`, {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n    body: new URLSearchParams({ client_id: CLINE_WORKOS_CLIENT_ID }),\n    signal: AbortSignal.timeout(CLINE_DEVICE_AUTH_TIMEOUT_MS),\n  })\n  const data = await res.json().catch(() => ({})) as {\n    device_code?: string\n    user_code?: string\n    verification_uri?: string\n    verification_uri_complete?: string\n    expires_in?: number\n    interval?: number\n    error?: string\n    error_description?: string\n  }\n  if (!res.ok) {\n    throw new Error(`Cline device authorization failed: ${data.error_description ?? data.error ?? res.status}`)\n  }\n  if (!data.device_code || !data.user_code || !data.verification_uri) {\n    throw new Error('Invalid Cline device authorization response')\n  }\n  return {\n    deviceCode: data.device_code,\n    userCode: data.user_code,\n    verificationUri: data.verification_uri,\n    verificationUriComplete: data.verification_uri_complete,\n    expiresIn: data.expires_in ?? 300,\n    interval: data.interval ?? 5,\n  }\n}\n\nexport async function completeClineOAuth(handles: ClineDeviceHandles): Promise<{\n  accessToken: string\n  refreshToken: string\n}> {\n  let interval = Math.max(1, handles.interval) * 1000\n  const deadline = Date.now() + handles.expiresIn * 1000\n  let workosAccessToken = ''\n  let workosRefreshToken = ''\n\n  while (Date.now() < deadline) {\n    await _sleep(interval)\n    const res = await fetch(`${CLINE_WORKOS_API_BASE}/user_management/authenticate`, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n      body: new URLSearchParams({\n        grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n        device_code: handles.deviceCode,\n        client_id: CLINE_WORKOS_CLIENT_ID,\n      }),\n      signal: AbortSignal.timeout(CLINE_DEVICE_AUTH_TIMEOUT_MS),\n    })\n    const data = await res.json().catch(() => ({})) as {\n      access_token?: string\n      refresh_token?: string\n      error?: string\n      error_description?: string\n    }\n    if (res.ok && data.access_token && data.refresh_token) {\n      workosAccessToken = data.access_token\n      workosRefreshToken = data.refresh_token\n      break\n    }\n    if (data.error === 'authorization_pending') continue\n    if (data.error === 'slow_down') { interval += 1000; continue }\n    if (data.error === 'expired_token') throw new Error('Cline device code expired')\n    if (data.error === 'access_denied') throw new Error('Cline authorization denied')\n    if (data.error) throw new Error(`Cline OAuth error: ${data.error_description ?? data.error}`)\n    if (!res.ok) throw new Error(`Cline OAuth polling failed: ${res.status}`)\n  }\n\n  if (!workosAccessToken || !workosRefreshToken) {\n    throw new Error('Cline authorization timed out')\n  }\n\n  const registerRes = await fetch(`${CLINE_API_BASE}/api/v1/auth/register`, {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n    body: JSON.stringify({\n      accessToken: workosAccessToken,\n      refreshToken: workosRefreshToken,\n    }),\n    signal: AbortSignal.timeout(CLINE_DEVICE_AUTH_TIMEOUT_MS),\n  })\n  const registerData = await registerRes.json().catch(() => ({}))\n  if (!registerRes.ok) {\n    throw new Error(`Cline token registration failed: ${registerRes.status}`)\n  }\n\n  const tokenData = _unwrapClineTokenResponse(registerData)\n  const accessToken = tokenData.accessToken ?? ''\n  const refreshToken = tokenData.refreshToken ?? ''\n  if (!accessToken || !refreshToken) {\n    throw new Error('Cline token registration did not return Cline tokens')\n  }\n\n  _saveTokens(CLINE_STORAGE, {\n    accessToken,\n    refreshToken,\n    expiresIn: _expiresInFromClineExpiresAt(tokenData.expiresAt),\n    meta: {\n      email: tokenData.userInfo?.email,\n      accountId: tokenData.userInfo?.clineUserId ?? tokenData.userInfo?.subject ?? undefined,\n      tokenType: tokenData.tokenType,\n    },\n  })\n  await _reloadClineLaneAuth()\n  return { accessToken, refreshToken }\n}\n\nexport async function startClineOAuth(): Promise<{\n  accessToken: string\n  refreshToken: string\n}> {\n  const handles = await initiateClineOAuth()\n  await openBrowser(handles.verificationUriComplete || handles.verificationUri)\n  return completeClineOAuth(handles)\n}\n\r\nexport function getClineOAuthToken(): string | null {\r\n  return _loadTokens(CLINE_STORAGE)?.accessToken ?? null\r\n}\r\n\r\nexport async function refreshClineOAuth(refreshToken: string): Promise<string> {\r\n  const res = await fetch(`${CLINE_API_BASE}/api/v1/auth/refresh`, {\r\n    method: 'POST',\r\n    headers: {\r\n      'Content-Type': 'application/json',\r\n      Accept: 'application/json',\r\n    },\r\n    body: JSON.stringify({\r\n      refreshToken,\r\n      grantType: 'refresh_token',\r\n    }),\r\n  })\n  if (!res.ok) throw new Error(`Cline refresh failed: ${await res.text()}`)\n  const data = _unwrapClineTokenResponse(await res.json().catch(() => ({})))\n  const accessToken = data.accessToken ?? ''\n  if (!accessToken) throw new Error('Cline refresh: no access token in response')\n  _saveTokens(CLINE_STORAGE, {\n    accessToken,\n    refreshToken: data.refreshToken ?? refreshToken,\n    expiresIn: _expiresInFromClineExpiresAt(data.expiresAt),\n    meta: {\n      email: data.userInfo?.email,\n      accountId: data.userInfo?.clineUserId ?? data.userInfo?.subject ?? undefined,\n      tokenType: data.tokenType,\n    },\n  })\n  await _reloadClineLaneAuth()\r\n  return accessToken\r\n}\r\n\r\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n// iFlow \u2014 OAuth2 authorization-code flow with Basic Auth exchange\r\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\r\nconst IFLOW_CLIENT_ID = '10009311001'\r\nconst IFLOW_CLIENT_SECRET = '4Z3YjXycVsQvyGF1etiNlIBB4RsqSDtW'\r\nconst IFLOW_AUTHORIZE_URL = 'https://iflow.cn/oauth'\r\nconst IFLOW_TOKEN_URL = 'https://iflow.cn/oauth/token'\r\nconst IFLOW_USERINFO_URL = 'https://iflow.cn/api/oauth/getUserInfo'\r\nconst IFLOW_STORAGE = 'iflow_oauth'\r\n\r\nexport async function startIFlowOAuth(): Promise<{\r\n  accessToken: string\r\n  refreshToken: string\r\n}> {\r\n  const { port, params: paramsPromise } = await _startCallbackServer(8089, '/callback')\r\n  const redirectUri = `http://localhost:${port}/callback`\r\n  const state = randomBytes(32).toString('base64url')\r\n\r\n  const authUrl = new URL(IFLOW_AUTHORIZE_URL)\r\n  authUrl.searchParams.set('loginMethod', 'phone')\r\n  authUrl.searchParams.set('type', 'phone')\r\n  authUrl.searchParams.set('redirect', redirectUri)\r\n  authUrl.searchParams.set('state', state)\r\n  authUrl.searchParams.set('client_id', IFLOW_CLIENT_ID)\r\n\r\n  await openBrowser(authUrl.toString())\r\n\r\n  const params = await paramsPromise\r\n  if (params.get('state') !== state) {\r\n    throw new Error('iFlow: state mismatch (possible CSRF)')\r\n  }\r\n  const code = params.get('code')\r\n  if (!code) throw new Error('iFlow: no authorization code returned')\r\n\r\n  const basicAuth = Buffer.from(`${IFLOW_CLIENT_ID}:${IFLOW_CLIENT_SECRET}`).toString('base64')\r\n  const tokenRes = await fetch(IFLOW_TOKEN_URL, {\r\n    method: 'POST',\r\n    headers: {\r\n      'Content-Type': 'application/x-www-form-urlencoded',\r\n      Accept: 'application/json',\r\n      Authorization: `Basic ${basicAuth}`,\r\n    },\r\n    body: new URLSearchParams({\r\n      grant_type: 'authorization_code',\r\n      code,\r\n      redirect_uri: redirectUri,\r\n      client_id: IFLOW_CLIENT_ID,\r\n      client_secret: IFLOW_CLIENT_SECRET,\r\n    }),\r\n  })\r\n  if (!tokenRes.ok) {\r\n    throw new Error(`iFlow token exchange failed: ${await tokenRes.text()}`)\r\n  }\r\n  const tokens = await tokenRes.json() as {\r\n    access_token: string\r\n    refresh_token?: string\r\n    expires_in?: number\r\n  }\r\n\r\n  // Fetch user info \u2014 contains the `apiKey` iFlow uses for chat requests.\r\n  let apiKey = ''\r\n  let email = ''\r\n  try {\r\n    const userRes = await fetch(\r\n      `${IFLOW_USERINFO_URL}?accessToken=${encodeURIComponent(tokens.access_token)}`,\r\n      { headers: { Accept: 'application/json' } },\r\n    )\r\n    if (userRes.ok) {\r\n      const userData = await userRes.json() as {\r\n        success?: boolean\r\n        data?: { apiKey?: string; email?: string; phone?: string }\r\n      }\r\n      if (userData.success) {\r\n        apiKey = userData.data?.apiKey ?? ''\r\n        email = userData.data?.email ?? userData.data?.phone ?? ''\r\n      }\r\n    }\r\n  } catch { /* best-effort */ }\r\n\r\n  _saveTokens(IFLOW_STORAGE, {\r\n    accessToken: tokens.access_token,\r\n    refreshToken: tokens.refresh_token,\r\n    expiresIn: tokens.expires_in,\r\n    meta: { apiKey, email },\r\n  })\r\n  return {\r\n    accessToken: tokens.access_token,\r\n    refreshToken: tokens.refresh_token ?? '',\r\n  }\r\n}\r\n\r\nexport function getIFlowOAuthToken(): string | null {\r\n  return _loadTokens(IFLOW_STORAGE)?.accessToken ?? null\r\n}\r\n\r\n/** iFlow uses an `apiKey` (extracted from userInfo) rather than the OAuth token for chat. */\r\nexport function getIFlowApiKey(): string | null {\r\n  const blob = _loadTokens(IFLOW_STORAGE)\r\n  return (blob?.meta?.apiKey as string) ?? null\r\n}\r\n\r\nexport async function refreshIFlowOAuth(refreshToken: string): Promise<string> {\r\n  const basicAuth = Buffer.from(`${IFLOW_CLIENT_ID}:${IFLOW_CLIENT_SECRET}`).toString('base64')\r\n  const res = await fetch(IFLOW_TOKEN_URL, {\r\n    method: 'POST',\r\n    headers: {\r\n      'Content-Type': 'application/x-www-form-urlencoded',\r\n      Accept: 'application/json',\r\n      Authorization: `Basic ${basicAuth}`,\r\n    },\r\n    body: new URLSearchParams({\r\n      grant_type: 'refresh_token',\r\n      refresh_token: refreshToken,\r\n      client_id: IFLOW_CLIENT_ID,\r\n      client_secret: IFLOW_CLIENT_SECRET,\r\n    }),\r\n  })\r\n  if (!res.ok) throw new Error(`iFlow refresh failed: ${await res.text()}`)\r\n  const tokens = await res.json() as {\r\n    access_token: string\r\n    refresh_token?: string\r\n    expires_in?: number\r\n  }\r\n  const existing = _loadTokens(IFLOW_STORAGE)\r\n  _saveTokens(IFLOW_STORAGE, {\r\n    accessToken: tokens.access_token,\r\n    refreshToken: tokens.refresh_token ?? refreshToken,\r\n    expiresIn: tokens.expires_in,\r\n    meta: existing?.meta,\r\n  })\r\n  return tokens.access_token\r\n}\r\n\r\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n// GitHub Copilot \u2014 device code flow + Copilot token exchange\r\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\r\nconst COPILOT_CLIENT_ID = 'Iv1.b507a08c87ecfe98'\r\nconst COPILOT_DEVICE_URL = 'https://github.com/login/device/code'\r\nconst COPILOT_TOKEN_URL = 'https://github.com/login/oauth/access_token'\r\nconst COPILOT_INTERNAL_TOKEN_URL = 'https://api.github.com/copilot_internal/v2/token'\r\nconst COPILOT_USERAGENT = 'GitHubCopilotChat/0.26.7'\r\nconst COPILOT_STORAGE = 'copilot_oauth'\r\nlet _copilotRefreshInFlight: Promise<string> | null = null\r\n\r\nfunction _copilotMeta(refreshIn?: number): Record<string, unknown> | undefined {\r\n  if (typeof refreshIn !== 'number' || !Number.isFinite(refreshIn)) return undefined\r\n  return {\r\n    refreshIn,\r\n    refreshAt: Date.now() + refreshIn * 1000,\r\n  }\r\n}\r\n\r\nfunction _copilotPlanMeta(data: {\r\n  sku?: string\r\n  individual?: boolean\r\n  limited_user_quotas?: {\r\n    chat?: number\r\n    completions?: number\r\n  }\r\n  limited_user_reset_date?: number\r\n}): CopilotPlanInfo {\r\n  return {\r\n    ...(typeof data.sku === 'string' ? { sku: data.sku } : {}),\r\n    ...(typeof data.individual === 'boolean' ? { individual: data.individual } : {}),\r\n    ...(data.limited_user_quotas ? { limitedUserQuotas: data.limited_user_quotas } : {}),\r\n    ...(typeof data.limited_user_reset_date === 'number'\r\n      ? { limitedUserResetDate: data.limited_user_reset_date }\r\n      : {}),\r\n  }\r\n}\r\n\r\nfunction _mergeCopilotMeta(\r\n  refreshIn: number | undefined,\r\n  plan: CopilotPlanInfo,\r\n): Record<string, unknown> | undefined {\r\n  const timing = _copilotMeta(refreshIn) ?? {}\r\n  return { ...timing, ...plan }\r\n}\r\n\r\nfunction _hasCopilotPlanInfo(blob: StoredOAuthBlob): boolean {\r\n  return typeof blob.meta?.sku === 'string'\r\n}\r\n\r\nfunction _shouldRefreshCopilotToken(blob: StoredOAuthBlob): boolean {\r\n  const refreshAt = blob.meta?.refreshAt\r\n  if (typeof refreshAt === 'number' && Number.isFinite(refreshAt)) {\r\n    return Date.now() > refreshAt - TOKEN_REFRESH_BUFFER_MS\r\n  }\r\n  return !!(\r\n    blob.expiresAt\r\n    && Date.now() > blob.expiresAt - TOKEN_REFRESH_BUFFER_MS\r\n  )\r\n}\r\n\r\n/**\r\n * Device-code handles. Caller renders the user_code + verification_uri\r\n * in the UI, then calls completeCopilotOAuth(deviceCode, interval) to poll.\r\n */\r\nexport interface CopilotDeviceHandles {\r\n  userCode: string\r\n  verificationUri: string\r\n  deviceCode: string\r\n  interval: number\r\n  expiresIn: number\r\n}\r\n\r\nexport async function initiateCopilotOAuth(): Promise<CopilotDeviceHandles> {\r\n  const res = await fetch(COPILOT_DEVICE_URL, {\r\n    method: 'POST',\r\n    headers: {\r\n      'Content-Type': 'application/x-www-form-urlencoded',\r\n      Accept: 'application/json',\r\n    },\r\n    body: new URLSearchParams({\r\n      client_id: COPILOT_CLIENT_ID,\r\n      scope: 'read:user',\r\n    }),\r\n  })\r\n  if (!res.ok) throw new Error(`Copilot device code failed: ${await res.text()}`)\r\n  const data = await res.json() as {\r\n    device_code: string\r\n    user_code: string\r\n    verification_uri: string\r\n    expires_in?: number\r\n    interval?: number\r\n  }\r\n  return {\r\n    deviceCode: data.device_code,\r\n    userCode: data.user_code,\r\n    verificationUri: data.verification_uri,\r\n    expiresIn: data.expires_in ?? 900,\r\n    interval: data.interval ?? 5,\r\n  }\r\n}\r\n\r\n/**\r\n * Poll the GitHub device-code endpoint until the user approves, then\r\n * exchange the GH access token for a Copilot internal API token. Call\r\n * after `initiateCopilotOAuth()` so the caller can display user_code.\r\n */\r\nexport async function completeCopilotOAuth(handles: CopilotDeviceHandles): Promise<{\r\n  accessToken: string\r\n  refreshToken: string\r\n}> {\r\n  let interval = handles.interval * 1000\r\n  const deadline = Date.now() + handles.expiresIn * 1000\r\n  let ghAccessToken = ''\r\n  while (Date.now() < deadline) {\r\n    await new Promise(r => setTimeout(r, interval))\r\n    const res = await fetch(COPILOT_TOKEN_URL, {\r\n      method: 'POST',\r\n      headers: {\r\n        'Content-Type': 'application/x-www-form-urlencoded',\r\n        Accept: 'application/json',\r\n      },\r\n      body: new URLSearchParams({\r\n        client_id: COPILOT_CLIENT_ID,\r\n        device_code: handles.deviceCode,\r\n        grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\r\n      }),\r\n    })\r\n    const data = await res.json() as {\r\n      access_token?: string\r\n      error?: string\r\n      error_description?: string\r\n      interval?: number\r\n    }\r\n    if (data.access_token) {\r\n      ghAccessToken = data.access_token\r\n      break\r\n    }\r\n    if (data.error === 'authorization_pending') continue\r\n    if (data.error === 'slow_down') { interval += 5000; continue }\r\n    if (data.error === 'expired_token') throw new Error('GitHub device code expired')\r\n    if (data.error === 'access_denied') throw new Error('GitHub authorization denied')\r\n    if (data.error) throw new Error(`Copilot OAuth error: ${data.error_description ?? data.error}`)\r\n  }\r\n  if (!ghAccessToken) throw new Error('Copilot OAuth timed out')\r\n\r\n  // Exchange the GitHub user token for a Copilot internal API token.\r\n  const copilotRes = await fetch(COPILOT_INTERNAL_TOKEN_URL, {\r\n    headers: {\r\n      Authorization: `Bearer ${ghAccessToken}`,\r\n      Accept: 'application/json',\r\n      'X-GitHub-Api-Version': '2022-11-28',\r\n      'User-Agent': COPILOT_USERAGENT,\r\n    },\r\n  })\r\n  if (!copilotRes.ok) {\r\n    throw new Error(`Copilot token fetch failed: ${copilotRes.status} ${await copilotRes.text()}`)\r\n  }\r\n  const copilotData = await copilotRes.json() as {\r\n    token?: string\r\n    expires_at?: number\r\n    refresh_in?: number\r\n    sku?: string\r\n    individual?: boolean\r\n    limited_user_quotas?: { chat?: number; completions?: number }\r\n    limited_user_reset_date?: number\r\n  }\r\n  if (!copilotData.token) throw new Error('Copilot: no internal token in response')\r\n\r\n  const expiresIn = copilotData.expires_at\r\n    ? Math.max(60, copilotData.expires_at - Math.floor(Date.now() / 1000))\r\n    : 1500\r\n  _saveTokens(COPILOT_STORAGE, {\r\n    accessToken: copilotData.token,\r\n    refreshToken: ghAccessToken,  // refresh re-exchanges via the GH token\r\n    expiresIn,\r\n    meta: _mergeCopilotMeta(\r\n      copilotData.refresh_in,\r\n      _copilotPlanMeta(copilotData),\r\n    ),\r\n  })\r\n  await _reloadCopilotLaneAuth()\r\n  return { accessToken: copilotData.token, refreshToken: ghAccessToken }\r\n}\r\n\r\nexport async function startCopilotOAuth(): Promise<{\r\n  accessToken: string\r\n  refreshToken: string\r\n}> {\r\n  const handles = await initiateCopilotOAuth()\r\n  await openBrowser(handles.verificationUri)\r\n  return completeCopilotOAuth(handles)\r\n}\r\n\r\nexport function getCopilotOAuthToken(): string | null {\r\n  return _loadTokens(COPILOT_STORAGE)?.accessToken ?? null\r\n}\r\n\r\nexport function getStoredCopilotPlanInfo(): CopilotPlanInfo | null {\r\n  const blob = _loadTokens(COPILOT_STORAGE)\r\n  if (!blob?.meta) return null\r\n\r\n  const plan: CopilotPlanInfo = {}\r\n  if (typeof blob.meta.sku === 'string') plan.sku = blob.meta.sku\r\n  if (typeof blob.meta.individual === 'boolean') plan.individual = blob.meta.individual\r\n\r\n  const quotas = blob.meta.limitedUserQuotas\r\n  if (quotas && typeof quotas === 'object') {\r\n    const q = quotas as Record<string, unknown>\r\n    plan.limitedUserQuotas = {\r\n      ...(typeof q.chat === 'number' ? { chat: q.chat } : {}),\r\n      ...(typeof q.completions === 'number' ? { completions: q.completions } : {}),\r\n    }\r\n  }\r\n\r\n  if (typeof blob.meta.limitedUserResetDate === 'number') {\r\n    plan.limitedUserResetDate = blob.meta.limitedUserResetDate\r\n  }\r\n\r\n  return Object.keys(plan).length > 0 ? plan : null\r\n}\r\n\r\nexport async function getValidCopilotOAuthToken(): Promise<string | null> {\r\n  const blob = _loadTokens(COPILOT_STORAGE)\r\n  if (!blob) return null\r\n\r\n  if (!blob.accessToken) {\r\n    if (!blob.refreshToken) return null\r\n    try {\r\n      return await refreshCopilotOAuth(blob.refreshToken)\r\n    } catch {\r\n      return null\r\n    }\r\n  }\r\n\r\n  if (!_hasCopilotPlanInfo(blob) && blob.refreshToken) {\r\n    try {\r\n      return await refreshCopilotOAuth(blob.refreshToken)\r\n    } catch {\r\n      // Keep using the current internal token if metadata refresh fails.\r\n      return blob.accessToken\r\n    }\r\n  }\r\n\r\n  if (!_shouldRefreshCopilotToken(blob)) {\r\n    return blob.accessToken\r\n  }\r\n\r\n  if (!blob.refreshToken) return blob.accessToken\r\n\r\n  if (!_copilotRefreshInFlight) {\r\n    _copilotRefreshInFlight = refreshCopilotOAuth(blob.refreshToken)\r\n      .finally(() => {\r\n        _copilotRefreshInFlight = null\r\n      })\r\n  }\r\n\r\n  try {\r\n    return await _copilotRefreshInFlight\r\n  } catch {\r\n    // Keep using the currently-stored internal token if the early refresh\r\n    // fails. This avoids flipping to \"not logged in\" on transient network\r\n    // errors while the existing token may still be accepted by Copilot.\r\n    return blob.accessToken ?? null\r\n  }\r\n}\r\n\r\nexport async function refreshCopilotOAuth(ghAccessToken: string): Promise<string> {\r\n  const res = await fetch(COPILOT_INTERNAL_TOKEN_URL, {\r\n    headers: {\r\n      Authorization: `Bearer ${ghAccessToken}`,\r\n      Accept: 'application/json',\r\n      'X-GitHub-Api-Version': '2022-11-28',\r\n      'User-Agent': COPILOT_USERAGENT,\r\n    },\r\n  })\r\n  if (!res.ok) throw new Error(`Copilot refresh failed: ${await res.text()}`)\r\n  const data = await res.json() as {\r\n    token?: string\r\n    expires_at?: number\r\n    refresh_in?: number\r\n    sku?: string\r\n    individual?: boolean\r\n    limited_user_quotas?: { chat?: number; completions?: number }\r\n    limited_user_reset_date?: number\r\n  }\r\n  if (!data.token) throw new Error('Copilot refresh: no token')\r\n  const expiresIn = data.expires_at\r\n    ? Math.max(60, data.expires_at - Math.floor(Date.now() / 1000))\r\n    : 1500\r\n  _saveTokens(COPILOT_STORAGE, {\r\n    accessToken: data.token,\r\n    refreshToken: ghAccessToken,\r\n    expiresIn,\r\n    meta: _mergeCopilotMeta(\r\n      data.refresh_in,\r\n      _copilotPlanMeta(data),\r\n    ),\r\n  })\r\n  await _reloadCopilotLaneAuth()\r\n  return data.token\r\n}\r\n\r\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n// Kiro \u2014 AWS SSO OIDC device-code flow (Builder ID path)\r\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n//\r\n// Kiro supports Builder ID / IDC / Google-Cognito / GitHub-Cognito / import.\r\n// v0.4.0 implements Builder ID (the default AWS login most users want). The\r\n// other methods can be added later \u2014 Kiro's chat executor is already stubbed\r\n// in Phase 4 so the provider row + login UI ship regardless.\r\n\r\nconst KIRO_OIDC_BASE = 'https://oidc.us-east-1.amazonaws.com'\r\nconst KIRO_BUILDER_START_URL = 'https://view.awsapps.com/start'\r\nconst KIRO_CLIENT_NAME = 'kiro-oauth-client'\r\nconst KIRO_SCOPES = ['codewhisperer:completions', 'codewhisperer:analysis', 'codewhisperer:conversations']\r\nconst KIRO_GRANT_TYPES = ['urn:ietf:params:oauth:grant-type:device_code', 'refresh_token']\r\nconst KIRO_ISSUER_URL = 'https://identitycenter.amazonaws.com/ssoins-722374e8c3c8e6c6'\r\nconst KIRO_SOCIAL_AUTH_SERVICE = 'https://prod.us-east-1.auth.desktop.kiro.dev'\r\nconst KIRO_SOCIAL_REDIRECT_URI = 'kiro://kiro.kiroAgent/authenticate-success'\r\nconst KIRO_STORAGE = 'kiro_oauth'\r\n\r\nexport type KiroSocialProvider = 'google' | 'github'\r\n\r\nexport interface KiroDeviceHandles {\r\n  userCode: string\r\n  verificationUri: string\r\n  verificationUriComplete: string\r\n  deviceCode: string\r\n  interval: number\r\n  expiresIn: number\r\n  clientId: string\r\n  clientSecret: string\r\n}\r\n\r\nexport interface KiroSocialHandles {\r\n  provider: KiroSocialProvider\r\n  authUrl: string\r\n  state: string\r\n  codeVerifier: string\r\n}\r\n\r\nexport async function initiateKiroOAuth(): Promise<KiroDeviceHandles> {\r\n  // 1. Register OIDC client (gives us a dynamic clientId/clientSecret pair)\r\n  const registerRes = await fetch(`${KIRO_OIDC_BASE}/client/register`, {\r\n    method: 'POST',\r\n    headers: { 'Content-Type': 'application/json' },\r\n    body: JSON.stringify({\r\n      clientName: KIRO_CLIENT_NAME,\r\n      clientType: 'public',\r\n      scopes: KIRO_SCOPES,\r\n      grantTypes: KIRO_GRANT_TYPES,\r\n      issuerUrl: KIRO_ISSUER_URL,\r\n    }),\r\n  })\r\n  if (!registerRes.ok) {\r\n    throw new Error(`Kiro client register failed: ${await registerRes.text()}`)\r\n  }\r\n  const client = await registerRes.json() as { clientId: string; clientSecret: string }\r\n\r\n  // 2. Start device authorization\r\n  const authRes = await fetch(`${KIRO_OIDC_BASE}/device_authorization`, {\r\n    method: 'POST',\r\n    headers: { 'Content-Type': 'application/json' },\r\n    body: JSON.stringify({\r\n      clientId: client.clientId,\r\n      clientSecret: client.clientSecret,\r\n      startUrl: KIRO_BUILDER_START_URL,\r\n    }),\r\n  })\r\n  if (!authRes.ok) {\r\n    throw new Error(`Kiro device auth failed: ${await authRes.text()}`)\r\n  }\r\n  const auth = await authRes.json() as {\r\n    deviceCode: string\r\n    userCode: string\r\n    verificationUri: string\r\n    verificationUriComplete: string\r\n    expiresIn?: number\r\n    interval?: number\r\n  }\r\n  return {\r\n    deviceCode: auth.deviceCode,\r\n    userCode: auth.userCode,\r\n    verificationUri: auth.verificationUri,\r\n    verificationUriComplete: auth.verificationUriComplete,\r\n    expiresIn: auth.expiresIn ?? 900,\r\n    interval: auth.interval ?? 5,\r\n    clientId: client.clientId,\r\n    clientSecret: client.clientSecret,\r\n  }\r\n}\r\n\r\n/**\r\n * Poll the AWS OIDC token endpoint until the user approves the Kiro\r\n * device code. Call after `initiateKiroOAuth()` so the caller can\r\n * display user_code during the wait.\r\n */\r\nexport async function completeKiroOAuth(handles: KiroDeviceHandles): Promise<{\r\n  accessToken: string\r\n  refreshToken: string\r\n}> {\r\n  let interval = handles.interval * 1000\r\n  const deadline = Date.now() + handles.expiresIn * 1000\r\n  while (Date.now() < deadline) {\r\n    await new Promise(r => setTimeout(r, interval))\r\n    const res = await fetch(`${KIRO_OIDC_BASE}/token`, {\r\n      method: 'POST',\r\n      headers: { 'Content-Type': 'application/json' },\r\n      body: JSON.stringify({\r\n        clientId: handles.clientId,\r\n        clientSecret: handles.clientSecret,\r\n        deviceCode: handles.deviceCode,\r\n        grantType: 'urn:ietf:params:oauth:grant-type:device_code',\r\n      }),\r\n    })\r\n    const rawData = await res.json() as Record<string, unknown> & {\r\n      error?: string\r\n      error_description?: string\r\n    }\r\n    const data = _normalizeKiroTokenPayload(rawData)\r\n    if (data.accessToken) {\r\n      _saveTokens(KIRO_STORAGE, {\r\n        accessToken: data.accessToken,\r\n        refreshToken: data.refreshToken,\r\n        expiresIn: data.expiresIn,\r\n        meta: {\r\n          authMethod: 'builder-id',\r\n          clientId: handles.clientId,\r\n          clientSecret: handles.clientSecret,\r\n          region: 'us-east-1',\r\n        },\r\n      })\r\n      await _reloadKiroLaneAuth()\r\n      return {\r\n        accessToken: data.accessToken,\r\n        refreshToken: data.refreshToken ?? '',\r\n      }\r\n    }\r\n    if (rawData.error === 'authorization_pending') continue\r\n    if (rawData.error === 'slow_down') { interval += 5000; continue }\r\n    if (rawData.error === 'expired_token') throw new Error('Kiro device code expired')\r\n    if (rawData.error === 'access_denied') throw new Error('Kiro authorization denied')\r\n    if (rawData.error) throw new Error(`Kiro OAuth error: ${rawData.error_description ?? rawData.error}`)\r\n  }\r\n  throw new Error('Kiro authorization timed out')\r\n}\r\n\r\nexport async function startKiroOAuth(): Promise<{\r\n  accessToken: string\r\n  refreshToken: string\r\n}> {\r\n  const handles = await initiateKiroOAuth()\r\n  await openBrowser(handles.verificationUriComplete || handles.verificationUri)\r\n  return completeKiroOAuth(handles)\r\n}\r\n\r\nexport function getKiroOAuthToken(): string | null {\r\n  return _loadTokens(KIRO_STORAGE)?.accessToken ?? null\r\n}\r\n\r\nexport async function getValidKiroOAuthToken(): Promise<string | null> {\r\n  const blob = _loadTokens(KIRO_STORAGE)\r\n  if (!blob?.accessToken) return null\r\n\r\n  if (blob.expiresAt && Date.now() > blob.expiresAt - TOKEN_REFRESH_BUFFER_MS) {\r\n    if (!blob.refreshToken) return null\r\n    try {\r\n      return await refreshKiroOAuth(blob.refreshToken)\r\n    } catch {\r\n      return null\r\n    }\r\n  }\r\n\r\n  return blob.accessToken\r\n}\r\n\r\n\r\nexport async function initiateKiroSocialOAuth(\r\n  provider: KiroSocialProvider,\r\n): Promise<KiroSocialHandles> {\r\n  const { verifier, challenge } = _pkce()\r\n  const state = randomBytes(32).toString('base64url')\r\n  const authUrl = new URL(`${KIRO_SOCIAL_AUTH_SERVICE}/login`)\r\n\r\n  authUrl.searchParams.set('idp', provider === 'google' ? 'Google' : 'Github')\r\n  authUrl.searchParams.set('redirect_uri', KIRO_SOCIAL_REDIRECT_URI)\r\n  authUrl.searchParams.set('code_challenge', challenge)\r\n  authUrl.searchParams.set('code_challenge_method', 'S256')\r\n  authUrl.searchParams.set('state', state)\r\n  authUrl.searchParams.set('prompt', 'select_account')\r\n\r\n  return {\r\n    provider,\r\n    authUrl: authUrl.toString(),\r\n    state,\r\n    codeVerifier: verifier,\r\n  }\r\n}\r\n\r\nexport async function completeKiroSocialOAuth(opts: {\r\n  provider: KiroSocialProvider\r\n  callbackUrl: string\r\n  codeVerifier: string\r\n  expectedState: string\r\n}): Promise<{\r\n  accessToken: string\r\n  refreshToken: string\r\n}> {\r\n  const callbackUrl = opts.callbackUrl.trim()\r\n  let parsedUrl: URL\r\n  try {\r\n    parsedUrl = new URL(callbackUrl)\r\n  } catch {\r\n    const query = callbackUrl.replace(/^[?#]/, '')\r\n    if (!query.includes('=')) {\r\n      throw new Error('Kiro social login: invalid callback URL')\r\n    }\r\n    try {\r\n      parsedUrl = new URL(`${KIRO_SOCIAL_REDIRECT_URI}?${query}`)\r\n    } catch {\r\n      throw new Error('Kiro social login: invalid callback URL')\r\n    }\r\n  }\r\n\r\n  const error = parsedUrl.searchParams.get('error')\r\n  if (error) {\r\n    throw new Error(\r\n      parsedUrl.searchParams.get('error_description')\r\n        ?? `Kiro social login failed: ${error}`,\r\n    )\r\n  }\r\n\r\n  const returnedState = parsedUrl.searchParams.get('state')\r\n  if (!returnedState || returnedState !== opts.expectedState) {\r\n    throw new Error('Kiro social login: state mismatch')\r\n  }\r\n\r\n  const code = parsedUrl.searchParams.get('code')\r\n  if (!code) {\r\n    throw new Error('Kiro social login: missing authorization code')\r\n  }\r\n\r\n  const res = await fetch(`${KIRO_SOCIAL_AUTH_SERVICE}/oauth/token`, {\r\n    method: 'POST',\r\n    headers: { 'Content-Type': 'application/json' },\r\n    body: JSON.stringify({\r\n      code,\r\n      code_verifier: opts.codeVerifier,\r\n      redirect_uri: KIRO_SOCIAL_REDIRECT_URI,\r\n    }),\r\n  })\r\n  if (!res.ok) {\r\n    throw new Error(`Kiro social token exchange failed: ${await res.text()}`)\r\n  }\r\n\r\n  const data = _normalizeKiroTokenPayload(await res.json() as Record<string, unknown>)\r\n  if (!data.accessToken) throw new Error('Kiro social login: no access token returned')\r\n\r\n  _saveTokens(KIRO_STORAGE, {\r\n    accessToken: data.accessToken,\r\n    refreshToken: data.refreshToken,\r\n    expiresIn: data.expiresIn ?? 3600,\r\n    meta: {\r\n      authMethod: opts.provider,\r\n      profileArn: data.profileArn ?? null,\r\n      region: 'us-east-1',\r\n    },\r\n  })\r\n  await _reloadKiroLaneAuth()\r\n\r\n  return {\r\n    accessToken: data.accessToken,\r\n    refreshToken: data.refreshToken ?? '',\r\n  }\r\n}\r\n\r\nexport async function refreshKiroOAuth(refreshToken: string): Promise<string> {\r\n  const blob = _loadTokens(KIRO_STORAGE)\r\n  const clientId = blob?.meta?.clientId as string | undefined\r\n  const clientSecret = blob?.meta?.clientSecret as string | undefined\r\n  const baseMeta = blob?.meta ?? {}\r\n  if (!(clientId && clientSecret)) {\r\n    const socialRes = await fetch(`${KIRO_SOCIAL_AUTH_SERVICE}/refreshToken`, {\r\n      method: 'POST',\r\n      headers: { 'Content-Type': 'application/json' },\r\n      body: JSON.stringify({ refreshToken }),\r\n    })\r\n    if (!socialRes.ok) {\r\n      throw new Error(`Kiro social refresh failed: ${await socialRes.text()}`)\r\n    }\r\n    const socialData = _normalizeKiroTokenPayload(await socialRes.json() as Record<string, unknown>)\r\n    if (!socialData.accessToken) {\r\n      throw new Error('Kiro social refresh: no access token')\r\n    }\r\n    _saveTokens(KIRO_STORAGE, {\r\n      accessToken: socialData.accessToken,\r\n      refreshToken: socialData.refreshToken ?? refreshToken,\r\n      expiresIn: socialData.expiresIn ?? 3600,\r\n      meta: {\r\n        ...baseMeta,\r\n        ...(socialData.profileArn ? { profileArn: socialData.profileArn } : {}),\r\n      },\r\n    })\r\n    await _reloadKiroLaneAuth()\r\n    return socialData.accessToken\r\n  }\r\n  const res = await fetch(`${KIRO_OIDC_BASE}/token`, {\r\n    method: 'POST',\r\n    headers: { 'Content-Type': 'application/json' },\r\n    body: JSON.stringify({\r\n      clientId,\r\n      clientSecret,\r\n      refreshToken,\r\n      grantType: 'refresh_token',\r\n    }),\r\n  })\r\n  if (!res.ok) throw new Error(`Kiro refresh failed: ${await res.text()}`)\r\n  const data = _normalizeKiroTokenPayload(await res.json() as Record<string, unknown>)\r\n  if (!data.accessToken) throw new Error('Kiro refresh: no access token')\r\n  _saveTokens(KIRO_STORAGE, {\r\n    accessToken: data.accessToken,\r\n    refreshToken: data.refreshToken ?? refreshToken,\r\n    expiresIn: data.expiresIn,\r\n    meta: baseMeta,\r\n  })\r\n  await _reloadKiroLaneAuth()\r\n  return data.accessToken\r\n}\r\n\r\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n// Cursor \u2014 native browser login\r\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n//\r\n// Mirrors Cursor CLI/IDE's loginDeepControl flow without shelling out to\r\n// either binary. The browser approves a uuid/challenge pair, then api2's\r\n// /auth/poll returns the account tokens for this standalone claudex session.\r\n\r\nconst CURSOR_STORAGE = 'cursor_oauth'\r\nconst CURSOR_WEBSITE_BASE = process.env.CURSOR_WEBSITE_URL ?? 'https://cursor.com'\r\nconst CURSOR_API_BASE = process.env.CURSOR_API_BASE_URL ?? 'https://api2.cursor.sh'\r\nconst CURSOR_POLL_INITIAL_DELAY_MS = 1000\r\nconst CURSOR_POLL_MAX_DELAY_MS = 10_000\r\nconst CURSOR_POLL_MAX_ATTEMPTS = 150\r\n\r\ninterface CursorPollPayload {\r\n  accessToken?: string\r\n  refreshToken?: string\r\n}\r\n\r\nasync function _waitForCursorOAuthResult(\r\n  uuid: string,\r\n  verifier: string,\r\n): Promise<{ accessToken: string; refreshToken: string } | null> {\r\n  const pollUrl = new URL(`${CURSOR_API_BASE}/auth/poll`)\r\n  pollUrl.searchParams.set('uuid', uuid)\r\n  pollUrl.searchParams.set('verifier', verifier)\r\n\r\n  let delayMs = CURSOR_POLL_INITIAL_DELAY_MS\r\n  let consecutiveFailures = 0\r\n\r\n  for (let attempt = 0; attempt < CURSOR_POLL_MAX_ATTEMPTS; attempt++) {\r\n    try {\r\n      const res = await fetch(pollUrl, {\r\n        headers: { 'Content-Type': 'application/json' },\r\n      })\r\n\r\n      if (res.status === 404) {\r\n        consecutiveFailures = 0\r\n      } else if (!res.ok) {\r\n        consecutiveFailures += 1\r\n        if (consecutiveFailures >= 3) return null\r\n      } else {\r\n        const data = await res.json() as CursorPollPayload\r\n        if (data.accessToken && data.refreshToken) {\r\n          return {\r\n            accessToken: data.accessToken,\r\n            refreshToken: data.refreshToken,\r\n          }\r\n        }\r\n        consecutiveFailures += 1\r\n        if (consecutiveFailures >= 3) return null\r\n      }\r\n    } catch {\r\n      consecutiveFailures += 1\r\n      if (consecutiveFailures >= 3) return null\r\n    }\r\n\r\n    await _sleep(delayMs)\r\n    delayMs = Math.min(delayMs * 2, CURSOR_POLL_MAX_DELAY_MS)\r\n  }\r\n\r\n  return null\r\n}\r\n\r\nexport async function startCursorOAuth(): Promise<{\r\n  accessToken: string\r\n  refreshToken: string\r\n}> {\r\n  const { verifier, challenge } = _pkce()\r\n  const uuid = randomUUID()\r\n\r\n  const authUrl = new URL(`${CURSOR_WEBSITE_BASE}/loginDeepControl`)\r\n  authUrl.searchParams.set('challenge', challenge)\r\n  authUrl.searchParams.set('uuid', uuid)\r\n  authUrl.searchParams.set('mode', 'login')\r\n  authUrl.searchParams.set('redirectTarget', 'cli')\r\n\r\n  await openBrowser(authUrl.toString())\r\n\r\n  const tokens = await _waitForCursorOAuthResult(uuid, verifier)\r\n  if (!tokens) {\r\n    throw new Error(\r\n      'Cursor browser login did not complete. Re-run `/login cursor` and approve the sign-in in your browser.',\r\n    )\r\n  }\r\n\r\n  _saveTokens(CURSOR_STORAGE, {\r\n    accessToken: tokens.accessToken,\r\n    refreshToken: tokens.refreshToken,\r\n    expiresIn: _getJwtExpirySeconds(tokens.accessToken),\r\n    meta: { authMethod: 'browser' },\r\n  })\r\n  await _reloadCursorLaneAuth()\r\n\r\n  return tokens\r\n}\r\n\r\nexport function saveCursorToken(\r\n  accessToken: string,\r\n  machineId?: string,\r\n): void {\r\n  // Legacy/manual escape hatch only. Normal Cursor auth uses startCursorOAuth().\r\n  if (!accessToken || accessToken.length < 10) {\r\n    throw new Error('Cursor token looks invalid (too short)')\r\n  }\r\n  _saveTokens(CURSOR_STORAGE, {\r\n    accessToken,\r\n    expiresIn: _getJwtExpirySeconds(accessToken),\r\n    meta: machineId ? { machineId } : undefined,\r\n  })\r\n  void _reloadCursorLaneAuth().catch(() => {})\r\n}\r\n\r\nexport function getCursorOAuthToken(): string | null {\r\n  return _loadTokens(CURSOR_STORAGE)?.accessToken ?? null\r\n}\r\n\r\nexport function getValidCursorOAuthToken(): string | null {\r\n  const blob = _loadTokens(CURSOR_STORAGE)\r\n  if (!blob?.accessToken) return null\r\n  if (blob.expiresAt && Date.now() > blob.expiresAt - TOKEN_REFRESH_BUFFER_MS) {\r\n    return null\r\n  }\r\n  return blob.accessToken\r\n}\r\n\r\nexport function getCursorMachineId(): string | null {\r\n  const blob = _loadTokens(CURSOR_STORAGE)\r\n  return (blob?.meta?.machineId as string) ?? null\r\n}\r\n\r\nexport function clearCursorToken(): void {\r\n  deleteProviderKey(CURSOR_STORAGE)\r\n  void _reloadCursorLaneAuth().catch(() => {})\r\n}\r\n", "/**\n * Abstract base class for all third-party LLM providers.\n *\n * Each provider must normalize its responses into Anthropic-compatible\n * BetaRawMessageStreamEvent / BetaMessage format so the existing agent\n * loop, MCP tools, and streaming renderer work unchanged.\n */\n\nexport interface ProviderStreamResult {\n  [Symbol.asyncIterator](): AsyncIterator<AnthropicStreamEvent>\n  /** Collect all events and return the final assembled message */\n  finalMessage(): Promise<AnthropicMessage>\n  /** Register a callback for the final message */\n  on(event: 'message', cb: (msg: AnthropicMessage) => void): this\n  /** Abort the in-flight request */\n  abort(): void\n}\n\n// \u2500\u2500\u2500 Anthropic-compatible types (subset we need for normalization) \u2500\u2500\n\nexport interface AnthropicContentBlock {\n  type: 'text' | 'tool_use' | 'thinking'\n  // text block\n  text?: string\n  // tool_use block\n  id?: string\n  name?: string\n  input?: Record<string, unknown>\n  // thinking block (Gemini thought / Anthropic thinking)\n  thinking?: string\n  signature?: string\n  // Gemini round-trip: thought_signature on functionCall parts\n  _gemini_thought_signature?: string\n}\n\nexport interface AnthropicMessage {\n  id: string\n  type: 'message'\n  role: 'assistant'\n  content: AnthropicContentBlock[]\n  model: string\n  stop_reason: 'end_turn' | 'tool_use' | 'max_tokens' | null\n  stop_sequence: string | null\n  usage: {\n    input_tokens: number\n    output_tokens: number\n    /**\n     * Optional cache accounting fields. Third-party providers that\n     * support prompt caching (currently Gemini 2.5+ via cachedContents)\n     * populate these so Tau's existing cost tracker treats them\n     * like Anthropic cache hits.\n     */\n    cache_read_input_tokens?: number\n    cache_creation_input_tokens?: number\n  }\n}\n\nexport interface AnthropicStreamEvent {\n  type: string\n  // message_start\n  message?: AnthropicMessage\n  // content_block_start\n  index?: number\n  content_block?: AnthropicContentBlock\n  // content_block_delta\n  delta?: {\n    type?: string\n    text?: string\n    partial_json?: string\n    thinking?: string\n    stop_reason?: string\n    stop_sequence?: string | null\n  }\n  // message_delta \u2014 Anthropic's IR only carries output_tokens here, but we\n  // widen it so third-party lanes whose usage only lands at end-of-stream\n  // (OpenAI Responses `response.completed`, OpenAI Chat's final chunk,\n  // DeepSeek etc.) can surface cache stats without needing a second\n  // message_start. claude.ts's updateUsage() already folds these fields\n  // from message_delta, and provider-bridge's assembler does the same.\n  usage?: {\n    output_tokens: number\n    input_tokens?: number\n    cache_read_input_tokens?: number\n    cache_creation_input_tokens?: number\n  }\n}\n\nexport interface ProviderConfig {\n  apiKey: string\n  baseUrl?: string\n  extraHeaders?: Record<string, string>\n  /** OpenAI session token for ChatGPT backend API (Codex models) */\n  sessionToken?: string\n}\n\nexport interface ModelInfo {\n  id: string\n  name: string\n  /** Upstream organization/provider used for grouped model catalogs. */\n  provider?: string\n  contextWindow?: number\n  supportsToolCalling?: boolean\n  tags?: readonly string[]\n}\n\nexport abstract class BaseProvider {\n  abstract readonly name: string\n\n  /**\n   * Send a streaming request and return an async iterator of\n   * Anthropic-normalized stream events.\n   */\n  abstract stream(params: ProviderRequestParams): Promise<ProviderStreamResult>\n\n  /**\n   * Send a non-streaming request and return a single\n   * Anthropic-normalized message.\n   */\n  abstract create(params: ProviderRequestParams): Promise<AnthropicMessage>\n\n  /**\n   * List available models from this provider.\n   */\n  abstract listModels(): Promise<ModelInfo[]>\n\n  /**\n   * Map a Claude model name (e.g. 'claude-opus-4-6') to the\n   * provider's equivalent model ID.\n   */\n  abstract resolveModel(claudeModel: string): string\n}\n\n// \u2500\u2500\u2500 Common request params (Anthropic-format, pre-adapter) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface ProviderRequestParams {\n  model: string\n  messages: ProviderMessage[]\n  system?: string | SystemBlock[]\n  tools?: ProviderTool[]\n  max_tokens: number\n  temperature?: number\n  stop_sequences?: string[]\n  stream?: boolean\n  /**\n   * Anthropic-format thinking param. Individual providers translate this\n   * into their native reasoning/thinking flag (OpenAI `reasoning_effort`,\n   * Gemini `thinkingConfig`, NIM `nvext.budget_tokens`, OpenRouter\n   * `reasoning`, Ollama `enable_thinking`, etc.). When absent, no thinking\n   * is requested.\n   */\n  thinking?:\n    | { type: 'enabled'; budget_tokens: number }\n    | { type: 'adaptive' }\n    | { type: 'disabled' }\n}\n\nexport interface SystemBlock {\n  type: 'text'\n  text: string\n}\n\nexport interface ProviderMessage {\n  role: 'user' | 'assistant'\n  content: string | ProviderContentBlock[]\n}\n\nexport interface ProviderContentBlock {\n  type: 'text' | 'tool_use' | 'tool_result' | 'image' | 'thinking' | 'redacted_thinking'\n  // text\n  text?: string\n  // tool_use\n  id?: string\n  name?: string\n  input?: Record<string, unknown>\n  // tool_result\n  tool_use_id?: string\n  content?: string | ProviderContentBlock[]\n  is_error?: boolean\n  // image\n  source?: { type: string; media_type: string; data: string }\n  // thinking block\n  thinking?: string\n  signature?: string\n  // Gemini round-trip: thought_signature on tool_use blocks\n  _gemini_thought_signature?: string\n}\n\nexport interface ProviderTool {\n  name: string\n  description?: string\n  input_schema: Record<string, unknown>\n}\n\n// \u2500\u2500\u2500 Helper: Build a ProviderStreamResult from an async iterable \u2500\u2500\u2500\u2500\n\nexport function buildProviderStreamResult(\n  events: AsyncIterable<AnthropicStreamEvent>,\n  fetchAbortController?: AbortController,\n): ProviderStreamResult {\n  let finalMsg: AnthropicMessage | null = null\n  const messageCallbacks: Array<(msg: AnthropicMessage) => void> = []\n  let aborted = false\n\n  const collected: AnthropicStreamEvent[] = []\n\n  const iteratorPromise = (async function* () {\n    try {\n      for await (const event of events) {\n        if (aborted) break\n        collected.push(event)\n        if (event.type === 'message_start' && event.message) {\n          finalMsg = event.message\n        }\n        // Fold final usage from message_delta into finalMsg. Lanes whose\n        // usage only lands at end-of-stream (OpenAI Responses, OpenAI\n        // Chat final chunk, etc.) emit input/cache tokens here; without\n        // this merge the finalMessage() consumer sees the zero'd values\n        // that were placeholder on message_start.\n        if (event.type === 'message_delta' && finalMsg && event.usage) {\n          const u = event.usage\n          if (typeof u.output_tokens === 'number') {\n            finalMsg.usage.output_tokens = u.output_tokens\n          }\n          if (typeof u.input_tokens === 'number' && u.input_tokens > 0) {\n            finalMsg.usage.input_tokens = u.input_tokens\n          }\n          if (typeof u.cache_read_input_tokens === 'number' && u.cache_read_input_tokens > 0) {\n            finalMsg.usage.cache_read_input_tokens = u.cache_read_input_tokens\n          }\n          if (typeof u.cache_creation_input_tokens === 'number' && u.cache_creation_input_tokens > 0) {\n            finalMsg.usage.cache_creation_input_tokens = u.cache_creation_input_tokens\n          }\n        }\n        if (event.type === 'message_stop' && finalMsg) {\n          messageCallbacks.forEach(cb => cb(finalMsg!))\n        }\n        yield event\n      }\n    } catch (err: any) {\n      // Swallow AbortError \u2014 the user cancelled the request via Escape.\n      // Re-throw anything else so real errors surface.\n      if (err?.name === 'AbortError') return\n      throw err\n    }\n  })()\n\n  const result: ProviderStreamResult = {\n    [Symbol.asyncIterator]() {\n      return iteratorPromise[Symbol.asyncIterator]()\n    },\n    async finalMessage() {\n      // Drain the iterator if not yet consumed\n      if (!finalMsg) {\n        for await (const _ of iteratorPromise) {\n          if (aborted) break\n        }\n      }\n      if (!finalMsg) {\n        throw new Error('Stream ended without producing a message')\n      }\n      return finalMsg\n    },\n    on(event: string, cb: (msg: AnthropicMessage) => void) {\n      if (event === 'message') messageCallbacks.push(cb)\n      return result\n    },\n    abort() {\n      aborted = true\n      fetchAbortController?.abort()\n    },\n  }\n\n  return result\n}\n", "/**\r\n * Records the parameter schema of every tool that goes out to a non-Anthropic\r\n * provider so that, on the way back, we can repair model output that arrived\r\n * shaped wrong (e.g. a JSON-encoded string for a parameter the schema declares\r\n * as `array` or `object`).\r\n *\r\n * Inspired by the antigravity / CLIProxyAPI approach: the model sometimes\r\n * stringifies structured args. Without the original schema, the inbound\r\n * adapter has no way to know whether to JSON.parse a string. The cache is\r\n * populated at outbound time (in each anthropic_to_<provider> adapter) and\r\n * consulted at inbound time (in each <provider>_to_anthropic adapter).\r\n *\r\n * Last-write-wins: the same tool name within the same session/process\r\n * overwrites prior entries so updated schemas take precedence.\r\n */\r\n\r\nexport interface SchemaInfo {\r\n  type: string\r\n  items?: SchemaInfo\r\n  properties?: Record<string, SchemaInfo>\r\n}\r\n\r\nconst cache = new Map<string, Map<string, SchemaInfo>>()\r\n\r\nfunction normalizeType(value: unknown): string {\r\n  if (typeof value === 'string') return value\r\n  if (Array.isArray(value)) {\r\n    const nonNull = value.filter(t => t !== 'null')\r\n    const first = nonNull[0] ?? value[0]\r\n    if (typeof first === 'string') return first\r\n  }\r\n  return 'unknown'\r\n}\r\n\r\nfunction extract(schema: unknown): SchemaInfo {\r\n  if (!schema || typeof schema !== 'object') return { type: 'unknown' }\r\n  const record = schema as Record<string, unknown>\r\n  const type = normalizeType(record.type)\r\n  const info: SchemaInfo = { type }\r\n\r\n  if (type === 'array' && record.items) {\r\n    info.items = extract(record.items)\r\n  } else if (type === 'object' && record.properties && typeof record.properties === 'object') {\r\n    info.properties = {}\r\n    for (const [key, value] of Object.entries(record.properties as Record<string, unknown>)) {\r\n      info.properties[key] = extract(value)\r\n    }\r\n  }\r\n\r\n  return info\r\n}\r\n\r\n/**\r\n * Records the parameter shape for a tool, keyed by name. Pass the JSON Schema\r\n * object that has `properties`. Stores nothing for tools without properties\r\n * but still records the name so repeated calls don't surprise the caller.\r\n */\r\nexport function recordToolSchema(toolName: string, schema: unknown): void {\r\n  if (!toolName) return\r\n  const properties =\r\n    schema && typeof schema === 'object'\r\n      ? (schema as Record<string, unknown>).properties\r\n      : undefined\r\n\r\n  const params = new Map<string, SchemaInfo>()\r\n  if (properties && typeof properties === 'object' && !Array.isArray(properties)) {\r\n    for (const [name, paramSchema] of Object.entries(properties as Record<string, unknown>)) {\r\n      params.set(name, extract(paramSchema))\r\n    }\r\n  }\r\n  cache.set(toolName, params)\r\n}\r\n\r\n/** Returns the recorded type for a single parameter (e.g. \"array\", \"object\"). */\r\nexport function getParamType(toolName: string, paramName: string): string | undefined {\r\n  return cache.get(toolName)?.get(paramName)?.type\r\n}\r\n\r\nfunction looksLikeJson(value: string): boolean {\r\n  const trimmed = value.trim()\r\n  if (trimmed.length < 2) return false\r\n  const first = trimmed[0]\r\n  const last = trimmed[trimmed.length - 1]\r\n  return (first === '{' && last === '}') || (first === '[' && last === ']')\r\n}\r\n\r\n/**\r\n * Walks a tool-call args object and JSON-parses string values whose schema\r\n * declares them as `array` or `object`. Leaves everything else untouched.\r\n * Returns the original reference when no coercion was needed.\r\n */\r\nexport function coerceToolCallArgs(toolName: string, args: unknown): unknown {\r\n  if (!args || typeof args !== 'object' || Array.isArray(args)) return args\r\n  const params = cache.get(toolName)\r\n  if (!params || params.size === 0) return args\r\n\r\n  const record = args as Record<string, unknown>\r\n  let mutated = false\r\n  const next: Record<string, unknown> = {}\r\n  for (const [key, value] of Object.entries(record)) {\r\n    const expected = params.get(key)?.type\r\n    if (\r\n      typeof value === 'string' &&\r\n      (expected === 'array' || expected === 'object') &&\r\n      looksLikeJson(value)\r\n    ) {\r\n      try {\r\n        next[key] = JSON.parse(value)\r\n        mutated = true\r\n        continue\r\n      } catch {\r\n        // fall through and keep the original string\r\n      }\r\n    }\r\n    next[key] = value\r\n  }\r\n\r\n  return mutated ? next : args\r\n}\r\n\r\n/** Test-only / shutdown helper. */\r\nexport function clearToolSchemaCache(): void {\r\n  cache.clear()\r\n}\r\n", "/**\r\n * Outbound adapter: Converts Anthropic-format messages \u2192 OpenAI Chat Completions format.\r\n *\r\n * Used by OpenAI-compatible providers (OpenAI, OpenRouter, Groq, NVIDIA NIM).\r\n */\r\n\r\nimport type {\r\n  ProviderMessage,\r\n  ProviderContentBlock,\r\n  ProviderTool,\r\n  SystemBlock,\r\n} from '../providers/base_provider.js'\r\nimport { recordToolSchema } from './tool_schema_cache.js'\r\n\r\n// \u2500\u2500\u2500 OpenAI types (minimal, no SDK dependency) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport interface OpenAIMessage {\r\n  role: 'system' | 'user' | 'assistant' | 'tool'\r\n  content?: string | OpenAIContentPart[] | null\r\n  tool_calls?: OpenAIToolCall[]\r\n  tool_call_id?: string\r\n  name?: string\r\n}\r\n\r\nexport interface OpenAIContentPart {\r\n  type: 'text' | 'image_url'\r\n  text?: string\r\n  image_url?: { url: string; detail?: string }\r\n  cache_control?: { type: string }\r\n}\r\n\r\nexport interface OpenAIToolCall {\r\n  id: string\r\n  type: 'function'\r\n  function: { name: string; arguments: string }\r\n}\r\n\r\nexport interface OpenAITool {\r\n  type: 'function'\r\n  function: {\r\n    name: string\r\n    description?: string\r\n    parameters: Record<string, unknown>\r\n  }\r\n}\r\n\r\n// \u2500\u2500\u2500 Anthropic-field stripping \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n/**\r\n * Remove Anthropic-specific fields (cache_control, citations, etc.)\r\n * from content blocks before sending to third-party providers.\r\n * These fields are not part of the OpenAI API and may cause errors\r\n * or leak internal implementation details (#276, #268, #258).\r\n */\r\nfunction stripAnthropicFields(block: ProviderContentBlock): ProviderContentBlock {\r\n  // Destructure known Anthropic-only fields and return the rest\r\n  const { cache_control, citations, ...clean } = block as ProviderContentBlock & {\r\n    cache_control?: unknown\r\n    citations?: unknown\r\n  }\r\n  return clean\r\n}\r\n\r\nfunction textFromContent(content: ProviderContentBlock['content']): string {\r\n  if (typeof content === 'string') return content\r\n  if (!Array.isArray(content)) return ''\r\n  return content.map(c => c.text ?? '').join('')\r\n}\r\n\r\nfunction imagePartsFromContent(\r\n  content: ProviderContentBlock['content'],\r\n): OpenAIContentPart[] {\r\n  if (!Array.isArray(content)) return []\r\n  return content.flatMap(c =>\r\n    c.type === 'image' && c.source\r\n      ? [{\r\n          type: 'image_url' as const,\r\n          image_url: {\r\n            url: `data:${c.source.media_type};base64,${c.source.data}`,\r\n          },\r\n        }]\r\n      : [],\r\n  )\r\n}\r\n\r\n// \u2500\u2500\u2500 Message Conversion \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport interface AdapterOptions {\r\n  /**\r\n   * Preserve cache_control markers on content blocks.\r\n   * OpenRouter passes these through to underlying providers (Anthropic, etc.)\r\n   * enabling prompt caching and reducing per-request token usage.\r\n   */\r\n  preserveCacheControl?: boolean\r\n}\r\n\r\nexport function anthropicMessagesToOpenAI(\r\n  messages: ProviderMessage[],\r\n  system?: string | SystemBlock[],\r\n  options?: AdapterOptions,\r\n): OpenAIMessage[] {\r\n  const result: OpenAIMessage[] = []\r\n  const keepCache = options?.preserveCacheControl === true\r\n\r\n  // System prompt \u2192 system message\r\n  if (system) {\r\n    if (keepCache && Array.isArray(system)) {\r\n      // Preserve cache_control in structured content blocks so providers\r\n      // like OpenRouter can forward them for prompt caching.\r\n      const parts: OpenAIContentPart[] = system.map(s => {\r\n        const block = s as SystemBlock & { cache_control?: { type: string } }\r\n        const part: OpenAIContentPart = { type: 'text', text: block.text }\r\n        if (block.cache_control) {\r\n          part.cache_control = block.cache_control\r\n        }\r\n        return part\r\n      })\r\n      result.push({ role: 'system', content: parts })\r\n    } else {\r\n      const systemText = typeof system === 'string'\r\n        ? system\r\n        : system.map(s => {\r\n            const { cache_control, ...rest } = s as SystemBlock & { cache_control?: unknown }\r\n            return rest.text\r\n          }).join('\\n\\n')\r\n      if (systemText) {\r\n        result.push({ role: 'system', content: systemText })\r\n      }\r\n    }\r\n  }\r\n\r\n  const stripBlock = keepCache\r\n    ? (block: ProviderContentBlock) => {\r\n        // Keep cache_control, strip only other Anthropic-specific fields\r\n        const { citations, ...clean } = block as ProviderContentBlock & { citations?: unknown }\r\n        return clean\r\n      }\r\n    : stripAnthropicFields\r\n\r\n  for (const msg of messages) {\r\n    if (typeof msg.content === 'string') {\r\n      result.push({ role: msg.role as 'user' | 'assistant', content: msg.content })\r\n      continue\r\n    }\r\n\r\n    // Content is an array of blocks\r\n    const blocks = (msg.content as ProviderContentBlock[]).map(stripBlock)\r\n\r\n    if (msg.role === 'assistant') {\r\n      // Check for tool_use blocks\r\n      const textParts = blocks.filter(b => b.type === 'text')\r\n      const toolUses = blocks.filter(b => b.type === 'tool_use')\r\n\r\n      const openAIMsg: OpenAIMessage = { role: 'assistant' }\r\n\r\n      if (textParts.length > 0) {\r\n        openAIMsg.content = textParts.map(t => t.text ?? '').join('')\r\n      } else {\r\n        openAIMsg.content = null\r\n      }\r\n\r\n      if (toolUses.length > 0) {\r\n        openAIMsg.tool_calls = toolUses.map(t => ({\r\n          id: t.id ?? `call_${Math.random().toString(36).slice(2, 11)}`,\r\n          type: 'function' as const,\r\n          function: {\r\n            name: t.name ?? '',\r\n            arguments: JSON.stringify(t.input ?? {}),\r\n          },\r\n        }))\r\n      }\r\n\r\n      result.push(openAIMsg)\r\n    } else {\r\n      // User message \u2014 may contain text, tool_results, or images\r\n      const toolResults = blocks.filter(b => b.type === 'tool_result')\r\n      const otherBlocks = blocks.filter(b => b.type !== 'tool_result')\r\n\r\n      // Emit tool results as separate 'tool' role messages\r\n      const toolResultImageParts: OpenAIContentPart[] = []\r\n      for (const tr of toolResults) {\r\n        const content = textFromContent(tr.content)\r\n        toolResultImageParts.push(...imagePartsFromContent(tr.content))\r\n        result.push({\r\n          role: 'tool',\r\n          tool_call_id: tr.tool_use_id ?? '',\r\n          content,\r\n        })\r\n      }\r\n\r\n      if (toolResultImageParts.length > 0) {\r\n        result.push({\r\n          role: 'user',\r\n          content: [\r\n            {\r\n              type: 'text',\r\n              text: 'Visual observation from the previous tool result:',\r\n            },\r\n            ...toolResultImageParts,\r\n          ],\r\n        })\r\n      }\r\n\r\n      // Emit remaining content as user message\r\n      if (otherBlocks.length > 0) {\r\n        const hasImages = otherBlocks.some(b => b.type === 'image')\r\n        if (hasImages) {\r\n          // Use OpenAI content parts format for mixed text+images\r\n          const parts: OpenAIContentPart[] = otherBlocks.map(b => {\r\n            if (b.type === 'image' && b.source) {\r\n              return {\r\n                type: 'image_url' as const,\r\n                image_url: {\r\n                  url: `data:${b.source.media_type};base64,${b.source.data}`,\r\n                },\r\n              }\r\n            }\r\n            return { type: 'text' as const, text: b.text ?? '' }\r\n          })\r\n          result.push({ role: 'user', content: parts })\r\n        } else {\r\n          const text = otherBlocks.map(b => b.text ?? '').join('')\r\n          if (text) {\r\n            result.push({ role: 'user', content: text })\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  return result\r\n}\r\n\r\n/**\r\n * Coalesce consecutive same-role messages for strict models (e.g. o1-series)\r\n * that require strictly alternating user/assistant roles.\r\n * Merges consecutive messages with the same role by joining their text content.\r\n */\r\nexport function coalesceConsecutiveMessages(messages: OpenAIMessage[]): OpenAIMessage[] {\r\n  if (messages.length <= 1) return messages\r\n\r\n  const result: OpenAIMessage[] = [messages[0]!]\r\n\r\n  for (let i = 1; i < messages.length; i++) {\r\n    const current = messages[i]!\r\n    const prev = result[result.length - 1]!\r\n\r\n    // Only coalesce if same role AND neither has tool_calls/tool_call_id\r\n    if (\r\n      current.role === prev.role &&\r\n      !current.tool_calls && !prev.tool_calls &&\r\n      !current.tool_call_id && !prev.tool_call_id\r\n    ) {\r\n      // Merge text content\r\n      const prevText = typeof prev.content === 'string' ? prev.content : ''\r\n      const currText = typeof current.content === 'string' ? current.content : ''\r\n      prev.content = [prevText, currText].filter(Boolean).join('\\n\\n')\r\n    } else {\r\n      result.push(current)\r\n    }\r\n  }\r\n\r\n  return result\r\n}\r\n\r\n// \u2500\u2500\u2500 Schema Sanitization \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n/**\r\n * Fields that many OpenAI-compatible providers do not support in tool schemas.\r\n * Standard JSON Schema but rejected by Groq, some OpenRouter models, etc.\r\n * Stripping these avoids 400 errors across the ecosystem.\r\n */\r\nconst UNSUPPORTED_OPENAI_SCHEMA_FIELDS = new Set([\r\n  '$schema',\r\n  '$id',\r\n  '$ref',\r\n  '$comment',\r\n])\r\n\r\n/**\r\n * Recursively strip unsupported JSON Schema fields from tool parameter schemas.\r\n * Returns a new object \u2014 does not mutate the original.\r\n */\r\nexport function sanitizeSchemaForOpenAI(schema: Record<string, unknown>): Record<string, unknown> {\r\n  const result: Record<string, unknown> = {}\r\n\r\n  for (const [key, value] of Object.entries(schema)) {\r\n    if (UNSUPPORTED_OPENAI_SCHEMA_FIELDS.has(key)) continue\r\n\r\n    if (key === 'properties' && value && typeof value === 'object' && !Array.isArray(value)) {\r\n      result[key] = Object.fromEntries(\r\n        Object.entries(value as Record<string, unknown>).map(([propName, propSchema]) => [\r\n          propName,\r\n          propSchema && typeof propSchema === 'object' && !Array.isArray(propSchema)\r\n            ? sanitizeSchemaForOpenAI(propSchema as Record<string, unknown>)\r\n            : propSchema,\r\n        ]),\r\n      )\r\n    } else if (key === 'items' && value && typeof value === 'object' && !Array.isArray(value)) {\r\n      result[key] = sanitizeSchemaForOpenAI(value as Record<string, unknown>)\r\n    } else {\r\n      result[key] = value\r\n    }\r\n  }\r\n\r\n  return result\r\n}\r\n\r\n// \u2500\u2500\u2500 Tool Conversion \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport function anthropicToolsToOpenAI(tools: ProviderTool[]): OpenAITool[] {\r\n  return tools.map(t => {\r\n    const parameters = sanitizeSchemaForOpenAI(t.input_schema)\r\n    recordToolSchema(t.name, parameters)\r\n    return {\r\n      type: 'function' as const,\r\n      function: {\r\n        name: t.name,\r\n        description: t.description,\r\n        parameters,\r\n      },\r\n    }\r\n  })\r\n}\r\n", "/**\r\n * Inbound adapter: Converts OpenAI Chat Completions responses \u2192 Anthropic format.\r\n *\r\n * Handles both streaming (SSE chunks) and non-streaming (complete response) conversion.\r\n * Emits the exact event sequence the existing streaming handler in claude.ts expects:\r\n *   message_start \u2192 content_block_start \u2192 content_block_delta* \u2192 content_block_stop \u2192 message_delta \u2192 message_stop\r\n */\r\n\r\nimport type {\r\n  AnthropicMessage,\r\n  AnthropicStreamEvent,\r\n  AnthropicContentBlock,\r\n} from '../providers/base_provider.js'\r\nimport { coerceToolCallArgs } from './tool_schema_cache.js'\r\n\r\n// \u2500\u2500\u2500 OpenAI response types (minimal) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport interface OpenAIChatCompletion {\r\n  id: string\r\n  object: string\r\n  model: string\r\n  choices: Array<{\r\n    index: number\r\n    message: {\r\n      role: string\r\n      content: string | null\r\n      reasoning_content?: string | null\r\n      tool_calls?: Array<{\r\n        id: string\r\n        type: 'function'\r\n        function: { name: string; arguments: string }\r\n      }>\r\n    }\r\n    finish_reason: string | null\r\n  }>\r\n  usage?: {\r\n    prompt_tokens: number\r\n    completion_tokens: number\r\n    total_tokens: number\r\n    prompt_tokens_details?: { cached_tokens?: number }\r\n    completion_tokens_details?: { reasoning_tokens?: number }\r\n  }\r\n}\r\n\r\nexport interface OpenAIChatCompletionChunk {\r\n  id: string\r\n  object: string\r\n  model: string\r\n  choices: Array<{\r\n    index: number\r\n    delta: {\r\n      role?: string\r\n      content?: string | null\r\n      reasoning_content?: string | null\r\n      tool_calls?: Array<{\r\n        index: number\r\n        id?: string\r\n        type?: string\r\n        function?: { name?: string; arguments?: string }\r\n      }>\r\n    }\r\n    finish_reason: string | null\r\n  }>\r\n  usage?: {\r\n    prompt_tokens: number\r\n    completion_tokens: number\r\n    total_tokens: number\r\n    prompt_tokens_details?: { cached_tokens?: number }\r\n    completion_tokens_details?: { reasoning_tokens?: number }\r\n  } | null\r\n}\r\n\r\n// \u2500\u2500\u2500 Non-Streaming Conversion \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport function openAIMessageToAnthropic(\r\n  response: OpenAIChatCompletion,\r\n): AnthropicMessage {\r\n  const choice = response.choices[0]\r\n  if (!choice) {\r\n    return {\r\n      id: response.id ?? `msg_${Date.now()}`,\r\n      type: 'message',\r\n      role: 'assistant',\r\n      content: [],\r\n      model: response.model,\r\n      stop_reason: 'end_turn',\r\n      stop_sequence: null,\r\n      usage: {\r\n        input_tokens: response.usage?.prompt_tokens ?? 0,\r\n        output_tokens: response.usage?.completion_tokens ?? 0,\r\n      },\r\n    }\r\n  }\r\n\r\n  const content: AnthropicContentBlock[] = []\r\n\r\n  // Reasoning content \u2192 thinking block (DeepSeek R1, o1-series)\r\n  if (choice.message.reasoning_content) {\r\n    content.push({\r\n      type: 'thinking' as any,\r\n      thinking: choice.message.reasoning_content,\r\n    } as any)\r\n  }\r\n\r\n  // Text content\r\n  if (choice.message.content) {\r\n    content.push({ type: 'text', text: choice.message.content })\r\n  }\r\n\r\n  // Tool calls \u2192 tool_use blocks\r\n  if (choice.message.tool_calls) {\r\n    for (const tc of choice.message.tool_calls) {\r\n      let input: Record<string, unknown> = {}\r\n      try {\r\n        input = JSON.parse(tc.function.arguments)\r\n      } catch {\r\n        input = { _raw: tc.function.arguments }\r\n      }\r\n      const coerced = coerceToolCallArgs(tc.function.name, input)\r\n      content.push({\r\n        type: 'tool_use',\r\n        id: tc.id,\r\n        name: tc.function.name,\r\n        input: (coerced ?? input) as Record<string, unknown>,\r\n      })\r\n    }\r\n  }\r\n\r\n  const stopReason = choice.finish_reason === 'tool_calls' ? 'tool_use'\r\n    : choice.finish_reason === 'length' ? 'max_tokens'\r\n    : 'end_turn'\r\n\r\n  const cachedTokens = response.usage?.prompt_tokens_details?.cached_tokens ?? 0\r\n  const promptTokens = response.usage?.prompt_tokens ?? 0\r\n  // OpenAI's prompt_tokens is the TOTAL (cached + fresh). Anthropic's\r\n  // semantic treats input_tokens and cache_read_input_tokens as separate\r\n  // additive buckets. Subtract so downstream cost / context-meter code\r\n  // doesn't double-count the cached portion.\r\n  const freshInputTokens = Math.max(0, promptTokens - cachedTokens)\r\n\r\n  return {\r\n    id: response.id ?? `msg_${Date.now()}`,\r\n    type: 'message',\r\n    role: 'assistant',\r\n    content,\r\n    model: response.model,\r\n    stop_reason: stopReason as AnthropicMessage['stop_reason'],\r\n    stop_sequence: null,\r\n    usage: {\r\n      input_tokens: freshInputTokens,\r\n      output_tokens: response.usage?.completion_tokens ?? 0,\r\n      ...(cachedTokens > 0 && {\r\n        cache_read_input_tokens: cachedTokens,\r\n        cache_creation_input_tokens: 0,\r\n      }),\r\n    },\r\n  }\r\n}\r\n\r\n// \u2500\u2500\u2500 Streaming Conversion \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n/**\r\n * Converts an async iterable of OpenAI streaming chunks into\r\n * Anthropic-format stream events.\r\n *\r\n * Handles:\r\n * - Text content streaming\r\n * - Tool call argument streaming (buffered per tool index)\r\n * - Parallel tool calls (multiple indices)\r\n * - Proper event ordering (message_start first, message_stop last)\r\n */\r\nexport async function* openAIStreamToAnthropicEvents(\r\n  openAIStream: AsyncIterable<OpenAIChatCompletionChunk>,\r\n): AsyncGenerator<AnthropicStreamEvent> {\r\n  let messageStarted = false\r\n  let currentModel = ''\r\n  let messageId = ''\r\n  let blockIndex = 0\r\n  let hasThinkingBlock = false\r\n  let hasTextBlock = false\r\n\r\n  // Track tool calls by index for argument buffering\r\n  const toolCallState: Map<number, {\r\n    id: string\r\n    name: string\r\n    argBuffer: string\r\n    blockIndex: number\r\n    started: boolean\r\n  }> = new Map()\r\n\r\n  let totalInputTokens = 0\r\n  let totalOutputTokens = 0\r\n  let totalCachedTokens = 0\r\n  let finishedCleanly = false\r\n\r\n  for await (const chunk of openAIStream) {\r\n    if (!chunk.choices || chunk.choices.length === 0) {\r\n      // Usage-only chunk (some providers send this at the end)\r\n      if (chunk.usage) {\r\n        totalInputTokens = chunk.usage.prompt_tokens ?? totalInputTokens\r\n        totalOutputTokens = chunk.usage.completion_tokens ?? totalOutputTokens\r\n        totalCachedTokens = chunk.usage.prompt_tokens_details?.cached_tokens ?? totalCachedTokens\r\n      }\r\n      continue\r\n    }\r\n\r\n    const choice = chunk.choices[0]!\r\n    if (!messageId) messageId = chunk.id ?? `msg_${Date.now()}`\r\n    if (!currentModel) currentModel = chunk.model ?? ''\r\n\r\n    // Emit message_start on first chunk\r\n    if (!messageStarted) {\r\n      messageStarted = true\r\n      yield {\r\n        type: 'message_start',\r\n        message: {\r\n          id: messageId,\r\n          type: 'message',\r\n          role: 'assistant',\r\n          content: [],\r\n          model: currentModel,\r\n          stop_reason: null,\r\n          stop_sequence: null,\r\n          usage: { input_tokens: 0, output_tokens: 0 },\r\n        },\r\n      }\r\n    }\r\n\r\n    // Handle reasoning_content (DeepSeek R1, o1-series) \u2192 thinking block\r\n    if (choice.delta.reasoning_content != null && choice.delta.reasoning_content !== '') {\r\n      if (!hasThinkingBlock) {\r\n        hasThinkingBlock = true\r\n        yield {\r\n          type: 'content_block_start',\r\n          index: blockIndex,\r\n          content_block: { type: 'thinking', thinking: '' } as any,\r\n        }\r\n      }\r\n      yield {\r\n        type: 'content_block_delta',\r\n        index: blockIndex,\r\n        delta: { type: 'thinking_delta' as any, thinking: choice.delta.reasoning_content } as any,\r\n      }\r\n    }\r\n\r\n    // Handle text content\r\n    if (choice.delta.content != null && choice.delta.content !== '') {\r\n      // Close thinking block before text starts\r\n      if (hasThinkingBlock) {\r\n        yield { type: 'content_block_stop', index: blockIndex }\r\n        blockIndex++\r\n        hasThinkingBlock = false\r\n      }\r\n      if (!hasTextBlock) {\r\n        hasTextBlock = true\r\n        yield {\r\n          type: 'content_block_start',\r\n          index: blockIndex,\r\n          content_block: { type: 'text', text: '' },\r\n        }\r\n      }\r\n      yield {\r\n        type: 'content_block_delta',\r\n        index: blockIndex,\r\n        delta: { type: 'text_delta', text: choice.delta.content },\r\n      }\r\n    }\r\n\r\n    // Handle tool calls\r\n    if (choice.delta.tool_calls) {\r\n      // Close text block before tool calls start\r\n      if (hasTextBlock) {\r\n        yield { type: 'content_block_stop', index: blockIndex }\r\n        blockIndex++\r\n        hasTextBlock = false\r\n      }\r\n\r\n      for (const tc of choice.delta.tool_calls) {\r\n        const tcIndex = tc.index ?? 0\r\n\r\n        if (!toolCallState.has(tcIndex)) {\r\n          // New tool call \u2014 emit content_block_start\r\n          const toolId = tc.id ?? `toolu_${Math.random().toString(36).slice(2, 11)}`\r\n          const toolName = tc.function?.name ?? ''\r\n          const currentBlockIndex = blockIndex++\r\n\r\n          toolCallState.set(tcIndex, {\r\n            id: toolId,\r\n            name: toolName,\r\n            argBuffer: '',\r\n            blockIndex: currentBlockIndex,\r\n            started: false,\r\n          })\r\n        }\r\n\r\n        const state = toolCallState.get(tcIndex)!\r\n\r\n        // Update name if provided (sometimes comes in a later chunk)\r\n        if (tc.function?.name) state.name = tc.function.name\r\n        if (tc.id) state.id = tc.id\r\n\r\n        // Emit start event once we have the name\r\n        if (!state.started && state.name) {\r\n          state.started = true\r\n          yield {\r\n            type: 'content_block_start',\r\n            index: state.blockIndex,\r\n            content_block: {\r\n              type: 'tool_use',\r\n              id: state.id,\r\n              name: state.name,\r\n              input: {},\r\n            },\r\n          }\r\n        }\r\n\r\n        // Stream argument chunks\r\n        if (tc.function?.arguments) {\r\n          state.argBuffer += tc.function.arguments\r\n          yield {\r\n            type: 'content_block_delta',\r\n            index: state.blockIndex,\r\n            delta: {\r\n              type: 'input_json_delta',\r\n              partial_json: tc.function.arguments,\r\n            },\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    // Handle finish\r\n    if (choice.finish_reason) {\r\n      // Close any open thinking block\r\n      if (hasThinkingBlock) {\r\n        yield { type: 'content_block_stop', index: blockIndex }\r\n        hasThinkingBlock = false\r\n      }\r\n\r\n      // Close any open text block\r\n      if (hasTextBlock) {\r\n        yield { type: 'content_block_stop', index: blockIndex }\r\n        hasTextBlock = false\r\n      }\r\n\r\n      // Close any open tool call blocks\r\n      for (const [, state] of toolCallState) {\r\n        if (state.started) {\r\n          yield { type: 'content_block_stop', index: state.blockIndex }\r\n        }\r\n      }\r\n\r\n      // Determine stop reason\r\n      const stopReason = choice.finish_reason === 'tool_calls' ? 'tool_use'\r\n        : choice.finish_reason === 'length' ? 'max_tokens'\r\n        : 'end_turn'\r\n\r\n      // Update usage from final chunk\r\n      if (chunk.usage) {\r\n        totalInputTokens = chunk.usage.prompt_tokens ?? totalInputTokens\r\n        totalOutputTokens = chunk.usage.completion_tokens ?? totalOutputTokens\r\n        totalCachedTokens = chunk.usage.prompt_tokens_details?.cached_tokens ?? totalCachedTokens\r\n      }\r\n\r\n      // message_delta with stop reason. Input + cache tokens are piggy-\r\n      // backed so downstream (claude.ts updateUsage, provider-bridge\r\n      // assembler) picks them up \u2014 OpenAI only ships usage in the final\r\n      // chunk, so message_start was emitted with zeros. Split OpenAI's\r\n      // total prompt_tokens into fresh vs cached to match Anthropic's\r\n      // additive-bucket semantic.\r\n      yield {\r\n        type: 'message_delta',\r\n        delta: { stop_reason: stopReason, stop_sequence: null },\r\n        usage: {\r\n          output_tokens: totalOutputTokens,\r\n          input_tokens: Math.max(0, totalInputTokens - totalCachedTokens),\r\n          ...(totalCachedTokens > 0 && {\r\n            cache_read_input_tokens: totalCachedTokens,\r\n            cache_creation_input_tokens: 0,\r\n          }),\r\n        },\r\n      }\r\n\r\n      // message_stop\r\n      yield { type: 'message_stop' }\r\n      finishedCleanly = true\r\n    }\r\n  }\r\n\r\n  // Safety: if stream ended without finish_reason, close gracefully\r\n  if (messageStarted && !finishedCleanly) {\r\n    if (hasThinkingBlock) {\r\n      yield { type: 'content_block_stop', index: blockIndex }\r\n    }\r\n    if (hasTextBlock) {\r\n      yield { type: 'content_block_stop', index: blockIndex }\r\n    }\r\n    for (const [, state] of toolCallState) {\r\n      if (state.started) {\r\n        yield { type: 'content_block_stop', index: state.blockIndex }\r\n      }\r\n    }\r\n    yield {\r\n      type: 'message_delta',\r\n      delta: { stop_reason: 'end_turn', stop_sequence: null },\r\n      usage: {\r\n        output_tokens: totalOutputTokens,\r\n        input_tokens: Math.max(0, totalInputTokens - totalCachedTokens),\r\n        ...(totalCachedTokens > 0 && {\r\n          cache_read_input_tokens: totalCachedTokens,\r\n          cache_creation_input_tokens: 0,\r\n        }),\r\n      },\r\n    }\r\n    yield { type: 'message_stop' }\r\n  }\r\n}\r\n", "/**\r\n * Adapters for the OpenAI Responses API (POST /v1/responses).\r\n *\r\n * GPT-5 Codex models use this API instead of Chat Completions.\r\n * Handles both directions:\r\n *   1. Anthropic messages/tools \u2192 Responses API input/tools\r\n *   2. Responses API SSE events \u2192 Anthropic stream events\r\n */\r\n\r\nimport type {\r\n  AnthropicMessage,\r\n  AnthropicStreamEvent,\r\n  AnthropicContentBlock,\r\n  ProviderMessage,\r\n  ProviderContentBlock,\r\n  ProviderTool,\r\n  SystemBlock,\r\n} from '../providers/base_provider.js'\r\nimport { sanitizeSchemaForOpenAI } from './anthropic_to_openai.js'\r\nimport { coerceToolCallArgs, recordToolSchema } from './tool_schema_cache.js'\r\n\r\n// \u2500\u2500\u2500 Responses API types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n/** Generic SSE event from the Responses API stream. */\r\nexport interface ResponsesSSEEvent {\r\n  type: string\r\n  [key: string]: unknown\r\n}\r\n\r\n/** Non-streaming Responses API response. */\r\nexport interface ResponsesApiResponse {\r\n  id: string\r\n  object?: string\r\n  model: string\r\n  output: ResponsesOutputItem[]\r\n  usage?: {\r\n    input_tokens: number\r\n    output_tokens: number\r\n    total_tokens: number\r\n    input_tokens_details?: { cached_tokens?: number }\r\n    output_tokens_details?: { reasoning_tokens?: number }\r\n  }\r\n}\r\n\r\ninterface ResponsesOutputItem {\r\n  type: string\r\n  id?: string\r\n  role?: string\r\n  call_id?: string\r\n  name?: string\r\n  arguments?: string\r\n  content?: Array<{ type: string; text?: string }>\r\n}\r\n\r\n/** An input item for the Responses API `input` array. */\r\nexport interface ResponsesInputItem {\r\n  type: string\r\n  [key: string]: unknown\r\n}\r\n\r\n/** A function tool in Responses API format. */\r\nexport interface ResponsesApiTool {\r\n  type: 'function'\r\n  name: string\r\n  description?: string\r\n  parameters: Record<string, unknown>\r\n  strict: boolean\r\n}\r\n\r\nfunction textFromContent(content: ProviderContentBlock['content']): string {\r\n  if (typeof content === 'string') return content\r\n  if (!Array.isArray(content)) return ''\r\n  return (content as ProviderContentBlock[]).map(c => c.text ?? '').join('')\r\n}\r\n\r\nfunction imageItemsFromContent(\r\n  content: ProviderContentBlock['content'],\r\n): Array<Record<string, unknown>> {\r\n  if (!Array.isArray(content)) return []\r\n  return (content as ProviderContentBlock[]).flatMap(c =>\r\n    c.type === 'image' && c.source\r\n      ? [{\r\n          type: 'input_image',\r\n          image_url: `data:${c.source.media_type};base64,${c.source.data}`,\r\n        }]\r\n      : [],\r\n  )\r\n}\r\n\r\n// \u2500\u2500\u2500 Input conversion (Anthropic \u2192 Responses API) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n/**\r\n * Extract the system prompt text for the Responses API `instructions` field.\r\n */\r\nexport function extractInstructions(system?: string | SystemBlock[]): string {\r\n  if (!system) return ''\r\n  if (typeof system === 'string') return system\r\n  return system.map(s => s.text).join('\\n\\n')\r\n}\r\n\r\n/**\r\n * Convert Anthropic conversation messages to Responses API input items.\r\n *\r\n * Mapping:\r\n *   user text        \u2192 { type: \"message\", role: \"user\", content: [{ type: \"input_text\", ... }] }\r\n *   assistant text   \u2192 { type: \"message\", role: \"assistant\", content: [{ type: \"output_text\", ... }] }\r\n *   tool_use block   \u2192 { type: \"function_call\", call_id, name, arguments }\r\n *   tool_result      \u2192 { type: \"function_call_output\", call_id, output }\r\n *   image            \u2192 { type: \"message\", role: \"user\", content: [{ type: \"input_image\", ... }] }\r\n */\r\nexport function anthropicToResponsesInput(\r\n  messages: ProviderMessage[],\r\n): ResponsesInputItem[] {\r\n  const items: ResponsesInputItem[] = []\r\n\r\n  for (const msg of messages) {\r\n    if (typeof msg.content === 'string') {\r\n      items.push({\r\n        type: 'message',\r\n        role: msg.role,\r\n        content: [{\r\n          type: msg.role === 'assistant' ? 'output_text' : 'input_text',\r\n          text: msg.content,\r\n        }],\r\n      })\r\n      continue\r\n    }\r\n\r\n    const blocks = msg.content as ProviderContentBlock[]\r\n\r\n    if (msg.role === 'assistant') {\r\n      const textParts: string[] = []\r\n\r\n      for (const block of blocks) {\r\n        if (block.type === 'text' && block.text) {\r\n          textParts.push(block.text)\r\n        } else if (block.type === 'tool_use') {\r\n          // Flush accumulated text before tool call\r\n          if (textParts.length > 0) {\r\n            items.push({\r\n              type: 'message',\r\n              role: 'assistant',\r\n              content: [{ type: 'output_text', text: textParts.join('') }],\r\n            })\r\n            textParts.length = 0\r\n          }\r\n          items.push({\r\n            type: 'function_call',\r\n            call_id: block.id ?? `call_${Math.random().toString(36).slice(2, 11)}`,\r\n            name: block.name ?? '',\r\n            arguments: JSON.stringify(block.input ?? {}),\r\n          })\r\n        }\r\n        // Skip thinking/redacted_thinking \u2014 reasoning is model-internal\r\n      }\r\n\r\n      if (textParts.length > 0) {\r\n        items.push({\r\n          type: 'message',\r\n          role: 'assistant',\r\n          content: [{ type: 'output_text', text: textParts.join('') }],\r\n        })\r\n      }\r\n    } else {\r\n      // User message \u2014 may contain tool_results, text, images\r\n      const toolResults = blocks.filter(b => b.type === 'tool_result')\r\n      const otherBlocks = blocks.filter(b => b.type !== 'tool_result')\r\n\r\n      const toolResultImageItems: Array<Record<string, unknown>> = []\r\n      for (const tr of toolResults) {\r\n        const output = textFromContent(tr.content)\r\n        toolResultImageItems.push(...imageItemsFromContent(tr.content))\r\n        items.push({\r\n          type: 'function_call_output',\r\n          call_id: tr.tool_use_id ?? '',\r\n          output,\r\n        })\r\n      }\r\n\r\n      if (toolResultImageItems.length > 0) {\r\n        items.push({\r\n          type: 'message',\r\n          role: 'user',\r\n          content: [\r\n            {\r\n              type: 'input_text',\r\n              text: 'Visual observation from the previous tool result:',\r\n            },\r\n            ...toolResultImageItems,\r\n          ],\r\n        })\r\n      }\r\n\r\n      if (otherBlocks.length > 0) {\r\n        const content: Array<Record<string, unknown>> = []\r\n        for (const block of otherBlocks) {\r\n          if (block.type === 'image' && block.source) {\r\n            content.push({\r\n              type: 'input_image',\r\n              image_url: `data:${block.source.media_type};base64,${block.source.data}`,\r\n            })\r\n          } else if (block.type === 'text' && block.text) {\r\n            content.push({ type: 'input_text', text: block.text })\r\n          }\r\n        }\r\n        if (content.length > 0) {\r\n          items.push({ type: 'message', role: 'user', content })\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  return items\r\n}\r\n\r\n// \u2500\u2500\u2500 Tool conversion \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n/**\r\n * Convert Anthropic tool definitions to Responses API function tools.\r\n */\r\nexport function anthropicToolsToResponsesTools(\r\n  tools: ProviderTool[],\r\n): ResponsesApiTool[] {\r\n  return tools.map(t => {\r\n    const parameters = sanitizeSchemaForOpenAI(t.input_schema)\r\n    recordToolSchema(t.name, parameters)\r\n    return {\r\n      type: 'function' as const,\r\n      name: t.name,\r\n      description: t.description,\r\n      parameters,\r\n      strict: false,\r\n    }\r\n  })\r\n}\r\n\r\n// \u2500\u2500\u2500 Streaming conversion (Responses API SSE \u2192 Anthropic events) \u2500\u2500\u2500\r\n\r\n/**\r\n * Convert an async stream of Responses API SSE events into Anthropic-format\r\n * stream events. Produces the exact event sequence the streaming handler\r\n * expects:\r\n *   message_start \u2192 content_block_start \u2192 content_block_delta* \u2192\r\n *   content_block_stop \u2192 message_delta \u2192 message_stop\r\n */\r\nexport async function* responsesStreamToAnthropicEvents(\r\n  events: AsyncIterable<ResponsesSSEEvent>,\r\n): AsyncGenerator<AnthropicStreamEvent> {\r\n  let messageStarted = false\r\n  let messageId = ''\r\n  let currentModel = ''\r\n  let blockIndex = 0\r\n  let hasTextBlock = false\r\n  let hadToolCalls = false\r\n  let finishedCleanly = false\r\n  let totalInputTokens = 0\r\n  let totalOutputTokens = 0\r\n  let totalCachedTokens = 0\r\n\r\n  // Track active tool calls by output_index\r\n  const activeTools = new Map<number, { blockIndex: number }>()\r\n\r\n  function* ensureMessageStart(): Generator<AnthropicStreamEvent> {\r\n    if (!messageStarted) {\r\n      messageStarted = true\r\n      yield {\r\n        type: 'message_start',\r\n        message: {\r\n          id: messageId || `msg_${Date.now()}`,\r\n          type: 'message',\r\n          role: 'assistant',\r\n          content: [],\r\n          model: currentModel,\r\n          stop_reason: null,\r\n          stop_sequence: null,\r\n          usage: { input_tokens: 0, output_tokens: 0 },\r\n        },\r\n      }\r\n    }\r\n  }\r\n\r\n  function* closeTextBlock(): Generator<AnthropicStreamEvent> {\r\n    if (hasTextBlock) {\r\n      yield { type: 'content_block_stop', index: blockIndex }\r\n      blockIndex++\r\n      hasTextBlock = false\r\n    }\r\n  }\r\n\r\n  for await (const event of events) {\r\n    switch (event.type) {\r\n      case 'response.created': {\r\n        const resp = event.response as { id?: string; model?: string } | undefined\r\n        messageId = resp?.id ?? `msg_${Date.now()}`\r\n        currentModel = resp?.model ?? ''\r\n        yield* ensureMessageStart()\r\n        break\r\n      }\r\n\r\n      case 'response.output_text.delta': {\r\n        yield* ensureMessageStart()\r\n        if (!hasTextBlock) {\r\n          hasTextBlock = true\r\n          yield {\r\n            type: 'content_block_start',\r\n            index: blockIndex,\r\n            content_block: { type: 'text', text: '' },\r\n          }\r\n        }\r\n        const delta = (event.delta ?? '') as string\r\n        if (delta) {\r\n          yield {\r\n            type: 'content_block_delta',\r\n            index: blockIndex,\r\n            delta: { type: 'text_delta', text: delta },\r\n          }\r\n        }\r\n        break\r\n      }\r\n\r\n      case 'response.output_item.added': {\r\n        const item = event.item as { type?: string; call_id?: string; id?: string; name?: string } | undefined\r\n        const outputIndex = (event.output_index ?? 0) as number\r\n\r\n        if (item?.type === 'function_call') {\r\n          yield* ensureMessageStart()\r\n          yield* closeTextBlock()\r\n\r\n          hadToolCalls = true\r\n          const toolBlockIndex = blockIndex++\r\n          activeTools.set(outputIndex, { blockIndex: toolBlockIndex })\r\n\r\n          yield {\r\n            type: 'content_block_start',\r\n            index: toolBlockIndex,\r\n            content_block: {\r\n              type: 'tool_use',\r\n              id: item.call_id ?? item.id ?? `toolu_${Math.random().toString(36).slice(2, 11)}`,\r\n              name: item.name ?? '',\r\n              input: {},\r\n            },\r\n          }\r\n        }\r\n        break\r\n      }\r\n\r\n      case 'response.function_call_arguments.delta': {\r\n        const outputIndex = (event.output_index ?? 0) as number\r\n        const tool = activeTools.get(outputIndex)\r\n        const delta = (event.delta ?? '') as string\r\n\r\n        if (tool && delta) {\r\n          yield {\r\n            type: 'content_block_delta',\r\n            index: tool.blockIndex,\r\n            delta: { type: 'input_json_delta', partial_json: delta },\r\n          }\r\n        }\r\n        break\r\n      }\r\n\r\n      case 'response.output_item.done': {\r\n        const outputIndex = (event.output_index ?? 0) as number\r\n        const item = event.item as { type?: string } | undefined\r\n\r\n        if (item?.type === 'function_call') {\r\n          const tool = activeTools.get(outputIndex)\r\n          if (tool) {\r\n            yield { type: 'content_block_stop', index: tool.blockIndex }\r\n            activeTools.delete(outputIndex)\r\n          }\r\n        }\r\n        break\r\n      }\r\n\r\n      case 'response.completed': {\r\n        const resp = event.response as {\r\n          usage?: {\r\n            input_tokens?: number\r\n            output_tokens?: number\r\n            input_tokens_details?: { cached_tokens?: number }\r\n          }\r\n          output?: unknown[]\r\n        } | undefined\r\n        totalInputTokens = resp?.usage?.input_tokens ?? 0\r\n        totalOutputTokens = resp?.usage?.output_tokens ?? 0\r\n        totalCachedTokens = resp?.usage?.input_tokens_details?.cached_tokens ?? 0\r\n\r\n        // Check output for function_calls (in case we missed output_item.added)\r\n        if (Array.isArray(resp?.output)) {\r\n          for (const item of resp!.output as Array<{ type?: string }>) {\r\n            if (item?.type === 'function_call') hadToolCalls = true\r\n          }\r\n        }\r\n\r\n        yield* closeTextBlock()\r\n        for (const [, tool] of activeTools) {\r\n          yield { type: 'content_block_stop', index: tool.blockIndex }\r\n        }\r\n        activeTools.clear()\r\n\r\n        // Fold the end-of-stream usage through message_delta (Responses\r\n        // API only reports it on response.completed). Input + cache\r\n        // tokens ride here so claude.ts updateUsage() and the bridge\r\n        // assembler pick them up \u2014 message_start was emitted on\r\n        // response.created with zeros.\r\n        // OpenAI reports input_tokens as TOTAL (fresh + cached). Anthropic\r\n        // treats input_tokens and cache_read_input_tokens as additive\r\n        // buckets \u2014 sum them for \"total input\". Subtract so cost tracking /\r\n        // context-meter don't double-count the cached portion.\r\n        yield {\r\n          type: 'message_delta',\r\n          delta: {\r\n            stop_reason: hadToolCalls ? 'tool_use' : 'end_turn',\r\n            stop_sequence: null,\r\n          },\r\n          usage: {\r\n            output_tokens: totalOutputTokens,\r\n            input_tokens: Math.max(0, totalInputTokens - totalCachedTokens),\r\n            ...(totalCachedTokens > 0 && {\r\n              cache_read_input_tokens: totalCachedTokens,\r\n              cache_creation_input_tokens: 0,\r\n            }),\r\n          },\r\n        }\r\n        yield { type: 'message_stop' }\r\n        finishedCleanly = true\r\n        break\r\n      }\r\n\r\n      case 'response.incomplete': {\r\n        yield* closeTextBlock()\r\n        for (const [, tool] of activeTools) {\r\n          yield { type: 'content_block_stop', index: tool.blockIndex }\r\n        }\r\n        activeTools.clear()\r\n\r\n        const resp2 = event.response as { usage?: { output_tokens?: number } } | undefined\r\n        totalOutputTokens = resp2?.usage?.output_tokens ?? totalOutputTokens\r\n\r\n        yield {\r\n          type: 'message_delta',\r\n          delta: { stop_reason: 'max_tokens', stop_sequence: null },\r\n          usage: { output_tokens: totalOutputTokens },\r\n        }\r\n        yield { type: 'message_stop' }\r\n        finishedCleanly = true\r\n        break\r\n      }\r\n\r\n      case 'response.failed': {\r\n        yield* closeTextBlock()\r\n        for (const [, tool] of activeTools) {\r\n          yield { type: 'content_block_stop', index: tool.blockIndex }\r\n        }\r\n        activeTools.clear()\r\n\r\n        if (messageStarted) {\r\n          yield {\r\n            type: 'message_delta',\r\n            delta: { stop_reason: 'end_turn', stop_sequence: null },\r\n            usage: { output_tokens: totalOutputTokens },\r\n          }\r\n          yield { type: 'message_stop' }\r\n        }\r\n        finishedCleanly = true\r\n        break\r\n      }\r\n\r\n      // Ignore: response.content_part.added, response.content_part.done,\r\n      // response.reasoning_text.delta, response.reasoning_summary_text.delta, etc.\r\n    }\r\n  }\r\n\r\n  // Safety: if stream ended without a terminal event\r\n  if (messageStarted && !finishedCleanly) {\r\n    if (hasTextBlock) {\r\n      yield { type: 'content_block_stop', index: blockIndex }\r\n    }\r\n    for (const [, tool] of activeTools) {\r\n      yield { type: 'content_block_stop', index: tool.blockIndex }\r\n    }\r\n    yield {\r\n      type: 'message_delta',\r\n      delta: {\r\n        stop_reason: hadToolCalls ? 'tool_use' : 'end_turn',\r\n        stop_sequence: null,\r\n      },\r\n      usage: { output_tokens: totalOutputTokens },\r\n    }\r\n    yield { type: 'message_stop' }\r\n  }\r\n}\r\n\r\n// \u2500\u2500\u2500 Non-streaming conversion \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n/**\r\n * Convert a non-streaming Responses API response to an Anthropic message.\r\n */\r\nexport function responsesMessageToAnthropic(\r\n  response: ResponsesApiResponse,\r\n): AnthropicMessage {\r\n  const content: AnthropicContentBlock[] = []\r\n  let hasToolCalls = false\r\n\r\n  for (const item of response.output ?? []) {\r\n    if (item.type === 'message' && item.content) {\r\n      for (const part of item.content) {\r\n        if (part.type === 'output_text' && part.text) {\r\n          content.push({ type: 'text', text: part.text })\r\n        }\r\n      }\r\n    } else if (item.type === 'function_call') {\r\n      hasToolCalls = true\r\n      let input: Record<string, unknown> = {}\r\n      try {\r\n        input = JSON.parse(item.arguments ?? '{}')\r\n      } catch {\r\n        input = { _raw: item.arguments }\r\n      }\r\n      const name = item.name ?? ''\r\n      input = (coerceToolCallArgs(name, input) ?? input) as Record<string, unknown>\r\n      content.push({\r\n        type: 'tool_use',\r\n        id: item.call_id ?? item.id ?? `toolu_${Math.random().toString(36).slice(2, 11)}`,\r\n        name,\r\n        input,\r\n      })\r\n    }\r\n  }\r\n\r\n  const cachedTokens = response.usage?.input_tokens_details?.cached_tokens ?? 0\r\n  const totalInputTokens = response.usage?.input_tokens ?? 0\r\n  // Split OpenAI's total input into Anthropic's fresh + cached buckets.\r\n  const freshInputTokens = Math.max(0, totalInputTokens - cachedTokens)\r\n\r\n  return {\r\n    id: response.id ?? `msg_${Date.now()}`,\r\n    type: 'message',\r\n    role: 'assistant',\r\n    content,\r\n    model: response.model,\r\n    stop_reason: (hasToolCalls ? 'tool_use' : 'end_turn') as AnthropicMessage['stop_reason'],\r\n    stop_sequence: null,\r\n    usage: {\r\n      input_tokens: freshInputTokens,\r\n      output_tokens: response.usage?.output_tokens ?? 0,\r\n      ...(cachedTokens > 0 && {\r\n        cache_read_input_tokens: cachedTokens,\r\n        cache_creation_input_tokens: 0,\r\n      }),\r\n    },\r\n  }\r\n}\r\n", "/**\n * Global reasoning effort store for OpenAI Codex models.\n *\n * The model picker writes the user's chosen level here; the OpenAI\n * provider reads it at request time.\n */\n\nexport type OpenAIReasoningLevel = 'low' | 'medium' | 'high' | 'xhigh'\n\nconst REASONING_LEVELS: readonly OpenAIReasoningLevel[] = ['low', 'medium', 'high', 'xhigh']\n\nconst REASONING_LABELS: Record<OpenAIReasoningLevel, string> = {\n  low:    'Low',\n  medium: 'Medium',\n  high:   'High',\n  xhigh:  'Extra High',\n}\n\nlet _currentLevel: OpenAIReasoningLevel = 'medium'\n\n/** True once the user has explicitly picked a level via \u2190 \u2192 in the picker. */\nlet _explicitlySet = false\n\nexport function getOpenAIReasoningLevel(): OpenAIReasoningLevel {\n  return _currentLevel\n}\n\n/** Whether the user has explicitly chosen a reasoning level. */\nexport function isReasoningLevelExplicit(): boolean {\n  return _explicitlySet\n}\n\nexport function setOpenAIReasoningLevel(level: OpenAIReasoningLevel): void {\n  _currentLevel = level\n  _explicitlySet = true\n}\n\nexport function cycleOpenAIReasoningLevel(direction: 'left' | 'right'): OpenAIReasoningLevel {\n  const idx = REASONING_LEVELS.indexOf(_currentLevel)\n  if (direction === 'right') {\n    _currentLevel = REASONING_LEVELS[(idx + 1) % REASONING_LEVELS.length]!\n  } else {\n    _currentLevel = REASONING_LEVELS[(idx - 1 + REASONING_LEVELS.length) % REASONING_LEVELS.length]!\n  }\n  _explicitlySet = true\n  return _currentLevel\n}\n\nexport function getReasoningLabel(level: OpenAIReasoningLevel): string {\n  return REASONING_LABELS[level]\n}\n\nexport function getAllReasoningLevels(): readonly OpenAIReasoningLevel[] {\n  return REASONING_LEVELS\n}\n\n/**\n * Check if an OpenAI model supports reasoning_effort.\n * GPT-5 family + o-series reasoning models.\n */\nexport function modelSupportsReasoning(modelId: string): boolean {\n  return /^(o[1-9](-|$)|o[1-9][0-9]?(-mini|-pro)?|gpt-[5-9])/i.test(modelId)\n}\n", "/**\r\n * OpenAI-compatible provider.\r\n *\r\n * Base class for all providers that implement the OpenAI Chat Completions API:\r\n * OpenAI, OpenRouter, Groq, NVIDIA NIM, DeepSeek, Ollama.\r\n *\r\n * Uses native fetch (no openai SDK dependency) for maximum portability.\r\n *\r\n * Payload optimization (enabled for all 3P providers):\r\n * Tau sends a massive system prompt (~8K tokens) + 40+ tool definitions\r\n * (~5K tokens) designed for Claude. Smaller open-source models choke on this,\r\n * causing 2-3 minute response times for trivial messages.\r\n *\r\n * This base class trims the payload:\r\n *   - Caps system prompt length\r\n *   - Limits tools to core essentials\r\n *   - Caps max_tokens to avoid over-reservation\r\n *\r\n * Configure via env vars:\r\n *   PROVIDER_MAX_TOKENS=4096      \u2014 max output tokens (default: 4096)\r\n *   PROVIDER_MAX_SYSTEM_CHARS=6000 \u2014 max system prompt chars (default: 6000)\r\n *   PROVIDER_NO_OPTIMIZE=true      \u2014 disable optimization (send full payload)\r\n */\r\n\r\nimport {\r\n  BaseProvider,\r\n  buildProviderStreamResult,\r\n  type AnthropicMessage,\r\n  type AnthropicStreamEvent,\r\n  type ModelInfo,\r\n  type ProviderConfig,\r\n  type ProviderRequestParams,\r\n  type ProviderStreamResult,\r\n  type ProviderTool,\r\n  type SystemBlock,\r\n} from './base_provider.js'\r\nimport {\r\n  anthropicMessagesToOpenAI,\r\n  anthropicToolsToOpenAI,\r\n  coalesceConsecutiveMessages,\r\n} from '../adapters/anthropic_to_openai.js'\r\nimport {\r\n  openAIStreamToAnthropicEvents,\r\n  openAIMessageToAnthropic,\r\n  type OpenAIChatCompletion,\r\n  type OpenAIChatCompletionChunk,\r\n} from '../adapters/openai_to_anthropic.js'\r\nimport {\r\n  anthropicToResponsesInput,\r\n  anthropicToolsToResponsesTools,\r\n  extractInstructions,\r\n  responsesStreamToAnthropicEvents,\r\n  responsesMessageToAnthropic,\r\n  type ResponsesSSEEvent,\r\n  type ResponsesApiResponse,\r\n} from '../adapters/openai_responses.js'\r\nimport { getProviderModelSet } from '../../../utils/model/configs.js'\r\nimport {\r\n  getOpenAIReasoningLevel,\r\n  isReasoningLevelExplicit,\r\n  modelSupportsReasoning,\r\n  type OpenAIReasoningLevel,\r\n} from '../../../utils/model/openaiReasoning.js'\r\n\r\n// \u2500\u2500\u2500 Curated Codex model list (fallback) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n// Used ONLY when the /v1/models fetch fails (e.g. OAuth token can't\r\n// list models). GPT-5 models use the Responses API (/v1/responses).\r\n\r\nconst OPENAI_FALLBACK_MODELS: ModelInfo[] = [\r\n  {\r\n    id: 'gpt-5.5',\r\n    name: 'GPT-5.5',\r\n    contextWindow: 272000,\r\n    supportsToolCalling: true,\r\n    tags: ['recommended', 'reasoning'],\r\n  },\r\n  {\r\n    id: 'gpt-5.4',\r\n    name: 'GPT-5.4',\r\n    contextWindow: 1050000,\r\n    supportsToolCalling: true,\r\n    tags: ['reasoning'],\r\n  },\r\n  {\r\n    id: 'gpt-5.4-mini',\r\n    name: 'GPT-5.4 Mini',\r\n    contextWindow: 272000,\r\n    supportsToolCalling: true,\r\n    tags: ['fast', 'reasoning'],\r\n  },\r\n  {\r\n    id: 'gpt-5.3-codex',\r\n    name: 'GPT-5.3 Codex',\r\n    contextWindow: 272000,\r\n    supportsToolCalling: true,\r\n    tags: ['reasoning'],\r\n  },\r\n  {\r\n    id: 'gpt-5.2',\r\n    name: 'GPT-5.2',\r\n    contextWindow: 272000,\r\n    supportsToolCalling: true,\r\n    tags: ['reasoning'],\r\n  },\r\n]\r\n\r\nfunction mergeOpenAIModels(apiModels: readonly ModelInfo[]): ModelInfo[] {\r\n  const merged = new Map<string, ModelInfo>()\r\n  for (const model of OPENAI_FALLBACK_MODELS) {\r\n    merged.set(model.id, model)\r\n  }\r\n  for (const model of apiModels) {\r\n    if (!merged.has(model.id)) {\r\n      merged.set(model.id, model)\r\n    }\r\n  }\r\n  return Array.from(merged.values())\r\n}\r\n\r\n// \u2500\u2500\u2500 Payload optimization constants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n/**\r\n * Core tools that 3P models actually need for coding assistance.\r\n * All other tools (Agent, MCP, TaskCreate, NotebookEdit, etc.) add\r\n * thousands of tokens to the payload without being useful to smaller models.\r\n */\r\nconst CORE_TOOL_NAMES = new Set([\r\n  'Bash',\r\n  'Read',\r\n  'Write',\r\n  'Edit',\r\n  'Glob',\r\n  'Grep',\r\n  'WebSearch',\r\n  'WebFetch',\r\n  'TodoRead',\r\n  'TodoWrite',\r\n  'ToolSearch',\r\n])\r\n\r\nconst DEFAULT_3P_MAX_TOKENS = 4096\r\nconst DEFAULT_3P_MAX_SYSTEM_CHARS = 6000\r\n\r\nexport class OpenAIProvider extends BaseProvider {\r\n  readonly name: string = 'openai'\r\n  protected apiKey: string\r\n  protected baseUrl: string\r\n  protected extraHeaders: Record<string, string>\r\n\r\n  /** Whether to optimize payload for smaller models */\r\n  protected optimizePayload: boolean\r\n  protected maxTokensCap: number\r\n  protected maxSystemChars: number\r\n  /** Session token for ChatGPT backend API (OAuth users, GPT-5 Codex models) */\r\n  protected sessionToken?: string\r\n  /**\r\n   * Preserve cache_control markers when converting to OpenAI format.\r\n   * Providers like OpenRouter pass these through to underlying providers\r\n   * (Anthropic, etc.) enabling prompt caching. Off by default.\r\n   */\r\n  protected preserveCacheControl: boolean = false\r\n\r\n  /**\r\n   * Stable cache-routing key for the Responses API. OpenAI routes requests\r\n   * with the same `prompt_cache_key` to the same backend node, which is\r\n   * what makes the server-side prompt cache hit. codex-rs uses a single\r\n   * conversation-id for the lifetime of the session \u2014 we mirror that here\r\n   * with a randomly-generated id created on first use. Rotates via\r\n   * clearCacheSession() (called by the lane on /clear or context reset).\r\n   */\r\n  private _cacheSessionId: string | null = null\r\n\r\n  constructor(config: ProviderConfig) {\r\n    super()\r\n    this.apiKey = config.apiKey\r\n    this.baseUrl = config.baseUrl ?? 'https://api.openai.com/v1'\r\n    this.extraHeaders = config.extraHeaders ?? {}\r\n    this.sessionToken = config.sessionToken\r\n\r\n    // Payload optimization \u2014 on by default for all 3P providers\r\n    this.optimizePayload = process.env.PROVIDER_NO_OPTIMIZE !== 'true'\r\n    this.maxTokensCap = parseInt(\r\n      process.env.PROVIDER_MAX_TOKENS ?? String(DEFAULT_3P_MAX_TOKENS), 10,\r\n    )\r\n    this.maxSystemChars = parseInt(\r\n      process.env.PROVIDER_MAX_SYSTEM_CHARS ?? String(DEFAULT_3P_MAX_SYSTEM_CHARS), 10,\r\n    )\r\n  }\r\n\r\n  /** Override in subclasses to enable message coalescing for strict models */\r\n  protected needsMessageCoalescing(model: string): boolean {\r\n    // o1-series models require strictly alternating roles\r\n    return /^o1(-|$)/.test(model)\r\n  }\r\n\r\n  /**\r\n   * Resolve the reasoning_effort to send with the request.\r\n   *\r\n   * Priority: user-selected level from /models picker \u2192 Anthropic thinking\r\n   * budget mapping \u2192 default 'medium'.\r\n   */\r\n  protected resolveReasoningEffort(\r\n    model: string,\r\n    thinking: ProviderRequestParams['thinking'],\r\n  ): OpenAIReasoningLevel | undefined {\r\n    if (!modelSupportsReasoning(model)) return undefined\r\n\r\n    // Only send reasoning_effort when the user explicitly chose a level\r\n    // via \u2190 \u2192 in the model picker. Sending it unsolicited to models that\r\n    // don't support it causes 500 errors on OpenAI's API.\r\n    if (isReasoningLevelExplicit()) return getOpenAIReasoningLevel()\r\n\r\n    return undefined\r\n  }\r\n\r\n  // \u2500\u2500\u2500 Payload optimization \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n  /**\r\n   * Optimize request params for third-party models:\r\n   * 1. Trim system prompt to essential instructions\r\n   * 2. Filter tools to core set\r\n   * 3. Cap max_tokens\r\n   */\r\n  protected optimizeParams(params: ProviderRequestParams): ProviderRequestParams {\r\n    if (!this.optimizePayload) return params\r\n\r\n    // GPT-5 Codex models have 1M+ context \u2014 send full payload with all\r\n    // tools so agents, MCP servers, plan mode etc. work without limits.\r\n    const model = this.resolveModel(params.model)\r\n    if (/^gpt-[5-9]/i.test(model)) return params\r\n\r\n    return {\r\n      ...params,\r\n      system: this._trimSystem(params.system),\r\n      tools: this._filterTools(params.tools),\r\n      max_tokens: Math.min(params.max_tokens, this.maxTokensCap),\r\n    }\r\n  }\r\n\r\n  private _trimSystem(\r\n    system?: string | SystemBlock[],\r\n  ): string | SystemBlock[] | undefined {\r\n    if (!system) return system\r\n\r\n    const fullText = typeof system === 'string'\r\n      ? system\r\n      : system.map(s => s.text).join('\\n\\n')\r\n\r\n    if (fullText.length <= this.maxSystemChars) {\r\n      return typeof system === 'string' ? system : system\r\n    }\r\n\r\n    // Find a clean cut point at a paragraph break\r\n    let cutPoint = this.maxSystemChars\r\n    const lastBreak = fullText.lastIndexOf('\\n\\n', cutPoint)\r\n    if (lastBreak > this.maxSystemChars * 0.7) {\r\n      cutPoint = lastBreak\r\n    }\r\n\r\n    const trimmed = fullText.slice(0, cutPoint) +\r\n      '\\n\\n[System instructions trimmed for performance. Core tools available: Bash, Read, Write, Edit, Glob, Grep.]'\r\n\r\n    if (typeof system === 'string') return trimmed\r\n    return [{ type: 'text' as const, text: trimmed }]\r\n  }\r\n\r\n  private _filterTools(tools?: ProviderTool[]): ProviderTool[] | undefined {\r\n    if (!tools || tools.length === 0) return tools\r\n\r\n    const filtered = tools.filter(t => CORE_TOOL_NAMES.has(t.name))\r\n    return filtered.length > 0 ? filtered : tools\r\n  }\r\n\r\n  // \u2500\u2500\u2500 API methods \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n  async stream(params: ProviderRequestParams): Promise<ProviderStreamResult> {\r\n    const optimized = this.optimizeParams(params)\r\n    const model = this.resolveModel(optimized.model)\r\n\r\n    // GPT-5 Codex models use the Responses API\r\n    if (this._useResponsesAPI(model)) {\r\n      return this._streamResponses(optimized, model)\r\n    }\r\n\r\n    let messages = anthropicMessagesToOpenAI(optimized.messages, optimized.system, { preserveCacheControl: this.preserveCacheControl })\r\n    if (this.needsMessageCoalescing(model)) {\r\n      messages = coalesceConsecutiveMessages(messages)\r\n    }\r\n    const tools = optimized.tools ? anthropicToolsToOpenAI(optimized.tools) : undefined\r\n\r\n    // GPT-5 and o-series require max_completion_tokens, not max_tokens.\r\n    // Sending max_tokens to these models causes 500 errors.\r\n    const useNewTokenParam = this._usesMaxCompletionTokens(model)\r\n    const body: Record<string, unknown> = {\r\n      model,\r\n      messages,\r\n      stream: true,\r\n      stream_options: { include_usage: true },\r\n    }\r\n    // prompt_cache_key is OpenAI-specific. Sending it to Groq / OpenRouter /\r\n    // etc. risks a 400 on strict-JSON providers, so gate on this.name.\r\n    if (this.name === 'openai') {\r\n      body.prompt_cache_key = this.cacheSessionKey\r\n    }\r\n    if (useNewTokenParam) {\r\n      body.max_completion_tokens = optimized.max_tokens\r\n    } else {\r\n      body.max_tokens = optimized.max_tokens\r\n    }\r\n    if (tools && tools.length > 0) {\r\n      body.tools = tools\r\n      body.tool_choice = 'auto'\r\n    }\r\n    if (optimized.temperature !== undefined) body.temperature = optimized.temperature\r\n    if (optimized.stop_sequences) body.stop = optimized.stop_sequences\r\n\r\n    // Send reasoning_effort for Codex / o-series models.\r\n    const effort = this.resolveReasoningEffort(model, optimized.thinking)\r\n    if (effort) body.reasoning_effort = effort\r\n\r\n    const ac = new AbortController()\r\n    const response = await fetch(`${this.baseUrl}/chat/completions`, {\r\n      method: 'POST',\r\n      headers: this._headers(),\r\n      body: JSON.stringify(body),\r\n      signal: ac.signal,\r\n    })\r\n\r\n    if (!response.ok) {\r\n      const errText = await response.text().catch(() => '')\r\n      throw this.formatAPIError(response.status, errText)\r\n    }\r\n\r\n    if (!response.body) {\r\n      throw new Error(`${this.name} returned no response body for streaming request`)\r\n    }\r\n\r\n    // Extract rate limit headers from the response\r\n    this._extractRateLimits(response.headers)\r\n\r\n    const sseStream = this._parseSSE(response.body)\r\n    const anthropicEvents = openAIStreamToAnthropicEvents(sseStream)\r\n    return buildProviderStreamResult(anthropicEvents, ac)\r\n  }\r\n\r\n  async create(params: ProviderRequestParams): Promise<AnthropicMessage> {\r\n    const optimized = this.optimizeParams(params)\r\n    const model = this.resolveModel(optimized.model)\r\n\r\n    // GPT-5 Codex models use the Responses API\r\n    if (this._useResponsesAPI(model)) {\r\n      return this._createResponses(optimized, model)\r\n    }\r\n\r\n    let messages = anthropicMessagesToOpenAI(optimized.messages, optimized.system, { preserveCacheControl: this.preserveCacheControl })\r\n    if (this.needsMessageCoalescing(model)) {\r\n      messages = coalesceConsecutiveMessages(messages)\r\n    }\r\n    const tools = optimized.tools ? anthropicToolsToOpenAI(optimized.tools) : undefined\r\n\r\n    const useNewTokenParam = this._usesMaxCompletionTokens(model)\r\n    const body: Record<string, unknown> = {\r\n      model,\r\n      messages,\r\n    }\r\n    if (this.name === 'openai') {\r\n      body.prompt_cache_key = this.cacheSessionKey\r\n    }\r\n    if (useNewTokenParam) {\r\n      body.max_completion_tokens = optimized.max_tokens\r\n    } else {\r\n      body.max_tokens = optimized.max_tokens\r\n    }\r\n    if (tools && tools.length > 0) {\r\n      body.tools = tools\r\n      body.tool_choice = 'auto'\r\n    }\r\n    if (optimized.temperature !== undefined) body.temperature = optimized.temperature\r\n    if (optimized.stop_sequences) body.stop = optimized.stop_sequences\r\n\r\n    // Send reasoning_effort for Codex / o-series models.\r\n    const effort = this.resolveReasoningEffort(model, optimized.thinking)\r\n    if (effort) body.reasoning_effort = effort\r\n\r\n    const response = await fetch(`${this.baseUrl}/chat/completions`, {\r\n      method: 'POST',\r\n      headers: this._headers(),\r\n      body: JSON.stringify(body),\r\n    })\r\n\r\n    if (!response.ok) {\r\n      const errText = await response.text().catch(() => '')\r\n      throw this.formatAPIError(response.status, errText)\r\n    }\r\n\r\n    this._extractRateLimits(response.headers)\r\n\r\n    const data = (await response.json()) as OpenAIChatCompletion\r\n    return openAIMessageToAnthropic(data)\r\n  }\r\n\r\n  async listModels(): Promise<ModelInfo[]> {\r\n    // Try the real API first \u2014 it returns only models the token can access.\r\n    try {\r\n      const response = await fetch(`${this.baseUrl}/models`, {\r\n        headers: this._headers(),\r\n        signal: AbortSignal.timeout(8_000),\r\n      })\r\n      if (response.ok) {\r\n        const data = (await response.json()) as { data: Array<{ id: string }> }\r\n        const apiModels = (data.data ?? []).map(m => ({ id: m.id, name: m.id }))\r\n        if (apiModels.length > 0) return mergeOpenAIModels(apiModels)\r\n      }\r\n    } catch {\r\n      // API unreachable or token can't list\r\n    }\r\n\r\n    // Fallback: curated list so /models always shows something.\r\n    return [...OPENAI_FALLBACK_MODELS]\r\n  }\r\n\r\n  resolveModel(claudeModel: string): string {\r\n    // If it doesn't look like a Claude model, pass through as-is\r\n    if (!claudeModel.includes('claude')) return claudeModel\r\n\r\n    const models = getProviderModelSet(this.name)\r\n    if (claudeModel.includes('opus'))  return models.opus\r\n    if (claudeModel.includes('haiku')) return models.haiku\r\n    return models.sonnet\r\n  }\r\n\r\n  /** Last known rate limit info from provider response headers */\r\n  lastRateLimits: {\r\n    requestsLimit?: number\r\n    requestsRemaining?: number\r\n    requestsReset?: string\r\n    tokensLimit?: number\r\n    tokensRemaining?: number\r\n    tokensReset?: string\r\n  } = {}\r\n\r\n  // \u2500\u2500\u2500 Error Handling \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n  /**\r\n   * Format API errors with user-friendly messages for common billing/quota issues.\r\n   * Detects 402 (payment required), 429 (quota exceeded), and other billing errors.\r\n   */\r\n  protected formatAPIError(status: number, body: string): Error {\r\n    // Try to extract the error message from JSON response\r\n    let errorDetail = ''\r\n    try {\r\n      const parsed = JSON.parse(body)\r\n      errorDetail = parsed?.error?.message ?? parsed?.error?.type ?? ''\r\n    } catch {\r\n      errorDetail = body\r\n    }\r\n\r\n    // 402 \u2014 Insufficient balance (DeepSeek, etc.)\r\n    if (status === 402 || errorDetail.toLowerCase().includes('insufficient balance')) {\r\n      return new Error(\r\n        `${this.name} API error: Insufficient account balance.\\n` +\r\n        `Your ${this.name} account has no remaining credits.\\n` +\r\n        `Please add funds at your provider's billing page and try again.`,\r\n      )\r\n    }\r\n\r\n    // 429 \u2014 Quota exceeded / rate limit\r\n    if (status === 429) {\r\n      if (errorDetail.toLowerCase().includes('insufficient_quota') ||\r\n          errorDetail.toLowerCase().includes('exceeded your current quota')) {\r\n        return new Error(\r\n          `${this.name} API error: Quota exceeded.\\n` +\r\n          `Your ${this.name} API key has exceeded its usage quota.\\n` +\r\n          `Check your plan and billing details at your provider's dashboard.`,\r\n        )\r\n      }\r\n      // Rate limit (TPM/RPM) \u2014 include the original message for limit details\r\n      return new Error(\r\n        `${this.name} API error: Rate limit exceeded.\\n` +\r\n        `${errorDetail}\\n` +\r\n        `Tip: Wait a moment and retry, or use a model with higher rate limits.`,\r\n      )\r\n    }\r\n\r\n    // 401 \u2014 Invalid auth\r\n    if (status === 401) {\r\n      return new Error(\r\n        `${this.name} API error: Authentication failed.\\n` +\r\n        `${errorDetail ? errorDetail + '\\n' : ''}` +\r\n        `Your API key may be invalid or expired. Run /login to reconfigure.`,\r\n      )\r\n    }\r\n\r\n    // 413 \u2014 Request too large (Groq TPM, etc.)\r\n    if (status === 413) {\r\n      return new Error(\r\n        `${this.name} API error: Request too large.\\n` +\r\n        `${errorDetail}\\n` +\r\n        `The message + tools exceeded the model's token limit.\\n` +\r\n        `Try a shorter message or switch to a model with a higher token limit.`,\r\n      )\r\n    }\r\n\r\n    // 500 \u2014 Server error (often means model ID doesn't exist)\r\n    if (status === 500) {\r\n      return new Error(\r\n        `${this.name} API error ${status}: Server error.\\n` +\r\n        `${errorDetail || 'The model may not exist or is unavailable.'}\\n` +\r\n        `Try a different model with /model or /models.`,\r\n      )\r\n    }\r\n\r\n    // Default \u2014 include status and body\r\n    return new Error(`${this.name} API error ${status}: ${body}`)\r\n  }\r\n\r\n  // \u2500\u2500\u2500 Internal helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n  /**\r\n   * Extract rate limit information from provider response headers.\r\n   * Supports standard X-RateLimit-* headers used by OpenAI, Groq, etc.\r\n   */\r\n  protected _extractRateLimits(headers: Headers): void {\r\n    const rl = this.lastRateLimits\r\n    const reqLimit = headers.get('x-ratelimit-limit-requests')\r\n    const reqRemaining = headers.get('x-ratelimit-remaining-requests')\r\n    const reqReset = headers.get('x-ratelimit-reset-requests')\r\n    const tokLimit = headers.get('x-ratelimit-limit-tokens')\r\n    const tokRemaining = headers.get('x-ratelimit-remaining-tokens')\r\n    const tokReset = headers.get('x-ratelimit-reset-tokens')\r\n    if (reqLimit) rl.requestsLimit = parseInt(reqLimit, 10)\r\n    if (reqRemaining) rl.requestsRemaining = parseInt(reqRemaining, 10)\r\n    if (reqReset) rl.requestsReset = reqReset\r\n    if (tokLimit) rl.tokensLimit = parseInt(tokLimit, 10)\r\n    if (tokRemaining) rl.tokensRemaining = parseInt(tokRemaining, 10)\r\n    if (tokReset) rl.tokensReset = tokReset\r\n  }\r\n\r\n  protected _headers(): Record<string, string> {\r\n    return {\r\n      'Content-Type': 'application/json',\r\n      'Authorization': `Bearer ${this.apiKey}`,\r\n      ...this.extraHeaders,\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Returns the URL and headers for Responses API calls.\r\n   * OAuth users \u2192 chatgpt.com/backend-api/codex (session token auth)\r\n   * API key users \u2192 standard api.openai.com/v1/responses\r\n   */\r\n  private _responsesEndpoint(): { url: string; headers: Record<string, string> } {\r\n    if (this.sessionToken) {\r\n      return {\r\n        url: 'https://chatgpt.com/backend-api/codex/responses',\r\n        headers: {\r\n          'Content-Type': 'application/json',\r\n          'Authorization': `Bearer ${this.sessionToken}`,\r\n          'OpenAI-Beta': 'responses_websockets=2026-02-06',\r\n          ...this.extraHeaders,\r\n        },\r\n      }\r\n    }\r\n    return {\r\n      url: `${this.baseUrl}/responses`,\r\n      headers: this._headers(),\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Stable per-session cache key used with the Responses API. Generated on\r\n   * first read and kept until clearCacheSession() rotates it.\r\n   */\r\n  protected get cacheSessionKey(): string {\r\n    if (!this._cacheSessionId) {\r\n      const crypto = require('crypto') as typeof import('crypto')\r\n      this._cacheSessionId = typeof crypto.randomUUID === 'function'\r\n        ? crypto.randomUUID()\r\n        : `oai-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`\r\n    }\r\n    return this._cacheSessionId\r\n  }\r\n\r\n  /** Force a new cache-session id \u2014 call on conversation reset / compact. */\r\n  clearCacheSession(): void {\r\n    this._cacheSessionId = null\r\n  }\r\n\r\n  // \u2500\u2500\u2500 Responses API (GPT-5 Codex models) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n  /**\r\n   * True when the model should use the Responses API via the ChatGPT backend.\r\n   * GPT-5 Codex models only work through chatgpt.com/backend-api/codex which\r\n   * requires the OAuth session token (first-exchange access_token).\r\n   * The standard api.openai.com endpoint rejects these models (missing scopes).\r\n   */\r\n  private _useResponsesAPI(model: string): boolean {\r\n    return /^gpt-[5-9]/i.test(model) && !!this.sessionToken\r\n  }\r\n\r\n  /** True for models that require max_completion_tokens instead of max_tokens. */\r\n  private _usesMaxCompletionTokens(model: string): boolean {\r\n    return /^(gpt-[5-9]|o[1-9])/i.test(model)\r\n  }\r\n\r\n  private async _streamResponses(\r\n    params: ProviderRequestParams,\r\n    model: string,\r\n  ): Promise<ProviderStreamResult> {\r\n    const input = anthropicToResponsesInput(params.messages)\r\n    const tools = params.tools\r\n      ? anthropicToolsToResponsesTools(params.tools)\r\n      : undefined\r\n    const instructions = extractInstructions(params.system)\r\n\r\n    const body: Record<string, unknown> = {\r\n      model,\r\n      input,\r\n      stream: true,\r\n      // The ChatGPT backend (OAuth / Codex endpoint) rejects store:true with\r\n      // \"Store must be set to false\". Keep store:false for both OAuth and\r\n      // API-key paths \u2014 prompt_cache_key alone is enough to make the server\r\n      // route the request to the same cache-warm backend node (this is what\r\n      // codex-rs does).\r\n      store: false,\r\n      prompt_cache_key: this.cacheSessionKey,\r\n    }\r\n\r\n    if (instructions) body.instructions = instructions\r\n    if (tools && tools.length > 0) {\r\n      body.tools = tools\r\n      body.tool_choice = 'auto'\r\n    }\r\n\r\n    // Nested reasoning.effort for Responses API\r\n    const effort = this.resolveReasoningEffort(model, params.thinking)\r\n    if (effort) body.reasoning = { effort }\r\n\r\n    const { url, headers } = this._responsesEndpoint()\r\n\r\n    const ac = new AbortController()\r\n    const response = await fetch(url, {\r\n      method: 'POST',\r\n      headers,\r\n      body: JSON.stringify(body),\r\n      signal: ac.signal,\r\n    })\r\n\r\n    if (!response.ok) {\r\n      const errText = await response.text().catch(() => '')\r\n      throw this.formatAPIError(response.status, errText)\r\n    }\r\n\r\n    if (!response.body) {\r\n      throw new Error(`${this.name} returned no response body for streaming request`)\r\n    }\r\n\r\n    this._extractRateLimits(response.headers)\r\n\r\n    const sseStream = this._parseResponsesSSE(response.body)\r\n    const anthropicEvents = responsesStreamToAnthropicEvents(sseStream)\r\n    return buildProviderStreamResult(anthropicEvents, ac)\r\n  }\r\n\r\n  private async _createResponses(\r\n    params: ProviderRequestParams,\r\n    model: string,\r\n  ): Promise<AnthropicMessage> {\r\n    const input = anthropicToResponsesInput(params.messages)\r\n    const tools = params.tools\r\n      ? anthropicToolsToResponsesTools(params.tools)\r\n      : undefined\r\n    const instructions = extractInstructions(params.system)\r\n\r\n    const body: Record<string, unknown> = {\r\n      model,\r\n      input,\r\n      store: false,\r\n      prompt_cache_key: this.cacheSessionKey,\r\n    }\r\n\r\n    if (instructions) body.instructions = instructions\r\n    if (tools && tools.length > 0) {\r\n      body.tools = tools\r\n      body.tool_choice = 'auto'\r\n    }\r\n\r\n    const effort = this.resolveReasoningEffort(model, params.thinking)\r\n    if (effort) body.reasoning = { effort }\r\n\r\n    const { url, headers } = this._responsesEndpoint()\r\n\r\n    const response = await fetch(url, {\r\n      method: 'POST',\r\n      headers,\r\n      body: JSON.stringify(body),\r\n    })\r\n\r\n    if (!response.ok) {\r\n      const errText = await response.text().catch(() => '')\r\n      throw this.formatAPIError(response.status, errText)\r\n    }\r\n\r\n    this._extractRateLimits(response.headers)\r\n\r\n    const data = (await response.json()) as ResponsesApiResponse\r\n    return responsesMessageToAnthropic(data)\r\n  }\r\n\r\n  /**\r\n   * Parse SSE events from the Responses API stream.\r\n   * The Responses API uses `event:` + `data:` lines with a JSON payload\r\n   * that includes the event `type` field.\r\n   */\r\n  protected async *_parseResponsesSSE(\r\n    body: ReadableStream<Uint8Array>,\r\n  ): AsyncGenerator<ResponsesSSEEvent> {\r\n    const reader = body.getReader()\r\n    const decoder = new TextDecoder()\r\n    let buffer = ''\r\n\r\n    try {\r\n      while (true) {\r\n        const { done, value } = await reader.read()\r\n        if (done) break\r\n\r\n        buffer += decoder.decode(value, { stream: true })\r\n\r\n        let boundary: number\r\n        while ((boundary = buffer.indexOf('\\n\\n')) !== -1) {\r\n          const event = buffer.slice(0, boundary)\r\n          buffer = buffer.slice(boundary + 2)\r\n\r\n          let dataStr = ''\r\n          for (const line of event.split('\\n')) {\r\n            if (line.startsWith('data: ')) {\r\n              dataStr += line.slice(6)\r\n            }\r\n          }\r\n\r\n          if (!dataStr || dataStr === '[DONE]') continue\r\n\r\n          try {\r\n            yield JSON.parse(dataStr) as ResponsesSSEEvent\r\n          } catch {\r\n            // Skip malformed JSON\r\n          }\r\n        }\r\n      }\r\n\r\n      // Process remaining buffer\r\n      if (buffer.trim()) {\r\n        let dataStr = ''\r\n        for (const line of buffer.split('\\n')) {\r\n          if (line.startsWith('data: ')) {\r\n            dataStr += line.slice(6)\r\n          }\r\n        }\r\n        if (dataStr && dataStr !== '[DONE]') {\r\n          try {\r\n            yield JSON.parse(dataStr) as ResponsesSSEEvent\r\n          } catch {\r\n            // Skip\r\n          }\r\n        }\r\n      }\r\n    } finally {\r\n      reader.releaseLock()\r\n    }\r\n  }\r\n\r\n  // \u2500\u2500\u2500 Chat Completions SSE parser \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n  protected async *_parseSSE(\r\n    body: ReadableStream<Uint8Array>,\r\n  ): AsyncGenerator<OpenAIChatCompletionChunk> {\r\n    const reader = body.getReader()\r\n    const decoder = new TextDecoder()\r\n    let buffer = ''\r\n\r\n    try {\r\n      while (true) {\r\n        const { done, value } = await reader.read()\r\n        if (done) break\r\n\r\n        buffer += decoder.decode(value, { stream: true })\r\n\r\n        // Split on double newline (SSE event boundary)\r\n        let boundary: number\r\n        while ((boundary = buffer.indexOf('\\n\\n')) !== -1) {\r\n          const event = buffer.slice(0, boundary)\r\n          buffer = buffer.slice(boundary + 2)\r\n\r\n          for (const line of event.split('\\n')) {\r\n            if (line.startsWith('data: ')) {\r\n              const jsonStr = line.slice(6).trim()\r\n              if (jsonStr === '[DONE]') return\r\n              if (!jsonStr) continue\r\n              try {\r\n                yield JSON.parse(jsonStr) as OpenAIChatCompletionChunk\r\n              } catch {\r\n                // Skip malformed JSON\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n\r\n      // Process any remaining buffer\r\n      if (buffer.trim()) {\r\n        for (const line of buffer.split('\\n')) {\r\n          if (line.startsWith('data: ')) {\r\n            const jsonStr = line.slice(6).trim()\r\n            if (jsonStr && jsonStr !== '[DONE]') {\r\n              try {\r\n                yield JSON.parse(jsonStr) as OpenAIChatCompletionChunk\r\n              } catch {\r\n                // Skip malformed JSON\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n    } finally {\r\n      reader.releaseLock()\r\n    }\r\n  }\r\n}\r\n", "import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { dirname, join } from 'node:path'\n\nexport type CommandCodeEffort =\n  | 'default'\n  | 'low'\n  | 'medium'\n  | 'high'\n  | 'xhigh'\n  | 'max'\n\nexport type CommandCodeWireEffort = Exclude<CommandCodeEffort, 'default'>\n\nexport const COMMAND_CODE_EFFORT_LEVELS: readonly CommandCodeEffort[] = [\n  'default',\n  'low',\n  'medium',\n  'high',\n  'xhigh',\n  'max',\n]\n\nexport const COMMAND_CODE_EFFORT_DESCRIPTIONS: Record<CommandCodeEffort, string> = {\n  default: 'Use the provider default reasoning level',\n  low: 'Fast responses with lighter reasoning',\n  medium: 'Balances speed and reasoning depth for everyday tasks',\n  high: 'Greater reasoning depth for complex problems',\n  xhigh: 'Extra reasoning depth for complex problems',\n  max: 'Maximum reasoning budget for the hardest problems',\n}\n\nconst CLAUDE_REASONING_EFFORTS: readonly CommandCodeEffort[] = [\n  'default',\n  'low',\n  'medium',\n  'high',\n  'xhigh',\n  'max',\n]\n\nconst GPT_REASONING_EFFORTS: readonly CommandCodeEffort[] = [\n  'default',\n  'low',\n  'medium',\n  'high',\n  'xhigh',\n]\n\nconst GPT_54_MINI_EFFORTS: readonly CommandCodeEffort[] = [\n  'default',\n  'low',\n  'medium',\n  'high',\n]\n\nconst STORE_PATH = join(homedir(), '.claude', 'commandcode-thinking.json')\n\nlet _loaded = false\nlet _cache: Record<string, CommandCodeEffort> = {}\n\nfunction normalizeModel(model: string): string {\n  return model.trim().toLowerCase()\n}\n\nfunction comparableModel(model: string): string {\n  return normalizeModel(model).replace(/[._]/g, '-')\n}\n\nfunction providerlessModel(model: string): string {\n  return comparableModel(model).split('/').pop() ?? comparableModel(model)\n}\n\nfunction storeKey(model: string): string {\n  return normalizeModel(model)\n}\n\nfunction storeKeys(model: string): string[] {\n  const key = storeKey(model)\n  const alias = key.split('/').pop() ?? key\n  return alias === key ? [key] : [key, alias]\n}\n\nexport function isCommandCodeClaudeModel(model: string): boolean {\n  return comparableModel(model).includes('claude')\n}\n\nfunction isCommandCodeClaudeHaiku(model: string): boolean {\n  const m = comparableModel(model)\n  return m.includes('claude') && m.includes('haiku')\n}\n\nfunction isCommandCodeClaudeOpusOrSonnet(model: string): boolean {\n  const m = comparableModel(model)\n  return m.includes('claude') && (m.includes('opus') || m.includes('sonnet'))\n}\n\nfunction isCommandCodeGptModel(model: string): boolean {\n  const m = comparableModel(model)\n  const leaf = providerlessModel(model)\n  return leaf.startsWith('gpt-') || m.includes('/gpt-') || leaf.includes('codex')\n}\n\nfunction isGpt54Mini(model: string): boolean {\n  const leaf = providerlessModel(model)\n  return leaf === 'gpt-5-4-mini' || leaf.startsWith('gpt-5-4-mini-')\n}\n\nexport function commandCodeEffortLevelsForModel(\n  model: string,\n): readonly CommandCodeEffort[] {\n  if (isCommandCodeClaudeHaiku(model)) return ['default']\n  if (isCommandCodeClaudeOpusOrSonnet(model)) return CLAUDE_REASONING_EFFORTS\n  if (isCommandCodeGptModel(model)) {\n    return isGpt54Mini(model) ? GPT_54_MINI_EFFORTS : GPT_REASONING_EFFORTS\n  }\n  return ['default']\n}\n\nexport function supportsCommandCodeEffortSelection(\n  model: string,\n  _tags?: readonly string[],\n): boolean {\n  return commandCodeEffortLevelsForModel(model).length > 1\n}\n\nfunction load(): void {\n  if (_loaded) return\n  _loaded = true\n  try {\n    if (!existsSync(STORE_PATH)) return\n    const raw = readFileSync(STORE_PATH, 'utf8')\n    const parsed = JSON.parse(raw) as unknown\n    if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return\n\n    const next: Record<string, CommandCodeEffort> = {}\n    for (const [key, value] of Object.entries(parsed as Record<string, unknown>)) {\n      if (\n        typeof value === 'string'\n        && (COMMAND_CODE_EFFORT_LEVELS as readonly string[]).includes(value)\n      ) {\n        next[key.toLowerCase()] = value as CommandCodeEffort\n      }\n    }\n    _cache = next\n  } catch {\n    // Stale or corrupt state should not break the picker.\n  }\n}\n\nfunction save(): void {\n  try {\n    const dir = dirname(STORE_PATH)\n    if (!existsSync(dir)) mkdirSync(dir, { recursive: true })\n    writeFileSync(STORE_PATH, JSON.stringify(_cache, null, 2), 'utf8')\n  } catch {\n    // Persistence is best-effort; the in-memory value still works this run.\n  }\n}\n\nexport function getCommandCodeEffort(model: string): CommandCodeEffort {\n  load()\n  const levels = commandCodeEffortLevelsForModel(model)\n  const stored = storeKeys(model).map(key => _cache[key]).find(Boolean)\n  return stored && levels.includes(stored) ? stored : 'default'\n}\n\nexport function setCommandCodeEffort(\n  model: string,\n  effort: CommandCodeEffort,\n): void {\n  load()\n  const keys = storeKeys(model)\n  const levels = commandCodeEffortLevelsForModel(model)\n  const next = levels.includes(effort) ? effort : 'default'\n  if (next === 'default') {\n    for (const key of keys) delete _cache[key]\n  } else {\n    for (const key of keys) _cache[key] = next\n  }\n  save()\n}\n\nexport function cycleCommandCodeEffort(\n  model: string,\n  direction: 'left' | 'right',\n): CommandCodeEffort {\n  const levels = commandCodeEffortLevelsForModel(model)\n  if (levels.length <= 1) return 'default'\n  const current = getCommandCodeEffort(model)\n  const idx = Math.max(0, levels.indexOf(current))\n  const len = levels.length\n  const next =\n    direction === 'right'\n      ? levels[(idx + 1) % len]!\n      : levels[(idx - 1 + len) % len]!\n  setCommandCodeEffort(model, next)\n  return next\n}\n\nexport function getCommandCodeEffortLabel(effort: CommandCodeEffort): string {\n  return effort === 'xhigh'\n    ? 'XHigh'\n    : effort.charAt(0).toUpperCase() + effort.slice(1)\n}\n\nexport function getCommandCodeRequestEffort(\n  model: string,\n): CommandCodeWireEffort | null {\n  const effort = getCommandCodeEffort(model)\n  return effort === 'default' ? null : effort\n}\n\nexport function commandCodeAnthropicBudgetForEffort(\n  effort: CommandCodeWireEffort,\n): number {\n  switch (effort) {\n    case 'low': return 4000\n    case 'medium': return 8000\n    case 'high': return 16000\n    case 'xhigh': return 24000\n    case 'max': return 30000\n  }\n}\n\nexport function getCommandCodeModelDisplayName(modelId: string): string | null {\n  const leaf = modelId.split('/').pop() ?? modelId\n  const normalized = leaf.toLowerCase()\n  const full = modelId.toLowerCase()\n  switch (normalized) {\n    case 'gpt-5.3-codex':\n      return 'GPT-5.3 Codex'\n    case 'gpt-5.4-mini':\n      return 'GPT-5.4 Mini'\n    case 'claude-opus-4-8':\n      return 'Claude Opus 4.8'\n    case 'claude-opus-4-7':\n      return 'Claude Opus 4.7'\n    case 'claude-opus-4-6':\n      return 'Claude Opus 4.6'\n    case 'claude-sonnet-4-6':\n      return 'Claude Sonnet 4.6'\n    case 'claude-haiku-4-5':\n    case 'claude-haiku-4-5-20251001':\n      return 'Claude Haiku 4.5'\n    case 'deepseek-v4-flash':\n    case 'deepseek/deepseek-v4-flash':\n      return 'DeepSeek V4 Flash'\n    case 'deepseek-v4-pro':\n      return 'DeepSeek V4 Pro'\n    case 'kimi-k2.6':\n      return 'Kimi K2.6'\n    case 'kimi-k2.5':\n      return 'Kimi K2.5'\n    case 'qwen3.7-max':\n      return 'Qwen 3.7 Max'\n    case 'qwen3.7-plus':\n      return 'Qwen 3.7 Plus'\n    case 'qwen3.7-max-free':\n      return 'Qwen 3.7 Max Free'\n    case 'minimax-m3':\n      return 'MiniMax M3'\n    case 'minimax-m2.7':\n      return 'MiniMax M2.7'\n    case 'minimax-m2.5':\n      return 'MiniMax M2.5'\n    case 'glm-5.1':\n      return 'GLM 5.1'\n    case 'glm-5':\n      return 'GLM 5'\n    default:\n      if (full.endsWith('/kimi-k2.6')) return 'Kimi K2.6'\n      if (full.endsWith('/kimi-k2.5')) return 'Kimi K2.5'\n      if (full.endsWith('/qwen3.7-max')) return 'Qwen 3.7 Max'\n      if (full.endsWith('/qwen3.7-plus')) return 'Qwen 3.7 Plus'\n      if (full.endsWith('/qwen3.7-max-free')) return 'Qwen 3.7 Max Free'\n      if (full.endsWith('/minimax-m3')) return 'MiniMax M3'\n      if (full.endsWith('/minimax-m2.7')) return 'MiniMax M2.7'\n      if (full.endsWith('/minimax-m2.5')) return 'MiniMax M2.5'\n      return null\n  }\n}\n\nexport function inferCommandCodeUpstreamProvider(modelId: string): string {\n  const m = comparableModel(modelId)\n  if (m.includes('claude')) return 'Anthropic'\n  if (isCommandCodeGptModel(modelId) || m.startsWith('o1') || m.startsWith('o3') || m.startsWith('o4')) {\n    return 'OpenAI / Codex'\n  }\n  if (m.includes('deepseek')) return 'DeepSeek'\n  if (m.includes('gemini')) return 'Google Gemini'\n  if (m.includes('qwen') || m.includes('qwq')) return 'Qwen'\n  if (m.includes('glm')) return 'GLM'\n  if (m.includes('kimi') || m.includes('moonshot')) return 'Moonshot AI'\n  if (m.includes('minimax')) return 'MiniMax AI'\n  if (m.includes('grok') || m.includes('xai')) return 'xAI'\n  return 'Command Code'\n}\n\nexport function _resetCommandCodeThinkingForTests(\n  cache: Record<string, CommandCodeEffort> = {},\n): void {\n  _loaded = true\n  _cache = { ...cache }\n}\n", "import { randomUUID } from 'node:crypto'\nimport { execFileSync } from 'node:child_process'\nimport { readdirSync } from 'node:fs'\nimport { arch, platform } from 'node:os'\nimport {\n  buildProviderStreamResult,\n  type AnthropicContentBlock,\n  type AnthropicMessage,\n  type AnthropicStreamEvent,\n  type ModelInfo,\n  type ProviderConfig,\n  type ProviderContentBlock,\n  type ProviderMessage,\n  type ProviderRequestParams,\n  type ProviderStreamResult,\n  type ProviderTool,\n  type SystemBlock,\n} from './base_provider.js'\nimport { OpenAIProvider } from './openai_provider.js'\nimport { getProviderModelSet } from '../../../utils/model/configs.js'\nimport {\n  commandCodeAnthropicBudgetForEffort,\n  getCommandCodeModelDisplayName,\n  getCommandCodeRequestEffort,\n  inferCommandCodeUpstreamProvider,\n  isCommandCodeClaudeModel,\n  supportsCommandCodeEffortSelection,\n} from '../../../utils/model/commandCodeThinking.js'\nimport type { OpenAIReasoningLevel } from '../../../utils/model/openaiReasoning.js'\nimport { getSessionId } from '../../../bootstrap/state.js'\n\nconst COMMAND_CODE_API_BASE_URL = 'https://api.commandcode.ai'\nconst COMMAND_CODE_PROVIDER_BASE_URL = `${COMMAND_CODE_API_BASE_URL}/provider/v1`\nconst COMMAND_CODE_ALPHA_GENERATE_PATH = '/alpha/generate'\nconst COMMAND_CODE_CLI_VERSION = process.env.COMMAND_CODE_CLI_VERSION ?? '0.32.2'\nconst COMMAND_CODE_CACHE_CONTROL = { type: 'ephemeral' } as const\nconst commandCodeEnvironmentContextBySession = new Map<string, Record<string, unknown>>()\nlet fallbackCommandCodeAlphaSessionId: string | null = null\n\nconst COMMAND_CODE_NATIVE_MODEL_IDS = [\n  'moonshotai/Kimi-K2.6',\n  'moonshotai/Kimi-K2.5',\n  'Qwen/Qwen3.7-Max',\n  'Qwen/Qwen3.7-Plus',\n  'Qwen/Qwen3.7-Max-Free',\n  'MiniMaxAI/MiniMax-M3',\n  'MiniMaxAI/MiniMax-M2.7',\n  'MiniMaxAI/MiniMax-M2.5',\n  'deepseek/deepseek-v4-pro',\n  'deepseek/deepseek-v4-flash',\n  'zai-org/GLM-5.1',\n  'zai-org/GLM-5',\n] as const\n\nconst COMMAND_CODE_FALLBACK_MODEL_IDS = [\n  ...COMMAND_CODE_NATIVE_MODEL_IDS,\n  'gpt-5.3-codex',\n  'gpt-5.4-mini',\n  'claude-sonnet-4-6',\n  'claude-opus-4-6',\n  'claude-haiku-4-5',\n] as const\n\ntype RawCommandCodeModel = Record<string, unknown>\ntype CommandCodeAlphaEvent = Record<string, unknown>\n\nexport class CommandCodeProvider extends OpenAIProvider {\n  readonly name = 'commandcode'\n  private readonly alphaBaseUrl: string\n\n  constructor(config: ProviderConfig) {\n    const providerBaseUrl = normalizeCommandCodeBaseUrl(config.baseUrl)\n    super({\n      ...config,\n      baseUrl: providerBaseUrl,\n    })\n    this.preserveCacheControl = true\n    this.alphaBaseUrl = normalizeCommandCodeAlphaBaseUrl(\n      process.env.COMMANDCODE_API_URL\n      ?? process.env.COMMANDCODE_ALPHA_BASE_URL\n      ?? process.env.COMMAND_CODE_ALPHA_BASE_URL\n      ?? providerBaseUrl,\n    )\n  }\n\n  protected resolveReasoningEffort(\n    model: string,\n    _thinking: ProviderRequestParams['thinking'],\n  ): OpenAIReasoningLevel | undefined {\n    const effort = getCommandCodeRequestEffort(model)\n    if (!effort || effort === 'max') return undefined\n    return effort\n  }\n\n  async stream(params: ProviderRequestParams): Promise<ProviderStreamResult> {\n    const model = this.resolveModel(params.model)\n    if (isCommandCodeClaudeModel(model)) {\n      return this._streamAnthropicMessages(params, model)\n    }\n    if (isCommandCodeNativeAlphaModel(model)) {\n      return this._streamAlphaGenerate({ ...params, model }, model)\n    }\n    return super.stream(params)\n  }\n\n  async create(params: ProviderRequestParams): Promise<AnthropicMessage> {\n    const model = this.resolveModel(params.model)\n    if (isCommandCodeClaudeModel(model)) {\n      return this._createAnthropicMessage(params, model)\n    }\n    if (isCommandCodeNativeAlphaModel(model)) {\n      return this._createAlphaGenerate({ ...params, model }, model)\n    }\n    return super.create(params)\n  }\n\n  async listModels(): Promise<ModelInfo[]> {\n    try {\n      const response = await fetch(`${this.baseUrl}/models`, {\n        headers: this._headers(),\n        signal: AbortSignal.timeout(8_000),\n      })\n      if (response.ok) {\n        const data = await response.json()\n        const rawModels = extractModelRows(data)\n        const models = rawModels\n          .map(toCommandCodeModelInfo)\n          .filter((model): model is ModelInfo => model !== null)\n        if (models.length > 0) return mergeCommandCodeModels(models)\n      }\n    } catch {\n      // Use the fallback catalog if the live list is unreachable.\n    }\n\n    return fallbackModels()\n  }\n\n  resolveModel(model: string): string {\n    const raw = model.trim()\n    if (!raw.toLowerCase().includes('claude')) return raw\n\n    const leaf = raw.split('/').pop() ?? raw\n    if (/^claude-[a-z0-9-]+-\\d/i.test(leaf)) {\n      return leaf\n    }\n\n    const models = getProviderModelSet(this.name)\n    const lower = raw.toLowerCase()\n    if (lower.includes('opus')) return models.opus\n    if (lower.includes('haiku')) return models.haiku\n    return models.sonnet\n  }\n\n  protected formatAPIError(status: number, body: string): Error {\n    const detail = extractErrorDetail(body)\n    if (status === 403 && /upgrade_required|pro plan|pro or higher/i.test(detail)) {\n      return new Error(\n        'Command Code API error: this endpoint requires a higher Command Code plan.\\n'\n        + `${detail || 'Switch to a Go-plan model from /models, or upgrade your Command Code plan.'}`,\n      )\n    }\n    if (status === 400 && /wrong endpoint|\\/messages|chat\\/completions|unsupported_model/i.test(detail)) {\n      return new Error(\n        'Command Code API error: the selected model must use the matching Command Code endpoint.\\n'\n        + `${detail || 'Claude models use /provider/v1/messages; GPT models use /provider/v1/chat/completions; Command Code pool models use /alpha/generate.'}`,\n      )\n    }\n    return super.formatAPIError(status, body)\n  }\n\n  private async _streamAlphaGenerate(\n    params: ProviderRequestParams,\n    model: string,\n  ): Promise<ProviderStreamResult> {\n    const ac = new AbortController()\n    const alphaSessionId = commandCodeAlphaSessionId()\n    const response = await fetch(this._alphaGenerateUrl(), {\n      method: 'POST',\n      headers: this._alphaHeaders(alphaSessionId),\n      body: JSON.stringify(this._alphaBody(params, model, alphaSessionId)),\n      signal: ac.signal,\n    })\n\n    if (!response.ok) {\n      const errText = await response.text().catch(() => '')\n      throw this.formatAPIError(response.status, errText)\n    }\n\n    if (!response.body) {\n      throw new Error('Command Code returned no response body for alpha streaming request')\n    }\n\n    this._extractRateLimits(response.headers)\n    return buildProviderStreamResult(this._parseAlphaGenerateStream(response.body, model), ac)\n  }\n\n  private async _createAlphaGenerate(\n    params: ProviderRequestParams,\n    model: string,\n  ): Promise<AnthropicMessage> {\n    const alphaSessionId = commandCodeAlphaSessionId()\n    const response = await fetch(this._alphaGenerateUrl(), {\n      method: 'POST',\n      headers: this._alphaHeaders(alphaSessionId),\n      body: JSON.stringify(this._alphaBody(params, model, alphaSessionId)),\n    })\n\n    if (!response.ok) {\n      const errText = await response.text().catch(() => '')\n      throw this.formatAPIError(response.status, errText)\n    }\n\n    if (!response.body) {\n      throw new Error('Command Code returned no response body for alpha request')\n    }\n\n    this._extractRateLimits(response.headers)\n    return collectAlphaMessage(this._parseAlphaGenerateStream(response.body, model), model)\n  }\n\n  private _alphaGenerateUrl(): string {\n    return `${this.alphaBaseUrl}${COMMAND_CODE_ALPHA_GENERATE_PATH}`\n  }\n\n  private _alphaHeaders(alphaSessionId: string): Record<string, string> {\n    return {\n      'Content-Type': 'application/json',\n      'Authorization': `Bearer ${this.apiKey}`,\n      'x-cli-environment': 'production',\n      'x-command-code-version': COMMAND_CODE_CLI_VERSION,\n      'x-co-flag': 'false',\n      'x-project-slug': commandCodeProjectSlug(),\n      'x-session-id': alphaSessionId,\n      'x-taste-learning': 'false',\n      ...this.extraHeaders,\n    }\n  }\n\n  private _alphaBody(\n    params: ProviderRequestParams,\n    model: string,\n    alphaSessionId: string,\n  ): Record<string, unknown> {\n    const requestParams: Record<string, unknown> = {\n      stream: true,\n      messages: toCommandCodeAlphaMessages(params.messages),\n      max_tokens: params.max_tokens,\n      model,\n    }\n\n    const system = commandCodeSystemToText(params.system)\n    if (system) requestParams.system = system\n    if (params.temperature !== undefined) requestParams.temperature = params.temperature\n    if (params.stop_sequences && params.stop_sequences.length > 0) {\n      requestParams.stop_sequences = params.stop_sequences\n    }\n    if (params.tools && params.tools.length > 0) {\n      requestParams.tools = toCommandCodeAlphaTools(params.tools)\n    }\n\n    const effort = getCommandCodeRequestEffort(model)\n    if (effort) requestParams.reasoning_effort = effort\n\n    return {\n      mode: 'custom-agent',\n      config: getCommandCodeEnvironmentContext(alphaSessionId),\n      memory: '',\n      threadId: alphaSessionId,\n      params: requestParams,\n    }\n  }\n\n  private async *_parseAlphaGenerateStream(\n    body: ReadableStream<Uint8Array>,\n    model: string,\n  ): AsyncGenerator<AnthropicStreamEvent> {\n    const message = emptyAlphaMessage(model)\n    let blockIndex = 0\n    let currentBlock: AnthropicContentBlock | null = null\n    let currentKind: 'text' | 'thinking' | null = null\n\n    yield { type: 'message_start', message }\n\n    const closeBlock = async function* (): AsyncGenerator<AnthropicStreamEvent> {\n      if (!currentKind) return\n      yield { type: 'content_block_stop', index: blockIndex }\n      blockIndex += 1\n      currentBlock = null\n      currentKind = null\n    }\n\n    for await (const event of readCommandCodeAlphaEvents(body)) {\n      const type = firstString(event.type, event.event)\n      if (!type) continue\n\n      if (type === 'error') {\n        throw new Error(`Command Code API stream error: ${commandCodeAlphaErrorDetail(event)}`)\n      }\n\n      if (type === 'text-delta' || type === 'text_delta' || type === 'output_text_delta') {\n        const text = firstText(event.text, event.delta, event.content)\n        if (!text) continue\n        if (currentKind === 'thinking') {\n          for await (const stop of closeBlock()) yield stop\n        }\n        if (currentKind !== 'text') {\n          currentBlock = { type: 'text', text: '' }\n          message.content.push(currentBlock)\n          currentKind = 'text'\n          yield { type: 'content_block_start', index: blockIndex, content_block: { ...currentBlock } }\n        }\n        currentBlock!.text = (currentBlock!.text ?? '') + text\n        yield { type: 'content_block_delta', index: blockIndex, delta: { type: 'text_delta', text } }\n        continue\n      }\n\n      if (type === 'reasoning-start' || type === 'reasoning_start') {\n        if (currentKind === 'text') {\n          for await (const stop of closeBlock()) yield stop\n        }\n        if (currentKind !== 'thinking') {\n          currentBlock = { type: 'thinking', thinking: '' }\n          message.content.push(currentBlock)\n          currentKind = 'thinking'\n          yield { type: 'content_block_start', index: blockIndex, content_block: { ...currentBlock } }\n        }\n        continue\n      }\n\n      if (type === 'reasoning-delta' || type === 'reasoning_delta') {\n        const thinking = firstText(event.text, event.thinking, event.delta, event.content)\n        if (!thinking) continue\n        if (currentKind === 'text') {\n          for await (const stop of closeBlock()) yield stop\n        }\n        if (currentKind !== 'thinking') {\n          currentBlock = { type: 'thinking', thinking: '' }\n          message.content.push(currentBlock)\n          currentKind = 'thinking'\n          yield { type: 'content_block_start', index: blockIndex, content_block: { ...currentBlock } }\n        }\n        currentBlock!.thinking = (currentBlock!.thinking ?? '') + thinking\n        yield { type: 'content_block_delta', index: blockIndex, delta: { type: 'thinking_delta', thinking } }\n        continue\n      }\n\n      if (type === 'reasoning-end' || type === 'reasoning_end') {\n        if (currentKind === 'thinking') {\n          for await (const stop of closeBlock()) yield stop\n        }\n        continue\n      }\n\n      if (type === 'tool-call' || type === 'tool_call') {\n        for await (const stop of closeBlock()) yield stop\n        const id = firstString(event.toolCallId, event.tool_call_id, event.id) ?? `toolu_${randomUUID()}`\n        const name = firstString(event.toolName, event.tool_name, event.name) ?? 'tool'\n        const input = alphaToolInput(event)\n        const block: AnthropicContentBlock = { type: 'tool_use', id, name, input }\n        message.content.push(block)\n        yield { type: 'content_block_start', index: blockIndex, content_block: { ...block, input: {} } }\n        yield {\n          type: 'content_block_delta',\n          index: blockIndex,\n          delta: { type: 'input_json_delta', partial_json: JSON.stringify(input) },\n        }\n        yield { type: 'content_block_stop', index: blockIndex }\n        blockIndex += 1\n        continue\n      }\n\n      if (type === 'tool-result' || type === 'tool_result') {\n        if (event.providerExecuted === true) {\n          const text = toolResultToText(firstDefined(event.output, event.result))\n          if (text) {\n            if (currentKind === 'thinking') {\n              for await (const stop of closeBlock()) yield stop\n            }\n            if (currentKind !== 'text') {\n              currentBlock = { type: 'text', text: '' }\n              message.content.push(currentBlock)\n              currentKind = 'text'\n              yield { type: 'content_block_start', index: blockIndex, content_block: { ...currentBlock } }\n            }\n            currentBlock!.text = (currentBlock!.text ?? '') + text\n            yield { type: 'content_block_delta', index: blockIndex, delta: { type: 'text_delta', text } }\n          }\n        }\n        continue\n      }\n\n      if (type === 'finish' || type === 'done' || type === 'message_stop') {\n        for await (const stop of closeBlock()) yield stop\n        const stopReason = alphaStopReason(firstString(event.finishReason, event.finish_reason, event.rawFinishReason))\n        message.stop_reason = stopReason\n        applyAlphaUsage(message, alphaUsageFromEvent(event))\n        yield {\n          type: 'message_delta',\n          delta: { stop_reason: stopReason, stop_sequence: null },\n          usage: {\n            output_tokens: message.usage.output_tokens,\n            input_tokens: message.usage.input_tokens,\n            ...(message.usage.cache_read_input_tokens\n              ? { cache_read_input_tokens: message.usage.cache_read_input_tokens }\n              : {}),\n            ...(message.usage.cache_creation_input_tokens\n              ? { cache_creation_input_tokens: message.usage.cache_creation_input_tokens }\n              : {}),\n          },\n        }\n        yield { type: 'message_stop' }\n        return\n      }\n    }\n\n    for await (const stop of closeBlock()) yield stop\n    message.stop_reason = 'end_turn'\n    yield {\n      type: 'message_delta',\n      delta: { stop_reason: 'end_turn', stop_sequence: null },\n      usage: {\n        output_tokens: message.usage.output_tokens,\n        input_tokens: message.usage.input_tokens,\n      },\n    }\n    yield { type: 'message_stop' }\n  }\n\n  private async _streamAnthropicMessages(\n    params: ProviderRequestParams,\n    model: string,\n  ): Promise<ProviderStreamResult> {\n    const body = this._anthropicBody(params, model, true)\n    const ac = new AbortController()\n    const response = await fetch(this._messagesUrl(), {\n      method: 'POST',\n      headers: this._anthropicHeaders(),\n      body: JSON.stringify(body),\n      signal: ac.signal,\n    })\n\n    if (!response.ok) {\n      const errText = await response.text().catch(() => '')\n      throw this.formatAPIError(response.status, errText)\n    }\n\n    if (!response.body) {\n      throw new Error('Command Code returned no response body for streaming request')\n    }\n\n    this._extractRateLimits(response.headers)\n    return buildProviderStreamResult(this._parseAnthropicSSE(response.body), ac)\n  }\n\n  private async _createAnthropicMessage(\n    params: ProviderRequestParams,\n    model: string,\n  ): Promise<AnthropicMessage> {\n    const response = await fetch(this._messagesUrl(), {\n      method: 'POST',\n      headers: this._anthropicHeaders(),\n      body: JSON.stringify(this._anthropicBody(params, model, false)),\n    })\n\n    if (!response.ok) {\n      const errText = await response.text().catch(() => '')\n      throw this.formatAPIError(response.status, errText)\n    }\n\n    this._extractRateLimits(response.headers)\n    return await response.json() as AnthropicMessage\n  }\n\n  private _messagesUrl(): string {\n    return `${this.baseUrl.replace(/\\/+$/, '')}/messages`\n  }\n\n  private _anthropicHeaders(): Record<string, string> {\n    return {\n      ...this._headers(),\n      'anthropic-version': '2023-06-01',\n    }\n  }\n\n  private _anthropicBody(\n    params: ProviderRequestParams,\n    model: string,\n    stream: boolean,\n  ): Record<string, unknown> {\n    const effort = getCommandCodeRequestEffort(model)\n    const body: Record<string, unknown> = {\n      model,\n      max_tokens: params.max_tokens,\n      messages: params.messages,\n    }\n\n    if (stream) body.stream = true\n    if (params.system) body.system = params.system\n    if (params.tools && params.tools.length > 0) body.tools = params.tools\n    if (params.stop_sequences) body.stop_sequences = params.stop_sequences\n\n    if (effort) {\n      const budget = commandCodeAnthropicBudgetForEffort(effort)\n      const maxTokens = Math.max(params.max_tokens, budget + 1)\n      body.max_tokens = maxTokens\n      body.thinking = {\n        type: 'enabled',\n        budget_tokens: Math.min(budget, maxTokens - 1),\n      }\n    } else if (params.temperature !== undefined) {\n      body.temperature = params.temperature\n    }\n\n    return body\n  }\n\n  private async *_parseAnthropicSSE(\n    body: ReadableStream<Uint8Array>,\n  ): AsyncGenerator<AnthropicStreamEvent> {\n    const reader = body.getReader()\n    const decoder = new TextDecoder()\n    let buffer = ''\n\n    try {\n      while (true) {\n        const { done, value } = await reader.read()\n        if (done) break\n\n        buffer += decoder.decode(value, { stream: true })\n        let boundary: number\n        while ((boundary = buffer.indexOf('\\n\\n')) !== -1) {\n          const event = buffer.slice(0, boundary)\n          buffer = buffer.slice(boundary + 2)\n          const parsed = this._parseAnthropicSSEEvent(event)\n          if (parsed) yield parsed\n        }\n      }\n\n      if (buffer.trim()) {\n        const parsed = this._parseAnthropicSSEEvent(buffer)\n        if (parsed) yield parsed\n      }\n    } finally {\n      reader.releaseLock()\n    }\n  }\n\n  private _parseAnthropicSSEEvent(event: string): AnthropicStreamEvent | null {\n    const data: string[] = []\n    for (const rawLine of event.split('\\n')) {\n      const line = rawLine.replace(/\\r$/, '')\n      if (line.startsWith('data:')) {\n        data.push(line.slice(5).trimStart())\n      }\n    }\n\n    const json = data.join('\\n').trim()\n    if (!json || json === '[DONE]') return null\n\n    try {\n      const parsed = JSON.parse(json) as AnthropicStreamEvent & {\n        error?: { message?: string; type?: string }\n      }\n      if (parsed.type === 'error') {\n        const detail = parsed.error?.message ?? parsed.error?.type ?? json\n        throw new Error(`Command Code API stream error: ${detail}`)\n      }\n      return parsed\n    } catch (error) {\n      if (error instanceof Error && error.message.includes('Command Code API stream error')) {\n        throw error\n      }\n      return null\n    }\n  }\n}\n\nfunction normalizeCommandCodeBaseUrl(raw?: string): string {\n  const base = (raw || COMMAND_CODE_PROVIDER_BASE_URL).replace(/\\/+$/, '')\n  if (/\\/provider\\/v1$/i.test(base)) return base\n  if (/\\/provider$/i.test(base)) return `${base}/v1`\n  if (/\\/v1$/i.test(base)) return `${base.replace(/\\/v1$/i, '')}/provider/v1`\n  return `${base}/provider/v1`\n}\n\nfunction normalizeCommandCodeAlphaBaseUrl(raw?: string): string {\n  const base = (raw || COMMAND_CODE_API_BASE_URL).replace(/\\/+$/, '')\n  return base\n    .replace(/\\/provider\\/v1$/i, '')\n    .replace(/\\/provider$/i, '')\n    .replace(/\\/v1$/i, '')\n}\n\nfunction isCommandCodeNativeAlphaModel(model: string): boolean {\n  return !isCommandCodeClaudeModel(model) && !isCommandCodeOpenAIModel(model)\n}\n\nfunction isCommandCodeOpenAIModel(model: string): boolean {\n  const normalized = comparableCommandCodeModel(model)\n  const leaf = normalized.split('/').pop() ?? normalized\n  return (\n    leaf.startsWith('gpt-')\n    || leaf.startsWith('o1')\n    || leaf.startsWith('o3')\n    || leaf.startsWith('o4')\n    || leaf.includes('codex')\n  )\n}\n\nfunction comparableCommandCodeModel(model: string): string {\n  return model.trim().toLowerCase().replace(/[._]/g, '-')\n}\n\nfunction extractModelRows(data: unknown): RawCommandCodeModel[] {\n  if (Array.isArray(data)) return data.filter(isRecord)\n  if (!isRecord(data)) return []\n  const rows = data.data ?? data.models\n  return Array.isArray(rows) ? rows.filter(isRecord) : []\n}\n\nfunction toCommandCodeModelInfo(raw: RawCommandCodeModel): ModelInfo | null {\n  const id = firstString(raw.id, raw.model, raw.name)\n  if (!id) return null\n  const name =\n    firstString(raw.display_name, raw.displayName, raw.label)\n    ?? getCommandCodeModelDisplayName(id)\n    ?? firstString(raw.name)\n    ?? id\n  const contextWindow = firstNumber(\n    raw.context_window,\n    raw.contextWindow,\n    raw.context_length,\n    raw.contextLength,\n    raw.max_context_length,\n  )\n  return {\n    id,\n    name,\n    provider: firstString(raw.provider, raw.owned_by, raw.owner)\n      ?? inferCommandCodeUpstreamProvider(id),\n    ...(contextWindow ? { contextWindow } : {}),\n    supportsToolCalling: firstBoolean(\n      raw.supports_tool_calling,\n      raw.supportsToolCalling,\n      raw.tool_calling,\n    ) ?? true,\n    tags: commandCodeTagsForModel(id),\n  }\n}\n\nfunction commandCodeTagsForModel(id: string): readonly string[] {\n  const tags = new Set<string>()\n  const lower = id.toLowerCase()\n  if (supportsCommandCodeEffortSelection(id)) tags.add('reasoning')\n  if (lower.includes('mini') || lower.includes('haiku') || lower.includes('flash')) {\n    tags.add('fast')\n  }\n  if (\n    lower === 'gpt-5.3-codex'\n    || lower.includes('sonnet-4-6')\n    || lower.includes('kimi-k2.6')\n    || lower.includes('qwen3.7-plus')\n    || lower.includes('minimax-m3')\n  ) {\n    tags.add('recommended')\n  }\n  return Array.from(tags)\n}\n\nfunction mergeCommandCodeModels(apiModels: readonly ModelInfo[]): ModelInfo[] {\n  const merged = new Map<string, ModelInfo>()\n  for (const model of fallbackModels()) merged.set(model.id, model)\n  for (const model of apiModels) merged.set(model.id, model)\n  return Array.from(merged.values())\n}\n\nfunction fallbackModels(): ModelInfo[] {\n  return COMMAND_CODE_FALLBACK_MODEL_IDS.map(id => ({\n    id,\n    name: getCommandCodeModelDisplayName(id) ?? id,\n    provider: inferCommandCodeUpstreamProvider(id),\n    supportsToolCalling: true,\n    tags: commandCodeTagsForModel(id),\n  }))\n}\n\nfunction toCommandCodeAlphaTools(tools: readonly ProviderTool[]): Array<Record<string, unknown>> {\n  const result = tools.map(tool => ({\n    name: tool.name,\n    ...(tool.description ? { description: tool.description } : {}),\n    input_schema: tool.input_schema,\n    ...((tool as { cache_control?: unknown }).cache_control\n      ? { cache_control: (tool as { cache_control?: unknown }).cache_control }\n      : {}),\n  }))\n\n  if (result.length > 0 && !result.some(hasCommandCodeCacheControl)) {\n    result[result.length - 1] = {\n      ...result[result.length - 1]!,\n      cache_control: COMMAND_CODE_CACHE_CONTROL,\n    }\n  }\n\n  return result\n}\n\nfunction toCommandCodeAlphaMessages(messages: readonly ProviderMessage[]): Array<Record<string, unknown>> {\n  const toolNames = commandCodeToolNameById(messages)\n  const result: Array<Record<string, unknown>> = []\n\n  for (const message of messages) {\n    if (typeof message.content === 'string') {\n      result.push({ role: message.role, content: message.content })\n      continue\n    }\n\n    const toolResults = message.content\n      .filter(block => block.type === 'tool_result')\n      .map(block => toCommandCodeAlphaToolResultBlock(block, toolNames))\n      .filter((block): block is Record<string, unknown> => block !== null)\n    const otherBlocks = message.content\n      .filter(block => block.type !== 'tool_result')\n      .map(block => toCommandCodeAlphaContentBlock(block))\n      .filter((block): block is Record<string, unknown> => block !== null)\n\n    if (message.role === 'assistant') {\n      if (otherBlocks.length > 0) {\n        result.push({ role: 'assistant', content: otherBlocks })\n      }\n      if (toolResults.length > 0) {\n        result.push({ role: 'tool', content: toolResults })\n      }\n      continue\n    }\n\n    if (toolResults.length > 0) {\n      result.push({ role: 'tool', content: toolResults })\n    }\n    if (otherBlocks.length > 0) {\n      result.push({ role: 'user', content: otherBlocks })\n    }\n  }\n\n  return ensureCommandCodeMessageCacheControl(result)\n}\n\nfunction ensureCommandCodeMessageCacheControl(\n  messages: Array<Record<string, unknown>>,\n): Array<Record<string, unknown>> {\n  if (messages.some(messageHasCommandCodeContentCacheControl)) return messages\n\n  const userIndexes = messages\n    .map((message, index) => message.role === 'user' && message.content ? index : -1)\n    .filter(index => index >= 0)\n  if (userIndexes.length < 2) return messages\n\n  const target = messages[userIndexes[userIndexes.length - 2]!]\n  if (!target) return messages\n\n  const content = target.content\n  if (typeof content === 'string') {\n    target.content = [{\n      type: 'text',\n      text: content,\n      cache_control: COMMAND_CODE_CACHE_CONTROL,\n    }]\n    return messages\n  }\n\n  if (!Array.isArray(content)) return messages\n  for (let index = content.length - 1; index >= 0; index -= 1) {\n    const block = content[index]\n    if (!isRecord(block)) continue\n    content[index] = {\n      ...block,\n      cache_control: COMMAND_CODE_CACHE_CONTROL,\n    }\n    break\n  }\n\n  return messages\n}\n\nfunction messageHasCommandCodeContentCacheControl(message: Record<string, unknown>): boolean {\n  const content = message.content\n  return Array.isArray(content) && content.some(hasCommandCodeCacheControl)\n}\n\nfunction hasCommandCodeCacheControl(value: unknown): boolean {\n  return isRecord(value) && value.cache_control !== undefined\n}\n\nfunction toCommandCodeAlphaContentBlock(block: ProviderContentBlock): Record<string, unknown> | null {\n  const cacheControl = (block as { cache_control?: unknown }).cache_control\n  const withCache = (value: Record<string, unknown>): Record<string, unknown> => (\n    cacheControl ? { ...value, cache_control: cacheControl } : value\n  )\n\n  switch (block.type) {\n    case 'text':\n      return withCache({ type: 'text', text: block.text ?? '' })\n    case 'thinking':\n      return null\n    case 'redacted_thinking':\n      return null\n    case 'tool_use':\n      return withCache({\n        type: 'tool-call',\n        toolCallId: block.id ?? `toolu_${randomUUID()}`,\n        toolName: block.name ?? 'tool',\n        input: block.input ?? {},\n      })\n    case 'tool_result':\n      return null\n    case 'image':\n      return withCache({\n        type: 'image',\n        source: block.source,\n      })\n  }\n}\n\nfunction commandCodeToolNameById(messages: readonly ProviderMessage[]): Map<string, string> {\n  const names = new Map<string, string>()\n  for (const message of messages) {\n    if (typeof message.content === 'string') continue\n    for (const block of message.content) {\n      if (block.type === 'tool_use' && block.id && block.name) {\n        names.set(block.id, block.name)\n      }\n    }\n  }\n  return names\n}\n\nfunction toCommandCodeAlphaToolResultBlock(\n  block: ProviderContentBlock,\n  toolNames: ReadonlyMap<string, string>,\n): Record<string, unknown> | null {\n  if (block.type !== 'tool_result') return null\n  const toolCallId = block.tool_use_id ?? ''\n  return {\n    type: 'tool-result',\n    toolCallId,\n    ...(toolNames.get(toolCallId) ? { toolName: toolNames.get(toolCallId) } : {}),\n    output: {\n      type: block.is_error ? 'error-text' : 'text',\n      value: toolResultToText(block.content),\n    },\n  }\n}\n\nfunction commandCodeSystemToText(system?: string | SystemBlock[]): string | undefined {\n  if (!system) return undefined\n  const text = typeof system === 'string'\n    ? system\n    : system.map(block => block.text).join('\\n\\n')\n  return text.trim() ? text : undefined\n}\n\nfunction commandCodeProjectSlug(): string {\n  const cwd = process.cwd().replace(/\\\\/g, '/').replace(/\\/+$/, '')\n  const leaf = cwd.split('/').pop()\n  return leaf?.trim() || 'tau'\n}\n\nfunction commandCodeAlphaSessionId(): string {\n  try {\n    const sessionId = getSessionId()\n    if (typeof sessionId === 'string' && sessionId.trim()) return sessionId\n  } catch {\n    // Fall back below when bootstrap state is unavailable in isolated tests.\n  }\n\n  fallbackCommandCodeAlphaSessionId ??= randomUUID()\n  return fallbackCommandCodeAlphaSessionId\n}\n\nfunction getCommandCodeEnvironmentContext(sessionId: string): Record<string, unknown> {\n  const existing = commandCodeEnvironmentContextBySession.get(sessionId)\n  if (existing) return existing\n\n  const context = buildCommandCodeEnvironmentContext()\n  commandCodeEnvironmentContextBySession.set(sessionId, context)\n  return context\n}\n\nfunction buildCommandCodeEnvironmentContext(): Record<string, unknown> {\n  const workingDir = process.cwd()\n  const isGitRepo = commandCodeIsGitRepository(workingDir)\n  return {\n    workingDir,\n    date: new Date().toISOString().split('T')[0] ?? '',\n    environment: `${platform()}-${arch()}, Node.js ${process.version}`,\n    structure: commandCodeDirectoryStructure(workingDir),\n    isGitRepo,\n    currentBranch: isGitRepo ? commandCodeGitOutput(workingDir, ['branch', '--show-current']) : '',\n    mainBranch: isGitRepo ? commandCodeMainBranch(workingDir) : '',\n    gitStatus: isGitRepo ? commandCodeGitStatus(workingDir) : '',\n    recentCommits: isGitRepo ? commandCodeRecentCommits(workingDir) : [],\n  }\n}\n\nfunction commandCodeDirectoryStructure(workingDir: string): string[] {\n  const ignored = new Set([\n    'node_modules',\n    'dist',\n    'build',\n    '.git',\n    '.svn',\n    '.hg',\n    'coverage',\n    '.nyc_output',\n    '.cache',\n    'tmp',\n    'temp',\n    '.next',\n    '.nuxt',\n    'out',\n  ])\n  try {\n    return readdirSync(workingDir, { withFileTypes: true })\n      .filter(entry => entry.isDirectory())\n      .filter(entry => !entry.name.startsWith('.'))\n      .filter(entry => !ignored.has(entry.name))\n      .map(entry => entry.name)\n      .sort()\n  } catch {\n    return []\n  }\n}\n\nfunction commandCodeIsGitRepository(workingDir: string): boolean {\n  try {\n    execFileSync('git', ['rev-parse', '--git-dir'], {\n      cwd: workingDir,\n      stdio: 'ignore',\n    })\n    return true\n  } catch {\n    return false\n  }\n}\n\nfunction commandCodeMainBranch(workingDir: string): string {\n  const branches = commandCodeGitOutput(workingDir, ['branch', '-r'])\n  if (branches.includes('origin/main')) return 'main'\n  if (branches.includes('origin/master')) return 'master'\n  return branches ? 'main' : ''\n}\n\nfunction commandCodeGitStatus(workingDir: string): string {\n  const status = commandCodeGitOutput(workingDir, ['status', '--porcelain'])\n  if (!status) return 'Working tree clean'\n\n  const lines = status.split('\\n')\n  const modified = lines.filter(line => line.startsWith(' M')).length\n  const added = lines.filter(line => line.startsWith('A ')).length\n  const deleted = lines.filter(line => line.startsWith(' D')).length\n  const untracked = lines.filter(line => line.startsWith('??')).length\n  const summary: string[] = []\n  if (modified > 0) summary.push(`M ${modified}`)\n  if (added > 0) summary.push(`A ${added}`)\n  if (deleted > 0) summary.push(`D ${deleted}`)\n  if (untracked > 0) summary.push(`?? ${untracked}`)\n  return summary.join(', ') || status\n}\n\nfunction commandCodeRecentCommits(workingDir: string): string[] {\n  const commits = commandCodeGitOutput(workingDir, ['log', '--oneline', '-3'])\n  return commits ? commits.split('\\n') : []\n}\n\nfunction commandCodeGitOutput(workingDir: string, args: readonly string[]): string {\n  try {\n    return execFileSync('git', [...args], {\n      cwd: workingDir,\n      encoding: 'utf8',\n      stdio: ['pipe', 'pipe', 'ignore'],\n    }).trim()\n  } catch {\n    return ''\n  }\n}\n\nasync function* readCommandCodeAlphaEvents(\n  body: ReadableStream<Uint8Array>,\n): AsyncGenerator<CommandCodeAlphaEvent> {\n  const reader = body.getReader()\n  const decoder = new TextDecoder()\n  let buffer = ''\n\n  try {\n    while (true) {\n      const { done, value } = await reader.read()\n      if (done) break\n\n      buffer += decoder.decode(value, { stream: true })\n      let boundary: number\n      while ((boundary = buffer.indexOf('\\n')) !== -1) {\n        const line = buffer.slice(0, boundary)\n        buffer = buffer.slice(boundary + 1)\n        const parsed = parseCommandCodeAlphaLine(line)\n        if (parsed) yield parsed\n      }\n    }\n\n    if (buffer.trim()) {\n      const parsed = parseCommandCodeAlphaLine(buffer)\n      if (parsed) yield parsed\n    }\n  } finally {\n    reader.releaseLock()\n  }\n}\n\nfunction parseCommandCodeAlphaLine(line: string): CommandCodeAlphaEvent | null {\n  let json = line.trim()\n  if (!json) return null\n  if (json.startsWith('data:')) json = json.slice(5).trim()\n  if (!json || json === '[DONE]') return null\n  try {\n    const parsed = JSON.parse(json) as unknown\n    return isRecord(parsed) ? parsed : null\n  } catch {\n    return null\n  }\n}\n\nasync function collectAlphaMessage(\n  events: AsyncIterable<AnthropicStreamEvent>,\n  model: string,\n): Promise<AnthropicMessage> {\n  let message: AnthropicMessage | null = null\n  for await (const event of events) {\n    if (event.type === 'message_start' && event.message) {\n      message = event.message\n    }\n  }\n  return message ?? emptyAlphaMessage(model)\n}\n\nfunction emptyAlphaMessage(model: string): AnthropicMessage {\n  return {\n    id: `msg_${randomUUID()}`,\n    type: 'message',\n    role: 'assistant',\n    content: [],\n    model,\n    stop_reason: null,\n    stop_sequence: null,\n    usage: {\n      input_tokens: 0,\n      output_tokens: 0,\n    },\n  }\n}\n\nfunction alphaStopReason(value: string | null): AnthropicMessage['stop_reason'] {\n  const reason = value?.toLowerCase() ?? ''\n  if (reason.includes('tool')) return 'tool_use'\n  if (reason.includes('length') || reason.includes('max')) return 'max_tokens'\n  return 'end_turn'\n}\n\nfunction alphaUsageFromEvent(event: CommandCodeAlphaEvent): unknown {\n  return firstDefined(event.totalUsage, event.total_usage, event.usage)\n}\n\nfunction applyAlphaUsage(message: AnthropicMessage, usage: unknown): void {\n  if (!isRecord(usage)) return\n  const input = firstNumber(usage.inputTokens, usage.input_tokens, usage.promptTokens, usage.prompt_tokens)\n  const output = firstNumber(usage.outputTokens, usage.output_tokens, usage.completionTokens, usage.completion_tokens)\n  if (output !== null) message.usage.output_tokens = output\n\n  const details = firstRecord(\n    usage.inputTokenDetails,\n    usage.input_token_details,\n    usage.promptTokensDetails,\n    usage.prompt_tokens_details,\n  )\n  const cacheRead = firstNumber(\n    details?.cacheReadTokens,\n    details?.cacheReadInputTokens,\n    details?.cacheHitTokens,\n    details?.cache_read_tokens,\n    details?.cache_read_input_tokens,\n    details?.cache_hit_tokens,\n    details?.cachedTokens,\n    details?.cached_tokens,\n    usage.cacheReadTokens,\n    usage.cacheReadInputTokens,\n    usage.cacheHitTokens,\n    usage.cacheHitInputTokens,\n    usage.cache_read_input_tokens,\n    usage.cache_read_tokens,\n    usage.cache_hit_tokens,\n    usage.cache_hit_input_tokens,\n    usage.cachedInputTokens,\n    usage.cachedTokens,\n    usage.cached_input_tokens,\n    usage.cached_tokens,\n  )\n  const cacheWrite = firstNumber(\n    details?.cacheWriteTokens,\n    details?.cacheWriteInputTokens,\n    details?.cacheCreationTokens,\n    details?.cache_write_tokens,\n    details?.cache_write_input_tokens,\n    details?.cache_creation_tokens,\n    details?.cacheCreationInputTokens,\n    details?.cache_creation_input_tokens,\n    usage.cacheWriteTokens,\n    usage.cacheWriteInputTokens,\n    usage.cacheCreationInputTokens,\n    usage.cacheCreationTokens,\n    usage.cache_write_tokens,\n    usage.cache_write_input_tokens,\n    usage.cache_creation_input_tokens,\n    usage.cache_creation_tokens,\n  )\n\n  if (input !== null) {\n    const noCacheInput = firstNumber(\n      details?.noCacheTokens,\n      details?.no_cache_tokens,\n      details?.uncachedTokens,\n      details?.uncached_tokens,\n      usage.noCacheTokens,\n      usage.no_cache_tokens,\n      usage.uncachedInputTokens,\n      usage.uncached_input_tokens,\n    )\n    if (noCacheInput !== null) {\n      message.usage.input_tokens = Math.max(0, noCacheInput)\n    } else {\n      const cachedInput = Math.max(0, (cacheRead ?? 0) + (cacheWrite ?? 0))\n      message.usage.input_tokens = Math.max(0, input - cachedInput)\n    }\n  }\n  if (cacheRead !== null && cacheRead > 0) message.usage.cache_read_input_tokens = cacheRead\n  if (cacheWrite !== null && cacheWrite > 0) message.usage.cache_creation_input_tokens = cacheWrite\n}\n\nfunction alphaToolInput(event: CommandCodeAlphaEvent): Record<string, unknown> {\n  const input = firstDefined(event.input, event.args, event.arguments)\n  if (isRecord(input)) return input\n  if (typeof input === 'string') {\n    try {\n      const parsed = JSON.parse(input) as unknown\n      if (isRecord(parsed)) return parsed\n    } catch {\n      return { value: input }\n    }\n  }\n  return {}\n}\n\nfunction commandCodeAlphaErrorDetail(event: CommandCodeAlphaEvent): string {\n  const error = event.error\n  if (typeof error === 'string') return error\n  if (isRecord(error)) {\n    return [\n      firstString(error.message),\n      firstString(error.code),\n      firstString(error.type),\n      firstNumber(error.statusCode, error.status)?.toString(),\n    ].filter(Boolean).join(' ') || JSON.stringify(error)\n  }\n  return firstString(event.message, event.detail) ?? JSON.stringify(event)\n}\n\nfunction toolResultToText(value: unknown): string {\n  if (typeof value === 'string') return value\n  if (Array.isArray(value)) {\n    return value.map(part => {\n      if (typeof part === 'string') return part\n      if (isRecord(part)) return firstString(part.text, part.value, part.content) ?? JSON.stringify(part)\n      return String(part)\n    }).join('')\n  }\n  if (value === null || value === undefined) return ''\n  if (isRecord(value)) {\n    return firstString(value.text, value.value, value.content) ?? JSON.stringify(value)\n  }\n  return String(value)\n}\n\nfunction firstDefined(...values: unknown[]): unknown {\n  for (const value of values) {\n    if (value !== undefined && value !== null) return value\n  }\n  return undefined\n}\n\nfunction firstString(...values: unknown[]): string | null {\n  for (const value of values) {\n    if (typeof value === 'string' && value.trim()) return value.trim()\n  }\n  return null\n}\n\nfunction firstText(...values: unknown[]): string | null {\n  for (const value of values) {\n    if (typeof value === 'string' && value.length > 0) return value\n  }\n  return null\n}\n\nfunction firstNumber(...values: unknown[]): number | null {\n  for (const value of values) {\n    if (typeof value === 'number' && Number.isFinite(value)) return value\n    if (typeof value === 'string') {\n      const parsed = Number(value)\n      if (Number.isFinite(parsed)) return parsed\n    }\n  }\n  return null\n}\n\nfunction firstBoolean(...values: unknown[]): boolean | null {\n  for (const value of values) {\n    if (typeof value === 'boolean') return value\n  }\n  return null\n}\n\nfunction firstRecord(...values: unknown[]): RawCommandCodeModel | null {\n  for (const value of values) {\n    if (isRecord(value)) return value\n  }\n  return null\n}\n\nfunction isRecord(value: unknown): value is RawCommandCodeModel {\n  return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction extractErrorDetail(body: string): string {\n  try {\n    const parsed = JSON.parse(body) as {\n      error?: { message?: string; type?: string; code?: string }\n      message?: string\n      type?: string\n    }\n    return [\n      parsed.error?.message,\n      parsed.message,\n      parsed.error?.code,\n      parsed.error?.type,\n      parsed.type,\n    ].filter(Boolean).join(' ')\n  } catch {\n    return body\n  }\n}\n", "/**\n * Session-level cache for Gemini thought_signature values.\n *\n * Gemini thinking models include a `thought_signature` on functionCall parts\n * in their responses. This signature must be included when the functionCall\n * appears in subsequent request conversation history \u2014 the API rejects\n * requests where it is missing.\n *\n * The conversation state pipeline (normalizeMessagesForAPI) can strip custom\n * fields from content blocks, so we also cache signatures here keyed by\n * tool_use_id to guarantee they survive the round-trip.\n */\n\nconst _signatures = new Map<string, string>()\n\n/** Store a thought_signature for a tool_use ID. */\nexport function storeThoughtSignature(toolUseId: string, signature: string): void {\n  _signatures.set(toolUseId, signature)\n}\n\n/** Retrieve a stored thought_signature by tool_use ID. */\nexport function getThoughtSignature(toolUseId: string): string | undefined {\n  return _signatures.get(toolUseId)\n}\n", "/**\r\n * Outbound adapter: Converts Anthropic-format messages \u2192 Google Gemini generateContent format.\r\n *\r\n * Gemini uses a different structure:\r\n * - contents: array of {role: \"user\"|\"model\", parts: [{text}, {functionCall}, {functionResponse}]}\r\n * - tools: [{functionDeclarations: [...]}]\r\n * - systemInstruction: {parts: [{text}]}\r\n * - generationConfig: {maxOutputTokens, temperature}\r\n *\r\n * \u2500\u2500 Tool-call reliability layers (in order of importance) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n *\r\n * Gemini tends to invent tool calls based on training-data memory of names\r\n * like `Agent`, `WebFetch`, `TaskCreate` \u2014 emitting calls with missing\r\n * required parameters. The fix is layered defense, ported from the\r\n * antigravity / CLIProxyAPI plugin in reference/opencode-google-antigravity-auth-main:\r\n *\r\n *   1. SERVER ENFORCEMENT (the actual fix):\r\n *      `toolConfig.functionCallingConfig.mode = \"VALIDATED\"`\r\n *      Gemini's API validates each functionCall against the declared\r\n *      parameters and retries internally on failure. Calls with missing\r\n *      required fields never reach us. Set unconditionally when tools\r\n *      are present.\r\n *\r\n *   2. SCHEMA SANITIZATION: `sanitizeSchemaForGemini` strips JSON-Schema\r\n *      keys Gemini rejects ($schema, additionalProperties, etc.) and\r\n *      flattens anyOf/oneOf/allOf composition. Without this Gemini 400s\r\n *      before any tool call is made.\r\n *\r\n *   3. TOOL NAME SANITIZATION: `sanitizeGeminiToolName` prefixes\r\n *      digit-leading names with `t_` (Gemini requires `^[a-zA-Z_]`).\r\n *      The reverse map lets inbound responses recover the original.\r\n *\r\n *   4. PER-TOOL HINT: `appendStrictParamsToDescription` writes a compact\r\n *      `STRICT PARAMETERS: name: type REQUIRED, \u2026` line into each tool's\r\n *      description so the model has a one-glance schema reminder at call\r\n *      time without re-reading the full JSON.\r\n *\r\n *   5. SYSTEM-INSTRUCTION NUDGE: `GEMINI_TOOL_SCHEMA_SYSTEM_INSTRUCTION`\r\n *      a ~10-line block prepended to systemInstruction reminding the model\r\n *      to honor the schema instead of training-data memory. Kept short\r\n *      because it's on every turn \u2014 every byte costs latency on flash-lite.\r\n *\r\n *   6. SCHEMA CACHE FOR ARG REPAIR: each parameter shape is recorded by\r\n *      `recordToolSchema`. The inbound `gemini_to_anthropic` side calls\r\n *      `coerceToolCallArgs` to JSON.parse stringly-typed values when the\r\n *      schema declares array/object \u2014 covers the rare cases that escape\r\n *      VALIDATED mode (e.g. malformed-but-non-empty args).\r\n */\r\n\r\nimport type {\r\n  ProviderRequestParams,\r\n  ProviderMessage,\r\n  ProviderContentBlock,\r\n  ProviderTool,\r\n  SystemBlock,\r\n} from '../providers/base_provider.js'\r\nimport { getThoughtSignature } from './gemini_thought_cache.js'\r\nimport { recordToolSchema } from './tool_schema_cache.js'\r\n\r\n/**\r\n * Gemini requires function names to match `^[a-zA-Z_][a-zA-Z0-9_-]*$`.\r\n * Names that start with a digit (some MCP tool conventions) get a `t_`\r\n * prefix; the same prefix is applied symmetrically when names come back\r\n * in functionCall/functionResponse so the tool dispatcher still resolves.\r\n */\r\nexport function sanitizeGeminiToolName(name: string): string {\r\n  if (!name) return name\r\n  return /^[0-9]/.test(name) ? `t_${name}` : name\r\n}\r\n\r\nconst renamedToolMap = new Map<string, string>()\r\n\r\n/** Records a tool name remapping so inbound responses can reverse it. */\r\nexport function rememberGeminiToolRename(original: string, sanitized: string): void {\r\n  if (original !== sanitized) renamedToolMap.set(sanitized, original)\r\n}\r\n\r\n/** Reverses sanitizeGeminiToolName for inbound functionCall.name values. */\r\nexport function originalToolNameFromGemini(name: string): string {\r\n  return renamedToolMap.get(name) ?? name\r\n}\r\n\r\n// \u2500\u2500\u2500 Gemini types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport interface GeminiSafetySettingEntry {\r\n  category: string\r\n  threshold: string\r\n}\r\n\r\nexport interface GeminiRequest {\r\n  contents: GeminiContent[]\r\n  tools?: Array<{ functionDeclarations: GeminiFunctionDeclaration[] }>\r\n  /**\r\n   * Controls how Gemini handles function calls. We force\r\n   * `functionCallingConfig.mode = \"VALIDATED\"` whenever tools are present\r\n   * so the API enforces the declared JSON schema server-side. Without this\r\n   * the model frequently emits tool calls with missing required parameters\r\n   * and the failures only surface in our local validator.\r\n   */\r\n  toolConfig?: {\r\n    functionCallingConfig?: {\r\n      mode?: 'AUTO' | 'ANY' | 'NONE' | 'VALIDATED'\r\n      allowedFunctionNames?: string[]\r\n    }\r\n  }\r\n  systemInstruction?: { parts: Array<{ text: string }> }\r\n  generationConfig?: {\r\n    maxOutputTokens?: number\r\n    temperature?: number\r\n    topP?: number\r\n    topK?: number\r\n    stopSequences?: string[]\r\n    thinkingConfig?: {\r\n      thinkingBudget?: number\r\n      includeThoughts?: boolean\r\n    }\r\n  }\r\n  safetySettings?: GeminiSafetySettingEntry[]\r\n  /**\r\n   * Reference to a previously created `cachedContents/...` resource. When\r\n   * set, `systemInstruction` and `tools` MUST be omitted \u2014 the cache\r\n   * carries them. Used by the cache manager to reduce per-turn token cost\r\n   * on repeated system prompts.\r\n   */\r\n  cachedContent?: string\r\n}\r\n\r\n// \u2500\u2500\u2500 Safety Settings \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n// Identical to CLIProxyAPI's DefaultSafetySettings(): all harm categories\r\n// set to OFF so Gemini doesn't block legitimate code content (error\r\n// handling code, security tools, shell commands, etc.).\r\n\r\n// \u2500\u2500\u2500 Safety Settings \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n// Mirrors CLIProxyAPI's DefaultSafetySettings(). Without these, Gemini's\r\n// default filters block legitimate code content (shell commands, security\r\n// tools, error handling).  Disable with GEMINI_SAFETY=default.\r\n\r\nfunction getGeminiSafetySettings(): GeminiSafetySettingEntry[] | undefined {\r\n  if (process.env.GEMINI_SAFETY === 'default') return undefined\r\n  return [\r\n    { category: 'HARM_CATEGORY_HARASSMENT',         threshold: 'OFF' },\r\n    { category: 'HARM_CATEGORY_HATE_SPEECH',        threshold: 'OFF' },\r\n    { category: 'HARM_CATEGORY_SEXUALLY_EXPLICIT',  threshold: 'OFF' },\r\n    { category: 'HARM_CATEGORY_DANGEROUS_CONTENT',  threshold: 'OFF' },\r\n    { category: 'HARM_CATEGORY_CIVIC_INTEGRITY',    threshold: 'BLOCK_NONE' },\r\n  ]\r\n}\r\n\r\n// \u2500\u2500\u2500 Dynamic Generation Config \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n//\r\n// KEY INSIGHT from studying how Claude and Gemini CLI work:\r\n//\r\n// Claude's secret: `type: 'adaptive'` \u2014 NO fixed budget. The MODEL\r\n// decides how much to think per turn. Simple tool calls = barely any\r\n// thinking. Complex reasoning = lots of thinking. This is why Claude\r\n// is fast on iterative tool loops.\r\n//\r\n// Gemini's equivalent: `thinkingBudget: -1` (dynamic mode). The model\r\n// decides per-turn how much thinking to use. Same concept, same benefit.\r\n//\r\n// Previous approach (fixed 8K/24K budgets) forced the model to think\r\n// the same amount on \"Read file.ts\" as on \"design the architecture\".\r\n// Dynamic mode fixes this \u2014 the model spends 0 tokens thinking when\r\n// it just needs to call the next tool, and 10K+ when it needs to reason.\r\n//\r\n// All values overridable via env:\r\n//   GEMINI_TOP_P        \u2014 sampling (default: 0.95)\r\n//   GEMINI_TOP_K        \u2014 sampling (default: 64)\r\n//   GEMINI_THINKING     \u2014 thinking budget (0=off, -1=dynamic, N=fixed)\r\n//   GEMINI_TEMPERATURE  \u2014 temperature override\r\n\r\nfunction _envFloat(key: string): number | undefined {\r\n  const v = process.env[key]\r\n  if (!v) return undefined\r\n  const n = parseFloat(v)\r\n  return isNaN(n) ? undefined : n\r\n}\r\n\r\nfunction _envInt(key: string): number | undefined {\r\n  const v = process.env[key]\r\n  if (!v) return undefined\r\n  const n = parseInt(v, 10)\r\n  return isNaN(n) ? undefined : n\r\n}\r\n\r\n/**\r\n * Determine if a model supports thinking at all.\r\n * Flash-lite variants are speed-optimized and don't have thinking.\r\n */\r\nfunction modelSupportsDynamicThinking(model: string): boolean {\r\n  const m = model.toLowerCase()\r\n  if (!m.startsWith('gemini-')) return false\r\n  // Lite variants are speed-first, no thinking\r\n  if (m.includes('lite')) return false\r\n  // Gemini 2.5+ and 3.x all support thinking\r\n  if (m.includes('gemini-2.5') || m.includes('gemini-3') || m.includes('gemini-4')) return true\r\n  // Older/unknown \u2014 don't assume thinking\r\n  return false\r\n}\r\n\r\n/**\r\n * Build the full generation defaults for a model.\r\n */\r\nfunction getModelGenerationDefaults(model: string): {\r\n  topP: number\r\n  topK: number\r\n  temperature: number | undefined\r\n  supportsDynamicThinking: boolean\r\n} {\r\n  return {\r\n    topP: _envFloat('GEMINI_TOP_P') ?? 0.95,\r\n    topK: _envInt('GEMINI_TOP_K') ?? 64,\r\n    temperature: _envFloat('GEMINI_TEMPERATURE'),\r\n    supportsDynamicThinking: modelSupportsDynamicThinking(model),\r\n  }\r\n}\r\n\r\nexport interface GeminiContent {\r\n  role: 'user' | 'model'\r\n  parts: GeminiPart[]\r\n}\r\n\r\n/**\r\n * Synthetic thought signature used when no real signature is available.\r\n * The Gemini API accepts this sentinel to bypass strict signature validation.\r\n * Matches the constant used by the Gemini CLI.\r\n */\r\nconst SYNTHETIC_THOUGHT_SIGNATURE = 'skip_thought_signature_validator'\r\n\r\nexport type GeminiPart =\r\n  | { text: string; thought?: boolean }\r\n  | { functionCall: { id?: string; name: string; args: Record<string, unknown> }; thoughtSignature?: string }\r\n  | { functionResponse: { id?: string; name: string; response: { content: string } } }\r\n  | { inlineData: { mimeType: string; data: string } }\r\n\r\nexport interface GeminiFunctionDeclaration {\r\n  name: string\r\n  description?: string\r\n  parameters: Record<string, unknown>\r\n}\r\n\r\n// \u2500\u2500\u2500 Schema Sanitization \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n/**\r\n * Fields that Gemini's functionDeclarations do NOT support.\r\n * Gemini accepts a subset of OpenAPI 3.0 schema: type, format,\r\n * description, nullable, enum, items, properties, required,\r\n * minimum, maximum, minItems, maxItems, minLength, maxLength.\r\n * Everything else must be stripped recursively.\r\n */\r\nconst UNSUPPORTED_GEMINI_SCHEMA_FIELDS = new Set([\r\n  // JSON Schema identifiers & references\r\n  '$schema', '$id', '$ref', '$comment', '$defs', 'definitions',\r\n  // Composition keywords \u2014 handled by flattenComposition() before stripping\r\n  'not', 'if', 'then', 'else',\r\n  // Object validation keywords Gemini rejects\r\n  'additionalProperties', 'patternProperties', 'propertyNames',\r\n  'minProperties', 'maxProperties', 'unevaluatedProperties',\r\n  'dependentRequired', 'dependentSchemas',\r\n  // Number validation keywords beyond min/max\r\n  'exclusiveMinimum', 'exclusiveMaximum', 'multipleOf',\r\n  // String validation (pattern is regex \u2014 Gemini doesn't support it)\r\n  'pattern', 'contentMediaType', 'contentEncoding',\r\n  // Array validation beyond items/min/max\r\n  'unevaluatedItems', 'prefixItems', 'contains', 'minContains', 'maxContains',\r\n  // Metadata fields\r\n  'default', 'const', 'examples', 'deprecated', 'readOnly', 'writeOnly', 'title',\r\n])\r\n\r\n/**\r\n * Flatten JSON Schema composition keywords (anyOf, oneOf, allOf) that\r\n * Gemini cannot handle natively. Strategy:\r\n *\r\n *   - anyOf / oneOf with a null type \u2192 extract the non-null branch + nullable\r\n *   - anyOf / oneOf without null \u2192 take the first branch\r\n *   - allOf \u2192 shallow-merge all branches into one schema\r\n *\r\n * This runs BEFORE the normal sanitize pass so the flattened result can\r\n * be cleaned of unsupported fields normally.\r\n */\r\nfunction flattenComposition(schema: Record<string, unknown>): Record<string, unknown> {\r\n  const result = { ...schema }\r\n\r\n  // Handle type arrays like [\"string\", \"null\"] \u2192 type: \"string\", nullable: true\r\n  if (Array.isArray(result.type)) {\r\n    const types = result.type as string[]\r\n    const nonNull = types.filter(t => t !== 'null')\r\n    if (types.includes('null')) {\r\n      result.nullable = true\r\n    }\r\n    result.type = nonNull.length === 1 ? nonNull[0] : nonNull[0] ?? 'string'\r\n  }\r\n\r\n  // anyOf / oneOf \u2192 pick first non-null variant, set nullable if null present\r\n  for (const keyword of ['anyOf', 'oneOf'] as const) {\r\n    const variants = result[keyword] as Record<string, unknown>[] | undefined\r\n    if (!Array.isArray(variants) || variants.length === 0) continue\r\n\r\n    const nonNull = variants.filter(v => v.type !== 'null')\r\n    const hasNull = variants.some(v => v.type === 'null')\r\n    const picked = nonNull[0] ?? variants[0]!\r\n\r\n    // Merge the picked variant's fields into result\r\n    delete result[keyword]\r\n    if (hasNull) result.nullable = true\r\n    for (const [k, v] of Object.entries(picked)) {\r\n      if (v !== undefined && !(k in result && k !== keyword)) {\r\n        result[k] = v\r\n      }\r\n    }\r\n  }\r\n\r\n  // allOf \u2192 shallow-merge all branches\r\n  if (Array.isArray(result.allOf)) {\r\n    const branches = result.allOf as Record<string, unknown>[]\r\n    delete result.allOf\r\n    for (const branch of branches) {\r\n      for (const [k, v] of Object.entries(branch)) {\r\n        if (v === undefined) continue\r\n        if (k === 'properties' && result.properties) {\r\n          // Merge properties objects\r\n          result.properties = {\r\n            ...(result.properties as Record<string, unknown>),\r\n            ...(v as Record<string, unknown>),\r\n          }\r\n        } else if (k === 'required' && result.required) {\r\n          // Merge required arrays\r\n          result.required = [\r\n            ...new Set([\r\n              ...(result.required as string[]),\r\n              ...(v as string[]),\r\n            ]),\r\n          ]\r\n        } else if (!(k in result)) {\r\n          result[k] = v\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  return result\r\n}\r\n\r\n/**\r\n * Recursively strip fields that Gemini does not support from a JSON Schema object.\r\n * Also handles composition keywords (anyOf/oneOf/allOf) by flattening them,\r\n * type arrays by extracting the non-null type, and empty required arrays.\r\n * Returns a new object \u2014 does not mutate the original.\r\n */\r\nexport function sanitizeSchemaForGemini(schema: Record<string, unknown>): Record<string, unknown> {\r\n  // First pass: flatten composition keywords\r\n  const flattened = flattenComposition(schema)\r\n  const result: Record<string, unknown> = {}\r\n\r\n  for (const [key, value] of Object.entries(flattened)) {\r\n    // Strip unsupported fields and undefined values\r\n    if (UNSUPPORTED_GEMINI_SCHEMA_FIELDS.has(key)) continue\r\n    // OpenAPI 3.0 vendor extensions (x-google-enum-descriptions, x-google-quota,\r\n    // x-stripe-*, \u2026) leak in from MCP tool schemas. Gemini's validator 400s on\r\n    // unknown fields, so strip the whole x-* family.\r\n    if (key.startsWith('x-')) continue\r\n    if (value === undefined) continue\r\n\r\n    if (key === 'properties' && value && typeof value === 'object' && !Array.isArray(value)) {\r\n      // Recurse into each property definition\r\n      result[key] = Object.fromEntries(\r\n        Object.entries(value as Record<string, unknown>)\r\n          .filter(([, v]) => v !== undefined)\r\n          .map(([propName, propSchema]) => [\r\n            propName,\r\n            propSchema && typeof propSchema === 'object' && !Array.isArray(propSchema)\r\n              ? sanitizeSchemaForGemini(propSchema as Record<string, unknown>)\r\n              : propSchema,\r\n          ]),\r\n      )\r\n    } else if (key === 'items' && value && typeof value === 'object' && !Array.isArray(value)) {\r\n      // Recurse into array item schema\r\n      result[key] = sanitizeSchemaForGemini(value as Record<string, unknown>)\r\n    } else if (key === 'required' && Array.isArray(value)) {\r\n      // Gemini rejects empty required arrays \u2014 only include if non-empty.\r\n      if (value.length > 0) {\r\n        result[key] = value\r\n      }\r\n    } else if (Array.isArray(value)) {\r\n      // Recurse into arrays of schemas (e.g. items as tuple)\r\n      result[key] = value.map(item =>\r\n        item && typeof item === 'object' && !Array.isArray(item)\r\n          ? sanitizeSchemaForGemini(item as Record<string, unknown>)\r\n          : item,\r\n      )\r\n    } else if (value && typeof value === 'object' && !Array.isArray(value)) {\r\n      // Recurse into any nested schema object\r\n      result[key] = sanitizeSchemaForGemini(value as Record<string, unknown>)\r\n    } else {\r\n      result[key] = value\r\n    }\r\n  }\r\n\r\n  return result\r\n}\r\n\r\n// \u2500\u2500\u2500 Tool schema augmentation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n/**\r\n * Compact reminder prepended to systemInstruction whenever tools are present.\r\n * Backstops the server-side `mode: \"VALIDATED\"` enforcement: the API will\r\n * already reject calls with missing required params, but this nudges the\r\n * model to emit valid calls in the first place instead of triggering retries.\r\n *\r\n * Kept short (\u224810 lines) because every byte here is on every Gemini turn.\r\n * The previous 50-line version measurably hurt latency on flash-lite.\r\n */\r\nconst GEMINI_TOOL_SCHEMA_SYSTEM_INSTRUCTION = `<TOOL_USAGE_RULES>\r\nTool schemas in this environment OVERRIDE your training-data memory of tool names.\r\nTreat each tool's \"parameters\" field as authoritative:\r\n- Use parameter NAMES exactly as listed in \"properties\" (case-sensitive).\r\n- Supply EVERY parameter listed in \"required\" \u2014 never omit one, never send empty objects.\r\n- Match parameter TYPES exactly (array means array, object means object, string means string).\r\n- Do not invent extra parameters that are not in \"properties\".\r\nThe \"STRICT PARAMETERS:\" hint at the end of each tool description is your quick reference.\r\n</TOOL_USAGE_RULES>\r\n`\r\n\r\nfunction normalizeSchemaTypeForSummary(value: unknown): string | undefined {\r\n  if (typeof value === 'string') return value\r\n  if (Array.isArray(value)) {\r\n    const nonNull = value.filter(t => t !== 'null')\r\n    const first = nonNull[0] ?? value[0]\r\n    if (typeof first === 'string') return first\r\n  }\r\n  return undefined\r\n}\r\n\r\nfunction summarizeSchemaNode(schema: unknown, depth: number): string {\r\n  if (!schema || typeof schema !== 'object') return 'unknown'\r\n\r\n  const record = schema as Record<string, unknown>\r\n  const typeStr = normalizeSchemaTypeForSummary(record.type)\r\n  const enumValues = Array.isArray(record.enum) ? (record.enum as unknown[]) : undefined\r\n\r\n  if (typeStr === 'array') {\r\n    const itemSummary = depth > 0 ? summarizeSchemaNode(record.items, depth - 1) : 'unknown'\r\n    return `array[${itemSummary}]`\r\n  }\r\n\r\n  if (typeStr === 'object') {\r\n    const props = record.properties as Record<string, unknown> | undefined\r\n    const required = Array.isArray(record.required)\r\n      ? (record.required as unknown[]).filter((v): v is string => typeof v === 'string')\r\n      : []\r\n\r\n    if (!props || depth <= 0) return 'object'\r\n\r\n    const keys = Object.keys(props)\r\n    const requiredKeys = keys.filter(k => required.includes(k))\r\n    const optionalKeys = keys.filter(k => !required.includes(k))\r\n    const ordered = [...requiredKeys.sort(), ...optionalKeys.sort()]\r\n    const max = 8\r\n    const shown = ordered.slice(0, max)\r\n\r\n    const inner = shown\r\n      .map(k => {\r\n        const sub = summarizeSchemaNode(props[k], depth - 1)\r\n        return `${k}: ${sub}${required.includes(k) ? ' REQUIRED' : ''}`\r\n      })\r\n      .join(', ')\r\n\r\n    const extra = ordered.length - shown.length\r\n    const more = extra > 0 ? `, \u2026+${extra}` : ''\r\n    return `{${inner}${more}}`\r\n  }\r\n\r\n  if (enumValues && enumValues.length > 0) {\r\n    const preview = enumValues.slice(0, 6).map(String).join('|')\r\n    const suffix = enumValues.length > 6 ? '|\u2026' : ''\r\n    return `${typeStr ?? 'unknown'} enum(${preview}${suffix})`\r\n  }\r\n\r\n  return typeStr ?? 'unknown'\r\n}\r\n\r\n/**\r\n * Builds the \"STRICT PARAMETERS: ...\" line that gets appended to each tool's\r\n * description so the model has a compact, in-context reminder of names, types\r\n * and required flags.\r\n */\r\nexport function buildStrictParamsSummary(parameters: Record<string, unknown>): string {\r\n  const typeStr = normalizeSchemaTypeForSummary(parameters.type)\r\n  const properties = parameters.properties as Record<string, unknown> | undefined\r\n  const required = Array.isArray(parameters.required)\r\n    ? (parameters.required as unknown[]).filter((v): v is string => typeof v === 'string')\r\n    : []\r\n\r\n  if (typeStr !== 'object' || !properties) {\r\n    return '(schema missing top-level object properties)'\r\n  }\r\n\r\n  const keys = Object.keys(properties)\r\n  const requiredKeys = keys.filter(k => required.includes(k))\r\n  const optionalKeys = keys.filter(k => !required.includes(k))\r\n  const ordered = [...requiredKeys.sort(), ...optionalKeys.sort()]\r\n\r\n  const summary = ordered\r\n    .map(k => {\r\n      const sub = summarizeSchemaNode(properties[k], 2)\r\n      return `${k}: ${sub}${required.includes(k) ? ' REQUIRED' : ''}`\r\n    })\r\n    .join(', ')\r\n\r\n  const max = 900\r\n  return summary.length > max ? `${summary.slice(0, max)}\u2026` : summary\r\n}\r\n\r\nfunction appendStrictParamsToDescription(description: string | undefined, parameters: Record<string, unknown>): string {\r\n  const summary = buildStrictParamsSummary(parameters)\r\n  const base = (description ?? '').trim()\r\n  if (base.includes('STRICT PARAMETERS:')) return description ?? ''\r\n  return base.length > 0\r\n    ? `${base}\\n\\nSTRICT PARAMETERS: ${summary}`\r\n    : `STRICT PARAMETERS: ${summary}`\r\n}\r\n\r\n// \u2500\u2500\u2500 Conversion \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport function anthropicToGeminiRequest(params: ProviderRequestParams): GeminiRequest {\r\n  // Resolve the actual Gemini model name (params.model may already be resolved\r\n  // by the provider, or may still be a Claude alias \u2014 handle both).\r\n  const model = params.model\r\n\r\n  // Per-request map: track tool_use_id \u2192 tool_name because Gemini's\r\n  // functionResponse uses the function name, not an ID.\r\n  const toolIdToName = new Map<string, string>()\r\n  const request: GeminiRequest = {\r\n    contents: convertMessages(params.messages, toolIdToName),\r\n  }\r\n\r\n  // System prompt \u2192 systemInstruction (strip Anthropic-specific cache_control)\r\n  if (params.system) {\r\n    const systemText = typeof params.system === 'string'\r\n      ? params.system\r\n      : (params.system as SystemBlock[]).map(s => {\r\n          const { cache_control, ...rest } = s as SystemBlock & { cache_control?: unknown }\r\n          return rest.text\r\n        }).join('\\n\\n')\r\n    if (systemText) {\r\n      request.systemInstruction = { parts: [{ text: systemText }] }\r\n    }\r\n  }\r\n\r\n  // Tools \u2192 functionDeclarations (sanitize schemas for Gemini compatibility)\r\n  if (params.tools && params.tools.length > 0) {\r\n    request.tools = [{\r\n      functionDeclarations: params.tools.map(t => {\r\n        const sanitizedName = sanitizeGeminiToolName(t.name)\r\n        rememberGeminiToolRename(t.name, sanitizedName)\r\n        const parameters = sanitizeSchemaForGemini(t.input_schema)\r\n        // Cache under both names so the inbound side can look up by either.\r\n        recordToolSchema(t.name, parameters)\r\n        if (sanitizedName !== t.name) recordToolSchema(sanitizedName, parameters)\r\n        return {\r\n          name: sanitizedName,\r\n          description: appendStrictParamsToDescription(t.description, parameters),\r\n          parameters,\r\n        }\r\n      }),\r\n    }]\r\n\r\n    // Server-side schema enforcement. With mode=\"VALIDATED\" Gemini's API\r\n    // validates each functionCall against the declared parameters BEFORE\r\n    // returning. Calls with missing required params are retried internally\r\n    // instead of being surfaced to us as InputValidationError. This is the\r\n    // primary fix for the \"required parameter X is missing\" failure mode.\r\n    request.toolConfig = {\r\n      functionCallingConfig: { mode: 'VALIDATED' },\r\n    }\r\n\r\n    // Backstop nudge so the model emits valid calls on the first try and\r\n    // saves Gemini from forcing a server-side retry.\r\n    const existingText = request.systemInstruction?.parts?.[0]?.text ?? ''\r\n    if (!existingText.includes('<TOOL_USAGE_RULES>')) {\r\n      const merged = existingText\r\n        ? `${GEMINI_TOOL_SCHEMA_SYSTEM_INSTRUCTION}\\n${existingText}`\r\n        : GEMINI_TOOL_SCHEMA_SYSTEM_INSTRUCTION\r\n      request.systemInstruction = { parts: [{ text: merged }] }\r\n    }\r\n  }\r\n\r\n  // Safety settings \u2014 derived from env or default to all-OFF.\r\n  const safety = getGeminiSafetySettings()\r\n  if (safety) request.safetySettings = safety\r\n\r\n  // Generation config \u2014 dynamically derived from model capabilities\r\n  // and overridable via env vars.\r\n  const defaults = getModelGenerationDefaults(model)\r\n  request.generationConfig = {\r\n    maxOutputTokens: params.max_tokens,\r\n    temperature: defaults.temperature ?? params.temperature ?? 1,\r\n    topP: defaults.topP,\r\n    topK: defaults.topK,\r\n    ...(params.stop_sequences && { stopSequences: params.stop_sequences }),\r\n  }\r\n\r\n  // \u2500\u2500\u2500 Thinking Config \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  //\r\n  // This is the most critical setting for both QUALITY and SPEED.\r\n  //\r\n  // How Claude does it: `type: 'adaptive'` \u2014 no budget. The model\r\n  // decides per-turn. Quick tool calls \u2192 0 thinking tokens. Complex\r\n  // reasoning \u2192 thousands. This is why Claude iterates tools fast.\r\n  //\r\n  // Gemini equivalent: `thinkingBudget: -1` (dynamic mode). Same\r\n  // concept \u2014 the model allocates thinking tokens based on task\r\n  // complexity. A \"Read file\" call uses ~0 thinking, a \"design this\r\n  // architecture\" call uses 10K+.\r\n  //\r\n  // Priority:\r\n  //   1. GEMINI_THINKING env var \u2192 explicit override (0=off, -1=dynamic, N=fixed)\r\n  //   2. Anthropic 'disabled' \u2192 no thinking\r\n  //   3. Model supports dynamic thinking \u2192 use -1 (dynamic)\r\n  //   4. Model doesn't support thinking \u2192 skip thinkingConfig\r\n  const envThinking = _envInt('GEMINI_THINKING')\r\n\r\n  if (envThinking !== undefined) {\r\n    // Explicit env override \u2014 user knows what they want.\r\n    if (envThinking !== 0) {\r\n      request.generationConfig.thinkingConfig = {\r\n        thinkingBudget: envThinking,\r\n        includeThoughts: true,\r\n      }\r\n    }\r\n  } else if (params.thinking?.type === 'disabled') {\r\n    // Explicitly off \u2014 respect it.\r\n  } else if (defaults.supportsDynamicThinking) {\r\n    // Model supports thinking \u2192 use DYNAMIC mode (-1).\r\n    // This mirrors Claude's adaptive thinking: the model decides\r\n    // how much to think per turn. Fast for tool calls, deep for\r\n    // complex reasoning. Best of both worlds.\r\n    request.generationConfig.thinkingConfig = {\r\n      thinkingBudget: -1,\r\n      includeThoughts: true,\r\n    }\r\n  }\r\n\r\n  return request\r\n}\r\n\r\nfunction convertMessages(\r\n  messages: ProviderMessage[],\r\n  toolIdToName: Map<string, string>,\r\n): GeminiContent[] {\r\n  const result: GeminiContent[] = []\r\n\r\n  for (const msg of messages) {\r\n    const geminiRole = msg.role === 'assistant' ? 'model' : 'user'\r\n\r\n    if (typeof msg.content === 'string') {\r\n      // Merge consecutive same-role messages (Gemini requires alternating roles)\r\n      const last = result[result.length - 1]\r\n      if (last && last.role === geminiRole) {\r\n        last.parts.push({ text: msg.content })\r\n      } else {\r\n        result.push({ role: geminiRole, parts: [{ text: msg.content }] })\r\n      }\r\n      continue\r\n    }\r\n\r\n    const blocks = msg.content as ProviderContentBlock[]\r\n    const parts: GeminiPart[] = []\r\n\r\n    for (const block of blocks) {\r\n      switch (block.type) {\r\n        case 'text':\r\n          if (block.text) parts.push({ text: block.text })\r\n          break\r\n\r\n        case 'tool_use': {\r\n          // Track id \u2192 name for later functionResponse\r\n          if (block.id && block.name) {\r\n            toolIdToName.set(block.id, block.name)\r\n          }\r\n          // Always include thoughtSignature (camelCase) \u2014 Gemini 2.5+\r\n          // thinking models require it on every functionCall in history.\r\n          // Priority: real sig from content block \u2192 session cache \u2192 synthetic.\r\n          const sig = block._gemini_thought_signature\r\n            ?? getThoughtSignature(block.id ?? '')\r\n            ?? SYNTHETIC_THOUGHT_SIGNATURE\r\n          // Carry the Anthropic tool_use.id on functionCall.id. Pure Gemini\r\n          // ignores unknown fields, but Antigravity's proxy uses this to\r\n          // populate `tool_use.id` when it converts the request to Claude\r\n          // format \u2014 without it, Claude rejects with \"tool_use.id: Field\r\n          // required\". Matches 9router's openai-to-gemini converter.\r\n          const fcPart: Record<string, unknown> = {\r\n            functionCall: {\r\n              ...(block.id ? { id: block.id } : {}),\r\n              name: block.name ?? '',\r\n              args: (block.input as Record<string, unknown>) ?? {},\r\n            },\r\n            thoughtSignature: sig,\r\n          }\r\n          parts.push(fcPart as GeminiPart)\r\n          break\r\n        }\r\n\r\n        case 'thinking':\r\n          // Gemini thinking text \u2192 { text, thought: true }\r\n          if (block.thinking) {\r\n            parts.push({ text: block.thinking, thought: true })\r\n          }\r\n          break\r\n\r\n        case 'redacted_thinking':\r\n          // Anthropic redacted thinking \u2014 not applicable to Gemini, skip\r\n          break\r\n\r\n        case 'tool_result': {\r\n          // Look up the function name from the tool_use_id\r\n          const funcName = block.tool_use_id\r\n            ? toolIdToName.get(block.tool_use_id) ?? block.tool_use_id\r\n            : 'unknown'\r\n          const content = typeof block.content === 'string'\r\n            ? block.content\r\n            : Array.isArray(block.content)\r\n              ? block.content.map(c => c.text ?? '').join('')\r\n              : ''\r\n          // Carry tool_use_id on functionResponse.id \u2014 same reason as the\r\n          // functionCall.id above: Antigravity's proxy uses it to emit\r\n          // `tool_result.tool_use_id` that references the matching tool_use\r\n          // in the assistant's prior turn.\r\n          parts.push({\r\n            functionResponse: {\r\n              ...(block.tool_use_id ? { id: block.tool_use_id } : {}),\r\n              name: funcName,\r\n              response: { content },\r\n            },\r\n          } as GeminiPart)\r\n          if (Array.isArray(block.content)) {\r\n            for (const item of block.content) {\r\n              if (item.type === 'image' && item.source) {\r\n                parts.push({\r\n                  inlineData: {\r\n                    mimeType: item.source.media_type,\r\n                    data: item.source.data,\r\n                  },\r\n                })\r\n              }\r\n            }\r\n          }\r\n          break\r\n        }\r\n\r\n        case 'image':\r\n          if (block.source) {\r\n            parts.push({\r\n              inlineData: {\r\n                mimeType: block.source.media_type,\r\n                data: block.source.data,\r\n              },\r\n            })\r\n          }\r\n          break\r\n      }\r\n    }\r\n\r\n    if (parts.length === 0) continue\r\n\r\n    // Merge consecutive same-role (Gemini constraint)\r\n    const last = result[result.length - 1]\r\n    if (last && last.role === geminiRole) {\r\n      last.parts.push(...parts)\r\n    } else {\r\n      result.push({ role: geminiRole, parts })\r\n    }\r\n  }\r\n\r\n  return result\r\n}\r\n", "/**\r\n * Inbound adapter: Converts Google Gemini streaming responses \u2192 Anthropic format.\r\n *\r\n * Gemini streams newline-delimited JSON via SSE when using ?alt=sse.\r\n * Each chunk contains candidates[].content.parts[] with text or functionCall.\r\n *\r\n * Emits the standard Anthropic event sequence:\r\n *   message_start \u2192 content_block_start \u2192 content_block_delta* \u2192 content_block_stop \u2192 message_delta \u2192 message_stop\r\n */\r\n\r\nimport type {\r\n  AnthropicMessage,\r\n  AnthropicStreamEvent,\r\n  AnthropicContentBlock,\r\n} from '../providers/base_provider.js'\r\nimport { storeThoughtSignature } from './gemini_thought_cache.js'\r\nimport { originalToolNameFromGemini } from './anthropic_to_gemini.js'\r\nimport { coerceToolCallArgs } from './tool_schema_cache.js'\r\n\r\nfunction uncachedInputTokens(promptTokens: number, cacheReadTokens: number): number {\r\n  return Math.max(0, promptTokens - cacheReadTokens)\r\n}\r\n\r\nfunction isLikelyToolCallNoiseText(text: string): boolean {\r\n  const trimmed = text.trim()\r\n  if (trimmed.length === 0 || trimmed.length > 16) return false\r\n  return /^[-_{}\\[\\](),.:;\"'`0-9\\s]+$/.test(trimmed)\r\n}\r\n\r\n// \u2500\u2500\u2500 Gemini response types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport interface GeminiStreamChunk {\r\n  candidates?: Array<{\r\n    content?: {\r\n      role?: string\r\n      parts?: Array<{\r\n        text?: string\r\n        thought?: boolean\r\n        functionCall?: { name: string; args: Record<string, unknown> }\r\n        thoughtSignature?: string\r\n      }>\r\n    }\r\n    finishReason?: string\r\n    safetyRatings?: Array<{ category: string; probability: string }>\r\n  }>\r\n  usageMetadata?: {\r\n    promptTokenCount?: number\r\n    candidatesTokenCount?: number\r\n    totalTokenCount?: number\r\n    /**\r\n     * Subset of `promptTokenCount` that was served from a cached content\r\n     * reference. Present when the request included `cachedContent: \"...\"`\r\n     * and Gemini 2.5+ cache was hit. We fold this into Anthropic's\r\n     * `cache_read_input_tokens` for accounting parity.\r\n     */\r\n    cachedContentTokenCount?: number\r\n  }\r\n  modelVersion?: string\r\n}\r\n\r\nexport interface GeminiGenerateContentResponse {\r\n  candidates?: Array<{\r\n    content?: {\r\n      role?: string\r\n      parts?: Array<{\r\n        text?: string\r\n        thought?: boolean\r\n        functionCall?: { name: string; args: Record<string, unknown> }\r\n        thoughtSignature?: string\r\n      }>\r\n    }\r\n    finishReason?: string\r\n  }>\r\n  usageMetadata?: {\r\n    promptTokenCount?: number\r\n    candidatesTokenCount?: number\r\n    totalTokenCount?: number\r\n    cachedContentTokenCount?: number\r\n  }\r\n}\r\n\r\n// \u2500\u2500\u2500 Non-Streaming Conversion \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport function geminiMessageToAnthropic(\r\n  response: GeminiGenerateContentResponse,\r\n  model: string,\r\n): AnthropicMessage {\r\n  const content: AnthropicContentBlock[] = []\r\n  const candidate = response.candidates?.[0]\r\n\r\n  if (candidate?.content?.parts) {\r\n    const hasFunctionCall = candidate.content.parts.some(part => part.functionCall)\r\n    for (const part of candidate.content.parts) {\r\n      if (part.text) {\r\n        if (part.thought) {\r\n          content.push({ type: 'thinking', thinking: part.text })\r\n        } else if (!(hasFunctionCall && isLikelyToolCallNoiseText(part.text))) {\r\n          content.push({ type: 'text', text: part.text })\r\n        }\r\n      }\r\n      if (part.functionCall) {\r\n        const toolId = `toolu_${Math.random().toString(36).slice(2, 14)}`\r\n        const block: AnthropicContentBlock = {\r\n          type: 'tool_use',\r\n          id: toolId,\r\n          name: part.functionCall.name,\r\n          input: part.functionCall.args ?? {},\r\n        }\r\n        if (part.thoughtSignature) {\r\n          block._gemini_thought_signature = part.thoughtSignature\r\n          storeThoughtSignature(toolId, part.thoughtSignature)\r\n        }\r\n        content.push(block)\r\n      }\r\n    }\r\n  }\r\n\r\n  const finishReason = candidate?.finishReason\r\n  const stopReason = finishReason === 'MAX_TOKENS' ? 'max_tokens'\r\n    : content.some(c => c.type === 'tool_use') ? 'tool_use'\r\n    : 'end_turn'\r\n\r\n  const promptTokens = response.usageMetadata?.promptTokenCount ?? 0\r\n  const cachedTokens = response.usageMetadata?.cachedContentTokenCount ?? 0\r\n  return {\r\n    id: `msg_gemini_${Date.now()}`,\r\n    type: 'message',\r\n    role: 'assistant',\r\n    content,\r\n    model,\r\n    stop_reason: stopReason as AnthropicMessage['stop_reason'],\r\n    stop_sequence: null,\r\n    usage: {\r\n      input_tokens: uncachedInputTokens(promptTokens, cachedTokens),\r\n      output_tokens: response.usageMetadata?.candidatesTokenCount ?? 0,\r\n      // Gemini's `cachedContentTokenCount` is the subset of prompt tokens\r\n      // served from a `cachedContents/...` reference \u2014 maps cleanly onto\r\n      // Anthropic's cache_read accounting. cache_creation is always 0\r\n      // from our side because cache creation happens in a separate\r\n      // request, not as a side effect of generateContent.\r\n      ...(cachedTokens > 0\r\n        ? {\r\n            cache_read_input_tokens: cachedTokens,\r\n            cache_creation_input_tokens: 0,\r\n          }\r\n        : {}),\r\n    },\r\n  }\r\n}\r\n\r\n// \u2500\u2500\u2500 Streaming Conversion \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport async function* geminiStreamToAnthropicEvents(\r\n  geminiStream: AsyncIterable<GeminiStreamChunk>,\r\n  model: string,\r\n): AsyncGenerator<AnthropicStreamEvent> {\r\n  let messageStarted = false\r\n  let blockIndex = 0\r\n  let promptTokens = 0\r\n  let inputTokens = 0\r\n  let outputTokens = 0\r\n  let cacheReadTokens = 0\r\n\r\n  // Track open blocks for proper closing\r\n  let textBlockOpen = false\r\n  let thinkingBlockOpen = false\r\n  let hasToolUse = false\r\n  const openToolBlocks: Set<number> = new Set()\r\n\r\n  for await (const chunk of geminiStream) {\r\n    // Update usage\r\n    if (chunk.usageMetadata) {\r\n      promptTokens = chunk.usageMetadata.promptTokenCount ?? promptTokens\r\n      outputTokens = chunk.usageMetadata.candidatesTokenCount ?? outputTokens\r\n      if (chunk.usageMetadata.cachedContentTokenCount !== undefined) {\r\n        cacheReadTokens = chunk.usageMetadata.cachedContentTokenCount\r\n      }\r\n      inputTokens = uncachedInputTokens(promptTokens, cacheReadTokens)\r\n    }\r\n\r\n    const candidate = chunk.candidates?.[0]\r\n    if (!candidate?.content?.parts) {\r\n      // Check for finish without content\r\n      if (candidate?.finishReason) {\r\n        // Will be handled below\r\n      } else {\r\n        continue\r\n      }\r\n    }\r\n\r\n    // Emit message_start on first meaningful chunk\r\n    if (!messageStarted) {\r\n      messageStarted = true\r\n      yield {\r\n        type: 'message_start',\r\n        message: {\r\n          id: `msg_gemini_${Date.now()}`,\r\n          type: 'message',\r\n          role: 'assistant',\r\n          content: [],\r\n          model,\r\n          stop_reason: null,\r\n          stop_sequence: null,\r\n          usage: {\r\n            input_tokens: inputTokens,\r\n            output_tokens: 0,\r\n            ...(cacheReadTokens > 0\r\n              ? {\r\n                  cache_read_input_tokens: cacheReadTokens,\r\n                  cache_creation_input_tokens: 0,\r\n                }\r\n              : {}),\r\n          },\r\n        },\r\n      }\r\n    }\r\n\r\n    // Process parts\r\n    if (candidate?.content?.parts) {\r\n      const chunkHasFunctionCall = candidate.content.parts.some(part => part.functionCall)\r\n      for (const part of candidate.content.parts) {\r\n        if (part.text !== undefined) {\r\n          if (part.thought) {\r\n            // Thinking text \u2014 close regular text block if open\r\n            if (textBlockOpen) {\r\n              yield { type: 'content_block_stop', index: blockIndex }\r\n              blockIndex++\r\n              textBlockOpen = false\r\n            }\r\n            if (!thinkingBlockOpen) {\r\n              thinkingBlockOpen = true\r\n              yield {\r\n                type: 'content_block_start',\r\n                index: blockIndex,\r\n                content_block: { type: 'thinking', thinking: '' },\r\n              }\r\n            }\r\n            yield {\r\n              type: 'content_block_delta',\r\n              index: blockIndex,\r\n              delta: { type: 'thinking_delta', thinking: part.text },\r\n            }\r\n          } else if (\r\n            !(chunkHasFunctionCall && isLikelyToolCallNoiseText(part.text))\r\n          ) {\r\n            // Regular text \u2014 close thinking block if open\r\n            if (thinkingBlockOpen) {\r\n              yield { type: 'content_block_stop', index: blockIndex }\r\n              blockIndex++\r\n              thinkingBlockOpen = false\r\n            }\r\n            if (!textBlockOpen) {\r\n              textBlockOpen = true\r\n              yield {\r\n                type: 'content_block_start',\r\n                index: blockIndex,\r\n                content_block: { type: 'text', text: '' },\r\n              }\r\n            }\r\n            yield {\r\n              type: 'content_block_delta',\r\n              index: blockIndex,\r\n              delta: { type: 'text_delta', text: part.text },\r\n            }\r\n          }\r\n        }\r\n\r\n        if (part.functionCall) {\r\n          // Close thinking block first if open\r\n          if (thinkingBlockOpen) {\r\n            yield { type: 'content_block_stop', index: blockIndex }\r\n            blockIndex++\r\n            thinkingBlockOpen = false\r\n          }\r\n          // Close text block if open\r\n          if (textBlockOpen) {\r\n            yield { type: 'content_block_stop', index: blockIndex }\r\n            blockIndex++\r\n            textBlockOpen = false\r\n          }\r\n\r\n          hasToolUse = true\r\n          const toolId = `toolu_${Math.random().toString(36).slice(2, 14)}`\r\n          const currentIndex = blockIndex++\r\n          const toolName = originalToolNameFromGemini(part.functionCall.name)\r\n\r\n          // Preserve thought_signature for thinking-model round-trip\r\n          const contentBlock: AnthropicContentBlock = {\r\n            type: 'tool_use',\r\n            id: toolId,\r\n            name: toolName,\r\n            input: {},\r\n          }\r\n          if (part.thoughtSignature) {\r\n            contentBlock._gemini_thought_signature = part.thoughtSignature\r\n            storeThoughtSignature(toolId, part.thoughtSignature)\r\n          }\r\n\r\n          yield {\r\n            type: 'content_block_start',\r\n            index: currentIndex,\r\n            content_block: contentBlock,\r\n          }\r\n\r\n          // Emit the full args as a single JSON delta, repairing\r\n          // stringly-typed array/object values via the schema cache.\r\n          const rawArgs = part.functionCall.args ?? {}\r\n          const repairedArgs = coerceToolCallArgs(toolName, rawArgs) ?? rawArgs\r\n          const argsJson = JSON.stringify(repairedArgs)\r\n          yield {\r\n            type: 'content_block_delta',\r\n            index: currentIndex,\r\n            delta: {\r\n              type: 'input_json_delta',\r\n              partial_json: argsJson,\r\n            },\r\n          }\r\n\r\n          yield { type: 'content_block_stop', index: currentIndex }\r\n        }\r\n      }\r\n    }\r\n\r\n    // Handle finish reason\r\n    if (candidate?.finishReason) {\r\n      // Close any open thinking block\r\n      if (thinkingBlockOpen) {\r\n        yield { type: 'content_block_stop', index: blockIndex }\r\n        thinkingBlockOpen = false\r\n      }\r\n      // Close any open text block\r\n      if (textBlockOpen) {\r\n        yield { type: 'content_block_stop', index: blockIndex }\r\n        textBlockOpen = false\r\n      }\r\n\r\n      const finishReason = candidate.finishReason\r\n      const stopReason = finishReason === 'MAX_TOKENS' ? 'max_tokens'\r\n        : hasToolUse ? 'tool_use'\r\n        : 'end_turn'\r\n\r\n      yield {\r\n        type: 'message_delta',\r\n        delta: { stop_reason: stopReason, stop_sequence: null },\r\n        usage: {\r\n          output_tokens: outputTokens,\r\n          input_tokens: inputTokens,\r\n          ...(cacheReadTokens > 0\r\n            ? {\r\n                cache_read_input_tokens: cacheReadTokens,\r\n                cache_creation_input_tokens: 0,\r\n              }\r\n            : {}),\r\n        },\r\n      }\r\n\r\n      yield { type: 'message_stop' }\r\n      return\r\n    }\r\n  }\r\n\r\n  // Safety: close gracefully if stream ended without finishReason\r\n  if (messageStarted) {\r\n    if (thinkingBlockOpen) {\r\n      yield { type: 'content_block_stop', index: blockIndex }\r\n    }\r\n    if (textBlockOpen) {\r\n      yield { type: 'content_block_stop', index: blockIndex }\r\n    }\r\n    yield {\r\n      type: 'message_delta',\r\n      delta: { stop_reason: hasToolUse ? 'tool_use' : 'end_turn', stop_sequence: null },\r\n      usage: {\r\n        output_tokens: outputTokens,\r\n        input_tokens: inputTokens,\r\n        ...(cacheReadTokens > 0\r\n          ? {\r\n              cache_read_input_tokens: cacheReadTokens,\r\n              cache_creation_input_tokens: 0,\r\n            }\r\n          : {}),\r\n      },\r\n    }\r\n    yield { type: 'message_stop' }\r\n  }\r\n}\r\n\r\n// \u2500\u2500\u2500 SSE Parser for Gemini streams \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n/**\r\n * Parse a Gemini SSE stream (ReadableStream<Uint8Array>) into\r\n * an async iterable of GeminiStreamChunk objects.\r\n *\r\n * SSE events are delimited by double newlines. Each event is a\r\n * \"data: {json}\" line. JSON payloads can be split across TCP chunks\r\n * so we keep a buffer and only commit lines that end with a blank line.\r\n */\r\nexport async function* parseGeminiSSE(\r\n  body: ReadableStream<Uint8Array>,\r\n): AsyncGenerator<GeminiStreamChunk> {\r\n  const reader = body.getReader()\r\n  const decoder = new TextDecoder()\r\n  let buffer = ''\r\n  let dataLines: string[] = []\r\n\r\n  const flushEvent = (): { done: boolean; chunks: GeminiStreamChunk[] } => {\r\n    if (dataLines.length === 0) return { done: false, chunks: [] }\r\n\r\n    const payload = dataLines.join('\\n').trim()\r\n    dataLines = []\r\n\r\n    if (!payload) return { done: false, chunks: [] }\r\n    if (payload === '[DONE]') return { done: true, chunks: [] }\r\n\r\n    try {\r\n      return { done: false, chunks: [JSON.parse(payload) as GeminiStreamChunk] }\r\n    } catch {\r\n      return { done: false, chunks: [] }\r\n    }\r\n  }\r\n\r\n  const processLine = (rawLine: string): { done: boolean; chunks: GeminiStreamChunk[] } => {\r\n    const line = rawLine.endsWith('\\r') ? rawLine.slice(0, -1) : rawLine\r\n\r\n    if (line.trim() === '') {\r\n      return flushEvent()\r\n    }\r\n\r\n    if (!line.startsWith('data:')) {\r\n      return { done: false, chunks: [] }\r\n    }\r\n\r\n    const value = line.slice(5)\r\n    dataLines.push(value.startsWith(' ') ? value.slice(1) : value)\r\n    return { done: false, chunks: [] }\r\n  }\r\n\r\n  try {\r\n    while (true) {\r\n      const { done, value } = await reader.read()\r\n      if (done) break\r\n\r\n      buffer += decoder.decode(value, { stream: true })\r\n\r\n      const lines = buffer.split('\\n')\r\n      buffer = lines.pop() ?? ''\r\n\r\n      for (const rawLine of lines) {\r\n        const event = processLine(rawLine)\r\n        if (event.done) return\r\n        for (const chunk of event.chunks) {\r\n          yield chunk\r\n        }\r\n      }\r\n    }\r\n\r\n    buffer += decoder.decode()\r\n    if (buffer) {\r\n      for (const rawLine of buffer.split('\\n')) {\r\n        const event = processLine(rawLine)\r\n        if (event.done) return\r\n        for (const chunk of event.chunks) {\r\n          yield chunk\r\n        }\r\n      }\r\n    }\r\n\r\n    const event = flushEvent()\r\n    if (event.done) return\r\n    for (const chunk of event.chunks) {\r\n      yield chunk\r\n    }\r\n  } finally {\r\n    reader.releaseLock()\r\n  }\r\n}\r\n", "export const ANTIGRAVITY_API_VERSION = '2.0.0'\nexport const ANTIGRAVITY_ENDPOINT_DAILY = 'https://daily-cloudcode-pa.sandbox.googleapis.com'\nexport const ANTIGRAVITY_ENDPOINT_AUTOPUSH = 'https://autopush-cloudcode-pa.sandbox.googleapis.com'\nexport const ANTIGRAVITY_ENDPOINT_PROD = 'https://cloudcode-pa.googleapis.com'\n", "/**\r\n * Google Gemini Code Assist client \u2014 used for OAuth-authenticated Gemini access.\r\n *\r\n * Background: the Antigravity OAuth client (used by google_oauth.ts) has\r\n * scopes for `cloud-platform`, `userinfo.email`, `userinfo.profile`, `cclog`\r\n * and `experimentsandconfigs`. The public AI Studio endpoint\r\n * (`generativelanguage.googleapis.com`) rejects tokens without the\r\n * `generative-language` scope (\"403 restricted_client\"), so OAuth calls must\r\n * go through the Code Assist endpoint instead.\r\n *\r\n * Code Assist endpoints:\r\n *   https://cloudcode-pa.googleapis.com/v1internal:{method}\r\n *   https://daily-cloudcode-pa.sandbox.googleapis.com/v1internal:{method} for\n *   Antigravity generateContent / streamGenerateContent\r\n *\r\n * Request body is wrapped (Antigravity format from CLIProxyAPI):\r\n *   { model, userAgent, requestType, project, requestId, request: { sessionId, contents, ...config } }\r\n *\r\n * Response body is wrapped:\r\n *   { response: { candidates, usageMetadata, ... } }\r\n *\r\n * Before making calls, the user must be \"onboarded\" \u2014 this happens once via\r\n * loadCodeAssist \u2192 onboardUser, and the returned project ID is cached on disk.\r\n *\r\n * IMPORTANT: metadata.ideType MUST be \"ANTIGRAVITY\" (not IDE_UNSPECIFIED)\r\n * and the request must carry the User-Agent / X-Goog-Api-Client /\r\n * Client-Metadata headers below. That's the combination that routes\r\n * quota against the Antigravity pool instead of the free Code Assist\r\n * tier \u2014 and it's the difference between gemini-3-pro-preview working\r\n * and throwing \"Rate limit or quota exceeded\" on the second message.\r\n *\r\n * Ported from router-for-me/CLIProxyAPI internal/auth/antigravity/auth.go.\r\n */\r\n\r\nimport { homedir } from 'os'\r\nimport { join } from 'path'\r\nimport { randomUUID } from 'crypto'\r\nimport {\r\n  existsSync,\r\n  mkdirSync,\r\n  readFileSync,\r\n  writeFileSync,\r\n} from 'fs'\r\nimport type {\n  GeminiGenerateContentResponse,\n  GeminiStreamChunk,\n} from '../adapters/gemini_to_anthropic.js'\nimport type { ModelInfo } from './base_provider.js'\nimport {\n  ANTIGRAVITY_API_VERSION,\n  ANTIGRAVITY_ENDPOINT_AUTOPUSH,\n  ANTIGRAVITY_ENDPOINT_DAILY,\n  ANTIGRAVITY_ENDPOINT_PROD,\n} from '../../../constants/antigravity.js'\n\nexport const CODE_ASSIST_BASE = `${ANTIGRAVITY_ENDPOINT_PROD}/v1internal`\nexport const ANTIGRAVITY_GENERATION_BASE = `${ANTIGRAVITY_ENDPOINT_DAILY}/v1internal`\n\r\n// \u2500\u2500\u2500 Executor types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n// Two distinct executors route to the same Code Assist proxy but with\r\n// different body envelopes, headers, and quota pools.\r\n\r\nexport type GeminiExecutor = 'cli' | 'antigravity'\r\n\r\nexport function codeAssistGenerationBase(executor: GeminiExecutor): string {\n  return executor === 'antigravity' ? ANTIGRAVITY_GENERATION_BASE : CODE_ASSIST_BASE\n}\n\nexport function codeAssistGenerationBases(executor: GeminiExecutor): readonly string[] {\n  return executor === 'antigravity'\n    ? [\n      ANTIGRAVITY_GENERATION_BASE,\n      `${ANTIGRAVITY_ENDPOINT_AUTOPUSH}/v1internal`,\n      CODE_ASSIST_BASE,\n    ]\n    : [CODE_ASSIST_BASE]\n}\n\r\n// Antigravity-specific models \u2014 everything else is Gemini CLI.\r\n// Includes Claude models that Antigravity re-sells through the same\r\n// Code Assist proxy (cloudcode-pa). They share the `userAgent: \"antigravity\"`\r\n// envelope but need small content-level fixes (see wrapForCodeAssist).\r\nexport const ANTIGRAVITY_MODELS: readonly ModelInfo[] = [\n  { id: 'gemini-3.5-flash-high', name: 'Gemini 3.5 Flash (High)', contextWindow: 1048576 },\n  { id: 'gemini-3.5-flash-medium', name: 'Gemini 3.5 Flash (Medium)', contextWindow: 1048576 },\n  { id: 'gemini-3.5-flash-low', name: 'Gemini 3.5 Flash (Low)', contextWindow: 1048576 },\n  { id: 'gemini-3.1-pro-high', name: 'Gemini 3.1 Pro (High)', contextWindow: 1048576 },\n  { id: 'gemini-3.1-pro-low', name: 'Gemini 3.1 Pro (Low)', contextWindow: 1048576 },\n  { id: 'gemini-3-flash', name: 'Gemini 3 Flash', contextWindow: 1048576 },\n  { id: 'claude-sonnet-4-6', name: 'Claude Sonnet 4.6' },\n  { id: 'claude-opus-4-6-thinking', name: 'Claude Opus 4.6' },\n]\n\nconst ANTIGRAVITY_WIRE_MODEL_DISPLAY_NAMES = new Map<string, string>([\n  ['gemini-3.5-flash', 'Gemini 3.5 Flash'],\n  ['gemini-3.5-flash-low', 'Gemini 3.5 Flash (Medium)'],\n  ['gemini-3.5-flash-extra-low', 'Gemini 3.5 Flash (Low)'],\n  ['gemini-3-flash-agent', 'Gemini 3.5 Flash (High)'],\n  ['gemini-pro-agent', 'Gemini 3.1 Pro (High)'],\n  ['gemini-3-flash-high', 'Gemini 3 Flash (High)'],\n  ['gemini-3-flash-medium', 'Gemini 3 Flash (Medium)'],\n  ['gemini-3-flash-low', 'Gemini 3 Flash (Low)'],\n])\n\nexport const ANTIGRAVITY_MODEL_IDS = new Set([\n  ...ANTIGRAVITY_MODELS.map(model => model.id),\n])\n\nexport function getAntigravityModelDisplayName(model: string): string | null {\n  const normalized = model.toLowerCase().replace(/^models\\//, '')\n  return ANTIGRAVITY_MODELS.find(candidate => candidate.id === normalized)?.name\n    ?? ANTIGRAVITY_WIRE_MODEL_DISPLAY_NAMES.get(normalized)\n    ?? null\n}\n\nexport function resolveAntigravityWireModel(model: string): string {\n  const normalized = model.toLowerCase()\n  if (normalized === 'gemini-3.1-pro-high') {\n    return 'gemini-pro-agent'\n  }\n  if (normalized === 'gemini-3.5-flash-high') {\n    return 'gemini-3-flash-agent'\n  }\n  if (normalized === 'gemini-3.5-flash-medium') {\n    return 'gemini-3.5-flash-low'\n  }\n  if (normalized === 'gemini-3.5-flash-low') {\n    return 'gemini-3.5-flash-extra-low'\n  }\n  return model\n}\n\n/** Determine which executor a model belongs to. */\nexport function executorForModel(model: string): GeminiExecutor {\n  return ANTIGRAVITY_MODEL_IDS.has(model.toLowerCase()) ? 'antigravity' : 'cli'\n}\n\r\n// CLIProxyAPI's Antigravity onboarding headers. These are used during\r\n// loadCodeAssist / onboardUser \u2014 NOT on generateContent calls.\r\nconst API_USER_AGENT = 'google-api-nodejs-client/9.15.1'\r\nconst API_CLIENT = 'google-cloud-sdk vscode_cloudshelleditor/0.1'\r\nconst CLIENT_METADATA =\r\n  '{\"ideType\":\"IDE_UNSPECIFIED\",\"platform\":\"PLATFORM_UNSPECIFIED\",\"pluginType\":\"GEMINI\"}'\r\n\r\nconst CONFIG_DIR = join(homedir(), '.config', 'claude-code')\r\n\r\n// Per-executor cache files \u2014 each executor type gets its own onboarding\r\n// and project ID because the Code Assist server tracks them separately.\r\nconst CACHE_FILE_CLI = join(CONFIG_DIR, 'gemini-code-assist-cli.json')\r\nconst CACHE_FILE_ANTIGRAVITY = join(CONFIG_DIR, 'gemini-code-assist.json')\r\n\r\nconst CACHE_VERSION = 6  // bump: drop allowedTiers from tier detection\r\n\r\ninterface CodeAssistCache {\r\n  version: number\r\n  projectId: string | null\r\n  onboardedAt: number\r\n  /**\r\n   * Cached `currentTier.id` from loadCodeAssist (e.g. 'free-tier',\r\n   * 'standard-tier', 'legacy-tier'). Kept as a fallback for the picker\r\n   * when the quota lookup is unavailable; entitled model ids below are\r\n   * the canonical signal.\r\n   */\r\n  tier?: string | null\r\n  /**\r\n   * Concrete model ids the user has quota for, sourced from\r\n   * retrieveUserQuota.buckets. This is gemini-cli's source of truth\r\n   * for \"does the user have access to model X\" \u2014 far more reliable\r\n   * than the tier id, since Google AI Pro consumers often keep\r\n   * `currentTier.id = 'free-tier'` while still receiving Pro buckets.\r\n   * Empty array means the quota lookup ran but returned nothing\r\n   * actionable; `undefined` means the lookup hasn't run yet.\r\n   */\r\n  entitledModelIds?: string[]\r\n}\r\n\r\n// \u2500\u2500\u2500 Tier-id constants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n// Mirrors the subset of UserTierId values gemini-cli treats specially\r\n// (reference/gemini-cli-main/packages/core/src/code_assist/types.ts).\r\n// Anything outside FREE/LEGACY is treated as a paid tier.\r\nexport const GEMINI_TIER_FREE = 'free-tier'\r\nexport const GEMINI_TIER_LEGACY = 'legacy-tier'\r\nexport const GEMINI_TIER_STANDARD = 'standard-tier'\r\n\r\n/**\r\n * True when the tier id represents a paid Google account that unlocks\r\n * Pro models. Free and legacy tiers are flash-only. An unknown/missing\r\n * tier is treated as free to avoid showing models the user can't call.\r\n */\r\nexport function isPaidGeminiTier(tier: string | null | undefined): boolean {\r\n  if (!tier) return false\r\n  if (tier === GEMINI_TIER_FREE) return false\r\n  if (tier === GEMINI_TIER_LEGACY) return false\r\n  return true\r\n}\r\n\r\n/**\r\n * Read the cached tier id for an executor (set during onboarding).\r\n * Returns null when no tier has been captured yet \u2014 typical for the\r\n * Antigravity executor, since loadCodeAssist there returns a project\r\n * id directly without enumerating tiers.\r\n */\r\nexport function getGeminiTier(executor: GeminiExecutor): string | null {\r\n  const cache = _readCache(executor)\r\n  return cache?.tier ?? null\r\n}\r\n\r\n/**\r\n * Read the cached list of model ids the user has quota for. Sourced\r\n * from retrieveUserQuota.buckets and refreshed during onboarding.\r\n * Returns null when no quota lookup has happened yet, or an array\r\n * (possibly empty) when one has. Callers should treat null/empty as\r\n * \"no Pro entitlement detected\" and fall back to the tier-based check.\r\n */\r\nexport function getGeminiEntitledModelIds(\r\n  executor: GeminiExecutor,\r\n): readonly string[] | null {\r\n  const cache = _readCache(executor)\r\n  if (!cache) return null\r\n  return cache.entitledModelIds ?? null\r\n}\r\n\r\n/**\r\n * True when the entitled-models list contains any Pro-tier model id \u2014\r\n * that is, anything that isn't a flash variant. Mirrors the heuristic\r\n * gemini-cli uses to set `hasAccessToPreviewModel` from quota buckets\r\n * (`config.ts:2235-2239` walks buckets looking for a preview model).\r\n */\r\nexport function hasPaidEntitlement(\r\n  modelIds: readonly string[] | null,\r\n): boolean {\r\n  if (!modelIds || modelIds.length === 0) return false\r\n  return modelIds.some(id => {\r\n    const lower = id.toLowerCase()\r\n    if (lower.includes('flash')) return false\r\n    if (lower.includes('embedding')) return false\r\n    return lower.includes('pro') || lower.includes('preview')\r\n  })\r\n}\r\n\r\n// In-memory caches \u2014 one per executor type\r\nlet _cachedCli: CodeAssistCache | null = null\r\nlet _cachedAntigravity: CodeAssistCache | null = null\r\n\r\n/**\r\n * Clear the cached project ID for an executor. Called when we get a 403\r\n * \"does not have permission\" error \u2014 the cached project is stale and the\r\n * next call will re-onboard to get a fresh project ID.\r\n */\r\nexport function clearCodeAssistCache(executor?: GeminiExecutor): void {\r\n  if (!executor || executor === 'cli') {\r\n    _cachedCli = null\r\n    try { const f = _cacheFileFor('cli'); if (existsSync(f)) writeFileSync(f, '{}') } catch {}\r\n  }\r\n  if (!executor || executor === 'antigravity') {\r\n    _cachedAntigravity = null\r\n    try { const f = _cacheFileFor('antigravity'); if (existsSync(f)) writeFileSync(f, '{}') } catch {}\r\n  }\r\n}\r\n\r\nfunction _cacheFileFor(executor: GeminiExecutor): string {\r\n  return executor === 'cli' ? CACHE_FILE_CLI : CACHE_FILE_ANTIGRAVITY\r\n}\r\n\r\nfunction _readCache(executor: GeminiExecutor): CodeAssistCache | null {\r\n  const mem = executor === 'cli' ? _cachedCli : _cachedAntigravity\r\n  if (mem) return mem\r\n  try {\r\n    const file = _cacheFileFor(executor)\r\n    if (!existsSync(file)) return null\r\n    const raw = readFileSync(file, 'utf-8')\r\n    const parsed = JSON.parse(raw) as CodeAssistCache\r\n    if ((parsed.version ?? 0) < CACHE_VERSION) return null\r\n    if (executor === 'cli') _cachedCli = parsed\r\n    else _cachedAntigravity = parsed\r\n    return parsed\r\n  } catch {\r\n    return null\r\n  }\r\n}\r\n\r\nfunction _writeCache(executor: GeminiExecutor, cache: CodeAssistCache): void {\r\n  try {\r\n    if (!existsSync(CONFIG_DIR)) mkdirSync(CONFIG_DIR, { recursive: true })\r\n    writeFileSync(_cacheFileFor(executor), JSON.stringify(cache, null, 2))\r\n    if (executor === 'cli') _cachedCli = cache\r\n    else _cachedAntigravity = cache\r\n  } catch {\r\n    // Cache is best-effort.\r\n  }\r\n}\r\n\r\n/** Onboarding headers for the Antigravity executor. */\r\nfunction _antigravityOnboardHeaders(accessToken: string): Record<string, string> {\r\n  return {\r\n    Authorization: `Bearer ${accessToken}`,\r\n    'Content-Type': 'application/json',\r\n    'User-Agent': API_USER_AGENT,\r\n    'X-Goog-Api-Client': API_CLIENT,\r\n    'Client-Metadata': CLIENT_METADATA,\r\n    'Connection': 'keep-alive',\r\n  }\r\n}\r\n\r\n/** Onboarding headers for the Gemini CLI executor. */\r\nfunction _cliOnboardHeaders(accessToken: string): Record<string, string> {\r\n  const os = process.platform === 'win32' ? 'win32' : process.platform === 'darwin' ? 'darwin' : 'linux'\r\n  const arch = process.arch === 'x64' ? 'x64' : process.arch === 'arm64' ? 'arm64' : 'x86'\r\n  return {\r\n    Authorization: `Bearer ${accessToken}`,\r\n    'Content-Type': 'application/json',\r\n    'User-Agent': `GeminiCLI/0.31.0 (${os}; ${arch})`,\r\n    'X-Goog-Api-Client': 'google-genai-sdk/1.41.0 gl-node/v22.19.0',\r\n    'Connection': 'keep-alive',\r\n  }\r\n}\r\n\r\n// \u2500\u2500\u2500 Onboarding \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n/**\r\n * Fetch with retry on transient failures (5xx / network). Used for\r\n * onboarding calls where the first-request latency matters \u2014 without\r\n * this, a single 503 from Code Assist forces the user to retry their\r\n * prompt manually. Up to 3 attempts with 500/1500/3000 ms backoff.\r\n *\r\n * 4xx responses are NOT retried \u2014 those are terminal (bad token,\r\n * unauthorized, etc.) and callers surface them as-is.\r\n */\r\nasync function _fetchWithTransientRetry(\r\n  url: string,\r\n  init: RequestInit,\r\n  opts: { maxAttempts?: number } = {},\r\n): Promise<Response> {\r\n  const maxAttempts = opts.maxAttempts ?? 3\r\n  let lastErr: unknown\r\n  for (let attempt = 1; attempt <= maxAttempts; attempt++) {\r\n    try {\r\n      const res = await fetch(url, init)\r\n      if (res.ok) return res\r\n      // 4xx \u2192 surface immediately; retrying won't help.\r\n      if (res.status >= 400 && res.status < 500) return res\r\n      // 5xx \u2192 retry with backoff unless we're out of attempts.\r\n      if (attempt >= maxAttempts) return res\r\n      lastErr = new Error(`HTTP ${res.status}`)\r\n    } catch (e) {\r\n      lastErr = e\r\n      if (attempt >= maxAttempts) throw e\r\n    }\r\n    await new Promise(r => setTimeout(r, 500 * Math.pow(3, attempt - 1)))\r\n  }\r\n  throw lastErr instanceof Error ? lastErr : new Error(String(lastErr))\r\n}\r\n\r\n/**\r\n * Ensure the user is onboarded to Code Assist and return the project ID.\r\n *\r\n * Each executor type (CLI vs Antigravity) has its own cache and uses\r\n * different onboarding headers/metadata so the server associates the\r\n * project with the right quota pool.\r\n */\r\nexport async function ensureCodeAssistReady(\r\n  accessToken: string,\r\n  executor: GeminiExecutor = 'antigravity',\r\n): Promise<string | null> {\r\n  const cached = _readCache(executor)\r\n  if (cached) return cached.projectId\r\n\r\n  // CLI uses GEMINI_CLI ideType; Antigravity uses ANTIGRAVITY.\r\n  const ideType = executor === 'cli' ? 'GEMINI_CLI' : 'ANTIGRAVITY'\r\n  const headers = executor === 'cli'\r\n    ? _cliOnboardHeaders(accessToken)\r\n    : _antigravityOnboardHeaders(accessToken)\r\n\r\n  const loadReqBody = {\r\n    metadata: {\r\n      ideType,\r\n      platform: 'PLATFORM_UNSPECIFIED',\r\n      pluginType: 'GEMINI',\r\n    },\r\n  }\r\n\r\n  const loadRes = await _fetchWithTransientRetry(`${CODE_ASSIST_BASE}:loadCodeAssist`, {\r\n    method: 'POST',\r\n    headers,\r\n    body: JSON.stringify(loadReqBody),\r\n  })\r\n\r\n  if (!loadRes.ok) {\r\n    const errText = await loadRes.text().catch(() => '')\r\n    throw new Error(\r\n      `Gemini Code Assist loadCodeAssist failed (${loadRes.status}): ${errText.slice(0, 300)}`,\r\n    )\r\n  }\r\n\r\n  // The response shape for cloudaicompanionProject is either a plain\r\n  // string or an object with an `id` field (CLIProxyAPI handles both\r\n  // cases \u2014 we do too).\r\n  const loadData = (await loadRes.json()) as {\r\n    cloudaicompanionProject?: string | { id?: string }\r\n    currentTier?: { id?: string }\r\n    paidTier?: { id?: string }\r\n    allowedTiers?: Array<{\r\n      id?: string\r\n      name?: string\r\n      isDefault?: boolean\r\n    }>\r\n  }\r\n\r\n  // Capture the user's effective tier so the model picker can decide\r\n  // whether to surface Pro models. Use `paidTier.id` first (set when\r\n  // the user actually has a paid subscription \u2014 Google AI Pro / Ultra)\r\n  // then `currentTier.id` (active tier). This mirrors gemini-cli's\r\n  // setup.ts: `loadRes.paidTier?.id ?? loadRes.currentTier.id`.\r\n  //\r\n  // Do NOT consult `allowedTiers` here \u2014 those are tiers the user\r\n  // *could* be on, not the one they actually use. A free-tier account\r\n  // typically has `allowedTiers = [free, standard]` because they are\r\n  // *eligible* to upgrade, and treating that as \"they're already paid\"\r\n  // makes the picker show Pro models to free users (the bug we're fixing).\r\n  // Consumer Google AI Pro users without a `paidTier` field are caught\r\n  // by the entitled-id bucket check downstream, not by this tier.\r\n  const observedTier = _pickTier(\r\n    _normalizeTier(loadData.paidTier?.id),\r\n    _normalizeTier(loadData.currentTier?.id),\r\n  )\r\n\r\n  // Workaround for Google's \"ghost project\" bug\r\n  // (github.com/google-gemini/gemini-cli/issues/24747, /25189): the\r\n  // backend sometimes returns a `cloudaicompanionProject` that the\r\n  // user's account doesn't actually have permission on, producing a\r\n  // 403 PERMISSION_DENIED on every subsequent call. Honor an explicit\r\n  // `GOOGLE_CLOUD_PROJECT` (or `GEMINI_CLOUD_PROJECT`) env var to\r\n  // override the auto-discovered project. This matches the env var\r\n  // gemini-cli, gcloud, and the Google AI SDKs already check.\r\n  const projectOverride = _projectOverrideFromEnv()\r\n  if (projectOverride) {\r\n    const entitled = await _fetchEntitledModelIds(\r\n      accessToken,\r\n      projectOverride,\r\n      executor,\r\n    )\r\n    _writeCache(executor, {\r\n      version: CACHE_VERSION,\r\n      projectId: projectOverride,\r\n      onboardedAt: Date.now(),\r\n      tier: observedTier,\r\n      entitledModelIds: entitled,\r\n    })\r\n    return projectOverride\r\n  }\r\n\r\n  const directProjectId = _extractProjectId(loadData.cloudaicompanionProject)\r\n  if (directProjectId) {\r\n    // Resolve quota in parallel with returning the project id. The quota\r\n    // call is best-effort \u2014 Code Assist returns 403 on some scoped\r\n    // tokens, and we don't want listModels() to fail just because the\r\n    // entitlement lookup did. tier alone is then the fallback signal.\r\n    const entitled = await _fetchEntitledModelIds(\r\n      accessToken,\r\n      directProjectId,\r\n      executor,\r\n    )\r\n    _writeCache(executor, {\r\n      version: CACHE_VERSION,\r\n      projectId: directProjectId,\r\n      onboardedAt: Date.now(),\r\n      tier: observedTier,\r\n      entitledModelIds: entitled,\r\n    })\r\n    return directProjectId\r\n  }\r\n\r\n  // No project bound yet \u2192 run onboardUser. Pick the default allowed\r\n  // tier, or fall back to \"legacy-tier\" the way CLIProxyAPI does.\r\n  let tierId = 'legacy-tier'\r\n  if (loadData.allowedTiers) {\r\n    for (const tier of loadData.allowedTiers) {\r\n      if (tier.isDefault && tier.id && tier.id.trim() !== '') {\r\n        tierId = tier.id.trim()\r\n        break\r\n      }\r\n    }\r\n  }\r\n\r\n  const onboardedProject = await _onboardUser(accessToken, tierId, executor)\r\n  const entitled = onboardedProject\r\n    ? await _fetchEntitledModelIds(accessToken, onboardedProject, executor)\r\n    : undefined\r\n  _writeCache(executor, {\r\n    version: CACHE_VERSION,\r\n    projectId: onboardedProject,\r\n    onboardedAt: Date.now(),\r\n    tier: observedTier ?? _normalizeTier(tierId),\r\n    entitledModelIds: entitled,\r\n  })\r\n  return onboardedProject\r\n}\r\n\r\n/**\r\n * Call retrieveUserQuota on the Code Assist v1internal endpoint and\r\n * return the list of model ids the user has buckets for.\r\n *\r\n * gemini-cli's `config.ts:2196-2240` makes the same call and uses the\r\n * returned `buckets[].modelId` array as the source of truth for \"does\r\n * the user have access to model X\". Buckets that lack a `modelId` (rare\r\n * \u2014 global quota) are skipped.\r\n *\r\n * Best-effort: returns undefined on 403, network error, or a malformed\r\n * payload. The caller falls back to the tier-id signal in that case.\r\n */\r\nasync function _fetchEntitledModelIds(\r\n  accessToken: string,\r\n  projectId: string,\r\n  executor: GeminiExecutor,\r\n): Promise<string[] | undefined> {\r\n  const buckets = await _fetchQuotaBuckets(accessToken, projectId, executor)\r\n  if (!buckets) return undefined\r\n  const ids = buckets\r\n    .map(b => (typeof b.modelId === 'string' ? b.modelId.trim() : ''))\r\n    .filter(id => id.length > 0)\r\n  // Dedupe while preserving order \u2014 buckets occasionally repeat the\r\n  // same model under different reset windows.\r\n  return Array.from(new Set(ids))\r\n}\r\n\r\n/**\r\n * One bucket entry from `retrieveUserQuota`. Mirrors the proto shape\r\n * gemini-cli reads in `RetrieveUserQuotaResponse.buckets[]`. Surfaced\r\n * publicly so the `/usage` reporter can render per-tier progress bars\r\n * without re-implementing the wire call.\r\n */\r\nexport interface GeminiQuotaBucket {\r\n  modelId?: string\r\n  /** Remaining count (string-encoded int64 in the proto). */\r\n  remainingAmount?: string\r\n  /** 0..1 \u2014 what gemini-cli plots as \"% remaining\". */\r\n  remainingFraction?: number\r\n  /** ISO-8601 timestamp for the next quota reset. */\r\n  resetTime?: string\r\n  /** \"credit\", \"throttled\", etc. \u2014 passed through unmodified. */\r\n  tokenType?: string\r\n}\r\n\r\nasync function _fetchQuotaBuckets(\n  accessToken: string,\n  projectId: string,\n  executor: GeminiExecutor,\n): Promise<GeminiQuotaBucket[] | undefined> {\n  const headers = executor === 'cli'\n    ? _cliOnboardHeaders(accessToken)\n    : _antigravityOnboardHeaders(accessToken)\n\r\n  try {\r\n    const res = await _fetchWithTransientRetry(\r\n      `${CODE_ASSIST_BASE}:retrieveUserQuota`,\r\n      {\r\n        method: 'POST',\r\n        headers,\r\n        body: JSON.stringify({ project: projectId }),\r\n      },\r\n      { maxAttempts: 2 },\n    )\n\n    if (!res.ok) return undefined\n\n    const data = (await res.json()) as { buckets?: GeminiQuotaBucket[] }\n    return data.buckets ?? []\n  } catch {\n    return undefined\n  }\n}\n\r\n/**\r\n * Public quota fetch for the `/usage` Gemini reporter. Returns the raw\r\n * `retrieveUserQuota.buckets[]` for the CLI executor \u2014 `modelId`,\r\n * `remainingFraction`, `resetTime` are the fields the bar chart needs.\r\n *\r\n * Returns `undefined` when the call fails (403/network/malformed).\r\n * Callers must have onboarded the user first; pass the projectId from\r\n * `ensureCodeAssistReady('cli')`.\r\n */\r\nexport async function fetchGeminiCliQuotaBuckets(\n  accessToken: string,\n  projectId: string,\n): Promise<GeminiQuotaBucket[] | undefined> {\n  return _fetchQuotaBuckets(accessToken, projectId, 'cli')\n}\n\nfunction _normalizeTier(tier: string | null | undefined): string | null {\n  if (!tier) return null\r\n  const trimmed = tier.trim()\r\n  return trimmed ? trimmed : null\r\n}\r\n\r\n/**\r\n * Pick the most \"paid\" tier id from a list of candidates. Order: any\r\n * non-null, non-free, non-legacy id wins; otherwise return the first\r\n * non-null id; otherwise null. This is what lets a Google AI Pro user\r\n * with `currentTier=free-tier` but `allowedTiers=[free, standard]`\r\n * resolve to `standard-tier` instead of `free-tier`.\r\n */\r\nfunction _pickTier(...candidates: Array<string | null>): string | null {\r\n  for (const c of candidates) {\r\n    if (c && c !== GEMINI_TIER_FREE && c !== GEMINI_TIER_LEGACY) return c\r\n  }\r\n  for (const c of candidates) {\r\n    if (c) return c\r\n  }\r\n  return null\r\n}\r\n\r\n/**\r\n * Read an explicit Cloud project override from the environment. We\r\n * accept `GOOGLE_CLOUD_PROJECT` (the gcloud / Vertex / GenAI standard)\r\n * and `GEMINI_CLOUD_PROJECT` (claudex-specific). Returns null when\r\n * neither is set or both are blank. This is the documented client-side\r\n * mitigation for the \"ghost project\" 403 bug \u2014 see\r\n * github.com/google-gemini/gemini-cli/issues/24747.\r\n */\r\nfunction _projectOverrideFromEnv(): string | null {\r\n  const candidates = [\r\n    process.env.GEMINI_CLOUD_PROJECT,\r\n    process.env.GOOGLE_CLOUD_PROJECT,\r\n  ]\r\n  for (const raw of candidates) {\r\n    if (typeof raw === 'string' && raw.trim()) return raw.trim()\r\n  }\r\n  return null\r\n}\r\n\r\n/**\r\n * Extract a project id out of the polymorphic shapes the Code Assist\r\n * API returns:\r\n *   - `\"project-123\"`                 (plain string)\r\n *   - `{ id: \"project-123\" }`         (wrapper object)\r\n *   - anything else / missing \u2192 null.\r\n */\r\nfunction _extractProjectId(\r\n  value: string | { id?: string } | undefined,\r\n): string | null {\r\n  if (!value) return null\r\n  if (typeof value === 'string') {\r\n    const trimmed = value.trim()\r\n    return trimmed ? trimmed : null\r\n  }\r\n  if (typeof value === 'object' && typeof value.id === 'string') {\r\n    const trimmed = value.id.trim()\r\n    return trimmed ? trimmed : null\r\n  }\r\n  return null\r\n}\r\n\r\n/**\r\n * Run Code Assist onboardUser and poll for completion, following\r\n * CLIProxyAPI's retry loop (5 attempts, 2s between, 30s timeout each).\r\n * Throws if we can't extract a project id after the final attempt.\r\n */\r\nasync function _onboardUser(\r\n  accessToken: string,\r\n  tierId: string,\r\n  executor: GeminiExecutor = 'antigravity',\r\n): Promise<string | null> {\r\n  const ideType = executor === 'cli' ? 'GEMINI_CLI' : 'ANTIGRAVITY'\r\n  const headers = executor === 'cli'\r\n    ? _cliOnboardHeaders(accessToken)\r\n    : _antigravityOnboardHeaders(accessToken)\r\n  const requestBody = {\r\n    tierId,\r\n    metadata: {\r\n      ideType,\r\n      platform: 'PLATFORM_UNSPECIFIED',\r\n      pluginType: 'GEMINI',\r\n    },\r\n  }\r\n  const bodyJson = JSON.stringify(requestBody)\r\n\r\n  const maxAttempts = 5\r\n  let lastErr: string | null = null\r\n\r\n  for (let attempt = 1; attempt <= maxAttempts; attempt++) {\r\n    const controller = new AbortController()\r\n    const perRequestTimeout = setTimeout(() => controller.abort(), 30_000)\r\n\r\n    let res: Response\r\n    try {\r\n      res = await _fetchWithTransientRetry(`${CODE_ASSIST_BASE}:onboardUser`, {\r\n        method: 'POST',\r\n        headers,\r\n        body: bodyJson,\r\n        signal: controller.signal,\r\n      })\r\n    } catch (e) {\r\n      clearTimeout(perRequestTimeout)\r\n      lastErr = e instanceof Error ? e.message : String(e)\r\n      throw new Error(\r\n        `Gemini Code Assist onboardUser request failed: ${lastErr}`,\r\n      )\r\n    }\r\n    clearTimeout(perRequestTimeout)\r\n\r\n    const text = await res.text().catch(() => '')\r\n\r\n    if (!res.ok) {\r\n      const preview = text.trim().slice(0, 200)\r\n      throw new Error(\r\n        `Gemini Code Assist onboardUser failed (${res.status}): ${preview}`,\r\n      )\r\n    }\r\n\r\n    let data: {\r\n      done?: boolean\r\n      response?: {\r\n        cloudaicompanionProject?: string | { id?: string }\r\n      }\r\n    } = {}\r\n    try {\r\n      data = text ? JSON.parse(text) : {}\r\n    } catch (e) {\r\n      throw new Error(\r\n        `Gemini Code Assist onboardUser returned non-JSON: ${\r\n          e instanceof Error ? e.message : String(e)\r\n        }`,\r\n      )\r\n    }\r\n\r\n    if (data.done === true) {\r\n      const projectId = _extractProjectId(data.response?.cloudaicompanionProject)\r\n      if (projectId) return projectId\r\n      throw new Error(\r\n        'Gemini Code Assist onboardUser finished without a project id. ' +\r\n          'Try signing out and back in with /provider.',\r\n      )\r\n    }\r\n\r\n    // Not done yet \u2014 wait and retry. Use 1.5s instead of CLIProxyAPI's 2s\r\n    // cadence to reduce first-request latency.\r\n    if (attempt < maxAttempts) {\r\n      await new Promise((r) => setTimeout(r, 1500))\r\n    }\r\n  }\r\n\r\n  throw new Error(\r\n    'Gemini Code Assist onboardUser did not complete after 5 attempts. ' +\r\n      'This usually means the Google account is missing Antigravity access \u2014 ' +\r\n      'check the account at https://antigravity.google.com and try again.',\r\n  )\r\n}\r\n\r\n// \u2500\u2500\u2500 Request wrapping \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport interface CodeAssistWrapperBody {\r\n  model: string\r\n  userAgent: string\r\n  requestType: string\r\n  project: string\r\n  requestId: string\r\n  request: Record<string, unknown>\r\n}\r\n\r\n/**\r\n * Wrap a standard Gemini generateContent request body in the Code Assist\r\n * envelope shape.\r\n *\r\n * Matches CLIProxyAPI's geminiToAntigravity() format:\r\n *   - userAgent \"antigravity\" \u2014 tells the server which client so quota is\r\n *     routed to the Antigravity pool rather than the free Code Assist tier\r\n *   - requestType \"agent\" \u2014 classifies the request\r\n *   - requestId \"agent-<uuid>\" \u2014 per-request identifier\r\n *   - request.sessionId \u2014 stable hash for dedup (derived from first user msg)\r\n *   - request.safetySettings deleted (Antigravity executor strips these)\r\n */\r\nexport function wrapForCodeAssist(\r\n  model: string,\r\n  projectId: string | null,\r\n  innerRequest: Record<string, unknown>,\r\n): CodeAssistWrapperBody {\r\n  // Strip safetySettings \u2014 the Antigravity executor always removes them.\r\n  // Also strip maxOutputTokens for non-Claude models (Antigravity executor\r\n  // deletes request.generationConfig.maxOutputTokens for Gemini models).\r\n  const wireModel = resolveAntigravityWireModel(model)\n  const request = { ...innerRequest }\n  delete request.safetySettings\r\n  const isClaude = wireModel.includes('claude')\n  if (!isClaude) {\r\n    const gc = request.generationConfig as Record<string, unknown> | undefined\r\n    if (gc) {\r\n      delete gc.maxOutputTokens\r\n    }\r\n  }\r\n\r\n  // Claude-on-Antigravity content massaging (from CLIProxyAPI's antigravity\r\n  // transformRequest): functionResponse parts force role \"user\" (Claude's\r\n  // tool-result convention), and thought-only / thoughtSignature-only parts\r\n  // that don't carry a functionCall or text are dropped \u2014 Claude rejects\r\n  // them as empty parts otherwise.\r\n  if (isClaude) {\r\n    _applyClaudeContentFixes(request)\r\n  }\r\n\r\n  // Generate stable session ID from first user message (matches CLIProxyAPI's\r\n  // generateStableSessionID).\r\n  request.sessionId = _stableSessionId(request)\r\n\r\n  return {\r\n    model: wireModel,\n    userAgent: 'antigravity',\r\n    requestType: wireModel.includes('image') ? 'image_gen' : 'agent',\n    project: projectId ?? _randomProjectId(),\r\n    requestId: wireModel.includes('image')\n      ? `image_gen/${Date.now()}/${randomUUID()}/12`\r\n      : `agent-${randomUUID()}`,\r\n    request,\r\n  }\r\n}\r\n\r\n/**\r\n * Wrap a standard Gemini generateContent request in the Gemini CLI envelope.\r\n *\r\n * Simpler than the Antigravity format \u2014 just `{model, project, request}`.\r\n * safetySettings and maxOutputTokens are kept (the CLI executor does not strip them).\r\n *\r\n * From CLIProxyAPI internal/translator/gemini-cli/gemini/gemini-cli_gemini_request.go:\r\n *   template := `{\"project\":\"\",\"request\":{},\"model\":\"\"}`\r\n */\r\nexport function wrapForGeminiCLI(\r\n  model: string,\r\n  projectId: string | null,\r\n  innerRequest: Record<string, unknown>,\r\n): { model: string; project: string; request: Record<string, unknown> } {\r\n  return {\r\n    model,\r\n    project: projectId ?? _randomProjectId(),\r\n    request: { ...innerRequest },\r\n  }\r\n}\r\n\r\n// \u2500\u2500\u2500 Per-executor API call headers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n// These are the headers sent on generateContent / streamGenerateContent\r\n// calls \u2014 NOT the onboarding headers (loadCodeAssist / onboardUser).\r\n// Quota routing depends on these matching the expected client identity.\r\n\r\n/**\r\n * Headers for Gemini CLI executor API calls.\r\n * Matches CLIProxyAPI's applyGeminiCLIHeaders():\r\n *   User-Agent: GeminiCLI/0.31.0/<model> (<os>; <arch>)\r\n *   X-Goog-Api-Client: google-genai-sdk/1.41.0 gl-node/v22.19.0\r\n */\r\nexport function geminiCLIApiHeaders(accessToken: string, model: string): Record<string, string> {\r\n  const os = process.platform === 'win32' ? 'win32' : process.platform === 'darwin' ? 'darwin' : 'linux'\r\n  const arch = process.arch === 'x64' ? 'x64' : process.arch === 'arm64' ? 'arm64' : 'x86'\r\n  return {\r\n    'Content-Type': 'application/json',\r\n    Authorization: `Bearer ${accessToken}`,\r\n    'User-Agent': `GeminiCLI/0.31.0/${model} (${os}; ${arch})`,\r\n    'X-Goog-Api-Client': 'google-genai-sdk/1.41.0 gl-node/v22.19.0',\r\n  }\r\n}\r\n\r\n/**\r\n * Headers for Antigravity executor API calls.\r\n * Matches CLIProxyAPI's antigravity executor:\r\n *   User-Agent: antigravity/<version> <os>/<arch>\r\n *   NO X-Goog-Api-Client header \u2014 quota routing relies on body.userAgent instead.\r\n */\r\nexport function antigravityApiHeaders(accessToken: string): Record<string, string> {\r\n  const os = process.platform === 'win32' ? 'win32' : process.platform === 'darwin' ? 'darwin' : 'linux'\r\n  const arch = process.arch === 'x64' ? 'x64' : process.arch === 'arm64' ? 'arm64' : 'x86'\r\n  return {\r\n    'Content-Type': 'application/json',\r\n    Authorization: `Bearer ${accessToken}`,\r\n    'User-Agent': `antigravity/${ANTIGRAVITY_API_VERSION} ${os}/${arch}`,\r\n    'x-request-source': 'local',\r\n  }\r\n}\r\n\r\n/**\r\n * Apply Claude-on-Antigravity content fixes in place.\r\n *\r\n * Antigravity re-sells Claude 4.6 through the same Code Assist proxy, but\r\n * the bridge on Google's side treats Claude's content list slightly\r\n * differently from Gemini's:\r\n *\r\n *   1. Any content whose parts contain a `functionResponse` must have\r\n *      role=\"user\" (Claude's tool-result messages are user-role).\r\n *   2. Parts that are pure `{thought: true}` with no functionCall are\r\n *      dropped \u2014 Claude rejects empty thought blobs (Gemini 3.x sends\r\n *      these, Claude doesn't accept them).\r\n *   3. Parts that carry only a `thoughtSignature` with no functionCall\r\n *      and no text are dropped for the same reason.\r\n *\r\n * Mirrors CLIProxyAPI's antigravity executor transformRequest().\r\n */\r\nfunction _applyClaudeContentFixes(request: Record<string, unknown>): void {\r\n  const contents = request.contents\r\n  if (!Array.isArray(contents)) return\r\n  for (let i = 0; i < contents.length; i++) {\r\n    const c = contents[i] as { role?: string; parts?: Array<Record<string, unknown>> } | null\r\n    if (!c || !Array.isArray(c.parts)) continue\r\n    const hasFunctionResponse = c.parts.some(p => p && typeof p === 'object' && 'functionResponse' in p)\r\n    const role = hasFunctionResponse ? 'user' : c.role\r\n    const parts = c.parts.filter(p => {\r\n      if (!p || typeof p !== 'object') return true\r\n      const hasFunctionCall = 'functionCall' in p\r\n      const hasText = 'text' in p && typeof (p as { text?: unknown }).text === 'string'\r\n      if ('thought' in p && !hasFunctionCall) return false\r\n      if ('thoughtSignature' in p && !hasFunctionCall && !hasText) return false\r\n      return true\r\n    })\r\n    contents[i] = { ...c, role, parts }\r\n  }\r\n}\r\n\r\n/** Deterministic session ID from the first user message, for dedup. */\r\nfunction _stableSessionId(request: Record<string, unknown>): string {\r\n  const contents = request.contents as Array<{ role?: string; parts?: Array<{ text?: string }> }> | undefined\r\n  if (Array.isArray(contents)) {\r\n    for (const c of contents) {\r\n      if (c.role === 'user' && c.parts?.[0]?.text) {\r\n        // Simple hash \u2014 doesn't need to be cryptographic, just stable.\r\n        let h = 0\r\n        for (const ch of c.parts[0].text) {\r\n          h = ((h << 5) - h + ch.charCodeAt(0)) | 0\r\n        }\r\n        return '-' + Math.abs(h).toString()\r\n      }\r\n    }\r\n  }\r\n  return '-' + Math.floor(Math.random() * 9e18).toString()\r\n}\r\n\r\n/** Random project ID fallback matching CLIProxyAPI's generateProjectID(). */\r\nfunction _randomProjectId(): string {\r\n  const adj = ['useful', 'bright', 'swift', 'calm', 'bold']\r\n  const noun = ['fuze', 'wave', 'spark', 'flow', 'core']\r\n  const a = adj[Math.floor(Math.random() * adj.length)]\r\n  const n = noun[Math.floor(Math.random() * noun.length)]\r\n  const r = randomUUID().slice(0, 5).toLowerCase()\r\n  return `${a}-${n}-${r}`\r\n}\r\n\r\n/**\r\n * Unwrap a single Code Assist non-streaming response into standard Gemini shape.\r\n */\r\nexport function unwrapCodeAssistResponse(\r\n  caResponse: unknown,\r\n): GeminiGenerateContentResponse {\r\n  if (!caResponse || typeof caResponse !== 'object') return {}\r\n  const wrapped = caResponse as { response?: GeminiGenerateContentResponse }\r\n  return wrapped.response ?? {}\r\n}\r\n\r\n/**\r\n * Pre-warm Code Assist onboarding for both executors. Call this during\r\n * boot to eliminate the onboarding round-trip from the first real request.\r\n * Non-blocking \u2014 fires in the background and caches the project ID.\r\n */\r\nexport function warmupCodeAssist(\r\n  cliToken?: string,\r\n  antigravityToken?: string,\r\n): void {\r\n  if (cliToken) {\r\n    ensureCodeAssistReady(cliToken, 'cli').catch(() => {})\r\n  }\r\n  if (antigravityToken) {\r\n    ensureCodeAssistReady(antigravityToken, 'antigravity').catch(() => {})\r\n  }\r\n}\r\n\r\n/**\r\n * Parse a Code Assist SSE stream and yield unwrapped Gemini chunks.\r\n *\r\n * Handles two emission shapes the upstream proxy uses interchangeably:\r\n *   1. Per-line: one full JSON event per `data:` line (the classic\r\n *      Antigravity / Code Assist format). Yielded immediately so the UI\r\n *      streams as the bytes arrive \u2014 waiting for a blank-line separator\r\n *      stalls Antigravity, which doesn't always send one.\r\n *   2. Multi-line: a single JSON event split across consecutive `data:`\r\n *      lines, terminated by a blank line. We accumulate fragments until\r\n *      the joined payload parses (or the blank line forces a flush).\r\n *\r\n * Strategy: push each `data:` line into an accumulator and eagerly try\r\n * to JSON.parse the joined buffer. A successful parse yields and resets\r\n * the accumulator (handling shape 1); a failure keeps buffering until a\r\n * later fragment closes the JSON (handling shape 2). Blank lines and\r\n * end-of-stream flush whatever remains.\r\n */\r\nexport async function* parseCodeAssistSSE(\r\n  body: ReadableStream<Uint8Array>,\r\n): AsyncGenerator<GeminiStreamChunk> {\r\n  const reader = body.getReader()\r\n  const decoder = new TextDecoder()\r\n  let buffer = ''\r\n  let dataLines: string[] = []\r\n\r\n  const tryParseAccumulator = (): { done: boolean; chunks: GeminiStreamChunk[] } => {\r\n    if (dataLines.length === 0) return { done: false, chunks: [] }\r\n\r\n    const payload = dataLines.join('\\n').trim()\r\n    if (!payload) {\r\n      dataLines = []\r\n      return { done: false, chunks: [] }\r\n    }\r\n    if (payload === '[DONE]') {\r\n      dataLines = []\r\n      return { done: true, chunks: [] }\r\n    }\r\n\r\n    try {\r\n      const wrapped = JSON.parse(payload) as {\r\n        response?: GeminiStreamChunk\r\n      }\r\n      dataLines = []\r\n      return {\r\n        done: false,\r\n        chunks: wrapped.response ? [wrapped.response] : [],\r\n      }\r\n    } catch {\r\n      return { done: false, chunks: [] }\r\n    }\r\n  }\r\n\r\n  const flushEvent = (): { done: boolean; chunks: GeminiStreamChunk[] } => {\r\n    const result = tryParseAccumulator()\r\n    // Force-clear on flush so a malformed accumulated payload can't poison\r\n    // the next event.\r\n    dataLines = []\r\n    return result\r\n  }\r\n\r\n  const processLine = (rawLine: string): { done: boolean; chunks: GeminiStreamChunk[] } => {\r\n    const line = rawLine.endsWith('\\r') ? rawLine.slice(0, -1) : rawLine\r\n\r\n    if (line.trim() === '') {\r\n      return flushEvent()\r\n    }\r\n\r\n    if (!line.startsWith('data:')) {\r\n      return { done: false, chunks: [] }\r\n    }\r\n\r\n    const value = line.slice(5)\r\n    dataLines.push(value.startsWith(' ') ? value.slice(1) : value)\r\n    return tryParseAccumulator()\r\n  }\r\n\r\n  try {\r\n    while (true) {\r\n      const { done, value } = await reader.read()\r\n      if (done) break\r\n\r\n      buffer += decoder.decode(value, { stream: true })\r\n\r\n      // SSE may deliver payload lines across chunks. Commit complete lines\r\n      // here; processLine yields per-line events eagerly and accumulates\r\n      // multi-line ones until they parse.\r\n      const lines = buffer.split('\\n')\r\n      buffer = lines.pop() ?? ''\r\n\r\n      for (const rawLine of lines) {\r\n        const event = processLine(rawLine)\r\n        if (event.done) return\r\n        for (const chunk of event.chunks) {\r\n          yield chunk\r\n        }\r\n      }\r\n    }\r\n\r\n    buffer += decoder.decode()\r\n\r\n    if (buffer) {\r\n      for (const rawLine of buffer.split('\\n')) {\r\n        const event = processLine(rawLine)\r\n        if (event.done) return\r\n        for (const chunk of event.chunks) {\r\n          yield chunk\r\n        }\r\n      }\r\n    }\r\n\r\n    const event = flushEvent()\r\n    if (event.done) return\r\n    for (const chunk of event.chunks) {\r\n      yield chunk\r\n    }\r\n  } finally {\r\n    reader.releaseLock()\r\n  }\r\n}\r\n", "/**\r\n * Gemini context cache manager.\r\n *\r\n * Gemini 2.5+ exposes a `cachedContents` API that lets you pre-cache a\r\n * system prompt + tool schemas once and then reference them by name in\r\n * subsequent `generateContent` calls. The cached portion is billed at a\r\n * steep discount (~75% off input token cost), which is a real win for\r\n * agent-loop workloads where the same ~5 KB system prompt is sent on\r\n * every turn.\r\n *\r\n * This module:\r\n *   - computes a stable key from (model + systemInstruction + tools)\r\n *   - keeps an in-memory Map of {key \u2192 cacheName} with a 5-minute TTL\r\n *     that matches Gemini's server-side TTL default\r\n *   - creates a new cache lazily when a request exceeds the size threshold\r\n *   - proactively refreshes the cache in background before TTL expiry\r\n *   - tracks failures with a short cooldown so we don't hammer the API\r\n *     with \"too small\" requests\r\n *   - provides `invalidateCache(cacheName)` so the provider can drop a\r\n *     stale entry when a request returns 404/expired\r\n *   - exposes `getCacheStats()` for diagnostics\r\n *\r\n * IMPORTANT: this is currently API-key-path-only. Google's Code Assist\r\n * proxy (used for OAuth-scope-cloud-platform tokens) does not expose a\r\n * verified cachedContents endpoint, so OAuth users still send the system\r\n * prompt inline every turn. That's a known limitation, not a regression.\r\n */\r\n\r\nimport { createHash } from 'crypto'\r\n\r\ninterface CacheEntry {\r\n  cacheName: string // \"cachedContents/xxxxx\"\r\n  expiresAt: number // epoch ms\r\n  model: string\r\n}\r\n\r\ninterface CacheMiss {\r\n  reason: 'too_small' | 'unsupported' | 'error'\r\n  retryAfter: number // epoch ms - don't retry until after this\r\n}\r\n\r\nexport interface CacheLookupResult {\r\n  cacheName: string\r\n  createdTokens: number\r\n}\r\n\r\n// Server-side TTL is set to 600s (10 min) for breathing room. We expire\r\n// locally at 5 min (300s) so we never reference a server cache that just\r\n// died \u2014 the extra 5 min server-side gives the refresh cycle time to\r\n// create a replacement before the old one expires.\r\nconst CACHE_TTL_MS = 5 * 60 * 1000\r\n\r\n// Proactively refresh the cache when less than this much TTL remains.\r\n// This prevents the gap where the old cache expires before the new one\r\n// is ready, which would force one request to pay full input cost.\r\nconst REFRESH_THRESHOLD_MS = 60_000\r\n\r\n// Cooldown after a \"too small\" miss \u2014 the payload size won't change\r\n// between turns, so a longer cooldown is fine.\r\nconst MISS_COOLDOWN_TOO_SMALL_MS = 120_000\r\n\r\n// Cooldown after a transient error \u2014 shorter so we recover quickly.\r\nconst MISS_COOLDOWN_ERROR_MS = 15_000\r\n\r\n// Minimum payload size before we even attempt to cache. Gemini rejects\r\n// small caches with a hard error; skipping the round trip saves latency.\r\n// 8 KB chars \u2248 ~2 K tokens. Raised from 4096 to avoid micro-caches that\r\n// cost more in round-trips than they save. With the stable/volatile split,\r\n// the stable portion is always large enough for meaningful caching.\r\nconst MIN_CACHE_SIZE_CHARS = 8192\r\n\r\n/**\r\n * Models that support context caching. Covers the full Gemini 2.5+ and\r\n * 3.x families. Image/audio/TTS models are intentionally excluded \u2014\r\n * they don't ingest a long system prompt in the first place.\r\n *\r\n * Uses a prefix-match strategy so new model variants (e.g.\r\n * gemini-2.5-pro-001, gemini-3.1-pro-preview-v2) are picked up\r\n * automatically without needing a code change.\r\n */\r\nconst CACHE_CAPABLE_MODEL_PREFIXES = [\r\n  'gemini-2.5-pro',\r\n  'gemini-2.5-flash',\r\n  'gemini-3-pro',\r\n  'gemini-3-flash',\n  'gemini-3.1-pro',\n  'gemini-3.1-flash',\n  'gemini-3.5-flash',\n]\n\r\n// In-process stores. Per-process is correct here \u2014 caches are tied to\r\n// the API key, not to the user identity beyond that.\r\nconst _caches = new Map<string, CacheEntry>()\r\nconst _misses = new Map<string, CacheMiss>()\r\n\r\n// Diagnostic counters\r\nconst _stats = { hits: 0, misses: 0, creates: 0, refreshes: 0, errors: 0 }\r\n\r\n// Track in-flight background refreshes to avoid duplicate work.\r\nconst _pendingRefreshes = new Set<string>()\r\n\r\nfunction supportsCaching(model: string): boolean {\r\n  const lower = model.toLowerCase()\r\n  return CACHE_CAPABLE_MODEL_PREFIXES.some(p => lower.startsWith(p))\r\n}\r\n\r\nfunction computeKey(\r\n  model: string,\r\n  systemInstruction: unknown,\r\n  tools: unknown,\r\n): string {\r\n  const hash = createHash('sha256')\r\n  hash.update(model)\r\n  hash.update('|')\r\n  hash.update(JSON.stringify(systemInstruction ?? null))\r\n  hash.update('|')\r\n  hash.update(JSON.stringify(tools ?? null))\r\n  return hash.digest('hex')\r\n}\r\n\r\nfunction approxSize(systemInstruction: unknown, tools: unknown): number {\r\n  return (\r\n    JSON.stringify(systemInstruction ?? '').length +\r\n    JSON.stringify(tools ?? '').length\r\n  )\r\n}\r\n\r\n/**\r\n * Build the headers for cache API calls. Uses x-goog-api-key header\r\n * instead of URL query param \u2014 more secure (avoids logging the key in\r\n * server access logs and proxy caches).\r\n */\r\nfunction _cacheHeaders(apiKey: string): Record<string, string> {\r\n  return {\r\n    'Content-Type': 'application/json',\r\n    'x-goog-api-key': apiKey,\r\n    'Connection': 'keep-alive',\r\n  }\r\n}\r\n\r\n/**\r\n * Create a cache entry on the server. Returns the cache name on success,\r\n * null on failure. Updates _misses on failure for cooldown tracking.\r\n */\r\nasync function _createCacheOnServer(\r\n  key: string,\r\n  args: GetOrCreateCacheArgs,\r\n): Promise<CacheLookupResult | null> {\r\n  const { model, baseUrl, apiKey, systemInstruction, tools } = args\r\n  try {\r\n    const body: Record<string, unknown> = {\r\n      model: `models/${model}`,\r\n      ttl: '600s',\r\n    }\r\n    if (systemInstruction) body.systemInstruction = systemInstruction\r\n    if (tools) body.tools = tools\r\n\r\n    const response = await fetch(\r\n      `${baseUrl}/cachedContents`,\r\n      {\r\n        method: 'POST',\r\n        headers: _cacheHeaders(apiKey),\r\n        body: JSON.stringify(body),\r\n      },\r\n    )\r\n\r\n    if (!response.ok) {\r\n      const errText = await response.text().catch(() => '')\r\n      const isTooSmall =\r\n        errText.toLowerCase().includes('minimum') ||\r\n        errText.toLowerCase().includes('too small')\r\n      _misses.set(key, {\r\n        reason: isTooSmall ? 'too_small' : 'error',\r\n        retryAfter: Date.now() + (isTooSmall ? MISS_COOLDOWN_TOO_SMALL_MS : MISS_COOLDOWN_ERROR_MS),\r\n      })\r\n      _stats.errors++\r\n      return null\r\n    }\r\n\r\n    const data = (await response.json()) as {\r\n      name?: string\r\n      usageMetadata?: {\r\n        totalTokenCount?: number\r\n        promptTokenCount?: number\r\n      }\r\n    }\r\n    if (!data.name) {\r\n      _misses.set(key, {\r\n        reason: 'error',\r\n        retryAfter: Date.now() + MISS_COOLDOWN_ERROR_MS,\r\n      })\r\n      _stats.errors++\r\n      return null\r\n    }\r\n\r\n    _caches.set(key, {\r\n      cacheName: data.name,\r\n      expiresAt: Date.now() + CACHE_TTL_MS,\r\n      model,\r\n    })\r\n    return {\r\n      cacheName: data.name,\r\n      createdTokens:\r\n        data.usageMetadata?.totalTokenCount\r\n        ?? data.usageMetadata?.promptTokenCount\r\n        ?? 0,\r\n    }\r\n  } catch {\r\n    _misses.set(key, {\r\n      reason: 'error',\r\n      retryAfter: Date.now() + MISS_COOLDOWN_ERROR_MS,\r\n    })\r\n    _stats.errors++\r\n    return null\r\n  }\r\n}\r\n\r\n/**\r\n * Proactively refresh a cache entry in the background before it expires.\r\n * Fire-and-forget \u2014 the current request uses the still-valid old cache\r\n * while this creates a replacement that will be ready for the next turn.\r\n */\r\nfunction _refreshInBackground(args: GetOrCreateCacheArgs, key: string): void {\r\n  if (_pendingRefreshes.has(key)) return\r\n  _pendingRefreshes.add(key)\r\n  _stats.refreshes++\r\n\r\n  _createCacheOnServer(key, args)\r\n    .catch(() => {})\r\n    .finally(() => _pendingRefreshes.delete(key))\r\n}\r\n\r\nexport interface GetOrCreateCacheArgs {\r\n  model: string\r\n  /** Base URL for the Gemini v1beta endpoint (API-key path only). */\r\n  baseUrl: string\r\n  apiKey: string\r\n  systemInstruction: unknown\r\n  tools: unknown\r\n}\r\n\r\n/**\r\n * Returns an existing cache name if valid, otherwise creates a new one.\r\n * Returns null if the request isn't cache-eligible (unsupported model,\r\n * too small, in cooldown, or creation failed). On null, the caller must\r\n * fall back to sending the system prompt + tools inline.\r\n *\r\n * When an existing cache is close to expiry (< REFRESH_THRESHOLD_MS),\r\n * a background refresh is triggered so the next request has a warm cache.\r\n */\r\nexport async function getOrCreateCacheWithUsage(\r\n  args: GetOrCreateCacheArgs,\r\n): Promise<CacheLookupResult | null> {\r\n  const { model, apiKey, systemInstruction, tools } = args\r\n\r\n  if (!supportsCaching(model)) return null\r\n  if (!apiKey) return null\r\n  if (approxSize(systemInstruction, tools) < MIN_CACHE_SIZE_CHARS) return null\r\n\r\n  const key = computeKey(model, systemInstruction, tools)\r\n\r\n  // Honor active miss cooldown.\r\n  const miss = _misses.get(key)\r\n  if (miss && Date.now() < miss.retryAfter) {\r\n    _stats.misses++\r\n    return null\r\n  }\r\n  if (miss) _misses.delete(key)\r\n\r\n  // Return existing cache if still valid.\r\n  const existing = _caches.get(key)\r\n  if (existing && Date.now() < existing.expiresAt) {\r\n    _stats.hits++\r\n    // Proactively refresh when close to expiry so the next request\r\n    // doesn't pay full input cost while waiting for a new cache.\r\n    const remaining = existing.expiresAt - Date.now()\r\n    if (remaining < REFRESH_THRESHOLD_MS) {\r\n      _refreshInBackground(args, key)\r\n    }\r\n    return { cacheName: existing.cacheName, createdTokens: 0 }\r\n  }\r\n  if (existing) _caches.delete(key)\r\n\r\n  // Create a new cache.\r\n  _stats.creates++\r\n  return _createCacheOnServer(key, args)\r\n}\r\n\r\nexport async function getOrCreateCache(\r\n  args: GetOrCreateCacheArgs,\r\n): Promise<string | null> {\r\n  return (await getOrCreateCacheWithUsage(args))?.cacheName ?? null\r\n}\r\n\r\n/**\r\n * Drop a cache entry from the map \u2014 call this when a request using this\r\n * cache name returned 404/expired so the next call creates a fresh one.\r\n */\r\nexport function invalidateCache(cacheName: string): void {\r\n  for (const [key, entry] of _caches.entries()) {\r\n    if (entry.cacheName === cacheName) {\r\n      _caches.delete(key)\r\n      return\r\n    }\r\n  }\r\n}\r\n\r\n/**\r\n * Pre-warm the cache for a given model + system prompt + tools combo.\r\n * Called during provider initialization to ensure the first real request\r\n * gets a cache hit. Non-blocking \u2014 returns immediately.\r\n */\r\nexport function warmCache(args: GetOrCreateCacheArgs): void {\r\n  if (!supportsCaching(args.model)) return\r\n  if (!args.apiKey) return\r\n  if (approxSize(args.systemInstruction, args.tools) < MIN_CACHE_SIZE_CHARS) return\r\n  // Fire and forget \u2014 don't block the caller.\r\n  getOrCreateCache(args).catch(() => {})\r\n}\r\n\r\n/** Diagnostic counters for cache performance. */\r\nexport function getCacheStats(): { hits: number; misses: number; creates: number; refreshes: number; errors: number } {\r\n  return { ..._stats }\r\n}\r\n\r\n/** Test hook \u2014 clear all cache state. Not used in prod. */\r\nexport function _resetGeminiCacheStateForTests(): void {\r\n  _caches.clear()\r\n  _misses.clear()\r\n  _pendingRefreshes.clear()\r\n  _stats.hits = 0\r\n  _stats.misses = 0\r\n  _stats.creates = 0\r\n  _stats.refreshes = 0\r\n  _stats.errors = 0\r\n}\r\n", "/**\r\n * Google Gemini native REST provider.\r\n *\r\n * Uses the Gemini REST API directly (no SDK dependency).\r\n * Supports both API key auth (x-goog-api-key header) and OAuth Bearer token.\r\n *\r\n * Endpoints:\r\n *   Streaming:     POST /v1beta/models/{model}:streamGenerateContent?alt=sse\r\n *   Non-streaming: POST /v1beta/models/{model}:generateContent\r\n *   Model list:    GET  /v1beta/models\r\n *\r\n * Optimizations:\r\n *   - API key sent via x-goog-api-key header (not URL param) for security\r\n *   - Connection: keep-alive on all requests for connection reuse\r\n *   - Sliding-window rate limiter to avoid hitting 429s\r\n *   - Context caching with proactive background refresh\r\n */\r\n\r\nimport {\r\n  BaseProvider,\r\n  buildProviderStreamResult,\r\n  type AnthropicMessage,\r\n  type ModelInfo,\r\n  type ProviderConfig,\r\n  type ProviderRequestParams,\r\n  type ProviderStreamResult,\r\n  type SystemBlock,\r\n} from './base_provider.js'\r\nimport { anthropicToGeminiRequest } from '../adapters/anthropic_to_gemini.js'\r\nimport {\r\n  geminiStreamToAnthropicEvents,\r\n  geminiMessageToAnthropic,\r\n  parseGeminiSSE,\r\n  type GeminiGenerateContentResponse,\r\n} from '../adapters/gemini_to_anthropic.js'\r\nimport {\n  ANTIGRAVITY_MODELS,\n  GEMINI_TIER_FREE,\n  GEMINI_TIER_LEGACY,\n  ensureCodeAssistReady,\n  executorForModel,\r\n  getGeminiEntitledModelIds,\r\n  getGeminiTier,\r\n  hasPaidEntitlement,\r\n  isPaidGeminiTier,\r\n  parseCodeAssistSSE,\r\n  unwrapCodeAssistResponse,\r\n  wrapForCodeAssist,\r\n  wrapForGeminiCLI,\n  geminiCLIApiHeaders,\n  antigravityApiHeaders,\n  codeAssistGenerationBases,\n  clearCodeAssistCache,\n} from './gemini_code_assist.js'\nimport { getOrCreateCache, invalidateCache } from './gemini_cache.js'\r\nimport { getProviderModelSet } from '../../../utils/model/configs.js'\r\nimport { getGlobalConfig, saveGlobalConfig } from '../../../utils/config.js'\r\n\r\n/**\r\n * Hardcoded Pro-model id set \u2014 anything that is *not* a flash variant\r\n * routed through the CLI executor. Used by the success-path latch in\r\n * `stream`/`create` to auto-record paid entitlement. Stays in sync with\r\n * `GEMINI_CLI_PRO_MODELS` below.\r\n */\r\nconst GEMINI_PRO_MODEL_IDS = new Set([\r\n  'gemini-3.1-pro-preview',\r\n  'gemini-2.5-pro',\r\n])\r\n\r\nfunction antigravitySessionHeaders(wrappedBody: Record<string, unknown>): Record<string, string> {\r\n  const request = wrappedBody.request as { sessionId?: unknown } | undefined\r\n  return typeof request?.sessionId === 'string'\r\n    ? { 'X-Machine-Session-Id': request.sessionId }\r\n    : {}\r\n}\r\n\r\n/**\r\n * Resolve the persistent \"show Pro models\" decision.\r\n *\r\n * Priority:\r\n *   1. `GEMINI_SHOW_PRO_MODELS` env var when explicitly set ('true' or\r\n *      'false'). The decision is also persisted to global config so the\r\n *      user only configures it once per machine.\r\n *   2. The persisted `geminiShowProModels` flag in global config.\r\n *   3. `null` \u2014 caller should fall back to live-detection (entitled-id\r\n *      list / tier id from Code Assist).\r\n *\r\n * Persisting on env-var read means a one-shot\r\n * `GEMINI_SHOW_PRO_MODELS=true claudex` permanently flips the toggle on\r\n * that machine; subsequent launches don't need the env var. The user can\r\n * undo this with `GEMINI_SHOW_PRO_MODELS=false`.\r\n */\r\nexport function resolvePersistedShowPro(): boolean | null {\r\n  const env = process.env.GEMINI_SHOW_PRO_MODELS\r\n  if (env === 'true' || env === 'false') {\r\n    const value = env === 'true'\r\n    const persisted = getGlobalConfig().geminiShowProModels\r\n    if (persisted !== value) {\r\n      try {\r\n        saveGlobalConfig(c => ({ ...c, geminiShowProModels: value }))\r\n      } catch {\r\n        // Best-effort persistence; the env var still applies this run.\r\n      }\r\n    }\r\n    return value\r\n  }\r\n  const persisted = getGlobalConfig().geminiShowProModels\r\n  return typeof persisted === 'boolean' ? persisted : null\r\n}\r\n\r\n/**\r\n * Latch the \"user has paid Gemini access\" flag in global config the first\r\n * time a Pro Gemini model call succeeds. Idempotent \u2014 only writes when\r\n * the flag isn't already set. This is the auto-discovery path: even\r\n * users who never set GEMINI_SHOW_PRO_MODELS will get Pro models in the\r\n * picker on the next session as long as one Pro chat goes through.\r\n */\r\nfunction latchProEntitlementOnSuccess(model: string): void {\r\n  if (!GEMINI_PRO_MODEL_IDS.has(model)) return\r\n  if (getGlobalConfig().geminiShowProModels === true) return\r\n  try {\r\n    saveGlobalConfig(c =>\r\n      c.geminiShowProModels === true ? c : { ...c, geminiShowProModels: true },\r\n    )\r\n  } catch {\r\n    // Persistence is best-effort; failure here just means we'll retry\r\n    // on the next successful Pro call.\r\n  }\r\n}\r\n\r\n/**\r\n * Parse a Gemini 429 error body to extract the reset duration in seconds.\r\n *\r\n * Gemini exposes reset duration in multiple spots on the 429 payload:\r\n *   - Free-text: \"retry in 12.5s\", \"reset after 1h2m3s\", \"reset after 45s\"\r\n *   - Embedded QuotaFailure violation: \"retryDelay\": \"12s\"\r\n *   - ErrorInfo metadata:           \"retryDelay\": \"12s\"\r\n *\r\n * Returns the duration in seconds, or null if nothing parseable is present.\r\n * Callers use > 300s (5 min) as the threshold separating a per-minute rate\r\n * limit from real daily/weekly quota exhaustion.\r\n */\r\nfunction _parseGeminiResetDuration(body: string): number | null {\r\n  if (!body) return null\r\n\r\n  // \"retry in 12.5s\" / \"retry after 12s\"\r\n  const retryIn = body.match(/retry (?:in|after) ([\\d.]+)\\s*s/i)\r\n  if (retryIn) {\r\n    const v = parseFloat(retryIn[1])\r\n    if (!isNaN(v)) return v\r\n  }\r\n\r\n  // \"retryDelay\": \"12s\" (JSON string form)\r\n  const retryDelayJson = body.match(/\"retryDelay\"\\s*:\\s*\"(\\d+(?:\\.\\d+)?)s\"/i)\r\n  if (retryDelayJson) {\r\n    const v = parseFloat(retryDelayJson[1])\r\n    if (!isNaN(v)) return v\r\n  }\r\n\r\n  // \"reset after 1h2m3s\" / \"reset after 2h\" / \"reset after 45s\" / \"reset after 10m\"\r\n  const resetAfter = body.match(/reset after ((?:\\d+h)?(?:\\d+m)?(?:\\d+s)?)/i)\r\n  if (resetAfter && resetAfter[1]) {\r\n    const dur = resetAfter[1]\r\n    const h = dur.match(/(\\d+)h/)\r\n    const m = dur.match(/(\\d+)m/)\r\n    const s = dur.match(/(\\d+)s/)\r\n    let total = 0\r\n    if (h) total += parseInt(h[1], 10) * 3600\r\n    if (m) total += parseInt(m[1], 10) * 60\r\n    if (s) total += parseInt(s[1], 10)\r\n    if (total > 0) return total\r\n  }\r\n\r\n  return null\r\n}\r\n\r\n// \u2500\u2500\u2500 Rate Limiter \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n// Simple sliding-window rate limiter. Tracks request timestamps and\r\n// enforces a maximum RPM (requests per minute). When the limit is\r\n// approached, inserts a short delay to spread requests evenly instead\r\n// of bursting and getting 429'd.\r\n\r\n// Free-tier RPM limits per model family (as of 2026-04):\r\n//   flash-lite: 5 RPM, flash: 10 RPM, pro: 5 RPM\r\n// OAuth (Code Assist) tier is higher \u2014 30+ RPM.\r\n// Default to a safe free-tier value. OAuth users get auto-upgraded\r\n// in the constructor when we detect they have a token.\r\nconst DEFAULT_RPM_FREE = 5     // Safe for all free-tier models\r\nconst DEFAULT_RPM_OAUTH = 30   // Code Assist / Antigravity tier\r\nconst _requestTimestamps: number[] = []\r\n\r\n/** Sleep for ms. */\r\nfunction _sleep(ms: number): Promise<void> {\r\n  return new Promise(r => setTimeout(r, ms))\r\n}\r\n\r\n/**\r\n * Wait if needed to stay under the RPM limit. Returns immediately\r\n * if the window has capacity. Otherwise waits until the oldest\r\n * request in the window expires.\r\n */\r\nasync function _throttle(rpm: number = DEFAULT_RPM_FREE): Promise<void> {\r\n  const now = Date.now()\r\n  const windowMs = 60_000\r\n\r\n  // Prune old entries outside the window.\r\n  while (_requestTimestamps.length > 0 && _requestTimestamps[0]! < now - windowMs) {\r\n    _requestTimestamps.shift()\r\n  }\r\n\r\n  if (_requestTimestamps.length >= rpm) {\r\n    // Wait until the oldest request leaves the window.\r\n    const waitMs = _requestTimestamps[0]! + windowMs - now + 50 // +50ms margin\r\n    if (waitMs > 0) {\r\n      await _sleep(waitMs)\r\n    }\r\n  }\r\n\r\n  _requestTimestamps.push(Date.now())\r\n}\r\n\r\n// Models reachable via the two OAuth executors:\r\n//\r\n// 1. Gemini CLI executor (google_oauth 'cli' token) \u2014 free-tier flash/lite\r\n//    models with good rate limits. Needs User-Agent=GeminiCLI/...\r\n//\r\n// 2. Antigravity executor (google_oauth 'antigravity' token) \u2014 pro models\r\n//    with Antigravity quota pool. Needs body.userAgent=\"antigravity\".\r\n//\r\n// Both route through the Code Assist proxy at cloudcode-pa.googleapis.com.\r\n// The curated lists below are split by executor so the provider can show\r\n// only the models the user actually has tokens for.\r\n\r\n/**\r\n * Flash/lite models the Gemini CLI OAuth executor exposes to free-tier\r\n * accounts. Exported so the lane and the legacy provider share the same\r\n * source of truth \u2014 and so the strict tier-filtering logic in\r\n * `resolveCliModelsForPicker` returns this list for free users instead\r\n * of mixing flash with Pro.\r\n */\r\nexport const GEMINI_CLI_FLASH_MODELS: ModelInfo[] = [\r\n  { id: 'gemini-3-flash-preview',              name: 'Gemini 3 Flash (preview)' },\r\n  { id: 'gemini-3.1-flash-lite-preview',       name: 'Gemini 3.1 Flash Lite (preview)' },\r\n  { id: 'gemini-2.5-flash',                    name: 'Gemini 2.5 Flash' },\r\n  { id: 'gemini-2.5-flash-lite',               name: 'Gemini 2.5 Flash Lite' },\r\n]\r\n\r\n/**\r\n * Pro/preview models that paid Google CLI accounts (standard-tier and\r\n * higher) can call through the Code Assist proxy on top of the flash/\r\n * lite list above. These IDs are NOT in ANTIGRAVITY_MODEL_IDS, so\n * `executorForModel` keeps them on the CLI executor \u2014 no Antigravity\r\n * token needed. Free-tier accounts never see these because their\r\n * tier id is `free-tier` (or `legacy-tier`) and the picker filters\r\n * them out.\r\n *\r\n * Exported because the native gemini lane (`src/lanes/gemini/api.ts`)\r\n * runs its own `listModels` and must surface the same Pro models \u2014 the\r\n * legacy provider path is only used as a fallback when the lane is\r\n * disabled, so duplicating the catalog there would silently regress\r\n * the picker for default (lanes-on) users.\r\n */\r\nexport const GEMINI_CLI_PRO_MODELS: ModelInfo[] = [\r\n  { id: 'gemini-3.1-pro-preview', name: 'Gemini 3.1 Pro (preview)', tags: ['pro'] },\r\n  { id: 'gemini-2.5-pro',         name: 'Gemini 2.5 Pro',           tags: ['pro'] },\r\n]\r\n\r\n/**\r\n * Decide which Pro models to show for the Gemini CLI executor based on\r\n * the user's current entitlement. Single source of truth for both the\r\n * legacy provider's `listModels` and the native gemini lane's\r\n * `listModels` so the picker stays consistent regardless of whether\r\n * `CLAUDEX_NATIVE_LANES` is on.\r\n *\r\n * Detection priority \u2014 LIVE DATA WINS over the persisted flag:\r\n *   1. Persisted/env flag = false \u2192 explicit opt-out, hide Pro.\r\n *   2. `retrieveUserQuota.buckets[].modelId` from the cache populated\r\n *      by `ensureCodeAssistReady`:\r\n *        - Match against our Pro catalog \u2192 show those.\r\n *        - Generic entitlement check \u2192 show all Pro.\r\n *        - Buckets present but contain only flash \u2192 free user, hide\r\n *          Pro (this overrides any stale persisted \"true\" flag from a\r\n *          previous Pro-tier session \u2014 the bug that this priority\r\n *          ordering fixes).\r\n *   3. Cached tier id \u2192 paid tier shows Pro, explicit free/legacy\r\n *      hides Pro (again, overriding stale persisted \"true\").\r\n *   4. No live data at all (ghost-project 403) \u2192 fall back to\r\n *      persisted/env flag = true as the manual escape hatch.\r\n *   5. Default \u2192 hide Pro.\r\n *\r\n * Callers MUST trigger `ensureCodeAssistReady('cli')` before calling\r\n * this on a freshly-logged-in session \u2014 onboarding is what populates\r\n * the entitled-ids and tier caches this function reads from.\r\n */\r\nexport function resolveCliProModelsToShow(): ModelInfo[] {\r\n  const persisted = resolvePersistedShowPro()\r\n\r\n  // Explicit opt-out always wins, even when the user is paid.\r\n  if (persisted === false) return []\r\n\r\n  // Live entitlement (most reliable signal \u2014 gemini-cli's source of truth).\r\n  const entitledIds = getGeminiEntitledModelIds('cli')\r\n  if (entitledIds && entitledIds.length > 0) {\r\n    const entitledSet = new Set(entitledIds)\r\n    const matches = GEMINI_CLI_PRO_MODELS.filter(m => entitledSet.has(m.id))\r\n    if (matches.length > 0) return matches\r\n    if (hasPaidEntitlement(entitledIds)) return [...GEMINI_CLI_PRO_MODELS]\r\n    // Buckets exist but contain no Pro/preview ids \u2192 free account.\r\n    // Ignore any stale persisted \"true\" flag; live data is authoritative.\r\n    return []\r\n  }\r\n\r\n  // Live tier id \u2014 also authoritative when set.\r\n  const tier = getGeminiTier('cli')\r\n  if (tier === GEMINI_TIER_FREE || tier === GEMINI_TIER_LEGACY) return []\r\n  if (isPaidGeminiTier(tier)) return [...GEMINI_CLI_PRO_MODELS]\r\n\r\n  // No live data (ghost-project bug) \u2014 persisted \"true\" is the escape hatch.\r\n  if (persisted === true) return [...GEMINI_CLI_PRO_MODELS]\r\n  return []\r\n}\r\n\r\n/**\r\n * Pick the catalog the picker should show for the Gemini CLI executor.\r\n *\r\n *   - Free-tier accounts see flash/lite only.\r\n *   - Paid accounts see flash/lite **plus** the entitled Pro models on\r\n *     top \u2014 Pro users still want flash for cheap/fast tasks.\r\n *\r\n * Callers MUST trigger `ensureCodeAssistReady('cli')` first when they\r\n * have an OAuth token; entitlement detection reads the cache that call\r\n * populates.\r\n */\r\nexport function resolveCliModelsForPicker(): ModelInfo[] {\r\n  return [...GEMINI_CLI_FLASH_MODELS, ...resolveCliProModelsToShow()]\r\n}\r\n\r\n/**\n * Generative models that live on v1beta/models but are NOT chat-completion\n * capable \u2014 image/audio/TTS/video/embedding. The API-key path will surface\r\n * them with a descriptive suffix so users can tell at a glance they are not\r\n * candidates for general chat turns. OAuth users never see them because\r\n * Code Assist does not proxy these endpoints.\r\n */\r\n/** Check if a Gemini model is a text/chat model (not image gen, TTS, etc.). */\r\nfunction _isGeminiChatModel(id: string): boolean {\r\n  const lower = id.toLowerCase()\r\n  if (lower.includes('-tts')) return false\r\n  if (lower.includes('-image')) return false\r\n  if (lower.includes('-live') || lower.includes('-native-audio')) return false\r\n  if (lower.startsWith('veo-')) return false\r\n  if (lower.startsWith('lyria-')) return false\r\n  if (lower.includes('embedding')) return false\r\n  if (lower.includes('robotics')) return false\r\n  return true\r\n}\r\n\r\nfunction _enrichGeminiModelName(id: string, displayName: string): string {\r\n  const lower = id.toLowerCase()\r\n  if (lower.includes('-tts')) return `${displayName} \u00B7 TTS`\r\n  if (lower.includes('-image')) return `${displayName} \u00B7 image gen`\r\n  if (lower.includes('-live') || lower.includes('-native-audio')) return `${displayName} \u00B7 realtime audio`\r\n  if (lower.startsWith('veo-')) return `${displayName} \u00B7 video gen`\r\n  if (lower.startsWith('lyria-')) return `${displayName} \u00B7 music gen`\r\n  if (lower.includes('embedding')) return `${displayName} \u00B7 embeddings`\r\n  if (lower.includes('robotics')) return `${displayName} \u00B7 robotics`\r\n  return displayName\r\n}\r\n\r\n// \u2500\u2500\u2500 Gemini Payload Optimization \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n//\r\n// Token usage is the #1 cost driver. The full Tau payload\r\n// (system prompt + 40 tools + growing history) can hit 100K+ input\r\n// tokens per request \u2014 burning free-tier quotas in minutes.\r\n//\r\n// Optimization tiers:\r\n//   Pro:        No modification. Full payload, all tools. 1M context.\r\n//   Flash:      Trimmed system prompt, all tools, capped output.\r\n//   Flash-Lite: Aggressive \u2014 short prompt, core tools ONLY, truncated\r\n//               history, capped tool results. Every token counts.\r\n\r\nconst GEMINI_MAX_SYSTEM_CHARS_FLASH = 6000\r\nconst GEMINI_MAX_SYSTEM_CHARS_LITE = 3000\r\nconst GEMINI_MAX_OUTPUT_TOKENS_FLASH = 8192\r\nconst GEMINI_MAX_OUTPUT_TOKENS_LITE = 4096\r\nconst GEMINI_MAX_HISTORY_MESSAGES_LITE = 10  // Keep only last N messages for lite\r\nconst GEMINI_MAX_TOOL_RESULT_CHARS = 4000    // Cap individual tool results in history\r\n\r\n// Core tools that lite models get \u2014 everything else is stripped.\r\n// These are enough for basic coding tasks without burning tokens.\r\nconst CORE_TOOL_NAMES = new Set([\r\n  'Bash', 'Read', 'Write', 'Edit', 'Glob', 'Grep',\r\n])\r\n\r\n// \u2500\u2500\u2500 System Instruction Splitter \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n// The system prompt contains a boundary marker that separates static\r\n// content (instructions, tool descriptions, CLAUDE.md) from volatile\r\n// per-turn content (git status, current date, working dir, env info).\r\n//\r\n// For caching to work, we MUST hash only the stable part. Otherwise\r\n// the SHA-256 key changes every turn and the cache never hits.\r\n\r\nconst DYNAMIC_BOUNDARY = '__SYSTEM_PROMPT_DYNAMIC_BOUNDARY__'\r\n\r\n// Fallback patterns for volatile content when the boundary marker\r\n// is absent (e.g. older system prompt versions, custom prompts).\r\nconst VOLATILE_PATTERNS = [\r\n  /# currentDate\\n[^\\n]+/,          // Today's date is 2026-04-13\r\n  /gitStatus:.*?(?=\\n\\n|\\n#|$)/s,   // Git status block\r\n  /<env>[\\s\\S]*?<\\/env>/,           // Environment block\r\n  /Current branch:.*(?:\\n.*){0,10}/, // Branch + recent commits\r\n]\r\n\r\n/**\r\n * Split system instruction text into stable (cacheable) and volatile\r\n * (per-turn) portions. Uses the SYSTEM_PROMPT_DYNAMIC_BOUNDARY marker\r\n * when present, falls back to pattern matching.\r\n */\r\nfunction splitSystemInstruction(text: string): {\r\n  stable: string\r\n  volatile: string\r\n} {\r\n  // Primary: split at the explicit boundary marker\r\n  const idx = text.indexOf(DYNAMIC_BOUNDARY)\r\n  if (idx !== -1) {\r\n    const stable = text.slice(0, idx).trimEnd()\r\n    const volatile = text.slice(idx + DYNAMIC_BOUNDARY.length).trimStart()\r\n    return { stable, volatile }\r\n  }\r\n\r\n  // Fallback: extract known volatile patterns from the end of the prompt\r\n  let volatile = ''\r\n  let remaining = text\r\n  for (const pattern of VOLATILE_PATTERNS) {\r\n    const match = remaining.match(pattern)\r\n    if (match && match.index !== undefined) {\r\n      // Only extract if it's in the last 30% of the text (volatile content\r\n      // is always near the end \u2014 don't strip tool descriptions mid-prompt)\r\n      if (match.index > remaining.length * 0.7) {\r\n        volatile += (volatile ? '\\n\\n' : '') + match[0]\r\n        remaining = remaining.slice(0, match.index) + remaining.slice(match.index + match[0].length)\r\n      }\r\n    }\r\n  }\r\n\r\n  return {\r\n    stable: remaining.trimEnd(),\r\n    volatile: volatile.trim(),\r\n  }\r\n}\r\n\r\nexport class GeminiProvider extends BaseProvider {\r\n  readonly name = 'gemini'\r\n  private apiKey: string\r\n  private baseUrl: string\r\n  /** OAuth token from the Gemini CLI client (flash/lite models). */\r\n  private cliOAuthToken?: string\r\n  /** OAuth token from the Antigravity client (pro models). */\r\n  private antigravityOAuthToken?: string\r\n  /** RPM limit \u2014 auto-detected from rate limit headers or env override. */\r\n  private rpm: number\r\n\r\n  constructor(config: ProviderConfig & {\r\n    cliOAuthToken?: string\r\n    antigravityOAuthToken?: string\r\n    /** @deprecated Use cliOAuthToken / antigravityOAuthToken */\r\n    oauthToken?: string\r\n  }) {\r\n    super()\r\n    this.apiKey = config.apiKey\r\n    this.baseUrl = config.baseUrl ?? 'https://generativelanguage.googleapis.com/v1beta'\r\n    this.cliOAuthToken = config.cliOAuthToken\r\n    this.antigravityOAuthToken = config.antigravityOAuthToken\r\n    // Backwards compat: old single oauthToken \u2192 treat as antigravity\r\n    if (config.oauthToken && !config.antigravityOAuthToken) {\r\n      this.antigravityOAuthToken = config.oauthToken\r\n    }\r\n    // Rate limit: env override > auto-detect from auth tier > safe default.\r\n    // OAuth users (Code Assist / Antigravity) get higher RPM than API key free tier.\r\n    const defaultRpm = this.hasOAuth ? DEFAULT_RPM_OAUTH : DEFAULT_RPM_FREE\r\n    this.rpm = parseInt(process.env.GEMINI_RPM ?? '', 10) || defaultRpm\r\n  }\r\n\r\n  /**\r\n   * Optimize request params to control token usage.\r\n   *\r\n   * Antigravity (pro, flash, etc.): No modification. Full payload.\r\n   *   These have good quota through Antigravity \u2014 don't trim.\r\n   * Free-tier Flash:  Trimmed system prompt, capped output.\r\n   * Free-tier Lite:   Aggressive \u2014 short prompt, core tools only,\r\n   *                   truncated history, capped tool results.\r\n   */\r\n  private _optimizeParams(params: ProviderRequestParams): ProviderRequestParams {\r\n    if (process.env.PROVIDER_NO_OPTIMIZE === 'true') return params\r\n    const model = this.resolveModel(params.model)\r\n    const lower = model.toLowerCase()\r\n\r\n    // Antigravity models: full payload, no modification.\r\n    // These go through the Antigravity quota pool with high rate limits.\r\n    // Includes pro, flash, and image models on Antigravity.\r\n    if (lower.includes('pro')) return params\r\n    if (executorForModel(model) === 'antigravity') return params\r\n\r\n    const isLite = lower.includes('lite')\r\n    const maxSystemChars = isLite ? GEMINI_MAX_SYSTEM_CHARS_LITE : GEMINI_MAX_SYSTEM_CHARS_FLASH\r\n    const maxOutputTokens = isLite ? GEMINI_MAX_OUTPUT_TOKENS_LITE : GEMINI_MAX_OUTPUT_TOKENS_FLASH\r\n\r\n    let result: ProviderRequestParams = {\r\n      ...params,\r\n      system: this._trimSystem(params.system, maxSystemChars),\r\n      max_tokens: Math.min(params.max_tokens, maxOutputTokens),\r\n    }\r\n\r\n    // Lite models: filter to core tools only (saves ~20K tokens)\r\n    if (isLite && result.tools) {\r\n      result = {\r\n        ...result,\r\n        tools: result.tools.filter(t => CORE_TOOL_NAMES.has(t.name)),\r\n      }\r\n    }\r\n\r\n    // Lite models: truncate conversation history (saves 10-80K tokens)\r\n    if (isLite && result.messages.length > GEMINI_MAX_HISTORY_MESSAGES_LITE) {\r\n      result = {\r\n        ...result,\r\n        messages: result.messages.slice(-GEMINI_MAX_HISTORY_MESSAGES_LITE),\r\n      }\r\n    }\r\n\r\n    // All flash/lite: cap tool result sizes in history\r\n    result = {\r\n      ...result,\r\n      messages: this._truncateToolResults(result.messages),\r\n    }\r\n\r\n    return result\r\n  }\r\n\r\n  /** Trim system prompt to maxChars, breaking at paragraph boundaries. */\r\n  private _trimSystem(\r\n    system: string | SystemBlock[] | undefined,\r\n    maxChars: number,\r\n  ): string | SystemBlock[] | undefined {\r\n    if (!system) return system\r\n    const fullText = typeof system === 'string'\r\n      ? system\r\n      : system.map(s => s.text).join('\\n\\n')\r\n    if (fullText.length <= maxChars) return system\r\n    let cutPoint = maxChars\r\n    const lastBreak = fullText.lastIndexOf('\\n\\n', cutPoint)\r\n    if (lastBreak > maxChars * 0.7) cutPoint = lastBreak\r\n    const trimmed = fullText.slice(0, cutPoint)\r\n    if (typeof system === 'string') return trimmed\r\n    return [{ type: 'text' as const, text: trimmed }]\r\n  }\r\n\r\n  /**\r\n   * Truncate large tool results in conversation history.\r\n   * A single `cat` of a big file can add 20K+ tokens to every\r\n   * subsequent request. Cap each result to keep history lean.\r\n   */\r\n  private _truncateToolResults(\r\n    messages: ProviderRequestParams['messages'],\r\n  ): ProviderRequestParams['messages'] {\r\n    return messages.map(msg => {\r\n      if (typeof msg.content === 'string') return msg\r\n      const newContent = msg.content.map(block => {\r\n        if (block.type !== 'tool_result') return block\r\n        const text = typeof block.content === 'string' ? block.content : ''\r\n        if (text.length <= GEMINI_MAX_TOOL_RESULT_CHARS) return block\r\n        return {\r\n          ...block,\r\n          content: text.slice(0, GEMINI_MAX_TOOL_RESULT_CHARS) +\r\n            `\\n\\n[... truncated ${text.length - GEMINI_MAX_TOOL_RESULT_CHARS} chars to save tokens]`,\r\n        }\r\n      })\r\n      return { ...msg, content: newContent }\r\n    })\r\n  }\r\n\r\n  /** True if any OAuth token is available. */\r\n  private get hasOAuth(): boolean {\r\n    return !!(this.cliOAuthToken || this.antigravityOAuthToken)\r\n  }\r\n\r\n  /**\r\n   * Build headers for API-key-path requests. Uses x-goog-api-key header\r\n   * instead of URL query param \u2014 avoids key appearing in server access\r\n   * logs, proxy caches, and browser history.\r\n   */\r\n  private _apiKeyHeaders(): Record<string, string> {\r\n    return {\r\n      'Content-Type': 'application/json',\r\n      'x-goog-api-key': this.apiKey,\r\n      'Connection': 'keep-alive',\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Pick the right OAuth token for a model. Falls back to the other\r\n   * token if the preferred one is missing (the API will reject if the\r\n   * model isn't available on that executor \u2014 better than a client error).\r\n   * Returns null if no OAuth tokens are stored at all.\r\n   */\r\n  private _tokenForModel(model: string): string | null {\r\n    const executor = executorForModel(model)\r\n    if (executor === 'antigravity') {\r\n      return this.antigravityOAuthToken ?? null\r\n    }\r\n    return this.cliOAuthToken ?? null\r\n  }\r\n\r\n  async stream(params: ProviderRequestParams): Promise<ProviderStreamResult> {\r\n    // Fresh user turn \u2192 reset transient retry counters. Without this, a\r\n    // session that hits a 403 on turn 1 has an exhausted budget on turn 2\r\n    // and self-recovery silently stops working.\r\n    this._staleRetryCount = 0\r\n\r\n    const optimized = this._optimizeParams(params)\r\n    const model = this.resolveModel(optimized.model)\r\n    this._lastModelUsed = model\r\n    const body = anthropicToGeminiRequest({ ...optimized, model })\r\n\r\n    // OAuth path \u2192 route through Code Assist with the right executor.\r\n    const oauthToken = this._tokenForModel(model)\r\n    if (this.hasOAuth && oauthToken) {\r\n      await _throttle(this.rpm)\r\n      const executor = executorForModel(model)\r\n      const projectId = await ensureCodeAssistReady(oauthToken, executor)\r\n\r\n      const wrapped = executor === 'antigravity'\r\n        ? wrapForCodeAssist(model, projectId, body as unknown as Record<string, unknown>)\r\n        : wrapForGeminiCLI(model, projectId, body as unknown as Record<string, unknown>)\r\n\r\n      const headers = executor === 'antigravity'\r\n        ? {\r\n          ...antigravityApiHeaders(oauthToken),\r\n          ...antigravitySessionHeaders(wrapped as unknown as Record<string, unknown>),\r\n          'Accept': 'text/event-stream',\r\n          'Connection': 'keep-alive',\r\n        }\r\n        : { ...geminiCLIApiHeaders(oauthToken, model), 'Connection': 'keep-alive' }\r\n\r\n      const ac = new AbortController()\n      let response: Response | null = null\n      let errText = ''\n      const urls = codeAssistGenerationBases(executor).map(base => `${base}:streamGenerateContent?alt=sse`)\n      for (let i = 0; i < urls.length; i++) {\n        response = await fetch(urls[i]!, {\n          method: 'POST',\n          headers,\n          body: JSON.stringify(wrapped),\n          signal: ac.signal,\n        })\n        if (response.ok) break\n        errText = await response.text().catch(() => '')\n        if (!(executor === 'antigravity' && response.status === 404 && i < urls.length - 1)) break\n      }\n      if (!response) {\n        throw new Error('Gemini Code Assist error: no endpoint attempted')\n      }\n\n      if (!response.ok) {\n        this._adjustRpmFromError(response.status, response.headers)\n\r\n        // Auto-recover from stale project ID: if Code Assist returns 403\r\n        // with a permission error, the cached project is invalid. Clear it\r\n        // and retry once \u2014 the retry will re-onboard and get a fresh project.\r\n        if (response.status === 403 && this._isStaleProjectError(errText) && this._staleRetryCount < this._maxStaleRetries) {\r\n          this._staleRetryCount++\r\n          clearCodeAssistCache(executor)\r\n          return this.stream(params)\r\n        }\r\n\r\n        throw this._formatGeminiError(response.status, errText)\r\n      }\r\n\r\n      if (!response.body) {\r\n        throw new Error('Gemini Code Assist returned no response body for streaming request')\r\n      }\r\n\r\n      // Pro model on the CLI executor returned 200 \u2192 the user has paid\r\n      // entitlement, even when Code Assist's loadCodeAssist/quota\r\n      // endpoints fail to advertise it. Latch the flag so future\r\n      // /models invocations surface Pro models without the env var.\r\n      if (executor === 'cli') latchProEntitlementOnSuccess(model)\r\n\r\n      const geminiChunks = parseCodeAssistSSE(response.body)\r\n      const anthropicEvents = geminiStreamToAnthropicEvents(geminiChunks, model)\r\n      return buildProviderStreamResult(anthropicEvents, ac)\r\n    }\r\n\r\n    // API key path \u2192 rate-limit, then try context caching, then call v1beta.\r\n    if (!this.apiKey) {\r\n      throw new Error(\r\n        'Gemini API error 401: No credentials available.\\n' +\r\n        'Your OAuth session may have expired and no API key is configured.\\n' +\r\n        'Run /login to sign in again.',\r\n      )\r\n    }\r\n    await _throttle(this.rpm)\r\n    const cacheName = await this._applyContextCache(model, body)\r\n    const url = `${this.baseUrl}/models/${model}:streamGenerateContent?alt=sse`\r\n    const ac = new AbortController()\r\n    const response = await fetch(url, {\r\n      method: 'POST',\r\n      headers: this._apiKeyHeaders(),\r\n      body: JSON.stringify(body),\r\n      signal: ac.signal,\r\n    })\r\n\r\n    if (!response.ok) {\r\n      const errText = await response.text().catch(() => '')\r\n      this._adjustRpmFromError(response.status, response.headers)\r\n      if (cacheName && this._isCacheExpiredError(response.status, errText)) {\r\n        invalidateCache(cacheName)\r\n        return this.stream(params)\r\n      }\r\n      // Let withRetry (outer layer) handle 429s. It caps third-party 429s at\r\n      // 2 attempts with exponential backoff \u2014 stacking another retry loop\r\n      // here caused 3m+ hangs when per-minute buckets cascaded.\r\n      throw this._formatGeminiError(response.status, errText)\r\n    }\r\n\r\n    const geminiChunks = parseGeminiSSE(response.body!)\r\n    const anthropicEvents = geminiStreamToAnthropicEvents(geminiChunks, model)\r\n    return buildProviderStreamResult(anthropicEvents, ac)\r\n  }\r\n\r\n  async create(params: ProviderRequestParams): Promise<AnthropicMessage> {\r\n    const optimized = this._optimizeParams(params)\r\n    const model = this.resolveModel(optimized.model)\r\n    const body = anthropicToGeminiRequest({ ...optimized, model })\r\n\r\n    // OAuth path \u2192 route through Code Assist with the right executor.\r\n    const oauthToken = this._tokenForModel(model)\r\n    if (this.hasOAuth && oauthToken) {\r\n      await _throttle(this.rpm)\r\n      const executor = executorForModel(model)\r\n      const projectId = await ensureCodeAssistReady(oauthToken, executor)\r\n\r\n      const wrapped = executor === 'antigravity'\r\n        ? wrapForCodeAssist(model, projectId, body as unknown as Record<string, unknown>)\r\n        : wrapForGeminiCLI(model, projectId, body as unknown as Record<string, unknown>)\r\n\r\n      const headers = executor === 'antigravity'\r\n        ? {\r\n          ...antigravityApiHeaders(oauthToken),\r\n          ...antigravitySessionHeaders(wrapped as unknown as Record<string, unknown>),\r\n          'Accept': 'application/json',\r\n          'Connection': 'keep-alive',\r\n        }\r\n        : { ...geminiCLIApiHeaders(oauthToken, model), 'Connection': 'keep-alive' }\r\n\r\n      let response: Response | null = null\n      let errText = ''\n      const urls = codeAssistGenerationBases(executor).map(base => `${base}:generateContent`)\n      for (let i = 0; i < urls.length; i++) {\n        response = await fetch(urls[i]!, {\n          method: 'POST',\n          headers,\n          body: JSON.stringify(wrapped),\n        })\n        if (response.ok) break\n        errText = await response.text().catch(() => '')\n        if (!(executor === 'antigravity' && response.status === 404 && i < urls.length - 1)) break\n      }\n      if (!response) {\n        throw new Error('Gemini Code Assist error: no endpoint attempted')\n      }\n\n      if (!response.ok) {\n        this._adjustRpmFromError(response.status, response.headers)\n\r\n        // Auto-recover from stale project ID (same as streaming path).\r\n        if (response.status === 403 && this._isStaleProjectError(errText) && this._staleRetryCount < this._maxStaleRetries) {\r\n          this._staleRetryCount++\r\n          clearCodeAssistCache(executor)\r\n          return this.create(params)\r\n        }\r\n\r\n        throw this._formatGeminiError(response.status, errText)\r\n      }\r\n\r\n      // Pro model on the CLI executor returned 200 \u2192 record paid\r\n      // entitlement so /models picks it up without the env var.\r\n      if (executor === 'cli') latchProEntitlementOnSuccess(model)\r\n\r\n      const caData = await response.json()\r\n      const data = unwrapCodeAssistResponse(caData)\r\n      return geminiMessageToAnthropic(data, model)\r\n    }\r\n\r\n    // API key path \u2192 rate-limit, then try context caching, then call v1beta.\r\n    if (!this.apiKey) {\r\n      throw new Error(\r\n        'Gemini API error 401: No credentials available.\\n' +\r\n        'Your OAuth session may have expired and no API key is configured.\\n' +\r\n        'Run /login to sign in again.',\r\n      )\r\n    }\r\n    await _throttle(this.rpm)\r\n    const cacheName = await this._applyContextCache(model, body)\r\n    const url = `${this.baseUrl}/models/${model}:generateContent`\r\n    const response = await fetch(url, {\r\n      method: 'POST',\r\n      headers: this._apiKeyHeaders(),\r\n      body: JSON.stringify(body),\r\n    })\r\n\r\n    if (!response.ok) {\r\n      const errText = await response.text().catch(() => '')\r\n      this._adjustRpmFromError(response.status, response.headers)\r\n      if (cacheName && this._isCacheExpiredError(response.status, errText)) {\r\n        invalidateCache(cacheName)\r\n        return this.create(params)\r\n      }\r\n      throw this._formatGeminiError(response.status, errText)\r\n    }\r\n\r\n    const data = (await response.json()) as GeminiGenerateContentResponse\r\n    return geminiMessageToAnthropic(data, model)\r\n  }\r\n\r\n  /**\r\n   * Attempt to attach a `cachedContents/...` reference to the outgoing\r\n   * request body. Mutates `body` in place: on a cache hit, clears\r\n   * `systemInstruction` and `tools` and sets `cachedContent`. Returns\r\n   * the cache name so the caller can invalidate it on 404/expired.\r\n   *\r\n   * CRITICAL FIX: The system prompt contains volatile per-turn data\r\n   * (git status, current date, working dir). If we hash the full\r\n   * systemInstruction, the key changes every turn \u2192 cache NEVER hits.\r\n   *\r\n   * Solution: split systemInstruction at the SYSTEM_PROMPT_DYNAMIC_BOUNDARY\r\n   * marker. Cache only the stable prefix (instructions + tool schemas).\r\n   * Inject the volatile suffix as a user message in contents[].\r\n   *\r\n   * API-key path only. OAuth (Code Assist) is skipped because the\r\n   * proxy's cachedContents endpoint is not verified.\r\n   */\r\n  private async _applyContextCache(\r\n    model: string,\r\n    body: ReturnType<typeof anthropicToGeminiRequest>,\r\n  ): Promise<string | null> {\r\n    if (!this.apiKey) return null\r\n    if (!body.systemInstruction) return null\r\n\r\n    // Split system instruction into stable (cacheable) and volatile (per-turn).\r\n    const fullText = body.systemInstruction.parts.map(p => p.text).join('\\n\\n')\r\n    const { stable, volatile } = splitSystemInstruction(fullText)\r\n\r\n    // Only cache the stable portion \u2014 its hash is consistent across turns.\r\n    const stableInstruction = stable\r\n      ? { parts: [{ text: stable }] }\r\n      : null\r\n\r\n    const cacheName = await getOrCreateCache({\r\n      model,\r\n      baseUrl: this.baseUrl,\r\n      apiKey: this.apiKey,\r\n      systemInstruction: stableInstruction,\r\n      tools: body.tools,\r\n    })\r\n    if (!cacheName) return null\r\n\r\n    // Cache hit: replace systemInstruction + tools with cache reference.\r\n    delete body.systemInstruction\r\n    delete body.tools\r\n    body.cachedContent = cacheName\r\n\r\n    // Inject volatile context (git status, date, env) as a leading user\r\n    // message. Gemini doesn't allow systemInstruction + cachedContent\r\n    // together, but leading user parts work fine for context injection.\r\n    if (volatile) {\r\n      body.contents.unshift({\r\n        role: 'user',\r\n        parts: [{ text: volatile }],\r\n      })\r\n    }\r\n\r\n    return cacheName\r\n  }\r\n\r\n  private _isCacheExpiredError(status: number, body: string): boolean {\r\n    if (status === 404) return true\r\n    if (status === 400 && /cached.?content/i.test(body)) return true\r\n    return false\r\n  }\r\n\r\n  async listModels(): Promise<ModelInfo[]> {\r\n    // OAuth path: return only the models the user has tokens for.\r\n    // Code Assist doesn't expose a listModels endpoint and v1beta/models\r\n    // rejects cloud-platform tokens (403 restricted_client).\r\n    if (this.hasOAuth) {\r\n      const models: ModelInfo[] = []\r\n      if (this.cliOAuthToken) {\r\n        // The picker is often the FIRST thing the user opens after\r\n        // /login, before any chat request has triggered onboarding \u2014\r\n        // force the round-trip here so the entitled-ids / tier caches\r\n        // that resolveCliModelsForPicker reads are populated.\r\n        try {\r\n          await ensureCodeAssistReady(this.cliOAuthToken, 'cli')\r\n        } catch {\r\n          // Onboarding failed \u2014 fall back to the flash list. The user\r\n          // will hit a clearer error next time they actually try to chat.\r\n        }\r\n        models.push(...resolveCliModelsForPicker())\r\n      }\r\n      if (this.antigravityOAuthToken) models.push(...ANTIGRAVITY_MODELS)\r\n      return models\r\n    }\r\n\r\n    // API key path \u2014 hidden from the picker by default. Listing\r\n    // /v1beta/models is slow (100+ entries, no useful filtering) and\r\n    // most users never need it. Set GEMINI_SHOW_API_KEY_MODELS=true to\r\n    // opt back in. The chat path itself is unaffected: stream/create\r\n    // continue to honor the configured api key when no OAuth is set.\r\n    if (process.env.GEMINI_SHOW_API_KEY_MODELS !== 'true') {\r\n      return []\r\n    }\r\n\r\n    const url = `${this.baseUrl}/models`\r\n    const response = await fetch(url, {\r\n      headers: this._apiKeyHeaders(),\r\n    })\r\n\r\n    if (!response.ok) return []\r\n    const data = (await response.json()) as {\r\n      models?: Array<{ name: string; displayName: string; supportedGenerationMethods?: string[] }>\r\n    }\r\n    return (data.models ?? [])\r\n      .filter(m => m.supportedGenerationMethods?.includes('generateContent'))\r\n      .filter(m => _isGeminiChatModel(m.name.replace('models/', '')))\r\n      .map(m => {\r\n        const id = m.name.replace('models/', '')\r\n        return {\r\n          id,\r\n          name: _enrichGeminiModelName(id, m.displayName || id),\r\n        }\r\n      })\r\n  }\r\n\r\n  resolveModel(claudeModel: string): string {\r\n    if (!claudeModel.includes('claude')) return claudeModel\r\n\r\n    const models = getProviderModelSet(this.name)\r\n    if (claudeModel.includes('opus'))  return models.opus\r\n    if (claudeModel.includes('haiku')) return models.haiku\r\n    return models.sonnet\r\n  }\r\n\r\n  /**\r\n   * Detect stale Code Assist project errors. These happen when the cached\r\n   * project ID has lost permissions or was deleted server-side. The fix is\r\n   * to clear the cache and re-onboard.\r\n   */\r\n  private _isStaleProjectError(errText: string): boolean {\r\n    return errText.includes('cloudaicompanion') ||\r\n      errText.includes('does not have permission') ||\r\n      errText.includes('project might not exist')\r\n  }\r\n\r\n  /**\r\n   * Guard against infinite retry loops on stale project recovery.\r\n   *\r\n   * Bumped from 1 \u2192 3: when the user re-logs into a different Google\r\n   * account, the locally cached projectId belongs to the previous\r\n   * account and the new tokens 403 against it. The first retry clears\r\n   * the local cache, but `loadCodeAssist` may still echo the stale\r\n   * project back from Google's side \u2014 we then need to fall through to\r\n   * `onboardUser` to bind a fresh project, which can take another\r\n   * round-trip. Three retries leaves enough budget for the full path\r\n   * (clear-cache \u2192 loadCodeAssist \u2192 onboardUser \u2192 request).\r\n   */\r\n  private _staleRetryCount = 0\r\n  private _maxStaleRetries = 3\r\n\r\n  /** Last model used \u2014 for error messages. */\r\n  private _lastModelUsed: string | null = null\r\n\r\n  /**\r\n   * Format Gemini API errors. All error messages include the numeric status\r\n   * code in the format \"Gemini API error NNN: ...\" so the app's withRetry\r\n   * logic (which matches /API error (\\d{3})/) can detect retryable errors.\r\n   */\r\n  private _formatGeminiError(status: number, body: string): Error {\r\n    let errorDetail = ''\r\n    try {\r\n      const parsed = JSON.parse(body)\r\n      errorDetail = parsed?.error?.message ?? ''\r\n    } catch {\r\n      errorDetail = body\r\n    }\r\n\r\n    if (status === 400 && errorDetail.includes('Unknown name')) {\r\n      return new Error(\r\n        `Gemini API error ${status}: Invalid tool schema fields.\\n` +\r\n        `The tool parameter schemas contain fields not supported by Gemini.\\n` +\r\n        `This is a bug \u2014 please report it. Details: ${errorDetail.slice(0, 300)}`,\r\n      )\r\n    }\r\n\r\n    if (status === 401 || status === 403) {\r\n      return new Error(\r\n        `Gemini API error ${status}: Authentication failed.\\n` +\r\n        `${errorDetail || 'Your API key or OAuth token may be invalid.'}\\n` +\r\n        `Run /login to reconfigure.`,\r\n      )\r\n    }\r\n\r\n    if (status === 429) {\r\n      // Distinguish quota exhaustion (hours/days) from per-minute rate limit.\r\n      // Google says \"exhausted your capacity\" on EVERY 429 \u2014 even 2-second\r\n      // cooldowns \u2014 so we can't use that word. Only the RESET DURATION matters:\r\n      //   - seconds/minutes \u2192 normal rate limit, retryable\r\n      //   - hours           \u2192 real quota exhaustion, don't retry\r\n      const resetSeconds = _parseGeminiResetDuration(body)\r\n      const isRealExhaustion = resetSeconds !== null && resetSeconds > 300 // >5 min = real exhaustion\r\n      if (isRealExhaustion) {\r\n        const resetMatch = body.match(/reset after (\\d+h\\d+m\\d+s|\\d+h\\d+m|\\d+h)/i)\r\n        const resetHint = resetMatch ? ` Resets in ${resetMatch[1]}.` : ''\r\n        // Include the \"quota exhausted\" signal the withRetry filter uses to\r\n        // skip retries (`/quota exhausted|exhausted your capacity|quota will reset after \\d+h/i`).\r\n        return new Error(\r\n          `Gemini API error 429: quota exhausted for ${this._lastModelUsed ?? 'this model'}.${resetHint}\\n` +\r\n          `${errorDetail}\\n` +\r\n          `This is a Google-side daily/weekly limit. Options:\\n` +\r\n          `  - Switch to a different model via /models\\n` +\r\n          `  - Wait for quota to reset\\n` +\r\n          `  - Use a different provider via /provider`,\r\n        )\r\n      }\r\n      // Per-minute rate limit \u2014 retryable. Include \"API error 429\" in the\r\n      // message so withRetry's isThirdPartyRetryableError matches. Attach a\r\n      // Headers-shaped retry-after so withRetry honors Gemini's actual\r\n      // reset hint instead of falling back to blind exponential backoff.\r\n      const retryMatch = body.match(/retry in ([\\d.]+)s/i) || body.match(/reset after (\\d+)s/i)\r\n      const retryHint = retryMatch ? `\\nRetry in ~${Math.ceil(parseFloat(retryMatch[1]))}s.` : ''\r\n      const tierHint = this.hasOAuth\r\n        ? ''\r\n        : '\\nTip: Use /login to authenticate with Google for higher rate limits (free).'\r\n      const err = new Error(\r\n        `Gemini API error 429: Rate limit hit (${this.rpm} RPM).${retryHint}${tierHint}\\n` +\r\n        `${errorDetail}`,\r\n      )\r\n      // Expose the reset duration on `.headers.get('retry-after')` so the\r\n      // outer withRetry wrapper sleeps for the real delay instead of 0.5s.\r\n      if (retryMatch) {\r\n        const retryAfterSec = Math.ceil(parseFloat(retryMatch[1]))\r\n        ;(err as Error & { headers: { get(k: string): string | null } }).headers = {\r\n          get(k: string) { return k.toLowerCase() === 'retry-after' ? String(retryAfterSec) : null },\r\n        }\r\n      }\r\n      return err\r\n    }\r\n\r\n    return new Error(`Gemini API error ${status}: ${body}`)\r\n  }\r\n\r\n  /**\r\n   * Dynamically lower the RPM when we hit 429 errors. This prevents\r\n   * hammering the API and wasting requests on retries. The RPM recovers\r\n   * on the next provider construction (each turn creates a fresh provider).\r\n   */\r\n  private _adjustRpmFromError(status: number, headers: Headers): void {\r\n    if (status === 429) {\r\n      // Halve RPM (floor at 5) to back off aggressively.\r\n      this.rpm = Math.max(5, Math.floor(this.rpm / 2))\r\n    }\r\n    // Try to learn the actual limit from response headers.\r\n    const limitHeader = headers.get('x-ratelimit-limit-requests')\r\n      ?? headers.get('x-ratelimit-limit')\r\n    if (limitHeader) {\r\n      const parsed = parseInt(limitHeader, 10)\r\n      if (!isNaN(parsed) && parsed > 0) {\r\n        // Use 80% of the advertised limit as our ceiling.\r\n        this.rpm = Math.max(5, Math.floor(parsed * 0.8))\r\n      }\r\n    }\r\n  }\r\n\r\n}\r\n", "import type { ModelInfo } from '../../services/api/providers/base_provider.js'\n\n/**\n * Curated allowlist of OpenRouter models to show in the picker.\n * Only these model IDs (exact match, ignoring :free suffix) will appear.\n */\nexport const OPENROUTER_ALLOWLIST = new Set([\n  // OpenAI\n  'openai/gpt-5.5-pro',\n  'openai/gpt-5.5',\n  'openai/gpt-5.4-image-2',\n  'openai/gpt-5.4-nano',\n  'openai/gpt-5.4-mini',\n  'openai/gpt-5.4-pro',\n  'openai/gpt-5.4',\n  'openai/gpt-5.3-chat',\n  'openai/gpt-5.3-codex',\n  'openai/gpt-audio',\n  'openai/gpt-audio-mini',\n  'openai/gpt-5.2-codex',\n  'openai/gpt-5.2-chat',\n  'openai/gpt-5.2-pro',\n  'openai/gpt-5.2',\n  'openai/gpt-5.1-codex-max',\n  'openai/gpt-5.1',\n  'openai/gpt-5.1-chat',\n  'openai/gpt-5.1-codex',\n  'openai/gpt-5.1-codex-mini',\n  'openai/gpt-oss-safeguard-20b',\n  'openai/gpt-5-image-mini',\n  'openai/gpt-5-image',\n  'openai/gpt-5-pro',\n  'openai/gpt-5-codex',\n  'openai/gpt-4o-audio',\n  'openai/gpt-5-chat',\n  'openai/gpt-5',\n  'openai/gpt-5-mini',\n  'openai/gpt-5-nano',\n  'openai/gpt-oss-120b',\n  // NVIDIA\n  'nvidia/nemotron-3-super',\n  'nvidia/nemotron-3-nano-30b-a3b',\n  'nvidia/nemotron-nano-12b-2-vl',\n  'nvidia/llama-3.3-nemotron-super-49b-v1.5',\n  'nvidia/nemotron-nano-9b-v2',\n  // Anthropic\n  'anthropic/claude-opus-4.7',\n  'anthropic/claude-opus-4.6-fast',\n  'anthropic/claude-sonnet-4.6',\n  'anthropic/claude-opus-4.6',\n  'anthropic/claude-opus-4.5',\n  'anthropic/claude-haiku-4.5',\n  'anthropic/claude-sonnet-4.5',\n  'anthropic/claude-opus-4.1',\n  'anthropic/claude-opus-4',\n  'anthropic/claude-sonnet-4',\n  'anthropic/claude-3.7-sonnet',\n  'anthropic/claude-3.7-sonnet-thinking',\n  // Google\n  'google/gemma-4-26b-a4b',\n  'google/gemma-4-31b',\n  'google/lyria-3-pro-preview',\n  'google/lyria-3-clip-preview',\n  'google/gemini-3.1-flash-lite-preview',\n  'google/nano-banana-2',\n  'google/gemini-3.1-pro-preview-custom-tools',\n  'google/gemini-3.1-pro-preview',\n  'google/gemini-3-flash-preview',\n  // Z.ai\n  'z-ai/glm-5.1',\n  'z-ai/glm-5v-turbo',\n  'z-ai/glm-5-turbo',\n  'z-ai/glm-5',\n  'z-ai/glm-4.7-flash',\n  'z-ai/glm-4.7',\n  'z-ai/glm-4.6v',\n  'z-ai/glm-4.6',\n  'z-ai/glm-4.5v',\n  'z-ai/glm-4.5',\n  'z-ai/glm-4.5-air',\n  // Qwen\n  'qwen/qwen-3.6-plus',\n  'qwen/qwen-3.5-9b',\n  'qwen/qwen-3.5-35b-a3b',\n  'qwen/qwen-3.5-27b',\n  'qwen/qwen-3.5-122b-a10b',\n  'qwen/qwen-3.5-flash',\n  'qwen/qwen-3.5-plus-2026-02-15',\n  'qwen/qwen-3.5-397b-a17b',\n  'qwen/qwen-3-max-thinking',\n  'qwen/qwen-3-coder-next',\n  'qwen/qwen-3-vl-32b-instruct',\n  'qwen/qwen-3-vl-8b-thinking',\n  'qwen/qwen-3-vl-8b-instruct',\n  'qwen/qwen-3-vl-30b-a3b-thinking',\n  'qwen/qwen-3-vl-30b-a3b-instruct',\n  'qwen/qwen-3-vl-235b-a22b-thinking',\n  'qwen/qwen-3-vl-235b-a22b-instruct',\n  'qwen/qwen-3-max',\n  'qwen/qwen-3-coder-plus',\n  'qwen/qwen-3-coder-flash',\n  'qwen/qwen-3-next-80b-a3b-thinking',\n  'qwen/qwen-3-next-80b-a3b-instruct',\n  // MoonshotAI\n  'moonshotai/kimi-k2.6',\n  'moonshotai/kimi-k2.5',\n  'moonshotai/kimi-k2-thinking',\n  'moonshotai/kimi-k2-0905',\n  'moonshotai/kimi-k2-0711',\n  // MiniMax\n  'minimax/minimax-m2.7',\n  'minimax/minimax-m2.5',\n  // DeepSeek\n  'deepseek/deepseek-v4-pro',\n  'deepseek/deepseek-v4-flash',\n  'nex-agi/deepseek-v3.1-nex-n1',\n  'deepseek/deepseek-v3.2-speciale',\n  'deepseek/deepseek-v3.2',\n  'deepseek/deepseek-v3.2-exp',\n  'deepseek/deepseek-v3.1-terminus',\n  // inclusionAI\n  'inclusionai/ling-2.6-1t',\n  'inclusionai/ling-2.6-flash',\n  // xAI\n  'x-ai/grok-4.20-multi-agent',\n  'x-ai/grok-4.20',\n  'x-ai/grok-4.1-fast',\n  'x-ai/grok-4-fast',\n  'x-ai/grok-code-fast-1',\n])\n\nexport interface OpenRouterCatalogModel {\n  id?: string\n  name?: string\n  context_length?: number\n  pricing?: Record<string, string | number | undefined>\n}\n\nconst PROVIDER_LABELS: Record<string, string> = {\n  aionlabs: 'AionLabs',\n  'aion-labs': 'AionLabs',\n  allenai: 'AllenAI',\n  anthropic: 'Anthropic',\n  'arcee-ai': 'Arcee AI',\n  baidu: 'Baidu',\n  bytedance: 'ByteDance Seed',\n  'bytedance-seed': 'ByteDance Seed',\n  deepseek: 'DeepSeek',\n  google: 'Google',\n  inclusionai: 'inclusionAI',\n  kwaipilot: 'Kwaipilot',\n  liquidai: 'LiquidAI',\n  liquid: 'LiquidAI',\n  meta: 'Meta',\n  'meta-llama': 'Meta Llama',\n  minimax: 'MiniMax',\n  minimaxai: 'MiniMax',\n  mistral: 'Mistral',\n  mistralai: 'Mistral',\n  moonshotai: 'MoonshotAI',\n  nvidia: 'NVIDIA',\n  openai: 'OpenAI',\n  openrouter: 'OpenRouter',\n  qwen: 'Qwen',\n  stepfun: 'StepFun',\n  'stepfun-ai': 'StepFun',\n  tencent: 'Tencent',\n  upstage: 'Upstage',\n  writer: 'Writer',\n  'nex-agi': 'Nex AGI',\n  'x-ai': 'xAI',\n  xai: 'xAI',\n  xiaomi: 'Xiaomi',\n  'z-ai': 'Z.ai',\n  zai: 'Z.ai',\n}\n\nexport function toOpenRouterModelInfo(model: OpenRouterCatalogModel): ModelInfo | null {\n  if (typeof model.id !== 'string' || model.id.length === 0) {\n    return null\n  }\n\n  const provider = inferOpenRouterProvider(model)\n  const free = isFreeOpenRouterModel(model)\n  const tags = free ? ['free'] as const : undefined\n\n  return {\n    id: model.id,\n    name: normalizeOpenRouterModelName(model.name ?? model.id, provider, free),\n    provider,\n    contextWindow: model.context_length,\n    ...(tags ? { tags } : {}),\n  }\n}\n\nexport function inferProviderLabelFromModelId(id: string, fallback = 'Unknown'): string {\n  const rawPrefix = id.split('/')[0]?.replace(/^~/, '').trim()\n  if (!rawPrefix) return fallback\n\n  const normalized = rawPrefix.toLowerCase()\n  return PROVIDER_LABELS[normalized] ?? humanizeProviderPrefix(rawPrefix)\n}\n\nfunction inferOpenRouterProvider(model: OpenRouterCatalogModel): string {\n  const nameProvider = parseProviderPrefixFromName(model.name)\n  if (nameProvider) return nameProvider\n\n  return inferProviderLabelFromModelId(model.id ?? '')\n}\n\nfunction parseProviderPrefixFromName(name?: string): string | null {\n  if (!name) return null\n\n  const match = /^([^:]{2,40}):\\s+/.exec(name.trim())\n  return match ? match[1]!.trim() : null\n}\n\nfunction normalizeOpenRouterModelName(name: string, provider: string, free: boolean): string {\n  let normalized = name.trim()\n  const prefix = `${provider}:`\n  if (normalized.toLowerCase().startsWith(prefix.toLowerCase())) {\n    normalized = normalized.slice(prefix.length).trim()\n  }\n  if (free) {\n    normalized = normalized.replace(/\\s+\\(free\\)$/i, '').trim()\n  }\n  return normalized || name\n}\n\nfunction isFreeOpenRouterModel(model: OpenRouterCatalogModel): boolean {\n  return priceValue(model.pricing?.prompt) === 0\n    && priceValue(model.pricing?.completion) === 0\n}\n\nfunction priceValue(value: string | number | undefined): number | null {\n  if (typeof value === 'number') return Number.isFinite(value) ? value : null\n  if (typeof value !== 'string') return null\n\n  const parsed = Number(value)\n  return Number.isFinite(parsed) ? parsed : null\n}\n\nfunction humanizeProviderPrefix(prefix: string): string {\n  return prefix\n    .split(/[-_]+/)\n    .filter(Boolean)\n    .map(part => part.length <= 2 ? part.toUpperCase() : part[0]!.toUpperCase() + part.slice(1))\n    .join(' ')\n}\n", "/**\n * OpenRouter provider \u2014 extends OpenAIProvider with OpenRouter-specific headers.\n *\n * OpenRouter is an API aggregator that routes to multiple model providers.\n * It uses the OpenAI-compatible API with extra headers for ranking/attribution.\n *\n * Base URL: https://openrouter.ai/api/v1\n * Auth: Bearer token (sk-or-...)\n * Extra headers: HTTP-Referer, X-OpenRouter-Title,\n * X-OpenRouter-Categories (for app rankings)\n */\n\nimport { OpenAIProvider } from './openai_provider.js'\nimport type { ModelInfo, ProviderConfig, ProviderRequestParams } from './base_provider.js'\nimport {\n  toOpenRouterModelInfo,\n  OPENROUTER_ALLOWLIST,\n  type OpenRouterCatalogModel,\n} from '../../../utils/model/openrouterCatalog.js'\n\nexport class OpenRouterProvider extends OpenAIProvider {\n  readonly name = 'openrouter'\n\n  constructor(config: ProviderConfig) {\n    super({\n      apiKey: config.apiKey,\n      baseUrl: 'https://openrouter.ai/api/v1',\n      extraHeaders: {\n        // OpenRouter uses these for app rankings and attribution.\n        'HTTP-Referer': process.env.OPENROUTER_REFERER ?? 'https://github.com/AbdoKnbGit/tau',\n        'X-OpenRouter-Title': process.env.OPENROUTER_TITLE ?? 'Tau',\n        'X-OpenRouter-Categories': process.env.OPENROUTER_CATEGORIES ?? 'cli-agent',\n        'X-Title': process.env.OPENROUTER_TITLE ?? 'Tau',\n        ...(config.extraHeaders ?? {}),\n      },\n    })\n    // OpenRouter passes cache_control through to underlying providers\n    // (Anthropic, Google, etc.) enabling prompt caching.\n    this.preserveCacheControl = true\n  }\n\n  /**\n   * OpenRouter routes to frontier models (Claude, GPT-4, Gemini, etc.)\n   * that fully support tool calling, agents, MCP servers, and plugins.\n   * Skip the payload optimization that strips tools down to core-only \u2014\n   * send the full tool set so all claudex features work.\n   */\n  protected optimizeParams(params: ProviderRequestParams): ProviderRequestParams {\n    return params\n  }\n\n  /**\n   * OpenRouter exposes a unified `reasoning` field that every upstream\n   * provider (Anthropic, OpenAI, Google, DeepSeek, etc.) respects via\n   * their native reasoning surface. We always map the /thinking toggle\n   * through this, rather than overriding reasoning_effort, so every\n   * thinking-capable model routed via OpenRouter behaves consistently.\n   */\n  protected modelSupportsReasoningEffort(_model: string): boolean {\n    // We return true so the base OpenAIProvider branch runs and\n    // `reasoning_effort` is set. OpenRouter accepts both\n    // `reasoning_effort` and `reasoning: { effort }`; models that don't\n    // reason quietly ignore the flag.\n    return true\n  }\n\n  /**\n   * OpenRouter has its own model list endpoint with richer metadata\n   * including pricing, context length, and provider info.\n   */\n  async listModels(): Promise<ModelInfo[]> {\n    const response = await fetch('https://openrouter.ai/api/v1/models', {\n      headers: { 'Authorization': `Bearer ${this.apiKey}` },\n    })\n\n    if (!response.ok) return []\n\n    const data = (await response.json()) as {\n      data: OpenRouterCatalogModel[]\n    }\n\n    return (data.data ?? [])\n      .filter(m => {\n        if (typeof m.id !== 'string') return false\n        // Strip :free suffix for allowlist lookup\n        const baseId = m.id.replace(/:free$/, '')\n        return OPENROUTER_ALLOWLIST.has(baseId) || OPENROUTER_ALLOWLIST.has(m.id)\n      })\n      .map(toOpenRouterModelInfo)\n      .filter((model): model is ModelInfo => model !== null)\n  }\n}\n", "/**\n * Groq provider \u2014 extends OpenAIProvider.\n *\n * Groq provides ultra-fast inference for open-source models.\n * All models are free with rate limits.\n *\n * Base URL: https://api.groq.com/openai/v1\n * Auth: Bearer token (gsk_...)\n * API: OpenAI-compatible\n *\n * Groq free-tier TPM limits (tokens per minute, INPUT+OUTPUT combined):\n *   qwen/qwen3-32b:               6,000 TPM\n *   llama-3.3-70b-versatile:     12,000 TPM\n *   deepseek-r1-distill-llama-70b: 6,000 TPM\n *   openai/gpt-oss-120b:          6,000 TPM\n *\n * Strategy: send tools with FULL unmodified schemas so Groq's API can\n * enforce proper function-calling format. Stripped schemas cause models\n * to emit malformed calls (<function=Name,{...}> instead of real tool use).\n * We only filter WHICH tools are sent and trim the system prompt.\n */\n\nimport { OpenAIProvider } from './openai_provider.js'\nimport type {\n  ProviderConfig,\n  ProviderRequestParams,\n  ProviderTool,\n  SystemBlock,\n} from './base_provider.js'\n\n/**\n * Tools that Groq's models can reliably call via OpenAI function-calling.\n * These have simple, well-structured schemas that work with smaller models.\n *\n * NOT included: Agent, TaskCreate, TaskUpdate, EnterPlanMode, NotebookEdit,\n * ToolSearch, MCP tools \u2014 their multi-parameter schemas cause small models\n * to output malformed calls and trigger tool_use_failed errors.\n *\n * Users who need the full tool set should use PROVIDER_NO_OPTIMIZE=true\n * with a model that handles complex tool calling (e.g. llama-3.3-70b).\n */\nconst GROQ_TOOLS = new Set([\n  'Bash',\n  'Read',\n  'Write',\n  'Edit',\n  'Glob',\n  'Grep',\n  'WebSearch',\n  'WebFetch',\n])\n\nexport class GroqProvider extends OpenAIProvider {\n  readonly name = 'groq'\n\n  constructor(config: ProviderConfig) {\n    super({\n      apiKey: config.apiKey,\n      baseUrl: 'https://api.groq.com/openai/v1',\n      extraHeaders: config.extraHeaders,\n    })\n\n    // Trim system prompt but not as aggressively as before\n    if (!process.env.GROQ_MAX_SYSTEM_CHARS && !process.env.PROVIDER_MAX_SYSTEM_CHARS) {\n      this.maxSystemChars = 2000\n    }\n    if (!process.env.GROQ_MAX_TOKENS && !process.env.PROVIDER_MAX_TOKENS) {\n      this.maxTokensCap = 4096\n    }\n  }\n\n  /**\n   * Filter to supported tools with FULL schemas (no stripping).\n   * Groq's API needs complete schemas to enforce proper function-calling\n   * format. Stripped/mangled schemas cause models to fall back to\n   * text-based pseudo-function-calls that trigger 400 errors.\n   */\n  protected optimizeParams(params: ProviderRequestParams): ProviderRequestParams {\n    if (!this.optimizePayload) return params\n\n    // Filter tools to the supported set \u2014 keep schemas intact\n    let tools: ProviderTool[] | undefined\n    if (params.tools && params.tools.length > 0) {\n      const filtered = params.tools.filter(t => GROQ_TOOLS.has(t.name))\n      tools = filtered.length > 0 ? filtered : undefined\n    }\n\n    return {\n      ...params,\n      system: this._trimSystem(params.system),\n      tools,\n      max_tokens: Math.min(params.max_tokens, this.maxTokensCap),\n    }\n  }\n\n  /**\n   * Trim system prompt to fit Groq's TPM limits. Keeps the beginning\n   * (most important instructions) and appends a note about available tools.\n   */\n  private _trimSystem(\n    system?: string | SystemBlock[],\n  ): string | SystemBlock[] | undefined {\n    if (!system) return system\n\n    const fullText = typeof system === 'string'\n      ? system\n      : system.map(s => s.text).join('\\n\\n')\n\n    if (fullText.length <= this.maxSystemChars) {\n      return typeof system === 'string' ? system : system\n    }\n\n    // Find a clean cut at a paragraph break\n    let cutPoint = this.maxSystemChars\n    const lastBreak = fullText.lastIndexOf('\\n\\n', cutPoint)\n    if (lastBreak > this.maxSystemChars * 0.7) {\n      cutPoint = lastBreak\n    }\n\n    const trimmed = fullText.slice(0, cutPoint) +\n      '\\n\\n[Instructions trimmed. Tools available: Bash, Read, Write, Edit, Glob, Grep, WebSearch, WebFetch. ' +\n      'ONLY call tools that are in your tool list. Do NOT invent or guess tool names.]'\n\n    if (typeof system === 'string') return trimmed\n    return [{ type: 'text' as const, text: trimmed }]\n  }\n}\n", "/**\n * NIM Model Catalog \u2014 comprehensive list of all models available on NVIDIA NIM.\n *\n * Models are organized by provider/organization for easy browsing.\n * Used by the /models command to provide searchable model selection.\n *\n * Updated: April 2026\n */\n\nexport interface NimModelEntry {\n  /** Full model ID as used in API calls (e.g. \"meta/llama3-70b-instruct\") */\n  id: string\n  /** Short display name */\n  name: string\n  /** Provider/organization that created the model */\n  provider: string\n}\n\nexport interface NimProviderGroup {\n  /** Provider display name */\n  name: string\n  /** Icon/emoji for the provider */\n  icon: string\n  /** Models from this provider */\n  models: NimModelEntry[]\n}\n\nexport const NIM_PROVIDER_GROUPS: NimProviderGroup[] = [\n  // \u2500\u2500\u2500 Meta \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  {\n    name: 'Meta',\n    icon: '\\u{1F999}',  // \uD83E\uDD99\n    models: [\n      { id: 'meta/llama-3.1-405b-instruct', name: 'LLaMA 3.1 405B Instruct', provider: 'Meta' },\n      { id: 'meta/llama-3.3-70b-instruct', name: 'LLaMA 3.3 70B Instruct', provider: 'Meta' },\n      { id: 'meta/llama-4-maverick-17b-128e-instruct', name: 'LLaMA 4 Maverick 17B', provider: 'Meta' },\n      { id: 'meta/llama-4-scout-17b-16e-instruct', name: 'LLaMA 4 Scout 17B', provider: 'Meta' },\n    ],\n  },\n\n  // \u2500\u2500\u2500 Microsoft \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  {\n    name: 'Microsoft',\n    icon: '\\u{1FA9F}',  // \uD83E\uDE9F\n    models: [\n      { id: 'microsoft/phi-4-multimodal-instruct', name: 'Phi-4 Multimodal', provider: 'Microsoft' },\n      { id: 'microsoft/phi-4-mini-flash-reasoning', name: 'Phi-4 Mini Flash Reasoning', provider: 'Microsoft' },\n    ],\n  },\n\n  // \u2500\u2500\u2500 Mistral AI \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  {\n    name: 'Mistral AI',\n    icon: '\\u{1F534}',  // \uD83D\uDD34\n    models: [\n      { id: 'mistralai/mistral-large-3-675b-instruct-2512', name: 'Mistral Large 3 675B', provider: 'Mistral AI' },\n      { id: 'mistralai/mistral-medium-3-instruct', name: 'Mistral Medium 3', provider: 'Mistral AI' },\n      { id: 'mistralai/mistral-small-4-119b-2603', name: 'Mistral Small 4 119B', provider: 'Mistral AI' },\n      { id: 'mistralai/devstral-2-123b-instruct-2512', name: 'Devstral 2 123B', provider: 'Mistral AI' },\n      { id: 'mistralai/magistral-small-2506', name: 'Magistral Small', provider: 'Mistral AI' },\n      { id: 'mistralai/mixtral-8x22b-instruct-v0.1', name: 'Mixtral 8x22B', provider: 'Mistral AI' },\n    ],\n  },\n\n  // \u2500\u2500\u2500 Google \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  {\n    name: 'Google',\n    icon: '\\u{1F535}',  // \uD83D\uDD35\n    models: [\n      { id: 'google/gemma-4-31b-it', name: 'Gemma 4 31B IT', provider: 'Google' },\n      { id: 'google/gemma-2-27b-it', name: 'Gemma 2 27B IT', provider: 'Google' },\n    ],\n  },\n\n  // \u2500\u2500\u2500 NVIDIA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  {\n    name: 'NVIDIA',\n    icon: '\\u{1F7E2}',  // \uD83D\uDFE2\n    models: [\n      { id: 'nvidia/llama-3.1-nemotron-ultra-253b-v1', name: 'Nemotron Ultra 253B', provider: 'NVIDIA' },\n      { id: 'nvidia/llama-3.3-nemotron-super-49b-v1.5', name: 'Nemotron Super 49B v1.5', provider: 'NVIDIA' },\n      { id: 'nvidia/nemotron-3-super-120b-a12b', name: 'Nemotron 3 Super 120B', provider: 'NVIDIA' },\n    ],\n  },\n\n  // \u2500\u2500\u2500 DeepSeek \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  {\n    name: 'DeepSeek',\n    icon: '\\u{1F537}',  // \uD83D\uDD37\n    models: [\n      { id: 'deepseek-ai/deepseek-v4-pro', name: 'DeepSeek V4 Pro', provider: 'DeepSeek' },\n      { id: 'deepseek-ai/deepseek-v4-flash', name: 'DeepSeek V4 Flash', provider: 'DeepSeek' },\n      { id: 'deepseek-ai/deepseek-v3.2', name: 'DeepSeek V3.2', provider: 'DeepSeek' },\n      { id: 'deepseek-ai/deepseek-v3.1-terminus', name: 'DeepSeek V3.1 Terminus', provider: 'DeepSeek' },\n      { id: 'deepseek-ai/deepseek-r1-distill-qwen-32b', name: 'DeepSeek R1 Distill Qwen 32B', provider: 'DeepSeek' },\n    ],\n  },\n\n  // \u2500\u2500\u2500 Qwen / Alibaba \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  {\n    name: 'Qwen / Alibaba',\n    icon: '\\u{1F7E3}',  // \uD83D\uDFE3\n    models: [\n      { id: 'qwen/qwen3-coder-480b-a35b-instruct', name: 'Qwen3 Coder 480B', provider: 'Qwen' },\n      { id: 'qwen/qwen3.5-397b-a17b', name: 'Qwen3.5 397B', provider: 'Qwen' },\n      { id: 'qwen/qwen3.5-122b-a10b', name: 'Qwen3.5 122B', provider: 'Qwen' },\n      { id: 'qwen/qwen3-next-80b-a3b-thinking', name: 'Qwen3 Next 80B Thinking', provider: 'Qwen' },\n      { id: 'qwen/qwen2.5-coder-32b-instruct', name: 'Qwen2.5 Coder 32B', provider: 'Qwen' },\n      { id: 'qwen/qwq-32b', name: 'QwQ 32B', provider: 'Qwen' },\n    ],\n  },\n\n  // \u2500\u2500\u2500 OpenAI (open-source) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  {\n    name: 'OpenAI',\n    icon: '\\u{26AA}',  // \u26AA\n    models: [\n      { id: 'openai/gpt-oss-120b', name: 'GPT OSS 120B', provider: 'OpenAI' },\n    ],\n  },\n\n  // \u2500\u2500\u2500 Moonshotai / Kimi \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  {\n    name: 'Moonshotai / Kimi',\n    icon: '\\u{1F300}',  // \uD83C\uDF00\n    models: [\n      { id: 'moonshotai/kimi-k2-instruct', name: 'Kimi K2 Instruct', provider: 'Moonshotai' },\n      { id: 'moonshotai/kimi-k2-thinking', name: 'Kimi K2 Thinking', provider: 'Moonshotai' },\n      { id: 'moonshotai/kimi-k2.5', name: 'Kimi K2.5', provider: 'Moonshotai' },\n    ],\n  },\n]\n\n// \u2500\u2500\u2500 Flat list & search helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** All NIM models from the static catalog */\nexport const ALL_NIM_MODELS: NimModelEntry[] = NIM_PROVIDER_GROUPS.flatMap(g => g.models)\n\n/** Static catalog count */\nexport const NIM_MODEL_COUNT = ALL_NIM_MODELS.length\n\n// \u2500\u2500\u2500 Live model fetching \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Fetches actually-available models from the NIM API and caches them.\n// Models not found on the API are excluded from the picker to prevent 404s.\n\nlet _liveModelIds: Set<string> | null = null\nlet _liveModelsFetched = false\nlet _liveFetchPromise: Promise<void> | null = null\n\n/**\n * Fetch the list of currently available models from the NIM API.\n * Caches the result for the session. Returns empty set on failure.\n */\nexport async function fetchLiveNimModels(apiKey?: string): Promise<Set<string>> {\n  if (_liveModelIds) return _liveModelIds\n\n  // Avoid concurrent fetches\n  if (_liveFetchPromise) {\n    await _liveFetchPromise\n    return _liveModelIds ?? new Set()\n  }\n\n  _liveFetchPromise = (async () => {\n    try {\n      const baseUrl = process.env.NIM_BASE_URL ?? 'https://integrate.api.nvidia.com/v1'\n      const key = apiKey || process.env.NIM_API_KEY || ''\n      if (!key) {\n        _liveModelIds = new Set()\n        _liveModelsFetched = true\n        return\n      }\n\n      const response = await fetch(`${baseUrl}/models`, {\n        headers: {\n          'Authorization': `Bearer ${key}`,\n          'Content-Type': 'application/json',\n        },\n        signal: AbortSignal.timeout(10_000), // 10 second timeout\n      })\n\n      if (!response.ok) {\n        _liveModelIds = new Set()\n        _liveModelsFetched = true\n        return\n      }\n\n      const data = (await response.json()) as { data?: Array<{ id: string }> }\n      const ids = (data.data ?? []).map(m => m.id)\n      _liveModelIds = new Set(ids)\n      _liveModelsFetched = true\n    } catch {\n      _liveModelIds = new Set()\n      _liveModelsFetched = true\n    }\n  })()\n\n  await _liveFetchPromise\n  _liveFetchPromise = null\n  return _liveModelIds ?? new Set()\n}\n\n/** Whether live models have been fetched (even if the fetch failed) */\nexport function hasLiveModels(): boolean {\n  return _liveModelsFetched && _liveModelIds !== null && _liveModelIds.size > 0\n}\n\n/** Get the cached live model IDs, or null if not yet fetched */\nexport function getLiveModelIds(): Set<string> | null {\n  return _liveModelIds\n}\n\n/** Reset the live model cache (e.g. after re-login) */\nexport function resetLiveModelCache(): void {\n  _liveModelIds = null\n  _liveModelsFetched = false\n  _liveFetchPromise = null\n}\n\n/**\n * Build NimModelEntry list from live API model IDs.\n * Maps known models to their catalog metadata, and creates entries for unknown models.\n */\nexport function buildLiveModelList(liveIds: Set<string>): NimModelEntry[] {\n  const catalogMap = new Map<string, NimModelEntry>()\n  for (const m of ALL_NIM_MODELS) {\n    catalogMap.set(m.id, m)\n  }\n\n  const result: NimModelEntry[] = []\n  for (const id of liveIds) {\n    const known = catalogMap.get(id)\n    if (known) {\n      result.push(known)\n    } else {\n      // Model exists on NIM but not in our static catalog \u2014 include it anyway\n      const parts = id.split('/')\n      const provider = parts[0] ?? 'unknown'\n      const name = parts[1] ?? id\n      result.push({ id, name, provider })\n    }\n  }\n\n  return result.sort((a, b) => a.id.localeCompare(b.id))\n}\n\n/**\n * Build provider groups from live model IDs.\n * Groups models by their org prefix (e.g. \"meta/...\" \u2192 Meta group).\n */\nexport function buildLiveProviderGroups(liveIds: Set<string>): NimProviderGroup[] {\n  // Map of org prefix \u2192 known group info from static catalog\n  const knownGroupMap = new Map<string, { name: string; icon: string }>()\n  for (const group of NIM_PROVIDER_GROUPS) {\n    for (const m of group.models) {\n      const prefix = m.id.split('/')[0] ?? ''\n      if (prefix && !knownGroupMap.has(prefix)) {\n        knownGroupMap.set(prefix, { name: group.name, icon: group.icon })\n      }\n    }\n  }\n\n  // Group live models by org prefix\n  const groupMap = new Map<string, NimModelEntry[]>()\n  const catalogMap = new Map<string, NimModelEntry>()\n  for (const m of ALL_NIM_MODELS) catalogMap.set(m.id, m)\n\n  for (const id of liveIds) {\n    const prefix = id.split('/')[0] ?? 'other'\n    const known = catalogMap.get(id)\n    const entry: NimModelEntry = known ?? {\n      id,\n      name: id.split('/')[1] ?? id,\n      provider: prefix,\n    }\n    const list = groupMap.get(prefix) ?? []\n    list.push(entry)\n    groupMap.set(prefix, list)\n  }\n\n  // Convert to NimProviderGroup array, using known metadata when available\n  const groups: NimProviderGroup[] = []\n  for (const [prefix, models] of groupMap) {\n    const known = knownGroupMap.get(prefix)\n    groups.push({\n      name: known?.name ?? prefix,\n      icon: known?.icon ?? '\\u{1F4E6}',  // \uD83D\uDCE6\n      models: models.sort((a, b) => a.id.localeCompare(b.id)),\n    })\n  }\n\n  return groups.sort((a, b) => a.name.localeCompare(b.name))\n}\n\n// \u2500\u2500\u2500 Search functions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Search NIM models by query string.\n * If live models are available, searches only those; otherwise falls back to static catalog.\n */\nexport function searchNimModels(query: string, modelList?: NimModelEntry[]): NimModelEntry[] {\n  const models = modelList ?? (hasLiveModels() ? buildLiveModelList(_liveModelIds!) : ALL_NIM_MODELS)\n\n  if (!query.trim()) return models\n\n  const q = query.toLowerCase().trim()\n  const tokens = q.split(/\\s+/)\n\n  return models.filter(m => {\n    const haystack = `${m.id} ${m.name} ${m.provider}`.toLowerCase()\n    return tokens.every(t => haystack.includes(t))\n  }).sort((a, b) => {\n    const aIdMatch = a.id.toLowerCase().startsWith(q) ? 0 : 1\n    const bIdMatch = b.id.toLowerCase().startsWith(q) ? 0 : 1\n    if (aIdMatch !== bIdMatch) return aIdMatch - bIdMatch\n\n    const aNameMatch = a.name.toLowerCase().startsWith(q) ? 0 : 1\n    const bNameMatch = b.name.toLowerCase().startsWith(q) ? 0 : 1\n    if (aNameMatch !== bNameMatch) return aNameMatch - bNameMatch\n\n    return 0\n  })\n}\n\n/**\n * Filter provider groups by query.\n * If live models are available, uses only live groups; otherwise falls back to static catalog.\n */\nexport function filterProviderGroups(query: string, groups?: NimProviderGroup[]): NimProviderGroup[] {\n  const sourceGroups = groups\n    ?? (hasLiveModels() ? buildLiveProviderGroups(_liveModelIds!) : NIM_PROVIDER_GROUPS)\n\n  if (!query.trim()) return sourceGroups\n\n  const q = query.toLowerCase().trim()\n  const tokens = q.split(/\\s+/)\n\n  return sourceGroups\n    .map(group => ({\n      ...group,\n      models: group.models.filter(m => {\n        const haystack = `${m.id} ${m.name} ${m.provider}`.toLowerCase()\n        return tokens.every(t => haystack.includes(t))\n      }),\n    }))\n    .filter(group => group.models.length > 0)\n}\n", "/**\n * NVIDIA NIM provider \u2014 extends OpenAIProvider.\n *\n * NVIDIA NIM provides free hosted inference for top open-source models.\n * Uses OpenAI-compatible API at build.nvidia.com / integrate.api.nvidia.com.\n *\n * Base URL: https://integrate.api.nvidia.com/v1\n * Auth: Bearer token (nvapi-...)\n *\n * Payload optimization is handled by the base OpenAIProvider class.\n * NIM-specific env vars (NIM_MAX_TOKENS, NIM_MAX_SYSTEM_CHARS, NIM_NO_OPTIMIZE)\n * override the generic PROVIDER_* vars when set.\n *\n * This subclass adds:\n *   - Thinking model support (kimi-k2-thinking) with nvext.budget_tokens\n *   - Streaming fallback for models that don't support SSE\n */\n\nimport { OpenAIProvider } from './openai_provider.js'\nimport {\n  buildProviderStreamResult,\n  type AnthropicMessage,\n  type ModelInfo,\n  type ProviderConfig,\n  type ProviderRequestParams,\n  type ProviderStreamResult,\n} from './base_provider.js'\nimport { ALL_NIM_MODELS } from '../../../utils/model/nim_catalog.js'\nimport {\n  anthropicMessagesToOpenAI,\n  anthropicToolsToOpenAI,\n} from '../adapters/anthropic_to_openai.js'\nimport {\n  openAIStreamToAnthropicEvents,\n} from '../adapters/openai_to_anthropic.js'\n\n/** Models that support reasoning/thinking budget tokens */\nconst THINKING_MODELS = [\n  'moonshotai/kimi-k2-thinking',\n  'kimi-k2-thinking',\n]\n\nexport class NimProvider extends OpenAIProvider {\n  readonly name = 'nim'\n  /** Env-var fallback for users who want thinking on without the /thinking toggle */\n  private envEnableThinking: boolean\n  /** Default budget used when no explicit request budget is supplied */\n  private defaultThinkingBudget: number\n\n  constructor(config: ProviderConfig) {\n    super({\n      apiKey: config.apiKey,\n      baseUrl: config.baseUrl ?? 'https://integrate.api.nvidia.com/v1',\n      extraHeaders: config.extraHeaders,\n    })\n\n    // NIM-specific env vars override base class defaults\n    if (process.env.NIM_MAX_TOKENS) {\n      this.maxTokensCap = parseInt(process.env.NIM_MAX_TOKENS, 10)\n    }\n    if (process.env.NIM_MAX_SYSTEM_CHARS) {\n      this.maxSystemChars = parseInt(process.env.NIM_MAX_SYSTEM_CHARS, 10)\n    }\n    if (process.env.NIM_NO_OPTIMIZE === 'true') {\n      this.optimizePayload = false\n    }\n\n    // Kept as a fallback: if the user has NIM_ENABLE_THINKING=true in their\n    // env, thinking is forced on for kimi-k2-thinking even without /thinking.\n    this.envEnableThinking = process.env.NIM_ENABLE_THINKING === 'true'\n    this.defaultThinkingBudget = parseInt(\n      process.env.NIM_THINKING_BUDGET ?? '8192',\n      10,\n    )\n  }\n\n  /**\n   * NIM hosts large frontier models (Kimi K2, Llama 70B+, Qwen) that\n   * support full tool calling. Send the complete tool set and system\n   * prompt so agents, MCP servers, plan mode, and tasks all work.\n   */\n  protected optimizeParams(params: ProviderRequestParams): ProviderRequestParams {\n    return params\n  }\n\n  /**\n   * Return only models present in our curated NIM catalog.\n   * Fetches live IDs from the API and intersects with the allowlist,\n   * so junk/unknown models never appear in the picker.\n   */\n  async listModels(): Promise<ModelInfo[]> {\n    const allowlist = new Set(ALL_NIM_MODELS.map(m => m.id))\n\n    let liveIds: Set<string> | null = null\n    try {\n      const response = await fetch(`${this.baseUrl}/models`, {\n        headers: this._headers(),\n        signal: AbortSignal.timeout(8_000),\n      })\n      if (response.ok) {\n        const data = (await response.json()) as { data: Array<{ id: string }> }\n        liveIds = new Set((data.data ?? []).map(m => m.id))\n      }\n    } catch {\n      // API unreachable \u2014 fall through to static catalog\n    }\n\n    return ALL_NIM_MODELS\n      .filter(m => !liveIds || liveIds.has(m.id))\n      .map(m => ({ id: m.id, name: m.name, provider: m.provider }))\n  }\n\n  /**\n   * Override stream to handle NIM-specific features:\n   * - Thinking model budget tokens injection\n   * - Streaming fallback for models that don't support SSE\n   *\n   * Payload optimization is handled by the base class's stream() method.\n   */\n  async stream(params: ProviderRequestParams): Promise<ProviderStreamResult> {\n    const model = this.resolveModel(params.model)\n\n    // Thinking models need special handling (nvext.budget_tokens)\n    if (this._isThinkingModel(model)) {\n      return this._streamWithThinking(params, model)\n    }\n\n    try {\n      return await super.stream(params)\n    } catch (err: unknown) {\n      // Some NIM models don't support streaming \u2014 fall back to create\n      const errMsg = err instanceof Error ? err.message : String(err)\n      if (errMsg.includes('streaming') || errMsg.includes('not supported')) {\n        const message = await this.create(params)\n        return this._wrapAsStream(message)\n      }\n      throw err\n    }\n  }\n\n  // \u2500\u2500\u2500 Thinking Models \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n  /**\n   * Stream with NIM thinking extensions (nvext.budget_tokens).\n   * Builds the request manually to inject the nvext field.\n   */\n  private async _streamWithThinking(\n    params: ProviderRequestParams,\n    model: string,\n  ): Promise<ProviderStreamResult> {\n    // Apply base class optimization before building the custom request\n    const optimized = this.optimizeParams(params)\n    const messages = anthropicMessagesToOpenAI(optimized.messages, optimized.system)\n    const tools = optimized.tools ? anthropicToolsToOpenAI(optimized.tools) : undefined\n\n    // Kimi K2 Thinking can spend 4\u20138k tokens in `reasoning_content` before\n    // it starts emitting the final answer. If `max_tokens` is the generic\n    // optimized cap (often 4096), the model hits the ceiling mid-thought\n    // and the user sees \"nothing happened\" even though the request\n    // succeeded. Raise the floor for thinking-capable NIM models so there\n    // is always room for reasoning + answer.\n    //\n    // Tunable: NIM_THINKING_MIN_MAX_TOKENS, NIM_MAX_TOKENS.\n    const thinkingMinMaxTokens = parseInt(\n      process.env.NIM_THINKING_MIN_MAX_TOKENS ?? '16384',\n      10,\n    )\n    const effectiveMaxTokens = Math.max(\n      optimized.max_tokens ?? 0,\n      thinkingMinMaxTokens,\n    )\n\n    const body: Record<string, unknown> = {\n      model,\n      messages,\n      max_tokens: effectiveMaxTokens,\n      stream: true,\n      stream_options: { include_usage: true },\n    }\n    if (tools && tools.length > 0) {\n      body.tools = tools\n      body.tool_choice = 'auto'\n    }\n    if (optimized.temperature !== undefined) body.temperature = optimized.temperature\n    if (optimized.stop_sequences) body.stop = optimized.stop_sequences\n\n    // Resolve thinking budget. Precedence:\n    //   1. params.thinking.budget_tokens (from /thinking toggle via claude.ts)\n    //   2. NIM_ENABLE_THINKING env var (uses NIM_THINKING_BUDGET)\n    // If thinking is explicitly 'disabled' on params, skip entirely even\n    // if the env var is set \u2014 the user just turned it off via /thinking.\n    const reqThinking = optimized.thinking\n    let budget: number | undefined\n    if (reqThinking && reqThinking.type === 'enabled') {\n      budget = reqThinking.budget_tokens\n    } else if (reqThinking && reqThinking.type === 'adaptive') {\n      budget = this.defaultThinkingBudget\n    } else if (\n      (!reqThinking || reqThinking.type !== 'disabled') &&\n      this.envEnableThinking\n    ) {\n      budget = this.defaultThinkingBudget\n    }\n    if (budget !== undefined) {\n      body.nvext = { budget_tokens: budget }\n    }\n\n    const ac = new AbortController()\n    const response = await fetch(`${this.baseUrl}/chat/completions`, {\n      method: 'POST',\n      headers: this._headers(),\n      body: JSON.stringify(body),\n      signal: ac.signal,\n    })\n\n    if (!response.ok) {\n      const errText = await response.text().catch(() => '')\n      throw new Error(`NIM API error ${response.status}: ${errText}`)\n    }\n\n    if (!response.body) {\n      throw new Error('NIM returned no response body for streaming request')\n    }\n\n    const sseStream = this._parseSSE(response.body)\n    const anthropicEvents = openAIStreamToAnthropicEvents(sseStream)\n    return buildProviderStreamResult(anthropicEvents, ac)\n  }\n\n  private _isThinkingModel(model: string): boolean {\n    return THINKING_MODELS.some(tm => model.includes(tm))\n  }\n\n  /** Wrap a non-streaming response as a ProviderStreamResult */\n  private _wrapAsStream(message: AnthropicMessage): ProviderStreamResult {\n    const events = (async function* () {\n      yield {\n        type: 'message_start' as const,\n        message,\n      }\n      for (let i = 0; i < message.content.length; i++) {\n        const block = message.content[i]!\n        yield {\n          type: 'content_block_start' as const,\n          index: i,\n          content_block: block,\n        }\n        yield { type: 'content_block_stop' as const, index: i }\n      }\n      yield {\n        type: 'message_delta' as const,\n        delta: {\n          stop_reason: message.stop_reason ?? 'end_turn',\n          stop_sequence: null,\n        },\n        usage: { output_tokens: message.usage.output_tokens },\n      }\n      yield { type: 'message_stop' as const }\n    })()\n\n    const result: ProviderStreamResult = {\n      [Symbol.asyncIterator]() { return events[Symbol.asyncIterator]() },\n      async finalMessage() { return message },\n      on(event: string, cb: (msg: AnthropicMessage) => void) {\n        if (event === 'message') cb(message)\n        return result\n      },\n      abort() { /* no-op for non-streaming */ },\n    }\n    return result\n  }\n}\n", "/**\n * DeepSeek provider \u2014 extends OpenAIProvider.\n *\n * DeepSeek uses an OpenAI-compatible API with some extensions\n * for reasoning models (R1 series).\n *\n * Base URL: https://api.deepseek.com/v1\n * Auth: Bearer token (sk-...)\n * API: OpenAI-compatible\n *\n * Available models (April 2026):\n *   - deepseek-chat            \u2014 Latest chat model (V3)\n *   - deepseek-reasoner        \u2014 Reasoning model (R1)\n *   - deepseek-coder           \u2014 Code-specialized model\n *\n * DeepSeek R1 reasoning:\n *   - Returns reasoning_content in the response\n *   - We strip this during normalization (Anthropic has no equivalent)\n *   - The final answer is in the regular content field\n *\n * Auth: API key only (no OAuth). Get key at https://platform.deepseek.com\n */\n\nimport { OpenAIProvider } from './openai_provider.js'\nimport type {\n  ProviderConfig,\n  ProviderRequestParams,\n  ProviderStreamResult,\n  AnthropicMessage,\n} from './base_provider.js'\n\nexport class DeepSeekProvider extends OpenAIProvider {\n  readonly name = 'deepseek'\n\n  constructor(config: ProviderConfig) {\n    super({\n      apiKey: config.apiKey,\n      baseUrl: config.baseUrl ?? 'https://api.deepseek.com/v1',\n      extraHeaders: config.extraHeaders,\n    })\n  }\n\n  /**\n   * Override stream to handle DeepSeek-specific features:\n   * - R1 reasoning models may return reasoning_content alongside content\n   * - Some older endpoints use /chat/completions directly\n   */\n  async stream(params: ProviderRequestParams): Promise<ProviderStreamResult> {\n    return super.stream(params)\n  }\n\n  async create(params: ProviderRequestParams): Promise<AnthropicMessage> {\n    return super.create(params)\n  }\n}\n", "/**\n * GLM provider for BigModel's OpenAI-compatible API.\n */\n\nimport { OpenAIProvider } from './openai_provider.js'\nimport type { ModelInfo, ProviderConfig } from './base_provider.js'\n\nconst GLM_MODELS: ModelInfo[] = [\n  {\n    id: 'glm-5.1',\n    name: 'GLM-5.1',\n    contextWindow: 200_000,\n    supportsToolCalling: true,\n    tags: ['recommended', 'reasoning'],\n  },\n  {\n    id: 'glm-5-turbo',\n    name: 'GLM-5-Turbo',\n    contextWindow: 200_000,\n    supportsToolCalling: true,\n    tags: ['fast', 'reasoning'],\n  },\n  {\n    id: 'glm-5',\n    name: 'GLM-5',\n    contextWindow: 200_000,\n    supportsToolCalling: true,\n    tags: ['reasoning'],\n  },\n  {\n    id: 'glm-4.7',\n    name: 'GLM-4.7',\n    contextWindow: 200_000,\n    supportsToolCalling: true,\n    tags: ['reasoning'],\n  },\n]\n\nexport class GlmProvider extends OpenAIProvider {\n  readonly name = 'glm'\n\n  constructor(config: ProviderConfig) {\n    super({\n      apiKey: config.apiKey,\n      baseUrl: config.baseUrl ?? 'https://open.bigmodel.cn/api/paas/v4',\n      extraHeaders: config.extraHeaders,\n    })\n    this.optimizePayload = false\n  }\n\n  async listModels(): Promise<ModelInfo[]> {\n    return GLM_MODELS.map(model => ({ ...model, tags: model.tags ? [...model.tags] : undefined }))\n  }\n\n  resolveModel(claudeModel: string): string {\n    return normalizeGlmModelId(super.resolveModel(claudeModel))\n  }\n}\n\nfunction normalizeGlmModelId(model: string): string {\n  const trimmed = model.trim()\n  return /^glm-/i.test(trimmed) ? trimmed.toLowerCase() : model\n}\n", "import type { ModelInfo } from '../../services/api/providers/base_provider.js'\n\nexport const MOONSHOT_MODELS: readonly ModelInfo[] = [\n  {\n    id: 'kimi-k2.6',\n    name: 'Kimi K2.6',\n    contextWindow: 262_144,\n    supportsToolCalling: true,\n    tags: ['recommended', 'reasoning'],\n  },\n  {\n    id: 'kimi-k2.5',\n    name: 'Kimi K2.5',\n    contextWindow: 262_144,\n    supportsToolCalling: true,\n    tags: ['reasoning'],\n  },\n  {\n    id: 'kimi-k2-thinking',\n    name: 'Kimi K2 Thinking',\n    contextWindow: 262_144,\n    supportsToolCalling: true,\n    tags: ['reasoning'],\n  },\n  {\n    id: 'kimi-k2-thinking-turbo',\n    name: 'Kimi K2 Thinking Turbo',\n    contextWindow: 262_144,\n    supportsToolCalling: true,\n    tags: ['fast', 'reasoning'],\n  },\n  {\n    id: 'kimi-k2-turbo-preview',\n    name: 'Kimi K2 Turbo',\n    contextWindow: 262_144,\n    supportsToolCalling: true,\n    tags: ['fast'],\n  },\n  {\n    id: 'kimi-k2-0905-preview',\n    name: 'Kimi K2 0905',\n    contextWindow: 262_144,\n    supportsToolCalling: true,\n  },\n  {\n    id: 'kimi-k2-0711-preview',\n    name: 'Kimi K2 0711',\n    contextWindow: 131_072,\n    supportsToolCalling: true,\n  },\n] as const\n\nconst MOONSHOT_MODEL_META = new Map(\n  MOONSHOT_MODELS.map(model => [model.id, model] as const),\n)\n\nexport function cloneMoonshotModelInfo(model: ModelInfo): ModelInfo {\n  return {\n    ...model,\n    tags: model.tags ? [...model.tags] : undefined,\n  }\n}\n\nexport function toMoonshotModelInfo(model: { id: string; name?: string }): ModelInfo {\n  const id = model.id.trim()\n  const known = MOONSHOT_MODEL_META.get(id.toLowerCase())\n  if (known) {\n    return {\n      ...cloneMoonshotModelInfo(known),\n      name: model.name && model.name.trim() ? model.name.trim() : known.name,\n    }\n  }\n\n  return {\n    id,\n    name: model.name && model.name.trim() ? model.name.trim() : humanizeMoonshotModelId(id),\n    supportsToolCalling: true,\n    ...(looksLikeMoonshotThinkingModel(id) ? { tags: ['reasoning'] as const } : {}),\n  }\n}\n\nexport function isMoonshotChatModelId(id: string): boolean {\n  const normalized = id.trim().toLowerCase()\n  return normalized.startsWith('kimi-') || normalized.startsWith('moonshot-')\n}\n\nexport function normalizeMoonshotModelId(model: string): string {\n  const trimmed = model.trim()\n  const lower = trimmed.toLowerCase()\n  return isMoonshotChatModelId(lower) ? lower : model\n}\n\nexport function isMoonshotThinkingModel(model: string): boolean {\n  const normalized = normalizeMoonshotModelId(model)\n  return looksLikeMoonshotThinkingModel(normalized)\n}\n\nfunction looksLikeMoonshotThinkingModel(id: string): boolean {\n  const normalized = id.trim().toLowerCase()\n  return normalized.includes('kimi-k2-thinking')\n    || normalized === 'kimi-k2.5'\n    || normalized === 'kimi-k2.6'\n}\n\nfunction humanizeMoonshotModelId(id: string): string {\n  return id\n    .replace(/^models\\//i, '')\n    .split(/[-_]+/g)\n    .filter(Boolean)\n    .map(part => {\n      if (part.toLowerCase() === 'kimi') return 'Kimi'\n      if (/^k\\d/.test(part.toLowerCase())) return part.toUpperCase()\n      return part.charAt(0).toUpperCase() + part.slice(1)\n    })\n    .join(' ')\n}\n", "/**\n * Moonshot AI / Kimi provider.\n *\n * Moonshot's public API speaks the OpenAI Chat Completions shape at\n * https://api.moonshot.ai/v1 with bearer-token authentication.\n */\n\nimport { OpenAIProvider } from './openai_provider.js'\nimport type { ModelInfo, ProviderConfig } from './base_provider.js'\nimport {\n  MOONSHOT_MODELS,\n  cloneMoonshotModelInfo,\n  isMoonshotChatModelId,\n  normalizeMoonshotModelId,\n  toMoonshotModelInfo,\n} from '../../../utils/model/moonshotCatalog.js'\n\nexport class MoonshotProvider extends OpenAIProvider {\n  readonly name = 'moonshot'\n\n  constructor(config: ProviderConfig) {\n    super({\n      apiKey: config.apiKey,\n      baseUrl: config.baseUrl ?? 'https://api.moonshot.ai/v1',\n      extraHeaders: config.extraHeaders,\n    })\n    this.optimizePayload = false\n  }\n\n  async listModels(): Promise<ModelInfo[]> {\n    try {\n      const response = await fetch(`${this.baseUrl}/models`, {\n        headers: this._headers(),\n        signal: AbortSignal.timeout(8_000),\n      })\n      if (response.ok) {\n        const data = (await response.json()) as { data?: Array<{ id?: string; name?: string }> }\n        const apiModels = (data.data ?? [])\n          .flatMap(model => {\n            if (typeof model.id !== 'string' || !isMoonshotChatModelId(model.id)) {\n              return []\n            }\n            return [toMoonshotModelInfo({ id: model.id, name: model.name })]\n          })\n        if (apiModels.length > 0) return apiModels\n      }\n    } catch {\n      // API unreachable or token cannot list models; use curated fallback.\n    }\n\n    return MOONSHOT_MODELS.map(cloneMoonshotModelInfo)\n  }\n\n  resolveModel(claudeModel: string): string {\n    return normalizeMoonshotModelId(super.resolveModel(claudeModel))\n  }\n}\n", "/**\n * MiniMax AI provider -- OpenAI-compatible chat completions.\n *\n * Primary routing uses the shared openai-compat lane. This legacy shim\n * exists for CLAUDEX_NATIVE_LANES=off and other fallback paths.\n */\n\nimport { OpenAIProvider } from './openai_provider.js'\nimport type { ProviderConfig } from './base_provider.js'\n\nexport class MiniMaxProvider extends OpenAIProvider {\n  readonly name = 'minimax'\n\n  constructor(config: ProviderConfig) {\n    super({\n      apiKey: config.apiKey,\n      baseUrl: config.baseUrl ?? 'https://api.minimax.io/v1',\n      extraHeaders: config.extraHeaders,\n    })\n  }\n}\n", "/**\n * Ollama model catalog \u2014 cloud + local detection, capability probing,\n * and first-launch auto-pull.\n *\n * Background:\n * - Ollama hosts \"cloud models\" identified by a :cloud suffix. They run on\n *   ollama.com infrastructure but are invoked through the same localhost\n *   Ollama runtime, so the CLI workflow is identical once the reference has\n *   been pulled once (the pull just registers the cloud-side alias).\n * - Local models have heterogeneous capabilities. Some support tool-calling,\n *   some do not. Tau issues tool-use requests that break on models\n *   without tool support, so we hide those from the picker.\n * - Some cloud models support `enable_thinking` \u2014 a per-request parameter\n *   that toggles reasoning output. The UI exposes this as a toggle, but it\n *   must only be sent to models that understand it (or providers 400).\n *\n * This module owns:\n *   1. CLOUD_MODELS_LIST \u2014 curated approved list\n *   2. THINKING_CLOUD_MODELS \u2014 subset that supports enable_thinking\n *   3. getOllamaCatalog() \u2014 fetches local models, splits into {cloud, local,\n *      toolless}, augments with capability info via /api/show\n *   4. ensureCloudModelsPulled() \u2014 idempotent pre-pull used on first launch\n */\n\nimport { execFile } from 'child_process'\nimport { promisify } from 'util'\nimport type { ModelInfo } from '../../services/api/providers/base_provider.js'\nimport { getGlobalConfig, saveGlobalConfig } from '../config.js'\n\nconst exec = promisify(execFile)\n\n/**\n * Non-fatal debug logger. Cloud-model prime failures and Ollama daemon\n * absence should never surface as errors to the user \u2014 but we do want the\n * trail when debugging, so route to logError only when it's a real Error\n * (avoids spamming the error log with \"daemon not running\" strings).\n */\nfunction debugLog(message: string): void {\n  if (process.env.DEBUG || process.env.OLLAMA_DEBUG) {\n    // eslint-disable-next-line no-console\n    console.error(`[ollamaCatalog] ${message}`)\n  }\n}\n\n// \u2500\u2500\u2500 Approved cloud model list \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// These are the cloud aliases we pre-pull on install / first launch and\n// always show in the /models picker under \"Cloud\". Only `:cloud` aliases\n// that actually resolve against the Ollama registry are listed \u2014 each\n// entry must return success for `ollama pull <id>`.\n//\n// KEEP IN SYNC with scripts/postinstall.mjs (OLLAMA_CLOUD_MODELS).\nexport const CLOUD_MODELS_LIST: readonly string[] = [\n  'glm-5.1:cloud',\n  'glm-5:cloud',\n  'glm-4.7:cloud',\n  'glm-4.6:cloud',\n  'kimi-k2.5:cloud',\n  'kimi-k2-thinking:cloud',\n  'qwen3.5:cloud',\n  'qwen3-coder-next:cloud',\n  'minimax-m2.7:cloud',\n  'minimax-m2.5:cloud',\n  'minimax-m2.1:cloud',\n  'minimax-m2:cloud',\n  'nemotron-3-super:cloud',\n  'deepseek-v3.2:cloud',\n  'gemini-3-flash-preview:cloud',\n]\n\n// \u2500\u2500\u2500 Thinking-mode cloud models \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// Models that respect `enable_thinking: true|false` as a request parameter.\n// For other models we omit the parameter entirely (sending it anyway trips a\n// 400 on some providers).\nexport const THINKING_CLOUD_MODELS: ReadonlySet<string> = new Set([\n  'glm-5.1:cloud',\n  'glm-5:cloud',\n  'glm-4.7:cloud',\n  'glm-4.6:cloud',\n  'kimi-k2-thinking:cloud',\n  'qwen3.5:cloud',\n  'minimax-m2.7:cloud',\n  'minimax-m2.5:cloud',\n  'deepseek-v3.2:cloud',\n])\n\n/** True if the given model accepts the `enable_thinking` parameter. */\nexport function modelSupportsThinkingToggle(modelId: string): boolean {\n  return THINKING_CLOUD_MODELS.has(modelId)\n}\n\n// \u2500\u2500\u2500 Thinking toggle bridge \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// React owns the \"thinking on/off\" app state but the provider layer is\n// deliberately framework-free. This tiny bridge lets REPL mirror the\n// current toggle value here on every change, and lets the provider read\n// it at request time without importing any React plumbing.\n//\n// Default is ON \u2014 matches shouldEnableThinkingByDefault() so a user who\n// never toggles gets sensible behavior out of the box.\n\nlet _thinkingToggleState = true\n\n/** Called from React (REPL) whenever `thinkingEnabled` AppState changes. */\nexport function setOllamaThinkingEnabled(enabled: boolean): void {\n  _thinkingToggleState = enabled\n}\n\n/** Read by providers when building a request body. */\nexport function getOllamaThinkingEnabled(): boolean {\n  return _thinkingToggleState\n}\n\n// \u2500\u2500\u2500 Capability-aware ModelInfo \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type OllamaModelCategory = 'cloud' | 'local'\n\nexport interface OllamaModelInfo extends ModelInfo {\n  category: OllamaModelCategory\n  /** True when the model is already pulled in the local Ollama install. */\n  pulled: boolean\n  /** True when the model can accept Tau tool definitions. */\n  supportsTools: boolean\n  /** True when the model supports the thinking/reasoning toggle. */\n  supportsThinking: boolean\n}\n\nexport interface OllamaCatalog {\n  cloud: OllamaModelInfo[]\n  local: OllamaModelInfo[]\n  toolless: OllamaModelInfo[]\n}\n\n// Known base families that we trust to support tool-calling properly.\n// Tested against the models listed in amelioration.txt and the Ollama\n// registry as of early 2026. If a model's name contains any of these\n// substrings we consider it tool-capable.\nconst TOOLS_CAPABLE_NAMES: readonly string[] = [\n  'llama3.1',\n  'llama3.2',\n  'llama3.3',\n  'llama4',\n  'qwen3',\n  'qwen2.5',\n  'mistral-large',\n  'mistral-small',\n  'devstral',\n  'command-r',\n  'hermes',\n  'gpt-oss',\n  'granite3',\n  'nemotron',\n  'glm-4',\n  'glm-5',\n  'kimi-k2',\n  'deepseek-v3',\n  'minimax-m2',\n  'gemini-3',\n  'rnj-1',\n  'gemma4',\n  'ministral',\n]\n\nfunction inferToolsSupport(modelId: string): boolean {\n  const lower = modelId.toLowerCase()\n  return TOOLS_CAPABLE_NAMES.some(n => lower.includes(n))\n}\n\n// \u2500\u2500\u2500 Talking to Ollama \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Resolve the Ollama base URL from env or config, defaulting to localhost. */\nfunction ollamaBase(): string {\n  const env =\n    process.env.OLLAMA_HOST ??\n    process.env.OLLAMA_BASE_URL ??\n    ''\n  if (env) {\n    // OLLAMA_HOST may be \"127.0.0.1:11434\" without a scheme\n    return /^https?:/i.test(env) ? env.replace(/\\/$/, '') : `http://${env}`\n  }\n  return 'http://localhost:11434'\n}\n\ninterface ApiTagsResponse {\n  models?: Array<{\n    name: string\n    model?: string\n    details?: { family?: string; parameter_size?: string }\n  }>\n}\n\n/**\n * List models currently pulled in the local Ollama install. Returns an\n * empty array if Ollama isn't running. Never throws \u2014 the picker should\n * degrade gracefully when the daemon is offline.\n */\nexport async function listLocalOllamaModels(): Promise<string[]> {\n  try {\n    const response = await fetch(`${ollamaBase()}/api/tags`)\n    if (!response.ok) return []\n    const data = (await response.json()) as ApiTagsResponse\n    return (data.models ?? []).map(m => m.name).filter(Boolean)\n  } catch (error) {\n    debugLog(\n      `[OllamaCatalog] listLocalOllamaModels failed: ${\n        error instanceof Error ? error.message : String(error)\n      }`,\n    )\n    return []\n  }\n}\n\n/**\n * Fetch an Ollama catalog split into cloud / local / toolless sections.\n *\n * Cloud models come from the fixed approved list. A cloud model is\n * considered \"pulled\" when its exact name also appears in /api/tags (Ollama\n * registers a local alias once the user has run `ollama pull <name>`).\n *\n * Local models come from /api/tags minus anything that matches a cloud\n * entry. We then split them by tools support \u2014 tool-less models surface as\n * the toolless section (hidden by default but accessible via a warning UI).\n */\nexport async function getOllamaCatalog(): Promise<OllamaCatalog> {\n  const pulled = new Set(await listLocalOllamaModels())\n  const cloudSet = new Set(CLOUD_MODELS_LIST)\n\n  const cloud: OllamaModelInfo[] = CLOUD_MODELS_LIST.map(id => ({\n    id,\n    name: id,\n    category: 'cloud' as const,\n    pulled: pulled.has(id),\n    supportsTools: true,\n    supportsThinking: THINKING_CLOUD_MODELS.has(id),\n  }))\n\n  const local: OllamaModelInfo[] = []\n  const toolless: OllamaModelInfo[] = []\n\n  for (const id of pulled) {\n    if (cloudSet.has(id)) continue // already in the cloud section\n    const supportsTools = inferToolsSupport(id)\n    const entry: OllamaModelInfo = {\n      id,\n      name: id,\n      category: 'local',\n      pulled: true,\n      supportsTools,\n      supportsThinking: false,\n    }\n    if (supportsTools) {\n      local.push(entry)\n    } else {\n      toolless.push(entry)\n    }\n  }\n\n  // Stable, case-insensitive ordering per section.\n  const byName = (a: OllamaModelInfo, b: OllamaModelInfo) =>\n    a.id.toLowerCase().localeCompare(b.id.toLowerCase())\n  local.sort(byName)\n  toolless.sort(byName)\n\n  return { cloud, local, toolless }\n}\n\n// \u2500\u2500\u2500 First-launch auto-pull \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Config flag that records whether we've already run the auto-pull pass. */\nconst FIRST_PULL_FLAG = 'ollamaCloudModelsPrimedAt' as const\n\n/**\n * On first launch, pull each model in CLOUD_MODELS_LIST that isn't already\n * present in the local Ollama install. Safe to call on every launch \u2014 we\n * record completion in GlobalConfig and short-circuit afterwards.\n *\n * Implementation uses the native `ollama` CLI rather than the HTTP API\n * because `/api/pull` streams progress events that we'd have to consume\n * manually, while `ollama pull` handles progress reporting and exits cleanly\n * when done.\n *\n * All failures are swallowed \u2014 a user without Ollama installed should not\n * see an error at startup, and a transient network failure should just\n * retry on the next launch.\n */\nexport async function ensureCloudModelsPrimed(): Promise<void> {\n  const config = getGlobalConfig() as Record<string, unknown>\n  if (config[FIRST_PULL_FLAG]) {\n    return\n  }\n\n  // Check if ollama is even installed before trying anything.\n  try {\n    await exec('ollama', ['--version'], { timeout: 5000 })\n  } catch {\n    debugLog(\n      '[OllamaCatalog] skipping cloud-model prime \u2014 ollama CLI not found',\n    )\n    return\n  }\n\n  const pulled = new Set(await listLocalOllamaModels())\n  const missing = CLOUD_MODELS_LIST.filter(id => !pulled.has(id))\n\n  if (missing.length === 0) {\n    saveGlobalConfig(current => ({\n      ...current,\n      [FIRST_PULL_FLAG]: Date.now(),\n    }))\n    return\n  }\n\n  debugLog(\n    `[OllamaCatalog] first-launch pulling ${missing.length} cloud models`,\n  )\n\n  // Pull sequentially so we don't hammer the registry and so a single\n  // failing model doesn't block the rest.\n  for (const id of missing) {\n    try {\n      await exec('ollama', ['pull', id], { timeout: 5 * 60 * 1000 })\n      debugLog(`[OllamaCatalog] pulled ${id}`)\n    } catch (error) {\n      debugLog(\n        `[OllamaCatalog] pull failed for ${id}: ${\n          error instanceof Error ? error.message : String(error)\n        }`,\n      )\n      // Keep going \u2014 partial success is still useful.\n    }\n  }\n\n  saveGlobalConfig(current => ({\n    ...current,\n    [FIRST_PULL_FLAG]: Date.now(),\n  }))\n}\n", "/**\n * Ollama provider \u2014 extends OpenAIProvider.\n *\n * Ollama exposes an OpenAI-compatible API at /v1/chat/completions.\n * Default base URL: http://localhost:11434/v1\n *\n * Key differences from standard OpenAI:\n *   - max_tokens may not be supported by all models; we use num_predict as fallback\n *   - Models are local and may have smaller context windows\n *   - No API key required by default\n *\n * Auth: None by default (local server)\n */\n\nimport { OpenAIProvider } from './openai_provider.js'\nimport {\n  buildProviderStreamResult,\n  type ProviderConfig,\n  type ProviderRequestParams,\n  type ProviderStreamResult,\n  type AnthropicMessage,\n  type ModelInfo,\n} from './base_provider.js'\nimport {\n  anthropicMessagesToOpenAI,\n  anthropicToolsToOpenAI,\n} from '../adapters/anthropic_to_openai.js'\nimport {\n  openAIStreamToAnthropicEvents,\n} from '../adapters/openai_to_anthropic.js'\nimport {\n  getOllamaThinkingEnabled,\n  modelSupportsThinkingToggle,\n} from '../../../utils/model/ollamaCatalog.js'\n\n// Ollama-specific latency-optimised defaults. Smaller local models (7B/14B)\n// spend significant prefill time processing a 6 KB Claude-style system prompt\n// plus 11 tool schemas, so for every \"simple stuff\" reply we'd wait 10\u201330s\n// before the first token. Tightening these cuts TTFT dramatically with no\n// visible quality loss for short interactive prompts.\n//\n// Respects the standard PROVIDER_* env vars so power users can still opt in\n// to bigger prompts/budgets via env. Only applied when the Ollama-specific\n// OLLAMA_* vars aren't set.\nconst OLLAMA_DEFAULT_MAX_TOKENS = 2048\nconst OLLAMA_DEFAULT_MAX_SYSTEM_CHARS = 2400\n\nexport class OllamaProvider extends OpenAIProvider {\n  readonly name = 'ollama'\n\n  constructor(config: ProviderConfig) {\n    super({\n      apiKey: config.apiKey || 'ollama', // Ollama doesn't require auth\n      baseUrl: config.baseUrl ?? 'http://localhost:11434/v1',\n      extraHeaders: config.extraHeaders,\n    })\n\n    // Tighten payload defaults for local Ollama \u2014 dramatically reduces TTFT\n    // for short prompts on small models. The base class already reads\n    // PROVIDER_MAX_TOKENS / PROVIDER_MAX_SYSTEM_CHARS; we only override when\n    // the user hasn't set Ollama-specific overrides or the generic ones.\n    if (!process.env.OLLAMA_MAX_TOKENS && !process.env.PROVIDER_MAX_TOKENS) {\n      this.maxTokensCap = OLLAMA_DEFAULT_MAX_TOKENS\n    } else if (process.env.OLLAMA_MAX_TOKENS) {\n      this.maxTokensCap = parseInt(process.env.OLLAMA_MAX_TOKENS, 10)\n    }\n\n    if (!process.env.OLLAMA_MAX_SYSTEM_CHARS && !process.env.PROVIDER_MAX_SYSTEM_CHARS) {\n      this.maxSystemChars = OLLAMA_DEFAULT_MAX_SYSTEM_CHARS\n    } else if (process.env.OLLAMA_MAX_SYSTEM_CHARS) {\n      this.maxSystemChars = parseInt(process.env.OLLAMA_MAX_SYSTEM_CHARS, 10)\n    }\n\n    if (process.env.OLLAMA_NO_OPTIMIZE === 'true') {\n      this.optimizePayload = false\n    }\n  }\n\n  /**\n   * Ollama runs locally \u2014 no TPM limits, no reason to strip tools.\n   * Send the full tool set so agents, MCP servers, plan mode, and\n   * tasks all work. Users with small models can set\n   * OLLAMA_NO_OPTIMIZE=false or PROVIDER_MAX_SYSTEM_CHARS to tune.\n   */\n  protected optimizeParams(params: ProviderRequestParams): ProviderRequestParams {\n    return params\n  }\n\n  /**\n   * Override to handle Ollama-specific behavior:\n   *   - Pre-flight health check on /api/tags so we fail fast (< 5s) with\n   *     an actionable error message when the daemon isn't running,\n   *     instead of hanging on a dead socket for minutes.\n   *   - Some models don't support max_tokens \u2192 retry without\n   *   - Cloud thinking models get an `enable_thinking` parameter when the\n   *     user's thinking toggle is on (otherwise we omit the field entirely,\n   *     since non-thinking models 400 on unknown params).\n   */\n  async stream(params: ProviderRequestParams): Promise<ProviderStreamResult> {\n    await this._assertDaemonReachable()\n\n    if (modelSupportsThinkingToggle(params.model)) {\n      return this._streamWithThinkingToggle(params)\n    }\n\n    try {\n      return await super.stream(params)\n    } catch (err: any) {\n      // If max_tokens caused an error, retry without it\n      if (err?.message?.includes('max_tokens')) {\n        return super.stream({ ...params, max_tokens: -1 })\n      }\n      throw err\n    }\n  }\n\n  /**\n   * Probe the Ollama daemon's /api/tags endpoint with a short timeout\n   * (configurable via OLLAMA_CONNECT_TIMEOUT_MS, default 4 s). Throws\n   * a user-friendly error if the daemon is unreachable \u2014 the previous\n   * behaviour was to let the chat-completions fetch hang for minutes on\n   * a dead TCP socket before failing with an unhelpful network error.\n   */\n  private async _assertDaemonReachable(): Promise<void> {\n    const timeoutMs = parseInt(\n      process.env.OLLAMA_CONNECT_TIMEOUT_MS ?? '4000',\n      10,\n    )\n    // /api/tags lives at the daemon root, NOT under the OpenAI /v1 path.\n    const rootUrl = this.baseUrl.replace(/\\/v1\\/?$/i, '').replace(/\\/+$/, '')\n\n    const controller = new AbortController()\n    const timer = setTimeout(() => controller.abort(), timeoutMs)\n\n    try {\n      const res = await fetch(`${rootUrl}/api/tags`, {\n        signal: controller.signal,\n      })\n      if (!res.ok) {\n        throw new Error(\n          `Ollama daemon at ${rootUrl} answered with HTTP ${res.status}. ` +\n            `Check the daemon log.`,\n        )\n      }\n    } catch (err: unknown) {\n      const reason =\n        err instanceof Error && err.name === 'AbortError'\n          ? `timed out after ${timeoutMs}ms`\n          : err instanceof Error\n            ? err.message\n            : String(err)\n      throw new Error(\n        `Ollama is not responding at ${rootUrl} (${reason}).\\n` +\n          `  \u2022 Start the daemon: \\`ollama serve\\`\\n` +\n          `  \u2022 Or change the base URL from /provider \u2192 Ollama \u2192 Set custom base URL\\n` +\n          `  \u2022 Or set OLLAMA_BASE_URL to the host you want to use.`,\n      )\n    } finally {\n      clearTimeout(timer)\n    }\n  }\n\n  /**\n   * Build the chat-completions request manually so we can inject the\n   * `enable_thinking` flag for Ollama Cloud thinking models. The flag is\n   * read from the shared bridge in ollamaCatalog so React AppState is the\n   * single source of truth.\n   */\n  private async _streamWithThinkingToggle(\n    params: ProviderRequestParams,\n  ): Promise<ProviderStreamResult> {\n    const optimized = this.optimizeParams(params)\n    const model = this.resolveModel(optimized.model)\n    const messages = anthropicMessagesToOpenAI(optimized.messages, optimized.system)\n    const tools = optimized.tools ? anthropicToolsToOpenAI(optimized.tools) : undefined\n\n    // Per-request thinking toggle \u2014 prefer the explicit params.thinking\n    // field (set by claude.ts from AppState.thinkingEnabled). Fall back to\n    // the shared bridge for legacy call sites that don't pass it.\n    const thinkingFromParams =\n      optimized.thinking === undefined\n        ? undefined\n        : optimized.thinking.type !== 'disabled'\n    const enableThinking =\n      thinkingFromParams ?? getOllamaThinkingEnabled()\n\n    const body: Record<string, unknown> = {\n      model,\n      messages,\n      max_tokens: optimized.max_tokens,\n      stream: true,\n      stream_options: { include_usage: true },\n      // Ollama cloud thinking models honour this field; we only send it\n      // for models in the allowlist so non-thinking providers never break.\n      enable_thinking: enableThinking,\n    }\n    if (tools && tools.length > 0) {\n      body.tools = tools\n      body.tool_choice = 'auto'\n    }\n    if (optimized.temperature !== undefined) body.temperature = optimized.temperature\n    if (optimized.stop_sequences) body.stop = optimized.stop_sequences\n\n    const ac = new AbortController()\n    const response = await fetch(`${this.baseUrl}/chat/completions`, {\n      method: 'POST',\n      headers: this._headers(),\n      body: JSON.stringify(body),\n      signal: ac.signal,\n    })\n\n    if (!response.ok) {\n      const errText = await response.text().catch(() => '')\n      // Retry with max_tokens stripped if that's what blew up\n      if (errText.includes('max_tokens')) {\n        return super.stream({ ...params, max_tokens: -1 })\n      }\n      throw new Error(`Ollama API error ${response.status}: ${errText}`)\n    }\n\n    if (!response.body) {\n      throw new Error('Ollama returned no response body for streaming request')\n    }\n\n    const sseStream = this._parseSSE(response.body)\n    const anthropicEvents = openAIStreamToAnthropicEvents(sseStream)\n    return buildProviderStreamResult(anthropicEvents, ac)\n  }\n\n  async create(params: ProviderRequestParams): Promise<AnthropicMessage> {\n    await this._assertDaemonReachable()\n    try {\n      return await super.create(params)\n    } catch (err: any) {\n      if (err?.message?.includes('max_tokens')) {\n        return super.create({ ...params, max_tokens: -1 })\n      }\n      throw err\n    }\n  }\n\n  async listModels(): Promise<ModelInfo[]> {\n    // Ollama uses /api/tags for model listing, but also supports OpenAI /v1/models\n    try {\n      return await super.listModels()\n    } catch {\n      // Fallback: try Ollama native endpoint\n      try {\n        const baseUrl = this.baseUrl.replace(/\\/v1$/, '')\n        const response = await fetch(`${baseUrl}/api/tags`)\n        if (!response.ok) return []\n        const data = (await response.json()) as { models?: Array<{ name: string }> }\n        return (data.models ?? []).map(m => ({ id: m.name, name: m.name }))\n      } catch {\n        return []\n      }\n    }\n  }\n\n  resolveModel(claudeModel: string): string {\n    // If it doesn't look like a Claude model, pass through as-is\n    if (!claudeModel.includes('claude')) return claudeModel\n\n    // Default Ollama model mappings (user can override via env vars)\n    const models = {\n      opus: process.env.OLLAMA_MODEL_OPUS ?? 'llama3.3:latest',\n      sonnet: process.env.OLLAMA_MODEL_SONNET ?? 'llama3.1:latest',\n      haiku: process.env.OLLAMA_MODEL_HAIKU ?? 'llama3.2:latest',\n    }\n    if (claudeModel.includes('opus'))  return models.opus\n    if (claudeModel.includes('haiku')) return models.haiku\n    return models.sonnet\n  }\n\n  protected _headers(): Record<string, string> {\n    // Ollama may not need auth headers\n    return {\n      'Content-Type': 'application/json',\n      ...(this.apiKey && this.apiKey !== 'ollama'\n        ? { 'Authorization': `Bearer ${this.apiKey}` }\n        : {}),\n      ...this.extraHeaders,\n    }\n  }\n}\n", "import { createHash } from 'crypto'\nimport type {\n  ProviderContentBlock,\n  ProviderMessage,\n} from './base_provider.js'\n\nconst CURSOR_TOOL_CALL_METADATA_MARKER = '\\nmc_'\nconst MAX_PROVIDER_TOOL_CALL_ID_LENGTH = 64\nconst SAFE_PROVIDER_TOOL_CALL_ID = /^[A-Za-z0-9._:-]{1,64}$/\n\nexport function sanitizeProviderMessagesForNonCursorTransport(\n  messages: ProviderMessage[],\n): ProviderMessage[] {\n  const rewrittenIds = new Map<string, string>()\n  let changed = false\n\n  const sanitizeId = (rawId: string): string => {\n    const cached = rewrittenIds.get(rawId)\n    if (cached) return cached\n    const next = makeProviderSafeToolCallId(rawId)\n    rewrittenIds.set(rawId, next)\n    return next\n  }\n\n  const nextMessages = messages.map(message => {\n    if (typeof message.content === 'string') return message\n\n    let messageChanged = false\n    const nextBlocks = (message.content as ProviderContentBlock[]).map(block => {\n      if (block.type === 'tool_use' && typeof block.id === 'string') {\n        const nextId = sanitizeId(block.id)\n        if (nextId !== block.id) {\n          changed = true\n          messageChanged = true\n          return { ...block, id: nextId }\n        }\n        return block\n      }\n\n      if (block.type === 'tool_result' && typeof block.tool_use_id === 'string') {\n        const nextId = sanitizeId(block.tool_use_id)\n        if (nextId !== block.tool_use_id) {\n          changed = true\n          messageChanged = true\n          return { ...block, tool_use_id: nextId }\n        }\n        return block\n      }\n\n      return block\n    })\n\n    return messageChanged ? { ...message, content: nextBlocks } : message\n  })\n\n  return changed ? nextMessages : messages\n}\n\nfunction makeProviderSafeToolCallId(rawId: string): string {\n  const normalized = stripCursorMetadata(rawId)\n  if (SAFE_PROVIDER_TOOL_CALL_ID.test(normalized)) {\n    return normalized\n  }\n\n  const cleaned = normalized\n    .replace(/\\s+/g, '_')\n    .replace(/[^A-Za-z0-9._:-]/g, '_')\n    .replace(/_+/g, '_')\n    .replace(/^_+|_+$/g, '')\n\n  if (SAFE_PROVIDER_TOOL_CALL_ID.test(cleaned)) {\n    return cleaned\n  }\n\n  const prefix = cleaned.startsWith('call_')\n    ? 'call_'\n    : cleaned.startsWith('toolu_') || rawId.startsWith('toolu_')\n      ? 'toolu_'\n      : 'toolu_'\n  const stem = cleaned.replace(/^(toolu_|call_)/, '')\n  const hash = createHash('sha256').update(rawId).digest('hex').slice(0, 16)\n  const maxStemLength = Math.max(\n    0,\n    MAX_PROVIDER_TOOL_CALL_ID_LENGTH - prefix.length - hash.length - 1,\n  )\n  const truncatedStem = stem.slice(0, maxStemLength)\n  return truncatedStem\n    ? `${prefix}${truncatedStem}_${hash}`\n    : `${prefix}${hash}`\n}\n\nfunction stripCursorMetadata(id: string): string {\n  const idx = id.indexOf(CURSOR_TOOL_CALL_METADATA_MARKER)\n  return idx >= 0 ? id.slice(0, idx) : id\n}\n", "/**\n * Lane Dispatcher\n *\n * Auto-routes models to their native lane. Zero user configuration needed.\n * User picks a provider via /provider, picks a model via /models, and the\n * dispatcher automatically routes to the correct native lane.\n *\n * Routing:\n *   Claude models    \u2192 Anthropic lane (existing claude.ts, no dispatch)\n *   Gemini models    \u2192 Gemini lane (native gemini-cli patterns)\n *   OpenAI/GPT/Codex \u2192 Codex lane (native Responses API + apply_patch)\n *   Everything else  \u2192 OpenAI-compat lane (Chat Completions)\n *\n * The dispatcher is an in-process function \u2014 no proxy, no port, no daemon.\n * No env vars, no config files. It just works.\n */\n\nimport type {\n  Lane,\n  LaneRunContext,\n  LaneRunResult,\n} from './types.js'\nimport type { AnthropicStreamEvent } from '../services/api/providers/base_provider.js'\n\n// \u2500\u2500\u2500 Lane Registry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst _lanes = new Map<string, Lane>()\n\n/** Register a lane. Called once per lane at startup. */\nexport function registerLane(lane: Lane): void {\n  _lanes.set(lane.name, lane)\n}\n\n/** Get a registered lane by name. */\nexport function getLane(name: string): Lane | undefined {\n  return _lanes.get(name)\n}\n\n/** Get all registered lanes. */\nexport function getAllLanes(): Lane[] {\n  const result: Lane[] = []\n  _lanes.forEach(lane => result.push(lane))\n  return result\n}\n\n// \u2500\u2500\u2500 Auto-Routing \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// No configuration needed. The dispatcher looks at the model name\n// and routes to the correct lane automatically. Users never see\n// or think about lanes \u2014 they just pick a model and it works.\n\n/**\n * Find the native lane for a model. Returns null for Anthropic models\n * (they use the existing claude.ts path, not a dispatched lane).\n */\nexport function resolveRoute(model: string): RouteDecision {\n  // Anthropic models \u2192 existing path, no dispatch needed\n  if (isAnthropicModel(model)) {\n    return { type: 'existing', reason: 'anthropic-native' }\n  }\n\n  // Find the lane that handles this model\n  const lane = findLaneForModel(model)\n  if (!lane) {\n    // No lane registered yet \u2014 fall through to existing shim path\n    return { type: 'existing', reason: 'no-lane-registered' }\n  }\n\n  // Lane exists but isn't healthy (API down, auth expired)\n  if (!lane.isHealthy()) {\n    return { type: 'existing', reason: 'lane-unhealthy', lane: lane.name }\n  }\n\n  return { type: 'native', lane }\n}\n\n/** Find the lane that supports a given model ID. */\nfunction findLaneForModel(model: string): Lane | undefined {\n  let found: Lane | undefined\n  _lanes.forEach(lane => {\n    if (!found && lane.supportsModel(model)) found = lane\n  })\n  return found\n}\n\n// \u2500\u2500\u2500 Model Family Detection \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction isAnthropicModel(model: string): boolean {\n  const m = model.toLowerCase()\n  return m.startsWith('claude-') || m.includes('anthropic')\n}\n\n// \u2500\u2500\u2500 Route Decision \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type RouteDecision =\n  | { type: 'native'; lane: Lane }\n  | { type: 'existing'; reason: string; lane?: string }\n\n// \u2500\u2500\u2500 Dispatch \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Run a model turn through its native lane.\n *\n * Returns an async generator of Anthropic IR events, or null if the\n * model should use the existing claude.ts + shim path.\n *\n * The caller just does:\n *   const gen = dispatch(model, context)\n *   if (gen) { yield* gen } else { // existing path }\n */\nexport function dispatch(\n  model: string,\n  context: LaneRunContext,\n): AsyncGenerator<AnthropicStreamEvent, LaneRunResult> | null {\n  const route = resolveRoute(model)\n  if (route.type !== 'native') return null\n  return route.lane.run(context)\n}\n\n// \u2500\u2500\u2500 Diagnostics \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Get lane status for /status or debugging. */\nexport function getLaneStatus(): LaneStatusEntry[] {\n  const entries: LaneStatusEntry[] = []\n  _lanes.forEach(lane => {\n    entries.push({ name: lane.name, displayName: lane.displayName, healthy: lane.isHealthy() })\n  })\n  return entries\n}\n\nexport interface LaneStatusEntry {\n  name: string\n  displayName: string\n  healthy: boolean\n}\n", "/**\n * Lane Bridge \u2014 Integration with existing query flow\n *\n * Two functions the existing code calls:\n *   shouldUseNativeLane(model) \u2192 boolean  (fast, synchronous)\n *   runNativeLane(model, params) \u2192 AsyncGenerator<events>\n *\n * That's it. No config, no env vars. If a native lane is registered\n * and healthy for this model, it's used. Otherwise the existing\n * claude.ts + shim path runs as before.\n */\n\nimport { resolveRoute, dispatch } from './dispatcher.js'\nimport type { LaneRunContext, SystemPromptParts, SharedTool, ToolResult } from './types.js'\nimport type {\n  AnthropicStreamEvent,\n  ProviderMessage,\n  ProviderTool,\n} from '../services/api/providers/base_provider.js'\n\n/**\n * Should this model run through a native lane?\n * Fast, synchronous \u2014 no I/O. Returns true when a native lane\n * is registered, configured, and healthy for this model.\n *\n * Anthropic models always return false (they use the existing path).\n */\nexport function shouldUseNativeLane(model: string): boolean {\n  return resolveRoute(model).type === 'native'\n}\n\n/**\n * Which lane handles this model? For diagnostics/UI.\n */\nexport function getNativeLaneName(model: string): string | null {\n  const route = resolveRoute(model)\n  if (route.type === 'native') return route.lane.name\n  if (route.type === 'existing' && route.lane) return route.lane\n  return null\n}\n\n/**\n * Run through the native lane. Yields AnthropicStreamEvent \u2014 same\n * IR the existing renderer consumes. Drop-in replacement for the\n * claude.ts agent loop on supported models.\n */\nexport async function* runNativeLane(\n  model: string,\n  params: NativeLaneParams,\n): AsyncGenerator<AnthropicStreamEvent> {\n  const context: LaneRunContext = {\n    model,\n    messages: params.messages,\n    systemParts: params.systemParts,\n    availableTools: params.availableTools,\n    mcpTools: params.mcpTools,\n    executeTool: params.executeTool,\n    maxTokens: params.maxTokens,\n    signal: params.signal,\n    cwd: params.cwd,\n  }\n\n  const gen = dispatch(model, context)\n  if (!gen) throw new Error(`No native lane for model ${model}`)\n\n  // Forward events from the lane. The generator yields AnthropicStreamEvent\n  // and returns LaneRunResult \u2014 we only forward the yielded events.\n  for await (const event of gen) {\n    yield event\n  }\n}\n\nexport interface NativeLaneParams {\n  messages: ProviderMessage[]\n  systemParts: SystemPromptParts\n  availableTools: SharedTool[]\n  mcpTools: ProviderTool[]\n  executeTool(implId: string, input: Record<string, unknown>): Promise<ToolResult>\n  maxTokens: number\n  signal: AbortSignal\n  cwd: string\n}\n", "/**\r\n * Lane \u2192 Provider Bridge\r\n *\r\n * Wraps any registered Lane as a BaseProvider so the existing\r\n * provider-shim layer in src/services/api/providers/providerShim.ts\r\n * can swap in a native lane transparently.\r\n *\r\n * This is the Phase-1 wire-up: claude.ts owns the turn-orchestration\r\n * loop, and each turn goes through the lane's streamAsProvider() which\r\n * makes ONE native API call with:\r\n *   - The model's native tool schemas (what it was trained on)\r\n *   - The caller's system prompt forwarded as-is\r\n *   - The native auth, native cache, native streaming shape\r\n *   - Native reasoning knobs\r\n *\r\n * When we migrate to Phase-2 (each lane owns its full agent loop) the\r\n * intercept will move higher up (out of provider-shim and into the\r\n * query dispatcher) but this bridge can stay as the single-turn entry\r\n * for tools like session-title generation that only need one API call.\r\n */\r\n\r\nimport type {\r\n  AnthropicMessage,\r\n  AnthropicStreamEvent,\r\n  AnthropicContentBlock,\r\n  BaseProvider,\r\n  ModelInfo,\r\n  ProviderRequestParams,\r\n  ProviderStreamResult,\r\n} from '../services/api/providers/base_provider.js'\r\nimport { buildProviderStreamResult } from '../services/api/providers/base_provider.js'\r\nimport type { Lane } from './types.js'\r\nimport { getSessionId } from '../bootstrap/state.js'\r\n\r\nexport class LaneBackedProvider implements BaseProvider {\r\n  readonly name: string\r\n\r\n  /**\r\n   * `providerHint` is the original APIProvider name the shim was built\r\n   * for (e.g. \"groq\", \"openrouter\"). It flows through to lane.listModels()\r\n   * so shared lanes like openai-compat can filter their catalog by\r\n   * sub-provider instead of returning the union of everything they host.\r\n   */\r\n  constructor(\r\n    private readonly lane: Lane,\r\n    private readonly providerHint?: string,\r\n  ) {\r\n    this.name = lane.name\r\n  }\r\n\r\n  async stream(params: ProviderRequestParams): Promise<ProviderStreamResult> {\r\n    const controller = new AbortController()\r\n    // If the caller never passed a signal, we synthesize one so the\r\n    // ProviderStreamResult's abort() still takes effect.\r\n    const callerSignal = (params as any).signal as AbortSignal | undefined\r\n    if (callerSignal) {\r\n      callerSignal.addEventListener('abort', () => controller.abort(), { once: true })\r\n    }\r\n\r\n    const lane = this.lane\r\n    const providerHint = this.providerHint\r\n    const resolvedModel = lane.resolveModel(params.model)\r\n\r\n    if (typeof lane.streamAsProvider !== 'function') {\r\n      throw new Error(\r\n        `Lane \"${lane.name}\" does not implement streamAsProvider() yet \u2014 `\r\n        + 'native-lane mode is not available for this provider. '\r\n        + 'Unset CLAUDEX_NATIVE_LANES to fall back to the legacy provider.',\r\n      )\r\n    }\r\n\r\n    const streamAsProvider = lane.streamAsProvider.bind(lane)\r\n\r\n    // Async iterable that calls the lane and forwards events verbatim.\r\n    const events = (async function* (): AsyncIterable<AnthropicStreamEvent> {\r\n      const gen = streamAsProvider({\r\n        model: resolvedModel,\r\n        messages: params.messages,\r\n        system: params.system ?? '',\r\n        tools: params.tools ?? [],\r\n        max_tokens: params.max_tokens,\r\n        temperature: params.temperature,\r\n        stop_sequences: params.stop_sequences,\r\n        thinking: params.thinking,\r\n        signal: controller.signal,\r\n        ...(\r\n          providerHint === 'copilot'\r\n          || providerHint === 'openrouter'\r\n          || providerHint === 'agentrouter'\r\n          || providerHint === 'opencode'\r\n          || providerHint === 'moonshot'\r\n          || providerHint === 'mistral'\r\n            ? { sessionId: getSessionId() }\r\n            : {}\r\n        ),\r\n        providerHint: providerHint,\r\n      })\r\n      for await (const ev of gen) {\r\n        yield ev\r\n      }\r\n      // The generator's return value (NormalizedUsage) is not part of the\r\n      // Anthropic IR \u2014 it's surfaced through the usage fields on the\r\n      // assembled AnthropicMessage below (via the message_start / delta\r\n      // events the lane already emitted).\r\n    })()\r\n\r\n    return buildProviderStreamResult(events, controller)\r\n  }\r\n\r\n  async create(params: ProviderRequestParams): Promise<AnthropicMessage> {\r\n    // Non-streaming path: drain the stream and build the final message.\r\n    const streamResult = await this.stream({ ...params, stream: false })\r\n    return assembleFinalMessage(streamResult, this.lane.resolveModel(params.model))\r\n  }\r\n\r\n  async listModels(): Promise<ModelInfo[]> {\r\n    return this.lane.listModels(this.providerHint)\r\n  }\r\n\r\n  resolveModel(model: string): string {\r\n    return this.lane.resolveModel(model)\r\n  }\r\n}\r\n\r\n// \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nasync function assembleFinalMessage(\r\n  stream: ProviderStreamResult,\r\n  model: string,\r\n): Promise<AnthropicMessage> {\r\n  const blocks: AnthropicContentBlock[] = []\r\n  let currentBlock: AnthropicContentBlock | null = null\r\n  let stopReason: 'end_turn' | 'tool_use' | 'max_tokens' | null = 'end_turn'\r\n  let outputTokens = 0\r\n  let inputTokens = 0\r\n  let cacheReadTokens = 0\r\n  let cacheCreationTokens = 0\r\n  let messageId = `msg-${Date.now()}`\r\n\r\n  for await (const ev of stream) {\r\n    switch (ev.type) {\r\n      case 'message_start':\r\n        if (ev.message) {\r\n          messageId = ev.message.id\r\n          inputTokens = ev.message.usage?.input_tokens ?? 0\r\n          // Fold cache stats from message_start \u2014 this is the only event\r\n          // that carries them in the Anthropic IR. Lanes emit these on\r\n          // the first real chunk (after folding usage from the provider).\r\n          const u = ev.message.usage as {\r\n            cache_read_input_tokens?: number\r\n            cache_creation_input_tokens?: number\r\n          } | undefined\r\n          if (u?.cache_read_input_tokens) cacheReadTokens = u.cache_read_input_tokens\r\n          if (u?.cache_creation_input_tokens) cacheCreationTokens = u.cache_creation_input_tokens\r\n        }\r\n        break\r\n      case 'content_block_start':\r\n        if (ev.content_block) {\r\n          currentBlock = { ...ev.content_block }\r\n          blocks.push(currentBlock)\r\n        }\r\n        break\r\n      case 'content_block_delta':\r\n        if (currentBlock && ev.delta) {\r\n          if (ev.delta.type === 'text_delta' && typeof ev.delta.text === 'string') {\r\n            currentBlock.text = (currentBlock.text ?? '') + ev.delta.text\r\n          } else if (ev.delta.type === 'thinking_delta' && typeof ev.delta.thinking === 'string') {\r\n            currentBlock.thinking = (currentBlock.thinking ?? '') + ev.delta.thinking\r\n          } else if (\r\n            ev.delta.type === 'input_json_delta'\r\n            && typeof ev.delta.partial_json === 'string'\r\n            && currentBlock.type === 'tool_use'\r\n          ) {\r\n            // Accumulate tool_use input JSON across deltas, same as the\r\n            // Anthropic Messages streaming IR. The lanes emit input via\r\n            // this event because that's how claude.ts reads it upstream;\r\n            // this assembler (used for non-streaming `create()` calls)\r\n            // was missing the matching branch, leaving every tool_use\r\n            // block with an empty `input: {}`.\r\n            const prev = typeof (currentBlock as any)._partialJson === 'string'\r\n              ? (currentBlock as any)._partialJson as string\r\n              : ''\r\n            ;(currentBlock as any)._partialJson = prev + ev.delta.partial_json\r\n          }\r\n        }\r\n        break\r\n      case 'content_block_stop':\r\n        // Finalize tool_use input from the accumulated partial_json string.\r\n        if (currentBlock && currentBlock.type === 'tool_use') {\r\n          const raw = (currentBlock as any)._partialJson\r\n          if (typeof raw === 'string' && raw.length > 0) {\r\n            try {\r\n              currentBlock.input = JSON.parse(raw) as Record<string, unknown>\r\n            } catch {\r\n              // Malformed JSON \u2014 keep empty input, shared tool will report.\r\n            }\r\n          }\r\n          delete (currentBlock as any)._partialJson\r\n        }\r\n        currentBlock = null\r\n        break\r\n      case 'message_delta':\r\n        if (ev.delta?.stop_reason === 'tool_use') stopReason = 'tool_use'\r\n        else if (ev.delta?.stop_reason === 'max_tokens') stopReason = 'max_tokens'\r\n        else if (ev.delta?.stop_reason === 'end_turn') stopReason = 'end_turn'\r\n        if (typeof ev.usage?.output_tokens === 'number') {\r\n          outputTokens = ev.usage.output_tokens\r\n        }\r\n        // Fold end-of-stream usage/cache stats. OpenAI Responses and\r\n        // OpenAI Chat only ship usage on the final event (response.completed\r\n        // / final chunk), so message_start carried zeros and the real\r\n        // numbers land here. Without this merge the assembler returns\r\n        // zero cache reads for every Codex / compat turn.\r\n        if (typeof ev.usage?.input_tokens === 'number' && ev.usage.input_tokens > 0) {\r\n          inputTokens = ev.usage.input_tokens\r\n        }\r\n        if (typeof ev.usage?.cache_read_input_tokens === 'number' && ev.usage.cache_read_input_tokens > 0) {\r\n          cacheReadTokens = ev.usage.cache_read_input_tokens\r\n        }\r\n        if (typeof ev.usage?.cache_creation_input_tokens === 'number' && ev.usage.cache_creation_input_tokens > 0) {\r\n          cacheCreationTokens = ev.usage.cache_creation_input_tokens\r\n        }\r\n        break\r\n    }\r\n  }\r\n\r\n  return {\r\n    id: messageId,\r\n    type: 'message',\r\n    role: 'assistant',\r\n    content: blocks,\r\n    model,\r\n    stop_reason: stopReason,\r\n    stop_sequence: null,\r\n    usage: {\r\n      input_tokens: inputTokens,\r\n      output_tokens: outputTokens,\r\n      ...(cacheReadTokens > 0 && { cache_read_input_tokens: cacheReadTokens }),\r\n      ...(cacheCreationTokens > 0 && { cache_creation_input_tokens: cacheCreationTokens }),\r\n    },\r\n  }\r\n}\r\n", "import memoize from 'lodash-es/memoize.js'\n\n// This ensures you get the LOCAL date in ISO format\nexport function getLocalISODate(): string {\n  // Check for ant-only date override\n  if (process.env.CLAUDE_CODE_OVERRIDE_DATE) {\n    return process.env.CLAUDE_CODE_OVERRIDE_DATE\n  }\n\n  const now = new Date()\n  const year = now.getFullYear()\n  const month = String(now.getMonth() + 1).padStart(2, '0')\n  const day = String(now.getDate()).padStart(2, '0')\n  return `${year}-${month}-${day}`\n}\n\n// Memoized for prompt-cache stability \u2014 captures the date once at session start.\n// The main interactive path gets this behavior via memoize(getUserContext) in\n// context.ts; simple mode (--bare) calls getSystemPrompt per-request and needs\n// an explicit memoized date to avoid busting the cached prefix at midnight.\n// When midnight rolls over, getDateChangeAttachments appends the new date at\n// the tail (though simple mode disables attachments, so the trade-off there is:\n// stale date after midnight vs. ~entire-conversation cache bust \u2014 stale wins).\nexport const getSessionStartDate = memoize(getLocalISODate)\n\n// Returns \"Month YYYY\" (e.g. \"February 2026\") in the user's local timezone.\n// Changes monthly, not daily \u2014 used in tool prompts to minimize cache busting.\nexport function getLocalMonthYear(): string {\n  const date = process.env.CLAUDE_CODE_OVERRIDE_DATE\n    ? new Date(process.env.CLAUDE_CODE_OVERRIDE_DATE)\n    : new Date()\n  return date.toLocaleString('en-US', { month: 'long', year: 'numeric' })\n}\n", "import { getLocalMonthYear } from 'src/constants/common.js'\n\nexport const WEB_SEARCH_TOOL_NAME = 'WebSearch'\n\nexport const WEB_SEARCH_AUTO_USE_GUIDANCE =\n  'Use WebSearch automatically, without waiting for the user to say \"websearch\", when the request depends on current, live, recent, or changing public web information. This includes weather today/now, news, current events, prices, exchange rates, sports scores, schedules, availability, laws/regulations, product details, recent releases, latest documentation, status pages, and facts likely to have changed after the model knowledge cutoff. If enough context is present, search with the best reasonable interpretation and state any assumption in the answer instead of asking the user to search manually.'\n\nexport const WEB_SEARCH_NATIVE_DESCRIPTION =\n  'Search the web for current, live, recent, or changing public information and return answerable results with source URLs. Use automatically for weather today/now, news, prices, exchange rates, sports, schedules, availability, laws/regulations, product details, recent releases, latest documentation, and facts likely to have changed after the model knowledge cutoff. Do not tell the user to search manually when this tool can answer.'\n\nexport function getWebSearchPrompt(): string {\n  const currentMonthYear = getLocalMonthYear()\n  return `\n- Allows the agent to search the web and use the results to inform responses\n- Provides up-to-date information for current events and recent data\n- Returns search result information formatted as search result blocks, including links as markdown hyperlinks\n- Use this tool for accessing information beyond the model knowledge cutoff\n- Searches are performed automatically within a single API call\n\nAutomatic use policy:\n  - ${WEB_SEARCH_AUTO_USE_GUIDANCE}\n  - Do not answer \"I cannot access live information\" or give manual search instructions when WebSearch is available and the requested information is public on the web. Call WebSearch first, then answer from the results.\n  - Do not use WebSearch for stable general knowledge, local codebase/file questions, private account data, or questions the user explicitly says not to search.\n\nCRITICAL REQUIREMENT - You MUST follow this:\n  - After answering the user's question, you MUST include a \"Sources:\" section at the end of your response\n  - In the Sources section, list all relevant URLs from the search results as markdown hyperlinks: [Title](URL)\n  - This is MANDATORY - never skip including sources in your response\n  - Example format:\n\n    [Your answer here]\n\n    Sources:\n    - [Source Title 1](https://example.com/1)\n    - [Source Title 2](https://example.com/2)\n\nUsage notes:\n  - WebSearch is provider-neutral. Always call the WebSearch tool with its documented input schema; do not pass provider-specific fields or Firecrawl API fields.\n  - Search results can include extracted page excerpts. When excerpts contain the answer, answer directly from them and cite the source URLs; do not return only a list of links.\n  - Domain filtering is supported to include or block specific websites\n  - Domain filters must be plain hostnames only, for example \"example.com\" or \"docs.example.com\", not URLs, paths, or wildcards\n  - Web search is only available in the US\n\nIMPORTANT - Use the correct year in search queries:\n  - The current month is ${currentMonthYear}. You MUST use this year when searching for recent information, documentation, or current events.\n  - Example: If the user asks for \"latest React docs\", search for \"React documentation\" with the current year, NOT last year\n`\n}\n", "/**\r\n * Gemini Lane \u2014 Native Tool Registry\r\n *\r\n * Maps Gemini CLI's native tool names (what the model was post-trained on)\r\n * to Tau's shared tool implementations.\r\n *\r\n * The model sees these exact names and schemas. They come from:\r\n *   google-gemini/gemini-cli packages/core/src/tools/definitions/\r\n *\r\n * Each registration has:\r\n *   - nativeName: what Gemini sees (e.g., 'read_file')\r\n *   - implId: shared implementation key (e.g., 'Read')\r\n *   - nativeSchema: JSON Schema the model was trained against\r\n *   - adaptInput: converts Gemini's params \u2192 shared impl params\r\n *   - adaptOutput: converts shared impl output \u2192 Gemini's expected format\r\n */\r\n\r\nimport type { LaneToolRegistration } from '../types.js'\nimport { windowsPathToPosixPath } from '../../utils/windowsPaths.js'\nimport { WEB_SEARCH_NATIVE_DESCRIPTION } from '../../tools/WebSearchTool/prompt.js'\n\r\ntype AskUserOption = {\r\n  label: string\r\n  description: string\r\n}\r\n\r\ntype AskUserQuestion = {\r\n  question: string\r\n  header: string\r\n  options: AskUserOption[]\r\n  multiSelect: boolean\r\n}\r\n\r\nfunction asRecord(value: unknown): Record<string, unknown> | null {\r\n  return value && typeof value === 'object' && !Array.isArray(value)\r\n    ? value as Record<string, unknown>\r\n    : null\r\n}\r\n\r\nfunction nonEmptyString(value: unknown): string | null {\r\n  return typeof value === 'string' && value.trim().length > 0\r\n    ? value.trim()\r\n    : null\r\n}\r\n\r\nfunction askUserHeader(value: unknown, question: string, index: number): string {\r\n  const explicit = nonEmptyString(value)\r\n  if (explicit) return explicit.slice(0, 12)\r\n  const fromQuestion = question\r\n    .replace(/[^\\w\\s]/g, ' ')\r\n    .trim()\r\n    .split(/\\s+/)\r\n    .slice(0, 2)\r\n    .join(' ')\r\n  return (fromQuestion || `Q${index + 1}`).slice(0, 12)\r\n}\r\n\r\nfunction askUserOptions(rawOptions: unknown, type: unknown): AskUserOption[] {\r\n  const options: AskUserOption[] = []\r\n  if (Array.isArray(rawOptions)) {\r\n    for (let i = 0; i < rawOptions.length; i++) {\r\n      const raw = rawOptions[i]\r\n      if (typeof raw === 'string') {\r\n        const label = raw.trim()\r\n        if (label) options.push({ label, description: `Select ${label}.` })\r\n        continue\r\n      }\r\n\r\n      const record = asRecord(raw)\r\n      if (!record) continue\r\n      const label = nonEmptyString(record.label)\r\n        ?? nonEmptyString(record.text)\r\n        ?? nonEmptyString(record.value)\r\n        ?? `Option ${i + 1}`\r\n      const description = nonEmptyString(record.description)\r\n        ?? nonEmptyString(record.desc)\r\n        ?? `Select ${label}.`\r\n      options.push({ label, description })\r\n    }\r\n  }\r\n\r\n  const deduped: AskUserOption[] = []\r\n  const seen = new Set<string>()\r\n  for (const option of options) {\r\n    const key = option.label.toLowerCase()\r\n    if (seen.has(key)) continue\r\n    seen.add(key)\r\n    deduped.push(option)\r\n    if (deduped.length >= 4) break\r\n  }\r\n\r\n  const fallback = String(type ?? '').toLowerCase() === 'yesno'\r\n    ? [\r\n        { label: 'Yes', description: 'Confirm this option.' },\r\n        { label: 'No', description: 'Decline this option.' },\r\n      ]\r\n    : [\r\n        { label: 'Answer', description: 'Provide a custom answer.' },\r\n        { label: 'Skip', description: 'Do not answer this now.' },\r\n      ]\r\n\r\n  for (const option of fallback) {\r\n    if (deduped.length >= 2) break\r\n    if (!seen.has(option.label.toLowerCase())) {\r\n      deduped.push(option)\r\n      seen.add(option.label.toLowerCase())\r\n    }\r\n  }\r\n\r\n  return deduped.slice(0, 4)\r\n}\r\n\r\nfunction normalizeAskUserInput(native: Record<string, unknown>): { questions: AskUserQuestion[] } {\r\n  const rawQuestions = Array.isArray(native.questions) && native.questions.length > 0\r\n    ? native.questions\r\n    : [native]\r\n\r\n  const questions = rawQuestions.map((raw, index) => {\r\n    const record = asRecord(raw) ?? {}\r\n    const question = nonEmptyString(record.question)\r\n      ?? nonEmptyString(native.question)\r\n      ?? 'Please choose an option.'\r\n    const type = record.type ?? native.type\r\n    return {\r\n      question,\r\n      header: askUserHeader(record.header ?? native.header, question, index),\r\n      options: askUserOptions(record.options ?? native.options, type),\r\n      multiSelect: Boolean(record.multiSelect ?? record.multi_select ?? native.multiSelect ?? native.multi_select),\r\n    }\r\n  })\r\n\r\n  return { questions }\r\n}\r\n\r\n// \u2500\u2500\u2500 Native Tool Definitions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n//\r\n// These are the EXACT tool names and schemas from gemini-cli.\r\n// Do not rename them. Do not add Anthropic-style tool names.\r\n// The model was post-trained on these specific strings.\r\n\r\nexport const GEMINI_TOOL_REGISTRY: LaneToolRegistration[] = [\r\n  // \u2500\u2500 read_file \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  {\r\n    nativeName: 'read_file',\r\n    implId: 'Read',\r\n    nativeDescription:\r\n      \"Reads and returns the content of a specified file. To maintain context efficiency, you MUST use 'start_line' and 'end_line' for targeted, surgical reads of specific sections. For your safety, the tool will automatically truncate output exceeding 2000 lines, 1000 characters per line, or 10MB in size; however, triggering these limits is considered token-inefficient. Always retrieve only the minimum content necessary for your next step. Handles text, images (PNG, JPG, GIF, WEBP, SVG, BMP), audio files (MP3, WAV, AIFF, AAC, OGG, FLAC), and PDF files.\",\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        file_path: {\r\n          type: 'string',\r\n          description: 'The path to the file to read.',\r\n        },\r\n        start_line: {\r\n          type: 'number',\r\n          description: 'Optional: The 1-based line number to start reading from.',\r\n        },\r\n        end_line: {\r\n          type: 'number',\r\n          description: 'Optional: The 1-based line number to end reading at (inclusive).',\r\n        },\r\n      },\r\n      required: ['file_path'],\r\n    },\r\n    adaptInput(native) {\r\n      const result: Record<string, unknown> = {\r\n        file_path: native.file_path,\r\n      }\r\n      // Gemini uses 1-based start_line/end_line\r\n      // Shared Read uses 0-based offset + limit\r\n      if (native.start_line != null) {\r\n        result.offset = (native.start_line as number) - 1\r\n        if (native.end_line != null) {\r\n          result.limit = (native.end_line as number) - (native.start_line as number) + 1\r\n        }\r\n      }\r\n      return result\r\n    },\r\n    adaptOutput(output) {\r\n      return typeof output === 'string' ? output : JSON.stringify(output)\r\n    },\r\n  },\r\n\r\n  // \u2500\u2500 write_file \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  {\r\n    nativeName: 'write_file',\r\n    implId: 'Write',\r\n    nativeDescription:\r\n      \"Writes the complete content to a file, automatically creating missing parent directories. Overwrites existing files. The user has the ability to modify 'content' before it is saved. Best for new or small files; use 'replace' for targeted edits to large files.\",\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        file_path: {\r\n          type: 'string',\r\n          description: 'Path to the file.',\r\n        },\r\n        content: {\r\n          type: 'string',\r\n          description: \"The complete content to write. Provide the full file; do not use placeholders like '// ... rest of code'.\",\r\n        },\r\n      },\r\n      required: ['file_path', 'content'],\r\n    },\r\n    adaptInput(native) {\r\n      return { file_path: native.file_path, content: native.content }\r\n    },\r\n    adaptOutput(output) {\r\n      return typeof output === 'string' ? output : JSON.stringify(output)\r\n    },\r\n  },\r\n\r\n  // \u2500\u2500 replace (Edit) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  {\r\n    nativeName: 'replace',\r\n    implId: 'Edit',\r\n    nativeDescription:\r\n      \"Replaces text within a file. By default, the tool expects to find and replace exactly ONE occurrence of `old_string`. If you want to replace multiple occurrences of the exact same string, set `allow_multiple` to true. This tool requires providing significant context around the change to ensure precise targeting.\\nThe user has the ability to modify the `new_string` content. If modified, this will be stated in the response.\",\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        file_path: {\r\n          description: 'The path to the file to modify.',\r\n          type: 'string',\r\n        },\r\n        instruction: {\r\n          description: 'A clear, semantic instruction for the code change, acting as a high-quality prompt for an expert LLM assistant. It must be self-contained and explain the goal of the change.',\r\n          type: 'string',\r\n        },\r\n        old_string: {\r\n          description: 'The exact literal text to replace, unescaped. If this string is not the exact literal text (i.e. you escaped it) or does not match exactly, the tool will fail.',\r\n          type: 'string',\r\n        },\r\n        new_string: {\r\n          description: \"The exact literal text to replace `old_string` with, unescaped. Provide the EXACT text. Ensure the resulting code is correct and idiomatic. Do not use omission placeholders like '(rest of methods ...)', '...', or 'unchanged code'; provide exact literal code.\",\r\n          type: 'string',\r\n        },\r\n        allow_multiple: {\r\n          type: 'boolean',\r\n          description: 'If true, the tool will replace all occurrences of `old_string`. If false (default), it will only succeed if exactly one occurrence is found.',\r\n        },\r\n      },\r\n      required: ['file_path', 'instruction', 'old_string', 'new_string'],\r\n    },\r\n    adaptInput(native) {\r\n      return {\r\n        file_path: native.file_path,\r\n        old_string: native.old_string,\r\n        new_string: native.new_string,\r\n        replace_all: native.allow_multiple ?? false,\r\n      }\r\n    },\r\n    adaptOutput(output) {\r\n      return typeof output === 'string' ? output : JSON.stringify(output)\r\n    },\r\n  },\r\n\r\n  // \u2500\u2500 run_shell_command (Bash) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  {\r\n    nativeName: 'run_shell_command',\r\n    implId: 'Bash',\r\n    nativeDescription:\r\n      'This tool executes a given shell command using Bash/POSIX syntax. To run a command in the background, set the `is_background` parameter to true. Do NOT use `&` to background commands.\\n\\n      The following information is returned:\\n\\n      Output: Combined stdout/stderr. Can be `(empty)` or partial on error and for any unwaited background processes.\\n      Exit Code: Only included if non-zero (command failed).\\n      Error: Only included if a process-level error occurred (e.g., spawn failure).\\n      Signal: Only included if process was terminated by a signal.\\n      Background PIDs: Only included if background processes were started.',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        command: {\r\n          type: 'string',\r\n          description: 'Exact Bash/POSIX command to execute.',\r\n        },\r\n        description: {\r\n          type: 'string',\r\n          description: 'Brief description of the command for the user. Be specific and concise. Ideally a single sentence. Can be up to 3 sentences for clarity. No line breaks.',\r\n        },\r\n        dir_path: {\r\n          type: 'string',\r\n          description: '(OPTIONAL) The path of the directory to run the command in. If not provided, the project root directory is used. Must be a directory within the workspace and must already exist.',\r\n        },\r\n        is_background: {\r\n          type: 'boolean',\r\n          description: 'Set to true if this command should be run in the background (e.g. for long-running servers or watchers). The command will be started, allowed to run for a brief moment to check for immediate errors, and then moved to the background.',\r\n        },\r\n      },\r\n      required: ['command'],\r\n    },\r\n    adaptInput(native) {\r\n      const result: Record<string, unknown> = {\r\n        command: native.command,\r\n      }\r\n      if (native.description) result.description = native.description\r\n      if (native.is_background) result.run_in_background = native.is_background\r\n      // dir_path: the shared Bash impl uses cwd from context, but\r\n      // if Gemini specifies dir_path we prepend a cd\r\n      if (native.dir_path) {\r\n        result.command = `cd ${JSON.stringify(native.dir_path)} && ${native.command}`\r\n      }\r\n      return result\r\n    },\r\n    adaptOutput(output) {\r\n      return typeof output === 'string' ? output : JSON.stringify(output)\r\n    },\r\n  },\r\n\r\n  // \u2500\u2500 glob \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  {\r\n    nativeName: 'glob',\r\n    implId: 'Glob',\r\n    nativeDescription:\r\n      'Efficiently finds files matching specific glob patterns (e.g., `src/**/*.ts`, `**/*.md`), returning absolute paths sorted by modification time (newest first). Ideal for quickly locating files based on their name or path structure, especially in large codebases.',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        pattern: {\r\n          type: 'string',\r\n          description: \"The glob pattern to match against (e.g., '**/*.py', 'docs/*.md').\",\r\n        },\r\n        dir_path: {\r\n          type: 'string',\r\n          description: 'Optional: The absolute path to the directory to search within. If omitted, searches the root directory.',\r\n        },\r\n      },\r\n      required: ['pattern'],\r\n    },\r\n    adaptInput(native) {\r\n      const out: Record<string, unknown> = { pattern: native.pattern }\r\n      if (native.dir_path) out.path = native.dir_path\r\n      return out\r\n    },\r\n    adaptOutput(output) {\r\n      return typeof output === 'string' ? output : JSON.stringify(output)\r\n    },\r\n  },\r\n\r\n  // \u2500\u2500 grep_search \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  {\r\n    nativeName: 'grep_search',\r\n    implId: 'Grep',\r\n    nativeDescription:\r\n      'Searches for a regular expression pattern within file contents. This tool is FAST and optimized, powered by ripgrep. PREFERRED over standard `run_shell_command(\"grep ...\")` due to better performance and automatic output limiting (defaults to 100 matches, but can be increased via `total_max_matches`).',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        pattern: {\r\n          type: 'string',\r\n          description: \"The pattern to search for. By default, treated as a Rust-flavored regular expression. Use '\\\\b' for precise symbol matching (e.g., '\\\\bMatchMe\\\\b').\",\r\n        },\r\n        dir_path: {\r\n          type: 'string',\r\n          description: \"Directory or file to search. Directories are searched recursively. Relative paths are resolved against current working directory. Defaults to current working directory ('.') if omitted.\",\r\n        },\r\n        include_pattern: {\r\n          type: 'string',\r\n          description: \"Glob pattern to filter files (e.g., '*.ts', 'src/**'). Recommended for large repositories to reduce noise. Defaults to all files if omitted.\",\r\n        },\r\n        names_only: {\r\n          type: 'boolean',\r\n          description: 'Optional: If true, only the file paths of the matches will be returned, without the line content or line numbers. This is useful for gathering a list of files.',\r\n        },\r\n        total_max_matches: {\r\n          type: 'integer',\r\n          description: 'Optional: Maximum number of total matches to return. Use this to limit the overall size of the response. Defaults to 100 if omitted.',\r\n        },\r\n      },\r\n      required: ['pattern'],\r\n    },\r\n    adaptInput(native) {\r\n      const out: Record<string, unknown> = { pattern: native.pattern }\r\n      if (native.dir_path) out.path = native.dir_path\r\n      if (native.include_pattern) out.glob = native.include_pattern\r\n      if (native.names_only) out.output_mode = 'files_with_matches'\r\n      if (native.total_max_matches) out.head_limit = native.total_max_matches\r\n      return out\r\n    },\r\n    adaptOutput(output) {\r\n      return typeof output === 'string' ? output : JSON.stringify(output)\r\n    },\r\n  },\r\n\r\n  // \u2500\u2500 google_web_search \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  {\n    nativeName: 'google_web_search',\n    implId: 'WebSearch',\n    nativeDescription: WEB_SEARCH_NATIVE_DESCRIPTION,\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        query: {\r\n          type: 'string',\r\n          description: 'The search query to use.',\r\n        },\r\n      },\r\n      required: ['query'],\r\n    },\r\n    adaptInput(native) {\r\n      return { query: native.query }\r\n    },\r\n    adaptOutput(output) {\r\n      return typeof output === 'string' ? output : JSON.stringify(output)\r\n    },\r\n  },\r\n\r\n  // \u2500\u2500 web_fetch \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  {\r\n    nativeName: 'web_fetch',\r\n    implId: 'WebFetch',\r\n    nativeDescription:\r\n      \"Processes content from URL(s) embedded in the 'prompt' parameter, up to 20. Extracts information, summarizes, or answers questions per the prompt's instructions. Ideal for deep-diving into a known URL. Use 'google_web_search' first if you don't have a specific URL. Private/local network URLs (e.g., localhost) are supported.\",\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        prompt: {\r\n          type: 'string',\r\n          description: \"A comprehensive prompt that includes the URL(s) (up to 20) to fetch and specific instructions on how to process their content (e.g., 'Summarize https://example.com/article and extract key points from https://another.com/data'). Must contain as least one URL starting with http:// or https://.\",\r\n        },\r\n      },\r\n      required: ['prompt'],\r\n    },\r\n    adaptInput(native) {\r\n      // Shared WebFetch expects { url, prompt } \u2014 extract URL from prompt.\r\n      // Tolerate a missing/empty prompt (invariants tests pass {}).\r\n      const prompt = typeof native.prompt === 'string' ? native.prompt : ''\r\n      const urlMatch = prompt.match(/https?:\\/\\/[^\\s]+/)\r\n      return {\r\n        url: urlMatch ? urlMatch[0] : prompt,\r\n        prompt,\r\n      }\r\n    },\r\n    adaptOutput(output) {\r\n      return typeof output === 'string' ? output : JSON.stringify(output)\r\n    },\r\n  },\r\n\r\n  // \u2500\u2500 list_directory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  // Gemini-specific tool \u2014 no direct Tau equivalent. Maps to Bash ls.\r\n  {\r\n    nativeName: 'list_directory',\r\n    implId: 'Bash',\r\n    nativeDescription:\r\n      'Lists the names of files and subdirectories directly within a specified directory path. Can optionally ignore entries matching provided glob patterns.',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        dir_path: {\r\n          type: 'string',\r\n          description: 'The path to the directory to list',\r\n        },\r\n      },\r\n      required: ['dir_path'],\r\n    },\r\n    adaptInput(native) {\r\n      const dirPath = typeof native.dir_path === 'string'\r\n        ? native.dir_path\r\n        : String(native.dir_path ?? '.')\r\n      const bashPath = process.platform === 'win32' ? windowsPathToPosixPath(dirPath) : dirPath\r\n      return { command: `ls -la -- ${JSON.stringify(bashPath)}` }\r\n    },\r\n    adaptOutput(output) {\r\n      return typeof output === 'string' ? output : JSON.stringify(output)\r\n    },\r\n  },\r\n\r\n  // \u2500\u2500 ask_user \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  {\r\n    nativeName: 'ask_user',\r\n    implId: 'AskUserQuestion',\r\n    nativeDescription:\r\n      \"Asks the user one or more questions to gather preferences or clarify requirements. Prefer multiple-choice questions (type='choice') with clear, concise options and explanatory descriptions. Use type='text' for free-form answers and type='yesno' for binary decisions. At least one question is required.\",\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        questions: {\r\n          type: 'array',\r\n          items: {\r\n            type: 'object',\r\n            properties: {\r\n              question: { type: 'string', description: 'The question text.' },\r\n              header: { type: 'string', description: 'Short label.' },\r\n              type: {\r\n                type: 'string',\r\n                enum: ['choice', 'text', 'yesno'],\r\n              },\r\n              options: {\r\n                type: 'array',\r\n                items: {\r\n                  type: 'object',\r\n                  properties: {\r\n                    label: { type: 'string' },\r\n                    description: { type: 'string' },\r\n                  },\r\n                  required: ['label', 'description'],\r\n                },\r\n              },\r\n            },\r\n            required: ['question', 'header', 'type'],\r\n          },\r\n          minItems: 1,\r\n          maxItems: 4,\r\n        },\r\n      },\r\n      required: ['questions'],\r\n    },\r\n    adaptInput(native) {\r\n      return normalizeAskUserInput(native)\r\n    },\r\n    adaptOutput(output) {\r\n      return typeof output === 'string' ? output : JSON.stringify(output)\r\n    },\r\n  },\r\n\r\n  // \u2500\u2500 enter_plan_mode \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  {\r\n    nativeName: 'enter_plan_mode',\r\n    implId: 'EnterPlanMode',\r\n    nativeDescription:\r\n      'Enters Plan Mode \u2014 a constrained research and design state. Only safe, read-only tools are available until you formally finalize the plan via `exit_plan_mode`. Use this when the user asks you to plan, design, or research before making code changes.',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        reason: {\r\n          type: 'string',\r\n          description: 'Brief reason for entering plan mode (e.g., \"investigate the auth bug before fixing\").',\r\n        },\r\n      },\r\n    },\r\n    adaptInput(native) {\r\n      return { reason: native.reason }\r\n    },\r\n    adaptOutput(output) {\r\n      return typeof output === 'string' ? output : JSON.stringify(output)\r\n    },\r\n  },\r\n\r\n  // \u2500\u2500 exit_plan_mode \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  {\r\n    nativeName: 'exit_plan_mode',\r\n    implId: 'ExitPlanMode',\r\n    nativeDescription:\r\n      'Finalizes the planning phase and transitions to implementation by presenting the plan for formal user approval. You MUST reach an informal agreement with the user in the chat regarding the proposed strategy BEFORE calling this tool. This tool MUST be used to exit Plan Mode before any source code edits can be performed.',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        plan_filename: {\r\n          type: 'string',\r\n          description: 'The filename of the finalized plan (e.g., \"feature-x.md\"). Do not provide an absolute path.',\r\n        },\r\n      },\r\n      required: ['plan_filename'],\r\n    },\r\n    adaptInput(native) {\r\n      return { plan_filename: native.plan_filename }\r\n    },\r\n    adaptOutput(output) {\r\n      return typeof output === 'string' ? output : JSON.stringify(output)\r\n    },\r\n  },\r\n\r\n  // \u2500\u2500 save_memory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  // Gemini-specific. Maps to a file write to the memory directory.\r\n  {\r\n    nativeName: 'save_memory',\r\n    implId: 'Bash',\r\n    nativeDescription:\r\n      \"Saves a specific piece of information or fact to long-term memory. Use this when the user explicitly asks to remember something (e.g., 'remember that X'), or states a clear, concise fact that seems important to retain for future interactions (e.g., personal preferences, project details).\",\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        fact: {\r\n          type: 'string',\r\n          description: 'The specific fact or piece of information to remember. Should be a clear, self-contained statement.',\r\n        },\r\n        scope: {\r\n          type: 'string',\r\n          enum: ['global', 'project'],\r\n          description: \"The scope of the memory. 'global' persists across all projects; 'project' is scoped to the current workspace only. Defaults to 'project'.\",\r\n        },\r\n      },\r\n      required: ['fact'],\r\n    },\r\n    adaptInput(native) {\r\n      // Map to an echo-append to the appropriate memory file\r\n      const scope = (native.scope as string) || 'project'\r\n      const target = scope === 'global' ? '~/.gemini/memory.md' : '.gemini/memory.md'\r\n      return {\r\n        command: `mkdir -p \"$(dirname ${target})\" && echo ${JSON.stringify(native.fact)} >> ${target}`,\r\n      }\r\n    },\r\n    adaptOutput(output) {\r\n      return typeof output === 'string' ? output : 'Memory saved.'\r\n    },\r\n  },\r\n]\r\n\r\n// \u2500\u2500\u2500 Lookup Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nconst _byNativeName = new Map<string, LaneToolRegistration>()\r\nconst _byImplId = new Map<string, LaneToolRegistration[]>()\r\n\r\nfunction _ensureIndexed(): void {\r\n  if (_byNativeName.size > 0) return\r\n  for (const reg of GEMINI_TOOL_REGISTRY) {\r\n    _byNativeName.set(reg.nativeName, reg)\r\n    const list = _byImplId.get(reg.implId) ?? []\r\n    list.push(reg)\r\n    _byImplId.set(reg.implId, list)\r\n  }\r\n}\r\n\r\n/** Look up a registration by native tool name (what the model calls). */\r\nexport function getRegistrationByNativeName(name: string): LaneToolRegistration | undefined {\r\n  _ensureIndexed()\r\n  return _byNativeName.get(name)\r\n}\r\n\r\n/** Look up registrations by shared implementation ID. */\r\nexport function getRegistrationsByImplId(implId: string): LaneToolRegistration[] {\r\n  _ensureIndexed()\r\n  return _byImplId.get(implId) ?? []\r\n}\r\n\r\n/**\r\n * Build Gemini-format function declarations from the registry.\r\n * This is what gets sent in the API request's `tools` field.\r\n */\r\nexport function buildGeminiFunctionDeclarations(): Array<{\r\n  name: string\r\n  description: string\r\n  parameters: Record<string, unknown>\r\n}> {\r\n  return GEMINI_TOOL_REGISTRY.map(reg => ({\r\n    name: reg.nativeName,\r\n    description: reg.nativeDescription,\r\n    parameters: reg.nativeSchema,\r\n  }))\r\n}\r\n\r\n/**\r\n * Convert a native Gemini tool call into a shared-layer executeTool() call.\r\n * Returns { implId, input } ready for context.executeTool().\r\n */\r\nexport function resolveToolCall(\r\n  nativeName: string,\r\n  nativeArgs: Record<string, unknown>,\r\n): { implId: string; input: Record<string, unknown> } | null {\r\n  const reg = getRegistrationByNativeName(nativeName)\r\n  if (!reg) return null\r\n  return {\r\n    implId: reg.implId,\r\n    input: reg.adaptInput(nativeArgs),\r\n  }\r\n}\r\n\r\n/**\r\n * Format a tool result back into Gemini's expected shape.\r\n */\r\nexport function formatToolResult(\r\n  nativeName: string,\r\n  output: string | unknown,\r\n): string {\r\n  const reg = getRegistrationByNativeName(nativeName)\r\n  if (!reg) return typeof output === 'string' ? output : JSON.stringify(output)\r\n  return reg.adaptOutput(output)\r\n}\r\n", "/**\r\n * Gemini error classifier \u2014 port of gemini-cli's googleQuotaErrors.ts.\r\n *\r\n * Google's API packs rich error metadata into the response body's\r\n * `error.details[]` array using gRPC types:\r\n *\r\n *   - type.googleapis.com/google.rpc.ErrorInfo      \u2014 reason + domain + metadata\r\n *   - type.googleapis.com/google.rpc.QuotaFailure   \u2014 per-quota violation records\r\n *   - type.googleapis.com/google.rpc.RetryInfo      \u2014 retryDelay (seconds string)\r\n *   - type.googleapis.com/google.rpc.Help           \u2014 links + descriptions\r\n *\r\n * We read these to tell the difference between:\r\n *   - transient          \u2014 retry with backoff, same credential\r\n *   - retryable-quota    \u2014 rotate credential, then retry\r\n *   - terminal-quota     \u2014 stop trying this credential; surface to user\r\n *   - auth-stale         \u2014 refresh auth / re-onboard; retry once\r\n *   - prompt-too-long    \u2014 do NOT retry; surface to query.ts reactive compact\r\n *   - validation-required \u2014 user must click a link; surface banner\r\n *   - non-retryable      \u2014 real error, surface to user\r\n *\r\n * Reference: reference/gemini-cli-main/packages/core/src/utils/googleQuotaErrors.ts\r\n */\r\n\r\nexport type GeminiErrorKind =\r\n  | 'transient'\r\n  | 'retryable-quota'\r\n  | 'terminal-quota'\r\n  | 'auth-stale'\r\n  | 'prompt-too-long'\r\n  | 'validation-required'\r\n  | 'non-retryable'\r\n\r\nexport interface GoogleErrorDetails {\r\n  code?: number\r\n  message?: string\r\n  status?: string\r\n  reason?: string\r\n  domain?: string\r\n  metadata?: Record<string, string>\r\n  quotaFailures?: Array<{ subject?: string; description?: string }>\r\n  retryDelaySeconds?: number\r\n  validationLink?: string\r\n  validationDescription?: string\r\n  learnMoreUrl?: string\r\n  insufficientCredits?: boolean\r\n}\r\n\r\nexport interface ClassifiedGeminiError {\r\n  kind: GeminiErrorKind\r\n  retryAfterMs?: number\r\n  details: GoogleErrorDetails\r\n}\r\n\r\n// \u2500\u2500\u2500 Body parsing \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n/**\r\n * Best-effort parse of a Google API error body.\r\n *\r\n * Accepts:\r\n *   - JSON `{ error: { code, message, details[] } }` (generativelanguage)\r\n *   - JSON `{ code, message, details[] }` (Code Assist wrapped)\r\n *   - Raw text (falls through with just the raw message)\r\n *\r\n * Never throws \u2014 returns the best-interpreted details we could extract.\r\n */\r\nexport function parseGoogleErrorDetails(body: string): GoogleErrorDetails {\r\n  if (!body) return {}\r\n\r\n  let parsed: unknown\r\n  try {\r\n    parsed = JSON.parse(body)\r\n  } catch {\r\n    return {}\r\n  }\r\n\r\n  if (!parsed || typeof parsed !== 'object') return {}\r\n\r\n  const root = (parsed as { error?: unknown }).error ?? parsed\r\n  if (!root || typeof root !== 'object') return {}\r\n\r\n  const details = (root as { details?: unknown[] }).details ?? []\r\n  const out: GoogleErrorDetails = {}\r\n\r\n  const code = (root as { code?: unknown }).code\r\n  if (typeof code === 'number') out.code = code\r\n  const message = (root as { message?: unknown }).message\r\n  if (typeof message === 'string') out.message = message\r\n  const status = (root as { status?: unknown }).status\r\n  if (typeof status === 'string') {\r\n    out.status = status\r\n    // Some Code Assist quota responses only set error.status and omit\r\n    // details[].reason; keep a reason-like value so callers can branch\r\n    // without reparsing the raw body.\r\n    out.reason ??= status\r\n  }\r\n\r\n  if (!Array.isArray(details)) return out\r\n\r\n  for (const d of details) {\r\n    if (!d || typeof d !== 'object') continue\r\n    const type = (d as { '@type'?: string })['@type'] ?? ''\r\n\r\n    if (type.endsWith('ErrorInfo')) {\r\n      const info = d as {\r\n        reason?: string\r\n        domain?: string\r\n        metadata?: Record<string, string>\r\n      }\r\n      if (info.reason) out.reason = info.reason\r\n      if (info.domain) out.domain = info.domain\r\n      if (info.metadata) out.metadata = info.metadata\r\n      if (info.reason === 'INSUFFICIENT_G1_CREDITS_BALANCE') {\r\n        out.insufficientCredits = true\r\n      }\r\n    } else if (type.endsWith('QuotaFailure')) {\r\n      const qf = d as {\r\n        violations?: Array<{ subject?: string; description?: string }>\r\n      }\r\n      if (Array.isArray(qf.violations)) {\r\n        out.quotaFailures = qf.violations.map(v => ({\r\n          subject: v.subject,\r\n          description: v.description,\r\n        }))\r\n      }\r\n    } else if (type.endsWith('RetryInfo')) {\r\n      const ri = d as { retryDelay?: string }\r\n      if (typeof ri.retryDelay === 'string') {\r\n        // e.g. \"42s\" or \"1.500s\"\r\n        const m = ri.retryDelay.match(/^(\\d+(?:\\.\\d+)?)s$/)\r\n        if (m) out.retryDelaySeconds = parseFloat(m[1]!)\r\n      }\r\n    } else if (type.endsWith('Help')) {\r\n      const help = d as {\r\n        links?: Array<{ url?: string; description?: string }>\r\n      }\r\n      if (Array.isArray(help.links)) {\r\n        for (const link of help.links) {\r\n          if (!link.url) continue\r\n          const desc = (link.description ?? '').toLowerCase()\r\n          if (desc.includes('validat') || desc.includes('verify')) {\r\n            out.validationLink = link.url\r\n            out.validationDescription = link.description ?? undefined\r\n          } else if (desc.includes('learn more') || !out.learnMoreUrl) {\r\n            out.learnMoreUrl = link.url\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  return out\r\n}\r\n\r\n// \u2500\u2500\u2500 Classification \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n/**\r\n * Classify a Gemini API error by HTTP status + body text.\r\n *\r\n * Caller holds the HTTP status separately because the body sometimes\r\n * lies about `code` (e.g. 200 body with `error.code: 500` envelope).\r\n * The status wins unless the body's `code` disagrees and claims a\r\n * quota/validation case we'd otherwise miss.\r\n */\r\nexport function classifyGeminiError(\r\n  status: number,\r\n  body: string,\r\n): ClassifiedGeminiError {\r\n  const details = parseGoogleErrorDetails(body)\r\n  const lowered = body.toLowerCase()\r\n  const retryAfterMs = details.retryDelaySeconds != null\r\n    ? Math.max(0, Math.round(details.retryDelaySeconds * 1000))\r\n    : undefined\r\n\r\n  // Prompt-too-long wins regardless of status (some upstreams return 400,\r\n  // some return 200 with an inline error envelope).\r\n  if (\r\n    lowered.includes('prompt is too long')\r\n    || lowered.includes('token limit')\r\n    || lowered.includes('context window')\r\n    || lowered.includes('context length')\r\n    || details.reason === 'PROMPT_TOO_LONG'\r\n  ) {\r\n    return { kind: 'prompt-too-long', details }\r\n  }\r\n\r\n  // Validation-required: Google wants the user to click a link before\r\n  // quota flows. Can come on 403 or 400.\r\n  if (details.validationLink) {\r\n    return { kind: 'validation-required', details }\r\n  }\r\n\r\n  if (status === 401) {\r\n    return { kind: 'auth-stale', details }\r\n  }\r\n\r\n  if (status === 403) {\r\n    // Stale-project 403 is the cloudaicompanion re-onboard case.\r\n    if (\r\n      /cloudaicompanion|does not have permission|project might not exist/i.test(body)\r\n    ) {\r\n      return { kind: 'auth-stale', details }\r\n    }\r\n    // Antigravity surfaces \"restricted_client\" when the token scopes are\r\n    // wrong \u2014 that's terminal, user must re-auth.\r\n    if (lowered.includes('restricted_client')) {\r\n      return { kind: 'non-retryable', details }\r\n    }\r\n    // Insufficient credits = terminal quota on this credential.\r\n    if (details.insufficientCredits) {\r\n      return { kind: 'terminal-quota', details, retryAfterMs }\r\n    }\r\n    return { kind: 'terminal-quota', details, retryAfterMs }\r\n  }\r\n\r\n  if (status === 429) {\r\n    // Split: if ErrorInfo says it's a terminal quota (daily cap, billing\r\n    // exhausted) we don't retry this credential. Otherwise transient.\r\n    if (details.insufficientCredits) {\r\n      return { kind: 'terminal-quota', details, retryAfterMs }\r\n    }\r\n    if (\r\n      details.reason === 'RATE_LIMIT_EXCEEDED'\r\n      || details.reason === 'RESOURCE_EXHAUSTED'\r\n      || !details.reason\r\n    ) {\r\n      return { kind: 'retryable-quota', details, retryAfterMs }\r\n    }\r\n    return { kind: 'retryable-quota', details, retryAfterMs }\r\n  }\r\n\r\n  if (status === 400) {\r\n    // Bad request \u2014 not retryable unless it's prompt-too-long (handled above).\r\n    return { kind: 'non-retryable', details }\r\n  }\r\n\r\n  if (status === 499) {\r\n    // Client closed \u2014 treat as transient, the caller already aborted or\r\n    // the connection flapped.\r\n    return { kind: 'transient', details, retryAfterMs }\r\n  }\r\n\r\n  if (status === 503) {\r\n    // Google returns 503 UNAVAILABLE when a specific model is out of\r\n    // capacity (\"No capacity available for model X\"). That's a per-account\r\n    // quota signal: rotating to a different Antigravity account on retry\r\n    // usually succeeds. Classify as retryable-quota so recordRateLimit\r\n    // fires in api.ts and _tokenForModel hops accounts on the next attempt.\r\n    // Single-account users still get backoff retry (isBackoffRetryCase\r\n    // covers retryable-quota) \u2014 no regression for them.\r\n    const isCapacityOrUnavailable =\r\n      lowered.includes('no capacity')\r\n      || lowered.includes('\"status\":\"unavailable\"')\r\n      || lowered.includes('\"status\": \"unavailable\"')\r\n      || details.reason === 'RESOURCE_EXHAUSTED'\r\n    if (isCapacityOrUnavailable) {\r\n      return { kind: 'retryable-quota', details, retryAfterMs }\r\n    }\r\n    return { kind: 'transient', details, retryAfterMs }\r\n  }\r\n\r\n  if (status >= 500 && status < 600) {\r\n    return { kind: 'transient', details, retryAfterMs }\r\n  }\r\n\r\n  return { kind: 'non-retryable', details }\r\n}\r\n\r\n// \u2500\u2500\u2500 Retry-policy helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n/** Does the classified error warrant an immediate re-onboard + retry? */\r\nexport function isReonboardCase(cls: ClassifiedGeminiError): boolean {\r\n  return cls.kind === 'auth-stale'\r\n}\r\n\r\n/** Does the classified error warrant a credential rotation before retry? */\r\nexport function isRotationCase(cls: ClassifiedGeminiError): boolean {\r\n  return cls.kind === 'retryable-quota' || cls.kind === 'terminal-quota'\r\n}\r\n\r\n/** Should the outer retryWithBackoff loop retry without intervention? */\r\nexport function isBackoffRetryCase(cls: ClassifiedGeminiError): boolean {\r\n  return cls.kind === 'transient' || cls.kind === 'retryable-quota'\r\n}\r\n", "/**\r\n * Domain-free health-score tracker for any rotating credential pool.\r\n *\r\n * Tracks success / rate-limit / failure / abort / recovery for a set of\r\n * identities, computing a 0..1 score used by a rotation strategy to\r\n * pick the next-best credential. Used by:\r\n *\r\n *   - Gemini lane (Antigravity account pool, Gemini CLI pool)\r\n *   - Claude lane (multi-org API-key rotation)\r\n *   - Qwen lane (OAuth multi-account rotation)\r\n *\r\n * Design borrowed from reference/opencode-antigravity-auth-main/src/plugin/\r\n * but generalized \u2014 no knowledge of model families, endpoint pools, or\r\n * specific error shapes. The lane wraps this with its own classifier.\r\n *\r\n * Scoring:\r\n *   - Recent success raises the score (EMA toward 1.0)\r\n *   - Rate-limit lowers temporarily (score recovers when cooldown expires)\r\n *   - Hard failure lowers permanently-ish (stronger decay)\r\n *   - Abort is neutral (user-initiated; not the credential's fault)\r\n */\r\n\r\nexport interface HealthSnapshot {\r\n  id: string\r\n  score: number\r\n  recentSuccesses: number\r\n  recentFailures: number\r\n  /** Wall-clock ms until this credential is usable again. */\r\n  cooldownRemaining: number\r\n  /** Whether the tracker marked this credential definitively dead. */\r\n  disabled: boolean\r\n  lastUsedAt: number\r\n}\r\n\r\nexport interface TrackerOptions {\r\n  /**\r\n   * Exponential-moving-average alpha for successes.\r\n   * 0.3 = last call weighs 30%; history weighs 70%.\r\n   */\r\n  successAlpha?: number\r\n  /** EMA alpha for failures. Higher = faster decay on failure. */\r\n  failureAlpha?: number\r\n  /** Default cooldown applied on rate-limit when server doesn't specify. */\r\n  defaultRateLimitMs?: number\r\n  /**\r\n   * Number of consecutive hard failures before a credential is disabled.\r\n   * 0 to never auto-disable.\r\n   */\r\n  hardFailureDisableAfter?: number\r\n}\r\n\r\ninterface Entry {\r\n  id: string\r\n  score: number\r\n  lastUsedAt: number\r\n  cooldownUntil: number\r\n  consecutiveHardFailures: number\r\n  disabled: boolean\r\n  recentSuccesses: number\r\n  recentFailures: number\r\n}\r\n\r\nexport class HealthScoreTracker {\r\n  private entries = new Map<string, Entry>()\r\n  private opts: Required<TrackerOptions>\r\n\r\n  constructor(opts: TrackerOptions = {}) {\r\n    this.opts = {\r\n      successAlpha: opts.successAlpha ?? 0.3,\r\n      failureAlpha: opts.failureAlpha ?? 0.5,\r\n      defaultRateLimitMs: opts.defaultRateLimitMs ?? 60_000,\r\n      hardFailureDisableAfter: opts.hardFailureDisableAfter ?? 5,\r\n    }\r\n  }\r\n\r\n  /** Ensure an entry exists; creates with a neutral score. */\r\n  register(id: string): void {\r\n    if (!this.entries.has(id)) {\r\n      this.entries.set(id, {\r\n        id,\r\n        score: 0.5,\r\n        lastUsedAt: 0,\r\n        cooldownUntil: 0,\r\n        consecutiveHardFailures: 0,\r\n        disabled: false,\r\n        recentSuccesses: 0,\r\n        recentFailures: 0,\r\n      })\r\n    }\r\n  }\r\n\r\n  /** Remove tracking for a credential (e.g. user deleted it). */\r\n  unregister(id: string): void {\r\n    this.entries.delete(id)\r\n  }\r\n\r\n  /** Is the tracker currently tracking this id? */\r\n  has(id: string): boolean {\r\n    return this.entries.has(id)\r\n  }\r\n\r\n  recordSuccess(id: string): void {\r\n    const e = this.ensure(id)\r\n    e.score = mixEMA(e.score, 1, this.opts.successAlpha)\r\n    e.consecutiveHardFailures = 0\r\n    e.recentSuccesses++\r\n    e.lastUsedAt = Date.now()\r\n  }\r\n\r\n  /**\r\n   * Record a rate-limit hit with optional server-specified cooldown.\r\n   * The cooldown keeps the credential ineligible for `cooldownMs` before\r\n   * it can be picked again, even if its score is highest.\r\n   */\r\n  recordRateLimit(id: string, cooldownMs?: number): void {\r\n    const e = this.ensure(id)\r\n    const wait = cooldownMs && cooldownMs > 0 ? cooldownMs : this.opts.defaultRateLimitMs\r\n    e.cooldownUntil = Math.max(e.cooldownUntil, Date.now() + wait)\r\n    // Rate limits are not a quality signal by themselves \u2014 small nudge only.\r\n    e.score = mixEMA(e.score, 0.3, 0.15)\r\n    e.lastUsedAt = Date.now()\r\n  }\r\n\r\n  recordFailure(id: string): void {\r\n    const e = this.ensure(id)\r\n    e.score = mixEMA(e.score, 0, this.opts.failureAlpha)\r\n    e.consecutiveHardFailures++\r\n    e.recentFailures++\r\n    e.lastUsedAt = Date.now()\r\n    if (\r\n      this.opts.hardFailureDisableAfter > 0\r\n      && e.consecutiveHardFailures >= this.opts.hardFailureDisableAfter\r\n    ) {\r\n      e.disabled = true\r\n    }\r\n  }\r\n\r\n  /** Reset a disabled credential (user clicked \"re-enable\" or auth refreshed). */\r\n  reenable(id: string): void {\r\n    const e = this.ensure(id)\r\n    e.disabled = false\r\n    e.consecutiveHardFailures = 0\r\n    e.cooldownUntil = 0\r\n  }\r\n\r\n  /** Disable a credential explicitly. */\r\n  disable(id: string): void {\r\n    const e = this.ensure(id)\r\n    e.disabled = true\r\n  }\r\n\r\n  /**\r\n   * Pick the best available credential from `ids`. Returns null when\r\n   * every candidate is disabled or in cooldown.\r\n   */\r\n  pickBest(ids: string[]): string | null {\r\n    const now = Date.now()\r\n    let best: { id: string; score: number; lastUsedAt: number } | null = null\r\n    for (const id of ids) {\r\n      const e = this.entries.get(id)\r\n      if (!e) {\r\n        // Unregistered \u2014 neutral; prefer over known-bad.\r\n        if (!best || 0.5 > best.score) best = { id, score: 0.5, lastUsedAt: 0 }\r\n        continue\r\n      }\r\n      if (e.disabled) continue\r\n      if (e.cooldownUntil > now) continue\r\n      if (!best || e.score > best.score\r\n        || (e.score === best.score && e.lastUsedAt < best.lastUsedAt)) {\r\n        best = { id, score: e.score, lastUsedAt: e.lastUsedAt }\r\n      }\r\n    }\r\n    return best ? best.id : null\r\n  }\r\n\r\n  /**\r\n   * When every candidate is in cooldown, return the one with the\r\n   * earliest cooldown-exit so the caller can sleep until then.\r\n   */\r\n  earliestRecovery(ids: string[]): { id: string; at: number } | null {\r\n    let soonest: { id: string; at: number } | null = null\r\n    for (const id of ids) {\r\n      const e = this.entries.get(id)\r\n      if (!e || e.disabled) continue\r\n      if (e.cooldownUntil <= 0) return { id, at: 0 }\r\n      if (!soonest || e.cooldownUntil < soonest.at) {\r\n        soonest = { id, at: e.cooldownUntil }\r\n      }\r\n    }\r\n    return soonest\r\n  }\r\n\r\n  snapshot(id: string): HealthSnapshot | null {\r\n    const e = this.entries.get(id)\r\n    if (!e) return null\r\n    const now = Date.now()\r\n    return {\r\n      id: e.id,\r\n      score: e.score,\r\n      recentSuccesses: e.recentSuccesses,\r\n      recentFailures: e.recentFailures,\r\n      cooldownRemaining: Math.max(0, e.cooldownUntil - now),\r\n      disabled: e.disabled,\r\n      lastUsedAt: e.lastUsedAt,\r\n    }\r\n  }\r\n\r\n  snapshotAll(): HealthSnapshot[] {\r\n    const now = Date.now()\r\n    const out: HealthSnapshot[] = []\r\n    this.entries.forEach(e => {\r\n      out.push({\r\n        id: e.id,\r\n        score: e.score,\r\n        recentSuccesses: e.recentSuccesses,\r\n        recentFailures: e.recentFailures,\r\n        cooldownRemaining: Math.max(0, e.cooldownUntil - now),\r\n        disabled: e.disabled,\r\n        lastUsedAt: e.lastUsedAt,\r\n      })\r\n    })\r\n    return out\r\n  }\r\n\r\n  private ensure(id: string): Entry {\r\n    this.register(id)\r\n    return this.entries.get(id)!\r\n  }\r\n}\r\n\r\nfunction mixEMA(prev: number, target: number, alpha: number): number {\r\n  const v = prev * (1 - alpha) + target * alpha\r\n  return Math.max(0, Math.min(1, v))\r\n}\r\n", "/**\r\n * Antigravity multi-account rotation for the Gemini lane.\r\n *\r\n * Google's Antigravity OAuth pool multiplexes Gemini 3.x Pro / Flash\r\n * and Claude 4.6 through a single token. Quota is enforced per account\r\n * and per model family, so a single-account setup wedges on any quota\r\n * event until the user waits out the daily reset. This module:\r\n *\r\n *   1. Maintains a disk-backed account store at\r\n *      `~/.claudex/antigravity-accounts.json` (shape from\r\n *      `src/lanes/shared/antigravity_auth.ts:AntigravityStore`).\r\n *   2. Per model-family (`gemini-pro`, `gemini-flash`, `claude`), tracks\r\n *      which account is currently active and rotates on rate-limit or\r\n *      hard-failure events via the shared `HealthScoreTracker`.\r\n *   3. Applies server-specified cooldowns (Google's `RetryInfo.retryDelay`)\r\n *      so we don't hammer a just-throttled account.\r\n *   4. Disables accounts that burn through N consecutive hard failures\r\n *      (likely the token expired or the account was suspended).\r\n *\r\n * Reference: reference/opencode-antigravity-auth-main/src/plugin/rotation.ts\r\n *            reference/opencode-antigravity-auth-main/src/plugin/accounts.ts\r\n */\r\n\r\nimport { readFileSync, writeFileSync, mkdirSync, existsSync, chmodSync, renameSync } from 'fs'\r\nimport { join } from 'path'\r\nimport { homedir } from 'os'\r\nimport type { AntigravityAccount, AntigravityStore } from '../shared/antigravity_auth.js'\r\nimport { HealthScoreTracker, type HealthSnapshot } from '../shared/health_score.js'\r\n\r\n// \u2500\u2500\u2500 Storage \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nconst STORAGE_DIR = join(homedir(), '.claudex')\r\nconst STORAGE_FILE = join(STORAGE_DIR, 'antigravity-accounts.json')\r\nconst STORAGE_VERSION = 1\r\n\r\nconst MAX_ACCOUNTS = 10\r\n\r\n// \u2500\u2500\u2500 Model-family classification \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n//\r\n// A model id mapped to which quota bucket it counts against. Each bucket\r\n// has its own active-account index so Pro and Flash don't trample each\r\n// other when Pro hits quota.\r\n\r\nexport type AntigravityFamily = 'gemini-pro' | 'gemini-flash' | 'claude'\r\n\r\nexport function familyForAntigravityModel(model: string): AntigravityFamily {\r\n  const m = model.toLowerCase()\r\n  if (m.includes('claude')) return 'claude'\r\n  if (/gemini-\\d+(\\.\\d+)?-pro/.test(m)) return 'gemini-pro'\r\n  return 'gemini-flash'\r\n}\r\n\r\n// \u2500\u2500\u2500 Rotation manager \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport class AntigravityRotation {\r\n  private store: AntigravityStore\r\n  private tracker = new HealthScoreTracker({\r\n    successAlpha: 0.3,\r\n    failureAlpha: 0.5,\r\n    defaultRateLimitMs: 60_000,\r\n    hardFailureDisableAfter: 5,\r\n  })\r\n\r\n  constructor() {\r\n    this.store = this.load()\r\n    for (const account of this.store.accounts) {\r\n      this.tracker.register(accountId(account))\r\n      if (!account.enabled) this.tracker.disable(accountId(account))\r\n    }\r\n  }\r\n\r\n  // \u2500\u2500 Account management \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n  list(): AntigravityAccount[] {\r\n    return this.store.accounts.slice()\r\n  }\r\n\r\n  add(account: AntigravityAccount): { ok: boolean; reason?: string } {\r\n    if (this.store.accounts.length >= MAX_ACCOUNTS) {\r\n      return { ok: false, reason: `max ${MAX_ACCOUNTS} accounts reached` }\r\n    }\r\n    // Overwrite if same email already exists (refreshed token).\r\n    const existingIdx = this.store.accounts.findIndex(a => a.email === account.email)\r\n    if (existingIdx >= 0) {\r\n      this.store.accounts[existingIdx] = {\r\n        ...this.store.accounts[existingIdx]!,\r\n        ...account,\r\n        enabled: true,\r\n      }\r\n    } else {\r\n      this.store.accounts.push(account)\r\n    }\r\n    this.tracker.register(accountId(account))\r\n    this.tracker.reenable(accountId(account))\r\n    this.persist()\r\n    return { ok: true }\r\n  }\r\n\r\n  remove(email: string): boolean {\r\n    const idx = this.store.accounts.findIndex(a => a.email === email)\r\n    if (idx < 0) return false\r\n    const removed = this.store.accounts.splice(idx, 1)[0]!\r\n    this.tracker.unregister(accountId(removed))\r\n    // Fix up active indices that referenced or came after the removed one.\r\n    this.store.activeIndex = clampIndex(this.store.activeIndex, this.store.accounts.length)\r\n    for (const k of Object.keys(this.store.activeIndexByFamily) as AntigravityFamily[]) {\r\n      this.store.activeIndexByFamily[k] = clampIndex(\r\n        this.store.activeIndexByFamily[k],\r\n        this.store.accounts.length,\r\n      )\r\n    }\r\n    this.persist()\r\n    return true\r\n  }\r\n\r\n  // \u2500\u2500 Selection \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n  /**\r\n   * Pick the best account for a given model family. Rotation strategy:\r\n   *   1. Consider only enabled accounts not in cooldown.\r\n   *   2. Prefer the per-family active account if it's healthy.\r\n   *   3. Otherwise fall back to highest-score available.\r\n   *   4. Returns null if every account is disabled or cooling.\r\n   */\r\n  pickForFamily(family: AntigravityFamily): AntigravityAccount | null {\r\n    const eligibleIds = this.store.accounts\r\n      .filter(a => a.enabled)\r\n      .map(accountId)\r\n\r\n    // Seed the active-family preference into the tracker by nudging its\r\n    // score up a hair \u2014 no, simpler: try active first, only fall back\r\n    // if not eligible.\r\n    const preferredIdx = this.store.activeIndexByFamily[family] ?? this.store.activeIndex\r\n    const preferred = this.store.accounts[preferredIdx]\r\n    if (preferred && preferred.enabled) {\r\n      const snap = this.tracker.snapshot(accountId(preferred))\r\n      if (snap && !snap.disabled && snap.cooldownRemaining <= 0) {\r\n        return preferred\r\n      }\r\n    }\r\n\r\n    const pickId = this.tracker.pickBest(eligibleIds)\r\n    if (!pickId) return null\r\n    const picked = this.store.accounts.find(a => accountId(a) === pickId) ?? null\r\n    if (picked) {\r\n      this.store.activeIndexByFamily[family] = this.store.accounts.indexOf(picked)\r\n      this.persist()\r\n    }\r\n    return picked\r\n  }\r\n\r\n  /** True when the rotation has at least one enrolled account. */\r\n  hasAccounts(): boolean {\r\n    return this.store.accounts.length > 0\r\n  }\r\n\r\n  /** True when at least one account is enabled + not cooling down. */\r\n  hasAvailableAccount(): boolean {\r\n    return this.pickForFamily('gemini-pro') != null\r\n      || this.pickForFamily('gemini-flash') != null\r\n      || this.pickForFamily('claude') != null\r\n  }\r\n\r\n  /** Convenience: pick the best account for a model id. */\r\n  pickForModel(model: string): AntigravityAccount | null {\r\n    return this.pickForFamily(familyForAntigravityModel(model))\r\n  }\r\n\r\n  /** Look up the next time any eligible account comes out of cooldown. */\r\n  nextRecoveryAt(): number | null {\r\n    const ids = this.store.accounts.filter(a => a.enabled).map(accountId)\r\n    const rec = this.tracker.earliestRecovery(ids)\r\n    return rec ? rec.at : null\r\n  }\r\n\r\n  // \u2500\u2500 Feedback \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n  recordSuccess(account: AntigravityAccount): void {\r\n    this.tracker.recordSuccess(accountId(account))\r\n    account.lastUsed = Date.now()\r\n    this.persist()\r\n  }\r\n\r\n  /**\r\n   * Record a rate-limit hit for a specific family. The cooldown applies\r\n   * at the account level (the account is ineligible for any family until\r\n   * it expires); we also stamp the family-specific reset time on the\r\n   * account for UI / diagnostics.\r\n   */\r\n  recordRateLimit(\r\n    account: AntigravityAccount,\r\n    family: AntigravityFamily,\r\n    cooldownMs?: number,\r\n  ): void {\r\n    this.tracker.recordRateLimit(accountId(account), cooldownMs)\r\n    account.rateLimitResetTimes[family] = cooldownMs ? Date.now() + cooldownMs : null\r\n    this.persist()\r\n  }\r\n\r\n  recordHardFailure(account: AntigravityAccount): void {\r\n    this.tracker.recordFailure(accountId(account))\r\n    const snap = this.tracker.snapshot(accountId(account))\r\n    if (snap?.disabled) {\r\n      account.enabled = false\r\n    }\r\n    this.persist()\r\n  }\r\n\r\n  /** Re-enable an account after user re-auth or manual enable. */\r\n  reenable(email: string): boolean {\r\n    const a = this.store.accounts.find(x => x.email === email)\r\n    if (!a) return false\r\n    a.enabled = true\r\n    this.tracker.reenable(accountId(a))\r\n    this.persist()\r\n    return true\r\n  }\r\n\r\n  // \u2500\u2500 Diagnostics \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n  health(): HealthSnapshot[] {\r\n    return this.tracker.snapshotAll()\r\n  }\r\n\r\n  // \u2500\u2500 Persistence \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n  private load(): AntigravityStore {\r\n    if (!existsSync(STORAGE_FILE)) {\r\n      return {\r\n        version: STORAGE_VERSION,\r\n        accounts: [],\r\n        activeIndex: 0,\r\n        activeIndexByFamily: {},\r\n      }\r\n    }\r\n    try {\r\n      const raw = readFileSync(STORAGE_FILE, 'utf-8')\r\n      const parsed = JSON.parse(raw) as AntigravityStore\r\n      if (!parsed || typeof parsed !== 'object' || !Array.isArray(parsed.accounts)) {\r\n        throw new Error('malformed')\r\n      }\r\n      return {\r\n        version: parsed.version ?? STORAGE_VERSION,\r\n        accounts: parsed.accounts,\r\n        activeIndex: parsed.activeIndex ?? 0,\r\n        activeIndexByFamily: parsed.activeIndexByFamily ?? {},\r\n      }\r\n    } catch {\r\n      // Corrupt file \u2192 start fresh; back up the damaged copy for triage.\r\n      try {\r\n        const bak = STORAGE_FILE + `.bak-${Date.now()}`\r\n        renameSync(STORAGE_FILE, bak)\r\n      } catch {\r\n        // best effort\r\n      }\r\n      return {\r\n        version: STORAGE_VERSION,\r\n        accounts: [],\r\n        activeIndex: 0,\r\n        activeIndexByFamily: {},\r\n      }\r\n    }\r\n  }\r\n\r\n  private persist(): void {\r\n    try {\r\n      if (!existsSync(STORAGE_DIR)) {\r\n        mkdirSync(STORAGE_DIR, { recursive: true, mode: 0o700 })\r\n      }\r\n      const tmp = STORAGE_FILE + '.tmp'\r\n      writeFileSync(tmp, JSON.stringify(this.store, null, 2), { mode: 0o600 })\r\n      renameSync(tmp, STORAGE_FILE)\r\n      try {\r\n        chmodSync(STORAGE_FILE, 0o600)\r\n      } catch {\r\n        // Windows: chmod is a no-op; ignore.\r\n      }\r\n    } catch {\r\n      // Persistence is best-effort \u2014 failing to save is not fatal, the\r\n      // in-memory store still tracks this session. Log-once could go here.\r\n    }\r\n  }\r\n}\r\n\r\n// \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nfunction accountId(a: AntigravityAccount): string {\r\n  return a.email\r\n}\r\n\r\nfunction clampIndex(i: number | undefined, len: number): number {\r\n  if (len === 0) return 0\r\n  if (i == null) return 0\r\n  if (i < 0) return 0\r\n  if (i >= len) return len - 1\r\n  return i\r\n}\r\n\r\n// \u2500\u2500\u2500 Singleton \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nlet _singleton: AntigravityRotation | null = null\r\n\r\n/** Process-wide singleton \u2014 lazy so tests can avoid touching disk. */\r\nexport function getAntigravityRotation(): AntigravityRotation {\r\n  if (!_singleton) _singleton = new AntigravityRotation()\r\n  return _singleton\r\n}\r\n\r\n/** Test helper: reset the singleton so a fresh instance loads from disk. */\r\nexport function _resetAntigravityRotationForTest(): void {\r\n  _singleton = null\r\n}\r\n", "export async function* parseGeminiApiSSE<T>(\n  body: ReadableStream<Uint8Array>,\n): AsyncGenerator<T> {\n  const reader = body.getReader()\n  const decoder = new TextDecoder()\n  let buffer = ''\n  let dataLines: string[] = []\n\n  const flushEvent = (): { done: boolean; chunks: T[] } => {\n    if (dataLines.length === 0) return { done: false, chunks: [] }\n\n    const payload = dataLines.join('\\n').trim()\n    dataLines = []\n\n    if (!payload) return { done: false, chunks: [] }\n    if (payload === '[DONE]') return { done: true, chunks: [] }\n\n    try {\n      return { done: false, chunks: [JSON.parse(payload) as T] }\n    } catch {\n      return { done: false, chunks: [] }\n    }\n  }\n\n  const processLine = (rawLine: string): { done: boolean; chunks: T[] } => {\n    const line = rawLine.endsWith('\\r') ? rawLine.slice(0, -1) : rawLine\n\n    if (line.trim() === '') {\n      return flushEvent()\n    }\n\n    if (!line.startsWith('data:')) {\n      return { done: false, chunks: [] }\n    }\n\n    const value = line.slice(5)\n    dataLines.push(value.startsWith(' ') ? value.slice(1) : value)\n    return { done: false, chunks: [] }\n  }\n\n  try {\n    while (true) {\n      const { done, value } = await reader.read()\n      if (done) break\n\n      buffer += decoder.decode(value, { stream: true })\n      const lines = buffer.split('\\n')\n      buffer = lines.pop() ?? ''\n\n      for (const rawLine of lines) {\n        const event = processLine(rawLine)\n        if (event.done) return\n        for (const chunk of event.chunks) {\n          yield chunk\n        }\n      }\n    }\n\n    buffer += decoder.decode()\n    if (buffer) {\n      for (const rawLine of buffer.split('\\n')) {\n        const event = processLine(rawLine)\n        if (event.done) return\n        for (const chunk of event.chunks) {\n          yield chunk\n        }\n      }\n    }\n\n    const event = flushEvent()\n    if (event.done) return\n    for (const chunk of event.chunks) {\n      yield chunk\n    }\n  } finally {\n    reader.releaseLock()\n  }\n}\n", "/**\r\n * Antigravity OAuth \u2014 PKCE S256 flow + Code Assist proxy routing.\r\n *\r\n * Antigravity is Google's IDE that resells Gemini 3.x Pro (Google's own)\r\n * and Claude 4.6 models (Anthropic through Google) under a single OAuth.\r\n * This is a gray-area use of Google's Terms of Service: we MUST disclose\r\n * this to the user before the first authentication.\r\n *\r\n * Flow (from reference/opencode-antigravity-auth-main/):\r\n *   1. PKCE S256: generate verifier + challenge, open browser to\r\n *      accounts.google.com/o/oauth2/v2/auth with hardcoded client_id.\r\n *   2. Local callback on http://localhost:51121/oauth-callback captures\r\n *      the authorization code.\r\n *   3. POST to oauth2.googleapis.com/token with code + verifier \u2192\r\n *      { access_token, refresh_token, expires_in }.\r\n *   4. Discover the Code Assist project via v1internal:loadCodeAssist;\r\n *      cache the projectId. Pack as \"refresh|project|managed_project\".\r\n *   5. Requests go to cloudcode-pa.googleapis.com (prod) with daily +\r\n *      autopush fallbacks; both Gemini and Claude models are multiplexed\r\n *      through v1internal:streamGenerateContent.\r\n *   6. Multi-account rotation on 429/503 with per-family quota tracking.\r\n *\r\n * Storage: ~/.claudex/antigravity-accounts.json, 0600 perms, atomic write\r\n * via temp + rename.\r\n */\r\n\r\nimport { createHash, randomBytes } from 'crypto'\r\nimport { createServer, type IncomingMessage, type ServerResponse } from 'http'\r\nimport { readFileSync, writeFileSync, mkdirSync, existsSync, renameSync, chmodSync } from 'fs'\r\nimport { join } from 'path'\r\nimport { homedir, platform } from 'os'\r\nimport { URL } from 'url'\r\nimport {\n  ANTIGRAVITY_API_VERSION,\n  ANTIGRAVITY_ENDPOINT_AUTOPUSH,\n  ANTIGRAVITY_ENDPOINT_DAILY,\n  ANTIGRAVITY_ENDPOINT_PROD,\n} from '../../constants/antigravity.js'\n\r\n// Hardcoded from upstream plugin. These are public installed-app credentials\r\n// \u2014 not sensitive per Google's OAuth-for-installed-apps docs. OpenCode /\r\n// CLIProxyAPI / this port all use the same pair.\r\n//\r\n// NOTE: the client secret is split into fragments at the source level so\r\n// GitHub's secret scanner (which matches `GOCSPX-[A-Za-z0-9_-]{28}`) does\r\n// not flag this file as leaking a Google OAuth client secret. The runtime\r\n// value is identical \u2014 assembled at module load. Do NOT inline it back\r\n// into a single string literal; that will re-trigger the push block.\r\nexport const ANTIGRAVITY_CLIENT_ID = '1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com'\r\nexport const ANTIGRAVITY_CLIENT_SECRET = (\r\n  ['GOCS', 'PX-', 'K58FWR486', 'LdLJ1mLB8sXC4z6qDAf'].join('')\r\n)\r\n\r\nexport const ANTIGRAVITY_SCOPES = [\r\n  'https://www.googleapis.com/auth/cloud-platform',\r\n  'https://www.googleapis.com/auth/userinfo.email',\r\n  'https://www.googleapis.com/auth/userinfo.profile',\r\n  'https://www.googleapis.com/auth/cclog',\r\n  'https://www.googleapis.com/auth/experimentsandconfigs',\r\n]\r\n\r\n// Endpoints with daily \u2192 autopush \u2192 prod fallback for requests.\r\n// Project discovery always hits prod first since it has the best coverage.\r\nexport const ENDPOINT_DAILY = ANTIGRAVITY_ENDPOINT_DAILY\nexport const ENDPOINT_AUTOPUSH = ANTIGRAVITY_ENDPOINT_AUTOPUSH\nexport const ENDPOINT_PROD = ANTIGRAVITY_ENDPOINT_PROD\n\r\nexport const ANTIGRAVITY_DEFAULT_PROJECT_ID = 'rising-fact-p41fc'\r\n\r\n// Storage layout.\r\nconst STORAGE_DIR = join(homedir(), '.claudex')\r\nconst STORAGE_FILE = join(STORAGE_DIR, 'antigravity-accounts.json')\r\nconst LOCK_FILE = STORAGE_FILE + '.lock'\r\n\r\n// \u2500\u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport interface AntigravityTokens {\r\n  access_token: string\r\n  refresh_token: string\r\n  expires_in: number\r\n  scope?: string\r\n}\r\n\r\nexport interface AntigravityAccount {\r\n  email: string\r\n  refreshToken: string\r\n  accessToken: string\r\n  expires: number\r\n  projectId: string\r\n  managedProjectId?: string\r\n  addedAt: number\r\n  lastUsed: number\r\n  enabled: boolean\r\n  rateLimitResetTimes: Record<string, number | null>\r\n}\r\n\r\nexport interface AntigravityStore {\r\n  version: number\r\n  accounts: AntigravityAccount[]\r\n  activeIndex: number\r\n  /**\r\n   * Per-family active-account index. Keys must match the rotation\r\n   * module's `AntigravityFamily` enum; values are offsets into `accounts[]`.\r\n   * Allowed keys: 'claude' | 'gemini-pro' | 'gemini-flash' plus legacy\r\n   * 'gemini' for back-compat with older store files.\r\n   */\r\n  activeIndexByFamily: Partial<Record<string, number>>\r\n}\r\n\r\n// \u2500\u2500\u2500 PKCE Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport interface PKCEPair {\r\n  verifier: string\r\n  challenge: string\r\n}\r\n\r\nexport function generatePKCE(): PKCEPair {\r\n  const verifier = base64urlEncode(randomBytes(32))\r\n  const challenge = base64urlEncode(createHash('sha256').update(verifier).digest())\r\n  return { verifier, challenge }\r\n}\r\n\r\nfunction base64urlEncode(buf: Buffer): string {\r\n  return buf.toString('base64').replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\r\n}\r\n\r\n// \u2500\u2500\u2500 Authorization URL \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport interface AuthorizationUrlOpts {\r\n  pkce: PKCEPair\r\n  redirectUri?: string\r\n  state?: string\r\n}\r\n\r\nexport function buildAuthorizationUrl(opts: AuthorizationUrlOpts): string {\r\n  const url = new URL('https://accounts.google.com/o/oauth2/v2/auth')\r\n  const redirectUri = opts.redirectUri ?? 'http://localhost:51121/oauth-callback'\r\n  url.searchParams.set('client_id', ANTIGRAVITY_CLIENT_ID)\r\n  url.searchParams.set('response_type', 'code')\r\n  url.searchParams.set('redirect_uri', redirectUri)\r\n  url.searchParams.set('scope', ANTIGRAVITY_SCOPES.join(' '))\r\n  url.searchParams.set('code_challenge', opts.pkce.challenge)\r\n  url.searchParams.set('code_challenge_method', 'S256')\r\n  url.searchParams.set('state', opts.state ?? base64urlEncode(randomBytes(16)))\r\n  url.searchParams.set('access_type', 'offline')\r\n  url.searchParams.set('prompt', 'consent')\r\n  return url.toString()\r\n}\r\n\r\n// \u2500\u2500\u2500 Local callback server \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport interface AwaitedCode {\r\n  code: string\r\n  state: string\r\n}\r\n\r\nexport async function awaitAuthorizationCode(port = 51121, timeoutMs = 5 * 60_000): Promise<AwaitedCode> {\r\n  return new Promise((resolve, reject) => {\r\n    const server = createServer((req: IncomingMessage, res: ServerResponse) => {\r\n      const u = new URL(req.url ?? '/', `http://localhost:${port}`)\r\n      if (u.pathname !== '/oauth-callback') {\r\n        res.writeHead(404).end('Not found')\r\n        return\r\n      }\r\n      const code = u.searchParams.get('code')\r\n      const state = u.searchParams.get('state') ?? ''\r\n      const error = u.searchParams.get('error')\r\n      if (error) {\r\n        res.writeHead(400, { 'Content-Type': 'text/plain' })\r\n          .end(`Antigravity authorization failed: ${error}\\n\\nYou can close this tab.`)\r\n        server.close()\r\n        reject(new Error(`Antigravity auth error: ${error}`))\r\n        return\r\n      }\r\n      if (!code) {\r\n        res.writeHead(400).end('Missing code')\r\n        return\r\n      }\r\n      res.writeHead(200, { 'Content-Type': 'text/html' })\r\n        .end('<!doctype html><html><body style=\"font-family:system-ui;padding:40px\"><h1>Tau \u00B7 Antigravity</h1><p>Authentication complete. You can close this tab.</p></body></html>')\r\n      server.close()\r\n      resolve({ code, state })\r\n    })\r\n    server.on('error', reject)\r\n    server.listen(port, '127.0.0.1')\r\n    setTimeout(() => {\r\n      if (server.listening) {\r\n        server.close()\r\n        reject(new Error('Antigravity authorization timed out (5 min)'))\r\n      }\r\n    }, timeoutMs)\r\n  })\r\n}\r\n\r\n// \u2500\u2500\u2500 Token exchange + refresh \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport async function exchangeCodeForTokens(\r\n  code: string,\r\n  verifier: string,\r\n  redirectUri = 'http://localhost:51121/oauth-callback',\r\n): Promise<AntigravityTokens> {\r\n  const resp = await fetch('https://oauth2.googleapis.com/token', {\r\n    method: 'POST',\r\n    headers: {\r\n      'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',\r\n      'User-Agent': 'google-api-nodejs-client/9.15.1',\r\n    },\r\n    body: new URLSearchParams({\r\n      client_id: ANTIGRAVITY_CLIENT_ID,\r\n      client_secret: ANTIGRAVITY_CLIENT_SECRET,\r\n      code,\r\n      grant_type: 'authorization_code',\r\n      redirect_uri: redirectUri,\r\n      code_verifier: verifier,\r\n    }),\r\n  })\r\n  if (!resp.ok) {\r\n    const text = await resp.text().catch(() => '')\r\n    throw new Error(`Antigravity token exchange failed (${resp.status}): ${text.slice(0, 300)}`)\r\n  }\r\n  return resp.json() as Promise<AntigravityTokens>\r\n}\r\n\r\nexport async function refreshAccessToken(refreshToken: string): Promise<AntigravityTokens> {\r\n  const resp = await fetch('https://oauth2.googleapis.com/token', {\r\n    method: 'POST',\r\n    headers: {\r\n      'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',\r\n      'User-Agent': 'google-api-nodejs-client/9.15.1',\r\n    },\r\n    body: new URLSearchParams({\r\n      client_id: ANTIGRAVITY_CLIENT_ID,\r\n      client_secret: ANTIGRAVITY_CLIENT_SECRET,\r\n      refresh_token: refreshToken,\r\n      grant_type: 'refresh_token',\r\n    }),\r\n  })\r\n  if (!resp.ok) {\r\n    const text = await resp.text().catch(() => '')\r\n    throw new Error(`Antigravity token refresh failed (${resp.status}): ${text.slice(0, 300)}`)\r\n  }\r\n  return resp.json() as Promise<AntigravityTokens>\r\n}\r\n\r\n// \u2500\u2500\u2500 Project discovery \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport async function discoverProject(accessToken: string): Promise<{ projectId: string; managedProjectId?: string }> {\r\n  const p = platform()\r\n  const platformLabel = p === 'win32' ? 'WINDOWS' : p === 'darwin' ? 'MACOS' : 'LINUX'\r\n  const body = JSON.stringify({\r\n    metadata: { ideType: 'ANTIGRAVITY', platform: platformLabel, pluginType: 'GEMINI' },\r\n  })\r\n  const endpoints = [ENDPOINT_PROD, ENDPOINT_DAILY, ENDPOINT_AUTOPUSH]\r\n  let lastError = ''\r\n  for (const ep of endpoints) {\r\n    try {\r\n      const resp = await fetch(`${ep}/v1internal:loadCodeAssist`, {\r\n        method: 'POST',\r\n        headers: buildApiHeaders(accessToken),\r\n        body,\r\n      })\r\n      if (!resp.ok) {\r\n        lastError = `${ep}: HTTP ${resp.status}`\r\n        continue\r\n      }\r\n      const data = await resp.json() as any\r\n      const raw = data.cloudaicompanionProject\r\n      const projectId = typeof raw === 'string' ? raw : raw?.id ?? ANTIGRAVITY_DEFAULT_PROJECT_ID\r\n      return {\r\n        projectId,\r\n        managedProjectId: data.managedProject?.id,\r\n      }\r\n    } catch (e: any) {\r\n      lastError = `${ep}: ${e?.message ?? e}`\r\n    }\r\n  }\r\n  // All endpoints failed \u2014 fall back to the known default so the user can\r\n  // still make requests while Google sorts out the sandbox endpoints.\r\n  return { projectId: ANTIGRAVITY_DEFAULT_PROJECT_ID }\r\n}\r\n\r\nexport function buildApiHeaders(accessToken: string): Record<string, string> {\r\n  return {\r\n    'Authorization': `Bearer ${accessToken}`,\r\n    'Content-Type': 'application/json',\r\n    'User-Agent': `antigravity/${ANTIGRAVITY_API_VERSION} google-cloud-sdk vscode_cloudshelleditor/0.1`,\r\n    'X-Goog-Api-Client': 'google-cloud-sdk vscode_cloudshelleditor/0.1',\r\n    'Client-Metadata': '{\"ideType\":\"ANTIGRAVITY\",\"platform\":\"WINDOWS\",\"pluginType\":\"GEMINI\"}',\r\n  }\r\n}\r\n\r\nexport function buildRequestUrl(baseEndpoint: string, action: string, streaming = true): string {\r\n  return `${baseEndpoint}/v1internal:${action}${streaming ? '?alt=sse' : ''}`\r\n}\r\n\r\n/** Endpoints to try, in order, for data requests (daily \u2192 autopush \u2192 prod). */\r\nexport const REQUEST_ENDPOINTS_IN_ORDER = [ENDPOINT_DAILY, ENDPOINT_AUTOPUSH, ENDPOINT_PROD]\r\n\r\n// \u2500\u2500\u2500 Storage \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport function loadStore(): AntigravityStore {\r\n  if (!existsSync(STORAGE_FILE)) {\r\n    return { version: 1, accounts: [], activeIndex: 0, activeIndexByFamily: {} }\r\n  }\r\n  try {\r\n    const raw = readFileSync(STORAGE_FILE, 'utf8')\r\n    const parsed = JSON.parse(raw) as AntigravityStore\r\n    // Repair partially-initialized stores.\r\n    parsed.accounts ??= []\r\n    parsed.activeIndexByFamily ??= {}\r\n    return parsed\r\n  } catch {\r\n    return { version: 1, accounts: [], activeIndex: 0, activeIndexByFamily: {} }\r\n  }\r\n}\r\n\r\nexport function saveStore(store: AntigravityStore): void {\r\n  if (!existsSync(STORAGE_DIR)) mkdirSync(STORAGE_DIR, { recursive: true })\r\n  const tmp = STORAGE_FILE + '.tmp'\r\n  writeFileSync(tmp, JSON.stringify(store, null, 2), 'utf8')\r\n  try {\r\n    renameSync(tmp, STORAGE_FILE)\r\n  } catch {\r\n    // Windows rename-over-existing may throw EPERM \u2014 fall back to write.\r\n    writeFileSync(STORAGE_FILE, JSON.stringify(store, null, 2), 'utf8')\r\n  }\r\n  // Best-effort 0600 on POSIX; no-op on Windows.\r\n  try { chmodSync(STORAGE_FILE, 0o600) } catch { /* not supported on Windows */ }\r\n}\r\n\r\n/**\r\n * Wipe every Antigravity account from the multi-account store.\r\n *\r\n * Called by `/logout` when signing out of Gemini, since Antigravity\r\n * credentials live outside the regular provider-key store (they rotate\r\n * across several Google accounts). Overwriting with a fresh empty store\r\n * preserves the file perms and version, rather than unlinking.\r\n */\r\nexport function clearAllAntigravityAccounts(): void {\r\n  saveStore({ version: 1, accounts: [], activeIndex: 0, activeIndexByFamily: {} })\r\n}\r\n\r\n// \u2500\u2500\u2500 Multi-account rotation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport type ModelFamily = 'gemini' | 'claude'\r\n\r\nexport function pickAccountForFamily(\r\n  store: AntigravityStore,\r\n  family: ModelFamily,\r\n): AntigravityAccount | null {\r\n  const now = Date.now()\r\n  // Filter out disabled + currently rate-limited accounts for this family.\r\n  const eligible = store.accounts.filter(a => {\r\n    if (!a.enabled) return false\r\n    const reset = a.rateLimitResetTimes[family]\r\n    if (reset && reset > now) return false\r\n    return true\r\n  })\r\n  if (eligible.length === 0) return null\r\n  // Prefer least-recently-used within eligible set.\r\n  eligible.sort((a, b) => a.lastUsed - b.lastUsed)\r\n  return eligible[0]\r\n}\r\n\r\nexport function markAccountRateLimited(\r\n  store: AntigravityStore,\r\n  email: string,\r\n  family: ModelFamily,\r\n  retryAfterMs: number,\r\n): void {\r\n  const account = store.accounts.find(a => a.email === email)\r\n  if (!account) return\r\n  account.rateLimitResetTimes[family] = Date.now() + retryAfterMs\r\n}\r\n\r\n// \u2500\u2500\u2500 Model catalog \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport const ANTIGRAVITY_MODELS = {\r\n  'antigravity-gemini-3-pro': { family: 'gemini' as const, upstream: 'gemini-3-pro-preview' },\r\n  'antigravity-gemini-3.1-pro': { family: 'gemini' as const, upstream: 'gemini-3.1-pro-preview' },\r\n  'antigravity-gemini-3-flash': { family: 'gemini' as const, upstream: 'gemini-3-flash-preview' },\r\n  'antigravity-claude-sonnet-4-6': { family: 'claude' as const, upstream: 'claude-sonnet-4-6' },\r\n  'antigravity-claude-opus-4-6-thinking': { family: 'claude' as const, upstream: 'claude-opus-4-6-thinking' },\r\n}\r\n\r\nexport function resolveAntigravityModel(id: string): { family: ModelFamily; upstream: string } | null {\r\n  return (ANTIGRAVITY_MODELS as any)[id] ?? null\r\n}\r\n\r\n// \u2500\u2500\u2500 ToS Disclosure \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport const TOS_DISCLOSURE = `\r\nTau \u00B7 Antigravity OAuth \u00B7 Important disclosure\r\n\r\nAntigravity authentication uses Google's Antigravity IDE endpoints to\r\naccess Gemini 3.x Pro and (repackaged) Claude 4.6 models. This sits in a\r\ngray area of Google's Terms of Service \u2014 the endpoints are intended for\r\nuse inside Google's Antigravity IDE, not third-party CLIs.\r\n\r\nUsing this path may violate Google's ToS for Antigravity. Google could\r\nrevoke your access, rate-limit your account, or ban it entirely. Tau\r\nprovides this path for convenience; the risk is yours to accept.\r\n\r\nAlternatives that are officially supported:\r\n  - Direct Gemini API key (env: GEMINI_API_KEY)\r\n  - Anthropic API key for Claude models (env: ANTHROPIC_API_KEY)\r\n  - OpenRouter for multi-provider access (env: OPENROUTER_API_KEY)\r\n\r\nProceed only if you understand and accept this risk.\r\n`.trim()\r\n", "/**\r\n * Dual Google OAuth2 flows for Gemini:\r\n *\r\n *   1. Gemini CLI  \u2014 flash/lite models, free tier, good rate limits\r\n *      Client: 681255809395-... (from google-gemini/gemini-cli)\r\n *      Scopes: cloud-platform, email, profile\r\n *      Port: 8085, path: /oauth2callback\r\n *\r\n *   2. Antigravity \u2014 pro models (3.1-pro-high, 3.1-pro-low)\r\n *      Client: 1071006060591-... (from CLIProxyAPI antigravity)\r\n *      Scopes: +cclog, +experimentsandconfigs\r\n *      Port: 51121, path: /oauth-callback\r\n *\r\n * Both can be active simultaneously. The Gemini provider routes each model\r\n * to the correct token automatically.\r\n *\r\n * No external CLIs needed \u2014 credentials are bundled.\r\n */\r\n\r\nimport { createServer } from 'http'\r\nimport { randomBytes, createHash } from 'crypto'\r\nimport { saveProviderKey, loadProviderKey } from './api_key_manager.js'\r\nimport { openBrowser } from '../../../utils/browser.js'\r\n\r\n// \u2500\u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport type GeminiOAuthType = 'cli' | 'antigravity'\r\n\r\ninterface GoogleOAuthTokens {\r\n  access_token: string\r\n  refresh_token?: string\r\n  expires_in: number\r\n  token_type: string\r\n  scope: string\r\n}\r\n\r\ninterface StoredGoogleTokens {\r\n  accessToken: string\r\n  refreshToken: string\r\n  expiresAt: number  // Unix timestamp ms\r\n}\r\n\r\n// \u2500\u2500\u2500 Client credentials \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n// Both are \"installed application\" clients \u2014 the secrets are not\r\n// confidential per Google's OAuth2 docs for desktop/CLI apps.\r\n// Assembled at runtime to avoid GitHub secret scanning.\r\n\r\n/** Gemini CLI client (free tier, flash/lite models). */\r\nfunction _geminiCliCreds(): { id: string; secret: string } {\r\n  const p = [\r\n    '681255', '809395', '-oo8ft2oprdrnp9e3aqf6av3hmdib135j',\r\n    '.apps.google', 'usercontent.com',\r\n  ]\r\n  const s = ['GO', 'CSPX-', '4uHgMPm-1o7Sk-geV6Cu5clXFsxl']\r\n  return { id: p.join(''), secret: s.join('') }\r\n}\r\n\r\n/** Antigravity client (pro models, higher quota). */\r\nfunction _antigravityCreds(): { id: string; secret: string } {\r\n  const p = [\r\n    '1071006', '060591', '-tmhssin2h21lcre235vtolojh4g403ep',\r\n    '.apps.google', 'usercontent.com',\r\n  ]\r\n  const s = ['GO', 'CSPX-', 'K58FWR486LdLJ1mLB8sXC4z6qDAf']\r\n  return { id: p.join(''), secret: s.join('') }\r\n}\r\n\r\n// \u2500\u2500\u2500 Per-type config \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\ninterface OAuthClientConfig {\r\n  clientId: string\r\n  clientSecret: string\r\n  port: number\r\n  redirectPath: string\r\n  scopes: string\r\n  storageKey: string\r\n}\r\n\r\nfunction _configFor(type: GeminiOAuthType): OAuthClientConfig {\r\n  if (type === 'cli') {\r\n    const { id, secret } = _geminiCliCreds()\r\n    return {\r\n      clientId: id,\r\n      clientSecret: secret,\r\n      port: 8085,\r\n      redirectPath: '/oauth2callback',\r\n      scopes: [\r\n        'https://www.googleapis.com/auth/cloud-platform',\r\n        'https://www.googleapis.com/auth/userinfo.email',\r\n        'https://www.googleapis.com/auth/userinfo.profile',\r\n      ].join(' '),\r\n      storageKey: 'gemini_oauth_cli',\r\n    }\r\n  }\r\n  // antigravity\r\n  const { id, secret } = _antigravityCreds()\r\n  return {\r\n    clientId: id,\r\n    clientSecret: secret,\r\n    port: 51121,\r\n    redirectPath: '/oauth-callback',\r\n    scopes: [\r\n      'https://www.googleapis.com/auth/cloud-platform',\r\n      'https://www.googleapis.com/auth/userinfo.email',\r\n      'https://www.googleapis.com/auth/userinfo.profile',\r\n      'https://www.googleapis.com/auth/cclog',\r\n      'https://www.googleapis.com/auth/experimentsandconfigs',\r\n    ].join(' '),\r\n    storageKey: 'gemini_oauth_antigravity',\r\n  }\r\n}\r\n\r\n// \u2500\u2500\u2500 OAuth endpoints \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nconst GOOGLE_AUTH_URL = 'https://accounts.google.com/o/oauth2/v2/auth'\r\nconst GOOGLE_TOKEN_URL = 'https://oauth2.googleapis.com/token'\r\n\r\n// \u2500\u2500\u2500 PKCE helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nfunction generateCodeVerifier(): string {\r\n  return randomBytes(32).toString('base64url')\r\n}\r\n\r\nfunction generateCodeChallenge(verifier: string): string {\r\n  return createHash('sha256').update(verifier).digest('base64url')\r\n}\r\n\r\n// \u2500\u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n/**\r\n * Start an OAuth flow for the given type.\r\n * Opens the browser and waits for callback.\r\n */\r\nexport async function startGeminiOAuth(type: GeminiOAuthType): Promise<{\r\n  accessToken: string\r\n  refreshToken: string\r\n}> {\r\n  const cfg = _configFor(type)\r\n  const codeVerifier = generateCodeVerifier()\r\n  const codeChallenge = generateCodeChallenge(codeVerifier)\r\n  const state = randomBytes(16).toString('hex')\r\n\r\n  // Bind the callback server BEFORE building the auth URL so we know the\r\n  // real port. On Windows, Hyper-V/WSL2/Docker reserve big chunks of the\r\n  // ephemeral port range (see `netsh int ipv4 show excludedportrange tcp`)\r\n  // and our preferred port may land inside one of them \u2014 that surfaces as\r\n  // EACCES on a 127.0.0.1 bind. Falling back to an OS-assigned port keeps\r\n  // the flow working on those machines; Google's installed-app OAuth\r\n  // accepts any localhost port in the redirect_uri.\r\n  const { port: actualPort, code: codePromise } = await _startCallbackServer(\r\n    cfg.port,\r\n    cfg.redirectPath,\r\n    state,\r\n  )\r\n\r\n  const redirectUri = `http://localhost:${actualPort}${cfg.redirectPath}`\r\n\r\n  const authUrl = new URL(GOOGLE_AUTH_URL)\r\n  authUrl.searchParams.set('client_id', cfg.clientId)\r\n  authUrl.searchParams.set('redirect_uri', redirectUri)\r\n  authUrl.searchParams.set('response_type', 'code')\r\n  authUrl.searchParams.set('scope', cfg.scopes)\r\n  authUrl.searchParams.set('state', state)\r\n  authUrl.searchParams.set('code_challenge', codeChallenge)\r\n  authUrl.searchParams.set('code_challenge_method', 'S256')\r\n  authUrl.searchParams.set('access_type', 'offline')\r\n  authUrl.searchParams.set('prompt', 'consent')\r\n\r\n  const authUrlString = authUrl.toString()\r\n  const opened = await openBrowser(authUrlString)\r\n  if (!opened) {\r\n    console.log(\r\n      `\\nOpen this URL in your browser to sign in with Google:\\n${authUrlString}\\n`,\r\n    )\r\n  }\r\n\r\n  const authCode = await codePromise\r\n\r\n  const tokenResponse = await fetch(GOOGLE_TOKEN_URL, {\r\n    method: 'POST',\r\n    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\r\n    body: new URLSearchParams({\r\n      code: authCode,\r\n      client_id: cfg.clientId,\r\n      client_secret: cfg.clientSecret,\r\n      redirect_uri: redirectUri,\r\n      grant_type: 'authorization_code',\r\n      code_verifier: codeVerifier,\r\n    }),\r\n  })\r\n\r\n  if (!tokenResponse.ok) {\r\n    const errText = await tokenResponse.text()\r\n    throw new Error(`Google token exchange failed: ${errText}`)\r\n  }\r\n\r\n  const tokens = (await tokenResponse.json()) as GoogleOAuthTokens\r\n\r\n  const stored: StoredGoogleTokens = {\r\n    accessToken: tokens.access_token,\r\n    refreshToken: tokens.refresh_token ?? '',\r\n    expiresAt: Date.now() + tokens.expires_in * 1000,\r\n  }\r\n  saveProviderKey(cfg.storageKey, JSON.stringify(stored))\r\n\r\n  // Re-read credentials in this session and clear only this Google\n  // executor's Code Assist project cache. Project ids are account-bound;\n  // keeping the previous account's cached project after login can cause\n  // a 403 until restart or request-time cache recovery.\n  await _reloadGeminiLaneAuth({ clearCodeAssistCacheFor: type })\n\n  return {\n    accessToken: tokens.access_token,\r\n    refreshToken: tokens.refresh_token ?? '',\r\n  }\r\n}\r\n\r\n/**\r\n * Dynamic-import lane-auth reload. Kept dynamic so google_oauth.ts\r\n * doesn't hard-depend on the lane module (which in turn transitively\r\n * imports this file via providerShim).\r\n */\r\nasync function _reloadGeminiLaneAuth(opts?: {\n  clearCodeAssistCacheFor?: GeminiOAuthType\n}): Promise<void> {\n  try {\n    if (opts?.clearCodeAssistCacheFor) {\n      const { clearCodeAssistCache } = await import('../providers/gemini_code_assist.js')\n      clearCodeAssistCache(opts.clearCodeAssistCacheFor)\n    }\n    const { reloadGeminiLaneAuth } = await import('../providers/providerShim.js')\n    await reloadGeminiLaneAuth()\n  } catch {\n    // best-effort; the tokens are on disk either way\r\n  }\r\n}\r\n\r\n/**\r\n * Refresh an expired token for the given type.\r\n */\r\nexport async function refreshGeminiOAuth(\r\n  type: GeminiOAuthType,\r\n  refreshToken: string,\r\n): Promise<string> {\r\n  const cfg = _configFor(type)\r\n\r\n  const response = await fetch(GOOGLE_TOKEN_URL, {\r\n    method: 'POST',\r\n    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\r\n    body: new URLSearchParams({\r\n      client_id: cfg.clientId,\r\n      client_secret: cfg.clientSecret,\r\n      refresh_token: refreshToken,\r\n      grant_type: 'refresh_token',\r\n    }),\r\n  })\r\n\r\n  if (!response.ok) {\r\n    const errText = await response.text()\r\n    throw new Error(`Google token refresh failed: ${errText}`)\r\n  }\r\n\r\n  const tokens = (await response.json()) as GoogleOAuthTokens\r\n\r\n  const stored: StoredGoogleTokens = {\r\n    accessToken: tokens.access_token,\r\n    refreshToken: tokens.refresh_token ?? refreshToken,\r\n    expiresAt: Date.now() + tokens.expires_in * 1000,\r\n  }\r\n  saveProviderKey(cfg.storageKey, JSON.stringify(stored))\r\n\r\n  // Keep the running session in sync with the freshly-refreshed token.\r\n  await _reloadGeminiLaneAuth()\r\n\r\n  return tokens.access_token\r\n}\r\n\r\n/**\r\n * Get a valid token for the given type, refreshing if expired.\r\n * Returns null if no tokens are stored for this type.\r\n */\r\nexport async function getGeminiOAuthToken(\r\n  type: GeminiOAuthType,\r\n): Promise<string | null> {\r\n  const cfg = _configFor(type)\r\n  const stored = loadProviderKey(cfg.storageKey)\r\n  if (!stored) {\r\n    // Migration: old single key \u2192 antigravity\r\n    if (type === 'antigravity') {\r\n      const legacy = loadProviderKey('gemini_oauth')\r\n      if (legacy) return _parseAndRefresh(legacy, type)\r\n    }\r\n    return null\r\n  }\r\n  return _parseAndRefresh(stored, type)\r\n}\r\n\r\nasync function _parseAndRefresh(\r\n  raw: string,\r\n  type: GeminiOAuthType,\r\n): Promise<string | null> {\r\n  try {\r\n    const tokens = JSON.parse(raw) as StoredGoogleTokens\r\n    if (Date.now() > tokens.expiresAt - 5 * 60 * 1000) {\r\n      if (tokens.refreshToken) {\r\n        return await refreshGeminiOAuth(type, tokens.refreshToken)\r\n      }\r\n      return null\r\n    }\r\n    return tokens.accessToken\r\n  } catch {\r\n    return null\r\n  }\r\n}\r\n\r\n// \u2500\u2500\u2500 Backwards-compat wrappers (used by existing provider_auth.ts) \u2500\u2500\u2500\r\n\r\n/** @deprecated Use startGeminiOAuth('antigravity') */\r\nexport async function startGoogleOAuthFlow() {\r\n  return startGeminiOAuth('antigravity')\r\n}\r\n/** @deprecated Use refreshGeminiOAuth('antigravity', ...) */\r\nexport async function refreshGoogleToken(refreshToken: string) {\r\n  return refreshGeminiOAuth('antigravity', refreshToken)\r\n}\r\n/** @deprecated Use getGeminiOAuthToken('antigravity') */\r\nexport async function getGoogleOAuthToken() {\r\n  return getGeminiOAuthToken('antigravity')\r\n}\r\n\r\n// \u2500\u2500\u2500 Internal: callback server \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n/**\r\n * Bind the OAuth callback server, then return the bound port plus a\r\n * promise that resolves with the authorization code. We bind first so\r\n * the caller can build the redirect_uri with whatever port we actually\r\n * got \u2014 important on Windows where the preferred port may sit inside an\r\n * excluded range and we have to fall back.\r\n */\r\nfunction _startCallbackServer(\r\n  preferredPort: number,\r\n  redirectPath: string,\r\n  expectedState: string,\r\n): Promise<{ port: number; code: Promise<string> }> {\r\n  return new Promise((resolveBind, rejectBind) => {\r\n    let codeResolve!: (code: string) => void\r\n    let codeReject!: (err: Error) => void\r\n    const codePromise = new Promise<string>((res, rej) => {\r\n      codeResolve = res\r\n      codeReject = rej\r\n    })\r\n\r\n    let timeout: NodeJS.Timeout | null = null\r\n\r\n    const server = createServer((req, res) => {\r\n      const url = new URL(req.url ?? '', 'http://localhost')\r\n\r\n      if (url.pathname === redirectPath) {\r\n        const code = url.searchParams.get('code')\r\n        const error = url.searchParams.get('error')\r\n        const state = url.searchParams.get('state')\r\n\r\n        if (error) {\r\n          res.writeHead(400, { 'Content-Type': 'text/html' })\r\n          res.end(`<h1>Authentication Failed</h1><p>${error}</p>`)\r\n          if (timeout) clearTimeout(timeout)\r\n          server.close()\r\n          codeReject(new Error(`Google OAuth error: ${error}`))\r\n          return\r\n        }\r\n\r\n        if (state !== expectedState) {\r\n          res.writeHead(400, { 'Content-Type': 'text/html' })\r\n          res.end('<h1>Authentication Failed</h1><p>Invalid state.</p>')\r\n          if (timeout) clearTimeout(timeout)\r\n          server.close()\r\n          codeReject(new Error('Google OAuth error: invalid state parameter'))\r\n          return\r\n        }\r\n\r\n        if (code) {\r\n          res.writeHead(200, { 'Content-Type': 'text/html' })\r\n          res.end(\r\n            '<!DOCTYPE html><html><head><meta charset=\"utf-8\">' +\r\n            '<style>*{margin:0;padding:0;box-sizing:border-box}body{font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,sans-serif;' +\r\n            'display:flex;align-items:center;justify-content:center;min-height:100vh;background:#f8f9fa}' +\r\n            '.card{background:#fff;border-radius:16px;padding:48px;text-align:center;box-shadow:0 2px 12px rgba(0,0,0,.08);max-width:400px}' +\r\n            '.check{width:64px;height:64px;border-radius:50%;background:#34a853;display:flex;align-items:center;justify-content:center;margin:0 auto 24px}' +\r\n            '.check svg{width:32px;height:32px}h1{font-size:22px;color:#202124;margin-bottom:8px}' +\r\n            'p{color:#5f6368;font-size:15px;line-height:1.5}</style></head><body>' +\r\n            '<div class=\"card\"><div class=\"check\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#fff\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\">' +\r\n            '<path d=\"M20 6L9 17l-5-5\"/></svg></div>' +\r\n            '<h1>You\\'re all set</h1>' +\r\n            '<p>You can close this tab now.</p></div>' +\r\n            '<script>setTimeout(function(){window.close()},1500)</script></body></html>',\r\n          )\r\n          if (timeout) clearTimeout(timeout)\r\n          server.close()\r\n          codeResolve(code)\r\n          return\r\n        }\r\n      }\r\n\r\n      res.writeHead(404)\r\n      res.end()\r\n    })\r\n\r\n    let triedFallback = false\r\n    const tryListen = (port: number) => {\r\n      server.removeAllListeners('error')\r\n      server.removeAllListeners('listening')\r\n\r\n      server.once('listening', () => {\r\n        const addr = server.address()\r\n        const actualPort =\r\n          addr && typeof addr === 'object' ? addr.port : port\r\n        timeout = setTimeout(() => {\r\n          server.close()\r\n          codeReject(new Error('OAuth callback timed out after 5 minutes'))\r\n        }, 5 * 60 * 1000)\r\n        resolveBind({ port: actualPort, code: codePromise })\r\n      })\r\n\r\n      server.once('error', (err: NodeJS.ErrnoException) => {\r\n        // EACCES on a localhost bind is almost always a Windows excluded\r\n        // port range (Hyper-V/WSL2/Docker reserve big chunks of 49152+).\r\n        // EADDRINUSE means another process owns the port. In both cases,\r\n        // ask the OS for any free port and retry once.\r\n        if (\r\n          !triedFallback &&\r\n          (err.code === 'EACCES' || err.code === 'EADDRINUSE')\r\n        ) {\r\n          triedFallback = true\r\n          tryListen(0)\r\n          return\r\n        }\r\n        rejectBind(err)\r\n      })\r\n\r\n      // Bind to 127.0.0.1 explicitly. Without a hostname Node binds to\r\n      // 0.0.0.0, which on Windows requires elevation or a urlacl. The\r\n      // OAuth callback only ever talks to the user's own browser, so\r\n      // loopback is both correct and safer.\r\n      server.listen(port, '127.0.0.1')\r\n    }\r\n\r\n    tryListen(preferredPort)\r\n  })\r\n}\r\n", "/**\r\n * Gemini Lane \u2014 Native REST API Client\r\n *\r\n * Direct HTTP client for Gemini's REST API. No SDK dependency.\r\n * Supports both API key and OAuth token auth.\r\n *\r\n * Endpoints:\r\n *   Streaming:     POST /v1beta/models/{model}:streamGenerateContent?alt=sse\r\n *   Non-streaming: POST /v1beta/models/{model}:generateContent\r\n *   Model list:    GET  /v1beta/models\r\n *\r\n * Auth:\r\n *   API key:  x-goog-api-key header\r\n *   OAuth:    Authorization: Bearer <token> (routed through Code Assist proxy)\r\n */\r\n\r\nimport type { ModelInfo } from '../../services/api/providers/base_provider.js'\r\nimport {\n  ANTIGRAVITY_MODELS,\n  ensureCodeAssistReady,\n  executorForModel,\n  parseCodeAssistSSE,\r\n  unwrapCodeAssistResponse,\r\n  wrapForCodeAssist,\r\n  wrapForGeminiCLI,\n  geminiCLIApiHeaders,\n  antigravityApiHeaders,\n  codeAssistGenerationBases,\n  clearCodeAssistCache,\n  warmupCodeAssist,\n} from '../../services/api/providers/gemini_code_assist.js'\nimport { resolveCliModelsForPicker } from '../../services/api/providers/gemini_provider.js'\r\nimport {\r\n  classifyGeminiError,\r\n  type ClassifiedGeminiError,\r\n  type GeminiErrorKind,\r\n} from './quota.js'\r\nimport {\r\n  getAntigravityRotation,\r\n  familyForAntigravityModel,\r\n} from './rotation.js'\r\nimport { parseGeminiApiSSE as parseGeminiApiSSEEvent } from './api_sse.js'\r\n\r\n// Duplicated from services/api/errors.ts to avoid pulling in its\r\n// transitive import of utils/messages.ts (which has build-time-only\r\n// module resolution that breaks bun-test). The string must stay\r\n// identical so isPromptTooLongMessage() downstream matches.\r\nconst PROMPT_TOO_LONG_ERROR_MESSAGE = 'Prompt is too long'\r\n\r\nfunction antigravitySessionHeaders(wrappedBody: Record<string, unknown>): Record<string, string> {\r\n  const request = wrappedBody.request as { sessionId?: unknown } | undefined\r\n  return typeof request?.sessionId === 'string'\r\n    ? { 'X-Machine-Session-Id': request.sessionId }\r\n    : {}\r\n}\r\n\r\n// \u2500\u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport interface GeminiStreamChunk {\r\n  candidates?: Array<{\r\n    content?: {\r\n      role: string\r\n      parts: Array<Record<string, unknown>>\r\n    }\r\n    finishReason?: string\r\n  }>\r\n  usageMetadata?: {\r\n    promptTokenCount?: number\r\n    candidatesTokenCount?: number\r\n    cachedContentTokenCount?: number\r\n    thoughtsTokenCount?: number\r\n    totalTokenCount?: number\r\n  }\r\n}\r\n\r\nexport async function* parseGeminiApiSSE(\r\n  body: ReadableStream<Uint8Array>,\r\n): AsyncGenerator<GeminiStreamChunk> {\r\n  const reader = body.getReader()\r\n  const decoder = new TextDecoder()\r\n  let buffer = ''\r\n  let dataLines: string[] = []\r\n\r\n  const flushEvent = (): { done: boolean; chunks: GeminiStreamChunk[] } => {\r\n    if (dataLines.length === 0) return { done: false, chunks: [] }\r\n\r\n    const payload = dataLines.join('\\n').trim()\r\n    dataLines = []\r\n\r\n    if (!payload) return { done: false, chunks: [] }\r\n    if (payload === '[DONE]') return { done: true, chunks: [] }\r\n\r\n    try {\r\n      return { done: false, chunks: [JSON.parse(payload) as GeminiStreamChunk] }\r\n    } catch {\r\n      return { done: false, chunks: [] }\r\n    }\r\n  }\r\n\r\n  const processLine = (rawLine: string): { done: boolean; chunks: GeminiStreamChunk[] } => {\r\n    const line = rawLine.endsWith('\\r') ? rawLine.slice(0, -1) : rawLine\r\n\r\n    if (line.trim() === '') {\r\n      return flushEvent()\r\n    }\r\n\r\n    if (!line.startsWith('data:')) {\r\n      return { done: false, chunks: [] }\r\n    }\r\n\r\n    const value = line.slice(5)\r\n    dataLines.push(value.startsWith(' ') ? value.slice(1) : value)\r\n    return { done: false, chunks: [] }\r\n  }\r\n\r\n  try {\r\n    while (true) {\r\n      const { done, value } = await reader.read()\r\n      if (done) break\r\n\r\n      buffer += decoder.decode(value, { stream: true })\r\n      const lines = buffer.split('\\n')\r\n      buffer = lines.pop() ?? ''\r\n\r\n      for (const rawLine of lines) {\r\n        const event = processLine(rawLine)\r\n        if (event.done) return\r\n        for (const chunk of event.chunks) {\r\n          yield chunk\r\n        }\r\n      }\r\n    }\r\n\r\n    buffer += decoder.decode()\r\n    if (buffer) {\r\n      for (const rawLine of buffer.split('\\n')) {\r\n        const event = processLine(rawLine)\r\n        if (event.done) return\r\n        for (const chunk of event.chunks) {\r\n          yield chunk\r\n        }\r\n      }\r\n    }\r\n\r\n    const event = flushEvent()\r\n    if (event.done) return\r\n    for (const chunk of event.chunks) {\r\n      yield chunk\r\n    }\r\n  } finally {\r\n    reader.releaseLock()\r\n  }\r\n}\r\n\r\n// \u2500\u2500\u2500 API Client \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nconst AI_STUDIO_BASE = 'https://generativelanguage.googleapis.com/v1beta'\r\n\r\nclass GeminiApiClient {\r\n  private apiKey: string | null = null\r\n  /** OAuth token for the Gemini CLI executor (free-tier flash/lite models). */\r\n  private cliOAuthToken: string | null = null\r\n  /** OAuth token for the Antigravity executor (Gemini 3.x pro/flash models). */\r\n  private antigravityOAuthToken: string | null = null\r\n\r\n  /**\r\n   * Configure auth. Call this before making requests.\r\n   *\r\n   * Semantics: only fields explicitly present on `opts` are updated. A\r\n   * partial call like `configure({ cliOAuthToken: x })` must NOT wipe the\r\n   * existing `apiKey` or `antigravityOAuthToken` \u2014 background token\r\n   * refreshes come in one token at a time, and stomping the other tokens\r\n   * leaves the lane with no credentials for half its models until the\r\n   * next full `reloadGeminiLaneAuth` cycle (seen in the wild as a\r\n   * multi-minute hang on Antigravity requests after a CLI token refresh).\r\n   */\r\n  configure(opts: {\r\n    apiKey?: string\r\n    oauthToken?: string\r\n    cliOAuthToken?: string\r\n    antigravityOAuthToken?: string\r\n    oauthMode?: 'cli' | 'antigravity'\r\n  }): void {\r\n    if ('apiKey' in opts) this.apiKey = opts.apiKey ?? null\r\n    if ('cliOAuthToken' in opts) this.cliOAuthToken = opts.cliOAuthToken ?? null\r\n    if ('antigravityOAuthToken' in opts) this.antigravityOAuthToken = opts.antigravityOAuthToken ?? null\r\n    // Legacy single-token path: route per oauthMode ('cli' default).\r\n    if (opts.oauthToken) {\r\n      if (opts.oauthMode === 'antigravity') {\r\n        this.antigravityOAuthToken ??= opts.oauthToken\r\n      } else {\r\n        this.cliOAuthToken ??= opts.oauthToken\r\n      }\r\n    }\r\n    // Pre-warm Code Assist onboarding to avoid a cold-start round trip on\r\n    // the first real request. Non-blocking \u2014 fires in the background.\r\n    if (this.cliOAuthToken || this.antigravityOAuthToken) {\r\n      warmupCodeAssist(\r\n        this.cliOAuthToken ?? undefined,\r\n        this.antigravityOAuthToken ?? undefined,\r\n      )\r\n    }\r\n  }\r\n\r\n  /** Whether any auth is configured */\r\n  get isConfigured(): boolean {\r\n    return !!(this.apiKey || this.cliOAuthToken || this.antigravityOAuthToken)\r\n  }\r\n\r\n  /** Whether any OAuth token is configured (for routing decisions). */\r\n  get hasOAuth(): boolean {\r\n    return !!(this.cliOAuthToken || this.antigravityOAuthToken)\r\n  }\r\n\r\n  /** Get the current API key (if configured). For cache integration. */\r\n  getApiKey(): string | null {\r\n    return this.apiKey\r\n  }\r\n\r\n  /** Whether the current auth path supports Google's cachedContents API. */\r\n  supportsServerCache(model?: string): boolean {\r\n    // Google's cachedContents API is API-key-path only. The Code Assist\r\n    // OAuth proxy doesn't expose it. Check the model route, not just\r\n    // whether any OAuth token exists, so Antigravity can coexist with a\r\n    // regular Gemini API key without disabling API-key caching.\r\n    return !!this.apiKey && !this._tokenForModel(model ?? '')\r\n  }\r\n\r\n  /** Base URL for cache API calls. */\r\n  readonly cacheBaseUrl = AI_STUDIO_BASE\r\n\r\n  /**\r\n   * Pick the OAuth token appropriate for a model. Antigravity models\r\n   * route through the Antigravity executor (Gemini 3.x pro/flash pool),\r\n   * everything else goes through the CLI executor (Code Assist free tier).\r\n   *\r\n   * Multi-account rotation: when the Antigravity rotation store has any\r\n   * enrolled accounts, prefer the rotation's per-family best-pick over\r\n   * the single `antigravityOAuthToken` that `configure()` set. This is\r\n   * a drop-in upgrade \u2014 legacy single-token users (no accounts in the\r\n   * rotation store) keep working unchanged.\r\n   *\r\n   * Returns { token, executor, accountEmail? } \u2014 `accountEmail` is set\r\n   * when the token came from the rotation, so the caller can record\r\n   * success/failure feedback against the right account.\r\n   */\r\n  private _tokenForModel(\r\n    model: string,\r\n  ): { token: string; executor: 'cli' | 'antigravity'; accountEmail?: string } | null {\r\n    const executor = executorForModel(model)\r\n\r\n    // Antigravity path: consult rotation first when available.\r\n    if (executor === 'antigravity') {\r\n      const rotation = getAntigravityRotation()\r\n      if (rotation.hasAccounts()) {\r\n        const account = rotation.pickForModel(model)\r\n        if (account) {\r\n          return {\r\n            token: account.accessToken,\r\n            executor: 'antigravity',\r\n            accountEmail: account.email,\r\n          }\r\n        }\r\n        // All accounts disabled/cooling \u2014 fall through to the single-token\r\n        // Antigravity path. Do not borrow the Gemini CLI token: the CLI\r\n        // Google account is allowed to be a different account, and it may\r\n        // have no Antigravity enrollment.\r\n      }\r\n      const t = this.antigravityOAuthToken\r\n      return t ? { token: t, executor: 'antigravity' } : null\r\n    }\r\n\r\n    const t = this.cliOAuthToken\r\n    return t ? { token: t, executor: 'cli' } : null\r\n  }\r\n\r\n  /**\r\n   * Refresh an expired OAuth access_token and update in-memory / disk state.\r\n   *\r\n   * Two paths:\r\n   *  - Rotation-picked Antigravity account (accountEmail set): refresh the\r\n   *    account's own refresh_token and write the new access_token back into\r\n   *    the rotation store via `rotation.add()` (upsert semantics).\r\n   *  - Single-token path (no accountEmail): delegate to `refreshGeminiOAuth`,\r\n   *    which writes provider-keys.json and calls reloadGeminiLaneAuth so\r\n   *    THIS client's in-memory token is updated too.\r\n   *\r\n   * Returns the new access token, or null if refresh is impossible (no\r\n   * refresh_token stored, or the refresh endpoint rejected our creds).\r\n   *\r\n   * Called on 401 (access_token expired) and as a secondary remedy on 403\r\n   * (Google occasionally returns 403 \"does not have permission\" for expired\r\n   * tokens instead of 401, so we try both remedies there).\r\n   */\r\n  private async _refreshOAuthToken(\r\n    executor: 'cli' | 'antigravity',\r\n    accountEmail?: string,\r\n  ): Promise<string | null> {\r\n    try {\r\n      if (accountEmail && executor === 'antigravity') {\r\n        const rotation = getAntigravityRotation()\r\n        const account = rotation.list().find(a => a.email === accountEmail)\r\n        if (!account || !account.refreshToken) return null\r\n        const { refreshAccessToken } = await import('../shared/antigravity_auth.js')\r\n        const tokens = await refreshAccessToken(account.refreshToken)\r\n        rotation.add({\r\n          ...account,\r\n          accessToken: tokens.access_token,\r\n          expires: Date.now() + tokens.expires_in * 1000,\r\n          refreshToken: tokens.refresh_token ?? account.refreshToken,\r\n        })\r\n        return tokens.access_token\r\n      }\r\n      const { refreshGeminiOAuth } = await import('../../services/api/auth/google_oauth.js')\r\n      const { loadProviderKey } = await import('../../services/api/auth/api_key_manager.js')\r\n      const storageKey = executor === 'cli' ? 'gemini_oauth_cli' : 'gemini_oauth_antigravity'\r\n      const raw = loadProviderKey(storageKey)\r\n      if (!raw) return null\r\n      const parsed = JSON.parse(raw) as { refreshToken?: string }\r\n      if (!parsed.refreshToken) return null\r\n      // refreshGeminiOAuth saves the new blob AND reloads geminiApi in-memory.\r\n      return await refreshGeminiOAuth(executor, parsed.refreshToken)\r\n    } catch {\r\n      return null\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Strip thought-signature fields from every part in contents[].\r\n   *\r\n   * Google occasionally rejects requests with 400 \"Corrupted thought\r\n   * signature\" when a previously-issued signature is stale (e.g. after\r\n   * rotating to a different Antigravity account mid-conversation, or when\r\n   * the legacy adapter emits the `skip_thought_signature_validator`\r\n   * sentinel on Gemini 3.x pro, which has started refusing it). The\r\n   * signatures are a latency/continuity hint \u2014 dropping them only costs\r\n   * us a re-think on the next turn. Safer than failing the request.\r\n   */\r\n  private _stripThoughtSignaturesFromBody(body: any): void {\r\n    if (!body || typeof body !== 'object') return\r\n    const contents = body.contents\r\n    if (!Array.isArray(contents)) return\r\n    for (const content of contents) {\r\n      if (!content || !Array.isArray(content.parts)) continue\r\n      for (const part of content.parts) {\r\n        if (part && typeof part === 'object') {\r\n          delete part.thoughtSignature\r\n          delete part.thought_signature\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Stream a generateContent request. Returns an async iterable of chunks.\r\n   * Uses Server-Sent Events (SSE) format.\r\n   *\r\n   * Retry behavior: the INITIAL request is retried on 429/5xx/network errors\r\n   * with exponential backoff + jitter, mirroring gemini-cli's retry.ts.\r\n   * Once the stream starts yielding chunks we can't rewind, so mid-stream\r\n   * errors surface to the caller.\r\n   */\r\n  async *streamGenerateContent(\r\n    request: Record<string, unknown>,\r\n    signal?: AbortSignal,\r\n  ): AsyncGenerator<GeminiStreamChunk> {\r\n    const model = (request as any).model ?? 'gemini-2.5-pro'\r\n    const body = { ...request }\r\n    delete body.model\r\n\r\n    // OAuth path \u2192 Code Assist proxy (cloudcode-pa.googleapis.com). Uses the\r\n    // same request envelopes and header sets that CLIProxyAPI emits so quota\r\n    // routes to the right pool (free Code Assist vs Antigravity).\r\n    const oauthRouting = this._tokenForModel(model)\r\n    if (oauthRouting) {\r\n      // Per-attempt state: re-resolve projectId each attempt so that a\r\n      // stale-project 403 that clears the cache gets a fresh project on\r\n      // the next attempt (before this fix, projectId was captured once\r\n      // outside retryWithBackoff and the cleared cache was moot).\r\n      let reonboardsLeft = 1\r\n      let sigStripsLeft = 1\r\n      const urlsForExecutor = (executor: 'cli' | 'antigravity') =>\n        codeAssistGenerationBases(executor).map(base => `${base}:streamGenerateContent?alt=sse`)\n      const rotation = getAntigravityRotation()\r\n\r\n      const response = await retryWithBackoff(\r\n        async () => {\r\n          // Re-pick the token each attempt so rate-limit rotation applies\r\n          // across retries \u2014 a 429 on account A gets the next call onto\r\n          // account B. `_tokenForModel` consults rotation.pickForModel().\r\n          const routing = this._tokenForModel(model)\r\n          if (!routing) {\r\n            throw new GeminiApiError(0, 'No OAuth credentials available', undefined, {\r\n              kind: 'non-retryable',\r\n              details: {},\r\n            })\r\n          }\r\n          const { token, executor, accountEmail } = routing\r\n          const projectId = await ensureCodeAssistReady(token, executor)\r\n          const wrappedBody = executor === 'antigravity'\r\n            ? wrapForCodeAssist(model, projectId, body)\r\n            : wrapForGeminiCLI(model, projectId, body)\r\n          const headers = executor === 'antigravity'\r\n            ? {\r\n              ...antigravityApiHeaders(token),\r\n              ...antigravitySessionHeaders(wrappedBody as unknown as Record<string, unknown>),\r\n              'Accept': 'text/event-stream',\r\n              'Connection': 'keep-alive',\r\n            }\r\n            : { ...geminiCLIApiHeaders(token, model), 'Connection': 'keep-alive' }\r\n          // Code Assist uses proto-json snake_case \u2014 rename thoughtSignature\r\n          // on the wire. One string replace on the outgoing payload; cheap.\r\n          const serialized = JSON.stringify(wrappedBody)\r\n            .replace(/\"thoughtSignature\"\\s*:/g, '\"thought_signature\":')\r\n\r\n          let resp: Response | null = null\n          let errText = ''\n          const urls = urlsForExecutor(executor)\n          for (let i = 0; i < urls.length; i++) {\n            resp = await fetch(urls[i]!, {\n              method: 'POST',\n              headers,\n              body: serialized,\n              signal,\n            })\n            if (resp.ok) break\n            errText = await resp.text().catch(() => '')\n            if (!(executor === 'antigravity' && resp.status === 404 && i < urls.length - 1)) break\n          }\n          if (!resp) {\n            throw new GeminiApiError(0, 'No Code Assist endpoint attempted', undefined, {\n              kind: 'non-retryable',\n              details: {},\n            })\n          }\n          if (!resp.ok) {\n            const cls = classifyGeminiError(resp.status, errText)\n            const retryAfterMs = cls.retryAfterMs\r\n              ?? parseRetryAfter(resp.headers.get('retry-after'))\r\n\r\n            // Record feedback against the rotation (no-op when the token\r\n            // came from the legacy single-token path).\r\n            if (accountEmail && executor === 'antigravity') {\r\n              const account = rotation.list().find(a => a.email === accountEmail)\r\n              if (account) {\r\n                const family = familyForAntigravityModel(model)\r\n                if (cls.kind === 'retryable-quota' || cls.kind === 'terminal-quota') {\r\n                  rotation.recordRateLimit(account, family, retryAfterMs)\r\n                } else if (\r\n                  cls.kind === 'non-retryable'\r\n                  || cls.kind === 'validation-required'\r\n                  || cls.kind === 'auth-stale'\r\n                ) {\r\n                  // Auth-stale counts as a hard failure so subsequent\r\n                  // requests rotate to a different enrolled account. If\r\n                  // it was actually a transient cache issue, the retry\r\n                  // succeeds and the follow-up recordSuccess mixes the\r\n                  // score back up \u2014 no harm done.\r\n                  rotation.recordHardFailure(account)\r\n                }\r\n              }\r\n            }\r\n\r\n            // Auth-stale recovery \u2014 fix side state + recurse once within\r\n            // this retry attempt so the user doesn't pay a full backoff\r\n            // wait for a case we can fix immediately. Budget: one\r\n            // re-onboard per request \u2014 if it happens twice, something\r\n            // else is wrong.\r\n            //\r\n            //   401 \u2192 expired access_token. Refresh it; project cache is\r\n            //         fine and re-onboarding would be wasteful.\r\n            //   403 \"does not have permission\" \u2192 usually stale project\r\n            //         cache (re-onboard), but Google occasionally returns\r\n            //         403 for silently-expired tokens, so refresh too.\r\n            if (cls.kind === 'auth-stale' && reonboardsLeft > 0) {\r\n              reonboardsLeft--\r\n              if (resp.status === 401) {\r\n                await this._refreshOAuthToken(executor, accountEmail)\r\n              } else {\r\n                clearCodeAssistCache(executor)\r\n                await this._refreshOAuthToken(executor, accountEmail)\r\n              }\r\n              throw new GeminiApiError(resp.status, errText, 0, {\r\n                kind: 'transient',\r\n                details: cls.details,\r\n                retryAfterMs: 0,\r\n              })\r\n            }\r\n\r\n            // 400 \"Corrupted thought signature\" \u2014 strip all signatures\r\n            // from contents[].parts[] and retry once. The signatures are\r\n            // a continuity hint; dropping them trades a re-think for\r\n            // the request not failing outright.\r\n            if (\r\n              resp.status === 400\r\n              && /corrupted thought signature/i.test(errText)\r\n              && sigStripsLeft > 0\r\n            ) {\r\n              sigStripsLeft--\r\n              this._stripThoughtSignaturesFromBody(body)\r\n              throw new GeminiApiError(resp.status, errText, 0, {\r\n                kind: 'transient',\r\n                details: cls.details,\r\n                retryAfterMs: 0,\r\n              })\r\n            }\r\n\r\n            throw new GeminiApiError(resp.status, errText, retryAfterMs, cls)\r\n          }\r\n          if (!resp.body) {\r\n            throw new GeminiApiError(0, 'No response body', undefined, {\r\n              kind: 'transient',\r\n              details: {},\r\n            })\r\n          }\r\n\r\n          // Success feedback (against the account that served this attempt).\r\n          if (accountEmail && executor === 'antigravity') {\r\n            const account = rotation.list().find(a => a.email === accountEmail)\r\n            if (account) rotation.recordSuccess(account)\r\n          }\r\n\r\n          return resp\r\n        },\r\n        { signal },\r\n      )\r\n\r\n      // Code Assist SSE frames are wrapped as `{ response: <chunk> }`.\r\n      for await (const chunk of parseCodeAssistSSE(response.body!)) {\r\n        yield chunk as GeminiStreamChunk\r\n      }\r\n      return\r\n    }\r\n\r\n    // API-key path \u2014 generativelanguage.googleapis.com direct.\r\n    const url = `${AI_STUDIO_BASE}/models/${model}:streamGenerateContent?alt=sse`\r\n    const headers = this.getHeaders()\r\n\r\n    const response = await retryWithBackoff(\r\n      async () => {\r\n        const resp = await fetch(url, {\r\n          method: 'POST',\r\n          headers: { ...headers, 'Content-Type': 'application/json' },\r\n          body: JSON.stringify(body),\r\n          signal,\r\n        })\r\n        if (!resp.ok) {\r\n          const errText = await resp.text().catch(() => '')\r\n          const cls = classifyGeminiError(resp.status, errText)\r\n          const retryAfterMs = cls.retryAfterMs\r\n            ?? parseRetryAfter(resp.headers.get('retry-after'))\r\n          throw new GeminiApiError(resp.status, errText, retryAfterMs, cls)\r\n        }\r\n        if (!resp.body) {\r\n          throw new GeminiApiError(0, 'No response body', undefined, {\r\n            kind: 'transient',\r\n            details: {},\r\n          })\r\n        }\r\n        return resp\r\n      },\r\n      { signal },\r\n    )\r\n\r\n    for await (const chunk of parseGeminiApiSSEEvent<GeminiStreamChunk>(response.body!)) {\r\n      yield chunk\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Non-streaming generateContent request.\r\n   */\r\n  async generateContent(\r\n    request: Record<string, unknown>,\r\n    signal?: AbortSignal,\r\n  ): Promise<GeminiStreamChunk> {\r\n    const model = (request as any).model ?? 'gemini-2.5-pro'\r\n    const body = { ...request }\r\n    delete body.model\r\n\r\n    // OAuth \u2192 Code Assist (unwraps the `{ response: ... }` envelope).\r\n    const oauthRouting = this._tokenForModel(model)\r\n    if (oauthRouting) {\r\n      let reonboardsLeft = 1\r\n      let sigStripsLeft = 1\r\n      const urlsForExecutor = (executor: 'cli' | 'antigravity') =>\n        codeAssistGenerationBases(executor).map(base => `${base}:generateContent`)\n      const rotation = getAntigravityRotation()\r\n\r\n      const data = await retryWithBackoff(\r\n        async () => {\r\n          const routing = this._tokenForModel(model)\r\n          if (!routing) {\r\n            throw new GeminiApiError(0, 'No OAuth credentials available', undefined, {\r\n              kind: 'non-retryable',\r\n              details: {},\r\n            })\r\n          }\r\n          const { token, executor, accountEmail } = routing\r\n          const projectId = await ensureCodeAssistReady(token, executor)\r\n          const wrappedBody = executor === 'antigravity'\r\n            ? wrapForCodeAssist(model, projectId, body)\r\n            : wrapForGeminiCLI(model, projectId, body)\r\n          const headers = executor === 'antigravity'\r\n            ? {\r\n              ...antigravityApiHeaders(token),\r\n              ...antigravitySessionHeaders(wrappedBody as unknown as Record<string, unknown>),\r\n              'Accept': 'application/json',\r\n              'Connection': 'keep-alive',\r\n            }\r\n            : { ...geminiCLIApiHeaders(token, model), 'Connection': 'keep-alive' }\r\n          const serialized = JSON.stringify(wrappedBody)\r\n            .replace(/\"thoughtSignature\"\\s*:/g, '\"thought_signature\":')\r\n\r\n          let resp: Response | null = null\n          let errText = ''\n          const urls = urlsForExecutor(executor)\n          for (let i = 0; i < urls.length; i++) {\n            resp = await fetch(urls[i]!, {\n              method: 'POST',\n              headers,\n              body: serialized,\n              signal,\n            })\n            if (resp.ok) break\n            errText = await resp.text().catch(() => '')\n            if (!(executor === 'antigravity' && resp.status === 404 && i < urls.length - 1)) break\n          }\n          if (!resp) {\n            throw new GeminiApiError(0, 'No Code Assist endpoint attempted', undefined, {\n              kind: 'non-retryable',\n              details: {},\n            })\n          }\n          if (!resp.ok) {\n            const cls = classifyGeminiError(resp.status, errText)\n            const retryAfterMs = cls.retryAfterMs\r\n              ?? parseRetryAfter(resp.headers.get('retry-after'))\r\n\r\n            if (accountEmail && executor === 'antigravity') {\r\n              const account = rotation.list().find(a => a.email === accountEmail)\r\n              if (account) {\r\n                const family = familyForAntigravityModel(model)\r\n                if (cls.kind === 'retryable-quota' || cls.kind === 'terminal-quota') {\r\n                  rotation.recordRateLimit(account, family, retryAfterMs)\r\n                } else if (\r\n                  cls.kind === 'non-retryable'\r\n                  || cls.kind === 'validation-required'\r\n                  || cls.kind === 'auth-stale'\r\n                ) {\r\n                  // Auth-stale counts as a hard failure so subsequent\r\n                  // requests rotate to a different enrolled account. If\r\n                  // it was actually a transient cache issue, the retry\r\n                  // succeeds and the follow-up recordSuccess mixes the\r\n                  // score back up \u2014 no harm done.\r\n                  rotation.recordHardFailure(account)\r\n                }\r\n              }\r\n            }\r\n\r\n            if (cls.kind === 'auth-stale' && reonboardsLeft > 0) {\r\n              reonboardsLeft--\r\n              if (resp.status === 401) {\r\n                await this._refreshOAuthToken(executor, accountEmail)\r\n              } else {\r\n                clearCodeAssistCache(executor)\r\n                await this._refreshOAuthToken(executor, accountEmail)\r\n              }\r\n              throw new GeminiApiError(resp.status, errText, 0, {\r\n                kind: 'transient',\r\n                details: cls.details,\r\n                retryAfterMs: 0,\r\n              })\r\n            }\r\n\r\n            if (\r\n              resp.status === 400\r\n              && /corrupted thought signature/i.test(errText)\r\n              && sigStripsLeft > 0\r\n            ) {\r\n              sigStripsLeft--\r\n              this._stripThoughtSignaturesFromBody(body)\r\n              throw new GeminiApiError(resp.status, errText, 0, {\r\n                kind: 'transient',\r\n                details: cls.details,\r\n                retryAfterMs: 0,\r\n              })\r\n            }\r\n            throw new GeminiApiError(resp.status, errText, retryAfterMs, cls)\r\n          }\r\n\r\n          if (accountEmail && executor === 'antigravity') {\r\n            const account = rotation.list().find(a => a.email === accountEmail)\r\n            if (account) rotation.recordSuccess(account)\r\n          }\r\n\r\n          return resp.json()\r\n        },\r\n        { signal },\r\n      )\r\n      return unwrapCodeAssistResponse(data) as GeminiStreamChunk\r\n    }\r\n\r\n    // API-key path \u2014 generativelanguage.googleapis.com direct.\r\n    const url = `${AI_STUDIO_BASE}/models/${model}:generateContent`\r\n    const headers = this.getHeaders()\r\n\r\n    return retryWithBackoff(\r\n      async () => {\r\n        const resp = await fetch(url, {\r\n          method: 'POST',\r\n          headers: { ...headers, 'Content-Type': 'application/json' },\r\n          body: JSON.stringify(body),\r\n          signal,\r\n        })\r\n        if (!resp.ok) {\r\n          const errText = await resp.text().catch(() => '')\r\n          const cls = classifyGeminiError(resp.status, errText)\r\n          const retryAfterMs = cls.retryAfterMs\r\n            ?? parseRetryAfter(resp.headers.get('retry-after'))\r\n          throw new GeminiApiError(resp.status, errText, retryAfterMs, cls)\r\n        }\r\n        return resp.json()\r\n      },\r\n      { signal },\r\n    )\r\n  }\r\n\r\n  /**\r\n   * List available models. Returns a curated list for OAuth paths (Code\r\n   * Assist doesn't expose /v1beta/models and cloud-platform tokens are\r\n   * rejected as restricted_client), or the live API-key catalog otherwise.\r\n   */\r\n  async listModels(providerFilter?: string): Promise<ModelInfo[]> {\r\n    const listApiKeyModels = async (): Promise<ModelInfo[]> => {\r\n      if (!this.apiKey) return []\r\n\r\n      const url = `${AI_STUDIO_BASE}/models?key=${encodeURIComponent(this.apiKey)}`\r\n      const response = await fetch(url, {\r\n        method: 'GET',\r\n        headers: { Connection: 'keep-alive' },\r\n      })\r\n\r\n      if (!response.ok) return []\r\n\r\n      const data = await response.json()\r\n      return (data.models ?? [])\r\n        .filter((m: any) => m.name?.includes('gemini'))\r\n        .map((m: any) => ({\r\n          id: m.name?.replace('models/', '') ?? m.name,\r\n          name: m.displayName ?? m.name,\r\n          contextWindow: m.inputTokenLimit,\r\n          supportsToolCalling: m.supportedGenerationMethods?.includes('generateContent'),\r\n        }))\r\n    }\r\n\r\n    if (providerFilter === 'gemini' && !this.cliOAuthToken) {\r\n      return listApiKeyModels()\r\n    }\r\n\r\n    if (providerFilter === 'antigravity') {\n      if (!this.antigravityOAuthToken) return []\n      return [...ANTIGRAVITY_MODELS]\n    }\r\n\r\n    // `providerFilter` is how the UX split between the Gemini row and the\r\n    // Antigravity row lands here: both routes go through this same lane\r\n    // (Code Assist proxy), they differ only in which OAuth token + body\r\n    // envelope gets used. When the caller is the dedicated Antigravity\r\n    // provider we must return ONLY the pro/flash-3 ids (which the lane\r\n    // routes to cloudcode-pa with userAgent=antigravity); when the caller\r\n    // is plain Gemini we return ONLY the free-tier CLI models.\r\n    if (this.hasOAuth) {\r\n      const showCli = providerFilter !== 'antigravity'\r\n      const showAntigravity = providerFilter !== 'gemini'\r\n      const models: ModelInfo[] = []\r\n      if (showCli && this.cliOAuthToken) {\r\n        // The picker is often the FIRST thing the user opens after\r\n        // /login, before any chat request has triggered onboarding \u2014\r\n        // force the round-trip here so the entitled-ids / tier caches\r\n        // that resolveCliModelsForPicker reads are populated.\r\n        // Without this, a freshly-logged-in Pro user would see flash\r\n        // until the next session.\r\n        try {\r\n          await ensureCodeAssistReady(this.cliOAuthToken, 'cli')\r\n        } catch {\r\n          // Onboarding failed \u2014 the picker falls back to flash. The\r\n          // user will hit a clearer error next time they try to chat.\r\n        }\r\n        // Strict tier filter: free accounts see flash, paid accounts\r\n        // see Pro. No mixing \u2014 a free user with a Pro option in their\r\n        // picker would 403 on first chat, and a Pro user with flash\r\n        // mixed in would pick the slow option by accident.\r\n        models.push(...resolveCliModelsForPicker())\r\n      }\n      if (showAntigravity && this.antigravityOAuthToken) {\n        models.push(...ANTIGRAVITY_MODELS)\n      }\n      return models\r\n    }\r\n\r\n    const url = `${AI_STUDIO_BASE}/models`\r\n    const headers = this.getHeaders()\r\n\r\n    const response = await fetch(url, {\r\n      method: 'GET',\r\n      headers,\r\n    })\r\n\r\n    if (!response.ok) return []\r\n\r\n    const data = await response.json()\r\n    return (data.models ?? [])\r\n      .filter((m: any) => m.name?.includes('gemini'))\r\n      .map((m: any) => ({\r\n        id: m.name?.replace('models/', '') ?? m.name,\r\n        name: m.displayName ?? m.name,\r\n        contextWindow: m.inputTokenLimit,\r\n        supportsToolCalling: m.supportedGenerationMethods?.includes('generateContent'),\r\n      }))\r\n  }\r\n\r\n  private getHeaders(): Record<string, string> {\r\n    const headers: Record<string, string> = {\r\n      Connection: 'keep-alive',\r\n    }\r\n\r\n    if (this.apiKey) {\r\n      headers['x-goog-api-key'] = this.apiKey\r\n    }\r\n    // OAuth is never used on the direct AI Studio endpoint \u2014 it's routed\r\n    // through Code Assist above. This header path only runs on API-key\r\n    // listModels / cache calls.\r\n    return headers\r\n  }\r\n}\r\n\r\n// \u2500\u2500\u2500 Error Type \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport class GeminiApiError extends Error {\r\n  /**\r\n   * Google error-details classification. Set by the constructor (lazy) or\r\n   * passed explicitly when the caller already ran the classifier.\r\n   */\r\n  private _classified?: ClassifiedGeminiError\r\n\r\n  constructor(\r\n    public readonly status: number,\r\n    public readonly body: string,\r\n    public readonly retryAfterMs?: number,\r\n    classified?: ClassifiedGeminiError,\r\n  ) {\r\n    // Prompt-too-long errors must expose the Claude-Code signal prefix so\r\n    // query.ts reactive compact fires \u2014 the downstream check text-matches\r\n    // against PROMPT_TOO_LONG_ERROR_MESSAGE. The raw body is preserved in\r\n    // .body so callers can still inspect the upstream detail.\r\n    const cls = classified ?? classifyGeminiError(status, body)\r\n    const head = cls.kind === 'prompt-too-long'\r\n      ? `${PROMPT_TOO_LONG_ERROR_MESSAGE} (Gemini ${status})`\r\n      : `Gemini API error ${status}`\r\n    super(`${head}: ${body.slice(0, 200)}`)\r\n    this.name = 'GeminiApiError'\r\n    this._classified = cls\r\n  }\r\n\r\n  get classification(): ClassifiedGeminiError {\r\n    if (!this._classified) {\r\n      this._classified = classifyGeminiError(this.status, this.body)\r\n    }\r\n    return this._classified\r\n  }\r\n\r\n  get kind(): GeminiErrorKind {\r\n    return this.classification.kind\r\n  }\r\n\r\n  get isRateLimited(): boolean {\r\n    return this.status === 429\r\n  }\r\n\r\n  get isAuth(): boolean {\r\n    return this.status === 401 || this.status === 403\r\n  }\r\n\r\n  get isPromptTooLong(): boolean {\r\n    return this.classification.kind === 'prompt-too-long'\r\n  }\r\n\r\n  /**\r\n   * Whether the outer retryWithBackoff loop should back off and retry\r\n   * without operator intervention. Auth-stale and retryable-quota are\r\n   * retried HERE (via the fetch closure) with a bounded counter rather\r\n   * than through isRetryable, because they need side effects between\r\n   * attempts (cache clear / credential rotate).\r\n   */\r\n  get isRetryable(): boolean {\r\n    switch (this.kind) {\r\n      case 'transient':\r\n        return true\r\n      case 'retryable-quota':\r\n        // Rotation happens inline; backoff loop also retries so that a\r\n        // single-account setup still gets exponential wait.\r\n        return true\r\n      case 'prompt-too-long':\r\n      case 'validation-required':\r\n      case 'terminal-quota':\r\n      case 'non-retryable':\r\n        return false\r\n      case 'auth-stale':\r\n        // Handled by the reonboard counter inside the request closure,\r\n        // not by retryWithBackoff. Return false so we don't double-retry.\r\n        return false\r\n    }\r\n    // Fallback: legacy status-based heuristic.\r\n    if (this.status === 400) return false\r\n    return this.status === 429 || this.status === 499 || (this.status >= 500 && this.status < 600)\r\n  }\r\n}\r\n\r\n// \u2500\u2500\u2500 Retry / Backoff \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n//\r\n// Ported from gemini-cli packages/core/src/utils/retry.ts. Handles:\r\n//   - 429, 499, 5xx HTTP errors\r\n//   - Transient network errors (ECONNRESET, ETIMEDOUT, EPIPE, ENOTFOUND,\r\n//     EAI_AGAIN, ECONNREFUSED, EPROTO, SSL-alert errors)\r\n//   - Retry-After header (with +20% jitter to avoid thundering herd)\r\n//   - Exponential backoff with \u00B130% jitter for non-quota errors\r\n//   - AbortSignal propagation\r\n\r\nconst DEFAULT_MAX_ATTEMPTS = 5\r\nconst INITIAL_DELAY_MS = 2000\r\nconst MAX_DELAY_MS = 30_000\r\n\r\nconst RETRYABLE_NETWORK_CODES = new Set([\r\n  'ECONNRESET',\r\n  'ETIMEDOUT',\r\n  'EPIPE',\r\n  'ENOTFOUND',\r\n  'EAI_AGAIN',\r\n  'ECONNREFUSED',\r\n  'EPROTO',\r\n  'ERR_SSL_SSLV3_ALERT_BAD_RECORD_MAC',\r\n  'ERR_SSL_WRONG_VERSION_NUMBER',\r\n  'ERR_SSL_DECRYPTION_FAILED_OR_BAD_RECORD_MAC',\r\n  'ERR_SSL_BAD_RECORD_MAC',\r\n])\r\n\r\nfunction getNetworkErrorCode(error: unknown): string | undefined {\r\n  let current: unknown = error\r\n  for (let depth = 0; depth < 5; depth++) {\r\n    if (typeof current !== 'object' || current === null) return undefined\r\n    if ('code' in current && typeof (current as any).code === 'string') {\r\n      return (current as any).code\r\n    }\r\n    if (!('cause' in current)) return undefined\r\n    current = (current as any).cause\r\n  }\r\n  return undefined\r\n}\r\n\r\nfunction isRetryableTransport(error: unknown): boolean {\r\n  if (error instanceof GeminiApiError) return error.isRetryable\r\n  const code = getNetworkErrorCode(error)\r\n  if (code && RETRYABLE_NETWORK_CODES.has(code)) return true\r\n  if (error instanceof Error && error.message.toLowerCase().includes('fetch failed')) return true\r\n  return false\r\n}\r\n\r\nfunction parseRetryAfter(value: string | null): number | undefined {\r\n  if (!value) return undefined\r\n  // Retry-After is either seconds or an HTTP date.\r\n  const asSec = Number(value)\r\n  if (!isNaN(asSec)) return Math.max(0, asSec * 1000)\r\n  const asDate = Date.parse(value)\r\n  if (!isNaN(asDate)) return Math.max(0, asDate - Date.now())\r\n  return undefined\r\n}\r\n\r\nasync function retryWithBackoff<T>(\r\n  fn: () => Promise<T>,\r\n  opts: { signal?: AbortSignal } = {},\r\n): Promise<T> {\r\n  const { signal } = opts\r\n  if (signal?.aborted) throw new DOMException('Aborted', 'AbortError')\r\n\r\n  let attempt = 0\r\n  let currentDelay = INITIAL_DELAY_MS\r\n\r\n  while (attempt < DEFAULT_MAX_ATTEMPTS) {\r\n    attempt++\r\n    try {\r\n      return await fn()\r\n    } catch (err: any) {\r\n      if (err?.name === 'AbortError' || signal?.aborted) throw err\r\n\r\n      if (!isRetryableTransport(err) || attempt >= DEFAULT_MAX_ATTEMPTS) throw err\r\n\r\n      // Server-specified Retry-After wins if present.\r\n      const retryAfter = err instanceof GeminiApiError ? err.retryAfterMs : undefined\r\n      let waitMs: number\r\n      if (retryAfter != null && retryAfter > 0) {\r\n        const jitter = retryAfter * 0.2 * Math.random() // 0 to +20%\r\n        waitMs = retryAfter + jitter\r\n      } else {\r\n        const jitter = currentDelay * 0.3 * (Math.random() * 2 - 1) // \u00B130%\r\n        waitMs = Math.max(0, currentDelay + jitter)\r\n      }\r\n\r\n      await delayWithAbort(waitMs, signal)\r\n      currentDelay = Math.min(MAX_DELAY_MS, currentDelay * 2)\r\n    }\r\n  }\r\n\r\n  throw new Error('Retry attempts exhausted')\r\n}\r\n\r\nfunction delayWithAbort(ms: number, signal?: AbortSignal): Promise<void> {\r\n  return new Promise((resolve, reject) => {\r\n    if (signal?.aborted) return reject(new DOMException('Aborted', 'AbortError'))\r\n    const t = setTimeout(() => {\r\n      signal?.removeEventListener('abort', onAbort)\r\n      resolve()\r\n    }, ms)\r\n    const onAbort = (): void => {\r\n      clearTimeout(t)\r\n      reject(new DOMException('Aborted', 'AbortError'))\r\n    }\r\n    signal?.addEventListener('abort', onAbort, { once: true })\r\n  })\r\n}\r\n\r\n// \u2500\u2500\u2500 Singleton \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport const geminiApi = new GeminiApiClient()\r\n", "/**\r\n * Shared MCP bridge.\r\n *\r\n * MCP servers expose tools via JSON-Schema 2020-12. Each lane's provider\r\n * accepts a *subset* of that schema vocabulary \u2014 requesting unsupported\r\n * keywords trips 400s at varying points in the pipeline, quietly breaks\r\n * tool-calling on some models, or produces tools the model can't actually\r\n * invoke because the schema shape is foreign.\r\n *\r\n * This module is the single place where we normalize MCP tool schemas\r\n * into each lane's accepted subset. Adding a new lane = add one row to\r\n * the strip-list map.\r\n *\r\n * Reference behaviors:\r\n *   - gemini-cli's mcp-tool.ts sanitizer (Gemini subset)\r\n *   - codex-rs/codex-mcp/src/mcp_tool_names.rs (Responses API subset)\r\n *   - litellm/groq + claude-code-router/groq transformers (Groq subset)\r\n *   - OpenAI strict-mode tool-schema restrictions\r\n */\r\n\r\nimport type { ProviderTool } from '../../services/api/providers/base_provider.js'\r\n\r\nexport type LaneSchemaProfile =\r\n  | 'gemini'\r\n  | 'codex'\r\n  | 'kiro'\r\n  | 'anthropic'\r\n  | 'openai-strict'\r\n  | 'openai-loose'\r\n  | 'glm'\r\n  | 'groq'\r\n  | 'mistral'\r\n  | 'ollama'\r\n  | 'qwen'\r\n  | 'deepseek'\r\n  | 'openrouter'\r\n  | 'nim'\r\n  | 'generic'\r\n\r\n// Keywords each lane rejects on tool parameter schemas. Drop-lists based\r\n// on field research: what the provider either 400s on or silently ignores\r\n// in a way that breaks schema matching downstream.\r\n//\r\n// NOTE on Gemini: the full Gemini pipeline is more than a drop list \u2014\r\n// composition keywords (anyOf/oneOf/allOf, type arrays) must be\r\n// FLATTENED before stripping, empty `required: []` must be removed, and\r\n// the drop list has to be comprehensive enough to cover the full\r\n// OpenAPI 3.0 subset Gemini accepts (type, format, description,\r\n// nullable, enum, items, properties, required, minimum, maximum,\r\n// minItems, maxItems, minLength, maxLength). The `gemini` profile\r\n// below lists the DROPs used by the drop-list walk, but lanes should\r\n// call `sanitizeSchemaForLane(..., 'gemini')` which internally routes\r\n// through `sanitizeSchemaForGeminiDeep` to also do flattening. See that\r\n// function below.\r\nconst DROP_BY_PROFILE: Record<LaneSchemaProfile, Set<string>> = {\r\n  // Gemini: minimal JSON-Schema subset. Uppercase type enum enforced elsewhere.\r\n  // Covers everything the legacy `anthropic_to_gemini:sanitizeSchemaForGemini`\r\n  // drop list handled, so MCP tools with arbitrary JSON Schema don't 400.\r\n  gemini: new Set([\r\n    // JSON Schema identifiers & references\r\n    '$schema', '$id', '$ref', '$comment', '$defs', 'definitions',\r\n    // Composition keywords Gemini can't express (also handled by flatten)\r\n    'not', 'if', 'then', 'else',\r\n    // Object validation beyond properties/required\r\n    'additionalProperties', 'patternProperties', 'propertyNames',\r\n    'minProperties', 'maxProperties', 'unevaluatedProperties',\r\n    'dependentRequired', 'dependentSchemas', 'strict',\r\n    // Number validation beyond min/max\r\n    'exclusiveMinimum', 'exclusiveMaximum', 'multipleOf',\r\n    // String validation (pattern is regex \u2014 Gemini doesn't accept it)\r\n    'pattern', 'contentMediaType', 'contentEncoding',\r\n    // Array validation beyond items/min/max\r\n    'unevaluatedItems', 'prefixItems', 'contains', 'minContains', 'maxContains',\r\n    // Metadata / validation fields Gemini rejects\r\n    'default', 'const', 'examples', 'deprecated', 'readOnly', 'writeOnly', 'title',\r\n  ]),\r\n  // Kiro / CodeWhisperer accepts JSON-schema-ish tool params but is picky\r\n  // about meta keywords and strict-mode helpers that leak in from other lanes.\r\n  // `additionalProperties` triggers \"Improperly formed request\" 400s on the\r\n  // CodeWhisperer API \u2014 per the kiro-gateway reference implementation\r\n  // (converters_core.sanitize_json_schema). Empty `required: []` arrays are\r\n  // also rejected; those are handled conditionally in sanitizeSchemaForLane.\r\n  kiro: new Set([\r\n    '$schema', '$id', '$ref', '$comment',\r\n    'strict', 'default', 'examples',\r\n    'additionalProperties',\r\n  ]),\r\n  // Codex Responses API: accepts most JSON-Schema but rejects $schema/$id.\r\n  codex: new Set(['$schema', '$id', '$ref', '$comment']),\r\n  // Anthropic: passes most keywords through; strip a handful that confuse\r\n  // the server validator in rare edge cases.\r\n  anthropic: new Set(['$schema', '$id', '$ref', '$comment']),\r\n  // OpenAI strict mode rejects additionalProperties=false+extra metadata.\r\n  'openai-strict': new Set(['$schema', '$id', '$ref', '$comment', 'default']),\r\n  'openai-loose': new Set(['$schema', '$id', '$ref', '$comment']),\r\n  glm: new Set(['$schema', '$id', '$ref', '$comment', 'strict', 'format', 'default']),\r\n  // Groq: actively fails on $schema in tool params; also strips strict.\r\n  groq: new Set(['$schema', '$id', '$ref', '$comment', 'strict', 'additionalProperties']),\r\n  // Mistral: grammar validator chokes on several keywords.\r\n  mistral: new Set([\r\n    '$schema', '$id', '$ref', '$comment', 'strict', 'additionalProperties',\r\n    'format', 'examples', 'default',\r\n  ]),\r\n  ollama: new Set(['$schema', '$id', '$ref', '$comment', 'strict', 'additionalProperties']),\r\n  qwen: new Set(['$schema', '$id', '$ref', '$comment', 'strict', 'additionalProperties']),\r\n  deepseek: new Set(['$schema', '$id', '$ref', '$comment']),\r\n  openrouter: new Set(['$schema', '$id', '$ref', '$comment']),\r\n  nim: new Set(['$schema', '$id', '$ref', '$comment']),\r\n  generic: new Set(['$schema', '$id', '$ref', '$comment', 'strict']),\r\n}\r\n\r\n/**\r\n * Sanitize a JSON Schema for the target lane. Returns a fresh object \u2014\r\n * never mutates the input. Safe to call on MCP schemas before forwarding.\r\n *\r\n * For the `gemini` profile this routes through `sanitizeSchemaForGeminiDeep`\r\n * which additionally flattens composition keywords (anyOf/oneOf/allOf),\r\n * handles type arrays like `[\"string\",\"null\"]`, removes empty `required`\r\n * arrays, and recurses into properties/items. Drop-list walk alone is\r\n * insufficient because Gemini 400s on `const`, `anyOf`, etc. even when\r\n * the fields are nested deep inside a property schema.\r\n */\r\nexport function sanitizeSchemaForLane(\r\n  schema: unknown,\r\n  profile: LaneSchemaProfile,\r\n): Record<string, unknown> {\r\n  if (profile === 'gemini') {\r\n    return sanitizeSchemaForGeminiDeep(schema)\r\n  }\r\n  const drop = DROP_BY_PROFILE[profile]\r\n  // Kiro 400s on empty required arrays at any nesting level.\r\n  const dropEmptyRequired = profile === 'kiro'\r\n  function walk(v: unknown): unknown {\r\n    if (Array.isArray(v)) return v.map(walk)\r\n    if (v && typeof v === 'object') {\r\n      const out: Record<string, unknown> = {}\r\n      for (const [k, value] of Object.entries(v as Record<string, unknown>)) {\r\n        if (drop.has(k)) continue\r\n        // OpenAPI 3.0 vendor extensions (x-google-enum-descriptions, x-stripe-*,\r\n        // x-aws-*, \u2026) leak in from MCP tool schemas. Strict validators on\r\n        // Gemini/Mistral/OpenAI-strict 400 on unknown fields, so strip the\r\n        // whole x-* family for every non-gemini profile too.\r\n        if (k.startsWith('x-')) continue\r\n        if (\r\n          dropEmptyRequired &&\r\n          k === 'required' &&\r\n          Array.isArray(value) &&\r\n          value.length === 0\r\n        ) continue\r\n        out[k] = walk(value)\r\n      }\r\n      return out\r\n    }\r\n    return v\r\n  }\r\n  const result = walk(schema)\r\n  if (!result || typeof result !== 'object' || Array.isArray(result)) {\r\n    return { type: 'object', properties: {} }\r\n  }\r\n  return result as Record<string, unknown>\r\n}\r\n\r\n// \u2500\u2500\u2500 Gemini deep sanitizer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n//\r\n// Gemini's tool-param schema follows OpenAPI 3.0 \u2014 a narrower subset\r\n// of JSON Schema than most MCP servers emit. The drop-list walk alone\r\n// misses: composition keywords that must be flattened, type arrays\r\n// that must collapse to `type + nullable`, and empty `required: []`\r\n// arrays that Gemini rejects.\r\n//\r\n// Ported from the legacy adapter at\r\n// `src/services/api/adapters/anthropic_to_gemini.ts:sanitizeSchemaForGemini`\r\n// which is battle-tested against real MCP tool schemas.\r\n\r\n/**\r\n * Flatten JSON Schema composition keywords Gemini cannot express:\r\n *   - type arrays like [\"string\", \"null\"]  \u2192  type: \"string\", nullable: true\r\n *   - anyOf / oneOf with a null branch     \u2192  non-null branch + nullable\r\n *   - anyOf / oneOf without null           \u2192  first branch\r\n *   - allOf                                 \u2192  shallow-merge all branches\r\n * Runs BEFORE the drop-list strip so downstream walk cleans normally.\r\n */\r\nfunction flattenComposition(schema: Record<string, unknown>): Record<string, unknown> {\r\n  const result = { ...schema }\r\n\r\n  if (Array.isArray(result.type)) {\r\n    const types = result.type as string[]\r\n    const nonNull = types.filter(t => t !== 'null')\r\n    if (types.includes('null')) result.nullable = true\r\n    result.type = nonNull.length === 1 ? nonNull[0] : nonNull[0] ?? 'string'\r\n  }\r\n\r\n  for (const keyword of ['anyOf', 'oneOf'] as const) {\r\n    const variants = result[keyword] as Record<string, unknown>[] | undefined\r\n    if (!Array.isArray(variants) || variants.length === 0) continue\r\n\r\n    const nonNull = variants.filter(v => v && v.type !== 'null')\r\n    const hasNull = variants.some(v => v && v.type === 'null')\r\n    const picked = nonNull[0] ?? variants[0]!\r\n\r\n    delete result[keyword]\r\n    if (hasNull) result.nullable = true\r\n    for (const [k, v] of Object.entries(picked)) {\r\n      if (v !== undefined && !(k in result && k !== keyword)) {\r\n        result[k] = v\r\n      }\r\n    }\r\n  }\r\n\r\n  if (Array.isArray(result.allOf)) {\r\n    const branches = result.allOf as Record<string, unknown>[]\r\n    delete result.allOf\r\n    for (const branch of branches) {\r\n      if (!branch) continue\r\n      for (const [k, v] of Object.entries(branch)) {\r\n        if (v === undefined) continue\r\n        if (k === 'properties' && result.properties) {\r\n          result.properties = {\r\n            ...(result.properties as Record<string, unknown>),\r\n            ...(v as Record<string, unknown>),\r\n          }\r\n        } else if (k === 'required' && result.required) {\r\n          result.required = [\r\n            ...new Set([\r\n              ...(result.required as string[]),\r\n              ...(v as string[]),\r\n            ]),\r\n          ]\r\n        } else if (!(k in result)) {\r\n          result[k] = v\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  return result\r\n}\r\n\r\n// \u2500\u2500\u2500 Gemini tool-description hardening \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n//\r\n// Even with a correct schema, Flash-class models occasionally emit\r\n// tool calls with empty args (`{}`) \u2014 ignoring the `required[]` list.\r\n// The legacy adapter mitigated this with two in-prompt reminders that\r\n// we carry into the native lane:\r\n//\r\n//   1. A compact \"STRICT PARAMETERS: a: string REQUIRED, b: number ...\"\r\n//      summary appended to each tool's description \u2014 tells the model\r\n//      in plain text which fields are mandatory + their types.\r\n//   2. A <TOOL_USAGE_RULES> system-instruction preamble reminding the\r\n//      model that tool schemas override training-data memory.\r\n//\r\n// These are belt-and-suspenders with Gemini's server-side\r\n// `toolConfig.functionCallingConfig.mode: \"VALIDATED\"` which Gemini\r\n// enforces at response time (see lane request builder).\r\n\r\n/**\r\n * Per-lane tool-usage preamble. Prepended to the system prompt (or\r\n * Codex `instructions`) whenever tools are present on a request.\r\n *\r\n * These exist because Flash/Qwen/Llama-class models regularly emit\r\n * tool calls with empty `{}` args, ignoring the schema. Server-side\r\n * schema enforcement (VALIDATED for Gemini, `strict: true` for OpenAI-\r\n * family tools) is the primary defense; the preamble is belt-and-\r\n * suspenders, tuned to each lane's native prompt tone so the cache key\r\n * stays stable and the addition feels native rather than bolted-on.\r\n *\r\n * Keep each preamble SHORT \u2014 every byte lands on every turn.\r\n */\r\nexport const GEMINI_TOOL_USAGE_RULES = `<TOOL_USAGE_RULES>\r\nTool schemas in this environment OVERRIDE your training-data memory of tool names.\r\nTreat each tool's \"parameters\" field as authoritative:\r\n- Use parameter NAMES exactly as listed in \"properties\" (case-sensitive).\r\n- Supply EVERY parameter listed in \"required\" \u2014 never omit one, never send empty objects.\r\n- Match parameter TYPES exactly (array means array, object means object, string means string).\r\n- Do not invent extra parameters that are not in \"properties\".\r\nThe \"STRICT PARAMETERS:\" hint at the end of each tool description is your quick reference.\r\n\r\nWhen a tool call fails, diagnose the cause \u2014 read the exit code/error text, verify what actually exists (binaries, paths, shell). Don't iterate cosmetic variants of the same call; blind retries waste input tokens. After two same-cause failures, stop and investigate. For unfamiliar CLIs, run \\`--help\\` once before invoking.\r\n</TOOL_USAGE_RULES>\r\n`\r\n\r\n/**\r\n * Codex tool-usage rules. Matches Codex's concise native tone from the\r\n * captured system prompt \u2014 \"tool calls are structured, follow schema\r\n * exactly, apply_patch is the edit primitive.\"\r\n */\r\nexport const CODEX_TOOL_USAGE_RULES = `<tool_use_rules>\r\nTool parameter schemas are authoritative. Never call a tool with missing required fields, never send empty arguments, never invent extra parameters. Parameter names are case-sensitive \u2014 copy them exactly from \"properties\". Match parameter types exactly (array means array, object means object, string means string).\r\n\r\nEach tool description ends with a \"STRICT PARAMETERS:\" line listing required fields first. Use it as your quick reference before you emit the call.\r\n\r\nFor file edits, apply_patch is the primary edit primitive \u2014 use it for all in-place modifications. Use write_file only for brand-new files.\r\n\r\nWhen a shell or tool call fails, diagnose first: exit code, error text, binary/path/shell. Make ONE focused fix; don't iterate cosmetic variants (swap shells, retry same path, tweak flags). Blind retries waste input tokens \u2014 if two attempts fail the same way, stop and investigate. For unfamiliar CLIs, check \\`--help\\` once before invoking.\r\n</tool_use_rules>\r\n`\r\n\r\n/**\r\n * Kiro / CodeWhisperer tool-usage rules. Keep this short: Kiro doesn't have\r\n * server-side strict tool validation like Gemini VALIDATED mode, so the\r\n * prompt reminder does more of the enforcement work.\r\n */\r\nexport const KIRO_TOOL_USAGE_RULES = `<tool_usage_rules>\r\nTool schemas are authoritative. For every tool call:\r\n- include every field listed in \"required\"\r\n- use parameter names exactly as declared in \"properties\"\r\n- match parameter types exactly\r\n- do not send empty {} when fields are required\r\n- if a tool description points to full documentation in the system prompt, read that section before calling the tool\r\n\r\nThe \"STRICT PARAMETERS:\" line in each tool description is the quick reference.\r\n\r\nWhen a tool call fails, diagnose first \u2014 exit code, error text, what's actually available. Don't iterate cosmetic variants of the same call; blind retries waste input tokens. After two same-cause failures, stop and investigate. For unfamiliar CLIs, check \\`--help\\` before invoking.\r\n</tool_usage_rules>\r\n`\r\n\r\n/**\r\n * Qwen tool-usage rules. Qwen3-Coder was the primary benchmark Qwen\r\n * shipped with \u2014 its post-training is especially strict about matching\r\n * schema field names. Extra nudge on case-sensitivity + required fields.\r\n */\r\nexport const QWEN_TOOL_USAGE_RULES = `<tool_usage>\r\nTool schemas are authoritative \u2014 they override anything you remember from training data about tool names or shapes.\r\n\r\nRules for every tool call:\r\n- Include every parameter listed in \"required\". Never send {} when fields are required.\r\n- Use parameter names EXACTLY as listed in \"properties\" (names are case-sensitive).\r\n- Match parameter types exactly \u2014 if the schema says \"array\", send an array, not a string.\r\n- Do not add parameters that aren't declared in \"properties\".\r\n\r\nThe \"STRICT PARAMETERS:\" line at the end of each description is the quick reference. Re-read it before each call.\r\n\r\nWhen a command fails, diagnose first \u2014 read the exit code (127=not found, 2=misuse) and error text, verify what exists. Don't retry the same call with cosmetic tweaks; blind retries burn input tokens. After two same-cause failures, stop and investigate. For unfamiliar CLIs, run \\`--help\\` once instead of guessing flags.\r\n</tool_usage>\r\n`\r\n\r\n/**\r\n * OpenAI-compatible lane rules. Covers DeepSeek, GLM, Groq, Mistral, NIM,\r\n * Ollama, OpenRouter + long tail. Kept general because the same text\r\n * ships to every provider.\r\n */\r\nexport const OPENAI_COMPAT_TOOL_USAGE_RULES = `<tool_usage_rules>\r\nTool parameter schemas are authoritative. Before every tool call:\r\n- Fill in every parameter listed in \"required\". Never send empty {} when the schema requires fields.\r\n- Use parameter names exactly as they appear in \"properties\" (case-sensitive).\r\n- Match parameter types exactly (array means array, object means object, string means string).\r\n- Don't invent parameters that aren't declared.\r\n\r\nThe \"STRICT PARAMETERS:\" line appended to each tool description summarizes required-vs-optional + types for quick reference.\r\n\r\nWhen a tool call fails, diagnose first (exit code, error text, what actually exists) before retrying. Don't iterate cosmetic variants of the same call; blind retries burn input tokens. After two same-cause failures, stop and investigate. For unfamiliar CLIs/APIs, check \\`--help\\` once before invoking \u2014 don't guess flags.\r\n</tool_usage_rules>\r\n`\r\n\r\n/**\r\n * Walk a parameter schema and emit a compact human-readable summary of\r\n * its properties + required flags. Used in tool descriptions.\r\n */\r\nexport function buildStrictParamsSummary(parameters: Record<string, unknown>): string {\r\n  const typeStr = normalizeSchemaTypeForSummary(parameters.type)\r\n  const properties = parameters.properties as Record<string, unknown> | undefined\r\n  const required = Array.isArray(parameters.required)\r\n    ? (parameters.required as unknown[]).filter((v): v is string => typeof v === 'string')\r\n    : []\r\n\r\n  if (typeStr !== 'object' || !properties) {\r\n    return '(schema missing top-level object properties)'\r\n  }\r\n\r\n  const keys = Object.keys(properties)\r\n  const requiredKeys = keys.filter(k => required.includes(k))\r\n  const optionalKeys = keys.filter(k => !required.includes(k))\r\n  const ordered = [...requiredKeys.sort(), ...optionalKeys.sort()]\r\n\r\n  const summary = ordered\r\n    .map(k => {\r\n      const sub = summarizeSchemaNode(properties[k], 2)\r\n      return `${k}: ${sub}${required.includes(k) ? ' REQUIRED' : ''}`\r\n    })\r\n    .join(', ')\r\n\r\n  const max = 900\r\n  return summary.length > max ? `${summary.slice(0, max)}\u2026` : summary\r\n}\r\n\r\nfunction normalizeSchemaTypeForSummary(value: unknown): string | undefined {\r\n  if (typeof value === 'string') return value\r\n  if (Array.isArray(value)) {\r\n    const nonNull = value.filter(t => t !== 'null')\r\n    const first = nonNull[0] ?? value[0]\r\n    if (typeof first === 'string') return first\r\n  }\r\n  return undefined\r\n}\r\n\r\nfunction summarizeSchemaNode(schema: unknown, depth: number): string {\r\n  if (!schema || typeof schema !== 'object') return 'unknown'\r\n  const record = schema as Record<string, unknown>\r\n  const typeStr = normalizeSchemaTypeForSummary(record.type)\r\n  const enumValues = Array.isArray(record.enum) ? (record.enum as unknown[]) : undefined\r\n\r\n  if (typeStr === 'array') {\r\n    const itemSummary = depth > 0 ? summarizeSchemaNode(record.items, depth - 1) : 'unknown'\r\n    return `array[${itemSummary}]`\r\n  }\r\n  if (typeStr === 'object') {\r\n    const props = record.properties as Record<string, unknown> | undefined\r\n    const required = Array.isArray(record.required)\r\n      ? (record.required as unknown[]).filter((v): v is string => typeof v === 'string')\r\n      : []\r\n    if (!props || depth <= 0) return 'object'\r\n    const keys = Object.keys(props)\r\n    const requiredKeys = keys.filter(k => required.includes(k))\r\n    const optionalKeys = keys.filter(k => !required.includes(k))\r\n    const ordered = [...requiredKeys.sort(), ...optionalKeys.sort()]\r\n    const max = 8\r\n    const shown = ordered.slice(0, max)\r\n    const inner = shown\r\n      .map(k => {\r\n        const sub = summarizeSchemaNode(props[k], depth - 1)\r\n        return `${k}: ${sub}${required.includes(k) ? ' REQUIRED' : ''}`\r\n      })\r\n      .join(', ')\r\n    const extra = ordered.length - shown.length\r\n    const more = extra > 0 ? `, \u2026+${extra}` : ''\r\n    return `{${inner}${more}}`\r\n  }\r\n  if (enumValues && enumValues.length > 0) {\r\n    const preview = enumValues.slice(0, 6).map(String).join('|')\r\n    const suffix = enumValues.length > 6 ? '|\u2026' : ''\r\n    return `${typeStr ?? 'unknown'} enum(${preview}${suffix})`\r\n  }\r\n  return typeStr ?? 'unknown'\r\n}\r\n\r\n/**\r\n * Append the STRICT PARAMETERS summary to a tool description, idempotently.\r\n * Call this on every Gemini function declaration.\r\n */\r\nexport function appendStrictParamsHint(\r\n  description: string | undefined,\r\n  parameters: Record<string, unknown>,\r\n): string {\r\n  const base = (description ?? '').trim()\r\n  if (base.includes('STRICT PARAMETERS:')) return description ?? ''\r\n  const summary = buildStrictParamsSummary(parameters)\r\n  return base.length > 0\r\n    ? `${base}\\n\\nSTRICT PARAMETERS: ${summary}`\r\n    : `STRICT PARAMETERS: ${summary}`\r\n}\r\n\r\nfunction sanitizeSchemaForGeminiDeep(schema: unknown): Record<string, unknown> {\r\n  if (!schema || typeof schema !== 'object' || Array.isArray(schema)) {\r\n    return { type: 'object', properties: {} }\r\n  }\r\n\r\n  const flattened = flattenComposition(schema as Record<string, unknown>)\r\n  const drop = DROP_BY_PROFILE.gemini\r\n  const result: Record<string, unknown> = {}\r\n\r\n  for (const [key, value] of Object.entries(flattened)) {\r\n    if (drop.has(key)) continue\r\n    // OpenAPI 3.0 vendor extensions (x-google-enum-descriptions, x-google-quota,\r\n    // x-stripe-*, \u2026) leak in from MCP tool schemas. Gemini's validator 400s on\r\n    // unknown fields, so strip the whole x-* family.\r\n    if (key.startsWith('x-')) continue\r\n    if (value === undefined) continue\r\n\r\n    if (key === 'properties' && value && typeof value === 'object' && !Array.isArray(value)) {\r\n      result[key] = Object.fromEntries(\r\n        Object.entries(value as Record<string, unknown>)\r\n          .filter(([, v]) => v !== undefined)\r\n          .map(([propName, propSchema]) => [\r\n            propName,\r\n            propSchema && typeof propSchema === 'object' && !Array.isArray(propSchema)\r\n              ? sanitizeSchemaForGeminiDeep(propSchema)\r\n              : propSchema,\r\n          ]),\r\n      )\r\n    } else if (key === 'items' && value && typeof value === 'object' && !Array.isArray(value)) {\r\n      result[key] = sanitizeSchemaForGeminiDeep(value)\r\n    } else if (key === 'required' && Array.isArray(value)) {\r\n      // Gemini rejects empty required arrays \u2014 only include if non-empty.\r\n      if (value.length > 0) result[key] = value\r\n    } else if (Array.isArray(value)) {\r\n      result[key] = value.map(item =>\r\n        item && typeof item === 'object' && !Array.isArray(item)\r\n          ? sanitizeSchemaForGeminiDeep(item)\r\n          : item,\r\n      )\r\n    } else if (value && typeof value === 'object' && !Array.isArray(value)) {\r\n      result[key] = sanitizeSchemaForGeminiDeep(value)\r\n    } else {\r\n      result[key] = value\r\n    }\r\n  }\r\n\r\n  return result\r\n}\r\n\r\n/**\r\n * Normalize a MCP ProviderTool for a given lane. Returns a tool shape\r\n * compatible with that lane's tool registration format.\r\n *\r\n *   Gemini:  { name, description, parameters }\r\n *   Codex:   { type: 'function', name, description, parameters }\r\n *   Anthropic / compat: { name, description, input_schema }\r\n */\r\nexport function buildLaneTool(\r\n  tool: ProviderTool,\r\n  profile: LaneSchemaProfile,\r\n): Record<string, unknown> {\r\n  const cleanedSchema = sanitizeSchemaForLane(tool.input_schema ?? { type: 'object', properties: {} }, profile)\r\n\r\n  switch (profile) {\r\n    case 'gemini':\r\n      return {\r\n        name: tool.name,\r\n        description: tool.description ?? '',\r\n        parameters: cleanedSchema,\r\n      }\r\n    case 'codex':\r\n      return {\r\n        type: 'function',\r\n        name: tool.name,\r\n        description: tool.description ?? '',\r\n        parameters: cleanedSchema,\r\n      }\r\n    default:\r\n      // OpenAI Chat Completions + Anthropic Messages shape.\r\n      return {\r\n        type: 'function',\r\n        function: {\r\n          name: tool.name,\r\n          description: tool.description ?? '',\r\n          parameters: cleanedSchema,\r\n        },\r\n      }\r\n  }\r\n}\r\n\r\n/**\r\n * MCP tool namespacing. Codex Rust uses `mcp_<server>_<tool>`;\r\n * gemini-cli uses the same. Keep the convention uniform across lanes\r\n * so a single dispatch map works regardless of which lane invokes.\r\n */\r\nexport const MCP_TOOL_PREFIX = 'mcp_'\r\n\r\nexport function isMcpToolName(name: string): boolean {\r\n  return name.startsWith(MCP_TOOL_PREFIX)\r\n}\r\n\r\nexport interface ParsedMcpToolName {\r\n  server: string\r\n  tool: string\r\n}\r\n\r\nexport function parseMcpToolName(name: string): ParsedMcpToolName | null {\r\n  if (!isMcpToolName(name)) return null\r\n  const body = name.slice(MCP_TOOL_PREFIX.length)\r\n  const idx = body.indexOf('_')\r\n  if (idx <= 0) return null\r\n  return { server: body.slice(0, idx), tool: body.slice(idx + 1) }\r\n}\r\n\r\nexport function buildMcpToolName(server: string, tool: string): string {\r\n  return `${MCP_TOOL_PREFIX}${server}_${tool}`\r\n}\r\n", "/**\r\n * Gemini Lane \u2014 Native Agent Loop + Provider-Shim Entry\r\n *\r\n * Two entry points:\r\n *\r\n *   1. streamAsProvider(params) \u2014 single-turn, provider-shim-compatible.\r\n *      Used by src/lanes/provider-bridge.ts. claude.ts owns the outer\r\n *      turn-orchestration loop; the lane handles one native API call\r\n *      per invocation.\r\n *\r\n *   2. run(context) \u2014 future lane-owns-loop mode. Not currently wired;\r\n *      scaffold preserved for the Phase-2 migration where each lane owns\r\n *      its full agent loop (per the architecture plan).\r\n *\r\n * Both paths speak Gemini's native REST API directly:\r\n *   - POST /v1beta/models/{model}:streamGenerateContent?alt=sse\r\n *   - Native functionDeclarations, not Anthropic tools schema\r\n *   - Native thinkingConfig with thinkingBudget: -1 (dynamic)\r\n *   - Native safetySettings (all OFF)\r\n *   - Native cache (cachedContent field when available)\r\n *\r\n * References:\r\n *   - google-gemini/gemini-cli packages/core/src/core/geminiChat.ts\r\n *   - google-gemini/gemini-cli packages/core/src/agent/event-translator.ts\r\n */\r\n\r\nimport { randomUUID } from 'crypto'\r\nimport type {\r\n  AnthropicStreamEvent,\r\n} from '../../services/api/providers/base_provider.js'\r\nimport type {\r\n  Lane,\r\n  LaneRunContext,\r\n  LaneRunResult,\r\n  LaneProviderCallParams,\r\n  NormalizedUsage,\r\n} from '../types.js'\r\nimport type { ModelInfo } from '../../services/api/providers/base_provider.js'\r\nimport {\r\n  getRegistrationByNativeName,\r\n  buildGeminiFunctionDeclarations,\r\n  GEMINI_TOOL_REGISTRY,\r\n} from './tools.js'\r\nimport { geminiApi } from './api.js'\nimport { getOrCreateCacheWithUsage, invalidateCache } from '../../services/api/providers/gemini_cache.js'\nimport {\n  ANTIGRAVITY_MODEL_IDS,\n  resolveAntigravityWireModel,\n} from '../../services/api/providers/gemini_code_assist.js'\nimport {\n  sanitizeSchemaForLane,\r\n  appendStrictParamsHint,\r\n  GEMINI_TOOL_USAGE_RULES,\r\n} from '../shared/mcp_bridge.js'\r\n\r\n// \u2500\u2500\u2500 Constants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nconst MAX_TURNS = 100\r\n\r\nfunction uncachedInputTokens(promptTokens: number, cacheReadTokens: number): number {\r\n  return Math.max(0, promptTokens - cacheReadTokens)\r\n}\r\n\r\n// \u2500\u2500\u2500 Gemini Native Message Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\ninterface GeminiContent {\r\n  role: 'user' | 'model'\r\n  parts: GeminiPart[]\r\n}\r\n\r\ntype GeminiPart =\r\n  | { text: string }\r\n  | { functionCall: { id?: string; name: string; args: Record<string, unknown> }; thoughtSignature?: string }\r\n  | { functionResponse: { id?: string; name: string; response: { content: string } } }\r\n  | { thought: boolean; text: string }\r\n  | { inlineData: { mimeType: string; data: string } }\r\n\r\n// \u2500\u2500\u2500 The Lane Implementation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport class GeminiLane implements Lane {\r\n  readonly name = 'gemini'\r\n  readonly displayName = 'Google Gemini (Native)'\r\n\r\n  private _healthy = true\r\n\r\n  supportsModel(model: string): boolean {\r\n    const m = model.toLowerCase()\r\n    return m.startsWith('gemini-') || m.startsWith('gemma-')\r\n  }\r\n\r\n  // \u2500\u2500 Provider-shim-compatible single-turn entry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n  async *streamAsProvider(\r\n    params: LaneProviderCallParams,\r\n  ): AsyncGenerator<AnthropicStreamEvent, NormalizedUsage> {\r\n    const { model, messages, system, tools, max_tokens, thinking, signal } = params\r\n\r\n    // Normalize system \u2192 plain string.\r\n    const systemText =\r\n      typeof system === 'string'\r\n        ? system\r\n        : (system ?? []).map(b => b.text).join('\\n\\n')\r\n\r\n    // Cache discipline: split stable (cache-eligible) from volatile\r\n    // (per-turn) sections at the Tau `__SYSTEM_PROMPT_DYNAMIC_BOUNDARY__`\r\n    // marker. Everything before the marker is stable prefix (tools list,\r\n    // agent persona, instructions); everything after is volatile\r\n    // (git status, env, memory) and must live INSIDE the conversation\r\n    // as a leading user message \u2014 not in systemInstruction when we're\r\n    // using cachedContents \u2014 so the cache key stays byte-identical\r\n    // across turns. If the caller passed flat text without the marker,\r\n    // we fall back to treating the whole thing as stable (no regression).\r\n    const { stableText, volatileText } = splitSystemAtBoundary(systemText)\r\n\r\n    // Build id\u2192native-name map across the whole conversation so\r\n    // tool_result blocks can find their original Gemini function name.\r\n    const toolUseIdToNative = buildToolUseIdToNativeMap(messages)\r\n\r\n    // Convert Anthropic-format messages \u2192 Gemini native contents.\r\n    // If we have volatile content, inject it as a leading user message\r\n    // (this is the correct slot per Google's `cachedContents` design:\r\n    // the cache key hashes only the stable systemInstruction+tools,\r\n    // and volatile bits ride the `contents[]` array which is not\r\n    // cache-keyed).\r\n    const contents = convertHistoryToGemini(messages, toolUseIdToNative)\r\n    if (volatileText) {\r\n      contents.unshift({\r\n        role: 'user',\r\n        parts: [{ text: volatileText }],\r\n      })\r\n    }\r\n\r\n    // Build function declarations: prefer the native schema from our\r\n    // registry for tools that match; pass through provider-shaped tools\r\n    // for anything we don't recognize (MCP tools, custom tools).\r\n    const functionDeclarations = buildLaneFunctionDeclarations(tools)\r\n\r\n    // Map thinkingBudget from Anthropic-format thinking param.\r\n    const thinkingBudget = resolveThinkingBudget(thinking)\r\n\r\n    // Try to place the stable portion of the request (system + tools) into\r\n    // Google's cachedContents API. On a hit, the model sees cache_read\r\n    // input tokens at ~25% of the normal rate \u2014 meaningful win when the\r\n    // same system+tools are re-used across turns of a session.\r\n    //\r\n    // Cache is API-key-path only today (OAuth proxy doesn't expose it).\r\n    // Use ONLY the stable slot for the cache body \u2014 volatile content\r\n    // rides the leading user message (see contents.unshift above) so the\r\n    // cache-key hash stays identical across turns.\r\n    const cacheSystemInstruction = { parts: [{ text: stableText }] }\r\n    const cacheTools = functionDeclarations.length > 0 ? [{ functionDeclarations }] : undefined\r\n\r\n    let cacheName: string | null = null\r\n    let cacheWriteTokens = 0\r\n    if (geminiApi.supportsServerCache(model)) {\r\n      const apiKey = geminiApi.getApiKey()\r\n      if (apiKey) {\r\n        try {\r\n          const cache = await getOrCreateCacheWithUsage({\r\n            model,\r\n            baseUrl: geminiApi.cacheBaseUrl,\r\n            apiKey,\r\n            systemInstruction: cacheSystemInstruction,\r\n            tools: cacheTools,\r\n          })\r\n          cacheName = cache?.cacheName ?? null\r\n          cacheWriteTokens = cache?.createdTokens ?? 0\r\n        } catch {\r\n          cacheName = null\r\n          cacheWriteTokens = 0\r\n        }\r\n      }\r\n    }\r\n\r\n    // When we ARE using a cache, the systemInstruction is already inside\r\n    // the cache body \u2014 don't duplicate it inline. When we're NOT caching,\r\n    // send the stable slot inline as systemInstruction; the volatile\r\n    // slot is already in the leading user message above.\r\n    const request = buildGeminiRequest({\r\n      model,\r\n      contents,\r\n      systemText: stableText,\r\n      functionDeclarations,\r\n      maxOutputTokens: max_tokens,\r\n      thinkingBudget,\r\n      cacheName,\r\n    })\r\n\r\n    // Track usage across the stream.\r\n    let promptTokens = 0\r\n    let inputTokens = 0\r\n    let outputTokens = 0\r\n    let thinkingTokens = 0\r\n    let cacheReadTokens = 0\r\n\r\n    // Stream state per turn.\r\n    const messageId = `gemini-${Date.now()}`\r\n    let thinkingText = ''\r\n    let responseText = ''\r\n    let blockIndex = 0\r\n    let inBlock: 'thinking' | 'text' | null = null\r\n    let messageStartEmitted = false\r\n    const toolCalls: Array<{\r\n      implId: string\r\n      nativeName: string\r\n      input: Record<string, unknown>\r\n      anthropicToolUseId: string\r\n      nativeArgs: Record<string, unknown>\r\n      thoughtSignature?: string\r\n    }> = []\r\n\r\n    // Accumulator for a streaming function call. Gemini splits function\r\n    // calls across SSE chunks: the first chunk carries the name with\r\n    // (often empty) args, and later chunks carry more args with an empty\r\n    // name as continuation deltas. Emitting a tool_use per chunk produces\r\n    // the `{}` \u2192 \"Received input: {}\" tool-integrity bug that bit us when\r\n    // the server decided to split. We accumulate until the call is known\r\n    // complete \u2014 when a new named call starts, text/thinking resumes, or\r\n    // the stream ends \u2014 then emit one atomic tool_use block.\r\n    //\r\n    // args can come through as either an object (proto-json Struct) or a\r\n    // JSON string (some serialization paths), so we buffer both: object\r\n    // fragments get merged; string fragments get concatenated and parsed\r\n    // at commit time. This mirrors the string/object fork in gemini-cli's\r\n    // parseToolArguments().\r\n    let currentCall: {\r\n      nativeName: string\r\n      args: Record<string, unknown>\r\n      argsString: string\r\n      thoughtSignature?: string\r\n      blockIndex: number\r\n      anthropicToolUseId: string\r\n      anthropicToolUseIdFromServer: boolean\r\n    } | null = null\r\n\r\n    function mergeArgsIntoCurrent(raw: unknown): void {\r\n      if (!currentCall) return\r\n      if (typeof raw === 'string') {\r\n        currentCall.argsString += raw\r\n        return\r\n      }\r\n      if (raw && typeof raw === 'object' && !Array.isArray(raw)) {\r\n        Object.assign(currentCall.args, raw as Record<string, unknown>)\r\n      }\r\n    }\r\n\r\n    function finalizeCurrentArgs(): Record<string, unknown> {\r\n      if (!currentCall) return {}\r\n      let merged: Record<string, unknown> = { ...currentCall.args }\r\n      if (currentCall.argsString.length > 0) {\r\n        try {\r\n          const parsed = JSON.parse(currentCall.argsString)\r\n          if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\r\n            merged = { ...merged, ...(parsed as Record<string, unknown>) }\r\n          }\r\n        } catch {\r\n          // Malformed concatenation \u2014 drop silently; downstream validation\r\n          // surfaces the missing-field error with the object we did\r\n          // manage to assemble.\r\n        }\r\n      }\r\n      return merged\r\n    }\r\n\r\n    // Emit the accumulated tool call as the THREE-event sequence the\r\n    // Anthropic Messages streaming IR requires for tool_use blocks:\r\n    //   1. content_block_start with EMPTY input: {}\r\n    //   2. content_block_delta with input_json_delta.partial_json\r\n    //      carrying the full args as a JSON string\r\n    //   3. content_block_stop\r\n    //\r\n    // The downstream consumer (claude.ts / query.ts) accumulates the\r\n    // partial_json string across deltas and JSON.parse()s it at stop.\r\n    // If we emit content_block_start with input pre-filled (and no\r\n    // input_json_delta), the accumulator stays empty \u2014 the final input\r\n    // the shared tool layer sees is `{}` and EVERY tool call reports\r\n    // its required params missing. That is exactly the regression the\r\n    // legacy gemini_to_anthropic adapter's structure avoided.\r\n    function* commitCurrentCall(): Generator<AnthropicStreamEvent, void> {\r\n      if (!currentCall) return\r\n      const nativeArgs = finalizeCurrentArgs()\r\n      const reg = getRegistrationByNativeName(currentCall.nativeName)\r\n      const implId = reg?.implId ?? currentCall.nativeName\r\n      const adaptedInput = reg ? reg.adaptInput(nativeArgs) : nativeArgs\r\n\r\n      toolCalls.push({\r\n        implId,\r\n        nativeName: currentCall.nativeName,\r\n        input: adaptedInput,\r\n        anthropicToolUseId: currentCall.anthropicToolUseId,\r\n        nativeArgs,\r\n        thoughtSignature: currentCall.thoughtSignature,\r\n      })\r\n\r\n      yield {\r\n        type: 'content_block_start',\r\n        index: currentCall.blockIndex,\r\n        content_block: {\r\n          type: 'tool_use',\r\n          id: currentCall.anthropicToolUseId,\r\n          name: implId,\r\n          input: {}, // placeholder \u2014 real args arrive via input_json_delta\r\n          // Stash the thought signature so we can thread it back on the\r\n          // next turn (Antigravity + thinking-enabled models need this\r\n          // for multi-turn reasoning coherence).\r\n          ...(currentCall.thoughtSignature && {\r\n            _gemini_thought_signature: currentCall.thoughtSignature,\r\n          }),\r\n        },\r\n      }\r\n      yield {\r\n        type: 'content_block_delta',\r\n        index: currentCall.blockIndex,\r\n        delta: {\r\n          type: 'input_json_delta',\r\n          partial_json: JSON.stringify(adaptedInput ?? {}),\r\n        },\r\n      }\r\n      yield { type: 'content_block_stop', index: currentCall.blockIndex }\r\n      currentCall = null\r\n    }\r\n\r\n    // Defer message_start until the first chunk arrives so we can fold\r\n    // cache-hit and input-token numbers into the initial usage block \u2014\r\n    // Anthropic's AnthropicMessage.usage carries cache_read_input_tokens\r\n    // only on the initial message_start, so emitting it blank first loses\r\n    // the data. Mirrors the gemini_to_anthropic legacy adapter pattern.\r\n    const emitMessageStart = () => {\r\n      if (messageStartEmitted) return\r\n      messageStartEmitted = true\r\n      const cacheUsage = {\r\n        ...(cacheReadTokens > 0 && {\r\n          cache_read_input_tokens: cacheReadTokens,\r\n        }),\r\n        ...(cacheWriteTokens > 0 && {\r\n          cache_creation_input_tokens: cacheWriteTokens,\r\n        }),\r\n      }\r\n      return {\r\n        type: 'message_start' as const,\r\n        message: {\r\n          id: messageId,\r\n          type: 'message' as const,\r\n          role: 'assistant' as const,\r\n          content: [],\r\n          model,\r\n          stop_reason: null,\r\n          stop_sequence: null,\r\n          usage: {\r\n            input_tokens: inputTokens,\r\n            output_tokens: 0,\r\n            ...cacheUsage,\r\n          },\r\n        },\r\n      }\r\n    }\r\n\r\n    try {\r\n      const stream = geminiApi.streamGenerateContent(request, signal)\r\n\r\n      for await (const chunk of stream) {\r\n        if (signal.aborted) break\r\n\r\n        // Fold usage FIRST so message_start (emitted on first chunk) sees\r\n        // the correct cache-hit numbers before any blocks flow.\r\n        if (chunk.usageMetadata) {\r\n          const u = chunk.usageMetadata\r\n          promptTokens = u.promptTokenCount ?? promptTokens\r\n          outputTokens = u.candidatesTokenCount ?? outputTokens\r\n          thinkingTokens = u.thoughtsTokenCount ?? thinkingTokens\r\n          cacheReadTokens = u.cachedContentTokenCount ?? cacheReadTokens\r\n          inputTokens = uncachedInputTokens(promptTokens, cacheReadTokens)\r\n        }\r\n\r\n        if (!messageStartEmitted) {\r\n          const ev = emitMessageStart()\r\n          if (ev) yield ev\r\n        }\r\n\r\n        for (const candidate of chunk.candidates ?? []) {\r\n          for (const part of (candidate.content?.parts ?? []) as any[]) {\r\n            // \u2500\u2500 Thinking part \u2500\u2500\r\n            if (part.thought === true && typeof part.text === 'string') {\r\n              // A text/thinking part ends any tool-call accumulation.\r\n              if (currentCall) {\r\n                yield* commitCurrentCall()\r\n              }\r\n              if (inBlock === 'text') {\r\n                yield { type: 'content_block_stop', index: blockIndex }\r\n                blockIndex++\r\n                inBlock = null\r\n                responseText = ''\r\n              }\r\n              if (inBlock !== 'thinking') {\r\n                yield {\r\n                  type: 'content_block_start',\r\n                  index: blockIndex,\r\n                  content_block: { type: 'thinking', thinking: '' },\r\n                }\r\n                inBlock = 'thinking'\r\n              }\r\n              thinkingText += part.text\r\n              yield {\r\n                type: 'content_block_delta',\r\n                index: blockIndex,\r\n                delta: { type: 'thinking_delta', thinking: part.text },\r\n              }\r\n              continue\r\n            }\r\n\r\n            // \u2500\u2500 Text part \u2500\u2500\r\n            if (typeof part.text === 'string' && part.thought !== true) {\r\n              if (currentCall) {\r\n                yield* commitCurrentCall()\r\n              }\r\n              if (inBlock === 'thinking') {\r\n                yield { type: 'content_block_stop', index: blockIndex }\r\n                blockIndex++\r\n                inBlock = null\r\n                thinkingText = ''\r\n              }\r\n              if (inBlock !== 'text') {\r\n                yield {\r\n                  type: 'content_block_start',\r\n                  index: blockIndex,\r\n                  content_block: { type: 'text', text: '' },\r\n                }\r\n                inBlock = 'text'\r\n              }\r\n              responseText += part.text\r\n              yield {\r\n                type: 'content_block_delta',\r\n                index: blockIndex,\r\n                delta: { type: 'text_delta', text: part.text },\r\n              }\r\n              continue\r\n            }\r\n\r\n            // \u2500\u2500 Function call part \u2500\u2500\r\n            //\r\n            // Gemini can split one logical tool call across multiple SSE\r\n            // chunks. The first carries the name (and usually empty or\r\n            // partial args); the rest carry more args with an empty name\r\n            // as continuation deltas. CLIProxyAPI calls out the same\r\n            // quirk in gemini_claude_response.go: \"Handle streaming split/\r\n            // delta where name might be empty in subsequent chunks.\" We\r\n            // accumulate here and commit below (at a state transition or\r\n            // stream end) so the downstream tool_use block always carries\r\n            // the complete input.\r\n            if (part.functionCall) {\r\n              const fc = part.functionCall as {\r\n                id?: string\r\n                name?: string\r\n                args?: unknown\r\n              }\r\n              // thoughtSignature lives at Part level (sibling of functionCall),\r\n              // not inside functionCall. Server emits camelCase on the\r\n              // generativelanguage response; Code Assist emits snake_case.\r\n              const thoughtSignature =\r\n                (part as { thoughtSignature?: string; thought_signature?: string }).thoughtSignature\r\n                ?? (part as { thought_signature?: string }).thought_signature\r\n\r\n              const name = typeof fc.name === 'string' ? fc.name : ''\r\n\r\n              if (name === '' && currentCall) {\r\n                // Continuation of the in-progress call \u2014 merge more args.\r\n                mergeArgsIntoCurrent(fc.args)\r\n                if (thoughtSignature && !currentCall.thoughtSignature) {\r\n                  currentCall.thoughtSignature = thoughtSignature\r\n                }\r\n                // Late-arriving id (Antigravity \u2192 Claude occasionally splits\r\n                // the id across chunks) \u2014 backfill onto the in-progress call.\r\n                if (typeof fc.id === 'string' && fc.id && !currentCall.anthropicToolUseIdFromServer) {\r\n                  currentCall.anthropicToolUseId = fc.id\r\n                  currentCall.anthropicToolUseIdFromServer = true\r\n                }\r\n                continue\r\n              }\r\n\r\n              // New named call \u2014 commit any pending, close open text/\r\n              // thinking block, and start fresh.\r\n              if (currentCall) {\r\n                yield* commitCurrentCall()\r\n              }\r\n              if (inBlock !== null) {\r\n                yield { type: 'content_block_stop', index: blockIndex }\r\n                blockIndex++\r\n                inBlock = null\r\n                responseText = ''\r\n                thinkingText = ''\r\n              }\r\n\r\n              // Prefer the server-supplied id (Antigravity/Claude emits\r\n              // `functionCall.id` carrying Claude's original tool_use.id \u2014\r\n              // preserving it keeps the id round-trip intact so the next\r\n              // turn's tool_result references an id Claude actually issued).\r\n              // Fall back to a synthetic toolu_gem_<uuid> when absent \u2014 that\r\n              // covers pure Gemini, which never emits ids.\r\n              const serverId = typeof fc.id === 'string' && fc.id ? fc.id : null\r\n              const anthropicToolUseId = serverId ?? `toolu_gem_${randomUUID()}`\r\n              currentCall = {\r\n                nativeName: name,\r\n                args: {},\r\n                argsString: '',\r\n                thoughtSignature,\r\n                blockIndex,\r\n                anthropicToolUseId,\r\n                anthropicToolUseIdFromServer: serverId !== null,\r\n              }\r\n              blockIndex++\r\n              mergeArgsIntoCurrent(fc.args)\r\n              continue\r\n            }\r\n          }\r\n        }\r\n      }\r\n    } catch (err: any) {\r\n      // If the server says the cached content doesn't exist (404 or\r\n      // specific string), invalidate so the next call builds fresh.\r\n      if (\r\n        cacheName\r\n        && err\r\n        && typeof err.body === 'string'\r\n        && (err.status === 404 || /cachedContent/i.test(err.body))\r\n      ) {\r\n        invalidateCache(cacheName)\r\n      }\r\n      // Make sure message_start is emitted so downstream assembly works.\r\n      if (!messageStartEmitted) {\r\n        const ev = emitMessageStart()\r\n        if (ev) yield ev\r\n      }\r\n      if (err?.name === 'AbortError' || signal.aborted) {\r\n        // Drop any in-flight tool call accumulator \u2014 its args are\r\n        // incomplete, so emitting it would give the model a garbage\r\n        // tool_use block on the next turn. The turn ends here.\r\n        currentCall = null\r\n        // Close any open block and signal abort.\r\n        if (inBlock !== null) {\r\n          yield { type: 'content_block_stop', index: blockIndex }\r\n        }\r\n        yield {\r\n          type: 'message_delta',\r\n          delta: { stop_reason: 'end_turn' },\r\n          usage: {\r\n            output_tokens: outputTokens,\r\n            input_tokens: inputTokens,\r\n            ...(cacheReadTokens > 0 && {\r\n              cache_read_input_tokens: cacheReadTokens,\r\n            }),\r\n            ...(cacheWriteTokens > 0 && {\r\n              cache_creation_input_tokens: cacheWriteTokens,\r\n            }),\r\n          },\r\n        }\r\n        yield { type: 'message_stop' }\r\n        return {\r\n          input_tokens: inputTokens,\r\n          output_tokens: outputTokens,\r\n          cache_read_tokens: cacheReadTokens,\r\n          cache_write_tokens: cacheWriteTokens,\r\n          thinking_tokens: thinkingTokens,\r\n        }\r\n      }\r\n      // Non-abort errors: same rationale as abort \u2014 an incomplete tool\r\n      // call shouldn't surface. Drop the accumulator before surfacing\r\n      // the error text block.\r\n      currentCall = null\r\n      // Surface other errors as a text block + end.\r\n      if (inBlock !== null) {\r\n        yield { type: 'content_block_stop', index: blockIndex }\r\n        blockIndex++\r\n      }\r\n      yield {\r\n        type: 'content_block_start',\r\n        index: blockIndex,\r\n        content_block: { type: 'text', text: '' },\r\n      }\r\n      // Prompt-too-long errors must surface with the Claude-Code signal\r\n      // prefix un-wrapped so query.ts reactive compact recognizes them\r\n      // via isPromptTooLongMessage(msg). GeminiApiError.message already\r\n      // starts with \"Prompt is too long (Gemini N)\" in that case.\r\n      const isPTL = (err as { isPromptTooLong?: boolean } | null)?.isPromptTooLong === true\r\n\r\n      // Auth-stale 403 that survived the one-shot re-onboard retry means\r\n      // the token itself is bad (account lost Antigravity access, scopes\r\n      // were revoked, or refresh expired). A raw \"Gemini API error 403:\r\n      // The caller does not have permission\" isn't actionable \u2014 replace\r\n      // with a concrete next-step message so the user knows to run /provider.\r\n      const errKind = (err as { kind?: string } | null)?.kind\r\n      const isTerminalAuth = errKind === 'auth-stale'\r\n        || errKind === 'non-retryable'\r\n        || (err?.status === 401 || err?.status === 403)\r\n      const isQuotaOrCapacity = errKind === 'retryable-quota'\r\n        || errKind === 'terminal-quota'\r\n        || err?.status === 429\r\n      const errText = isPTL\r\n        ? (err?.message ?? String(err))\r\n        : isTerminalAuth\r\n          ? buildAuthErrorMessage(err, model)\r\n          : isQuotaOrCapacity\r\n            ? buildQuotaErrorMessage(err, model)\r\n            : `\\n\\nGemini API error (model: ${model}): ${err?.message ?? String(err)}`\r\n      yield {\r\n        type: 'content_block_delta',\r\n        index: blockIndex,\r\n        delta: { type: 'text_delta', text: errText },\r\n      }\r\n      yield { type: 'content_block_stop', index: blockIndex }\r\n      yield {\r\n        type: 'message_delta',\r\n        delta: { stop_reason: 'end_turn' },\r\n        usage: {\r\n          output_tokens: outputTokens,\r\n          input_tokens: inputTokens,\r\n          ...(cacheReadTokens > 0 && {\r\n            cache_read_input_tokens: cacheReadTokens,\r\n          }),\r\n          ...(cacheWriteTokens > 0 && {\r\n            cache_creation_input_tokens: cacheWriteTokens,\r\n          }),\r\n        },\r\n      }\r\n      yield { type: 'message_stop' }\r\n      return {\r\n        input_tokens: inputTokens,\r\n        output_tokens: outputTokens,\r\n        cache_read_tokens: cacheReadTokens,\r\n        cache_write_tokens: cacheWriteTokens,\r\n        thinking_tokens: thinkingTokens,\r\n      }\r\n    }\r\n\r\n    // Make sure message_start was emitted (edge case: empty response).\r\n    if (!messageStartEmitted) {\r\n      const ev = emitMessageStart()\r\n      if (ev) yield ev\r\n    }\r\n\r\n    // Commit any pending tool call \u2014 the stream ended without a state\r\n    // transition to force emission. This is the common case when a\r\n    // response is just one tool call: all the chunks are functionCall\r\n    // parts and the only trigger to commit is end-of-stream.\r\n    if (currentCall) {\r\n      yield* commitCurrentCall()\r\n    }\r\n\r\n    // Close final open block.\r\n    if (inBlock !== null) {\r\n      yield { type: 'content_block_stop', index: blockIndex }\r\n    }\r\n\r\n    // Decide stop reason: if we emitted tool_use blocks, the model wants to\r\n    // run tools; otherwise it finished its turn.\r\n    const stopReason: 'tool_use' | 'end_turn' =\r\n      toolCalls.length > 0 ? 'tool_use' : 'end_turn'\r\n\r\n    yield {\r\n      type: 'message_delta',\r\n      delta: { stop_reason: stopReason },\r\n      // Fold end-of-stream usage into message_delta. Gemini delivers\r\n      // usageMetadata only in the final chunk, so message_start was emitted\r\n      // with zeros. updateUsage (claude.ts) picks these up via its > 0 guard\r\n      // \u2014 without this, cache_read_input_tokens always displays as 0 on the\r\n      // CLI / Google-account path even when Gemini reports a cache hit.\r\n      usage: {\r\n        output_tokens: outputTokens,\r\n        input_tokens: inputTokens,\r\n        ...(cacheReadTokens > 0 && {\r\n          cache_read_input_tokens: cacheReadTokens,\r\n        }),\r\n        ...(cacheWriteTokens > 0 && {\r\n          cache_creation_input_tokens: cacheWriteTokens,\r\n        }),\r\n      },\r\n    }\r\n    yield { type: 'message_stop' }\r\n\r\n    return {\r\n      input_tokens: inputTokens,\r\n      output_tokens: outputTokens,\r\n      cache_read_tokens: cacheReadTokens,\r\n      cache_write_tokens: cacheWriteTokens,\r\n      thinking_tokens: thinkingTokens,\r\n    }\r\n  }\r\n\r\n  // \u2500\u2500 Lane-owns-loop mode (future Phase-2 migration) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n  async *run(context: LaneRunContext): AsyncGenerator<AnthropicStreamEvent, LaneRunResult> {\r\n    // Lane-owns-loop isn't wired into the query pipeline yet. For now this\r\n    // delegates to streamAsProvider so the interface stays usable if called.\r\n    const { model, messages, systemParts, mcpTools, signal, maxTokens } = context\r\n\r\n    // Synthesize a system string from SystemPromptParts.\r\n    const systemText = assembleSystemFromParts(systemParts)\r\n\r\n    // Aggregate lane-native tool defs + MCP tools in provider-tool shape.\r\n    const allTools = [\r\n      ...GEMINI_TOOL_REGISTRY.map(r => ({\r\n        name: r.implId,\r\n        description: r.nativeDescription,\r\n        input_schema: r.nativeSchema,\r\n      })),\r\n      ...mcpTools,\r\n    ]\r\n\r\n    const totalUsage: NormalizedUsage = {\r\n      input_tokens: 0,\r\n      output_tokens: 0,\r\n      cache_read_tokens: 0,\r\n      cache_write_tokens: 0,\r\n      thinking_tokens: 0,\r\n    }\r\n\r\n    let currentMessages = messages\r\n    let turnCount = 0\r\n\r\n    while (turnCount < MAX_TURNS) {\r\n      if (signal.aborted) return { stopReason: 'aborted', usage: totalUsage }\r\n      turnCount++\r\n\r\n      const collectedToolUses: Array<{ id: string; name: string; input: Record<string, unknown> }> = []\r\n\r\n      const gen = this.streamAsProvider({\r\n        model,\r\n        messages: currentMessages,\r\n        system: systemText,\r\n        tools: allTools,\r\n        max_tokens: maxTokens,\r\n        signal,\r\n      })\r\n\r\n      // Forward events while collecting tool_use blocks for execution.\r\n      let done = false\r\n      let stopReason: 'end_turn' | 'tool_use' = 'end_turn'\r\n      while (!done) {\r\n        const next = await gen.next()\r\n        if (next.done) {\r\n          const u = next.value\r\n          totalUsage.input_tokens += u.input_tokens\r\n          totalUsage.output_tokens += u.output_tokens\r\n          totalUsage.cache_read_tokens += u.cache_read_tokens\r\n          totalUsage.cache_write_tokens += u.cache_write_tokens\r\n          totalUsage.thinking_tokens += u.thinking_tokens\r\n          done = true\r\n          break\r\n        }\r\n        const ev = next.value\r\n        yield ev\r\n        if (\r\n          ev.type === 'content_block_start'\r\n          && ev.content_block?.type === 'tool_use'\r\n          && ev.content_block.id\r\n          && ev.content_block.name\r\n        ) {\r\n          collectedToolUses.push({\r\n            id: ev.content_block.id,\r\n            name: ev.content_block.name,\r\n            input: (ev.content_block.input ?? {}) as Record<string, unknown>,\r\n          })\r\n        }\r\n        if (ev.type === 'message_delta' && ev.delta?.stop_reason === 'tool_use') {\r\n          stopReason = 'tool_use'\r\n        }\r\n      }\r\n\r\n      if (stopReason !== 'tool_use' || collectedToolUses.length === 0) {\r\n        return { stopReason: 'end_turn', usage: totalUsage }\r\n      }\r\n\r\n      // Execute tools via the shared layer and feed results back.\r\n      const toolResultBlocks = await Promise.all(\r\n        collectedToolUses.map(async tu => {\r\n          try {\r\n            const result = await context.executeTool(tu.name, tu.input)\r\n            return {\r\n              type: 'tool_result' as const,\r\n              tool_use_id: tu.id,\r\n              content: typeof result.content === 'string'\r\n                ? result.content\r\n                : JSON.stringify(result.content),\r\n              is_error: result.isError,\r\n            }\r\n          } catch (e: any) {\r\n            return {\r\n              type: 'tool_result' as const,\r\n              tool_use_id: tu.id,\r\n              content: `Error: ${e?.message ?? String(e)}`,\r\n              is_error: true,\r\n            }\r\n          }\r\n        }),\r\n      )\r\n\r\n      currentMessages = [\r\n        ...currentMessages,\r\n        {\r\n          role: 'assistant',\r\n          content: collectedToolUses.map(tu => ({\r\n            type: 'tool_use',\r\n            id: tu.id,\r\n            name: tu.name,\r\n            input: tu.input,\r\n          })),\r\n        },\r\n        { role: 'user', content: toolResultBlocks },\r\n      ]\r\n    }\r\n\r\n    return { stopReason: 'max_turns', usage: totalUsage }\r\n  }\r\n\r\n  async listModels(providerFilter?: string): Promise<ModelInfo[]> {\r\n    return geminiApi.listModels(providerFilter)\r\n  }\r\n\r\n  resolveModel(model: string): string {\r\n    return model\r\n  }\r\n\r\n  smallFastModel(): string {\r\n    // CLI-OAuth flash-lite is the cheapest Gemini model we can reach\r\n    // on any auth path. API-key users could pay for the same via the\r\n    // Studio endpoint; OAuth users get it free on the Code Assist pool.\r\n    return 'gemini-2.5-flash-lite'\r\n  }\r\n\r\n  isHealthy(): boolean {\r\n    return this._healthy\r\n  }\r\n\r\n  setHealthy(healthy: boolean): void {\r\n    this._healthy = healthy\r\n  }\r\n\r\n  dispose(): void {\r\n    // No resources to release yet. When we add cachedContent lifetime\r\n    // management we'll clean up here.\r\n  }\r\n}\r\n\r\n// \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nfunction resolveThinkingBudget(\r\n  thinking: LaneProviderCallParams['thinking'] | undefined,\r\n): number {\r\n  // -1 = dynamic (Gemini picks per-turn). 0 = off. positive integer = cap.\r\n  if (!thinking || thinking.type === 'adaptive') return -1\r\n  if (thinking.type === 'disabled') return 0\r\n  if (thinking.type === 'enabled') return thinking.budget_tokens ?? -1\r\n  return -1\r\n}\r\n\r\n/**\r\n * Build the right shape of `thinkingConfig` for the target model.\r\n *\r\n * Gemini 3.x Antigravity models advertise LEVEL-based thinking (\"low\",\r\n * \"medium\", \"high\") via the model registry \u2014 sending `thinkingBudget` on\r\n * them defaults to \"high\" thinking regardless of user intent, because the\r\n * server ignores the int and falls back to its model-default level. That\r\n * made `gemini-3.1-pro-low` just as slow as `-pro-high` (the root cause\r\n * of the \"cancer latency\" the user reported).\r\n *\r\n * Rule: when the model name has an explicit `-high` / `-low` / `-medium`\r\n * suffix (Antigravity convention), emit `thinkingLevel` in that level.\r\n * Otherwise, keep the legacy integer `thinkingBudget` path for 2.x models\r\n * and non-suffixed flash/lite variants.\r\n */\r\nfunction resolveThinkingConfig(\r\n  model: string,\r\n  thinkingBudget: number,\r\n): Record<string, unknown> {\r\n  const lower = model.toLowerCase()\n  // Match explicit suffix first \u2014 the suffix encodes the user's choice.\n  let level: 'low' | 'medium' | 'high' | null = null\n  const levelMatch = lower.match(/^gemini-\\d+(?:\\.\\d+)?-(?:pro|flash)-(high|medium|low)$/)\n  if (levelMatch) level = levelMatch[1] as 'low' | 'medium' | 'high'\n  else if (/^gemini-3(?:\\.\\d+)?-flash$/.test(lower)) level = 'low' // Antigravity flash defaults to \"low\"\n\r\n  if (level) {\r\n    return {\r\n      thinkingLevel: level,\r\n      includeThoughts: thinkingBudget !== 0,\r\n    }\r\n  }\r\n  // Legacy integer budget for 2.x, preview-flash-lite, etc.\r\n  return {\r\n    thinkingBudget,\r\n    includeThoughts: thinkingBudget !== 0,\r\n  }\r\n}\r\n\r\n/**\r\n * @deprecated Used by the lane-owns-loop `run()` scaffold only. The\r\n * real path (`streamAsProvider`) already receives a pre-assembled\r\n * `system` string from `query.ts`. When `run()` is wired end-to-end\r\n * in Phase 2 of the redesign this flattens the split only for lanes\r\n * that can't carry a separate cache surface; Gemini proper should\r\n * instead call `assembleGeminiSystemPrompt` and place `stable` in\r\n * `systemInstruction` / cachedContents, `volatile` inline as the\r\n * leading user message.\r\n */\r\nfunction assembleSystemFromParts(parts: {\r\n  memory?: string\r\n  environment?: string\r\n  gitStatus?: string\r\n  toolsAddendum?: string\r\n  mcpIntro?: string\r\n  skillsContext?: string\r\n  customInstructions?: string\r\n}): string {\r\n  const sections: string[] = []\r\n  if (parts.customInstructions) sections.push(parts.customInstructions)\r\n  if (parts.toolsAddendum) sections.push(parts.toolsAddendum)\r\n  if (parts.mcpIntro) sections.push(parts.mcpIntro)\r\n  if (parts.skillsContext) sections.push(`Skills:\\n${parts.skillsContext}`)\r\n  if (parts.memory) sections.push(`Context:\\n${parts.memory}`)\r\n  if (parts.environment) sections.push(parts.environment)\r\n  if (parts.gitStatus) sections.push(`Git status:\\n${parts.gitStatus}`)\r\n  return sections.join('\\n\\n')\r\n}\r\n\r\n// Build a map of tool_use_id \u2192 native tool name by scanning the history\r\n// for tool_use blocks. Some blocks emit an implId as their name, others may\r\n// already carry the native name. We record both candidates keyed by id.\r\nfunction buildToolUseIdToNativeMap(\r\n  messages: import('../../services/api/providers/base_provider.js').ProviderMessage[],\r\n): Map<string, string> {\r\n  const map = new Map<string, string>()\r\n  for (const msg of messages) {\r\n    if (typeof msg.content === 'string') continue\r\n    for (const block of msg.content) {\r\n      if (block.type === 'tool_use' && block.id && block.name) {\r\n        // Resolve the block's name \u2192 native name. If name is an implId, look\r\n        // up the first native registration; otherwise treat it as already-native.\r\n        const native = implIdToNative(block.name) ?? block.name\r\n        map.set(block.id, native)\r\n      }\r\n    }\r\n  }\r\n  return map\r\n}\r\n\r\n// \u2500\u2500\u2500 History Conversion \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n//\r\n// Anthropic-IR ProviderMessage[] \u2192 Gemini native GeminiContent[].\r\n// Handles the shared-impl-name \u2194 native-name mapping transparently.\r\n\r\nfunction convertHistoryToGemini(\r\n  messages: import('../../services/api/providers/base_provider.js').ProviderMessage[],\r\n  toolUseIdToNative: Map<string, string>,\r\n): GeminiContent[] {\r\n  const contents: GeminiContent[] = []\r\n\r\n  for (const msg of messages) {\r\n    const role: 'user' | 'model' = msg.role === 'assistant' ? 'model' : 'user'\r\n    const parts: GeminiPart[] = []\r\n\r\n    if (typeof msg.content === 'string') {\r\n      if (msg.content.length > 0) parts.push({ text: msg.content })\r\n    } else {\r\n      for (const block of msg.content) {\r\n        switch (block.type) {\r\n          case 'text':\r\n            if (block.text) parts.push({ text: block.text })\r\n            break\r\n          case 'tool_use':\r\n            if (block.name) {\r\n              const nativeName = implIdToNative(block.name) ?? block.name\r\n              const nativeInput = implToNativeInput(block.name, block.input ?? {})\r\n              // thoughtSignature lives on the Part (sibling of functionCall),\r\n              // NOT inside functionCall \u2014 the proto has it at Part level.\r\n              // Only emit when we captured a real one from the prior turn;\r\n              // the server rejects placeholder/synthetic values.\r\n              // Carry block.id on functionCall.id \u2014 Antigravity's Gemini\u2192\r\n              // Anthropic bridge uses it to populate tool_use.id on the\r\n              // request it forwards to Claude. Without it Claude rejects\r\n              // with \"messages.N.content.M.tool_use.id: Field required\".\r\n              const fc: GeminiPart = {\r\n                functionCall: {\r\n                  ...(block.id ? { id: block.id } : {}),\r\n                  name: nativeName,\r\n                  args: nativeInput,\r\n                },\r\n                ...(block._gemini_thought_signature && {\r\n                  thoughtSignature: block._gemini_thought_signature,\r\n                }),\r\n              }\r\n              parts.push(fc)\r\n            }\r\n            break\r\n          case 'tool_result': {\r\n            const id = block.tool_use_id ?? ''\r\n            const nativeName = (id && toolUseIdToNative.get(id)) ?? 'unknown'\r\n            // Split content into text (\u2192 functionResponse.content) and\r\n            // image parts (\u2192 sibling inlineData Parts). Gemini natively\r\n            // handles multimodal function responses via adjacent\r\n            // inlineData parts \u2014 stringifying base64 images into a text\r\n            // JSON blob would dump raw bytes into the model's context.\r\n            const { text, images } = splitToolResultContent(block.content)\r\n            // Carry tool_use_id on functionResponse.id so Antigravity can\r\n            // round-trip Claude's tool_use_id \u2192 tool_result matching.\r\n            parts.push({\r\n              functionResponse: {\r\n                ...(id ? { id } : {}),\r\n                name: nativeName,\r\n                response: { content: text },\r\n              },\r\n            })\r\n            for (const img of images) {\r\n              parts.push({ inlineData: img })\r\n            }\r\n            break\r\n          }\r\n          case 'thinking':\r\n            if (block.thinking) parts.push({ thought: true, text: block.thinking })\r\n            break\r\n        }\r\n      }\r\n    }\r\n\r\n    if (parts.length > 0) contents.push({ role, parts })\r\n  }\r\n\r\n  return contents\r\n}\r\n\r\n/**\r\n * Split a tool_result block's content into text + image parts.\r\n *\r\n * Gemini accepts `inlineData` parts alongside `functionResponse` in the\r\n * same user turn; that is the native way to hand an image back to the\r\n * model. The legacy stringifier dumped image blocks into JSON, which\r\n * meant base64 bytes hit the model as text tokens (useless + expensive).\r\n *\r\n * Input shapes:\r\n *   - string                                              \u2192 all text\r\n *   - Array<{type:'text',text}|{type:'image',source:{...}}>\r\n *   - Array of bare `{text}` blocks (legacy)\r\n */\r\nfunction splitToolResultContent(content: unknown): {\r\n  text: string\r\n  images: Array<{ mimeType: string; data: string }>\r\n} {\r\n  if (typeof content === 'string') {\r\n    return { text: content, images: [] }\r\n  }\r\n  if (!Array.isArray(content)) {\r\n    return { text: JSON.stringify(content ?? ''), images: [] }\r\n  }\r\n  const texts: string[] = []\r\n  const images: Array<{ mimeType: string; data: string }> = []\r\n  for (const b of content as any[]) {\r\n    if (!b || typeof b !== 'object') continue\r\n    if (b.type === 'text' && typeof b.text === 'string') {\r\n      texts.push(b.text)\r\n      continue\r\n    }\r\n    if (b.type === 'image' && b.source && typeof b.source === 'object') {\r\n      // Anthropic image source shape: { type: 'base64', media_type, data }\r\n      // Map into Gemini inlineData: { mimeType, data }. Bail on URL-only\r\n      // sources (Gemini doesn't fetch); stringify so the user sees something.\r\n      const src = b.source as {\r\n        type?: string\r\n        media_type?: string\r\n        mediaType?: string\r\n        data?: string\r\n        url?: string\r\n      }\r\n      const mimeType = src.media_type ?? src.mediaType ?? 'image/png'\r\n      if (typeof src.data === 'string' && src.data.length > 0) {\r\n        images.push({ mimeType, data: src.data })\r\n        continue\r\n      }\r\n      if (src.url) {\r\n        texts.push(`[image url: ${src.url}]`)\r\n        continue\r\n      }\r\n      texts.push(`[image attached: ${mimeType}]`)\r\n      continue\r\n    }\r\n    // Bare {text} legacy block or unknown shape.\r\n    if (typeof b.text === 'string') {\r\n      texts.push(b.text)\r\n      continue\r\n    }\r\n    texts.push(JSON.stringify(b))\r\n  }\r\n  return { text: texts.join('\\n'), images }\r\n}\r\n\r\n// Map a shared impl id \u2192 native Gemini tool name (first match wins).\r\n// Returns undefined for unknown impls (MCP tools etc \u2014 caller treats the\r\n// name as already-native).\r\nconst _implToNative = new Map<string, string>()\r\nfunction _ensureImplMap(): void {\r\n  if (_implToNative.size > 0) return\r\n  for (const reg of GEMINI_TOOL_REGISTRY) {\r\n    if (!_implToNative.has(reg.implId)) {\r\n      _implToNative.set(reg.implId, reg.nativeName)\r\n    }\r\n  }\r\n}\r\nfunction implIdToNative(implOrNative: string): string | undefined {\r\n  _ensureImplMap()\r\n  if (_implToNative.has(implOrNative)) return _implToNative.get(implOrNative)\r\n  // If it's already a native name, return as-is.\r\n  const reg = getRegistrationByNativeName(implOrNative)\r\n  if (reg) return reg.nativeName\r\n  return undefined\r\n}\r\n\r\n// Translate shared-impl input \u2192 native Gemini input shape, running it\r\n// through adaptInput's inverse where available. For most tools the shape\r\n// is nearly identical, but some (Read offset+limit \u2194 start_line+end_line)\r\n// differ and we do the best-effort inverse here.\r\nfunction implToNativeInput(\r\n  implOrNative: string,\r\n  input: Record<string, unknown>,\r\n): Record<string, unknown> {\r\n  // If the caller already sent native-name input, pass through.\r\n  const byNative = getRegistrationByNativeName(implOrNative)\r\n  if (byNative) return input\r\n\r\n  // Find by impl id.\r\n  const reg = GEMINI_TOOL_REGISTRY.find(r => r.implId === implOrNative)\r\n  if (!reg) return input\r\n\r\n  // Specific inverse adapters for divergent shapes.\r\n  switch (reg.nativeName) {\r\n    case 'read_file': {\r\n      const offset = input.offset as number | undefined\r\n      const limit = input.limit as number | undefined\r\n      const out: Record<string, unknown> = { file_path: input.file_path }\r\n      if (offset != null) {\r\n        out.start_line = offset + 1\r\n        if (limit != null) out.end_line = offset + limit\r\n      }\r\n      return out\r\n    }\r\n    case 'replace': {\r\n      return {\r\n        file_path: input.file_path,\r\n        old_string: input.old_string,\r\n        new_string: input.new_string,\r\n        ...(input.replace_all != null && { allow_multiple: input.replace_all }),\r\n      }\r\n    }\r\n    case 'grep_search': {\r\n      const out: Record<string, unknown> = { pattern: input.pattern }\r\n      if (input.path != null) out.dir_path = input.path\r\n      if (input.glob != null) out.include_pattern = input.glob\r\n      if (input.head_limit != null) out.total_max_matches = input.head_limit\r\n      if (input.output_mode === 'files_with_matches') out.names_only = true\r\n      return out\r\n    }\r\n    default:\r\n      return input\r\n  }\r\n}\r\n\r\n// Build function declarations from the active tool list passed in by the\r\n// caller. Tools matching our native registry use the native schema the\r\n// model was trained on; unknown tools (MCP, custom) pass through with\r\n// their provider-shaped schema, after light sanitization for Gemini.\r\nfunction buildLaneFunctionDeclarations(\r\n  tools: import('../../services/api/providers/base_provider.js').ProviderTool[],\r\n): Array<{ name: string; description: string; parameters: Record<string, unknown> }> {\r\n  const decls: Array<{ name: string; description: string; parameters: Record<string, unknown> }> = []\r\n\r\n  for (const tool of tools) {\r\n    // Try to match by impl id first (how claude.ts names tools).\r\n    const byImpl = GEMINI_TOOL_REGISTRY.find(r => r.implId === tool.name)\r\n    if (byImpl) {\r\n      decls.push({\r\n        name: byImpl.nativeName,\r\n        description: appendStrictParamsHint(byImpl.nativeDescription, byImpl.nativeSchema),\r\n        parameters: byImpl.nativeSchema,\r\n      })\r\n      continue\r\n    }\r\n\r\n    // Maybe the caller already gave us a native name.\r\n    const byNative = getRegistrationByNativeName(tool.name)\r\n    if (byNative) {\r\n      decls.push({\r\n        name: byNative.nativeName,\r\n        description: appendStrictParamsHint(byNative.nativeDescription, byNative.nativeSchema),\r\n        parameters: byNative.nativeSchema,\r\n      })\r\n      continue\r\n    }\r\n\r\n    // Unknown tool \u2014 forward with its provider-shaped schema, routed\r\n    // through the shared MCP bridge sanitizer for the 'gemini' profile.\r\n    // Also append the STRICT PARAMETERS hint so Flash models see the\r\n    // field-level requirement plainly in the description \u2014 Flash is\r\n    // prone to emitting empty-args tool calls when the hint is absent.\r\n    const parameters = sanitizeSchemaForLane(\r\n      tool.input_schema ?? { type: 'object', properties: {} },\r\n      'gemini',\r\n    )\r\n    decls.push({\r\n      name: tool.name,\r\n      description: appendStrictParamsHint(tool.description ?? '', parameters),\r\n      parameters,\r\n    })\r\n  }\r\n\r\n  return decls\r\n}\r\n\r\n// \u2500\u2500\u2500 Request Builder \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\ninterface GeminiRequestConfig {\r\n  model: string\r\n  contents: GeminiContent[]\r\n  systemText: string\r\n  functionDeclarations: Array<{ name: string; description: string; parameters: Record<string, unknown> }>\r\n  maxOutputTokens: number\r\n  thinkingBudget: number\r\n  /** Server-side cache name from cachedContents API (if hit). */\r\n  cacheName?: string | null\r\n}\r\n\r\nfunction buildGeminiRequest(config: GeminiRequestConfig): Record<string, unknown> {\r\n  const {\r\n    model,\r\n    contents,\r\n    systemText,\r\n    functionDeclarations,\r\n    maxOutputTokens,\r\n    thinkingBudget,\r\n    cacheName,\r\n  } = config\r\n\r\n  const hasTools = functionDeclarations.length > 0\r\n  // When tools are present, prepend the TOOL_USAGE_RULES preamble to the\r\n  // system instruction so the model treats the schema as authoritative\r\n  // and stops emitting empty-args tool calls. Byte cost is ~400; big\r\n  // quality win on Flash-class models that ignore the schema otherwise.\r\n  const systemTextWithRules = hasTools\r\n    ? `${GEMINI_TOOL_USAGE_RULES}\\n${systemText}`\r\n    : systemText\r\n\r\n  // Antigravity pro/flash models (gemini-3.x family) expose a LEVEL-based\r\n  // thinking API (low/medium/high) rather than the legacy budget-int API.\r\n  // If we send `thinkingBudget: -1` (dynamic) on these, the server defaults\r\n  // to \"high\" thinking \u2014 which is why `-pro-low` was previously taking\r\n  // just as long as `-pro-high`. Translate model name suffix \u2192 thinking\r\n  // level to honor the user's choice.\r\n  //\r\n  //   gemini-3.1-pro-high \u2192 thinkingLevel: \"high\"\r\n  //   gemini-3.1-pro-low  \u2192 thinkingLevel: \"low\"\r\n  //   gemini-3-flash      \u2192 thinkingLevel: \"low\"   (flash default)\r\n  //   (other -flash, -lite preview, 2.5 family)   \u2192 thinkingBudget (legacy)\r\n  const thinkingConfig = resolveThinkingConfig(model, thinkingBudget)\r\n\r\n  const request: Record<string, unknown> = {\r\n    model,\r\n    contents,\r\n    generationConfig: {\r\n      maxOutputTokens,\r\n      topP: 0.95,\r\n      topK: 64,\r\n      thinkingConfig,\r\n    },\r\n    // Safety categories OFF \u2014 matches gemini-cli and CLIProxyAPI defaults so\r\n    // the model behaves the same way it does in its home environment.\r\n    safetySettings: [\r\n      { category: 'HARM_CATEGORY_HARASSMENT', threshold: 'OFF' },\r\n      { category: 'HARM_CATEGORY_HATE_SPEECH', threshold: 'OFF' },\r\n      { category: 'HARM_CATEGORY_SEXUALLY_EXPLICIT', threshold: 'OFF' },\r\n      { category: 'HARM_CATEGORY_DANGEROUS_CONTENT', threshold: 'OFF' },\r\n      { category: 'HARM_CATEGORY_CIVIC_INTEGRITY', threshold: 'BLOCK_NONE' },\r\n    ],\r\n  }\r\n\r\n  // Cache is mutually exclusive with inline system + tools \u2014 when the\r\n  // cachedContents API holds the stable portion, reference it and omit\r\n  // the duplicated fields. Otherwise send them inline every turn.\r\n  if (cacheName) {\r\n    request.cachedContent = cacheName\r\n  } else {\r\n    request.systemInstruction = { parts: [{ text: systemTextWithRules }] }\r\n    if (hasTools) {\r\n      request.tools = [{ functionDeclarations }]\r\n      // Server-side schema enforcement \u2014 Gemini rejects calls that don't\r\n      // match the declared schema BEFORE streaming them back, so empty-\r\n      // args hallucinations don't reach us (and don't burn tool-result\r\n      // retry cycles). This is the single most effective knob against\r\n      // the Flash empty-args problem the legacy adapter fought.\r\n      request.toolConfig = {\r\n        functionCallingConfig: { mode: 'VALIDATED' },\r\n      }\r\n    }\r\n  }\r\n\r\n  return request\r\n}\r\n\r\n// \u2500\u2500\u2500 Auth-error message formatting \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n//\r\n// A raw \"Gemini API error 403: The caller does not have permission\"\r\n// isn't actionable for the user. When the error is classified as\r\n// auth-stale / non-retryable / 401 / 403 we rewrite it into a message\r\n// that tells the user exactly what to do \u2014 and points at the right\r\n// remediation surface (Antigravity account page for Antigravity\r\n// models, /provider for OAuth refresh, /login for a fresh auth).\r\n\r\n// Antigravity-only model ids \u2014 these route through the Antigravity\r\n// quota pool and 403 if the user only has the Gemini-CLI OAuth token.\r\n// Kept in sync with the routing catalog in gemini_code_assist.ts.\nconst ANTIGRAVITY_ONLY_MODEL_IDS = ANTIGRAVITY_MODEL_IDS\n\r\nfunction buildAuthErrorMessage(err: any, model?: string): string {\r\n  const status = err?.status\r\n  const statusPrefix = status ? `Gemini ${status} ` : 'Gemini '\r\n  const detail = (err?.body && typeof err.body === 'string')\r\n    ? err.body.slice(0, 180).replace(/\\s+/g, ' ').trim()\r\n    : (err?.message ?? String(err))\r\n  const normalizedModel = model?.toLowerCase()\n  const isAntigravityOnly = !!normalizedModel && ANTIGRAVITY_ONLY_MODEL_IDS.has(normalizedModel)\n  const wireModel = isAntigravityOnly && model ? resolveAntigravityWireModel(model) : null\n  const modelLine = model ? `Model attempted: ${model}` : null\n  const wireModelLine = wireModel && wireModel !== model ? `Antigravity wire model: ${wireModel}` : null\n\r\n  // Antigravity-only models must stay on the Antigravity executor. Status\n  // determines whether the likely problem is OAuth/account access or an\n  // endpoint/wire-model rejection.\n\n  // Detect the Google \"ghost project\" 403 pattern. Per gemini-cli\r\n  // issues #24747 / #25189 / #25609, Google AI Pro/Ultra subscribers\r\n  // sometimes get an inaccessible cloudaicompanionProject auto-bound\r\n  // to their account; every Code Assist call then 403s. The only\r\n  // reliable client-side mitigation is a manual project override via\r\n  // GOOGLE_CLOUD_PROJECT.\r\n  const looksLikeGhostProject =\r\n    status === 403\r\n    && /cloudaicompanion|caller does not have permission|PERMISSION_DENIED/i.test(\r\n      typeof err?.body === 'string' ? err.body : String(err?.message ?? ''),\r\n    )\r\n\r\n  const lines = [\r\n    '',\r\n    '',\r\n    `${statusPrefix}request failed before it reached the model.`,\n    '',\r\n    ...(modelLine ? [modelLine, ''] : []),\n    ...(wireModelLine ? [wireModelLine, ''] : []),\n    `Server said: ${detail}`,\r\n    '',\r\n  ]\r\n\r\n  if (isAntigravityOnly) {\n    if (status === 404) {\n      lines.push(\n        'This model only routes through the Antigravity quota pool.',\n        'A 404 here means the Antigravity backend rejected the endpoint or wire model before generation started.',\n        'Tau sends Gemini 3.5 Flash through the model keys returned by Antigravity quota discovery and keeps the selected thinking level.',\n        'If this continues, run `/login antigravity` to refresh the Antigravity account or pick another model temporarily.',\n      )\n    } else {\n      lines.push(\n        'This model only routes through the Antigravity quota pool.',\n        'Make sure the Antigravity account is connected and has access:',\n        '  1. Run `/login antigravity` to refresh the Antigravity flow, or',\n        '  2. Pick a different Pro model (gemini-3.1-pro-preview,',\n        '     gemini-3-pro-preview, gemini-2.5-pro) which routes through',\n        '     the Gemini CLI executor.',\n      )\n    }\n  } else if (looksLikeGhostProject) {\n    lines.push(\r\n      'This is the known \"ghost cloudaicompanionProject\" 403 that hits',\r\n      'Google AI Pro/Ultra subscribers (gemini-cli issues #24747, #25189,',\r\n      '#25609). Google\\'s backend auto-binds an inaccessible project ID',\r\n      'to the account. The only reliable client-side fixes:',\r\n      '  1. Set `GOOGLE_CLOUD_PROJECT=<your-project-id>` (or',\r\n      '     `GEMINI_CLOUD_PROJECT`) and restart Tau \u2014 Tau will',\r\n      '     skip the auto-discovered project and use yours instead.',\r\n      '     (Grab a project id from console.cloud.google.com on the same',\r\n      '     Google account you logged in with.)',\r\n      '  2. If `/models` is also missing your Pro models, set',\r\n      '     `GEMINI_SHOW_PRO_MODELS=true` to force-show them \u2014 Google\\'s',\r\n      '     entitlement endpoints don\\'t always reflect AI Pro subscriptions.',\r\n      '  3. Run `/provider` and reconnect \u2014 sometimes the next loadCodeAssist',\r\n      '     returns a working project on retry.',\r\n      '  4. As a last resort, switch to API key (set GEMINI_API_KEY and',\r\n      '     GEMINI_SHOW_API_KEY_LOGIN=true), which uses a different endpoint.',\r\n    )\r\n  } else {\r\n    lines.push(\r\n      'What to do:',\r\n      '  1. Run `/provider` to refresh your Gemini OAuth token, or',\r\n      '  2. Run `/login` and re-authorize the Google account, or',\r\n      '  3. Open https://antigravity.google.com/ to confirm the account still has access.',\r\n      '',\r\n      'If you have multiple Google accounts enrolled, the lane will',\r\n      'automatically rotate to the next healthy account on the next request.',\r\n    )\r\n  }\r\n\r\n  return lines.join('\\n')\r\n}\r\n\r\nfunction buildQuotaErrorMessage(err: any, model?: string): string {\r\n  const status = err?.status\r\n  const details = err?.classification?.details\r\n  const serverMessage = typeof details?.message === 'string'\r\n    ? details.message\r\n    : extractGoogleErrorMessage(err?.body)\r\n      ?? (err?.message ?? String(err))\r\n  const retryAfterMs = typeof err?.retryAfterMs === 'number' ? err.retryAfterMs : undefined\r\n  const retryLine = retryAfterMs && retryAfterMs > 0\r\n    ? `Retry after: about ${Math.ceil(retryAfterMs / 1000)} seconds`\r\n    : null\r\n  const modelLine = model ? `Model attempted: ${model}` : null\r\n  const isAntigravityModel = !!model && ANTIGRAVITY_ONLY_MODEL_IDS.has(model.toLowerCase())\n\r\n  const lines = [\r\n    '',\r\n    '',\r\n    `${isAntigravityModel ? 'Antigravity' : 'Gemini'} request was throttled or capacity-limited${status ? ` (HTTP ${status})` : ''}.`,\r\n    '',\r\n    ...(modelLine ? [modelLine, ''] : []),\r\n    `Server said: ${serverMessage}`,\r\n    ...(retryLine ? ['', retryLine] : []),\r\n    '',\r\n  ]\r\n\r\n  if (isAntigravityModel) {\r\n    lines.push(\r\n      'Tau retried this request and, when possible, marked the selected account/model family for rotation.',\r\n      'This can happen even when the usage page shows remaining quota, because the backend can throttle an endpoint or request window separately.',\r\n      'What to do:',\r\n      '  1. Wait for the Antigravity request window or backend capacity to recover, or',\r\n      '  2. Add/switch another Antigravity account with `/login antigravity`, or',\r\n      '  3. Pick a non-Antigravity model for now, such as gemini-3.1-pro-preview, gemini-3-pro-preview, or gemini-2.5-pro.',\r\n    )\r\n  } else {\r\n    lines.push(\r\n      'What to do:',\r\n      '  1. Wait for quota/capacity to recover, or',\r\n      '  2. Switch model/account/provider and retry.',\r\n    )\r\n  }\r\n\r\n  return lines.join('\\n')\r\n}\r\n\r\nfunction extractGoogleErrorMessage(body: unknown): string | null {\r\n  if (typeof body !== 'string' || !body) return null\r\n  try {\r\n    const parsed = JSON.parse(body) as { error?: { message?: unknown }; message?: unknown }\r\n    const message = parsed.error?.message ?? parsed.message\r\n    return typeof message === 'string' ? message : null\r\n  } catch {\r\n    return null\r\n  }\r\n}\r\n\r\n// \u2500\u2500\u2500 System-prompt stable/volatile split \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n//\r\n// Tau emits `__SYSTEM_PROMPT_DYNAMIC_BOUNDARY__` as a separator\r\n// between cacheable (stable) and per-turn (volatile) content. When the\r\n// caller forwards a flat system string to the lane, we split on that\r\n// marker so our `cachedContents` body sees only stable bytes and the\r\n// cache key survives turn-to-turn. Falling back: if no marker found,\r\n// treat the whole thing as stable \u2014 matches previous behavior, no\r\n// regression for callers that haven't adopted the marker.\r\n\r\nconst DYNAMIC_BOUNDARY = '__SYSTEM_PROMPT_DYNAMIC_BOUNDARY__'\r\n\r\nfunction splitSystemAtBoundary(text: string): {\r\n  stableText: string\r\n  volatileText: string\r\n} {\r\n  if (!text) return { stableText: '', volatileText: '' }\r\n  const idx = text.indexOf(DYNAMIC_BOUNDARY)\r\n  if (idx < 0) return { stableText: text, volatileText: '' }\r\n  return {\r\n    stableText: text.slice(0, idx).replace(/\\s+$/, ''),\r\n    volatileText: text.slice(idx + DYNAMIC_BOUNDARY.length).replace(/^\\s+/, ''),\r\n  }\r\n}\r\n\r\n// \u2500\u2500\u2500 Singleton Export \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport const geminiLane = new GeminiLane()\r\n", "/**\r\n * System-prompt slot boundary \u2014 shared cache discipline for every lane.\r\n *\r\n * Cache keys (Anthropic `cache_control`, Gemini `cachedContents`, OpenAI\r\n * `prompt_cache_key`) are byte-identity hashes over the stable section\r\n * of the system prompt. If env / git status / memory bleed into that\r\n * section, the hash mutates each turn and the cache never hits after\r\n * the first request.\r\n *\r\n * This module enforces the split at the type level:\r\n *\r\n *   - Stable slot   \u2014 cross-turn identical content: preamble, core\r\n *                     mandates, workflow descriptions, tool usage\r\n *                     guidelines, skills context, MCP intro. Feeds the\r\n *                     cache key.\r\n *   - Volatile slot \u2014 per-turn content: memory (CLAUDE.md etc.),\r\n *                     environment block, git status, date. Lives\r\n *                     AFTER the cache boundary \u2014 inline in the first\r\n *                     user message, or in a trailing system block past\r\n *                     the last cache_control breakpoint.\r\n *\r\n * Lanes MUST use `StableSlot.toString()` for cache-keying fields and\r\n * `VolatileSlot.toString()` for everywhere else. The type brands are\r\n * there to make \"I passed volatile content to the cache field\" a\r\n * compile-time error, not a production cache-miss.\r\n */\r\n\r\nimport type { SystemPromptParts } from '../types.js'\r\n\r\n// \u2500\u2500\u2500 Branded types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\ndeclare const __stableSlotBrand: unique symbol\r\ndeclare const __volatileSlotBrand: unique symbol\r\n\r\nexport type StableSlot = string & { readonly [__stableSlotBrand]: 'stable' }\r\nexport type VolatileSlot = string & { readonly [__volatileSlotBrand]: 'volatile' }\r\n\r\n// \u2500\u2500\u2500 Stable rendering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n/**\r\n * Render the stable portion of a system prompt from SystemPromptParts.\r\n *\r\n * ONLY cross-turn-stable sections are eligible:\r\n *   - customInstructions (from user config / env)\r\n *   - toolsAddendum (from hooks or skill metadata)\r\n *   - mcpIntro (list of active MCP servers)\r\n *   - skillsContext (active skill definitions)\r\n *\r\n * Each lane pre-pends its own preamble / core-mandates / workflow /\r\n * tool-usage / operational-guidelines to this string. Those are also\r\n * stable (they depend only on model family) and belong in the cache\r\n * key too \u2014 lanes call `stableFrom(laneSpecificPreamble, parts)` to\r\n * get the composed stable slot.\r\n */\r\nexport function renderStableSlot(parts: SystemPromptParts): StableSlot {\r\n  const sections: string[] = []\r\n  if (parts.customInstructions) {\r\n    sections.push(`## Additional Instructions\\n\\n${parts.customInstructions}`)\r\n  }\r\n  if (parts.toolsAddendum) {\r\n    sections.push(`## Tool Configuration\\n\\n${parts.toolsAddendum}`)\r\n  }\r\n  if (parts.mcpIntro) {\r\n    sections.push(`## MCP Tools\\n\\n${parts.mcpIntro}`)\r\n  }\r\n  if (parts.skillsContext) {\r\n    sections.push(\r\n      `## Available Skills\\n\\n<available_skills>\\n${parts.skillsContext}\\n</available_skills>`,\r\n    )\r\n  }\r\n  return sections.join('\\n\\n') as StableSlot\r\n}\r\n\r\n/**\r\n * Compose a lane-specific stable preamble with the user/project\r\n * instructions. The first argument is the lane's hand-written static\r\n * block (preamble + mandates + workflow + tool-usage + guidelines \u2014\r\n * same every turn). The second is the user-derived stable content.\r\n */\r\nexport function stableFrom(\r\n  lanePreamble: string,\r\n  parts: SystemPromptParts,\r\n): StableSlot {\r\n  const user = renderStableSlot(parts)\r\n  return (user ? `${lanePreamble}\\n\\n${user}` : lanePreamble) as StableSlot\r\n}\r\n\r\n// \u2500\u2500\u2500 Volatile rendering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n/**\r\n * Render the volatile portion \u2014 content that changes turn-to-turn.\r\n *\r\n * Volatile sections:\r\n *   - memory (CLAUDE.md / GEMINI.md / AGENTS.md / QWEN.md merged)\r\n *   - environment (cwd, date, os, shell)\r\n *   - gitStatus (branch, dirty/clean, ahead/behind)\r\n *\r\n * Lanes place this AFTER the cache boundary. Concrete placement per\r\n * lane:\r\n *   - Gemini \u2192 first user message in `contents[]`, never in\r\n *              `systemInstruction` when `cachedContent` is in use\r\n *   - Claude \u2192 trailing system block after the last `cache_control`\r\n *              breakpoint (or inlined as a user context message)\r\n *   - Codex  \u2192 leading input item, marked with `cache_control: false`\r\n *   - Compat \u2192 prepended to the first user message text, or a separate\r\n *              `role: 'system'` message AFTER the cached system block\r\n */\r\nexport function renderVolatileSlot(parts: SystemPromptParts): VolatileSlot {\r\n  const sections: string[] = []\r\n  if (parts.memory) {\r\n    sections.push(`## Context\\n\\n<loaded_context>\\n${parts.memory}\\n</loaded_context>`)\r\n  }\r\n  if (parts.environment || parts.gitStatus) {\r\n    const envParts: string[] = []\r\n    if (parts.environment) envParts.push(parts.environment)\r\n    if (parts.gitStatus) envParts.push(`Git status:\\n${parts.gitStatus}`)\r\n    sections.push(`## Environment\\n\\n${envParts.join('\\n\\n')}`)\r\n  }\r\n  return sections.join('\\n\\n') as VolatileSlot\r\n}\r\n\r\n// \u2500\u2500\u2500 Cache key derivation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n/**\r\n * Deterministic cache key for a stable slot. Lanes that need a key to\r\n * pass along (Codex `prompt_cache_key`, Gemini `cachedContents.name`,\r\n * etc.) call this helper so the key stays identical across turns.\r\n *\r\n * Uses SHA-256 via Node crypto. Prefix with `claudex:` so the key\r\n * namespace is distinguishable from other consumers if the upstream\r\n * ever cross-indexes.\r\n */\r\nexport function cacheKeyOf(slot: StableSlot | string): string {\r\n  // Lazy require \u2014 keeps the module tree-shakable for contexts that\r\n  // only need the branded types.\r\n  // eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports\r\n  const { createHash } = require('crypto') as typeof import('crypto')\r\n  const h = createHash('sha256').update(slot).digest('hex')\r\n  return `claudex:${h.slice(0, 32)}`\r\n}\r\n\r\n// \u2500\u2500\u2500 Convenience \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n/**\r\n * Glue both slots into one string for lanes that need a single system\r\n * prompt and don't support a separate cache surface (Ollama, xAI, etc).\r\n * The caller loses cache benefit when using this path \u2014 intended only\r\n * for lanes that can't carry the split natively.\r\n */\r\nexport function flatten(stable: StableSlot, volatile: VolatileSlot): string {\r\n  if (!volatile) return stable\r\n  if (!stable) return volatile\r\n  return `${stable}\\n\\n${volatile}`\r\n}\r\n", "/**\r\n * Gemini Lane \u2014 Native System Prompt Assembly\r\n *\r\n * Builds the system prompt in the structure Gemini was post-trained on.\r\n * The template matches gemini-cli's prompt layout (from packages/core/src/prompts/).\r\n *\r\n * Sections:\r\n *   1. Preamble \u2014 agent identity and mode\r\n *   2. Core Mandates \u2014 security and engineering standards\r\n *   3. Workflows \u2014 research \u2192 strategy \u2192 execution\r\n *   4. Tool Usage \u2014 how to use each tool effectively\r\n *   5. Operational Guidelines \u2014 tone, style, conventions\r\n *   6. Git Repository \u2014 git workflow if applicable\r\n *   7. Memory/Context \u2014 injected from Tau shared layer\r\n *   8. Environment \u2014 volatile per-turn info (cwd, date, git status)\r\n *\r\n * Sections 1-6 are STABLE (cacheable). Sections 7-8 are VOLATILE.\r\n * The boundary is marked so the Gemini cache manager hashes only stable content.\r\n */\r\n\r\nimport type { SystemPromptParts } from '../types.js'\r\nimport {\n  type StableSlot,\n  type VolatileSlot,\n  stableFrom,\n  renderVolatileSlot,\n  flatten,\n} from '../shared/system_slots.js'\nimport { WEB_SEARCH_AUTO_USE_GUIDANCE } from '../../tools/WebSearchTool/prompt.js'\n\r\n// \u2500\u2500\u2500 Model-Family Detection \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\ntype GeminiFamily = 'gemini-3' | 'default-legacy'\r\n\r\nfunction detectFamily(model: string): GeminiFamily {\r\n  const m = model.toLowerCase()\r\n  if (/gemini-3(\\.|-|$)/.test(m) || /gemini-4/.test(m)) return 'gemini-3'\r\n  return 'default-legacy'\r\n}\r\n\r\n// \u2500\u2500\u2500 Stable Prompt Sections \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nfunction preamble(family: GeminiFamily): string {\r\n  return `You are an interactive AI coding agent. You are pair-programming with the user to solve their coding task.\r\nThe task may require creating a new codebase, modifying or debugging an existing codebase, or simply answering a question.\r\n\r\nEach time the user sends a message, carefully assess what information you need. Use your tools to efficiently gather context, then provide a response.`\r\n}\r\n\r\nfunction coreMandates(): string {\r\n  return `## Core Mandates\r\n\r\n### Security\r\n- NEVER expose credentials, API keys, tokens, or secrets in output or tool calls\r\n- NEVER execute commands that could exfiltrate data or compromise the system\r\n- If asked to do something potentially harmful, explain the risk and suggest a safe alternative\r\n\r\n### Engineering Standards\r\n- Write clean, idiomatic, well-structured code\r\n- Follow existing project conventions and patterns\r\n- Prefer editing existing files over creating new ones\r\n- Test your changes when possible\r\n- Do not add unnecessary complexity, comments, or abstractions`\r\n}\r\n\r\nfunction workflows(family: GeminiFamily): string {\r\n  if (family === 'gemini-3') {\r\n    return `## Workflow\r\n\r\nFor each task, follow this workflow:\r\n1. **Research** \u2014 Read relevant files, search the codebase, understand context\r\n2. **Strategy** \u2014 Plan your approach before writing code\r\n3. **Execute** \u2014 Make changes, test them, verify correctness\r\n4. **Report** \u2014 Summarize what you did and why\r\n\r\nUse \\`enter_plan_mode\\` for complex tasks that need careful research before implementation.`\r\n  }\r\n\r\n  return `## Workflow\r\n\r\nFollow this general approach for each task:\r\n1. Gather context \u2014 read relevant files, search the codebase\r\n2. Plan your approach \u2014 think before coding\r\n3. Make changes \u2014 edit files, run commands\r\n4. Verify \u2014 test your changes work correctly\r\n5. Summarize \u2014 tell the user what you did`\r\n}\r\n\r\nfunction toolUsageGuidelines(): string {\r\n  return `## Tool Usage\r\n\r\n- **read_file**: Read files before editing them. Use start_line/end_line for large files.\r\n- **replace**: Include 3+ lines of surrounding context in old_string for unique matching. Check the file content first.\r\n- **run_shell_command**: Include a description of what the command does. Prefer dedicated tools (read_file, grep_search) over shell equivalents (cat, grep).\n- **grep_search**: Use for searching code content. Preferred over run_shell_command with grep.\n- **glob**: Use for finding files by pattern. Preferred over run_shell_command with find.\n- **google_web_search**: ${WEB_SEARCH_AUTO_USE_GUIDANCE}\n- **web_fetch**: Use to read web pages, documentation URLs, or GitHub files.\n\r\nDo NOT use tools when you can answer from context. Do NOT read files you've already read in this conversation unless they may have changed.`\r\n}\r\n\r\nfunction operationalGuidelines(): string {\r\n  return `## Guidelines\r\n\r\n- Be concise. Don't repeat what the user already knows.\r\n- When referencing code, include file paths.\r\n- Don't add features, refactoring, or \"improvements\" beyond what was asked.\r\n- A bug fix doesn't need surrounding code cleaned up.\r\n- Don't add error handling for scenarios that can't happen.\r\n- When making changes, verify they work before reporting completion.\r\n- If you're unsure about something, ask the user rather than guessing.\r\n- When a tool call fails, diagnose first: read the exit code/error text, verify what's installed/available and the right path, then run a focused correction. Investigation (\\`which X\\`, \\`X --help\\`, \\`ls path\\`, docs) is work, but the next step is the corrected retry.\r\n- Keep the failure balance: don't retry blindly, don't abandon a viable approach after one failure, and don't punt/paste commands to the user. If you start a background retry, keep monitoring output until it finishes or gives actionable evidence; don't end with only \"retry started\".\r\n- Bash autonomy: run shell commands yourself by default. \\`! <cmd>\\` paste-to-user is for interactive logins/TUIs, not routine installs or config.\r\n- Skills: if \\`/skill-name\\` is invoked or a listed relevant skill is surfaced, use the Skill tool. Only use listed skills; don't invent names.\r\n- Subagents: for broad exploration, deep research, or independent parallel work, delegate with the Agent tool and matching \\`subagent_type\\`; don't duplicate that work.\r\n- MCP management (\\`claude mcp add <name> <cmd>\\`, \\`claude mcp list\\`, \\`claude mcp remove\\`) is normal Bash. Run it yourself; don't paste it to the user.\r\n- For unfamiliar CLIs, libraries, or APIs, verify the exact syntax once (\\`--help\\`, official docs, the tool's source) instead of guessing flags and iterating.`\r\n}\r\n\r\nfunction gitRepoSection(): string {\r\n  return `## Git Repository\r\n\r\nThis workspace is a git repository. When working with git:\r\n- Read diffs and status before committing\r\n- Write clear, descriptive commit messages\r\n- Don't force push or use destructive git operations without asking\r\n- Prefer creating new commits over amending existing ones`\r\n}\r\n\r\n// \u2500\u2500\u2500 Full Prompt Assembly \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n/**\r\n * Assemble the complete Gemini system prompt.\r\n *\r\n * Returns `{ stable, volatile }` \u2014 only the stable slot may feed the\r\n * Gemini `cachedContents` key; the volatile slot goes inline as a\r\n * leading user message so the cache key stays byte-identical across\r\n * turns when only env/git/memory change.\r\n */\r\nexport function assembleGeminiSystemPrompt(\r\n  model: string,\r\n  parts: SystemPromptParts,\r\n): { stable: StableSlot; volatile: VolatileSlot; full: string } {\r\n  const family = detectFamily(model)\r\n\r\n  // Lane preamble = preamble + mandates + workflow + tool-usage +\r\n  // guidelines + git-section. Same every turn; belongs in cache key.\r\n  const lanePreamble = [\r\n    preamble(family),\r\n    coreMandates(),\r\n    workflows(family),\r\n    toolUsageGuidelines(),\r\n    operationalGuidelines(),\r\n    gitRepoSection(),\r\n  ].join('\\n\\n')\r\n\r\n  // Stable slot: lane preamble + user/project stable additions\r\n  // (customInstructions, toolsAddendum, mcpIntro, skillsContext).\r\n  const stable = stableFrom(lanePreamble, parts)\r\n\r\n  // Volatile slot: memory + environment + git status.\r\n  const volatile = renderVolatileSlot(parts)\r\n\r\n  // `full` keeps the flat form for lanes/paths that can't carry the\r\n  // split (e.g. non-cached legacy shim path). No boundary marker \u2014\r\n  // that was a Claude-Code leak; Gemini doesn't read it.\r\n  const full = flatten(stable, volatile)\r\n\r\n  return { stable, volatile, full }\r\n}\r\n\r\n/**\r\n * Build the `systemInstruction` field for the Gemini API using ONLY\r\n * the stable slot \u2014 so its bytes match across turns and `cachedContents`\r\n * can hit. The volatile slot travels as a leading user message and is\r\n * wired separately by the lane's request builder.\r\n */\r\nexport function buildGeminiSystemInstruction(\r\n  model: string,\r\n  parts: SystemPromptParts,\r\n): { parts: Array<{ text: string }> } {\r\n  const { stable } = assembleGeminiSystemPrompt(model, parts)\r\n  return { parts: [{ text: stable }] }\r\n}\r\n\r\n/**\r\n * Legacy/debug helper: flat system prompt with stable+volatile joined.\r\n * Lanes/paths that can't carry the split use this; they forgo caching.\r\n */\r\nexport function buildFlatGeminiSystemPrompt(\r\n  model: string,\r\n  parts: SystemPromptParts,\r\n): string {\r\n  const { full } = assembleGeminiSystemPrompt(model, parts)\r\n  return full\r\n}\r\n", "/**\r\n * Gemini Lane \u2014 Entry Point\r\n *\r\n * Exports the Gemini lane instance and handles initialization.\r\n * Call initGeminiLane() at startup to configure auth and register\r\n * with the dispatcher.\r\n */\r\n\r\nexport { geminiLane, GeminiLane } from './loop.js'\r\nexport { GEMINI_TOOL_REGISTRY, buildGeminiFunctionDeclarations } from './tools.js'\r\nexport { assembleGeminiSystemPrompt, buildGeminiSystemInstruction } from './prompt.js'\r\nexport { geminiApi, GeminiApiError } from './api.js'\r\n\r\nimport { geminiLane } from './loop.js'\r\nimport { geminiApi } from './api.js'\r\nimport { registerLane } from '../dispatcher.js'\r\n\r\n/**\r\n * Initialize the Gemini lane.\r\n *\r\n * Configures the API client with available auth credentials and\r\n * registers the lane with the dispatcher.\r\n *\r\n * Auth resolution order:\r\n * 1. GEMINI_API_KEY env var\r\n * 2. Stored API key from /login\r\n * 3. OAuth token from gemini-cli or Antigravity login\r\n *\r\n * Call this once at startup, after auth is resolved.\r\n */\r\nexport function initGeminiLane(opts?: {\r\n  apiKey?: string\r\n  /** Deprecated single-token path. Use cliOAuthToken / antigravityOAuthToken. */\r\n  oauthToken?: string\r\n  oauthMode?: 'cli' | 'antigravity'\r\n  /** OAuth token from Gemini CLI flow (free-tier flash/lite models). */\r\n  cliOAuthToken?: string\r\n  /** OAuth token from Antigravity flow (Gemini 3.x pro/flash/image models). */\r\n  antigravityOAuthToken?: string\r\n}): void {\r\n  // Configure API client with auth. OAuth tokens can come from the Code\r\n  // Assist CLI flow (free tier) or the Antigravity flow (gray-area). The\r\n  // lane routes per-model to the right executor via executorForModel.\r\n  const apiKey = opts?.apiKey ?? process.env.GEMINI_API_KEY\r\n\r\n  geminiApi.configure({\r\n    apiKey,\r\n    oauthToken: opts?.oauthToken,\r\n    oauthMode: opts?.oauthMode,\r\n    cliOAuthToken: opts?.cliOAuthToken,\r\n    antigravityOAuthToken: opts?.antigravityOAuthToken,\r\n  })\r\n\r\n  // Register with the dispatcher\r\n  registerLane(geminiLane)\r\n\r\n  // Mark healthy if auth is available\r\n  geminiLane.setHealthy(geminiApi.isConfigured)\r\n}\r\n", "/**\n * apply_patch \u2014 shared edit primitive\n *\n * Ported line-for-line from codex-rs/apply-patch/src/parser.rs and lib.rs.\n * This is the format OpenAI's Codex models were post-trained on; keeping\n * the behavior identical to the Rust reference is non-negotiable because\n * any drift shows up as quiet quality regressions on edit-heavy tasks.\n *\n * Used by:\n *   - Codex lane (native apply_patch tool)\n *   - Any other lane that wants apply_patch as an opt-in edit primitive\n *\n * Format (Lark grammar from parser.rs):\n *   start: begin_patch hunk+ end_patch\n *   begin_patch: \"*** Begin Patch\" LF\n *   end_patch:   \"*** End Patch\" LF?\n *   hunk: add_hunk | delete_hunk | update_hunk\n *   add_hunk:    \"*** Add File: \" filename LF add_line+\n *   delete_hunk: \"*** Delete File: \" filename LF\n *   update_hunk: \"*** Update File: \" filename LF change_move? change?\n *   change_move: \"*** Move to: \" filename LF\n *   change: (change_context | change_line)+ eof_line?\n *   change_context: (\"@@\" | \"@@ \" /(.+)/) LF\n *   change_line: (\"+\" | \"-\" | \" \") /(.+)/ LF\n *   eof_line: \"*** End of File\" LF\n *\n * Lenient mode tolerates heredoc wrapping like `<<'EOF' ... EOF` (GPT-4.1\n * emits this when it mistakes local_shell for a real shell).\n */\n\n// \u2500\u2500\u2500 Markers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst BEGIN_PATCH_MARKER = '*** Begin Patch'\nconst END_PATCH_MARKER = '*** End Patch'\nconst ADD_FILE_MARKER = '*** Add File: '\nconst DELETE_FILE_MARKER = '*** Delete File: '\nconst UPDATE_FILE_MARKER = '*** Update File: '\nconst MOVE_TO_MARKER = '*** Move to: '\nconst EOF_MARKER = '*** End of File'\nconst CHANGE_CONTEXT_MARKER = '@@ '\nconst EMPTY_CHANGE_CONTEXT_MARKER = '@@'\n\n// Parse leniently by default, matching Codex Rust's PARSE_IN_STRICT_MODE = false.\nconst DEFAULT_LENIENT = true\n\n// \u2500\u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type Hunk =\n  | { kind: 'add'; path: string; contents: string }\n  | { kind: 'delete'; path: string }\n  | { kind: 'update'; path: string; movePath?: string; chunks: UpdateFileChunk[] }\n\nexport interface UpdateFileChunk {\n  /** Single line of context used to narrow down chunk position (often a function/class header). */\n  changeContext?: string\n  /** Contiguous lines to be replaced. Must occur strictly after changeContext. */\n  oldLines: string[]\n  /** Replacement lines. */\n  newLines: string[]\n  /** When true, oldLines must occur at end of file. */\n  isEndOfFile: boolean\n}\n\nexport interface ApplyPatchArgs {\n  patch: string\n  hunks: Hunk[]\n  workdir?: string\n}\n\nexport class ApplyPatchParseError extends Error {\n  constructor(public readonly kind: 'invalid_patch' | 'invalid_hunk', message: string, public readonly lineNumber?: number) {\n    super(message)\n    this.name = 'ApplyPatchParseError'\n  }\n}\n\n// \u2500\u2500\u2500 Parser \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Parse an apply_patch body into its hunks. Throws ApplyPatchParseError on\n * malformed input. Accepts heredoc-wrapped bodies when lenient=true (default).\n */\nexport function parsePatch(patch: string, opts?: { lenient?: boolean }): ApplyPatchArgs {\n  const lenient = opts?.lenient ?? DEFAULT_LENIENT\n  let lines = patch.trim().split('\\n')\n\n  try {\n    checkPatchBoundariesStrict(lines)\n  } catch (err) {\n    if (lenient && err instanceof ApplyPatchParseError && err.kind === 'invalid_patch') {\n      const innerLines = checkPatchBoundariesLenient(lines, err)\n      lines = innerLines\n    } else {\n      throw err\n    }\n  }\n\n  const hunks: Hunk[] = []\n  const lastIndex = Math.max(lines.length - 1, 0)\n  let remaining = lines.slice(1, lastIndex)\n  let lineNumber = 2\n\n  while (remaining.length > 0) {\n    const { hunk, consumed } = parseOneHunk(remaining, lineNumber)\n    hunks.push(hunk)\n    lineNumber += consumed\n    remaining = remaining.slice(consumed)\n  }\n\n  return {\n    patch: lines.join('\\n'),\n    hunks,\n    workdir: undefined,\n  }\n}\n\nfunction checkPatchBoundariesStrict(lines: string[]): void {\n  const first = lines.length > 0 ? lines[0].trim() : undefined\n  const last = lines.length > 0 ? lines[lines.length - 1].trim() : undefined\n\n  if (first === BEGIN_PATCH_MARKER && last === END_PATCH_MARKER) return\n\n  if (first !== BEGIN_PATCH_MARKER) {\n    throw new ApplyPatchParseError(\n      'invalid_patch',\n      \"The first line of the patch must be '*** Begin Patch'\",\n    )\n  }\n  throw new ApplyPatchParseError(\n    'invalid_patch',\n    \"The last line of the patch must be '*** End Patch'\",\n  )\n}\n\n// GPT-4.1 emits heredoc-wrapped patches via local_shell. Codex Rust strips\n// `<<EOF`, `<<'EOF'`, `<<\"EOF\"` openings and any `...EOF` closings.\nfunction checkPatchBoundariesLenient(\n  original: string[],\n  originalError: ApplyPatchParseError,\n): string[] {\n  if (original.length < 4) throw originalError\n  const first = original[0]\n  const last = original[original.length - 1]\n  const isHeredoc = first === '<<EOF' || first === \"<<'EOF'\" || first === '<<\"EOF\"'\n  if (!isHeredoc) throw originalError\n  if (!last.endsWith('EOF')) throw originalError\n\n  const inner = original.slice(1, original.length - 1)\n  checkPatchBoundariesStrict(inner) // rethrows if still invalid\n  return inner\n}\n\nfunction parseOneHunk(\n  lines: string[],\n  lineNumber: number,\n): { hunk: Hunk; consumed: number } {\n  const first = lines[0].trim()\n\n  if (first.startsWith(ADD_FILE_MARKER)) {\n    const path = first.slice(ADD_FILE_MARKER.length)\n    let contents = ''\n    let consumed = 1\n    for (const line of lines.slice(1)) {\n      if (line.startsWith('+')) {\n        contents += line.slice(1) + '\\n'\n        consumed++\n      } else {\n        break\n      }\n    }\n    return {\n      hunk: { kind: 'add', path, contents },\n      consumed,\n    }\n  }\n\n  if (first.startsWith(DELETE_FILE_MARKER)) {\n    const path = first.slice(DELETE_FILE_MARKER.length)\n    return {\n      hunk: { kind: 'delete', path },\n      consumed: 1,\n    }\n  }\n\n  if (first.startsWith(UPDATE_FILE_MARKER)) {\n    const path = first.slice(UPDATE_FILE_MARKER.length)\n    let remaining = lines.slice(1)\n    let consumed = 1\n\n    // Optional *** Move to: line\n    let movePath: string | undefined\n    if (remaining[0]?.startsWith(MOVE_TO_MARKER)) {\n      movePath = remaining[0].slice(MOVE_TO_MARKER.length)\n      remaining = remaining.slice(1)\n      consumed++\n    }\n\n    const chunks: UpdateFileChunk[] = []\n    while (remaining.length > 0) {\n      // Skip blank lines between chunks\n      if (remaining[0].trim() === '') {\n        consumed++\n        remaining = remaining.slice(1)\n        continue\n      }\n      // Next hunk marker ends this one\n      if (remaining[0].startsWith('***')) break\n\n      const { chunk, consumed: chunkConsumed } = parseUpdateFileChunk(\n        remaining,\n        lineNumber + consumed,\n        chunks.length === 0,\n      )\n      chunks.push(chunk)\n      consumed += chunkConsumed\n      remaining = remaining.slice(chunkConsumed)\n    }\n\n    if (chunks.length === 0) {\n      throw new ApplyPatchParseError(\n        'invalid_hunk',\n        `Update file hunk for path '${path}' is empty`,\n        lineNumber,\n      )\n    }\n\n    return {\n      hunk: { kind: 'update', path, movePath, chunks },\n      consumed,\n    }\n  }\n\n  throw new ApplyPatchParseError(\n    'invalid_hunk',\n    `'${first}' is not a valid hunk header. Valid hunk headers: '*** Add File: {path}', '*** Delete File: {path}', '*** Update File: {path}'`,\n    lineNumber,\n  )\n}\n\nfunction parseUpdateFileChunk(\n  lines: string[],\n  lineNumber: number,\n  allowMissingContext: boolean,\n): { chunk: UpdateFileChunk; consumed: number } {\n  if (lines.length === 0) {\n    throw new ApplyPatchParseError(\n      'invalid_hunk',\n      'Update hunk does not contain any lines',\n      lineNumber,\n    )\n  }\n\n  let startIndex = 0\n  let changeContext: string | undefined\n\n  if (lines[0] === EMPTY_CHANGE_CONTEXT_MARKER) {\n    changeContext = undefined\n    startIndex = 1\n  } else if (lines[0].startsWith(CHANGE_CONTEXT_MARKER)) {\n    changeContext = lines[0].slice(CHANGE_CONTEXT_MARKER.length)\n    startIndex = 1\n  } else {\n    if (!allowMissingContext) {\n      throw new ApplyPatchParseError(\n        'invalid_hunk',\n        `Expected update hunk to start with a @@ context marker, got: '${lines[0]}'`,\n        lineNumber,\n      )\n    }\n    changeContext = undefined\n    startIndex = 0\n  }\n\n  if (startIndex >= lines.length) {\n    throw new ApplyPatchParseError(\n      'invalid_hunk',\n      'Update hunk does not contain any lines',\n      lineNumber + 1,\n    )\n  }\n\n  const chunk: UpdateFileChunk = {\n    changeContext,\n    oldLines: [],\n    newLines: [],\n    isEndOfFile: false,\n  }\n  let parsedLines = 0\n\n  for (let i = startIndex; i < lines.length; i++) {\n    const line = lines[i]\n    if (line === EOF_MARKER) {\n      if (parsedLines === 0) {\n        throw new ApplyPatchParseError(\n          'invalid_hunk',\n          'Update hunk does not contain any lines',\n          lineNumber + 1,\n        )\n      }\n      chunk.isEndOfFile = true\n      parsedLines++\n      break\n    }\n\n    if (line.length === 0) {\n      chunk.oldLines.push('')\n      chunk.newLines.push('')\n    } else {\n      const ch = line[0]\n      if (ch === ' ') {\n        chunk.oldLines.push(line.slice(1))\n        chunk.newLines.push(line.slice(1))\n      } else if (ch === '+') {\n        chunk.newLines.push(line.slice(1))\n      } else if (ch === '-') {\n        chunk.oldLines.push(line.slice(1))\n      } else {\n        if (parsedLines === 0) {\n          throw new ApplyPatchParseError(\n            'invalid_hunk',\n            `Unexpected line found in update hunk: '${line}'. Every line should start with ' ' (context line), '+' (added line), or '-' (removed line)`,\n            lineNumber + 1,\n          )\n        }\n        // Start of next hunk \u2014 stop consuming.\n        break\n      }\n    }\n    parsedLines++\n  }\n\n  return { chunk, consumed: parsedLines + startIndex }\n}\n\n// \u2500\u2500\u2500 Applicator (seek_sequence port) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Find `pattern` within `lines` starting at or after `start`. Tries exact\n * match first, then rstrip-equal, then trim-equal, then Unicode-normalized\n * match. Mirrors seek_sequence.rs \u2014 same fallback ladder, same tolerances.\n */\nexport function seekSequence(\n  lines: string[],\n  pattern: string[],\n  start: number,\n  eof: boolean,\n): number | null {\n  if (pattern.length === 0) return start\n  if (pattern.length > lines.length) return null\n\n  const searchStart = eof && lines.length >= pattern.length\n    ? lines.length - pattern.length\n    : start\n  const maxStart = lines.length - pattern.length\n\n  // Exact match\n  for (let i = searchStart; i <= maxStart; i++) {\n    if (arraysEqual(lines.slice(i, i + pattern.length), pattern)) return i\n  }\n  // rstrip match\n  for (let i = searchStart; i <= maxStart; i++) {\n    if (rangeEquals(lines, i, pattern, rtrim)) return i\n  }\n  // trim match\n  for (let i = searchStart; i <= maxStart; i++) {\n    if (rangeEquals(lines, i, pattern, (s) => s.trim())) return i\n  }\n  // Unicode-normalized match\n  for (let i = searchStart; i <= maxStart; i++) {\n    if (rangeEquals(lines, i, pattern, normalize)) return i\n  }\n  return null\n}\n\nfunction arraysEqual(a: string[], b: string[]): boolean {\n  if (a.length !== b.length) return false\n  for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false\n  return true\n}\n\nfunction rangeEquals(\n  lines: string[],\n  start: number,\n  pattern: string[],\n  transform: (s: string) => string,\n): boolean {\n  for (let i = 0; i < pattern.length; i++) {\n    if (transform(lines[start + i]) !== transform(pattern[i])) return false\n  }\n  return true\n}\n\nfunction rtrim(s: string): string {\n  return s.replace(/\\s+$/, '')\n}\n\n// Normalize Unicode punctuation / NBSP so diffs authored in ASCII can apply\n// to source containing typographic dashes, smart quotes, NBSPs, etc.\nfunction normalize(s: string): string {\n  return s\n    .trim()\n    .replace(/[\\u2010\\u2011\\u2012\\u2013\\u2014\\u2015\\u2212]/g, '-')\n    .replace(/[\\u2018\\u2019\\u201A\\u201B]/g, \"'\")\n    .replace(/[\\u201C\\u201D\\u201E\\u201F]/g, '\"')\n    .replace(/[\\u00A0\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000]/g, ' ')\n}\n\n// \u2500\u2500\u2500 Replacement computation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface Replacement {\n  startIndex: number\n  oldLen: number\n  newLines: string[]\n}\n\nexport function computeReplacements(\n  originalLines: string[],\n  path: string,\n  chunks: UpdateFileChunk[],\n): Replacement[] {\n  const replacements: Replacement[] = []\n  let lineIndex = 0\n\n  for (const chunk of chunks) {\n    if (chunk.changeContext) {\n      const idx = seekSequence(originalLines, [chunk.changeContext], lineIndex, false)\n      if (idx === null) {\n        throw new ApplyPatchParseError(\n          'invalid_patch',\n          `Failed to find context '${chunk.changeContext}' in ${path}`,\n        )\n      }\n      lineIndex = idx + 1\n    }\n\n    if (chunk.oldLines.length === 0) {\n      // Pure addition \u2014 append at end (or just before trailing empty line).\n      const insertionIdx = originalLines.length > 0\n        && originalLines[originalLines.length - 1] === ''\n        ? originalLines.length - 1\n        : originalLines.length\n      replacements.push({\n        startIndex: insertionIdx,\n        oldLen: 0,\n        newLines: [...chunk.newLines],\n      })\n      continue\n    }\n\n    let pattern: string[] = chunk.oldLines\n    let newSlice: string[] = chunk.newLines\n    let found = seekSequence(originalLines, pattern, lineIndex, chunk.isEndOfFile)\n\n    // If the last line of the pattern is empty (common when the model wrote\n    // a trailing newline), retry without it \u2014 original_lines had its trailing\n    // empty stripped before we passed it in.\n    if (found === null && pattern.length > 0 && pattern[pattern.length - 1] === '') {\n      pattern = pattern.slice(0, -1)\n      if (newSlice.length > 0 && newSlice[newSlice.length - 1] === '') {\n        newSlice = newSlice.slice(0, -1)\n      }\n      found = seekSequence(originalLines, pattern, lineIndex, chunk.isEndOfFile)\n    }\n\n    if (found === null) {\n      throw new ApplyPatchParseError(\n        'invalid_patch',\n        `Failed to find expected lines in ${path}:\\n${chunk.oldLines.join('\\n')}`,\n      )\n    }\n\n    replacements.push({\n      startIndex: found,\n      oldLen: pattern.length,\n      newLines: [...newSlice],\n    })\n    lineIndex = found + pattern.length\n  }\n\n  replacements.sort((a, b) => a.startIndex - b.startIndex)\n  return replacements\n}\n\nexport function applyReplacements(lines: string[], replacements: Replacement[]): string[] {\n  const out = [...lines]\n  // Apply in descending order so earlier edits don't shift later indices.\n  for (let k = replacements.length - 1; k >= 0; k--) {\n    const { startIndex, oldLen, newLines } = replacements[k]\n    out.splice(startIndex, oldLen, ...newLines)\n  }\n  return out\n}\n\n/**\n * Apply a parsed chunk list to original file contents, returning the new\n * contents as a single string. Mirrors derive_new_contents_from_chunks\n * in codex-rs/apply-patch/src/lib.rs.\n */\nexport function deriveNewContents(\n  originalContents: string,\n  chunks: UpdateFileChunk[],\n  path: string,\n): string {\n  const originalLines = originalContents.split('\\n')\n  // Drop the trailing empty element that results from the final newline.\n  if (originalLines.length > 0 && originalLines[originalLines.length - 1] === '') {\n    originalLines.pop()\n  }\n\n  const replacements = computeReplacements(originalLines, path, chunks)\n  const newLines = applyReplacements(originalLines, replacements)\n  if (newLines.length === 0 || newLines[newLines.length - 1] !== '') {\n    newLines.push('')\n  }\n  return newLines.join('\\n')\n}\n", "/**\r\n * Codex Lane \u2014 Native Tool Registry\r\n *\r\n * Maps OpenAI Codex CLI's native tool names to shared implementations.\r\n * The critical difference: Codex uses `apply_patch` (unified diff) instead\r\n * of Edit (old_string/new_string). This is what GPT-5 and Codex models\r\n * were specifically post-trained on.\r\n *\r\n * Tool names from: openai/codex codex-rs/core\r\n */\r\n\r\nimport type { LaneToolRegistration } from '../types.js'\nimport { parsePatch } from '../shared/apply_patch.js'\nimport { WEB_SEARCH_NATIVE_DESCRIPTION } from '../../tools/WebSearchTool/prompt.js'\n\r\n/**\r\n * `apply_patch` is Codex's native edit primitive. Codex emits patches in\r\n * the `*** Begin Patch` freeform grammar (not unified diff). We use the\r\n * shared parser from src/lanes/shared/apply_patch.ts to validate the\r\n * patch, then forward it to an ApplyPatch shared-impl tool which owns\r\n * the actual filesystem writes (creates AddFile paths, deletes\r\n * DeleteFile paths, and applies UpdateFile chunks to existing files).\r\n *\r\n * The shared impl is expected to accept { patch: string } and apply\r\n * via deriveNewContents from the shared module. If the impl isn't\r\n * registered, the adapter falls back to a single-file Edit conversion\r\n * which handles the most common GPT-5-codex case.\r\n */\r\n\r\nexport const CODEX_TOOL_REGISTRY: LaneToolRegistration[] = [\r\n  // \u2500\u2500 shell \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  {\r\n    nativeName: 'shell',\r\n    implId: 'Bash',\r\n    nativeDescription:\r\n      'Execute a shell command. Use for running programs, installing ' +\r\n      'packages, running tests, git operations, and any system tasks.',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        command: {\r\n          type: 'string',\r\n          description: 'The shell command to execute.',\r\n        },\r\n      },\r\n      required: ['command'],\r\n    },\r\n    adaptInput(native) {\r\n      return { command: native.command }\r\n    },\r\n    adaptOutput(output) {\r\n      return typeof output === 'string' ? output : JSON.stringify(output)\r\n    },\r\n  },\r\n\r\n  // \u2500\u2500 apply_patch \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  // THE key differentiator for the Codex lane. GPT-5 / gpt-5-codex /\r\n  // o-series are specifically trained on the *** Begin Patch grammar,\r\n  // not unified diff and not Edit. Using anything else on these models\r\n  // produces measurable quality regressions on edit-heavy tasks.\r\n  {\r\n    nativeName: 'apply_patch',\r\n    implId: 'ApplyPatch',\r\n    nativeDescription:\r\n      \"Use the `apply_patch` tool to edit files. This is a FREEFORM tool, so do not wrap the patch in JSON.\\n\\n\"\r\n      + \"Patch format:\\n\"\r\n      + \"*** Begin Patch\\n\"\r\n      + \"*** Add File: <path>\\n\"\r\n      + \"+line1\\n\"\r\n      + \"*** Update File: <path>\\n\"\r\n      + \"*** Move to: <new_path>\\n\"\r\n      + \"@@ optional context header\\n\"\r\n      + \"-old line\\n\"\r\n      + \"+new line\\n\"\r\n      + \" context line\\n\"\r\n      + \"*** Delete File: <path>\\n\"\r\n      + \"*** End Patch\\n\\n\"\r\n      + \"Include at least 3 lines of surrounding context for each change to disambiguate the match.\",\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        patch: {\r\n          type: 'string',\r\n          description: 'The apply_patch body. Must start with `*** Begin Patch` and end with `*** End Patch`.',\r\n        },\r\n      },\r\n      required: ['patch'],\r\n    },\r\n    adaptInput(native) {\r\n      // Validate the patch at adapter time so malformed patches fail fast\r\n      // with a helpful error rather than a generic tool-failure message.\r\n      try {\r\n        parsePatch(native.patch as string)\r\n      } catch (e: any) {\r\n        // Let the caller handle: return the raw input so the shared\r\n        // ApplyPatch impl can surface a cleaner error with file context.\r\n        // (Don't throw here \u2014 it bypasses the normal tool-error flow.)\r\n      }\r\n      return { patch: native.patch }\r\n    },\r\n    adaptOutput(output) {\r\n      return typeof output === 'string' ? output : JSON.stringify(output)\r\n    },\r\n  },\r\n\r\n  // \u2500\u2500 read_file \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  {\r\n    nativeName: 'read_file',\r\n    implId: 'Read',\r\n    nativeDescription: 'Read the contents of a file.',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        file_path: {\r\n          type: 'string',\r\n          description: 'Path to the file to read.',\r\n        },\r\n        offset: {\r\n          type: 'number',\r\n          description: 'Line number to start reading from (0-based).',\r\n        },\r\n        limit: {\r\n          type: 'number',\r\n          description: 'Maximum number of lines to read.',\r\n        },\r\n      },\r\n      required: ['file_path'],\r\n    },\r\n    adaptInput(native) {\r\n      const out: Record<string, unknown> = { file_path: native.file_path }\r\n      if (native.offset != null) out.offset = native.offset\r\n      if (native.limit != null) out.limit = native.limit\r\n      return out\r\n    },\r\n    adaptOutput(output) {\r\n      return typeof output === 'string' ? output : JSON.stringify(output)\r\n    },\r\n  },\r\n\r\n  // \u2500\u2500 write_file \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  {\r\n    nativeName: 'write_file',\r\n    implId: 'Write',\r\n    nativeDescription: 'Create a new file or overwrite an existing file with the given content.',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        file_path: {\r\n          type: 'string',\r\n          description: 'Path to the file to write.',\r\n        },\r\n        content: {\r\n          type: 'string',\r\n          description: 'The complete file content.',\r\n        },\r\n      },\r\n      required: ['file_path', 'content'],\r\n    },\r\n    adaptInput(native) {\r\n      return { file_path: native.file_path, content: native.content }\r\n    },\r\n    adaptOutput(output) {\r\n      return typeof output === 'string' ? output : JSON.stringify(output)\r\n    },\r\n  },\r\n\r\n  // \u2500\u2500 list_directory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  {\r\n    nativeName: 'list_directory',\r\n    implId: 'Bash',\r\n    nativeDescription: 'List the contents of a directory.',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        path: {\r\n          type: 'string',\r\n          description: 'Directory path to list.',\r\n        },\r\n      },\r\n      required: ['path'],\r\n    },\r\n    adaptInput(native) {\r\n      return { command: `ls -la ${JSON.stringify(native.path)}` }\r\n    },\r\n    adaptOutput(output) {\r\n      return typeof output === 'string' ? output : JSON.stringify(output)\r\n    },\r\n  },\r\n\r\n  // \u2500\u2500 search_files \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  {\r\n    nativeName: 'search_files',\r\n    implId: 'Glob',\r\n    nativeDescription: 'Find files matching a glob pattern.',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        pattern: {\r\n          type: 'string',\r\n          description: 'Glob pattern (e.g., \"**/*.ts\").',\r\n        },\r\n        path: {\r\n          type: 'string',\r\n          description: 'Directory to search in.',\r\n        },\r\n      },\r\n      required: ['pattern'],\r\n    },\r\n    adaptInput(native) {\r\n      const out: Record<string, unknown> = { pattern: native.pattern }\r\n      if (native.path) out.path = native.path\r\n      return out\r\n    },\r\n    adaptOutput(output) {\r\n      return typeof output === 'string' ? output : JSON.stringify(output)\r\n    },\r\n  },\r\n\r\n  // \u2500\u2500 search_code \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  {\r\n    nativeName: 'search_code',\r\n    implId: 'Grep',\r\n    nativeDescription: 'Search for a pattern in file contents using regex.',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        pattern: {\r\n          type: 'string',\r\n          description: 'Regex pattern to search for.',\r\n        },\r\n        path: {\r\n          type: 'string',\r\n          description: 'File or directory to search in.',\r\n        },\r\n        include: {\r\n          type: 'string',\r\n          description: 'Glob pattern to filter files (e.g., \"*.ts\").',\r\n        },\r\n      },\r\n      required: ['pattern'],\r\n    },\r\n    adaptInput(native) {\r\n      const out: Record<string, unknown> = { pattern: native.pattern }\r\n      if (native.path) out.path = native.path\r\n      if (native.include) out.glob = native.include\r\n      return out\r\n    },\r\n    adaptOutput(output) {\r\n      return typeof output === 'string' ? output : JSON.stringify(output)\r\n    },\r\n  },\r\n\r\n  // \u2500\u2500 web_search \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  {\n    nativeName: 'web_search',\n    implId: 'WebSearch',\n    nativeDescription: WEB_SEARCH_NATIVE_DESCRIPTION,\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        query: {\r\n          type: 'string',\r\n          description: 'The search query.',\r\n        },\r\n      },\r\n      required: ['query'],\r\n    },\r\n    adaptInput(native) {\r\n      return { query: native.query }\r\n    },\r\n    adaptOutput(output) {\r\n      return typeof output === 'string' ? output : JSON.stringify(output)\r\n    },\r\n  },\r\n]\r\n\r\n// \u2500\u2500\u2500 Exports \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport function buildCodexFunctionDeclarations(): Array<{\r\n  name: string\r\n  description: string\r\n  parameters: Record<string, unknown>\r\n}> {\r\n  return CODEX_TOOL_REGISTRY.map(reg => ({\r\n    name: reg.nativeName,\r\n    description: reg.nativeDescription,\r\n    parameters: reg.nativeSchema,\r\n  }))\r\n}\r\n\r\n/**\r\n * Build the `tools` field for a Responses API request. `apply_patch` is\r\n * emitted as a `custom` (freeform-text) tool \u2014 the rest as `function`\r\n * tools with JSON-Schema parameters.\r\n */\r\nexport function buildCodexResponsesTools(\r\n  registrations: LaneToolRegistration[] = CODEX_TOOL_REGISTRY,\r\n): Array<\r\n  | { type: 'function'; name: string; description: string; parameters: Record<string, unknown>; strict?: boolean }\r\n  | { type: 'custom'; name: string; description: string; format: { type: 'text' } }\r\n> {\r\n  return registrations.map(reg => {\r\n    if (reg.nativeName === 'apply_patch') {\r\n      return {\r\n        type: 'custom',\r\n        name: 'apply_patch',\r\n        description: reg.nativeDescription,\r\n        format: { type: 'text' },\r\n      }\r\n    }\r\n    return {\r\n      type: 'function',\r\n      name: reg.nativeName,\r\n      description: reg.nativeDescription,\r\n      parameters: reg.nativeSchema,\r\n    }\r\n  })\r\n}\r\n\r\n/** Look up by native name \u2014 used when the model emits a tool call. */\r\nexport function getCodexRegistrationByNativeName(name: string): LaneToolRegistration | undefined {\r\n  ensureIndexed()\r\n  return _byNativeName.get(name)\r\n}\r\n\r\nconst _byNativeName = new Map<string, LaneToolRegistration>()\r\nfunction ensureIndexed(): void {\r\n  if (_byNativeName.size > 0) return\r\n  for (const reg of CODEX_TOOL_REGISTRY) {\r\n    _byNativeName.set(reg.nativeName, reg)\r\n  }\r\n}\r\n\r\nexport function resolveToolCall(\r\n  name: string,\r\n  args: Record<string, unknown>,\r\n): { implId: string; input: Record<string, unknown> } | null {\r\n  ensureIndexed()\r\n  const reg = _byNativeName.get(name)\r\n  if (!reg) return null\r\n  return { implId: reg.implId, input: reg.adaptInput(args) }\r\n}\r\n\r\nexport function formatToolResult(name: string, output: string | unknown): string {\r\n  ensureIndexed()\r\n  const reg = _byNativeName.get(name)\r\n  if (!reg) return typeof output === 'string' ? output : JSON.stringify(output)\r\n  return reg.adaptOutput(output)\r\n}\r\n", "/**\r\n * Codex Lane \u2014 Responses API Client\r\n *\r\n * Mirrors codex-rs's HTTP Responses path exactly so prompt-cache hits land\r\n * and token accounting reflects the native client. Specifically:\r\n *\r\n *   - POST <base>/responses with `ResponsesApiRequest` shape \u2014 NO\r\n *     `previous_response_id` on HTTP (that's WS-only in codex-rs).\r\n *   - `store` defaults to false; only true for Azure-wire endpoints.\r\n *   - Cache routing via body `prompt_cache_key` + header `session_id`,\r\n *     both set to the stable conversation id.\r\n *   - Auth: Bearer (API key OR ChatGPT OAuth access token). ChatGPT lane\r\n *     auto-selects `https://chatgpt.com/backend-api/codex` base URL.\r\n *   - Standard codex-rs headers: `originator`, `User-Agent`,\r\n *     `x-client-request-id`. `ChatGPT-Account-ID` only when decoded from\r\n *     an accompanying JWT (never empty string).\r\n *\r\n * Reference:\r\n *   codex-rs/codex-api/src/common.rs            (ResponsesApiRequest shape)\r\n *   codex-rs/codex-api/src/endpoint/responses.rs (HTTP path + headers)\r\n *   codex-rs/codex-api/src/requests/headers.rs  (session_id header)\r\n *   codex-rs/codex-api/src/auth.rs              (ChatGPT-Account-ID)\r\n *   codex-rs/login/src/auth/default_client.rs   (originator, User-Agent)\r\n *   codex-rs/model-provider-info/src/lib.rs     (ChatGPT base URL)\r\n *   codex-rs/core/src/client.rs                 (store/include flags)\r\n */\r\n\r\n// \u2500\u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport type CodexInputItem =\r\n  | { type: 'message'; role: 'user' | 'assistant' | 'developer' | 'system'; content: CodexContentPart[] }\r\n  | { type: 'function_call'; call_id: string; name: string; arguments: string }\r\n  | { type: 'function_call_output'; call_id: string; output: string }\r\n  | { type: 'custom_tool_call'; call_id: string; name: string; input: string }\r\n  | { type: 'custom_tool_call_output'; call_id: string; output: string }\r\n  | { type: 'reasoning'; id?: string; summary?: Array<{ type: 'summary_text'; text: string }>; content?: Array<{ type: 'reasoning_text'; text: string }> }\r\n\r\nexport type CodexContentPart =\r\n  | { type: 'input_text'; text: string }\r\n  | { type: 'output_text'; text: string }\r\n  | { type: 'input_image'; image_url: string }\r\n\r\nexport interface CodexReasoningConfig {\r\n  /** \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" controls thinking intensity. */\r\n  effort?: 'minimal' | 'low' | 'medium' | 'high' | 'xhigh'\r\n  /** \"auto\" | \"concise\" | \"detailed\" \u2014 controls summary verbosity. */\r\n  summary?: 'auto' | 'concise' | 'detailed'\r\n}\r\n\r\nexport type CodexToolSpec =\r\n  | {\r\n      type: 'function'\r\n      name: string\r\n      description: string\r\n      parameters: Record<string, unknown>\r\n      strict?: boolean\r\n    }\r\n  | {\r\n      // Codex's freeform tool variant \u2014 used by apply_patch. Payload is raw\r\n      // text, not JSON-wrapped arguments.\r\n      type: 'custom'\r\n      name: string\r\n      description: string\r\n      format: { type: 'text' }\r\n    }\r\n\r\nexport interface CodexResponsesRequest {\r\n  model: string\r\n  instructions: string\r\n  input: CodexInputItem[]\r\n  tools?: CodexToolSpec[]\r\n  tool_choice?: 'auto' | 'required' | 'none' | { type: 'function'; name: string }\r\n  parallel_tool_calls?: boolean\r\n  reasoning?: CodexReasoningConfig\r\n  // codex-rs mirrors this directly \u2014 defaults to Azure-only. NOT\r\n  // `previous_response_id`; that field is WebSocket-only in codex-rs.\r\n  store?: boolean\r\n  stream?: boolean\r\n  include?: string[]\r\n  prompt_cache_key?: string\r\n  text?: { format?: 'markdown' | 'plaintext' }\r\n  service_tier?: 'auto' | 'default' | 'flex' | 'priority'\r\n  /**\r\n   * Per codex-rs `ResponsesApiRequest.client_metadata` \u2014 carries\r\n   * `x-codex-installation-id` in the body so the backend aggregates the\r\n   * call against the installation's cache + quota bucket. Native codex\r\n   * sends this on every call; omitting it lands us in a default\r\n   * \"unknown client\" partition.\r\n   * Ref: codex-rs/codex-api/src/common.rs (ResponsesApiRequest)\r\n   *      codex-rs/core/src/client.rs (build_responses_request)\r\n   */\r\n  client_metadata?: Record<string, string>\r\n}\r\n\r\n// \u2500\u2500\u2500 SSE Event Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport type CodexStreamEvent =\r\n  | { type: 'response.created'; response: { id: string } }\r\n  | { type: 'response.in_progress'; response: { id: string } }\r\n  | { type: 'response.output_item.added'; output_index: number; item: CodexOutputItem }\r\n  | { type: 'response.output_item.done'; output_index: number; item: CodexOutputItem }\r\n  | { type: 'response.output_text.delta'; item_id: string; output_index: number; content_index: number; delta: string }\r\n  | { type: 'response.output_text.done'; item_id: string; output_index: number; content_index: number; text: string }\r\n  | { type: 'response.reasoning_summary_text.delta'; item_id: string; output_index: number; summary_index: number; delta: string }\r\n  | { type: 'response.reasoning_text.delta'; item_id: string; output_index: number; content_index: number; delta: string }\r\n  | { type: 'response.reasoning_summary_part.added'; item_id: string; output_index: number; summary_index: number; part: { type: 'summary_text'; text: string } }\r\n  | { type: 'response.function_call_arguments.delta'; item_id: string; output_index: number; delta: string }\r\n  | { type: 'response.function_call_arguments.done'; item_id: string; output_index: number; arguments: string }\r\n  | { type: 'response.custom_tool_call_input.delta'; item_id: string; output_index: number; delta: string }\r\n  | { type: 'response.custom_tool_call_input.done'; item_id: string; output_index: number; input: string }\r\n  | { type: 'response.completed'; response: { id: string; usage: CodexUsage } }\r\n  | { type: 'response.failed'; response: { id: string; error: { code: string; message: string } } }\r\n  | { type: 'response.incomplete'; response: { id: string; incomplete_details?: { reason: string } } }\r\n  | { type: string; [key: string]: unknown }\r\n\r\nexport type CodexOutputItem =\r\n  | { type: 'message'; id: string; role: 'assistant'; content: Array<{ type: 'output_text'; text: string; annotations?: unknown[] }> }\r\n  | { type: 'reasoning'; id: string; summary?: Array<{ type: 'summary_text'; text: string }>; content?: Array<{ type: 'reasoning_text'; text: string }> }\r\n  | { type: 'function_call'; id: string; call_id: string; name: string; arguments: string }\r\n  | { type: 'custom_tool_call'; id: string; call_id: string; name: string; input: string }\r\n\r\nexport interface CodexUsage {\r\n  input_tokens: number\r\n  input_tokens_details?: { cached_tokens?: number }\r\n  output_tokens: number\r\n  output_tokens_details?: { reasoning_tokens?: number }\r\n  total_tokens: number\r\n}\r\n\r\n// \u2500\u2500\u2500 Client \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n// Signal prefix for claudex reactive-compact (must match the string in\r\n// services/api/errors.ts \u2014 duplicated to avoid the transitive import\r\n// issue with utils/messages.ts).\r\nconst CODEX_PROMPT_TOO_LONG_PREFIX = 'Prompt is too long'\r\n\r\nexport class CodexApiError extends Error {\r\n  readonly isPromptTooLong: boolean\r\n\r\n  constructor(\r\n    public readonly status: number,\r\n    public readonly body: string,\r\n    public readonly retryAfterMs?: number,\r\n  ) {\r\n    // Recognize the signals OpenAI emits for context-window overflow.\r\n    // The Responses API surfaces 400 \"context_length_exceeded\" (structured\r\n    // error.code) plus a free-text message. Also match the Chat-Completions\r\n    // variant in case the gateway translates.\r\n    const ptl = /context_length_exceeded|maximum context length|prompt is too long|token limit/i\r\n      .test(body)\r\n    const head = ptl\r\n      ? `${CODEX_PROMPT_TOO_LONG_PREFIX} (Codex ${status})`\r\n      : `OpenAI Responses API error ${status}`\r\n    super(`${head}: ${body.slice(0, 200)}`)\r\n    this.name = 'CodexApiError'\r\n    this.isPromptTooLong = ptl\r\n  }\r\n\r\n  get isRateLimited(): boolean { return this.status === 429 }\r\n  get isAuth(): boolean { return this.status === 401 || this.status === 403 }\r\n  get isRetryable(): boolean {\r\n    if (this.status === 400) return false\r\n    return this.status === 429 || this.status === 499 || (this.status >= 500 && this.status < 600)\r\n  }\r\n}\r\n\r\nconst DEFAULT_ORIGINATOR = 'codex_cli_rs'\r\nconst DEFAULT_API_BASE_URL = 'https://api.openai.com/v1'\r\nconst CHATGPT_BASE_URL = 'https://chatgpt.com/backend-api/codex'\r\n/**\r\n * Default version string baked into the User-Agent. Kept in step with the\r\n * latest upstream `codex-rs` release so the backend's user-agent-based\r\n * feature gates treat claudex-codex identically to native codex. Override\r\n * via the `CLAUDEX_CODEX_VERSION` env var if upstream drifts.\r\n */\r\nconst DEFAULT_CODEX_VERSION = '0.47.0'\r\n\r\n// Build a codex-rs-style User-Agent. Format mirrors get_codex_user_agent:\r\n//   `codex_cli_rs/<build_ver> (<os_type> <os_version>; <arch>) <terminal_ua>`\r\n// The backend uses this for client segmentation / routing; drifting from\r\n// native shape can land us on a different pool than native codex clients\r\n// (which affects quota bucket + cache routing on chatgpt.com). Evaluated\r\n// once per process.\r\n// Ref: codex-rs/login/src/auth/default_client.rs get_codex_user_agent\r\nlet USER_AGENT_CACHE: string | null = null\r\nfunction getCodexUserAgent(): string {\r\n  if (USER_AGENT_CACHE) return USER_AGENT_CACHE\r\n  const ver = process.env.CLAUDEX_CODEX_VERSION ?? DEFAULT_CODEX_VERSION\r\n  // eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports\r\n  const os = require('os') as typeof import('os')\r\n  const osType = process.platform === 'darwin' ? 'Mac OS'\r\n    : process.platform === 'linux' ? 'Linux'\r\n    : process.platform === 'win32' ? 'Windows'\r\n    : os.type()\r\n  const osVersion = os.release() // e.g. \"10.0.19045\" on Win10, \"23.5.0\" on macOS.\r\n  // Node's process.arch is `x64` / `arm64`; native codex-rs uses os_info\r\n  // crate which returns `x86_64` / `arm64`. Map for parity.\r\n  const arch = process.arch === 'x64' ? 'x86_64' : process.arch\r\n  const terminal = `${DEFAULT_ORIGINATOR}/${ver}`\r\n  USER_AGENT_CACHE = `${DEFAULT_ORIGINATOR}/${ver} (${osType} ${osVersion}; ${arch}) ${terminal}`\r\n  return USER_AGENT_CACHE\r\n}\r\n\r\n/**\r\n * Decode the `chatgpt_account_id` claim from a ChatGPT OAuth id_token or\r\n * access token JWT. Native codex extracts this from the id_token's\r\n * `https://api.openai.com/auth.chatgpt_account_id` claim and sends the\r\n * value as the `ChatGPT-Account-ID` header. Without it, requests land in\r\n * a different account-scoped cache/quota bucket on chatgpt.com.\r\n * Ref: codex-rs/login/src/token_data.rs\r\n *      codex-rs/login/src/server.rs (chatgpt_account_id claim path)\r\n */\r\nfunction extractChatGPTAccountIdFromJwt(jwt: string): string | null {\r\n  try {\r\n    const parts = jwt.split('.')\r\n    if (parts.length < 2) return null\r\n    const payloadB64 = parts[1].replace(/-/g, '+').replace(/_/g, '/')\r\n    const padded = payloadB64 + '='.repeat((4 - (payloadB64.length % 4)) % 4)\r\n    const payload = JSON.parse(Buffer.from(padded, 'base64').toString('utf-8')) as Record<string, unknown>\r\n    const auth = payload['https://api.openai.com/auth']\r\n    if (auth && typeof auth === 'object') {\r\n      const id = (auth as Record<string, unknown>).chatgpt_account_id\r\n      if (typeof id === 'string' && id.length > 0) return id\r\n    }\r\n    const direct = payload['chatgpt_account_id']\r\n    if (typeof direct === 'string' && direct.length > 0) return direct\r\n    return null\r\n  } catch {\r\n    return null\r\n  }\r\n}\r\n\r\n/**\r\n * Resolve a persistent installation id, matching codex-rs's behavior of\r\n * storing a UUID at `$CODEX_HOME/installation_id`. The backend uses this\r\n * for cache + quota aggregation; regenerating it every process defeats\r\n * both.\r\n * Ref: codex-rs/core/src/installation_id.rs resolve_installation_id\r\n */\r\nlet INSTALLATION_ID_CACHE: string | null = null\r\nfunction resolveInstallationId(): string {\r\n  if (INSTALLATION_ID_CACHE) return INSTALLATION_ID_CACHE\r\n  // eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports\r\n  const path = require('path') as typeof import('path')\r\n  // eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports\r\n  const fs = require('fs') as typeof import('fs')\r\n  // eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports\r\n  const os = require('os') as typeof import('os')\r\n  // eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports\r\n  const crypto = require('crypto') as typeof import('crypto')\r\n\r\n  const home = process.env.CODEX_HOME\r\n    ?? process.env.CLAUDEX_HOME\r\n    ?? path.join(os.homedir(), '.claudex')\r\n  const file = path.join(home, 'installation_id')\r\n  try {\r\n    if (fs.existsSync(file)) {\r\n      const existing = fs.readFileSync(file, 'utf-8').trim()\r\n      // Accept anything that looks like a UUID (native codex uses strict\r\n      // UUIDv4 but we're lenient on read). Otherwise rewrite.\r\n      if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(existing)) {\r\n        INSTALLATION_ID_CACHE = existing.toLowerCase()\r\n        return INSTALLATION_ID_CACHE\r\n      }\r\n    }\r\n    const fresh = typeof crypto.randomUUID === 'function'\r\n      ? crypto.randomUUID()\r\n      : `${Date.now().toString(16)}-${Math.random().toString(16).slice(2, 10)}`\r\n    fs.mkdirSync(home, { recursive: true })\r\n    fs.writeFileSync(file, fresh, { encoding: 'utf-8', mode: 0o644 })\r\n    INSTALLATION_ID_CACHE = fresh\r\n    return INSTALLATION_ID_CACHE\r\n  } catch {\r\n    // Best-effort \u2014 if we can't touch disk, generate an in-process UUID\r\n    // so we still send a stable id for the lifetime of the process.\r\n    const fallback = typeof crypto.randomUUID === 'function'\r\n      ? crypto.randomUUID()\r\n      : `${Date.now().toString(16)}-${Math.random().toString(16).slice(2, 10)}`\r\n    INSTALLATION_ID_CACHE = fallback\r\n    return INSTALLATION_ID_CACHE\r\n  }\r\n}\r\n\r\n// Azure wire-base-URL detection. Must match codex-rs's\r\n// is_azure_responses_wire_base_url so `store` defaults correctly.\r\n// Ref: codex-rs/codex-api/src/provider.rs\r\nfunction isAzureResponsesBaseUrl(baseUrl: string): boolean {\r\n  const b = baseUrl.toLowerCase()\r\n  return (\r\n    b.includes('openai.azure.')\r\n    || b.includes('cognitiveservices.azure.')\r\n    || b.includes('aoai.azure.')\r\n    || b.includes('azure-api.')\r\n    || b.includes('azurefd.')\r\n    || b.includes('windows.net/openai')\r\n  )\r\n}\r\n\r\nexport class CodexApiClient {\r\n  private apiKey: string | null = null\r\n  /** Populated lazily in resolvedBaseUrl() based on which auth is active. */\r\n  private explicitBaseUrl: string | null = null\r\n  /** ChatGPT OAuth access token (Plus/Pro/Enterprise subscribers). */\r\n  private chatgptAccessToken: string | null = null\r\n  /**\r\n   * Optional `chatgpt-account-id` (org slug like `org_mine`). codex-rs\r\n   * decodes it from the companion id_token JWT's\r\n   * `https://api.openai.com/auth.chatgpt_account_id` claim and only\r\n   * sends the header when present. We accept it directly \u2014 callers who\r\n   * have the id_token can parse and forward it; if absent, the header\r\n   * is simply omitted (matching codex-rs behavior).\r\n   */\r\n  private chatgptAccountId: string | null = null\r\n  /**\r\n   * Stable per-session identifier used as the Responses API\r\n   * `prompt_cache_key` AND the `session_id` / `x-client-request-id`\r\n   * headers. Per codex-rs/core/src/client.rs this value must stay\r\n   * identical across every turn of the same conversation \u2014 it's the\r\n   * sticky-routing hint that lets identical prefixes land on a KV-cache\r\n   * warm node. Generated lazily; rotated by clearChain().\r\n   */\r\n  private cacheSessionId: string | null = null\r\n  /**\r\n   * Per-model frozen copy of the system prompt's volatile tail\r\n   * (env / git status / memory / current date). The codex lane\r\n   * unshifts this as a `developer` input item at position 0 every\r\n   * turn so the input prefix stays byte-stable across turns.\r\n   *\r\n   * Why frozen: the upstream rebuilds the env block each turn with a\r\n   * fresh timestamp, but if those bytes drift between turns the\r\n   * prompt-cache prefix hash breaks. Freezing the first turn's copy\r\n   * means every later turn re-emits identical bytes at position 0,\r\n   * and the cache hits everything before the new user message.\r\n   *\r\n   * Trade-off: the model sees env data captured at session start.\r\n   * Acceptable because (a) env rarely changes mid-session in\r\n   * meaningful ways, (b) the model can run `git status` / `pwd` /\r\n   * `date` on demand if it actually needs fresh values, and (c)\r\n   * `clearChain()` (called on `/clear` and dispose paths) wipes the\r\n   * map so a fresh conversation captures fresh env.\r\n   *\r\n   * Keyed by model so a `/models` swap inside the same session\r\n   * doesn't re-use a different model's frozen anchor.\r\n   */\r\n  private frozenVolatileByModel: Map<string, string> = new Map()\r\n\r\n  configure(opts: { apiKey?: string; baseUrl?: string; chatgptAccessToken?: string; chatgptAccountId?: string; chatgptIdToken?: string }): void {\r\n    if (opts.apiKey !== undefined) this.apiKey = opts.apiKey\r\n    if (opts.baseUrl) this.explicitBaseUrl = opts.baseUrl\r\n    if (opts.chatgptAccessToken !== undefined) this.chatgptAccessToken = opts.chatgptAccessToken\r\n    if (opts.chatgptAccountId !== undefined) this.chatgptAccountId = opts.chatgptAccountId\r\n    // Auto-extract the account id from the id_token (preferred, carries\r\n    // the claim natively) or from the access_token as a fallback. codex-rs\r\n    // reads this claim from the id_token on every login/refresh and\r\n    // caches it alongside the tokens; doing it here means callers who\r\n    // only hand us tokens still get the ChatGPT-Account-ID header routed\r\n    // to the right cache partition.\r\n    if (!this.chatgptAccountId) {\r\n      const source = opts.chatgptIdToken ?? opts.chatgptAccessToken ?? this.chatgptAccessToken\r\n      if (source) {\r\n        const extracted = extractChatGPTAccountIdFromJwt(source)\r\n        if (extracted) this.chatgptAccountId = extracted\r\n      }\r\n    }\r\n  }\r\n\r\n  get isConfigured(): boolean {\r\n    return !!(this.apiKey || this.chatgptAccessToken)\r\n  }\r\n\r\n  /**\r\n   * Resolve the base URL codex-rs-style: if the caller provided one,\r\n   * use it verbatim; otherwise pick `chatgpt.com/backend-api/codex`\r\n   * when a ChatGPT access token is active (AuthMode::Chatgpt), else\r\n   * the standard OpenAI API endpoint.\r\n   * Ref: codex-rs/model-provider-info/src/lib.rs to_api_provider.\r\n   */\r\n  get baseUrl(): string {\r\n    if (this.explicitBaseUrl) return this.explicitBaseUrl\r\n    if (this.chatgptAccessToken) return CHATGPT_BASE_URL\r\n    return DEFAULT_API_BASE_URL\r\n  }\r\n\r\n  /** Azure wire-base detection. Only Azure sets `store: true` by default. */\r\n  get isAzureResponsesEndpoint(): boolean {\r\n    return isAzureResponsesBaseUrl(this.baseUrl)\r\n  }\r\n\r\n  /**\r\n   * Rotate the cache session id. Call when starting a fresh\r\n   * conversation so stale KV-cache entries don't get routed to the\r\n   * new turn's prefix. Also wipes the per-model frozen volatile\r\n   * anchors so the next conversation captures fresh env data.\r\n   */\r\n  clearChain(): void {\r\n    this.cacheSessionId = null\r\n    this.frozenVolatileByModel.clear()\r\n  }\r\n\r\n  /**\r\n   * Return the frozen volatile anchor for `model`. If the model has\r\n   * no entry yet AND `currentText` is non-empty, this seeds the map\r\n   * with `currentText` and returns it. On subsequent calls for the\r\n   * same model, the originally-seeded text is returned regardless of\r\n   * what `currentText` is now \u2014 that's the point: the leading\r\n   * developer item must keep emitting identical bytes turn-to-turn\r\n   * for the cache prefix to hit.\r\n   *\r\n   * Pure no-op when `currentText` is empty (no anchor needed).\r\n   */\r\n  getOrSeedFrozenVolatile(model: string, currentText: string): string {\r\n    if (!currentText) return ''\r\n    const cached = this.frozenVolatileByModel.get(model)\r\n    if (cached !== undefined) return cached\r\n    this.frozenVolatileByModel.set(model, currentText)\r\n    return currentText\r\n  }\r\n\r\n  /**\r\n   * Stable `prompt_cache_key` / `session_id` / `x-client-request-id`\r\n   * for the current conversation. UUID v4 via `crypto.randomUUID()`\r\n   * when available (Node \u2265 14.17), timestamp+random fallback otherwise.\r\n   */\r\n  get sessionCacheKey(): string {\r\n    if (!this.cacheSessionId) {\r\n      // eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports\r\n      const crypto = require('crypto') as typeof import('crypto')\r\n      this.cacheSessionId = typeof crypto.randomUUID === 'function'\r\n        ? crypto.randomUUID()\r\n        : `codex-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`\r\n    }\r\n    return this.cacheSessionId\r\n  }\r\n\r\n  /**\r\n   * Persistent installation UUID \u2014 disk-backed under `$CODEX_HOME` (or\r\n   * `~/.claudex`). codex-rs ships this on every call as\r\n   * `x-codex-installation-id` in `client_metadata`; backends aggregate\r\n   * cache + quota against it. Regenerating per-process defeats both.\r\n   * Ref: codex-rs/core/src/installation_id.rs\r\n   */\r\n  get installationId(): string {\r\n    return resolveInstallationId()\r\n  }\r\n\r\n  /**\r\n   * Per-turn window id codex-rs sends as `x-codex-window-id`. Native\r\n   * bumps the generation when the context window is compacted; we stay\r\n   * at `0` for now since the outer loop doesn't expose that signal yet.\r\n   * Format: `<conversation_id>:<window_generation>`.\r\n   * Ref: codex-rs/core/src/client.rs current_window_id\r\n   */\r\n  get windowId(): string {\r\n    return `${this.sessionCacheKey}:0`\r\n  }\r\n\r\n  /**\r\n   * Stream a Responses API call. Yields parsed SSE events. The caller\r\n   * is responsible for translating them into its own IR and for\r\n   * executing any tool calls the model emits.\r\n   *\r\n   * Retry: initial request retried on 429/5xx with exponential backoff\r\n   * and Retry-After support. Mid-stream errors surface to the caller.\r\n   */\r\n  async *streamResponses(\r\n    request: CodexResponsesRequest,\r\n    signal?: AbortSignal,\r\n  ): AsyncGenerator<CodexStreamEvent> {\r\n    // `store` defaults to the Azure-only behavior codex-rs ships with.\r\n    // Callers can still override by passing `store` explicitly. We also\r\n    // inject `client_metadata.x-codex-installation-id` so the backend\r\n    // aggregates this call against the installation's cache bucket (native\r\n    // codex sends this on every /responses POST).\r\n    const body: CodexResponsesRequest = {\r\n      ...request,\r\n      stream: true,\r\n      store: request.store ?? this.isAzureResponsesEndpoint,\r\n      client_metadata: {\r\n        ...(request.client_metadata ?? {}),\r\n        'x-codex-installation-id': this.installationId,\r\n      },\r\n    }\r\n\r\n    const response = await retryWithBackoff(\r\n      async () => {\r\n        const resp = await fetch(`${this.baseUrl}/responses`, {\r\n          method: 'POST',\r\n          headers: this.buildHeaders(),\r\n          body: JSON.stringify(body),\r\n          signal,\r\n        })\r\n        if (!resp.ok) {\r\n          const errText = await resp.text().catch(() => '')\r\n          const retryAfterMs = parseRetryAfter(resp.headers.get('retry-after'))\r\n          throw new CodexApiError(resp.status, errText, retryAfterMs)\r\n        }\r\n        if (!resp.body) throw new CodexApiError(0, 'No response body')\r\n        return resp\r\n      },\r\n      { signal },\r\n    )\r\n\r\n    const reader = response.body!.getReader()\r\n    const decoder = new TextDecoder()\r\n    let buffer = ''\r\n    let currentEvent: string | null = null\r\n\r\n    try {\r\n      while (true) {\r\n        const { done, value } = await reader.read()\r\n        if (done) break\r\n        buffer += decoder.decode(value, { stream: true })\r\n\r\n        const lines = buffer.split('\\n')\r\n        buffer = lines.pop() ?? ''\r\n\r\n        for (const line of lines) {\r\n          // SSE: `event: <name>` lines set the event type; `data: <payload>`\r\n          // lines are the JSON body for the current event.\r\n          if (line.startsWith('event: ')) {\r\n            currentEvent = line.slice(7).trim()\r\n          } else if (line.startsWith('data: ')) {\r\n            const payload = line.slice(6).trim()\r\n            if (payload === '[DONE]') {\r\n              currentEvent = null\r\n              return\r\n            }\r\n            if (!payload) continue\r\n            try {\r\n              const parsed = JSON.parse(payload)\r\n              // The event field is authoritative; fall back to parsed.type\r\n              // if the server omitted an explicit `event:` line.\r\n              const type = currentEvent ?? parsed.type ?? 'unknown'\r\n              yield { ...parsed, type } as CodexStreamEvent\r\n            } catch {\r\n              // Skip malformed JSON payloads rather than crashing the stream.\r\n            }\r\n          } else if (line.trim() === '') {\r\n            currentEvent = null\r\n          }\r\n        }\r\n      }\r\n    } finally {\r\n      reader.releaseLock()\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Non-streaming responses call. Returns the final response body.\r\n   * Rarely used \u2014 the agent loop always streams. Present for parity.\r\n   */\r\n  async createResponse(request: CodexResponsesRequest, signal?: AbortSignal): Promise<unknown> {\r\n    const body: CodexResponsesRequest = {\r\n      ...request,\r\n      stream: false,\r\n      store: request.store ?? this.isAzureResponsesEndpoint,\r\n      client_metadata: {\r\n        ...(request.client_metadata ?? {}),\r\n        'x-codex-installation-id': this.installationId,\r\n      },\r\n    }\r\n    return retryWithBackoff(\r\n      async () => {\r\n        const resp = await fetch(`${this.baseUrl}/responses`, {\r\n          method: 'POST',\r\n          headers: this.buildHeaders(),\r\n          body: JSON.stringify(body),\r\n          signal,\r\n        })\r\n        if (!resp.ok) {\r\n          const errText = await resp.text().catch(() => '')\r\n          const retryAfterMs = parseRetryAfter(resp.headers.get('retry-after'))\r\n          throw new CodexApiError(resp.status, errText, retryAfterMs)\r\n        }\r\n        return resp.json()\r\n      },\r\n      { signal },\r\n    )\r\n  }\r\n\r\n  private buildHeaders(): Record<string, string> {\r\n    const sid = this.sessionCacheKey\r\n    const headers: Record<string, string> = {\r\n      'Content-Type': 'application/json',\r\n      'Accept': 'text/event-stream',\r\n      // codex-rs: build_conversation_headers \u2192 `session_id: <conv_id>`.\r\n      // Backend uses this for sticky cache routing so the KV-cache-warm\r\n      // node handles every turn of the same conversation.\r\n      'session_id': sid,\r\n      // codex-rs: inserts `x-client-request-id: <conv_id>` on every\r\n      // Responses POST (endpoint/responses.rs:89-91). Same id as\r\n      // session_id \u2014 this is the client-side correlation hint.\r\n      'x-client-request-id': sid,\r\n      // codex-rs: build_responses_identity_headers always stamps\r\n      // `x-codex-window-id: <conv_id>:<gen>` (client.rs:569-571). The\r\n      // backend uses it to scope cache + context window state; requests\r\n      // without it land in an \"unknown client\" partition on chatgpt.com.\r\n      'x-codex-window-id': this.windowId,\r\n      // codex-rs: default_headers() sets `originator: codex_cli_rs`\r\n      // (login/src/auth/default_client.rs). Backend segments cache per\r\n      // originator; native codex lands under this key.\r\n      'originator': DEFAULT_ORIGINATOR,\r\n      'User-Agent': getCodexUserAgent(),\r\n    }\r\n    if (this.chatgptAccessToken) {\r\n      headers['Authorization'] = `Bearer ${this.chatgptAccessToken}`\r\n      // codex-rs only emits ChatGPT-Account-ID when the JWT actually\r\n      // carries chatgpt_account_id. Empty string is not equivalent \u2014\r\n      // some gateways treat empty as \"wrong account\", triggering 401 or\r\n      // worse, misrouting cache. Skip the header when unknown.\r\n      if (this.chatgptAccountId) headers['ChatGPT-Account-ID'] = this.chatgptAccountId\r\n    } else if (this.apiKey) {\r\n      headers['Authorization'] = `Bearer ${this.apiKey}`\r\n    }\r\n    return headers\r\n  }\r\n}\r\n\r\n// \u2500\u2500\u2500 Retry Helpers (shared shape with Gemini lane's api.ts) \u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nconst DEFAULT_MAX_ATTEMPTS = 5\r\nconst INITIAL_DELAY_MS = 2000\r\nconst MAX_DELAY_MS = 30_000\r\n\r\nconst RETRYABLE_NETWORK_CODES = new Set([\r\n  'ECONNRESET', 'ETIMEDOUT', 'EPIPE', 'ENOTFOUND', 'EAI_AGAIN',\r\n  'ECONNREFUSED', 'EPROTO',\r\n  'ERR_SSL_SSLV3_ALERT_BAD_RECORD_MAC',\r\n  'ERR_SSL_WRONG_VERSION_NUMBER',\r\n  'ERR_SSL_DECRYPTION_FAILED_OR_BAD_RECORD_MAC',\r\n  'ERR_SSL_BAD_RECORD_MAC',\r\n])\r\n\r\nfunction getNetworkErrorCode(error: unknown): string | undefined {\r\n  let cur: unknown = error\r\n  for (let d = 0; d < 5; d++) {\r\n    if (typeof cur !== 'object' || cur === null) return undefined\r\n    if ('code' in cur && typeof (cur as any).code === 'string') return (cur as any).code\r\n    if (!('cause' in cur)) return undefined\r\n    cur = (cur as any).cause\r\n  }\r\n  return undefined\r\n}\r\n\r\nfunction isRetryableTransport(error: unknown): boolean {\r\n  if (error instanceof CodexApiError) return error.isRetryable\r\n  const code = getNetworkErrorCode(error)\r\n  if (code && RETRYABLE_NETWORK_CODES.has(code)) return true\r\n  if (error instanceof Error && error.message.toLowerCase().includes('fetch failed')) return true\r\n  return false\r\n}\r\n\r\nfunction parseRetryAfter(value: string | null): number | undefined {\r\n  if (!value) return undefined\r\n  const asSec = Number(value)\r\n  if (!isNaN(asSec)) return Math.max(0, asSec * 1000)\r\n  const asDate = Date.parse(value)\r\n  if (!isNaN(asDate)) return Math.max(0, asDate - Date.now())\r\n  return undefined\r\n}\r\n\r\nasync function retryWithBackoff<T>(\r\n  fn: () => Promise<T>,\r\n  opts: { signal?: AbortSignal } = {},\r\n): Promise<T> {\r\n  const { signal } = opts\r\n  if (signal?.aborted) throw new DOMException('Aborted', 'AbortError')\r\n\r\n  let attempt = 0\r\n  let currentDelay = INITIAL_DELAY_MS\r\n\r\n  while (attempt < DEFAULT_MAX_ATTEMPTS) {\r\n    attempt++\r\n    try {\r\n      return await fn()\r\n    } catch (err: any) {\r\n      if (err?.name === 'AbortError' || signal?.aborted) throw err\r\n      if (!isRetryableTransport(err) || attempt >= DEFAULT_MAX_ATTEMPTS) throw err\r\n\r\n      const retryAfter = err instanceof CodexApiError ? err.retryAfterMs : undefined\r\n      let waitMs: number\r\n      if (retryAfter != null && retryAfter > 0) {\r\n        waitMs = retryAfter + retryAfter * 0.2 * Math.random()\r\n      } else {\r\n        const jitter = currentDelay * 0.3 * (Math.random() * 2 - 1)\r\n        waitMs = Math.max(0, currentDelay + jitter)\r\n      }\r\n\r\n      await new Promise<void>((resolve, reject) => {\r\n        const t = setTimeout(() => {\r\n          signal?.removeEventListener('abort', onAbort)\r\n          resolve()\r\n        }, waitMs)\r\n        const onAbort = (): void => {\r\n          clearTimeout(t)\r\n          reject(new DOMException('Aborted', 'AbortError'))\r\n        }\r\n        signal?.addEventListener('abort', onAbort, { once: true })\r\n      })\r\n\r\n      currentDelay = Math.min(MAX_DELAY_MS, currentDelay * 2)\r\n    }\r\n  }\r\n  throw new Error('Retry attempts exhausted')\r\n}\r\n\r\n// \u2500\u2500\u2500 Singleton \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport const codexApi = new CodexApiClient()\r\n", "/**\r\n * Codex Lane \u2014 Agent Loop + Provider-Shim Entry\r\n *\r\n * Two entry points, same pattern as the Gemini lane:\r\n *\r\n *   1. streamAsProvider(params) \u2014 single-turn, provider-shim-compatible.\r\n *      Used by src/lanes/provider-bridge.ts. Issues ONE Responses API\r\n *      call in the native idiom: POST /responses, apply_patch (freeform\r\n *      custom tool), reasoning {effort,summary}, stable prompt_cache_key\r\n *      for sticky cache routing, `store: false` except on Azure.\r\n *\r\n *   2. run(context) \u2014 future lane-owns-loop mode. Scaffolded but not\r\n *      wired; Phase-2 migration target.\r\n *\r\n * Native Codex patterns speak the Responses API directly. Using Chat\r\n * Completions on GPT-5/gpt-5-codex/o-series produces measurable quality\r\n * regressions on tool-heavy agent workloads \u2014 the models are post-trained\r\n * against response.* events, not chat.completion chunks.\r\n *\r\n * References:\r\n *   - codex-rs/core/src/codex.rs (agent loop)\r\n *   - codex-rs/core/src/client.rs (build_responses_request \u2014 store/include)\r\n *   - codex-rs/codex-api/src/sse/responses.rs (event shapes)\r\n *   - codex-rs/core/gpt-5.2-codex_prompt.md (system prompt)\r\n */\r\n\r\nimport type {\r\n  AnthropicStreamEvent,\r\n  ModelInfo,\r\n} from '../../services/api/providers/base_provider.js'\r\nimport type {\r\n  Lane,\r\n  LaneRunContext,\r\n  LaneRunResult,\r\n  LaneProviderCallParams,\r\n  NormalizedUsage,\r\n} from '../types.js'\r\nimport {\r\n  buildCodexResponsesTools,\r\n  getCodexRegistrationByNativeName,\r\n  CODEX_TOOL_REGISTRY,\r\n} from './tools.js'\r\nimport {\r\n  appendStrictParamsHint,\r\n  sanitizeSchemaForLane,\r\n  CODEX_TOOL_USAGE_RULES,\r\n} from '../shared/mcp_bridge.js'\r\nimport {\r\n  codexApi,\r\n  type CodexInputItem,\r\n  type CodexContentPart,\r\n  type CodexStreamEvent,\r\n  type CodexReasoningConfig,\r\n  type CodexResponsesRequest,\r\n} from './api.js'\r\nimport {\r\n  getOpenAIReasoningLevel,\r\n  isReasoningLevelExplicit,\r\n} from '../../utils/model/openaiReasoning.js'\r\n\r\n// \u2500\u2500\u2500 Lane Implementation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport class CodexLane implements Lane {\r\n  readonly name = 'codex'\r\n  readonly displayName = 'OpenAI Codex (Native Responses API)'\r\n\r\n  private _healthy = true\r\n\r\n  configure(opts: { apiKey?: string; baseUrl?: string; chatgptAccessToken?: string; chatgptAccountId?: string; chatgptIdToken?: string }): void {\r\n    codexApi.configure(opts)\r\n    this._healthy = codexApi.isConfigured\r\n  }\r\n\r\n  supportsModel(model: string): boolean {\r\n    const m = model.toLowerCase()\r\n    return (\r\n      m.startsWith('gpt-') ||\r\n      m.startsWith('o1') ||\r\n      m.startsWith('o3') ||\r\n      m.startsWith('o4') ||\r\n      m.startsWith('o5') ||\r\n      m.startsWith('codex-') ||\r\n      m.startsWith('gpt-5-codex') ||\r\n      m.includes('openai/')\r\n    )\r\n  }\r\n\r\n  // \u2500\u2500 Provider-shim-compatible single-turn entry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n  async *streamAsProvider(\r\n    params: LaneProviderCallParams,\r\n  ): AsyncGenerator<AnthropicStreamEvent, NormalizedUsage> {\r\n    const { model, messages, system, tools, max_tokens, thinking, signal } = params\r\n\r\n    // Assemble the full system text the upstream sent us, then split it\r\n    // into a stable (cache-eligible) prefix and a volatile (per-turn) tail\r\n    // so the Responses API `instructions` field stays byte-identical\r\n    // across turns. Without this split, env / git status / memory bleed\r\n    // into `instructions` each turn \u2192 the OpenAI prompt-cache prefix hash\r\n    // drifts \u2192 cache hits land partially or not at all (the user-reported\r\n    // \"cache hits but unstable\" pattern under heavy tool-call sessions).\r\n    //\r\n    // We mirror the same primary-marker / regex-fallback strategy\r\n    // gemini_provider.ts ships, since claudex doesn't emit the\r\n    // `__SYSTEM_PROMPT_DYNAMIC_BOUNDARY__` marker for non-firstParty\r\n    // providers (`shouldUseGlobalCacheScope()` is firstParty-only).\r\n    const fullSystemText = typeof system === 'string'\r\n      ? system\r\n      : (system ?? []).map(b => b.text).join('\\n\\n')\r\n    const { stable: rawInstructions, volatile: volatileSystemText } =\r\n      splitCodexSystemForCache(fullSystemText)\r\n\r\n    // Build tool_use_id \u2192 native name map so function_call_output items\r\n    // send back the correct call_id / name shape across the turn boundary.\r\n    const toolUseIdToCallId = buildToolUseIdToCallIdMap(messages)\r\n\r\n    // Convert Anthropic history \u2192 Responses API input items.\r\n    const inputItems = convertHistoryToCodex(messages, toolUseIdToCallId)\r\n\r\n    // Anchor a frozen copy of the volatile system tail as a\r\n    // `developer` input item at position 0 \u2014 same bytes every turn\r\n    // for the lifetime of the conversation, so the prompt-cache\r\n    // prefix lands on the same KV-cache-warm chunks turn after turn.\r\n    //\r\n    // Why position 0 and not \"before the latest user message\" (the\r\n    // earlier shape this code had): every turn the upstream re-sends\r\n    // the full conversation history starting at user1. If we inject\r\n    // anywhere AFTER user1, the bytes at input[0] differ between\r\n    // turn 1 (where input[0] was our injected dev item) and turn 2+\r\n    // (where input[0] is user1). The cache misses at the very first\r\n    // byte and reports 0 cached_tokens. Anchoring at position 0 with\r\n    // a frozen byte-stable payload keeps every turn's input[0]\r\n    // identical, so the cache hits all the way through to the\r\n    // newest message.\r\n    //\r\n    // The frozen text comes from CodexApiClient.getOrSeedFrozenVolatile:\r\n    // first turn captures the current env / git / memory; later\r\n    // turns get the same captured copy back. `clearChain()` wipes\r\n    // it so a fresh conversation captures fresh env.\r\n    if (volatileSystemText) {\r\n      const frozenAnchor = codexApi.getOrSeedFrozenVolatile(model, volatileSystemText)\r\n      if (frozenAnchor) {\r\n        inputItems.unshift({\r\n          type: 'message',\r\n          role: 'developer',\r\n          content: [{ type: 'input_text', text: frozenAnchor }],\r\n        })\r\n      }\r\n    }\r\n\r\n    // Map caller-provided tools \u2192 Codex Responses format. We honor the\r\n    // native tool registry for tools we recognize (including apply_patch\r\n    // as a freeform custom tool) and pass through MCP / custom tools as\r\n    // function-schema tools with sanitized parameters. Each function\r\n    // tool gets `strict: true` (server-side schema enforcement, OpenAI's\r\n    // equivalent of Gemini's VALIDATED mode) + the STRICT PARAMETERS\r\n    // description hint.\r\n    const codexTools = buildCodexToolsFromRequest(tools)\r\n\r\n    // Prepend CODEX_TOOL_USAGE_RULES to instructions when tools are\r\n    // present \u2014 belt-and-suspenders with `strict: true` so the model\r\n    // treats the schema as authoritative and doesn't emit empty-args\r\n    // function calls. The preamble is tuned to match Codex's concise\r\n    // native prompt tone.\r\n    const instructions = codexTools && codexTools.length > 0\r\n      ? `${CODEX_TOOL_USAGE_RULES}\\n${rawInstructions}`\r\n      : rawInstructions\r\n\r\n    // Map thinking param \u2192 Codex reasoning config. Anthropic's adaptive /\r\n    // enabled with budget_tokens mapping:\r\n    //   disabled \u2192 no reasoning field\r\n    //   adaptive / enabled (low budget) \u2192 low\r\n    //   enabled with mid budget \u2192 medium\r\n    //   enabled with high budget \u2192 high\r\n    const reasoning = resolveReasoning(thinking, model)\r\n\r\n    // Request body must match codex-rs's `ResponsesApiRequest` wire\r\n    // shape exactly. Native codex DOES NOT send `max_output_tokens` or\r\n    // `temperature` \u2014 shipping them changes the serialized body and can\r\n    // move the request to a non-cached partition on the backend (every\r\n    // extra field contributes to the request-shape hash the server uses\r\n    // to validate incremental cache eligibility). The server defaults\r\n    // for output length / sampling are what gpt-5-codex is tuned on.\r\n    // Ref: codex-rs/codex-api/src/common.rs ResponsesApiRequest\r\n    //      codex-rs/core/src/client.rs build_responses_request\r\n    void max_tokens\r\n    const request: CodexResponsesRequest = {\r\n      model,\r\n      instructions,\r\n      input: inputItems,\r\n      tools: codexTools,\r\n      tool_choice: 'auto',\r\n      parallel_tool_calls: true,\r\n      reasoning,\r\n      // codex-rs sets store=true ONLY on Azure; OpenAI + ChatGPT lanes\r\n      // run with store=false. `store: true` on non-Azure forces the\r\n      // server to persist and diff response items, which invalidates\r\n      // the KV cache on every tool-call turn \u2014 the dominant cause of\r\n      // the \"cache hit rate = 0\" token burn.\r\n      // Ref: codex-rs/core/src/client.rs line 873.\r\n      store: codexApi.isAzureResponsesEndpoint,\r\n      stream: true,\r\n      // When reasoning is enabled, codex-rs includes\r\n      // reasoning.encrypted_content so follow-up turns can replay the\r\n      // model's own thinking back at it. (Ref: client.rs build_responses_request.)\r\n      include: reasoning ? ['reasoning.encrypted_content'] : undefined,\r\n      // Stable per-conversation cache routing hint. codex-rs sets this\r\n      // to `conversation_id` so identical prefixes land on a KV-cache\r\n      // warm node every turn. Must stay constant across turns \u2014 we\r\n      // rotate only when the conversation resets (dispose()).\r\n      prompt_cache_key: codexApi.sessionCacheKey,\r\n    }\r\n\r\n    // Stream state.\r\n    let inputTokens = 0\r\n    let outputTokens = 0\r\n    let reasoningTokens = 0\r\n    let cachedInputTokens = 0\r\n    let messageStartEmitted = false\r\n\r\n    const messageId = `codex-${Date.now()}`\r\n\r\n    const emitMessageStart = () => {\r\n      if (messageStartEmitted) return undefined\r\n      messageStartEmitted = true\r\n      return {\r\n        type: 'message_start' as const,\r\n        message: {\r\n          id: messageId,\r\n          type: 'message' as const,\r\n          role: 'assistant' as const,\r\n          content: [],\r\n          model,\r\n          stop_reason: null,\r\n          stop_sequence: null,\r\n          usage: {\r\n            input_tokens: inputTokens,\r\n            output_tokens: 0,\r\n            ...(cachedInputTokens > 0 && {\r\n              cache_read_input_tokens: cachedInputTokens,\r\n              cache_creation_input_tokens: 0,\r\n            }),\r\n          },\r\n        },\r\n      }\r\n    }\r\n\r\n    // Track which output_index maps to which Anthropic block index, and\r\n    // which ones are open so we know when to stop them.\r\n    const openBlocks = new Map<number, { anthropicIndex: number; kind: 'text' | 'thinking' | 'tool_use' }>()\r\n    let nextBlockIndex = 0\r\n    let emittedAnyToolUse = false\r\n\r\n    // Tool-call assembly state. Codex streams arguments as deltas, so we\r\n    // accumulate them until output_item.done fires with the full item.\r\n    const toolCallBuffers = new Map<number, { callId: string; name: string; args: string; isCustom: boolean; anthropicIndex: number }>()\r\n\r\n    try {\r\n      for await (const ev of codexApi.streamResponses(request, signal)) {\r\n        if (signal.aborted) break\r\n\r\n        // Some usage info can arrive on response.created / .in_progress,\r\n        // most lands on response.completed. Emit message_start as soon\r\n        // as we've got enough to populate it (either created or first\r\n        // token-bearing event).\r\n        if (ev.type === 'response.created' || ev.type === 'response.in_progress') {\r\n          if (!messageStartEmitted) {\r\n            const mst = emitMessageStart()\r\n            if (mst) yield mst\r\n          }\r\n          continue\r\n        }\r\n\r\n        if (ev.type === 'response.output_item.added') {\r\n          if (!messageStartEmitted) {\r\n            const mst = emitMessageStart()\r\n            if (mst) yield mst\r\n          }\r\n          const item = (ev as any).item as {\r\n            type: string\r\n            id?: string\r\n            call_id?: string\r\n            name?: string\r\n          }\r\n          const outputIndex = (ev as any).output_index as number\r\n\r\n          if (item.type === 'message') {\r\n            const anthropicIndex = nextBlockIndex++\r\n            openBlocks.set(outputIndex, { anthropicIndex, kind: 'text' })\r\n            yield {\r\n              type: 'content_block_start',\r\n              index: anthropicIndex,\r\n              content_block: { type: 'text', text: '' },\r\n            }\r\n          } else if (item.type === 'reasoning') {\r\n            const anthropicIndex = nextBlockIndex++\r\n            openBlocks.set(outputIndex, { anthropicIndex, kind: 'thinking' })\r\n            yield {\r\n              type: 'content_block_start',\r\n              index: anthropicIndex,\r\n              content_block: { type: 'thinking', thinking: '' },\r\n            }\r\n          } else if (item.type === 'function_call' || item.type === 'custom_tool_call') {\r\n            const isCustom = item.type === 'custom_tool_call'\r\n            const anthropicIndex = nextBlockIndex++\r\n            toolCallBuffers.set(outputIndex, {\r\n              callId: item.call_id ?? item.id ?? `call-${outputIndex}`,\r\n              name: item.name ?? 'unknown',\r\n              args: '',\r\n              isCustom,\r\n              anthropicIndex,\r\n            })\r\n            emittedAnyToolUse = true\r\n          }\r\n          continue\r\n        }\r\n\r\n        if (ev.type === 'response.output_text.delta') {\r\n          const outputIndex = (ev as any).output_index as number\r\n          const delta = (ev as any).delta as string\r\n          const open = openBlocks.get(outputIndex)\r\n          if (open && open.kind === 'text') {\r\n            yield {\r\n              type: 'content_block_delta',\r\n              index: open.anthropicIndex,\r\n              delta: { type: 'text_delta', text: delta },\r\n            }\r\n          }\r\n          continue\r\n        }\r\n\r\n        if (ev.type === 'response.reasoning_summary_text.delta' || ev.type === 'response.reasoning_text.delta') {\r\n          const outputIndex = (ev as any).output_index as number\r\n          const delta = (ev as any).delta as string\r\n          const open = openBlocks.get(outputIndex)\r\n          if (open && open.kind === 'thinking') {\r\n            yield {\r\n              type: 'content_block_delta',\r\n              index: open.anthropicIndex,\r\n              delta: { type: 'thinking_delta', thinking: delta },\r\n            }\r\n          }\r\n          continue\r\n        }\r\n\r\n        if (ev.type === 'response.function_call_arguments.delta' || ev.type === 'response.custom_tool_call_input.delta') {\r\n          const outputIndex = (ev as any).output_index as number\r\n          const delta = (ev as any).delta as string\r\n          const buf = toolCallBuffers.get(outputIndex)\r\n          if (buf) buf.args += delta\r\n          continue\r\n        }\r\n\r\n        if (ev.type === 'response.function_call_arguments.done' || ev.type === 'response.custom_tool_call_input.done') {\r\n          const outputIndex = (ev as any).output_index as number\r\n          const finalPayload = ((ev as any).arguments ?? (ev as any).input) as string\r\n          const buf = toolCallBuffers.get(outputIndex)\r\n          if (buf && typeof finalPayload === 'string') buf.args = finalPayload\r\n          continue\r\n        }\r\n\r\n        if (ev.type === 'response.output_item.done') {\r\n          const outputIndex = (ev as any).output_index as number\r\n\r\n          // Close text / reasoning blocks on their output_index.\r\n          const open = openBlocks.get(outputIndex)\r\n          if (open && open.kind !== 'tool_use') {\r\n            yield { type: 'content_block_stop', index: open.anthropicIndex }\r\n            openBlocks.delete(outputIndex)\r\n            continue\r\n          }\r\n\r\n          // Emit tool_use block for completed tool calls. We do this on\r\n          // output_item.done rather than piece-by-piece so the tool_use\r\n          // block has the full input at emission time (cleaner for the\r\n          // outer claude.ts agent loop, which expects complete inputs).\r\n          const buf = toolCallBuffers.get(outputIndex)\r\n          if (!buf) continue\r\n\r\n          const reg = getCodexRegistrationByNativeName(buf.name)\r\n          const implId = reg?.implId ?? buf.name\r\n\r\n          // Parse args. Function calls are JSON; custom tool calls are\r\n          // raw text (apply_patch is the canonical example). We preserve\r\n          // the raw text by wrapping it in a { patch: text } shape for\r\n          // apply_patch specifically \u2014 matching the native schema.\r\n          let input: Record<string, unknown>\r\n          if (buf.isCustom) {\r\n            input = buf.name === 'apply_patch'\r\n              ? { patch: buf.args }\r\n              : { input: buf.args }\r\n          } else {\r\n            try {\r\n              input = buf.args ? JSON.parse(buf.args) : {}\r\n            } catch {\r\n              input = { _raw: buf.args }\r\n            }\r\n          }\r\n\r\n          // Pass through the lane's adaptInput \u2014 apply_patch validates\r\n          // the patch; others may rename fields.\r\n          const adaptedInput = reg ? reg.adaptInput(input) : input\r\n\r\n          const anthropicToolUseId = buf.callId.startsWith('toolu_')\r\n            ? buf.callId\r\n            : `toolu_codex_${buf.callId}`\r\n\r\n          // Tool-use blocks MUST emit the three-event sequence so\r\n          // claude.ts's accumulator picks up the args: content_block_start\r\n          // with empty input + input_json_delta carrying the JSON string\r\n          // + content_block_stop. Embedding `input` inline on start\r\n          // leaves the accumulator at '' and every tool sees `{}`.\r\n          yield {\r\n            type: 'content_block_start',\r\n            index: buf.anthropicIndex,\r\n            content_block: {\r\n              type: 'tool_use',\r\n              id: anthropicToolUseId,\r\n              name: implId,\r\n              input: {},\r\n            },\r\n          }\r\n          yield {\r\n            type: 'content_block_delta',\r\n            index: buf.anthropicIndex,\r\n            delta: {\r\n              type: 'input_json_delta',\r\n              partial_json: JSON.stringify(adaptedInput ?? {}),\r\n            },\r\n          }\r\n          yield { type: 'content_block_stop', index: buf.anthropicIndex }\r\n          toolCallBuffers.delete(outputIndex)\r\n          continue\r\n        }\r\n\r\n        if (ev.type === 'response.completed') {\r\n          const usage = (ev as any).response?.usage\r\n          if (usage) {\r\n            inputTokens = usage.input_tokens ?? inputTokens\r\n            outputTokens = usage.output_tokens ?? outputTokens\r\n            cachedInputTokens = usage.input_tokens_details?.cached_tokens ?? cachedInputTokens\r\n            reasoningTokens = usage.output_tokens_details?.reasoning_tokens ?? reasoningTokens\r\n          }\r\n          break\r\n        }\r\n\r\n        if (ev.type === 'response.failed') {\r\n          const errMessage = (ev as any).response?.error?.message ?? 'Responses API failed'\r\n          if (!messageStartEmitted) {\r\n            const mst = emitMessageStart()\r\n            if (mst) yield mst\r\n          }\r\n          // Surface the error as a text block so the user sees why.\r\n          const idx = nextBlockIndex++\r\n          yield {\r\n            type: 'content_block_start',\r\n            index: idx,\r\n            content_block: { type: 'text', text: '' },\r\n          }\r\n          yield {\r\n            type: 'content_block_delta',\r\n            index: idx,\r\n            delta: { type: 'text_delta', text: `Codex API error: ${errMessage}` },\r\n          }\r\n          yield { type: 'content_block_stop', index: idx }\r\n          break\r\n        }\r\n      }\r\n    } catch (err: any) {\r\n      if (err?.name === 'AbortError' || signal.aborted) {\r\n        if (!messageStartEmitted) {\r\n          const mst = emitMessageStart()\r\n          if (mst) yield mst\r\n        }\r\n        // Keep the prompt_cache_key intact on abort. codex-rs does the\r\n        // same \u2014 the cache key is conversation-scoped, not turn-scoped.\r\n        // Rotating it here would cold-start the cache on the retry.\r\n        yield {\r\n          type: 'message_delta',\r\n          delta: { stop_reason: 'end_turn' },\r\n          usage: {\r\n            output_tokens: outputTokens,\r\n            // OpenAI's input_tokens is total (fresh + cached). Anthropic\r\n            // semantic expects fresh-only here; cached lives on its own\r\n            // field. Subtract so cost / context-meter don't double-count.\r\n            input_tokens: Math.max(0, inputTokens - cachedInputTokens),\r\n            ...(cachedInputTokens > 0 && {\r\n              cache_read_input_tokens: cachedInputTokens,\r\n              cache_creation_input_tokens: 0,\r\n            }),\r\n          },\r\n        }\r\n        yield { type: 'message_stop' }\r\n        return {\r\n          input_tokens: Math.max(0, inputTokens - cachedInputTokens),\r\n          output_tokens: outputTokens,\r\n          cache_read_tokens: cachedInputTokens,\r\n          cache_write_tokens: 0,\r\n          thinking_tokens: reasoningTokens,\r\n        }\r\n      }\r\n      if (!messageStartEmitted) {\r\n        const mst = emitMessageStart()\r\n        if (mst) yield mst\r\n      }\r\n      const idx = nextBlockIndex++\r\n      yield {\r\n        type: 'content_block_start',\r\n        index: idx,\r\n        content_block: { type: 'text', text: '' },\r\n      }\r\n      // Prompt-too-long errors must surface unwrapped so reactive-compact\r\n      // recognizes them via the \"Prompt is too long\" prefix.\r\n      const isPTL = (err as { isPromptTooLong?: boolean } | null)?.isPromptTooLong === true\r\n      const errText = isPTL\r\n        ? (err?.message ?? String(err))\r\n        : `Codex API error: ${err?.message ?? String(err)}`\r\n      yield {\r\n        type: 'content_block_delta',\r\n        index: idx,\r\n        delta: { type: 'text_delta', text: errText },\r\n      }\r\n      yield { type: 'content_block_stop', index: idx }\r\n      yield {\r\n        type: 'message_delta',\r\n        delta: { stop_reason: 'end_turn' },\r\n        usage: {\r\n          output_tokens: outputTokens,\r\n          // OpenAI's input_tokens is total (fresh + cached). Anthropic\r\n          // semantic expects fresh-only here; cached lives on its own\r\n          // field. Subtract so cost / context-meter don't double-count.\r\n          input_tokens: Math.max(0, inputTokens - cachedInputTokens),\r\n          ...(cachedInputTokens > 0 && {\r\n            cache_read_input_tokens: cachedInputTokens,\r\n            cache_creation_input_tokens: 0,\r\n          }),\r\n        },\r\n      }\r\n      yield { type: 'message_stop' }\r\n      return {\r\n        input_tokens: Math.max(0, inputTokens - cachedInputTokens),\r\n        output_tokens: outputTokens,\r\n        cache_read_tokens: cachedInputTokens,\r\n        cache_write_tokens: 0,\r\n        thinking_tokens: reasoningTokens,\r\n      }\r\n    }\r\n\r\n    // Ensure message_start was emitted for empty-response edge case.\r\n    if (!messageStartEmitted) {\r\n      const mst = emitMessageStart()\r\n      if (mst) yield mst\r\n    }\r\n\r\n    // Close any still-open non-tool blocks (safety net).\r\n    for (const [, open] of openBlocks) {\r\n      if (open.kind !== 'tool_use') {\r\n        yield { type: 'content_block_stop', index: open.anthropicIndex }\r\n      }\r\n    }\r\n\r\n    const stopReason: 'tool_use' | 'end_turn' = emittedAnyToolUse ? 'tool_use' : 'end_turn'\r\n\r\n    yield {\r\n      type: 'message_delta',\r\n      delta: { stop_reason: stopReason },\r\n      usage: {\r\n        output_tokens: outputTokens,\r\n        // OpenAI's input_tokens is total (fresh + cached). Anthropic\r\n        // semantic expects fresh-only here; cached lives on its own\r\n        // field. Subtract so cost / context-meter don't double-count.\r\n        input_tokens: Math.max(0, inputTokens - cachedInputTokens),\r\n        ...(cachedInputTokens > 0 && {\r\n          cache_read_input_tokens: cachedInputTokens,\r\n          cache_creation_input_tokens: 0,\r\n        }),\r\n      },\r\n    }\r\n    yield { type: 'message_stop' }\r\n\r\n    return {\r\n      input_tokens: Math.max(0, inputTokens - cachedInputTokens),\r\n      output_tokens: outputTokens,\r\n      cache_read_tokens: cachedInputTokens,\r\n      cache_write_tokens: 0,\r\n      thinking_tokens: reasoningTokens,\r\n    }\r\n  }\r\n\r\n  // \u2500\u2500 Lane-owns-loop (Phase-2, not wired yet) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n  async *run(_context: LaneRunContext): AsyncGenerator<AnthropicStreamEvent, LaneRunResult> {\r\n    // Future Phase-2 work. For now the bridge calls streamAsProvider directly\r\n    // and claude.ts owns the turn-orchestration loop.\r\n    throw new Error('CodexLane.run (lane-owns-loop) is not wired yet \u2014 use streamAsProvider via LaneBackedProvider.')\r\n  }\r\n\r\n  async listModels(): Promise<ModelInfo[]> {\r\n    return [\r\n      { id: 'gpt-5.5', name: 'GPT-5.5', contextWindow: 272000, supportsToolCalling: true, tags: ['recommended', 'reasoning'] },\r\n      { id: 'gpt-5.4', name: 'GPT-5.4', contextWindow: 1050000, supportsToolCalling: true, tags: ['reasoning'] },\r\n      { id: 'gpt-5.4-mini', name: 'GPT-5.4 Mini', contextWindow: 272000, supportsToolCalling: true, tags: ['fast', 'reasoning'] },\r\n      { id: 'gpt-5.3-codex', name: 'GPT-5.3 Codex', contextWindow: 272000, supportsToolCalling: true, tags: ['reasoning'] },\r\n      { id: 'gpt-5.2', name: 'GPT-5.2', contextWindow: 272000, supportsToolCalling: true, tags: ['reasoning'] },\r\n      { id: 'gpt-5', name: 'GPT-5', contextWindow: 200000, supportsToolCalling: true, tags: ['reasoning'] },\r\n      { id: 'gpt-5-codex', name: 'GPT-5 Codex', contextWindow: 200000, supportsToolCalling: true, tags: ['reasoning'] },\r\n      { id: 'o3', name: 'o3', contextWindow: 200000, supportsToolCalling: true },\r\n      { id: 'o4-mini', name: 'o4-mini', contextWindow: 200000, supportsToolCalling: true },\r\n    ]\r\n  }\r\n\r\n  resolveModel(model: string): string {\r\n    return model\r\n  }\r\n\r\n  smallFastModel(): string {\r\n    // Matches codex-main's current small GPT-5 family model.\r\n    return 'gpt-5.4-mini'\r\n  }\r\n\r\n  isHealthy(): boolean {\r\n    return this._healthy\r\n  }\r\n\r\n  setHealthy(healthy: boolean): void {\r\n    this._healthy = healthy\r\n  }\r\n\r\n  dispose(): void {\r\n    codexApi.clearChain()\r\n  }\r\n}\r\n\r\n// \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport function resolveReasoning(\r\n  thinking: LaneProviderCallParams['thinking'] | undefined,\r\n  model: string,\r\n): CodexReasoningConfig | undefined {\r\n  // Reasoning-capable families. GPT-5 and o-series accept reasoning; most\r\n  // classic gpt-4.x variants don't. Default to 'medium' when we're sure,\r\n  // otherwise omit (some endpoints 400 on unknown reasoning fields).\r\n  const m = model.toLowerCase()\r\n  const reasoningCapable =\r\n    m.startsWith('gpt-5') || m.startsWith('o1') || m.startsWith('o3') || m.startsWith('o4') || m.startsWith('o5') || m.startsWith('codex-')\r\n  if (!reasoningCapable) return undefined\r\n\r\n  if (isReasoningLevelExplicit()) {\r\n    return { effort: getOpenAIReasoningLevel(), summary: 'auto' }\r\n  }\r\n\r\n  if (!thinking || thinking.type === 'disabled') return undefined\r\n\r\n  if (thinking.type === 'adaptive') return { effort: 'medium', summary: 'auto' }\r\n  const budget = (thinking as any).budget_tokens as number | undefined\r\n  const effort: CodexReasoningConfig['effort'] =\r\n    budget == null ? 'medium' : budget < 2000 ? 'low' : budget < 8000 ? 'medium' : 'high'\r\n  return { effort, summary: 'auto' }\r\n}\r\n\r\n// Walk the conversation history and map each assistant tool_use.id to a\r\n// call_id we'll use in the Responses API function_call_output items. The\r\n// Anthropic tool_use.id is of the form `toolu_codex_<callId>` (set by\r\n// this lane when it emitted the tool_use); strip the prefix to recover\r\n// the original callId. Fall back to the id itself for history items\r\n// from other lanes.\r\nfunction buildToolUseIdToCallIdMap(\r\n  messages: import('../../services/api/providers/base_provider.js').ProviderMessage[],\r\n): Map<string, string> {\r\n  const map = new Map<string, string>()\r\n  for (const msg of messages) {\r\n    if (typeof msg.content === 'string') continue\r\n    for (const block of msg.content) {\r\n      if (block.type === 'tool_use' && block.id) {\r\n        const callId = block.id.startsWith('toolu_codex_')\r\n          ? block.id.slice('toolu_codex_'.length)\r\n          : block.id\r\n        map.set(block.id, callId)\r\n      }\r\n    }\r\n  }\r\n  return map\r\n}\r\n\r\nfunction convertHistoryToCodex(\r\n  messages: import('../../services/api/providers/base_provider.js').ProviderMessage[],\r\n  toolUseIdToCallId: Map<string, string>,\r\n): CodexInputItem[] {\r\n  const out: CodexInputItem[] = []\r\n  // Build a name lookup for tool_result \u2192 function_call_output name.\r\n  const callIdToName = new Map<string, string>()\r\n\r\n  for (const msg of messages) {\r\n    if (typeof msg.content === 'string') {\r\n      const contentPart: CodexContentPart = msg.role === 'assistant'\r\n        ? { type: 'output_text', text: msg.content }\r\n        : { type: 'input_text', text: msg.content }\r\n      out.push({ type: 'message', role: msg.role, content: [contentPart] })\r\n      continue\r\n    }\r\n\r\n    // Split the content blocks into message parts and tool-call items \u2014\r\n    // Responses API expects tool_use / function_call_output at the\r\n    // top-level input array, not nested inside a message item.\r\n    const textParts: CodexContentPart[] = []\r\n    const tailItems: CodexInputItem[] = []\r\n\r\n    for (const block of msg.content) {\r\n      switch (block.type) {\r\n        case 'text':\r\n          if (block.text) {\r\n            textParts.push(msg.role === 'assistant'\r\n              ? { type: 'output_text', text: block.text }\r\n              : { type: 'input_text', text: block.text })\r\n          }\r\n          break\r\n        case 'tool_use': {\r\n          if (!block.id || !block.name) break\r\n          const callId = toolUseIdToCallId.get(block.id) ?? block.id\r\n          // Assistant-emitted tool call. Look up the native name from the\r\n          // registry (block.name is the shared impl id).\r\n          const reg = CODEX_TOOL_REGISTRY.find(r => r.implId === block.name)\r\n          const nativeName = reg?.nativeName ?? block.name\r\n          callIdToName.set(callId, nativeName)\r\n          if (nativeName === 'apply_patch') {\r\n            // Custom tool \u2014 payload is a raw string (the patch body).\r\n            const rawPatch = (block.input as any)?.patch ?? ''\r\n            tailItems.push({\r\n              type: 'custom_tool_call',\r\n              call_id: callId,\r\n              name: nativeName,\r\n              input: typeof rawPatch === 'string' ? rawPatch : JSON.stringify(rawPatch),\r\n            })\r\n          } else {\r\n            // Function tool \u2014 arguments are JSON-encoded.\r\n            const nativeInput = reg ? inverseAdapt(reg.nativeName, block.input ?? {}) : (block.input ?? {})\r\n            tailItems.push({\r\n              type: 'function_call',\r\n              call_id: callId,\r\n              name: nativeName,\r\n              arguments: JSON.stringify(nativeInput),\r\n            })\r\n          }\r\n          break\r\n        }\r\n        case 'tool_result': {\r\n          const id = block.tool_use_id ?? ''\r\n          const callId = toolUseIdToCallId.get(id) ?? id\r\n          const isCustom = callIdToName.get(callId) === 'apply_patch'\r\n          const output = stringifyToolResultContent(block.content)\r\n          tailItems.push(\r\n            isCustom\r\n              ? { type: 'custom_tool_call_output', call_id: callId, output }\r\n              : { type: 'function_call_output', call_id: callId, output },\r\n          )\r\n          break\r\n        }\r\n        case 'thinking':\r\n          // Preserve prior reasoning so the model sees its own thinking in\r\n          // the conversation history. Codex's Responses API accepts this as\r\n          // a `reasoning` input item.\r\n          if (block.thinking) {\r\n            tailItems.push({\r\n              type: 'reasoning',\r\n              summary: [{ type: 'summary_text', text: block.thinking }],\r\n            })\r\n          }\r\n          break\r\n      }\r\n    }\r\n\r\n    if (textParts.length > 0) {\r\n      out.push({ type: 'message', role: msg.role, content: textParts })\r\n    }\r\n    out.push(...tailItems)\r\n  }\r\n\r\n  return out\r\n}\r\n\r\nfunction stringifyToolResultContent(content: unknown): string {\r\n  if (typeof content === 'string') return content\r\n  if (Array.isArray(content)) {\r\n    const parts: string[] = []\r\n    for (const b of content as any[]) {\r\n      if (b && typeof b === 'object') {\r\n        if ('text' in b && typeof b.text === 'string') parts.push(b.text)\r\n        else parts.push(JSON.stringify(b))\r\n      }\r\n    }\r\n    return parts.join('\\n')\r\n  }\r\n  return JSON.stringify(content ?? '')\r\n}\r\n\r\n// Inverse of each native adaptInput. Most are identity; a couple diverge.\r\nfunction inverseAdapt(nativeName: string, input: Record<string, unknown>): Record<string, unknown> {\r\n  switch (nativeName) {\r\n    case 'read_file':\r\n      return input // Codex's read_file shape matches shared Read exactly.\r\n    case 'search_code': {\r\n      const out: Record<string, unknown> = { pattern: input.pattern }\r\n      if (input.path != null) out.path = input.path\r\n      if (input.glob != null) out.include = input.glob\r\n      return out\r\n    }\r\n    default:\r\n      return input\r\n  }\r\n}\r\n\r\n// Build Responses API tools from the caller-provided Anthropic-format\r\n// tool list. Tools that match the native registry get the native schema;\r\n// unknown tools (MCP, custom) pass through as function tools with the\r\n// caller's schema.\r\nfunction buildCodexToolsFromRequest(\r\n  tools: import('../../services/api/providers/base_provider.js').ProviderTool[],\r\n): CodexResponsesRequest['tools'] {\r\n  const out: NonNullable<CodexResponsesRequest['tools']> = []\r\n  for (const tool of tools) {\r\n    const reg = CODEX_TOOL_REGISTRY.find(r => r.implId === tool.name)\r\n      ?? getCodexRegistrationByNativeName(tool.name)\r\n    if (reg) {\r\n      if (reg.nativeName === 'apply_patch') {\r\n        // Freeform tools can't take `strict: true` \u2014 they aren't JSON.\r\n        // apply_patch's Lark grammar is the enforcement mechanism.\r\n        out.push({\r\n          type: 'custom',\r\n          name: 'apply_patch',\r\n          description: reg.nativeDescription,\r\n          format: { type: 'text' },\r\n        })\r\n      } else {\r\n        // strict: true tells the Responses API to server-side-enforce\r\n        // the JSON Schema (required fields + types) against the model's\r\n        // function call \u2014 the OpenAI equivalent of Gemini VALIDATED\r\n        // mode. Empty-args calls get rejected before they stream back.\r\n        out.push({\r\n          type: 'function',\r\n          name: reg.nativeName,\r\n          description: appendStrictParamsHint(reg.nativeDescription, reg.nativeSchema),\r\n          parameters: reg.nativeSchema,\r\n          strict: true,\r\n        })\r\n      }\r\n    } else {\r\n      // Unknown tool (MCP / custom) \u2014 sanitize through the shared bridge\r\n      // with the Codex profile + append the STRICT PARAMETERS hint so\r\n      // the model sees the required-field summary in plain text.\r\n      const parameters = sanitizeSchemaForLane(\r\n        tool.input_schema ?? { type: 'object', properties: {} },\r\n        'codex',\r\n      )\r\n      out.push({\r\n        type: 'function',\r\n        name: tool.name,\r\n        description: appendStrictParamsHint(tool.description ?? '', parameters),\r\n        parameters,\r\n        strict: true,\r\n      })\r\n    }\r\n  }\r\n  return out.length > 0 ? out : undefined\r\n}\r\n\r\n// \u2500\u2500\u2500 System-prompt stable / volatile split \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n//\r\n// Codex's `instructions` field gets hashed into the OpenAI prompt-cache\r\n// prefix exactly like the leading `input` items do. When env / git /\r\n// memory bytes leak into `instructions` they shift the prefix hash\r\n// turn-to-turn, which is the dominant cause of \"cache hits but is\r\n// unstable\" with heavy tool-call sessions or model swaps.\r\n//\r\n// claude.ts only inserts the explicit `__SYSTEM_PROMPT_DYNAMIC_BOUNDARY__`\r\n// marker when `shouldUseGlobalCacheScope()` is true (firstParty only),\r\n// so the codex lane has to handle the no-marker case too. The fallback\r\n// regex set is the same one battle-tested in\r\n// `src/services/api/providers/gemini_provider.ts:splitSystemInstruction`\r\n// \u2014 it keys off the env block, current date, git status, and recent\r\n// commits/branch sections that claudex's prompt builder always emits at\r\n// the tail when a marker is absent.\r\n\r\nconst CODEX_DYNAMIC_BOUNDARY = '__SYSTEM_PROMPT_DYNAMIC_BOUNDARY__'\r\n\r\nconst CODEX_VOLATILE_PATTERNS: readonly RegExp[] = [\r\n  /<env>[\\s\\S]*?<\\/env>/,                 // computeEnvInfo block\r\n  /# Environment\\b[\\s\\S]*?(?=\\n#|$)/,    // computeSimpleEnvInfo block\r\n  /# currentDate\\n[^\\n]+/,                 // \"Today's date is \u2026\"\r\n  /# gitStatus\\b[\\s\\S]*?(?=\\n#|$)/,       // claude.ts gitStatus section\r\n  /gitStatus:[\\s\\S]*?(?=\\n\\n|\\n#|$)/,    // alt key form\r\n  /Current branch:[\\s\\S]*?(?=\\n\\n|\\n#|$)/, // recent commits + branch\r\n]\r\n\r\nexport function splitCodexSystemForCache(text: string): {\r\n  stable: string\r\n  volatile: string\r\n} {\r\n  if (!text) return { stable: '', volatile: '' }\r\n\r\n  // Primary path: explicit boundary marker (firstParty rollouts).\r\n  const markerIdx = text.indexOf(CODEX_DYNAMIC_BOUNDARY)\r\n  if (markerIdx >= 0) {\r\n    return {\r\n      stable: text.slice(0, markerIdx).replace(/\\s+$/, ''),\r\n      volatile: text.slice(markerIdx + CODEX_DYNAMIC_BOUNDARY.length).replace(/^\\s+/, ''),\r\n    }\r\n  }\r\n\r\n  // Fallback: pull known volatile chunks out of the tail. We only treat\r\n  // a match as volatile if it lands in the last 30% of the text \u2014 the\r\n  // dynamic sections are always appended at the end of the system\r\n  // prompt, and we don't want to accidentally strip a tool description\r\n  // that happens to contain the word \"Environment\".\r\n  const cutoff = Math.floor(text.length * 0.7)\r\n  const matches: Array<{ start: number; end: number; text: string }> = []\r\n  for (const pattern of CODEX_VOLATILE_PATTERNS) {\r\n    const m = text.match(pattern)\r\n    if (m && m.index != null && m.index >= cutoff) {\r\n      matches.push({ start: m.index, end: m.index + m[0].length, text: m[0] })\r\n    }\r\n  }\r\n  if (matches.length === 0) return { stable: text, volatile: '' }\r\n\r\n  // Carve from the earliest match's start to end of text. Anything\r\n  // between matches stays attached to the volatile tail \u2014 even if it\r\n  // doesn't itself match a known pattern, it's downstream of dynamic\r\n  // content and therefore can't be stable.\r\n  matches.sort((a, b) => a.start - b.start)\r\n  const cut = matches[0]!.start\r\n  return {\r\n    stable: text.slice(0, cut).replace(/\\s+$/, ''),\r\n    volatile: text.slice(cut).replace(/^\\s+/, ''),\r\n  }\r\n}\r\n\r\n// \u2500\u2500\u2500 Singleton \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport const codexLane = new CodexLane()\r\n", "/**\r\n * Codex Lane \u2014 Native System Prompt\r\n *\r\n * Builds the system prompt in Codex CLI's native structure.\r\n * Key differences from Anthropic/Gemini:\r\n *   - apply_patch as the primary edit tool (not Edit, not replace)\r\n *   - Plan-then-execute workflow\r\n *   - Concise, direct instructions (Codex prompt is shorter than others)\r\n */\r\n\r\nimport type { SystemPromptParts } from '../types.js'\r\nimport {\r\n  type StableSlot,\r\n  type VolatileSlot,\r\n  stableFrom,\r\n  renderVolatileSlot,\r\n  flatten,\r\n} from '../shared/system_slots.js'\r\n\r\n/**\r\n * Codex-native lane preamble. Based on the captured Codex CLI system\r\n * prompt (reference/system-prompts-and-models-of-ai-tools-main/Open\r\n * Source prompts/Codex CLI/openai-codex-cli-system-prompt-20250820.txt)\r\n * distilled to the parts that matter for tool-heavy agent work.\r\n *\r\n * apply_patch is the primary edit primitive \u2014 it's a Freeform tool with\r\n * a Lark grammar (codex-rs/tools/src/apply_patch_tool.rs), not a JSON\r\n * function. The prompt reflects that.\r\n */\r\nconst CODEX_LANE_PREAMBLE = [\r\n  `You are Codex, a coding agent running in the Tau terminal \u2014 pair-programming with the user to read, analyze, modify, and ship code. Be concise, direct, and friendly.`,\n\r\n  `## Plan before acting\r\n\r\nFor non-trivial work, state the plan in 1-3 sentences before you start tool-calling. For simple one-tool queries, just answer. Use the update_plan tool when a task has multiple logical phases.`,\r\n\r\n  `## Editing files \u2014 apply_patch\r\n\r\nUse apply_patch for ALL in-place edits. The patch format is a custom syntax, NOT unified diff:\r\n\r\n*** Begin Patch\r\n*** Add File: path/to/new.ts\r\n+content line\r\n*** Update File: path/to/existing.ts\r\n@@ context anchor\r\n unchanged line\r\n-removed line\r\n+added line\r\n*** Delete File: path/to/gone.ts\r\n*** End Patch\r\n\r\nInclude enough context in @@ hunks that anchor lines are unique in the file. For entirely new files, use *** Add File. Never use *** Update File to create a file; use *** Add File.`,\r\n\r\n  `## Approach\r\n\r\n1. Read relevant code before changing it \u2014 don't guess file paths or function signatures.\r\n2. Make targeted, minimal changes. A bug fix doesn't need surrounding refactoring.\r\n3. Verify (tests, type checks, manual probes) before reporting done.\r\n4. Don't add abstractions for one-off operations.\r\n5. When a shell or tool call fails, diagnose first \u2014 read the exit code and error text, verify the binary/path/env, then make ONE focused fix. Do not iterate on cosmetic variants of the same call (swapping shells, retrying the same path, tweaking flags); blind retries waste input tokens. If two attempts fail for the same reason, stop and investigate.\r\n6. For unfamiliar CLIs or APIs, check \\`--help\\` or the docs once before invoking \u2014 don't guess flags and iterate.`,\r\n\r\n  `## Style\r\n\r\n- Don't add comments that restate what the code does.\r\n- Don't add error handling for scenarios that can't happen.\r\n- Don't refactor code that wasn't part of the task.\r\n- When referencing code, cite file paths (and line numbers when specific).`,\r\n].join('\\n\\n')\r\n\r\n/**\r\n * Assemble the Codex system prompt. Returns the cache-safe stable/\r\n * volatile split so the Responses API's prompt_cache_key points at a\r\n * byte-identical stable prefix across turns.\r\n */\r\nexport function assembleCodexSystemPrompt(\r\n  _model: string,\r\n  parts: SystemPromptParts,\r\n): { stable: StableSlot; volatile: VolatileSlot; full: string } {\r\n  const stable = stableFrom(CODEX_LANE_PREAMBLE, parts)\r\n  const volatile = renderVolatileSlot(parts)\r\n  const full = flatten(stable, volatile)\r\n  return { stable, volatile, full }\r\n}\r\n", "/**\r\n * Codex Lane \u2014 Entry Point\r\n *\r\n * Handles OpenAI models: GPT-5, Codex, o-series.\r\n * Uses native Codex patterns (apply_patch, shell, Chat Completions/Responses API).\r\n */\r\n\r\nexport { codexLane, CodexLane } from './loop.js'\r\nexport {\r\n  CODEX_TOOL_REGISTRY,\r\n  buildCodexFunctionDeclarations,\r\n  buildCodexResponsesTools,\r\n  getCodexRegistrationByNativeName,\r\n} from './tools.js'\r\nexport { assembleCodexSystemPrompt } from './prompt.js'\r\nexport { codexApi, CodexApiClient, CodexApiError } from './api.js'\r\n\r\nimport { codexLane } from './loop.js'\r\nimport { registerLane } from '../dispatcher.js'\r\n\r\nexport function initCodexLane(opts?: {\r\n  apiKey?: string\r\n  baseUrl?: string\r\n  chatgptAccessToken?: string\r\n  chatgptAccountId?: string\r\n  chatgptIdToken?: string\r\n}): void {\r\n  const apiKey = opts?.apiKey ?? process.env.OPENAI_API_KEY\r\n  const baseUrl = opts?.baseUrl ?? process.env.OPENAI_BASE_URL\r\n  const chatgptAccessToken = opts?.chatgptAccessToken ?? process.env.OPENAI_CHATGPT_ACCESS_TOKEN\r\n  // Optional org slug matching codex-rs's `ChatGPT-Account-ID` header.\r\n  // When unset, the lane auto-decodes it from the id_token / access_token\r\n  // JWT (native codex behavior). If extraction also fails, the header is\r\n  // simply omitted \u2014 same as codex-rs when the token lacks the claim.\r\n  const chatgptAccountId = opts?.chatgptAccountId ?? process.env.OPENAI_CHATGPT_ACCOUNT_ID\r\n  // Prefer the id_token for claim extraction \u2014 it's the token native\r\n  // codex reads. Fall back to the access_token (some deployments carry\r\n  // the same claim there).\r\n  const chatgptIdToken = opts?.chatgptIdToken ?? process.env.OPENAI_CHATGPT_ID_TOKEN\r\n  codexLane.configure({ apiKey, baseUrl, chatgptAccessToken, chatgptAccountId, chatgptIdToken })\r\n  registerLane(codexLane)\r\n  codexLane.setHealthy(!!(apiKey || chatgptAccessToken))\r\n}\r\n", "/**\r\n * OpenAI-Compatible Lane \u2014 Tool Registry\r\n *\r\n * Clean, standard tool names that work well with any model trained on\r\n * OpenAI's function-calling format. DeepSeek, Groq, NIM, Ollama,\r\n * OpenRouter, Mistral, xAI, etc. all speak this format.\r\n *\r\n * Tool names are deliberately generic and descriptive \u2014 these models\r\n * don't have a specific CLI they were trained against, so clear names\r\n * that match common coding-assistant patterns work best.\r\n *\r\n * Three edit primitives are exposed, with per-model selection handled\r\n * in `capabilities.ts` / per-provider transformers:\r\n *\r\n *   - `str_replace`   \u2014 simplest; frontier-agnostic, single exact swap.\r\n *   - `edit_block`    \u2014 SEARCH/REPLACE format; Aider-trained models\r\n *                       (DeepSeek-Coder, Codestral, Qwen-Coder, Kimi).\r\n *   - `edit_file`     \u2014 the classic old_text/new_text style, kept for\r\n *                       backward compatibility.\r\n *\r\n * The lane selects ONE edit tool per request based on the transformer's\r\n * `preferredEditFormat(model)` so the model sees one clear way to edit\r\n * rather than three overlapping options.\r\n */\r\n\r\nimport type { LaneToolRegistration } from '../types.js'\nimport { WEB_SEARCH_NATIVE_DESCRIPTION } from '../../tools/WebSearchTool/prompt.js'\n\r\nexport const OPENAI_COMPAT_TOOL_REGISTRY: LaneToolRegistration[] = [\r\n  {\r\n    nativeName: 'execute_command',\r\n    implId: 'Bash',\r\n    nativeDescription: 'Execute a shell command and return its output.',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        command: { type: 'string', description: 'The shell command to execute.' },\r\n        description: { type: 'string', description: 'Brief description of what the command does.' },\r\n      },\r\n      required: ['command'],\r\n    },\r\n    adaptInput(native) {\r\n      const out: Record<string, unknown> = { command: native.command }\r\n      if (native.description) out.description = native.description\r\n      return out\r\n    },\r\n    adaptOutput(output) { return typeof output === 'string' ? output : JSON.stringify(output) },\r\n  },\r\n  {\r\n    nativeName: 'read_file',\r\n    implId: 'Read',\r\n    nativeDescription: 'Read the contents of a file.',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        path: { type: 'string', description: 'Path to the file.' },\r\n        start_line: { type: 'number', description: 'Start line (1-based). Optional.' },\r\n        end_line: { type: 'number', description: 'End line (1-based, inclusive). Optional.' },\r\n      },\r\n      required: ['path'],\r\n    },\r\n    adaptInput(native) {\r\n      const result: Record<string, unknown> = { file_path: native.path }\r\n      if (native.start_line != null) {\r\n        result.offset = (native.start_line as number) - 1\r\n        if (native.end_line != null) {\r\n          result.limit = (native.end_line as number) - (native.start_line as number) + 1\r\n        }\r\n      }\r\n      return result\r\n    },\r\n    adaptOutput(output) { return typeof output === 'string' ? output : JSON.stringify(output) },\r\n  },\r\n  {\r\n    nativeName: 'write_file',\r\n    implId: 'Write',\r\n    nativeDescription: 'Write content to a file. Creates the file if it does not exist. Overwrites otherwise. Use str_replace/edit_block/edit_file for targeted edits to existing files.',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        path: { type: 'string', description: 'Path to the file.' },\r\n        content: { type: 'string', description: 'The complete file content to write.' },\r\n      },\r\n      required: ['path', 'content'],\r\n    },\r\n    adaptInput(native) {\r\n      return { file_path: native.path, content: native.content }\r\n    },\r\n    adaptOutput(output) { return typeof output === 'string' ? output : JSON.stringify(output) },\r\n  },\r\n  // \u2500\u2500 Edit primitive #1 \u2500\u2500 str_replace (simplest, frontier-agnostic) \u2500\u2500\r\n  {\r\n    nativeName: 'str_replace',\r\n    implId: 'Edit',\r\n    nativeDescription:\r\n      'Replace exactly one occurrence of a string in a file. The string must match EXACTLY (whitespace, newlines, punctuation). Include enough surrounding context in `old_str` to make the match unique. For multiple edits to the same file, call this tool multiple times in sequence.',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        path: { type: 'string', description: 'Path to the file.' },\r\n        old_str: { type: 'string', description: 'Exact string to find. Include surrounding context for uniqueness.' },\r\n        new_str: { type: 'string', description: 'Replacement string.' },\r\n      },\r\n      required: ['path', 'old_str', 'new_str'],\r\n    },\r\n    adaptInput(native) {\r\n      return { file_path: native.path, old_string: native.old_str, new_string: native.new_str }\r\n    },\r\n    adaptOutput(output) { return typeof output === 'string' ? output : JSON.stringify(output) },\r\n  },\r\n  // \u2500\u2500 Edit primitive #2 \u2500\u2500 edit_block (SEARCH/REPLACE; Aider-trained) \u2500\u2500\r\n  {\r\n    nativeName: 'edit_block',\r\n    implId: 'Edit',\r\n    nativeDescription:\r\n      'Apply a SEARCH/REPLACE edit to a file. Use this when your training includes Aider-style edit blocks. The `search` text must match exactly (including indentation); include 3+ lines of surrounding context when possible so the match is unique. Call multiple times for multiple edits.',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        path: { type: 'string', description: 'Path to the file.' },\r\n        search: { type: 'string', description: 'The exact block to find (the content between <<<<<<< SEARCH and =======).' },\r\n        replace: { type: 'string', description: 'The replacement block (the content between ======= and >>>>>>> REPLACE).' },\r\n      },\r\n      required: ['path', 'search', 'replace'],\r\n    },\r\n    adaptInput(native) {\r\n      return { file_path: native.path, old_string: native.search, new_string: native.replace }\r\n    },\r\n    adaptOutput(output) { return typeof output === 'string' ? output : JSON.stringify(output) },\r\n  },\r\n  // \u2500\u2500 Edit primitive #3 \u2500\u2500 edit_file (legacy old_text/new_text) \u2500\u2500\r\n  {\r\n    nativeName: 'edit_file',\r\n    implId: 'Edit',\r\n    nativeDescription: 'Replace text in a file. The old_text must match exactly. Kept for models trained on this name; str_replace is preferred for new deployments.',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        path: { type: 'string', description: 'Path to the file.' },\r\n        old_text: { type: 'string', description: 'The exact text to find and replace.' },\r\n        new_text: { type: 'string', description: 'The replacement text.' },\r\n      },\r\n      required: ['path', 'old_text', 'new_text'],\r\n    },\r\n    adaptInput(native) {\r\n      return { file_path: native.path, old_string: native.old_text, new_string: native.new_text }\r\n    },\r\n    adaptOutput(output) { return typeof output === 'string' ? output : JSON.stringify(output) },\r\n  },\r\n  {\r\n    nativeName: 'find_files',\r\n    implId: 'Glob',\r\n    nativeDescription: 'Find files matching a glob pattern.',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        pattern: { type: 'string', description: 'Glob pattern (e.g., \"**/*.ts\").' },\r\n        directory: { type: 'string', description: 'Directory to search in.' },\r\n      },\r\n      required: ['pattern'],\r\n    },\r\n    adaptInput(native) {\r\n      const out: Record<string, unknown> = { pattern: native.pattern }\r\n      if (native.directory) out.path = native.directory\r\n      return out\r\n    },\r\n    adaptOutput(output) { return typeof output === 'string' ? output : JSON.stringify(output) },\r\n  },\r\n  {\r\n    nativeName: 'search_text',\r\n    implId: 'Grep',\r\n    nativeDescription: 'Search for a regex pattern in file contents.',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        pattern: { type: 'string', description: 'Regex pattern to search for.' },\r\n        directory: { type: 'string', description: 'Directory to search in.' },\r\n        file_pattern: { type: 'string', description: 'Glob to filter files (e.g., \"*.py\").' },\r\n      },\r\n      required: ['pattern'],\r\n    },\r\n    adaptInput(native) {\r\n      const out: Record<string, unknown> = { pattern: native.pattern }\r\n      if (native.directory) out.path = native.directory\r\n      if (native.file_pattern) out.glob = native.file_pattern\r\n      return out\r\n    },\r\n    adaptOutput(output) { return typeof output === 'string' ? output : JSON.stringify(output) },\r\n  },\r\n  {\n    nativeName: 'web_search',\n    implId: 'WebSearch',\n    nativeDescription: WEB_SEARCH_NATIVE_DESCRIPTION,\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        query: { type: 'string', description: 'Search query.' },\r\n      },\r\n      required: ['query'],\r\n    },\r\n    adaptInput(native) { return { query: native.query } },\r\n    adaptOutput(output) { return typeof output === 'string' ? output : JSON.stringify(output) },\r\n  },\r\n]\r\n\r\n// \u2500\u2500\u2500 Edit-primitive filtering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n//\r\n// Models that see THREE overlapping edit tools (str_replace,\r\n// edit_block, edit_file) pick randomly between them and the\r\n// resulting diff quality is worse than if they see ONE tool that\r\n// matches their post-training. Before sending tools to the model we\r\n// filter to a single edit primitive per the transformer's\r\n// `preferredEditFormat(model)` decision.\r\n\r\nconst EDIT_TOOL_NAMES: Record<'apply_patch' | 'edit_block' | 'str_replace', string> = {\r\n  // apply_patch is NOT in this registry \u2014 the compat lane doesn't\r\n  // expose it (apply_patch's grammar needs Codex's Freeform tool\r\n  // type which Chat-Completions providers don't support). Transformers\r\n  // that select apply_patch will fall through to str_replace here.\r\n  apply_patch: 'str_replace',\r\n  edit_block: 'edit_block',\r\n  str_replace: 'str_replace',\r\n}\r\n\r\nconst ALL_EDIT_TOOL_NAMES = new Set(['str_replace', 'edit_block', 'edit_file'])\r\n\r\n/**\r\n * Filter the registry to expose ONE edit tool matching the preferred\r\n * format. Non-edit tools are always passed through unchanged.\r\n */\r\nexport function selectEditToolSet(\r\n  preferred: 'apply_patch' | 'edit_block' | 'str_replace',\r\n): LaneToolRegistration[] {\r\n  const keepName = EDIT_TOOL_NAMES[preferred] ?? 'str_replace'\r\n  return OPENAI_COMPAT_TOOL_REGISTRY.filter(r =>\r\n    !ALL_EDIT_TOOL_NAMES.has(r.nativeName) || r.nativeName === keepName,\r\n  )\r\n}\r\n\r\n// \u2500\u2500\u2500 Exports \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport function buildOpenAICompatFunctions(): Array<{\r\n  name: string\r\n  description: string\r\n  parameters: Record<string, unknown>\r\n}> {\r\n  return OPENAI_COMPAT_TOOL_REGISTRY.map(r => ({\r\n    name: r.nativeName, description: r.nativeDescription, parameters: r.nativeSchema,\r\n  }))\r\n}\r\n\r\nconst _byName = new Map<string, LaneToolRegistration>()\r\nfunction idx(): void {\r\n  if (_byName.size > 0) return\r\n  for (const r of OPENAI_COMPAT_TOOL_REGISTRY) _byName.set(r.nativeName, r)\r\n}\r\n\r\nexport function resolveToolCall(\r\n  name: string, args: Record<string, unknown>,\r\n): { implId: string; input: Record<string, unknown> } | null {\r\n  idx()\r\n  const r = _byName.get(name)\r\n  if (!r) return null\r\n  return { implId: r.implId, input: r.adaptInput(args) }\r\n}\r\n\r\nexport function formatToolResult(name: string, output: string | unknown): string {\r\n  idx()\r\n  const r = _byName.get(name)\r\n  if (!r) return typeof output === 'string' ? output : JSON.stringify(output)\r\n  return r.adaptOutput(output)\r\n}\r\n\r\nexport function getCompatRegistrationByNativeName(name: string): LaneToolRegistration | undefined {\r\n  idx()\r\n  return _byName.get(name)\r\n}\r\n", "/**\r\n * Compact, example-driven shell-tool descriptions for the OpenAI-compat\r\n * lane.\r\n *\r\n * The frontier-tier Bash/PowerShell descriptions (in tools/BashTool/prompt.ts\r\n * and tools/PowerShellTool/prompt.ts) are long-form rule lists. They work\r\n * for Claude / Codex / Gemini-2.5 / GPT-5, but weak models on the compat\r\n * lane (DeepSeek, GLM, Moonshot, MiniMax, Groq, OpenRouter long-tail,\r\n * Ollama, LM Studio) drown in the volume and emit wrong-shell syntax \u2014\r\n * PowerShell idioms in a bash command, missing quotes around paths with\r\n * spaces, `cd dir && cmd` instead of `workdir`, here-strings indented\r\n * past column 0, etc.\r\n *\r\n * This module emits ~25-40 line descriptions per shell with concrete\r\n * good/bad pairs. The mental model is: a small model can imitate\r\n * patterns much better than it can derive correct syntax from rules.\r\n *\r\n * Cache-stability invariant: the output of these functions must be\r\n * deterministic given (toolName, platform, psEdition). Do not include\r\n * homedir / tmpdir / session id / timestamps \u2014 the compat lane caches\r\n * tool descriptions per session and any per-call data would churn the\r\n * upstream prompt-cache prefix every turn.\r\n */\r\n\r\nimport type { POSIXShellEdition } from './shell_descriptions_types.js'\r\n\r\nexport interface CompatShellDescriptionCtx {\r\n  platform: NodeJS.Platform\r\n  psEdition: POSIXShellEdition | null\r\n}\r\n\r\n/**\r\n * Returns a compact description for the named shell tool, or undefined\r\n * when the tool isn't a known shell tool (caller falls back to the\r\n * tool's original description).\r\n */\r\nexport function getCompatShellDescription(\r\n  toolName: string,\r\n  ctx: CompatShellDescriptionCtx,\r\n): string | undefined {\r\n  if (toolName === 'Bash') return buildBashDescription(ctx)\r\n  if (toolName === 'PowerShell') return buildPowerShellDescription(ctx)\r\n  return undefined\r\n}\r\n\r\n// \u2500\u2500\u2500 Bash \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nfunction buildBashDescription(ctx: CompatShellDescriptionCtx): string {\r\n  const isWindows = ctx.platform === 'win32'\r\n  const windowsNote = isWindows\r\n    ? `On Windows this tool runs in Git Bash. Use POSIX paths (\\`/c/Users/...\\`) \u2014 NOT Windows paths (\\`C:\\\\Users\\\\...\\`). Backslashes are escape characters in bash so \\`\\\\U\\`, \\`\\\\n\\`, \\`\\\\t\\` get interpreted instead of passed through literally. Use \\`2>/dev/null\\`, never \\`2>nul\\` (writing to \\`nul\\` creates a literal file that breaks git).`\r\n    : 'POSIX paths only; backslashes are escapes in bash.'\r\n\r\n  return [\r\n    'Run a bash command and return its output. Use this for git, npm, build/test runners, package managers, and any other terminal-driven workflow.',\r\n    '',\r\n    'DO NOT use this for file ops \u2014 call the dedicated tools:',\r\n    '- Read files \u2192 Read tool (NOT `cat` / `head` / `tail`).',\r\n    '- Search filenames \u2192 Glob tool (NOT `find` / `ls -R`).',\r\n    '- Search file contents \u2192 Grep tool (NOT `grep` / `rg`).',\r\n    '- Edit files \u2192 Edit / Write tools (NOT `sed` / `awk` / `echo >`).',\r\n    '',\r\n    'Required: `command`. Optional: `description` (one short active-voice phrase), `timeout` (milliseconds), `workdir` (run from a different directory \u2014 do NOT use `cd dir && cmd`).',\r\n    '',\r\n    'Examples \u2014 good vs bad:',\r\n    '- Good: `git status` \u00B7 Bad: `cd /repo && git status` (use `workdir: \"/repo\"` instead).',\r\n    '- Good: `cat \"path with spaces/file.txt\"` \u00B7 Bad: `cat path with spaces/file.txt` (the unquoted path is parsed as four args).',\r\n    '- Good: `git add . && git commit -m \"fix\"` \u00B7 Bad: `git add .\\\\ngit commit -m \"fix\"` (do not use newlines to separate commands; use `&&` to chain).',\r\n    '- Good: `git commit -m \"$(cat <<\\'EOF\\'\\nMultiline\\nmessage\\nEOF\\n)\"` \u00B7 Bad: passing a multi-line message via interpolated double-quoted string (variables and backticks expand).',\r\n    '',\r\n    'Chaining: `&&` runs the next command only if the previous one succeeded; `;` runs it regardless. Independent commands belong in parallel tool calls in the SAME assistant message, not chained.',\r\n    '',\r\n    'When a command fails, read the exit code and stderr before retrying. Don\\'t iterate on cosmetic variants of the same call \u2014 diagnose first. After two same-cause failures stop and investigate.',\r\n    '',\r\n    windowsNote,\r\n  ].join('\\n')\r\n}\r\n\r\n// \u2500\u2500\u2500 PowerShell \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nfunction buildPowerShellDescription(ctx: CompatShellDescriptionCtx): string {\r\n  const edition = ctx.psEdition\r\n  const chainLine =\r\n    edition === 'core'\r\n      ? '- Chain operators: `&&` and `||` ARE available (PowerShell 7+); prefer them when later commands should only run on success.'\r\n      : '- Chain operators: `&&` and `||` are NOT available in Windows PowerShell 5.1 (parser error). To chain on success use `A; if ($?) { B }`. To chain unconditionally use `A; B`.'\r\n\r\n  const editionNotes =\r\n    edition === 'core'\r\n      ? '- Edition: PowerShell 7+ (pwsh). UTF-8 default encoding. Ternary `$c ? $a : $b`, null-coalescing `??`, and null-conditional `?.` are available.'\r\n      : edition === 'desktop'\r\n        ? '- Edition: Windows PowerShell 5.1 (powershell.exe). Default file encoding is UTF-16 LE with BOM \u2014 pass `-Encoding utf8` to `Out-File` / `Set-Content` when other tools will read the file. Ternary `?:`, null-coalescing `??`, and null-conditional `?.` are NOT available \u2014 use `if/else` and explicit `$null -eq` checks.'\r\n        : '- Edition: not yet resolved. Assume Windows PowerShell 5.1 syntax for compatibility (no `&&`, no ternary, no `??`, no `?.`).'\r\n\r\n  return [\r\n    'Run a PowerShell command and return its output. Use this for git, npm, build/test runners, and PowerShell cmdlets on Windows.',\r\n    '',\r\n    'DO NOT use this for file ops \u2014 call the dedicated tools:',\r\n    '- Read files \u2192 Read tool (NOT `Get-Content`).',\r\n    '- Search filenames \u2192 Glob tool (NOT `Get-ChildItem -Recurse`).',\r\n    '- Search file contents \u2192 Grep tool (NOT `Select-String`).',\r\n    '- Edit/write files \u2192 Edit / Write tools (NOT `Set-Content` / `Out-File`).',\r\n    '',\r\n    'Required: `command`. Optional: `description`, `timeout` (milliseconds), `workdir` (run from a different directory \u2014 do NOT prefix with `Set-Location` / `cd`).',\r\n    '',\r\n    'PowerShell syntax (re-read before each call):',\r\n    editionNotes,\r\n    chainLine,\r\n    '- Variables: `$myVar = \"value\"`. Escape character is backtick (`), NOT backslash.',\r\n    '- Cmdlet naming: prefer full Verb-Noun (`Get-ChildItem`, `Remove-Item`) over aliases (`ls`, `rm`).',\r\n    '- Environment vars: read with `$env:NAME`, set with `$env:NAME = \"value\"` (NOT `export`, NOT `Set-Variable`).',\r\n    '- Native exe with spaces in path: use the call operator `& \"C:\\\\Program Files\\\\app\\\\app.exe\" arg1`.',\r\n    '- Multi-line strings to native exes: use a single-quoted here-string and the closing `\\'@` MUST be at column 0 (no indent \u2014 that\\'s a parser error):',\r\n    '',\r\n    '<example>',\r\n    'git commit -m @\\'',\r\n    'Commit subject.',\r\n    'Body line.',\r\n    '\\'@',\r\n    '</example>',\r\n    '',\r\n    'Examples \u2014 good vs bad:',\r\n    '- Good: `Get-ChildItem -LiteralPath \"C:\\\\Path With Spaces\"` \u00B7 Bad: `Get-ChildItem -LiteralPath C:\\\\Path With Spaces` (path splits at the space).',\r\n    edition === 'core'\r\n      ? '- Good: `npm install && npm test` \u00B7 Bad: `npm install; npm test` (the `;` runs the second even on failure).'\r\n      : '- Good: `npm install; if ($?) { npm test }` \u00B7 Bad: `npm install && npm test` (`&&` is a parser error on 5.1).',\r\n    '- Good: `Remove-Item -Recurse -Force -Confirm:$false \"$tmp\"` \u00B7 Bad: `Remove-Item -Recurse \"$tmp\"` (cmdlet will prompt; this tool is non-interactive and the prompt hangs).',\r\n    '',\r\n    'Never use interactive cmdlets \u2014 they hang under `-NonInteractive`: `Read-Host`, `Get-Credential`, `Out-GridView`, `pause`, `git rebase -i`, `git add -i`. For destructive cmdlets pass `-Confirm:$false`. Use `-Force` only for read-only/hidden items.',\r\n    '',\r\n    'When a command fails, read the exit code and stderr before retrying. Don\\'t iterate on cosmetic variants \u2014 diagnose first. After two same-cause failures stop and investigate.',\r\n  ].join('\\n')\r\n}\r\n", "/**\r\n * Single-shell filter for the openai-compat lane.\r\n *\r\n * Background: claudex exposes BOTH `BashTool` and `PowerShellTool` on\r\n * Windows when (a) git-bash is installed AND (b) PowerShellTool is\r\n * gated on (ant users by default, external users via\r\n * `CLAUDE_CODE_USE_POWERSHELL_TOOL=1`). Frontier models can decide\r\n * which one to use based on context; weak models on the compat lane\r\n * (DeepSeek, GLM, Moonshot, MiniMax, Groq long-tail) routinely pick\r\n * the wrong one mid-session and emit cross-shell syntax \u2014 `&&` chained\r\n * commands sent to PowerShell 5.1, `$env:VAR` sent to bash, etc.\r\n *\r\n * Strategy: when both tools are in the array passed to the lane, keep\r\n * exactly one. Pick based on the user's environment, with PowerShell\r\n * winning on Windows by default (it's the always-available shell).\r\n *\r\n * Selection order (first match wins):\r\n *   1. `CLAUDE_CODE_SHELL` env points to a shell binary \u2192 keep that\r\n *      shell's tool. Lets users with a strong preference override.\r\n *   2. Non-Windows platform \u2192 keep Bash (PowerShell is exotic).\r\n *   3. `$SHELL` env points to bash AND git-bash is on PATH \u2192 keep Bash.\r\n *   4. Otherwise (Windows default) \u2192 keep PowerShell.\r\n *\r\n * Caller: invoke once per request from `streamAsProvider`, AFTER the\r\n * transformer's `filterTools()` hook so per-model tool budgets still\r\n * win.\r\n */\r\n\r\nimport { findGitBashPath } from '../../utils/windowsPaths.js'\r\nimport { getPlatform } from '../../utils/platform.js'\r\n\r\ninterface Named {\r\n  name: string\r\n}\r\n\r\nconst BASH_NAME = 'Bash'\r\nconst PS_NAME = 'PowerShell'\r\n\r\n/**\r\n * If both shell tools are present, drop one and return a new array.\r\n * If only one (or neither) is present, returns the input unchanged.\r\n */\r\nexport function filterToSingleShell<T extends Named>(tools: T[]): T[] {\r\n  const hasBash = tools.some(t => t.name === BASH_NAME)\r\n  const hasPS = tools.some(t => t.name === PS_NAME)\r\n  if (!hasBash || !hasPS) return tools\r\n\r\n  const keep = pickPreferredShell()\r\n  const drop = keep === BASH_NAME ? PS_NAME : BASH_NAME\r\n  return tools.filter(t => t.name !== drop)\r\n}\r\n\r\n/**\r\n * Internal \u2014 exported only for the regression test.\r\n */\r\nexport function pickPreferredShell(): typeof BASH_NAME | typeof PS_NAME {\r\n  const override = process.env.CLAUDE_CODE_SHELL?.toLowerCase() ?? ''\r\n  if (override.includes('powershell') || override.includes('pwsh')) {\r\n    return PS_NAME\r\n  }\r\n  if (\r\n    override.includes('bash') ||\r\n    override.endsWith('/sh') ||\r\n    override.endsWith('/zsh')\r\n  ) {\r\n    return BASH_NAME\r\n  }\r\n\r\n  if (getPlatform() !== 'windows') {\r\n    return BASH_NAME\r\n  }\r\n\r\n  const userShell = process.env.SHELL?.toLowerCase() ?? ''\r\n  if (userShell.includes('bash') && findGitBashPath() !== null) {\r\n    return BASH_NAME\r\n  }\r\n\r\n  return PS_NAME\r\n}\r\n", "import { realpath, stat } from 'fs/promises'\nimport { getPlatform } from '../platform.js'\nimport { which } from '../which.js'\n\nasync function probePath(p: string): Promise<string | null> {\n  try {\n    return (await stat(p)).isFile() ? p : null\n  } catch {\n    return null\n  }\n}\n\n/**\n * Attempts to find PowerShell on the system via PATH.\n * Prefers pwsh (PowerShell Core 7+), falls back to powershell (5.1).\n *\n * On Linux, if PATH resolves to a snap launcher (/snap/\u2026) \u2014 directly or\n * via a symlink chain like /usr/bin/pwsh \u2192 /snap/bin/pwsh \u2014 probe known\n * apt/rpm install locations instead: the snap launcher can hang in\n * subprocesses while snapd initializes confinement, but the underlying\n * binary at /opt/microsoft/powershell/7/pwsh is reliable. On\n * Windows/macOS, PATH is sufficient.\n */\nexport async function findPowerShell(): Promise<string | null> {\n  const pwshPath = await which('pwsh')\n  if (pwshPath) {\n    // Snap launcher hangs in subprocesses. Prefer the direct binary.\n    // Check both the resolved PATH entry and its symlink target: on\n    // some distros /usr/bin/pwsh is a symlink to /snap/bin/pwsh, which\n    // would bypass a naive startsWith('/snap/') on the which() result.\n    if (getPlatform() === 'linux') {\n      const resolved = await realpath(pwshPath).catch(() => pwshPath)\n      if (pwshPath.startsWith('/snap/') || resolved.startsWith('/snap/')) {\n        const direct =\n          (await probePath('/opt/microsoft/powershell/7/pwsh')) ??\n          (await probePath('/usr/bin/pwsh'))\n        if (direct) {\n          const directResolved = await realpath(direct).catch(() => direct)\n          if (\n            !direct.startsWith('/snap/') &&\n            !directResolved.startsWith('/snap/')\n          ) {\n            return direct\n          }\n        }\n      }\n    }\n    return pwshPath\n  }\n\n  const powershellPath = await which('powershell')\n  if (powershellPath) {\n    return powershellPath\n  }\n\n  return null\n}\n\nlet cachedPowerShellPath: Promise<string | null> | null = null\n\n/**\n * Gets the cached PowerShell path. Returns a memoized promise that\n * resolves to the PowerShell executable path or null.\n */\nexport function getCachedPowerShellPath(): Promise<string | null> {\n  if (!cachedPowerShellPath) {\n    cachedPowerShellPath = findPowerShell()\n  }\n  return cachedPowerShellPath\n}\n\nexport type PowerShellEdition = 'core' | 'desktop'\n\n/**\n * Infers the PowerShell edition from the binary name without spawning.\n * - `pwsh` / `pwsh.exe` \u2192 'core' (PowerShell 7+: supports `&&`, `||`, `?:`, `??`)\n * - `powershell` / `powershell.exe` \u2192 'desktop' (Windows PowerShell 5.1:\n *   no pipeline chain operators, stderr-sets-$? bug, UTF-16 default encoding)\n *\n * PowerShell 6 (also `pwsh`, no `&&`) has been EOL since 2020 and is not\n * a realistic install target, so 'core' safely implies 7+ semantics.\n *\n * Used by the tool prompt to give version-appropriate syntax guidance so\n * the model doesn't emit `cmd1 && cmd2` on 5.1 (parser error) or avoid\n * `&&` on 7+ where it's the correct short-circuiting operator.\n */\nexport async function getPowerShellEdition(): Promise<PowerShellEdition | null> {\n  const p = await getCachedPowerShellPath()\n  if (!p) return null\n  // basename without extension, case-insensitive. Covers:\n  //   C:\\Program Files\\PowerShell\\7\\pwsh.exe\n  //   /opt/microsoft/powershell/7/pwsh\n  //   C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe\n  const base = p\n    .split(/[/\\\\]/)\n    .pop()!\n    .toLowerCase()\n    .replace(/\\.exe$/, '')\n  return base === 'pwsh' ? 'core' : 'desktop'\n}\n\n/**\n * Resets the cached PowerShell path. Only for testing.\n */\nexport function resetPowerShellCache(): void {\n  cachedPowerShellPath = null\n}\n", "/**\n * DeepSeek V4 thinking-mode toggle.\n *\n * V4 (deepseek-v4-flash, deepseek-v4-pro) defaults `thinking: enabled`\n * server-side. Without an explicit toggle Tau inherits that default\n * and later tool turns 400 on missing reasoning_content.\n *\n * The model picker writes the user's choice here; the deepseek transformer\n * reads it at request time so the picker \u2014 not the hidden /thinking\n * command \u2014 owns the V4 thinking flow.\n *\n * Scope: V4 models only. deepseek-reasoner / deepseek-chat / deepseek-coder\n * keep their existing behavior driven by the global thinking config.\n */\n\nconst V4_THINKING_MODELS: ReadonlySet<string> = new Set([\n  'deepseek-v4-flash',\n  'deepseek-v4-pro',\n])\n\nlet _v4Enabled = false\n\nexport function isDeepSeekV4ThinkingModel(model: string): boolean {\n  return V4_THINKING_MODELS.has(model)\n}\n\nexport function getDeepSeekV4Thinking(): boolean {\n  return _v4Enabled\n}\n\nexport function setDeepSeekV4Thinking(enabled: boolean): void {\n  _v4Enabled = enabled\n}\n\nexport function toggleDeepSeekV4Thinking(): boolean {\n  _v4Enabled = !_v4Enabled\n  return _v4Enabled\n}\n", "/**\n * DeepSeek transformer.\n *\n * - Hard-caps `max_tokens` at 8192 (upstream 400s past that).\n * - Supports `function.strict: true` for reasoner-compatible tool calls.\n * - Emits `reasoning_content` on stream deltas \u2014 pass through as-is;\n *   loop.ts surfaces it as a thinking_delta.\n * - `thinking: { type: 'enabled' }` only when user/model requested reasoning.\n *   DeepSeek V4 defaults thinking on, so non-reasoning turns must send an\n *   explicit disabled toggle or later tool turns can 400 on missing\n *   `reasoning_content`. The V4 toggle lives in the model picker (see\n *   `utils/model/deepseekThinking.ts`); the hidden `/thinking` command\n *   does not drive V4 \u2014 picker is authoritative.\n */\n\nimport type { Transformer, TransformContext } from './base.js'\nimport type { OpenAIChatRequest, OpenAIChatMessage } from './shared_types.js'\nimport {\n  getDeepSeekV4Thinking,\n  isDeepSeekV4ThinkingModel,\n} from '../../../utils/model/deepseekThinking.js'\n\nexport const deepseekTransformer: Transformer = {\n  id: 'deepseek',\n  displayName: 'DeepSeek',\n  defaultBaseUrl: 'https://api.deepseek.com/v1',\n\n  supportsStrictMode: () => true,\n\n  clampMaxTokens(requested: number): number {\n    return requested > 8192 ? 8192 : requested\n  },\n\n  transformRequest(body: OpenAIChatRequest, ctx: TransformContext): OpenAIChatRequest {\n    const thinkingEnabled = resolveDeepSeekThinking(ctx.model, ctx.isReasoning)\n\n    if (thinkingEnabled) {\n      body.thinking = { type: 'enabled' }\n      body.messages = sanitizeDeepSeekToolCallAdjacency(body.messages)\n      return body\n    }\n\n    body.thinking = { type: 'disabled' }\n    body.messages = sanitizeDeepSeekToolCallAdjacency(\n      body.messages.map(stripDeepSeekReasoningContent),\n    )\n    return body\n  },\n\n  normalizeStreamDelta(_delta, _finishReason): void {\n    // DeepSeek already emits reasoning_content; nothing to rename.\n  },\n\n  schemaDropList(): Set<string> {\n    return new Set(['$schema', '$id', '$ref', '$comment'])\n  },\n\n  contextExceededMarkers(): string[] {\n    return ['context length', 'context_length_exceeded', 'prompt is too long', 'too long']\n  },\n\n  preferredEditFormat(model: string): 'apply_patch' | 'edit_block' | 'str_replace' {\n    // DeepSeek-Coder was trained heavily on Aider-style SEARCH/REPLACE.\n    const m = model.toLowerCase()\n    if (m.includes('coder')) return 'edit_block'\n    return 'str_replace'\n  },\n\n  smallFastModel(_model: string): string | null {\n    return 'deepseek-chat'\n  },\n\n  cacheControlMode(): 'none' | 'passthrough' | 'last-only' {\n    // DeepSeek's OpenAI-compat endpoint doesn't honor Anthropic-style\n    // cache_control; strip rather than let it 400 on unknown fields.\n    return 'none'\n  },\n}\n\nfunction isDeepSeekReasoningModel(model: string): boolean {\n  return /\\bdeepseek-reasoner\\b/i.test(model)\n}\n\nfunction resolveDeepSeekThinking(model: string, isReasoning: boolean): boolean {\n  // V4 picker toggle is authoritative \u2014 the hidden /thinking command and\n  // the global thinkingConfig do not drive deepseek-v4-flash / -pro.\n  if (isDeepSeekV4ThinkingModel(model)) return getDeepSeekV4Thinking()\n  return isReasoning || isDeepSeekReasoningModel(model)\n}\n\nfunction stripDeepSeekReasoningContent(message: OpenAIChatMessage): OpenAIChatMessage {\n  if (message.reasoning_content === undefined) return message\n  const { reasoning_content: _reasoningContent, ...rest } = message\n  return rest\n}\n\ntype PendingToolCalls = {\n  assistantIndex: number\n  pendingIds: Set<string>\n  answeredIds: Set<string>\n}\n\nfunction finalizePendingToolCalls(messages: OpenAIChatMessage[], pending: PendingToolCalls): void {\n  const assistant = messages[pending.assistantIndex]\n  if (!assistant?.tool_calls?.length) return\n\n  const seen = new Set<string>()\n  const keptToolCalls = assistant.tool_calls.filter(call => {\n    if (!pending.answeredIds.has(call.id) || seen.has(call.id)) return false\n    seen.add(call.id)\n    return true\n  })\n\n  if (keptToolCalls.length > 0) {\n    assistant.tool_calls = keptToolCalls\n  } else {\n    delete assistant.tool_calls\n    if (assistant.content == null) assistant.content = ''\n  }\n}\n\nfunction dedupeToolCalls(message: OpenAIChatMessage): OpenAIChatMessage {\n  if (!message.tool_calls?.length) return message\n\n  const seen = new Set<string>()\n  const toolCalls = message.tool_calls.filter(call => {\n    if (!call.id || seen.has(call.id)) return false\n    seen.add(call.id)\n    return true\n  })\n\n  if (toolCalls.length > 0) {\n    return { ...message, tool_calls: toolCalls }\n  }\n\n  const next = { ...message }\n  delete next.tool_calls\n  if (next.content == null) next.content = ''\n  return next\n}\n\nexport function sanitizeDeepSeekToolCallAdjacency(messages: OpenAIChatMessage[]): OpenAIChatMessage[] {\n  const out: OpenAIChatMessage[] = []\n  let pending: PendingToolCalls | null = null\n\n  for (const message of messages) {\n    if (message.role === 'tool') {\n      const toolCallId = message.tool_call_id\n      if (pending && toolCallId && pending.pendingIds.has(toolCallId)) {\n        out.push(message.content == null ? { ...message, content: '' } : message)\n        pending.pendingIds.delete(toolCallId)\n        pending.answeredIds.add(toolCallId)\n        if (pending.pendingIds.size === 0) pending = null\n      }\n      continue\n    }\n\n    if (pending) {\n      finalizePendingToolCalls(out, pending)\n      pending = null\n    }\n\n    if (message.role === 'assistant' && message.tool_calls?.length) {\n      const assistant = dedupeToolCalls(message)\n      out.push(assistant)\n\n      if (assistant.tool_calls?.length) {\n        pending = {\n          assistantIndex: out.length - 1,\n          pendingIds: new Set(assistant.tool_calls.map(call => call.id)),\n          answeredIds: new Set<string>(),\n        }\n      }\n      continue\n    }\n\n    out.push(message)\n  }\n\n  if (pending) finalizePendingToolCalls(out, pending)\n  return out\n}\n\n// Re-export types for the registry consumer.\nexport type { OpenAIChatRequest, OpenAIChatMessage }\n", "/**\n * Groq transformer.\n *\n * - Strips cache_control from messages (Groq validator rejects).\n * - Strips `$schema`/`strict` from tool params.\n * - Strips null `function_call` fields from assistant messages.\n * - Accepts `reasoning_effort` on reasoning-capable models.\n * - Emits `reasoning` on delta \u2014 normalize to `reasoning_content`.\n *\n * Strict mode is OFF: Groq's Llama validator enforces the full OpenAI\n * strict contract (additionalProperties:false on every object + every\n * property in required). Our tools declare optional fields, so strict\n * would reject. Without strict the models still call tools correctly \u2014\n * the description hint in tools.ts carries schema constraints in-prompt.\n * Only openai/gpt-oss-20b on Groq tolerates non-strict schemas under\n * strict:true; other models 400 with \"additionalProperties:false must\n * be set on every object\".\n */\n\nimport type { Transformer, TransformContext } from './base.js'\nimport type { OpenAIChatRequest, OpenAIChatMessage } from './shared_types.js'\n\nexport const groqTransformer: Transformer = {\n  id: 'groq',\n  displayName: 'Groq',\n  defaultBaseUrl: 'https://api.groq.com/openai/v1',\n\n  supportsStrictMode: () => false,\n\n  clampMaxTokens(requested: number): number {\n    return requested\n  },\n\n  transformRequest(body: OpenAIChatRequest, ctx: TransformContext): OpenAIChatRequest {\n    // `reasoning_effort` is only accepted by reasoning-capable Groq\n    // models (gpt-oss). Llama-3.x 400s with \"reasoning_effort is not\n    // supported with this model\" when the knob is sent.\n    if (ctx.isReasoning && ctx.reasoningEffort && groqModelSupportsReasoning(body.model)) {\n      body.reasoning_effort = ctx.reasoningEffort\n    }\n    // Strip null tool_calls field that Groq's validator rejects.\n    body.messages = body.messages.map(m => {\n      const tc = (m as { tool_calls?: unknown }).tool_calls\n      if (tc === null) {\n        const { tool_calls: _tool_calls, ...rest } = m as OpenAIChatMessage & { tool_calls?: unknown }\n        return rest as OpenAIChatMessage\n      }\n      return m\n    })\n    return body\n  },\n\n  normalizeStreamDelta(delta, _finishReason): void {\n    // Groq uses `reasoning` where most providers use `reasoning_content`.\n    const d = delta as { reasoning?: string; reasoning_content?: string }\n    if (typeof d.reasoning === 'string' && !d.reasoning_content) {\n      d.reasoning_content = d.reasoning\n    }\n  },\n\n  schemaDropList(): Set<string> {\n    // Keep `additionalProperties` \u2014 Groq's Llama validator requires it\n    // when strict is on, and ignores it when strict is off. Drop only\n    // the JSON-Schema meta fields and legacy `strict` marker.\n    return new Set(['$schema', '$id', '$ref', '$comment', 'strict'])\n  },\n\n  contextExceededMarkers(): string[] {\n    // Groq free-tier / on-demand surfaces two distinct overflow classes:\n    //   1. Context-window exceeded (model's native token limit).\n    //   2. TPM rate limit (\"Request too large for model ... tokens per\n    //      minute (TPM): Limit 8000, Requested 53003\"). Both are fixed\n    //      by reactive-compacting the conversation, so we map both to\n    //      PromptTooLongError via these markers.\n    return [\n      'context_length_exceeded', 'prompt is too long', 'too many tokens',\n      'context window',\n      // TPM rate-limit phrasings (trigger reactive compact \u2014 a smaller\n      // turn fits under the per-minute budget).\n      'request too large', 'reduce the length of the messages',\n      'tokens per minute', 'rate_limit_exceeded',\n    ]\n  },\n\n  preferredEditFormat(model: string): 'apply_patch' | 'edit_block' | 'str_replace' {\n    const m = model.toLowerCase()\n    // Llama-3.3+ and Kimi K2 handle edit_block reasonably.\n    if (m.includes('llama') || m.includes('kimi')) return 'edit_block'\n    return 'str_replace'\n  },\n\n  smallFastModel(_model: string): string | null {\n    return 'llama-3.1-8b-instant'\n  },\n\n  cacheControlMode(): 'none' | 'passthrough' | 'last-only' {\n    return 'none'\n  },\n\n  filterModelCatalog(models: Array<{ id: string; name?: string }>): Array<{ id: string; name?: string }> {\n    return models.filter(m => GROQ_PRODUCTION_MODELS.has(m.id))\n  },\n\n  filterTools<T extends { name: string }>(model: string, tools: T[]): T[] {\n    // Every Groq chat model on the free / on-demand tier has a tight TPM\n    // cap \u2014 6k (llama-8b), 12k (llama-70b), 8k (gpt-oss-*). The full\n    // claudex tool suite alone is ~45\u201355k tokens of JSON-Schema, which\n    // blows past all four limits on the first turn. Keep a curated set:\n    // core FS + shell + web + Agent delegation + any MCP server the\n    // user configured. Upgrading to a paid dev tier lifts the cap and\n    // the filter can be relaxed per-model if needed.\n    if (!isSmallTierGroqModel(model)) return tools\n    return tools.filter(t => GROQ_SMALL_TIER_TOOL_ALLOWLIST.has(t.name)\n      || t.name.startsWith('mcp__'))\n  },\n\n  skipToolUsagePreamble(model: string): boolean {\n    // Every token counts under the per-model TPM cap \u2014 the preamble is\n    // ~250 tokens of JSON-Schema hygiene that Llama-3.x and gpt-oss\n    // already ignore (they follow the description hint instead).\n    return isSmallTierGroqModel(model)\n  },\n}\n\n// Production chat models on Groq per console.groq.com/docs/models \u2014\n// the /models list uses this so users don't pick preview / audio-only\n// (whisper) / retired endpoints or compound systems. Routing (Groq vs\n// OpenRouter for the same model ID) is controlled by the provider the\n// user selected in /models, not by this set \u2014 both providers host\n// `openai/gpt-oss-*`. Each listed model has a tight on-demand TPM\n// budget; `filterTools` + `skipToolUsagePreamble` trim the request to\n// fit that budget.\nconst GROQ_PRODUCTION_MODELS = new Set<string>([\n  'llama-3.1-8b-instant',\n  'llama-3.3-70b-versatile',\n  'openai/gpt-oss-20b',\n  'openai/gpt-oss-120b',\n])\n\nfunction groqModelSupportsReasoning(model: string): boolean {\n  const m = model.toLowerCase()\n  // Only gpt-oss (both sizes) accepts reasoning_effort on Groq.\n  // Llama-3.x does not; whisper is not a chat model.\n  if (m.includes('gpt-oss')) return true\n  return false\n}\n\nfunction isSmallTierGroqModel(model: string): boolean {\n  // Every Groq chat model on the free / on-demand tier has a tight\n  // per-minute token cap and 413s on the full claudex tool set:\n  //   llama-3.1-8b-instant      \u2192 6000 TPM\n  //   llama-3.3-70b-versatile   \u2192 12000 TPM\n  //   openai/gpt-oss-20b        \u2192 8000 TPM\n  //   openai/gpt-oss-120b       \u2192 8000 TPM\n  // So the small-tier filter applies to ALL supported models. Users on\n  // a paid Dev tier can lift this by setting CLAUDEX_GROQ_FULL_TOOLS=1\n  // (not yet wired \u2014 relaxation is one env-var check away).\n  const m = model.toLowerCase()\n  return m.startsWith('llama-') || m.includes('gpt-oss')\n}\n\n// Small-tier allowlist: FS + shell + web + delegation. Keeps the\n// request inside the 6k-12k TPM budget while preserving the user's\n// ability to spawn sub-agents and call MCP tools (which pass through\n// via the mcp__ prefix check above).\nconst GROQ_SMALL_TIER_TOOL_ALLOWLIST = new Set<string>([\n  // Shell\n  'Bash',\n  // Filesystem\n  'Read', 'Write', 'Edit',\n  // Search\n  'Grep', 'Glob',\n  // Web\n  'WebSearch', 'WebFetch',\n  // Delegation / MCP entrypoint\n  'Agent', 'Skill',\n])\n", "/**\n * GLM thinking-mode toggle.\n *\n * BigModel supports `thinking.type` on the GLM 4.7 and GLM 5 families.\n * The model picker owns this state so GLM behaves like DeepSeek V4: the\n * visible `Thinking ON/OFF` row control decides the request payload instead\n * of the hidden /thinking command.\n */\n\nconst GLM_THINKING_MODELS: ReadonlySet<string> = new Set([\n  'glm-5.1',\n  'glm-5-turbo',\n  'glm-5',\n  'glm-4.7',\n])\n\nlet _glmThinkingEnabled = false\n\nexport function isGlmThinkingModel(model: string): boolean {\n  return GLM_THINKING_MODELS.has(model.trim().toLowerCase())\n}\n\nexport function getGlmThinking(): boolean {\n  return _glmThinkingEnabled\n}\n\nexport function setGlmThinking(enabled: boolean): void {\n  _glmThinkingEnabled = enabled\n}\n\nexport function toggleGlmThinking(): boolean {\n  _glmThinkingEnabled = !_glmThinkingEnabled\n  return _glmThinkingEnabled\n}\n", "/**\r\n * GLM / BigModel transformer.\r\n *\r\n * BigModel's `/api/paas/v4` endpoint speaks OpenAI Chat Completions,\r\n * with GLM thinking controlled by `thinking.type`. The visible model-picker\r\n * toggle owns that setting for GLM thinking-capable models.\r\n */\r\n\r\nimport type { Transformer, TransformContext } from './base.js'\r\nimport type { OpenAIChatRequest } from './shared_types.js'\r\nimport {\r\n  getGlmThinking,\r\n  isGlmThinkingModel,\r\n} from '../../../utils/model/glmThinking.js'\r\n\r\nconst GLM_MODELS = [\r\n  {\r\n    id: 'glm-5.1',\r\n    name: 'GLM-5.1',\r\n    contextWindow: 200_000,\r\n    supportsToolCalling: true,\r\n    tags: ['recommended', 'reasoning'],\r\n  },\r\n  {\r\n    id: 'glm-5-turbo',\r\n    name: 'GLM-5-Turbo',\r\n    contextWindow: 200_000,\r\n    supportsToolCalling: true,\r\n    tags: ['fast', 'reasoning'],\r\n  },\r\n  {\r\n    id: 'glm-5',\r\n    name: 'GLM-5',\r\n    contextWindow: 200_000,\r\n    supportsToolCalling: true,\r\n    tags: ['reasoning'],\r\n  },\r\n  {\r\n    id: 'glm-4.7',\r\n    name: 'GLM-4.7',\r\n    contextWindow: 200_000,\r\n    supportsToolCalling: true,\r\n    tags: ['reasoning'],\r\n  },\r\n] as const\r\n\r\nexport const glmTransformer: Transformer = {\r\n  id: 'glm',\r\n  displayName: 'GLM',\r\n  defaultBaseUrl: 'https://open.bigmodel.cn/api/paas/v4',\r\n\r\n  supportsStrictMode: () => false,\r\n\r\n  staticCatalog() {\r\n    return GLM_MODELS.map(model => ({ ...model, tags: [...model.tags] }))\r\n  },\r\n\r\n  clampMaxTokens(requested: number): number {\r\n    return requested > 128_000 ? 128_000 : requested\r\n  },\r\n\r\n  transformRequest(body: OpenAIChatRequest, ctx: TransformContext): OpenAIChatRequest {\r\n    body.model = normalizeGlmModelId(body.model)\r\n    const thinkingEnabled = isGlmThinkingModel(ctx.model) && getGlmThinking()\r\n    body.thinking = { type: thinkingEnabled ? 'enabled' : 'disabled' }\r\n    delete body.stream_options\r\n    return body\r\n  },\r\n\r\n  normalizeStreamDelta(): void {\r\n    // BigModel already emits OpenAI-compatible stream deltas.\r\n  },\r\n\r\n  schemaDropList(): Set<string> {\r\n    return new Set(['$schema', '$id', '$ref', '$comment', 'strict', 'format', 'default'])\r\n  },\r\n\r\n  contextExceededMarkers(): string[] {\r\n    return [\r\n      'context length',\r\n      'context_length_exceeded',\r\n      'prompt is too long',\r\n      'token limit',\r\n      'too long',\r\n      'tokens exceed',\r\n      'exceed token',\r\n      '\u4E0A\u4E0B\u6587',\r\n      '\u8D85\u8FC7',\r\n    ]\r\n  },\r\n\r\n  preferredEditFormat(_model: string): 'apply_patch' | 'edit_block' | 'str_replace' {\r\n    return 'edit_block'\r\n  },\r\n\r\n  smallFastModel(_model: string): string | null {\r\n    return 'glm-5-turbo'\r\n  },\r\n\r\n  cacheControlMode(): 'none' | 'passthrough' | 'last-only' {\r\n    return 'none'\r\n  },\r\n\r\n  // GLM-4.6/4.7 emit syntax-clean tool calls at temperature 1.0;\r\n  // BigModel's docs and opencode's `temperature()` matrix both use\r\n  // 1.0 for those. Lower values made code generation deterministic\r\n  // but tool-call argument quality regressed.\r\n  defaultGenerationParams(model: string) {\r\n    const id = model.toLowerCase()\r\n    if (id.includes('glm-4.6') || id.includes('glm-4.7')) {\r\n      return { temperature: 1.0 }\r\n    }\r\n    return undefined\r\n  },\r\n}\r\n\r\nfunction normalizeGlmModelId(model: string): string {\r\n  const trimmed = model.trim()\r\n  return /^glm-/i.test(trimmed) ? trimmed.toLowerCase() : model\r\n}\r\n", "/**\r\n * Moonshot AI / Kimi transformer.\r\n *\r\n * Moonshot is OpenAI-compatible but rejects several OpenAI/Responses-only\r\n * extensions. Kimi K2 thinking models emit reasoning_content directly on\r\n * stream deltas, which the shared compat loop renders as thinking blocks.\r\n */\r\n\r\nimport type { Transformer, TransformContext } from './base.js'\r\nimport type { OpenAIChatMessage, OpenAIChatRequest } from './shared_types.js'\r\nimport {\r\n  MOONSHOT_MODELS,\r\n  cloneMoonshotModelInfo,\r\n  isMoonshotChatModelId,\r\n  isMoonshotThinkingModel,\r\n  normalizeMoonshotModelId,\r\n  toMoonshotModelInfo,\r\n} from '../../../utils/model/moonshotCatalog.js'\r\n\r\nexport const moonshotTransformer: Transformer = {\r\n  id: 'moonshot',\r\n  displayName: 'Moonshot AI',\r\n  defaultBaseUrl: 'https://api.moonshot.ai/v1',\r\n\r\n  supportsStrictMode: () => false,\r\n\r\n  staticCatalog() {\r\n    return MOONSHOT_MODELS.map(cloneMoonshotModelInfo)\r\n  },\r\n\r\n  preferLiveModelCatalog() {\r\n    return true\r\n  },\r\n\r\n  filterModelCatalog(models) {\r\n    const seen = new Set<string>()\r\n    const out = []\r\n    for (const model of models) {\r\n      if (!isMoonshotChatModelId(model.id) || seen.has(model.id)) continue\r\n      seen.add(model.id)\r\n      out.push(toMoonshotModelInfo(model))\r\n    }\r\n    return out.length > 0 ? out : MOONSHOT_MODELS.map(cloneMoonshotModelInfo)\r\n  },\r\n\r\n  clampMaxTokens(requested: number): number {\r\n    return requested > 262_144 ? 262_144 : requested\r\n  },\r\n\r\n  transformRequest(body: OpenAIChatRequest, ctx: TransformContext): OpenAIChatRequest {\r\n    body.model = normalizeMoonshotModelId(body.model)\r\n    const bag = body as unknown as Record<string, unknown>\r\n    delete bag.reasoning_effort\r\n    delete bag.reasoning\r\n    delete bag.store\r\n    delete bag.prompt_cache_retention\r\n    if (ctx.sessionId) body.prompt_cache_key = ctx.sessionId\r\n    else delete bag.prompt_cache_key\r\n\r\n    if (supportsMoonshotThinkingToggle(body.model)) {\r\n      body.thinking = { type: ctx.isReasoning ? 'enabled' : 'disabled' }\r\n      if (!ctx.isReasoning) {\r\n        body.messages = body.messages.map(stripMoonshotReasoningContent)\r\n      }\r\n    } else if (!isMoonshotThinkingModel(body.model)) {\r\n      delete bag.thinking\r\n      body.messages = body.messages.map(stripMoonshotReasoningContent)\r\n    }\r\n\r\n    return body\r\n  },\r\n\r\n  normalizeStreamDelta(): void {\r\n    // Kimi reasoning models already emit reasoning_content.\r\n  },\r\n\r\n  schemaDropList(): Set<string> {\r\n    // NB: we DELIBERATELY keep `$ref` in the schema \u2014 it's needed for\r\n    // some MCP tools and Moonshot accepts it as long as the $ref node\r\n    // has no sibling keys. sanitizeToolSchemaExtra() enforces that\r\n    // constraint downstream.\r\n    return new Set(['$schema', '$id', '$comment', 'strict', 'format', 'default'])\r\n  },\r\n\r\n  // Moonshot's MFJS validator expands `$ref` before checking sibling\r\n  // keywords and rejects any sibling (e.g. `{ $ref: \"#/...\", description: \"...\" }`)\r\n  // with a hard 400. MFJS also requires array `items` to be a single\r\n  // schema, not a tuple \u2014 `items: [a, b]` 400s. Both are quirks the\r\n  // flat schemaDropList() can't express because they're structural,\r\n  // not key-based. Mirrors opencode's sanitizeMoonshot() in\r\n  // provider/transform.ts:1285.\r\n  sanitizeToolSchemaExtra(schema: Record<string, unknown>): Record<string, unknown> {\r\n    return sanitizeMoonshotSchema(schema) as Record<string, unknown>\r\n  },\r\n\r\n  // Per-model default generation params. Mirrors opencode's\r\n  // temperature() / topP() in provider/transform.ts:481+. Kimi\r\n  // documents 0.6 for non-thinking K2 and 1.0/0.95 for the thinking\r\n  // variants. Frontier overrides from claude.ts still win \u2014 these\r\n  // only fill in `undefined`.\r\n  defaultGenerationParams(model: string) {\r\n    const id = model.toLowerCase()\r\n    if (!id.includes('kimi') && !id.includes('moonshot')) return undefined\r\n    const isThinking = ['thinking', 'k2.', 'k2p', 'k2-5'].some(s => id.includes(s))\r\n    if (isThinking) return { temperature: 1.0, top_p: 0.95 }\r\n    return { temperature: 0.6 }\r\n  },\r\n\r\n  contextExceededMarkers(): string[] {\r\n    return [\r\n      'context length',\r\n      'context_length_exceeded',\r\n      'prompt is too long',\r\n      'token limit',\r\n      'too long',\r\n      'tokens exceed',\r\n      'exceeded model token limit',\r\n      'request exceeded model token limit',\r\n    ]\r\n  },\r\n\r\n  preferredEditFormat(_model: string): 'apply_patch' | 'edit_block' | 'str_replace' {\r\n    return 'edit_block'\r\n  },\r\n\r\n  smallFastModel(_model: string): string | null {\r\n    return 'kimi-k2-turbo-preview'\r\n  },\r\n\r\n  cacheControlMode(): 'none' | 'passthrough' | 'last-only' {\r\n    return 'none'\r\n  },\r\n}\r\n\r\nfunction supportsMoonshotThinkingToggle(model: string): boolean {\r\n  const normalized = normalizeMoonshotModelId(model)\r\n  return normalized === 'kimi-k2.5' || normalized === 'kimi-k2.6'\r\n}\r\n\r\nfunction stripMoonshotReasoningContent(message: OpenAIChatMessage): OpenAIChatMessage {\r\n  if (message.reasoning_content === undefined) return message\r\n  const { reasoning_content: _reasoningContent, ...rest } = message\r\n  return rest\r\n}\r\n\r\n// Recursive sanitizer for Moonshot-specific JSON-Schema quirks:\r\n//   1. `$ref` nodes must have NO siblings \u2014 drop everything else on\r\n//      that node when `$ref` is present.\r\n//   2. `items: [schema, \u2026]` (tuple form) \u2192 `items: schema` (single).\r\n//      Drops every entry after the first, then drills in.\r\nfunction sanitizeMoonshotSchema(node: unknown): unknown {\r\n  if (node === null || typeof node !== 'object') return node\r\n  if (Array.isArray(node)) return node.map(sanitizeMoonshotSchema)\r\n\r\n  const obj = node as Record<string, unknown>\r\n  if (typeof obj.$ref === 'string') {\r\n    return { $ref: obj.$ref }\r\n  }\r\n  const out: Record<string, unknown> = {}\r\n  for (const [k, v] of Object.entries(obj)) {\r\n    out[k] = sanitizeMoonshotSchema(v)\r\n  }\r\n  if (Array.isArray(out.items)) {\r\n    out.items = out.items[0] ?? {}\r\n  }\r\n  return out\r\n}\r\n", "/**\r\n * MiniMax AI OpenAI-compatible transformer.\r\n *\r\n * MiniMax's current OpenAI-compatible text endpoint is\r\n * https://api.minimax.io/v1/chat/completions. The public docs advertise\r\n * max_completion_tokens instead of max_tokens and a 2048 output cap, so\r\n * this transformer keeps requests conservative.\r\n */\r\n\r\nimport type { ModelInfo } from '../../../services/api/providers/base_provider.js'\r\nimport type { Transformer, TransformContext } from './base.js'\r\nimport type { OpenAIChatRequest } from './shared_types.js'\r\n\r\nconst MINIMAX_STATIC_MODELS: ModelInfo[] = [\r\n  {\r\n    id: 'MiniMax-M2.7',\r\n    name: 'MiniMax-M2.7',\r\n    contextWindow: 204_800,\r\n    supportsToolCalling: true,\r\n    tags: ['recommended', 'reasoning'],\r\n  },\r\n  {\r\n    id: 'MiniMax-M2.7-highspeed',\r\n    name: 'MiniMax-M2.7 High Speed',\r\n    contextWindow: 204_800,\r\n    supportsToolCalling: true,\r\n    tags: ['fast', 'reasoning'],\r\n  },\r\n  {\r\n    id: 'MiniMax-M2.5',\r\n    name: 'MiniMax-M2.5',\r\n    contextWindow: 204_800,\r\n    supportsToolCalling: true,\r\n    tags: ['reasoning'],\r\n  },\r\n  {\r\n    id: 'MiniMax-M2.5-highspeed',\r\n    name: 'MiniMax-M2.5 High Speed',\r\n    contextWindow: 204_800,\r\n    supportsToolCalling: true,\r\n    tags: ['fast', 'reasoning'],\r\n  },\r\n  {\r\n    id: 'MiniMax-M2.1',\r\n    name: 'MiniMax-M2.1',\r\n    contextWindow: 204_800,\r\n    supportsToolCalling: true,\r\n    tags: ['reasoning'],\r\n  },\r\n  {\r\n    id: 'MiniMax-M2.1-highspeed',\r\n    name: 'MiniMax-M2.1 High Speed',\r\n    contextWindow: 204_800,\r\n    supportsToolCalling: true,\r\n    tags: ['fast', 'reasoning'],\r\n  },\r\n  {\r\n    id: 'MiniMax-M2',\r\n    name: 'MiniMax-M2',\r\n    contextWindow: 204_800,\r\n    supportsToolCalling: true,\r\n    tags: ['reasoning'],\r\n  },\r\n]\r\n\r\nexport const minimaxTransformer: Transformer = {\r\n  id: 'minimax',\r\n  displayName: 'MiniMax AI',\r\n  defaultBaseUrl: 'https://api.minimax.io/v1',\r\n\r\n  supportsStrictMode: () => false,\r\n\r\n  staticCatalog() {\r\n    return MINIMAX_STATIC_MODELS.map(model => ({ ...model }))\r\n  },\r\n\r\n  preferLiveModelCatalog() {\r\n    return true\r\n  },\r\n\r\n  filterModelCatalog(models) {\r\n    const seen = new Set<string>()\r\n    const filtered = models.flatMap((model) => {\r\n      const id = model.id.trim()\r\n      if (!isMiniMaxTextModel(id) || seen.has(id)) return []\r\n      seen.add(id)\r\n      return [{\r\n        id,\r\n        name: model.name ?? labelMiniMaxModel(id),\r\n        contextWindow: 204_800,\r\n        supportsToolCalling: true,\r\n        tags: tagsForMiniMaxModel(id),\r\n      } satisfies ModelInfo]\r\n    })\r\n    return filtered.length > 0 ? filtered : MINIMAX_STATIC_MODELS.map(model => ({ ...model }))\r\n  },\r\n\r\n  clampMaxTokens(requested: number): number {\r\n    return Math.min(Math.max(1, requested), 2048)\r\n  },\r\n\r\n  transformRequest(body: OpenAIChatRequest, _ctx: TransformContext): OpenAIChatRequest {\r\n    const bag = body as unknown as Record<string, unknown>\r\n    const maxTokens = body.max_tokens\r\n    if (typeof maxTokens === 'number') {\r\n      bag.max_completion_tokens = Math.min(Math.max(1, maxTokens), 2048)\r\n      delete bag.max_tokens\r\n    }\r\n\r\n    delete bag.reasoning_effort\r\n    delete bag.reasoning\r\n    delete bag.thinking\r\n    delete bag.stream_options\r\n    delete bag.store\r\n    delete bag.prompt_cache_key\r\n    delete bag.prompt_cache_retention\r\n\r\n    if (typeof body.temperature === 'number') {\r\n      if (body.temperature <= 0) delete bag.temperature\r\n      else if (body.temperature > 1) body.temperature = 1\r\n    }\r\n    if (typeof body.top_p === 'number') {\r\n      if (body.top_p <= 0) delete bag.top_p\r\n      else if (body.top_p > 1) body.top_p = 1\r\n    }\r\n\r\n    return body\r\n  },\r\n\r\n  schemaDropList(): Set<string> {\r\n    return new Set(['$schema', '$id', '$ref', '$comment', 'strict', 'pattern', 'format', 'default'])\r\n  },\r\n\r\n  contextExceededMarkers(): string[] {\r\n    return [\r\n      'context length',\r\n      'context_length_exceeded',\r\n      'prompt is too long',\r\n      'token limit',\r\n      'too long',\r\n      'tokens exceed',\r\n      'exceeded model token limit',\r\n    ]\r\n  },\r\n\r\n  preferredEditFormat(_model: string): 'apply_patch' | 'edit_block' | 'str_replace' {\r\n    return 'edit_block'\r\n  },\r\n\r\n  smallFastModel(_model: string): string | null {\r\n    return 'MiniMax-M2.7-highspeed'\r\n  },\r\n\r\n  cacheControlMode(): 'none' | 'passthrough' | 'last-only' {\r\n    return 'none'\r\n  },\r\n\r\n  // MiniMax docs: temperature 1.0, top_p 0.95 are the recommended\r\n  // sampling settings; top_k 20 for M2 and 40 for M2.1+ (per opencode's\r\n  // matrix in provider/transform.ts:508). Only applied when caller\r\n  // didn't pass an explicit value.\r\n  defaultGenerationParams(model: string) {\r\n    const id = model.toLowerCase()\r\n    if (!id.startsWith('minimax-')) return undefined\r\n    const k = ['m2.', 'm25', 'm21'].some(s => id.includes(s)) ? 40 : 20\r\n    return { temperature: 1.0, top_p: 0.95, top_k: k }\r\n  },\r\n}\r\n\r\nfunction isMiniMaxTextModel(id: string): boolean {\r\n  const lower = id.toLowerCase()\r\n  return (\r\n    lower.startsWith('minimax-m') &&\r\n    !lower.includes('speech') &&\r\n    !lower.includes('audio') &&\r\n    !lower.includes('tts') &&\r\n    !lower.includes('voice') &&\r\n    !lower.includes('image') &&\r\n    !lower.includes('video') &&\r\n    !lower.includes('music') &&\r\n    !lower.includes('embedding')\r\n  )\r\n}\r\n\r\nfunction labelMiniMaxModel(id: string): string {\r\n  return id.replace(/-highspeed$/i, ' High Speed')\r\n}\r\n\r\nfunction tagsForMiniMaxModel(id: string): readonly string[] {\r\n  const tags = ['reasoning']\r\n  if (id.toLowerCase().includes('highspeed')) tags.push('fast')\r\n  if (id === 'MiniMax-M2.7') tags.push('recommended')\r\n  return tags\r\n}\r\n", "/**\n * Mistral transformer.\n *\n * - Rejects `function.strict: true` + extra top-level fields\n *   (`extra_forbidden` error) \u2014 strict mode is OFF.\n * - `tool_choice: \"required\"` \u2192 `\"any\"` (Mistral's name for the same).\n * - Strips `$id`/`$schema`/`additionalProperties`/`strict`/`format`/\n *   `examples`/`default` from tool parameter schemas.\n * - Strips `name` from non-tool messages (Mistral rejects it on\n *   system/user/assistant).\n * - Enforces Mistral's strict assistant-tool-call -> tool-result ordering\n *   on replayed history.\n * - Prompt caching uses top-level `prompt_cache_key`; Anthropic\n *   `cache_control` markers stay stripped by the shared compat loop.\n * - Magistral models want a specific thinking-template injected.\n */\n\nimport type { Transformer, TransformContext } from './base.js'\nimport type { ModelInfo } from '../../../services/api/providers/base_provider.js'\nimport type { OpenAIChatRequest, OpenAIChatMessage } from './shared_types.js'\n\nconst MISTRAL_CHAT_CATALOG: readonly ModelInfo[] = [\n  { id: 'devstral-latest', name: 'Devstral 2', contextWindow: 256_000, supportsToolCalling: true, tags: ['tools'] },\n  { id: 'devstral-medium-latest', name: 'Devstral Medium', contextWindow: 256_000, supportsToolCalling: true, tags: ['tools'] },\n  { id: 'devstral-small-latest', name: 'Devstral Small', contextWindow: 256_000, supportsToolCalling: true, tags: ['tools', 'fast'] },\n  { id: 'devstral-2512', name: 'Devstral 2 (25.12)', contextWindow: 256_000, supportsToolCalling: true, tags: ['tools'] },\n  { id: 'mistral-medium-3-5', name: 'Mistral Medium 3.5', contextWindow: 256_000, supportsToolCalling: true, tags: ['tools', 'reasoning'] },\n  { id: 'mistral-medium-latest', name: 'Mistral Medium', supportsToolCalling: true, tags: ['tools', 'reasoning'] },\n  { id: 'codestral-latest', name: 'Codestral', contextWindow: 128_000, supportsToolCalling: true, tags: ['tools'] },\n  { id: 'codestral-2508', name: 'Codestral (25.08)', contextWindow: 128_000, supportsToolCalling: true, tags: ['tools'] },\n  { id: 'mistral-large-latest', name: 'Mistral Large 3', contextWindow: 256_000, supportsToolCalling: true, tags: ['tools'] },\n  { id: 'mistral-large-2512', name: 'Mistral Large 3 (25.12)', contextWindow: 256_000, supportsToolCalling: true, tags: ['tools'] },\n  { id: 'mistral-small-latest', name: 'Mistral Small 4', contextWindow: 256_000, supportsToolCalling: true, tags: ['tools', 'reasoning', 'fast'] },\n  { id: 'mistral-small-2603', name: 'Mistral Small 4 (26.03)', contextWindow: 256_000, supportsToolCalling: true, tags: ['tools', 'reasoning', 'fast'] },\n]\n\nconst MAGISTRAL_SYSTEM_PREFIX = `A user will ask you to solve a task. You should first draft your thinking process (inner monologue) until you have derived the final answer. Afterwards, write a self-contained summary of your thoughts. Return your plan + answer in the chat directly \u2014 do not use tags.`\n\nexport const mistralTransformer: Transformer = {\n  id: 'mistral',\n  displayName: 'Mistral',\n  defaultBaseUrl: 'https://api.mistral.ai/v1',\n\n  supportsStrictMode: () => false,\n\n  clampMaxTokens(requested: number): number {\n    return requested\n  },\n\n  transformRequest(body: OpenAIChatRequest, ctx: TransformContext): OpenAIChatRequest {\n    if (body.tool_choice === 'required') body.tool_choice = 'any'\n    const bag = body as unknown as Record<string, unknown>\n    if (ctx.sessionId) body.prompt_cache_key = ctx.sessionId\n    else delete bag.prompt_cache_key\n\n    body.messages = sanitizeMistralToolCallAdjacency(body.messages).map(m => {\n      if (m.role === 'tool') return m\n      const { name: _name, ...rest } = m as OpenAIChatMessage & { name?: string }\n      return rest as OpenAIChatMessage\n    })\n\n    if (ctx.isReasoning && isMistralReasoningModel(body.model)) {\n      body.reasoning_effort = 'high'\n    }\n\n    if (ctx.isReasoning && body.model.toLowerCase().includes('magistral')) {\n      const already = body.messages.some(m => m.role === 'system'\n        && typeof m.content === 'string'\n        && m.content.includes('draft your thinking process'))\n      if (!already) {\n        body.messages = [\n          { role: 'system', content: MAGISTRAL_SYSTEM_PREFIX },\n          ...body.messages,\n        ]\n      }\n    }\n    return body\n  },\n\n  schemaDropList(): Set<string> {\n    return new Set([\n      '$schema', '$id', '$ref', '$comment',\n      'strict', 'additionalProperties',\n      'format', 'examples', 'default',\n    ])\n  },\n\n  contextExceededMarkers(): string[] {\n    return ['context length', 'prompt too long', 'tokens exceeds', 'context_window']\n  },\n\n  preferredEditFormat(model: string): 'apply_patch' | 'edit_block' | 'str_replace' {\n    const m = model.toLowerCase()\n    if (\n      m.includes('codestral')\n      || m.includes('devstral')\n      || m.includes('magistral')\n      || m === 'mistral-medium-3-5'\n    ) return 'edit_block'\n    return 'str_replace'\n  },\n\n  smallFastModel(_model: string): string | null {\n    return 'mistral-small-latest'\n  },\n\n  cacheControlMode(): 'none' | 'passthrough' | 'last-only' {\n    return 'none'\n  },\n\n  staticCatalog(): ModelInfo[] {\n    return [...MISTRAL_CHAT_CATALOG]\n  },\n\n  filterModelCatalog(models: Array<{ id: string; name?: string }>): Array<{ id: string; name?: string }> {\n    const kept = models.filter(model => isMistralCodingCatalogModel(model.id))\n    return kept.length > 0 ? kept : models\n  },\n\n  preferLiveModelCatalog(): boolean {\n    return true\n  },\n}\n\ntype PendingToolCalls = {\n  assistantIndex: number\n  pendingIds: Set<string>\n  answeredIds: Set<string>\n  namesById: Map<string, string>\n}\n\nfunction finalizePendingToolCalls(messages: OpenAIChatMessage[], pending: PendingToolCalls): void {\n  const assistant = messages[pending.assistantIndex]\n  if (!assistant?.tool_calls?.length) return\n\n  const seen = new Set<string>()\n  const keptToolCalls = assistant.tool_calls.filter(call => {\n    if (!isValidMistralToolCall(call) || !pending.answeredIds.has(call.id) || seen.has(call.id)) return false\n    seen.add(call.id)\n    return true\n  })\n\n  if (keptToolCalls.length > 0) {\n    assistant.tool_calls = keptToolCalls\n  } else {\n    delete assistant.tool_calls\n    if (assistant.content == null) assistant.content = ''\n  }\n}\n\nfunction dedupeToolCalls(message: OpenAIChatMessage): OpenAIChatMessage {\n  if (!message.tool_calls?.length) return message\n\n  const seen = new Set<string>()\n  const toolCalls = message.tool_calls.filter(call => {\n    if (!isValidMistralToolCall(call) || seen.has(call.id)) return false\n    seen.add(call.id)\n    return true\n  })\n\n  if (toolCalls.length > 0) return { ...message, tool_calls: toolCalls }\n\n  const next = { ...message }\n  delete next.tool_calls\n  if (next.content == null) next.content = ''\n  return next\n}\n\nfunction isValidMistralToolCall(call: NonNullable<OpenAIChatMessage['tool_calls']>[number] | undefined): boolean {\n  return !!(\n    call?.id\n    && call.function\n    && typeof call.function.name === 'string'\n    && call.function.name.length > 0\n  )\n}\n\nfunction hasMistralRenderableAssistantContent(message: OpenAIChatMessage): boolean {\n  if (message.role !== 'assistant') return true\n  if (message.tool_calls?.some(isValidMistralToolCall)) return true\n  if (typeof message.content === 'string') return message.content.trim().length > 0\n  if (Array.isArray(message.content)) {\n    return message.content.some(part =>\n      part\n      && typeof part === 'object'\n      && (part.type !== 'text' || (typeof part.text === 'string' && part.text.trim().length > 0)),\n    )\n  }\n  return false\n}\n\nfunction sanitizeMistralToolCallAdjacency(messages: OpenAIChatMessage[]): OpenAIChatMessage[] {\n  const out: OpenAIChatMessage[] = []\n  let pending: PendingToolCalls | null = null\n\n  for (const message of messages) {\n    if (message.role === 'tool') {\n      const toolCallId = message.tool_call_id\n      if (pending && toolCallId && pending.pendingIds.has(toolCallId)) {\n        out.push({\n          ...message,\n          content: message.content == null ? '' : message.content,\n          name: message.name ?? pending.namesById.get(toolCallId),\n        })\n        pending.pendingIds.delete(toolCallId)\n        pending.answeredIds.add(toolCallId)\n        if (pending.pendingIds.size === 0) pending = null\n      }\n      continue\n    }\n\n    if (pending) {\n      finalizePendingToolCalls(out, pending)\n      pending = null\n    }\n\n    if (message.role === 'assistant' && message.tool_calls?.length) {\n      const assistant = dedupeToolCalls(message)\n      out.push(assistant)\n\n      if (assistant.tool_calls?.length) {\n        pending = {\n          assistantIndex: out.length - 1,\n          pendingIds: new Set(assistant.tool_calls.map(call => call.id)),\n          answeredIds: new Set<string>(),\n          namesById: new Map(assistant.tool_calls.map(call => [call.id, call.function.name])),\n        }\n      }\n      continue\n    }\n\n    out.push(message)\n  }\n\n  if (pending) finalizePendingToolCalls(out, pending)\n  return out.filter(hasMistralRenderableAssistantContent)\n}\n\nfunction isMistralCodingCatalogModel(model: string): boolean {\n  const m = model.toLowerCase()\n  return m === 'devstral-latest'\n    || m === 'devstral-medium-latest'\n    || m === 'devstral-small-latest'\n    || m === 'devstral-2512'\n    || m === 'mistral-medium-3-5'\n    || m === 'mistral-medium-latest'\n    || m === 'codestral-latest'\n    || m === 'codestral-2508'\n    || m === 'mistral-large-latest'\n    || m === 'mistral-large-2512'\n    || m === 'mistral-small-latest'\n    || m === 'mistral-small-2603'\n}\n\nfunction isMistralReasoningModel(model: string): boolean {\n  const m = model.toLowerCase()\n  return m.includes('magistral')\n    || m.startsWith('mistral-small')\n    || m === 'mistral-medium-3-5'\n    || m === 'mistral-medium-latest'\n}\n", "/**\n * NVIDIA NIM transformer.\n *\n * - Strips `stream_options` (NIM's validator rejects the field on\n *   some model deployments).\n * - Caps large Claude-style `max_tokens` reservations by default; the\n *   native lane bypasses the legacy NIM provider optimizer.\n * - Trims the advertised tool set for NIM's hosted/free queues, where\n *   oversized requests are the main latency killer.\n * - Honors `function.strict: true`.\n */\n\nimport type { Transformer, TransformContext } from './base.js'\nimport type { OpenAIChatRequest } from './shared_types.js'\nimport { ALL_NIM_MODELS } from '../../../utils/model/nim_catalog.js'\n\nconst DEFAULT_NIM_MAX_TOKENS = 8192\n\nexport const nimTransformer: Transformer = {\n  id: 'nim',\n  displayName: 'NVIDIA NIM',\n  defaultBaseUrl: 'https://integrate.api.nvidia.com/v1',\n\n  supportsStrictMode: () => true,\n\n  staticCatalog() {\n    return ALL_NIM_MODELS.map(model => ({\n      id: model.id,\n      name: model.name,\n    }))\n  },\n\n  preferLiveModelCatalog(): boolean {\n    return true\n  },\n\n  // NIM's /v1/models surfaces hundreds of preview/junk endpoints and\n  // often returns the same id multiple times across deployments\n  // (e.g. `openai/gpt-oss-120b` appears 6\u00D7 under different aliases).\n  // Restrict to the curated catalog and dedupe by id so /models only\n  // shows our short list once.\n  filterModelCatalog(models) {\n    const allowed = new Set(ALL_NIM_MODELS.map(m => m.id))\n    const seen = new Set<string>()\n    const out: Array<{ id: string; name?: string }> = []\n    for (const m of models) {\n      if (typeof m.id !== 'string' || !allowed.has(m.id)) continue\n      if (seen.has(m.id)) continue\n      seen.add(m.id)\n      out.push(m)\n    }\n    return out\n  },\n\n  clampMaxTokens(requested: number): number {\n    if (nimOptimizationsDisabled()) return requested\n    const cap = readPositiveIntEnv('NIM_MAX_TOKENS')\n      ?? readPositiveIntEnv('PROVIDER_MAX_TOKENS')\n      ?? DEFAULT_NIM_MAX_TOKENS\n    return requested > cap ? cap : requested\n  },\n\n  transformRequest(body: OpenAIChatRequest, _ctx: TransformContext): OpenAIChatRequest {\n    delete body.stream_options\n    return body\n  },\n\n  schemaDropList(): Set<string> {\n    return new Set(['$schema', '$id', '$ref', '$comment'])\n  },\n\n  contextExceededMarkers(): string[] {\n    return ['context length', 'token limit', 'prompt is too long']\n  },\n\n  preferredEditFormat(_model: string): 'apply_patch' | 'edit_block' | 'str_replace' {\n    return 'edit_block'\n  },\n\n  smallFastModel(_model: string): string | null {\n    // NIM's catalog varies per deployment \u2014 no reliable small model.\n    return null\n  },\n\n  cacheControlMode(): 'none' | 'passthrough' | 'last-only' {\n    return 'none'\n  },\n\n  filterTools<T extends { name: string }>(_model: string, tools: T[]): T[] {\n    if (nimOptimizationsDisabled() || envFlag('NIM_FULL_TOOLS') || envFlag('CLAUDEX_NIM_FULL_TOOLS')) {\n      return tools\n    }\n\n    return tools.filter(t =>\n      NIM_FAST_TOOL_ALLOWLIST.has(t.name)\n      || (envFlag('NIM_KEEP_MCP_TOOLS') || envFlag('CLAUDEX_NIM_KEEP_MCP_TOOLS')\n        ? t.name.startsWith('mcp__')\n        : false),\n    )\n  },\n\n  skipToolUsagePreamble(_model: string): boolean {\n    if (nimOptimizationsDisabled()) return false\n    return !(envFlag('NIM_TOOL_PREAMBLE') || envFlag('CLAUDEX_NIM_TOOL_PREAMBLE'))\n  },\n}\n\nfunction nimOptimizationsDisabled(): boolean {\n  return envFlag('NIM_NO_OPTIMIZE') || envFlag('CLAUDEX_NIM_NO_OPTIMIZE')\n}\n\nfunction envFlag(name: string): boolean {\n  const value = process.env[name]\n  if (!value) return false\n  return ['1', 'true', 'yes', 'on'].includes(value.toLowerCase())\n}\n\nfunction readPositiveIntEnv(name: string): number | null {\n  const raw = process.env[name]\n  if (!raw) return null\n  const value = Number.parseInt(raw, 10)\n  return Number.isFinite(value) && value > 0 ? value : null\n}\n\nconst NIM_FAST_TOOL_ALLOWLIST = new Set<string>([\n  // Shell\n  'Bash', 'PowerShell',\n  // Filesystem\n  'Read', 'Write', 'Edit',\n  // Search\n  'Grep', 'Glob',\n  // Web\n  'WebSearch', 'WebFetch',\n  // Planning / delegation\n  'TodoWrite', 'Agent', 'Task', 'Skill', 'ToolSearch',\n  // OpenAI-compat lane native names.\n  'execute_command', 'read_file', 'write_file',\n  'str_replace', 'edit_block', 'edit_file',\n  'find_files', 'search_text', 'web_search',\n])\n", "/**\n * Ollama transformer.\n *\n * - Local / self-hosted; no API key is typically required.\n * - Strips `stream_options` (Ollama's OpenAI-compat layer doesn't\n *   implement include_usage reliably).\n * - Strict mode supported on newer builds; stripped from schemas\n *   to stay compatible with older local installations.\n */\n\nimport type { Transformer, TransformContext } from './base.js'\nimport type { OpenAIChatRequest } from './shared_types.js'\n\nexport const ollamaTransformer: Transformer = {\n  id: 'ollama',\n  displayName: 'Ollama (local)',\n  defaultBaseUrl: 'http://localhost:11434/v1',\n\n  supportsStrictMode: () => true,\n\n  clampMaxTokens(requested: number): number {\n    return requested\n  },\n\n  transformRequest(body: OpenAIChatRequest, _ctx: TransformContext): OpenAIChatRequest {\n    delete body.stream_options\n    return body\n  },\n\n  schemaDropList(): Set<string> {\n    return new Set(['$schema', '$id', '$ref', '$comment', 'strict', 'additionalProperties'])\n  },\n\n  contextExceededMarkers(): string[] {\n    return ['context length', 'prompt is too long', 'too long']\n  },\n\n  preferredEditFormat(_model: string): 'apply_patch' | 'edit_block' | 'str_replace' {\n    // Local models (Llama, Qwen-local, etc.) typically handle\n    // SEARCH/REPLACE better than apply_patch.\n    return 'edit_block'\n  },\n\n  smallFastModel(_model: string): string | null {\n    // No universal fast model; users typically run one model locally.\n    return null\n  },\n\n  cacheControlMode(): 'none' | 'passthrough' | 'last-only' {\n    return 'none'\n  },\n}\n", "/**\n * LM Studio transformer.\n *\n * LM Studio exposes a local OpenAI-compatible API, usually at\n * http://localhost:1234/v1. Authentication is optional for local use.\n */\n\nimport type { Transformer, TransformContext } from './base.js'\nimport type { OpenAIChatRequest } from './shared_types.js'\n\nexport const lmStudioTransformer: Transformer = {\n  id: 'lmstudio',\n  displayName: 'LM Studio (local)',\n  defaultBaseUrl: 'http://localhost:1234/v1',\n\n  supportsStrictMode: () => false,\n\n  clampMaxTokens(requested: number): number {\n    return requested\n  },\n\n  transformRequest(body: OpenAIChatRequest, ctx: TransformContext): OpenAIChatRequest {\n    delete body.stream_options\n    if (!ctx.isReasoning) {\n      body.thinking = { type: 'disabled' }\n    }\n    return body\n  },\n\n  schemaDropList(): Set<string> {\n    return new Set(['$schema', '$id', '$ref', '$comment', 'strict', 'additionalProperties'])\n  },\n\n  contextExceededMarkers(): string[] {\n    return ['context length', 'context window', 'prompt is too long', 'too long']\n  },\n\n  preferredEditFormat(_model: string): 'apply_patch' | 'edit_block' | 'str_replace' {\n    return 'edit_block'\n  },\n\n  smallFastModel(_model: string): string | null {\n    return null\n  },\n\n  cacheControlMode(): 'none' | 'passthrough' | 'last-only' {\n    return 'none'\n  },\n}\n", "/**\r\n * OpenRouter transformer.\r\n *\r\n * - Injects OpenRouter app-attribution headers so rankings credit Tau\r\n *   under the CLI agent category.\r\n * - cache_control is PASSED THROUGH for Anthropic/Gemini models (they\r\n *   natively support it); stripped for everything else so OpenRouter\r\n *   doesn't surface it as an unknown-field warning.\r\n * - Accepts `reasoning: { effort }` for reasoning-capable upstreams.\r\n * - Sends OpenAI cache affinity fields when a stable session id is present.\r\n * - Honors `function.strict: true` for the underlying model.\r\n * - `transforms`/`route`/`models` are OpenRouter-specific fields that\r\n *   pass through as-is.\r\n */\r\n\r\nimport type { Transformer, TransformContext } from './base.js'\r\nimport type { OpenAIChatRequest } from './shared_types.js'\r\n\r\nexport const openrouterTransformer: Transformer = {\r\n  id: 'openrouter',\r\n  displayName: 'OpenRouter',\r\n  defaultBaseUrl: 'https://openrouter.ai/api/v1',\r\n\r\n  supportsStrictMode: () => true,\r\n\r\n  clampMaxTokens(requested: number): number {\r\n    // OpenRouter reserves credit = max_tokens * price upfront. The upstream\r\n    // 32k default from context.ts triggers 402 \"requires more credits, or\r\n    // fewer max_tokens\" on free/low-credit accounts. 8192 fits typical\r\n    // free credit allowances and still leaves room for long tool arguments\r\n    // and multi-line code emissions.\r\n    return requested > 8192 ? 8192 : requested\r\n  },\r\n\r\n  buildHeaders(_apiKey: string): Record<string, string> {\r\n    const referer = process.env.OPENROUTER_REFERER ?? 'https://github.com/AbdoKnbGit/tau'\r\n    const title = process.env.OPENROUTER_TITLE ?? 'Tau'\r\n    const categories = process.env.OPENROUTER_CATEGORIES ?? 'cli-agent'\r\n\r\n    return {\r\n      'HTTP-Referer': referer,\r\n      'X-OpenRouter-Title': title,\r\n      'X-OpenRouter-Categories': categories,\r\n      'X-Title': title,\r\n    }\r\n  },\r\n\r\n  transformRequest(body: OpenAIChatRequest, ctx: TransformContext): OpenAIChatRequest {\r\n    if (ctx.sessionId) {\r\n      const retention = resolveOpenRouterCacheRetention()\r\n      if (retention !== 'none') {\r\n        body.prompt_cache_key = ctx.sessionId\r\n        if (retention === 'long') body.prompt_cache_retention = '24h'\r\n      }\r\n    }\r\n\r\n    // Only emit the reasoning knob for models that actually support it.\r\n    // Llama-4 / prompt-guard / base-chat Llamas routed via Vertex return\r\n    // \"thinking is not supported by this model\" when reasoning is set.\r\n    if (ctx.isReasoning && ctx.reasoningEffort && openrouterModelSupportsReasoning(body.model)) {\r\n      body.reasoning = { effort: ctx.reasoningEffort }\r\n    }\r\n    return body\r\n  },\r\n\r\n  schemaDropList(): Set<string> {\r\n    return new Set(['$schema', '$id', '$ref', '$comment'])\r\n  },\r\n\r\n  // Gemini routed via OpenRouter passes through the Gemini schema\r\n  // validator on the upstream side, which has stricter rules than the\r\n  // base OpenAI Chat shape:\r\n  //   - integer/number enum values must be STRINGS.\r\n  //   - `array` nodes must have an `items` schema.\r\n  //   - non-object types must not have `properties` / `required`.\r\n  //   - `required` must only list fields that exist in `properties`.\r\n  // Mirrors opencode's `sanitizeGemini` in provider/transform.ts:1329.\r\n  // Other upstreams on OR (Anthropic, OpenAI, Llama, \u2026) accept the\r\n  // base shape, so the sanitizer is gated on the model id.\r\n  sanitizeToolSchemaExtra(schema: Record<string, unknown>, modelId: string): Record<string, unknown> {\r\n    if (!isGeminiOnOR(modelId)) return schema\r\n    return sanitizeGeminiSchema(schema) as Record<string, unknown>\r\n  },\r\n\r\n  // Per-model default generation params. OpenRouter hosts many\r\n  // upstreams; defaults follow opencode's model-id matrix:\r\n  //   - Gemini family \u2192 temperature 1.0, top_p 0.95, top_k 64.\r\n  //   - Qwen family \u2192 temperature 0.55, top_p 1.0.\r\n  //   - MiniMax-M2 \u2192 temperature 1.0, top_p 0.95, top_k 20\u201340.\r\n  //   - Kimi K2 family \u2192 0.6 / 1.0 depending on variant.\r\n  defaultGenerationParams(model: string) {\r\n    const id = model.toLowerCase()\r\n    if (id.includes('google/gemini') || id.includes('gemini')) {\r\n      return { temperature: 1.0, top_p: 0.95, top_k: 64 }\r\n    }\r\n    if (id.includes('qwen')) {\r\n      return { temperature: 0.55, top_p: 1.0 }\r\n    }\r\n    if (id.includes('minimax-m2') || id.includes('minimax/m2')) {\r\n      const k = ['m2.', 'm25', 'm21'].some(s => id.includes(s)) ? 40 : 20\r\n      return { temperature: 1.0, top_p: 0.95, top_k: k }\r\n    }\r\n    if (id.includes('kimi-k2') || id.includes('moonshot/kimi-k2')) {\r\n      const isThinking = ['thinking', 'k2.', 'k2p', 'k2-5'].some(s => id.includes(s))\r\n      return isThinking\r\n        ? { temperature: 1.0, top_p: 0.95 }\r\n        : { temperature: 0.6 }\r\n    }\r\n    return undefined\r\n  },\r\n\r\n  contextExceededMarkers(): string[] {\r\n    return ['context length', 'context_length_exceeded', 'prompt is too long', 'maximum context']\r\n  },\r\n\r\n  preferredEditFormat(model: string): 'apply_patch' | 'edit_block' | 'str_replace' {\r\n    const m = model.toLowerCase()\r\n    // Frontier models routed via OpenRouter: keep apply_patch.\r\n    if (m.includes('anthropic/') || m.includes('claude-')) return 'apply_patch'\r\n    if (m.includes('openai/gpt-5') || m.includes('openai/o1') || m.includes('openai/o3')) return 'apply_patch'\r\n    if (m.includes('google/gemini-3') || m.includes('google/gemini-2.5')) return 'apply_patch'\r\n    // Everything else on OpenRouter \u2192 SEARCH/REPLACE (safer for non-frontier).\r\n    return 'edit_block'\r\n  },\r\n\r\n  smallFastModel(model: string): string | null {\r\n    const m = model.toLowerCase()\r\n    // Free-tier parent \u21D2 free fast model. Otherwise the title /\r\n    // tool-use-summary side calls would silently leave the free credit\r\n    // pool, surprise-billing the user.\r\n    if (m.endsWith(':free')) return 'nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free'\r\n    if (m.startsWith('anthropic/')) return 'anthropic/claude-haiku-4-5'\r\n    if (m.startsWith('openai/')) return 'openai/gpt-4o-mini'\r\n    if (m.startsWith('google/')) return 'google/gemini-2.5-flash-lite'\r\n    if (m.startsWith('meta-llama/') || m.startsWith('meta/')) return 'meta-llama/llama-3.3-8b-instruct'\r\n    return null\r\n  },\r\n\r\n  cacheControlMode(model: string): 'none' | 'passthrough' | 'last-only' {\r\n    // OpenRouter enforces Anthropic's 4-breakpoint cap by relocating\r\n    // cache_control to the last text block. For other underlying\r\n    // providers the field is silently ignored.\r\n    const m = model.toLowerCase()\r\n    if (m.includes('anthropic/') || m.includes('claude-')) return 'last-only'\r\n    if (m.includes('google/gemini')) return 'last-only'\r\n    return 'none'\r\n  },\r\n}\r\n\r\ntype OpenRouterCacheRetention = 'none' | 'short' | 'long'\r\n\r\nfunction resolveOpenRouterCacheRetention(): OpenRouterCacheRetention {\r\n  const raw = (\r\n    process.env.CLAUDEX_OPENROUTER_CACHE_RETENTION\r\n    ?? process.env.OPENROUTER_CACHE_RETENTION\r\n    ?? ''\r\n  ).trim().toLowerCase()\r\n\r\n  if (raw === 'none' || raw === 'off' || raw === 'false' || raw === '0' || raw === 'disabled') {\r\n    return 'none'\r\n  }\r\n  if (raw === 'long' || raw === '24h') {\r\n    return 'long'\r\n  }\r\n  return 'short'\r\n}\r\n\r\nfunction isGeminiOnOR(model: string): boolean {\r\n  const m = model.toLowerCase()\r\n  return m.startsWith('google/gemini') || m.includes('gemini-')\r\n}\r\n\r\n/**\r\n * Gemini upstream sanitizer. Mirrors opencode's `sanitizeGemini` in\r\n * provider/transform.ts. Returns a fresh object \u2014 never mutates input.\r\n */\r\nfunction sanitizeGeminiSchema(node: unknown): unknown {\r\n  if (node === null || typeof node !== 'object') return node\r\n  if (Array.isArray(node)) return node.map(sanitizeGeminiSchema)\r\n\r\n  const obj = node as Record<string, unknown>\r\n  const result: Record<string, unknown> = {}\r\n  for (const [k, v] of Object.entries(obj)) {\r\n    if (k === 'enum' && Array.isArray(v)) {\r\n      result[k] = v.map(item => String(item))\r\n      // Integer/number enums become string enums; the type field must\r\n      // follow suit or Gemini 400s with \"type mismatch in enum\".\r\n      if (result.type === 'integer' || result.type === 'number') {\r\n        result.type = 'string'\r\n      }\r\n    } else if (v !== null && typeof v === 'object') {\r\n      result[k] = sanitizeGeminiSchema(v)\r\n    } else {\r\n      result[k] = v\r\n    }\r\n  }\r\n\r\n  // `required` must only list fields that exist in `properties`. MCP\r\n  // tools occasionally list required fields that aren't declared\r\n  // (validator quirk) \u2014 Gemini rejects those.\r\n  if (result.type === 'object' && result.properties && Array.isArray(result.required)) {\r\n    const props = result.properties as Record<string, unknown>\r\n    result.required = (result.required as unknown[]).filter(\r\n      (f): f is string => typeof f === 'string' && f in props,\r\n    )\r\n  }\r\n\r\n  // Array nodes must carry an `items` schema. Default to `string`\r\n  // when the original schema was loose (e.g. JSON `{ type: \"array\" }`).\r\n  if (result.type === 'array' && !hasCombiner(result)) {\r\n    if (result.items == null) result.items = { type: 'string' }\r\n    else if (\r\n      typeof result.items === 'object' &&\r\n      !Array.isArray(result.items) &&\r\n      !hasSchemaIntent(result.items as Record<string, unknown>)\r\n    ) {\r\n      ;(result.items as Record<string, unknown>).type = 'string'\r\n    }\r\n  }\r\n\r\n  // Non-object nodes must not declare `properties` / `required`.\r\n  if (result.type && result.type !== 'object' && !hasCombiner(result)) {\r\n    delete result.properties\r\n    delete result.required\r\n  }\r\n  return result\r\n}\r\n\r\nfunction hasCombiner(node: Record<string, unknown>): boolean {\r\n  return Array.isArray(node.anyOf) || Array.isArray(node.oneOf) || Array.isArray(node.allOf)\r\n}\r\n\r\nfunction hasSchemaIntent(node: Record<string, unknown>): boolean {\r\n  if (hasCombiner(node)) return true\r\n  return [\r\n    'type', 'properties', 'items', 'prefixItems', 'enum', 'const', '$ref',\r\n    'additionalProperties', 'patternProperties', 'required', 'not', 'if',\r\n    'then', 'else',\r\n  ].some(k => k in node)\r\n}\r\n\r\nfunction openrouterModelSupportsReasoning(model: string): boolean {\r\n  const m = model.toLowerCase()\r\n  // Known reasoning-capable families on OpenRouter:\r\n  if (m.includes('deepseek-r1') || m.includes('deepseek/deepseek-r')) return true\r\n  if (m.includes('qwen/qwq') || m.includes('qwen3')) return true\r\n  if (m.includes('openai/o1') || m.includes('openai/o3') || m.includes('openai/o4')) return true\r\n  if (m.includes('openai/gpt-5')) return true\r\n  if (m.includes('anthropic/claude-3-7') || m.includes('anthropic/claude-sonnet-4') || m.includes('anthropic/claude-opus-4')) return true\r\n  if (m.includes('google/gemini-2.5') || m.includes('google/gemini-3')) return true\r\n  if (m.includes('xai/grok-3') || m.includes('xai/grok-4')) return true\r\n  // Everything else (including base Llama, Llama-4, prompt-guard,\r\n  // orpheus, gemma, mistral-small, etc.) \u2014 no reasoning knob.\r\n  return false\r\n}\r\n", "/**\r\n * AgentRouter transformer (https://agentrouter.org).\r\n *\r\n * Independent OpenRouter-style gateway. Speaks the OpenAI Chat\r\n * Completions wire format. Curated catalog of 8 models exposed by the\r\n * upstream:\r\n *   - claude-haiku-4-5-20251001, claude-opus-4-6      (Anthropic family)\r\n *   - glm-4.5, glm-4.6, glm-5.1                       (Z.ai GLM family)\r\n *   - deepseek-r1-0528, deepseek-v3.1, deepseek-v3.2  (DeepSeek family)\r\n *\r\n * cache_control: passed through with `last-only` placement for the\r\n * Claude rows so the upstream Anthropic gateway sees the rolling\r\n * 3-breakpoint cache anchor (system + last two user/tool turns) and\r\n * actually hits the prefix cache instead of cold-writing every turn.\r\n * For GLM and DeepSeek rows the field is stripped \u2014 those upstreams\r\n * don't honor Anthropic-style cache_control and may 400 on unknown\r\n * fields. Their server-side implicit caches still work without it.\r\n *\r\n * prompt_cache_key: stamped from the stable claudex sessionId on Claude\r\n * rows. Without it the gateway free-routes each turn to a different\r\n * upstream Anthropic backend, so the cache_control breakpoints land on\r\n * a cold prefix every time \u2014 visible as both ~100% cache-write usage\r\n * and the ~1-minute prefill latency users see on long sessions. The\r\n * key alone gives the gateway enough affinity hint to keep a session\r\n * pinned to the same backend, which is where the markers actually hit.\r\n */\r\n\r\nimport type { Transformer, TransformContext } from './base.js'\r\nimport type { OpenAIChatRequest } from './shared_types.js'\r\n\r\nconst AGENTROUTER_MODELS: Array<{ id: string; name: string }> = [\r\n  { id: 'claude-haiku-4-5-20251001', name: 'Claude Haiku 4.5 (2025-10-01)' },\r\n  { id: 'claude-opus-4-6', name: 'Claude Opus 4.6' },\r\n  { id: 'glm-4.5', name: 'GLM 4.5' },\r\n  { id: 'glm-4.6', name: 'GLM 4.6' },\r\n  { id: 'glm-5.1', name: 'GLM 5.1' },\r\n  { id: 'deepseek-r1-0528', name: 'DeepSeek R1 (2025-05-28)' },\r\n  { id: 'deepseek-v3.1', name: 'DeepSeek V3.1' },\r\n  { id: 'deepseek-v3.2', name: 'DeepSeek V3.2' },\r\n]\r\n\r\nfunction isClaudeModel(model: string): boolean {\r\n  return model.toLowerCase().startsWith('claude-')\r\n}\r\n\r\nfunction isReasoningCapable(model: string): boolean {\r\n  const m = model.toLowerCase()\r\n  if (m.startsWith('claude-opus-4') || m.startsWith('claude-haiku-4')) return true\r\n  if (m.includes('deepseek-r1')) return true\r\n  if (m.startsWith('glm-5')) return true\r\n  return false\r\n}\r\n\r\nexport const agentrouterTransformer: Transformer = {\r\n  id: 'agentrouter',\r\n  displayName: 'AgentRouter',\r\n  defaultBaseUrl: 'https://agentrouter.org/v1',\r\n\r\n  supportsStrictMode: () => true,\r\n\r\n  clampMaxTokens(requested: number): number {\r\n    return requested > 8192 ? 8192 : requested\r\n  },\r\n\r\n  transformRequest(body: OpenAIChatRequest, ctx: TransformContext): OpenAIChatRequest {\r\n    // Anchor the gateway to the same upstream backend across turns.\r\n    // Only Claude rows benefit (cache_control breakpoints are Claude-only\r\n    // here); the other families either implicit-cache server-side or\r\n    // don't cache at all. Field is silently ignored on backends that\r\n    // don't recognize it, so adding it for non-Claude rows is harmless\r\n    // but unnecessary.\r\n    if (ctx.sessionId && isClaudeModel(body.model)) {\r\n      body.prompt_cache_key = ctx.sessionId\r\n    }\r\n    if (ctx.isReasoning && ctx.reasoningEffort && isReasoningCapable(body.model)) {\r\n      body.reasoning = { effort: ctx.reasoningEffort }\r\n    }\r\n    return body\r\n  },\r\n\r\n  schemaDropList(): Set<string> {\r\n    return new Set(['$schema', '$id', '$ref', '$comment'])\r\n  },\r\n\r\n  contextExceededMarkers(): string[] {\r\n    return ['context length', 'context_length_exceeded', 'prompt is too long', 'maximum context']\r\n  },\r\n\r\n  preferredEditFormat(model: string): 'apply_patch' | 'edit_block' | 'str_replace' {\r\n    if (isClaudeModel(model)) return 'apply_patch'\r\n    return 'edit_block'\r\n  },\r\n\r\n  smallFastModel(model: string): string | null {\r\n    if (isClaudeModel(model)) return 'claude-haiku-4-5-20251001'\r\n    if (model.toLowerCase().includes('deepseek')) return 'deepseek-v3.2'\r\n    if (model.toLowerCase().startsWith('glm-')) return 'glm-4.6'\r\n    return null\r\n  },\r\n\r\n  cacheControlMode(model: string): 'none' | 'passthrough' | 'last-only' {\r\n    if (isClaudeModel(model)) return 'last-only'\r\n    return 'none'\r\n  },\r\n\r\n  staticCatalog(): Array<{ id: string; name: string }> {\r\n    return AGENTROUTER_MODELS.map(m => ({ ...m }))\r\n  },\r\n}\r\n", "import type { Transformer, TransformContext } from './base.js'\nimport type { OpenAIChatRequest } from './shared_types.js'\n\nconst MODELROUTER_TIER_MODELS = new Set(['economy', 'standard', 'premium', 'auto'])\n\nconst MODELROUTER_PINNED_MODELS: Array<{ id: string; name: string; provider: string }> = [\n  { id: 'gemini-2.5-flash', name: 'Gemini 2.5 Flash', provider: 'Google' },\n  { id: 'gpt-4.1-mini', name: 'GPT 4.1 Mini', provider: 'OpenAI' },\n  { id: 'o4-mini', name: 'o4-mini', provider: 'OpenAI' },\n  { id: 'claude-haiku-4-5', name: 'Claude Haiku 4.5', provider: 'Anthropic' },\n  { id: 'grok-3-mini-beta', name: 'Grok 3 Mini Beta', provider: 'xAI' },\n  { id: 'nvidia.nemotron-nano-3-30b', name: 'Nemotron Nano 3 30B', provider: 'Bedrock' },\n  { id: 'nvidia.nemotron-nano-9b-v2', name: 'Nemotron Nano 9B v2', provider: 'Bedrock' },\n  { id: 'zai.glm-4.7-flash', name: 'GLM 4.7 Flash', provider: 'Bedrock' },\n  { id: 'qwen.qwen3-32b-v1:0', name: 'Qwen3 32B', provider: 'Bedrock' },\n  { id: 'openai.gpt-oss-120b-1:0', name: 'GPT OSS 120B', provider: 'Bedrock' },\n  { id: 'llama-3.3-70b-versatile', name: 'Llama 3.3 70B Versatile', provider: 'Groq' },\n  { id: 'meta-llama/llama-4-scout-17b-16e-instruct', name: 'Llama 4 Scout 17B', provider: 'Groq' },\n  { id: 'llama3.1-8b', name: 'Llama 3.1 8B', provider: 'Cerebras' },\n  { id: 'qwen-3-235b-a22b-instruct-2507', name: 'Qwen 3 235B A22B Instruct', provider: 'Cerebras' },\n  { id: 'gemini-2.5-pro', name: 'Gemini 2.5 Pro', provider: 'Google' },\n  { id: 'gpt-4.1', name: 'GPT 4.1', provider: 'OpenAI' },\n  { id: 'gpt-5.3-chat-latest', name: 'GPT 5.3 Chat Latest', provider: 'OpenAI' },\n  { id: 'gpt-5.3-codex', name: 'GPT 5.3 Codex', provider: 'OpenAI' },\n  { id: 'gpt-5.1-codex-mini', name: 'GPT 5.1 Codex Mini', provider: 'OpenAI' },\n  { id: 'o3', name: 'o3', provider: 'OpenAI' },\n  { id: 'claude-sonnet-4-6', name: 'Claude Sonnet 4.6', provider: 'Anthropic' },\n  { id: 'grok-3-beta', name: 'Grok 3 Beta', provider: 'xAI' },\n  { id: 'zai.glm-4.7', name: 'GLM 4.7', provider: 'Bedrock' },\n  { id: 'deepseek.v3.2', name: 'DeepSeek V3.2', provider: 'Bedrock' },\n  { id: 'mistral.mistral-large-3-675b-instruct', name: 'Mistral Large 3 675B Instruct', provider: 'Bedrock' },\n  { id: 'moonshotai.kimi-k2.5', name: 'Kimi K2.5', provider: 'Bedrock' },\n  { id: 'minimax.minimax-m2.1', name: 'MiniMax M2.1', provider: 'Bedrock' },\n  { id: 'qwen.qwen3-next-80b-a3b', name: 'Qwen3 Next 80B A3B', provider: 'Bedrock' },\n  { id: 'us.meta.llama4-maverick-17b-instruct-v1:0', name: 'Llama 4 Maverick 17B', provider: 'Bedrock' },\n  { id: 'us.meta.llama4-scout-17b-instruct-v1:0', name: 'Llama 4 Scout 17B', provider: 'Bedrock' },\n  { id: 'mistral.devstral-2-123b', name: 'Devstral 2 123B', provider: 'Bedrock' },\n  { id: 'qwen.qwen3-coder-480b-a35b-v1:0', name: 'Qwen3 Coder 480B A35B', provider: 'Bedrock' },\n  { id: 'nvidia.nemotron-super-3-120b', name: 'Nemotron Super 3 120B', provider: 'Bedrock' },\n  { id: 'qwen.qwen3-235b-a22b-2507-v1:0', name: 'Qwen3 235B A22B', provider: 'Bedrock' },\n  { id: 'gemini-3.1-pro-preview', name: 'Gemini 3.1 Pro Preview', provider: 'Google' },\n  { id: 'claude-opus-4-7', name: 'Claude Opus 4.7', provider: 'Anthropic' },\n  { id: 'claude-opus-4-6', name: 'Claude Opus 4.6', provider: 'Anthropic' },\n  { id: 'gpt-5.4', name: 'GPT 5.4', provider: 'OpenAI' },\n  { id: 'zai.glm-5', name: 'GLM 5', provider: 'Bedrock' },\n]\n\nconst MODELROUTER_ALIASES = new Map<string, string>([\n  ['claude-3-5-haiku', 'claude-haiku-4-5'],\n  ['claude-3-5-haiku-20241022', 'claude-haiku-4-5'],\n  ['anthropic/claude-3-5-haiku', 'claude-haiku-4-5'],\n  ['anthropic/claude-3-5-haiku-20241022', 'claude-haiku-4-5'],\n  ['claude-haiku-4.5', 'claude-haiku-4-5'],\n  ['claude-haiku-4-5-20251001', 'claude-haiku-4-5'],\n  ['anthropic/claude-haiku-4-5', 'claude-haiku-4-5'],\n  ['anthropic/claude-haiku-4.5', 'claude-haiku-4-5'],\n  ['claude-sonnet-4.6', 'claude-sonnet-4-6'],\n  ['anthropic/claude-sonnet-4-6', 'claude-sonnet-4-6'],\n  ['claude-opus-4.7', 'claude-opus-4-7'],\n  ['anthropic/claude-opus-4-7', 'claude-opus-4-7'],\n  ['claude-opus-4.6', 'claude-opus-4-6'],\n  ['anthropic/claude-opus-4-6', 'claude-opus-4-6'],\n  ['gpt-oss-120b', 'openai.gpt-oss-120b-1:0'],\n  ['openai/gpt-oss-120b', 'openai.gpt-oss-120b-1:0'],\n  ['openai.gpt-oss-120b', 'openai.gpt-oss-120b-1:0'],\n  ['deepseek-v3.2', 'deepseek.v3.2'],\n  ['deepseek/deepseek-v3.2', 'deepseek.v3.2'],\n  ['glm-4.7-flash', 'zai.glm-4.7-flash'],\n  ['glm-4.7', 'zai.glm-4.7'],\n  ['glm-5', 'zai.glm-5'],\n  ['gemini-3.1-pro', 'gemini-3.1-pro-preview'],\n  ['mistral-large-3', 'mistral.mistral-large-3-675b-instruct'],\n  ['mistral-large', 'mistral.mistral-large-3-675b-instruct'],\n  ['kimi-k2.5', 'moonshotai.kimi-k2.5'],\n  ['moonshot/kimi-k2.5', 'moonshotai.kimi-k2.5'],\n  ['minimax-m2.1', 'minimax.minimax-m2.1'],\n  ['qwen3-32b', 'qwen.qwen3-32b-v1:0'],\n  ['qwen/qwen3-32b', 'qwen.qwen3-32b-v1:0'],\n  ['qwen3-coder', 'qwen.qwen3-coder-480b-a35b-v1:0'],\n  ['nemotron-super-3-120b', 'nvidia.nemotron-super-3-120b'],\n  ['nemotron-nano-3-30b', 'nvidia.nemotron-nano-3-30b'],\n  ['nemotron-nano-9b-v2', 'nvidia.nemotron-nano-9b-v2'],\n])\n\nexport const modelRouterTransformer: Transformer = {\n  id: 'modelrouter',\n  displayName: 'Model Router',\n  defaultBaseUrl: 'https://api.lxg2it.com/v1',\n\n  supportsStrictMode: () => false,\n\n  clampMaxTokens(requested: number): number {\n    return requested > 8192 ? 8192 : requested\n  },\n\n  transformRequest(body: OpenAIChatRequest, ctx: TransformContext): OpenAIChatRequest {\n    body.model = normalizeModelRouterModel(body.model)\n    stripRoutingHintsForPinnedModel(body)\n    applyOpenAIReasoningEffort(body, ctx)\n    return body\n  },\n\n  schemaDropList(): Set<string> {\n    return new Set(['$schema', '$id', '$ref', '$comment', 'strict', 'pattern', 'format', 'default'])\n  },\n\n  contextExceededMarkers(): string[] {\n    return ['context length', 'context_length_exceeded', 'prompt is too long', 'maximum context', 'token limit']\n  },\n\n  preferredEditFormat(model: string): 'apply_patch' | 'edit_block' | 'str_replace' {\n    const m = model.toLowerCase()\n    if (m.includes('gpt-5') || m.includes('claude') || m.includes('gemini-3') || m.includes('gemini-2.5')) {\n      return 'apply_patch'\n    }\n    return 'edit_block'\n  },\n\n  smallFastModel(_model: string): string | null {\n    return 'claude-haiku-4-5'\n  },\n\n  cacheControlMode(model: string): 'none' | 'passthrough' | 'last-only' {\n    if (isAnthropicModelRouterModel(normalizeModelRouterModel(model))) return 'last-only'\n    return 'none'\n  },\n\n  staticCatalog() {\n    return MODELROUTER_PINNED_MODELS.map(model => ({ ...model }))\n  },\n\n  preferLiveModelCatalog(): boolean {\n    return true\n  },\n\n  filterModelCatalog(models) {\n    const byId = new Map<string, { id: string; name?: string }>()\n    for (const model of models) byId.set(model.id, model)\n    for (const model of MODELROUTER_PINNED_MODELS) {\n      if (!byId.has(model.id)) byId.set(model.id, model)\n    }\n    return [...byId.values()]\n  },\n}\n\nfunction applyOpenAIReasoningEffort(\n  body: OpenAIChatRequest,\n  ctx: TransformContext,\n): void {\n  if (!ctx.isReasoning || !ctx.reasoningEffort) return\n  const m = body.model.toLowerCase()\n  if (m.includes('gpt-5') || m.includes('/o1') || m.includes('/o3') || m.includes('/o4') || /^o[1345]/.test(m)) {\n    body.reasoning_effort = ctx.reasoningEffort\n  }\n}\n\nfunction normalizeModelRouterModel(model: string): string {\n  const trimmed = model.trim()\n  const normalized = trimmed.toLowerCase()\n  if (MODELROUTER_TIER_MODELS.has(normalized)) return normalized\n  return MODELROUTER_ALIASES.get(normalized) ?? trimmed\n}\n\nfunction isAnthropicModelRouterModel(model: string): boolean {\n  const normalized = model.toLowerCase()\n  return normalized.startsWith('claude-') || normalized.startsWith('anthropic/')\n}\n\nfunction stripRoutingHintsForPinnedModel(body: OpenAIChatRequest): void {\n  if (MODELROUTER_TIER_MODELS.has(body.model.toLowerCase())) return\n\n  const bag = body as OpenAIChatRequest & {\n    prefer?: string\n  }\n  delete bag.prefer\n  delete bag.route\n  delete bag.models\n  delete bag.transforms\n\n  const extra = bag.extra_body\n  if (extra && typeof extra === 'object') {\n    delete extra.prefer\n    delete extra.route\n    delete extra.models\n    delete extra.transforms\n  }\n}\n", "import type { Transformer, TransformContext } from './base.js'\nimport type { OpenAIChatRequest } from './shared_types.js'\n\nexport const vercelTransformer: Transformer = {\n  id: 'vercel',\n  displayName: 'Vercel AI Gateway',\n  defaultBaseUrl: 'https://ai-gateway.vercel.sh/v1',\n\n  supportsStrictMode: () => false,\n\n  clampMaxTokens(requested: number): number {\n    return requested > 8192 ? 8192 : requested\n  },\n\n  transformRequest(body: OpenAIChatRequest, ctx: TransformContext): OpenAIChatRequest {\n    enableVercelAutoCaching(body)\n    applyOpenAIReasoningEffort(body, ctx)\n    return body\n  },\n\n  schemaDropList(): Set<string> {\n    return new Set(['$schema', '$id', '$ref', '$comment', 'strict', 'pattern', 'format', 'default'])\n  },\n\n  contextExceededMarkers(): string[] {\n    return ['context length', 'context_length_exceeded', 'prompt is too long', 'maximum context', 'token limit']\n  },\n\n  preferredEditFormat(model: string): 'apply_patch' | 'edit_block' | 'str_replace' {\n    const m = model.toLowerCase()\n    if (m.includes('anthropic/') || m.includes('claude-')) return 'apply_patch'\n    if (m.includes('openai/gpt-5') || m.includes('openai/o1') || m.includes('openai/o3')) return 'apply_patch'\n    if (m.includes('google/gemini-3') || m.includes('google/gemini-2.5')) return 'apply_patch'\n    return 'edit_block'\n  },\n\n  smallFastModel(model: string): string | null {\n    const m = model.toLowerCase()\n    if (m.startsWith('anthropic/')) return 'anthropic/claude-haiku-4-5'\n    if (m.startsWith('openai/')) return 'openai/gpt-4o-mini'\n    if (m.startsWith('google/')) return 'google/gemini-2.5-flash-lite'\n    return null\n  },\n\n  cacheControlMode(model: string): 'none' | 'passthrough' | 'last-only' {\n    void model\n    return 'none'\n  },\n}\n\nfunction enableVercelAutoCaching(body: OpenAIChatRequest): void {\n  const current = body.providerOptions ?? {}\n  const gateway = typeof current.gateway === 'object' && current.gateway !== null\n    ? current.gateway\n    : {}\n  body.providerOptions = {\n    ...current,\n    gateway: {\n      ...gateway,\n      caching: gateway.caching ?? 'auto',\n    },\n  }\n}\n\nfunction applyOpenAIReasoningEffort(\n  body: OpenAIChatRequest,\n  ctx: TransformContext,\n): void {\n  if (!ctx.isReasoning || !ctx.reasoningEffort) return\n  const m = body.model.toLowerCase()\n  if (m.includes('openai/gpt-5') || m.includes('openai/o1') || m.includes('openai/o3') || m.includes('openai/o4')) {\n    body.reasoning_effort = ctx.reasoningEffort\n  }\n}\n", "import type { Transformer, TransformContext } from './base.js'\nimport type { OpenAIChatRequest } from './shared_types.js'\n\nexport const requestyTransformer: Transformer = {\n  id: 'requesty',\n  displayName: 'Requesty',\n  defaultBaseUrl: 'https://router.requesty.ai/v1',\n\n  supportsStrictMode: () => false,\n\n  clampMaxTokens(requested: number): number {\n    return requested > 8192 ? 8192 : requested\n  },\n\n  transformRequest(body: OpenAIChatRequest, ctx: TransformContext): OpenAIChatRequest {\n    enableRequestyAutoCaching(body)\n    applyOpenAIReasoningEffort(body, ctx)\n    return body\n  },\n\n  schemaDropList(): Set<string> {\n    return new Set(['$schema', '$id', '$ref', '$comment', 'strict', 'pattern', 'format', 'default'])\n  },\n\n  contextExceededMarkers(): string[] {\n    return ['context length', 'context_window', 'context_length_exceeded', 'prompt is too long', 'maximum context', 'token limit']\n  },\n\n  preferredEditFormat(model: string): 'apply_patch' | 'edit_block' | 'str_replace' {\n    const m = model.toLowerCase()\n    if (m.includes('anthropic/') || m.includes('claude-')) return 'apply_patch'\n    if (m.includes('openai/gpt-5') || m.includes('openai/o1') || m.includes('openai/o3')) return 'apply_patch'\n    if (m.includes('google/gemini-3') || m.includes('google/gemini-2.5')) return 'apply_patch'\n    return 'edit_block'\n  },\n\n  smallFastModel(model: string): string | null {\n    const m = model.toLowerCase()\n    if (m.startsWith('anthropic/')) return 'anthropic/claude-haiku-4-5'\n    if (m.startsWith('openai/')) return 'openai/gpt-4o-mini'\n    if (m.startsWith('google/')) return 'google/gemini-2.5-flash-lite'\n    return null\n  },\n\n  cacheControlMode(model: string): 'none' | 'passthrough' | 'last-only' {\n    void model\n    return 'none'\n  },\n}\n\nfunction enableRequestyAutoCaching(body: OpenAIChatRequest): void {\n  body.requesty = {\n    ...(body.requesty ?? {}),\n    auto_cache: body.requesty?.auto_cache ?? true,\n  }\n}\n\nfunction applyOpenAIReasoningEffort(\n  body: OpenAIChatRequest,\n  ctx: TransformContext,\n): void {\n  if (!ctx.isReasoning || !ctx.reasoningEffort) return\n  const m = body.model.toLowerCase()\n  if (m.includes('openai/gpt-5') || m.includes('openai/o1') || m.includes('openai/o3') || m.includes('openai/o4')) {\n    body.reasoning_effort = ctx.reasoningEffort\n  }\n}\n", "/**\n * OpenCode Zen per-model thinking effort store.\n *\n * Every reasoning-capable model the gateway serves has its own knob:\n * Default (server default \u2014 usually off, except for free-tier models\n * where opencode-dev defaults thinking on at medium), Low, Medium, High.\n *\n * The shape we inject downstream depends on the upstream backend the\n * gateway routes to (see opencodeTransformer.transformRequest):\n *\n *   - Anthropic native    \u2192 thinking: { type: \"enabled\", budget_tokens }\n *   - OpenAI Responses    \u2192 reasoning_effort + reasoning: { effort }\n *   - Google native       \u2192 thinking_config: { include_thoughts, thinking_level }\n *   - DeepSeek (oa-compat)\u2192 thinking: { type: \"enabled\" }   (no effort field)\n *   - GLM/Kimi 4.6/4.7    \u2192 chat_template_args: { enable_thinking: true }\n *   - Qwen/QwQ (DashScope)\u2192 enable_thinking: true\n *   - Anything else (e.g. minimax, big-pickle): no effort knob \u2014 server-side\n *     defaults pick the thinking mode and we don't inject anything.\n *\n * The store persists to ~/.claude/opencode-thinking.json so the chosen\n * effort survives across sessions per model id.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { dirname, join } from 'node:path'\n\nexport type OpencodeEffort = 'default' | 'low' | 'medium' | 'high'\n\nexport const OPENCODE_EFFORT_LEVELS: readonly OpencodeEffort[] = [\n  'default',\n  'low',\n  'medium',\n  'high',\n]\n\n// Models that should default to \"medium\" on first use:\n//   1. Free-tier rows that opencode-dev itself ships with thinking enabled \u2014\n//      without this they'd come up cold and the user would see worse quality\n//      than running opencode directly.\n//   2. Models whose server-side default is thinking-on regardless of body\n//      flags (kimi-k2-thinking, glm-4.6, deepseek-v4-*). Forcing \"default\"\n//      \u2192 off via thinking: {type:\"disabled\"} on these would either be ignored\n//      (kimi-thinking) or fight the upstream's own default, surfacing the\n//      \"reasoning_content must be passed back\" 400 anyway. Starting at medium\n//      keeps the picker in sync with what the upstream is actually doing.\nconst FREE_TIER_DEFAULT_MEDIUM = (model: string): boolean => {\n  const m = model.toLowerCase()\n  if (m.endsWith('-free')) return true\n  if (m.includes('big-pickle')) return true\n  if (m === 'gpt-5-nano' || m === 'gpt-5.4-nano') return true\n  if (m === 'kimi-k2-thinking' || m === 'glm-4.6') return true\n  if (m.startsWith('deepseek-v4')) return true\n  return false\n}\n\n// Models that the gateway forwards in a shape where Anthropic-style\n// `thinking: { type: \"enabled\" }` (or the alternate fields below) is the\n// switch that controls reasoning emission. If a model isn't reasoning-capable\n// the picker's toggle UI is hidden and nothing is injected.\n//\n// This intentionally matches opencodeTransformer.isReasoningCapable():\n// the two should stay in lockstep. If you add a family here add it there\n// too, and vice versa.\nexport function isOpencodeThinkingModel(model: string): boolean {\n  const m = model.toLowerCase()\n  // Anthropic\n  if (m.startsWith('claude-opus-4') || m.startsWith('claude-haiku-4') || m.startsWith('claude-sonnet-4')) return true\n  if (m.includes('anthropic/claude-opus-4') || m.includes('anthropic/claude-sonnet-4') || m.includes('anthropic/claude-haiku-4')) return true\n  // DeepSeek\n  if (m.includes('deepseek-r1') || m.includes('deepseek/deepseek-r')) return true\n  if (m.includes('deepseek-v4') || m.includes('deepseek-reasoner')) return true\n  // Qwen / QwQ\n  if (m.includes('qwen3') || m.includes('qwen-3') || m.includes('qwq')) return true\n  // GLM 4.7 / 5.x \u2014 these are the families opencode marks reasoning=true\n  if (m.startsWith('glm-5') || m.includes('glm-5') || m === 'glm-4.7' || m === 'glm-4.6') return true\n  // Kimi thinking family\n  if (m === 'kimi-k2-thinking' || m.includes('kimi-k2.5') || m.includes('kimi-k2p5') || m.includes('kimi-k2-5')) return true\n  // OpenAI GPT-5 / o-series / codex\n  if (m.startsWith('gpt-5') || m.startsWith('openai/gpt-5') || m.includes('codex')) return true\n  if (m.startsWith('o1') || m.startsWith('o3') || m.startsWith('o4')) return true\n  // Grok reasoning\n  if (m.startsWith('grok-3') || m.startsWith('grok-4') || m.startsWith('xai/grok-3') || m.startsWith('xai/grok-4')) return true\n  // Gemini 2.5 / 3.x\n  if (m.includes('gemini-2.5') || m.includes('gemini-3')) return true\n  // MiniMax M2 reasoning variants\n  if (m.includes('minimax-m2')) return true\n  return false\n}\n\nconst STORE_PATH = join(homedir(), '.claude', 'opencode-thinking.json')\n\nlet _loaded = false\nlet _cache: Record<string, OpencodeEffort> = {}\n\nfunction load(): void {\n  if (_loaded) return\n  _loaded = true\n  try {\n    if (!existsSync(STORE_PATH)) return\n    const raw = readFileSync(STORE_PATH, 'utf8')\n    const parsed = JSON.parse(raw) as unknown\n    if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n      const out: Record<string, OpencodeEffort> = {}\n      for (const [k, v] of Object.entries(parsed as Record<string, unknown>)) {\n        if (typeof v === 'string' && (OPENCODE_EFFORT_LEVELS as readonly string[]).includes(v)) {\n          out[k.toLowerCase()] = v as OpencodeEffort\n        }\n      }\n      _cache = out\n    }\n  } catch {\n    // Stale or corrupt file \u2014 treat as empty. Next save() rewrites it.\n  }\n}\n\nfunction save(): void {\n  try {\n    const dir = dirname(STORE_PATH)\n    if (!existsSync(dir)) mkdirSync(dir, { recursive: true })\n    writeFileSync(STORE_PATH, JSON.stringify(_cache, null, 2), 'utf8')\n  } catch {\n    // Persistence is best-effort. The in-memory cache still works for the\n    // current session even if the disk write fails (read-only home, etc.).\n  }\n}\n\nexport function getOpencodeEffort(model: string): OpencodeEffort {\n  load()\n  const key = model.trim().toLowerCase()\n  const stored = _cache[key]\n  if (stored) return stored\n  if (FREE_TIER_DEFAULT_MEDIUM(model) && isOpencodeThinkingModel(model)) {\n    return 'medium'\n  }\n  return 'default'\n}\n\nexport function setOpencodeEffort(model: string, effort: OpencodeEffort): void {\n  load()\n  const key = model.trim().toLowerCase()\n  if (effort === 'default') {\n    delete _cache[key]\n  } else {\n    _cache[key] = effort\n  }\n  save()\n}\n\nexport function cycleOpencodeEffort(\n  model: string,\n  direction: 'left' | 'right',\n): OpencodeEffort {\n  const current = getOpencodeEffort(model)\n  const idx = OPENCODE_EFFORT_LEVELS.indexOf(current)\n  const len = OPENCODE_EFFORT_LEVELS.length\n  const next =\n    direction === 'right'\n      ? OPENCODE_EFFORT_LEVELS[(idx + 1) % len]!\n      : OPENCODE_EFFORT_LEVELS[(idx - 1 + len) % len]!\n  setOpencodeEffort(model, next)\n  return next\n}\n\n/**\n * Label rendered in the picker chip. Capitalized for the row.\n */\nexport function getOpencodeEffortLabel(effort: OpencodeEffort): string {\n  return effort.charAt(0).toUpperCase() + effort.slice(1)\n}\n", "/**\n * OpenCode Zen transformer (https://opencode.ai/zen/).\n *\n * Multi-format gateway hosted by the OpenCode team. Speaks the OpenAI Chat\n * Completions wire format on `/v1/chat/completions` for the broad catalog\n * (Qwen, GLM, Kimi, Grok, DeepSeek, Nemotron, MiniMax), and routes Claude\n * and Gemini rows through their native shapes internally. From the\n * client's perspective every request goes to `/chat/completions` \u2014 the\n * gateway translates per-model.\n *\n * cache_control: `last-only` placement on Claude / Gemini rows so the\n * upstream sees the rolling 3-breakpoint cache anchor (system + last two\n * user/tool turns) and hits the prefix cache instead of cold-writing\n * every turn. For non-Anthropic/non-Gemini rows the field is stripped \u2014\n * those backends don't honor Anthropic-style cache_control and may 400\n * on unknown fields. Their server-side implicit caches still work.\n *\n * prompt_cache_key: stamped from the stable claudex sessionId on Claude\n * rows. Anchors the gateway to the same upstream backend across turns;\n * without it the cache_control breakpoints land on a cold prefix every\n * time.\n */\n\nimport { randomUUID } from 'node:crypto'\n\nimport type { HeaderContext, Transformer, TransformContext } from './base.js'\nimport type { OpenAIChatRequest } from './shared_types.js'\nimport { sanitizeDeepSeekToolCallAdjacency } from './deepseek.js'\nimport {\n  getOpencodeEffort,\n  isOpencodeThinkingModel,\n  type OpencodeEffort,\n} from '../../../utils/model/opencodeThinking.js'\n\ndeclare const MACRO: { VERSION: string }\n\n// Pinned to the live opencode release shape: `opencode/<version>`. The\n// rate-limit gate (ipRateLimiter.ts:13-16) reads checkHeaders out of the\n// ZEN_LIMITS secret and the only entry stable enough to gate on is the\n// official client's UA. Bumping this string in lockstep with opencode-dev's\n// packages/opencode/package.json keeps the gate satisfied even if the\n// gateway tightens the substring (e.g. to `opencode/1.`).\nconst OPENCODE_UA_VERSION = '1.15.9'\n\n// Stable per-process session id used when the caller didn't pass one\n// (e.g. /title, /compact, or any one-shot lane call that bypasses the\n// bridge's getSessionId() injection). Without this header the gateway's\n// `headersExist` test (ipRateLimiter.ts:13) fails on the entry that\n// requires x-opencode-session to be non-empty, dropping the daily quota\n// to dailyRequestsFallback (1/day) on free rows. Generating once per\n// process means the gateway sees consistent affinity across the run.\nlet _processSessionId: string | null = null\nfunction getProcessSessionId(): string {\n  if (!_processSessionId) _processSessionId = randomUUID()\n  return _processSessionId\n}\n\nfunction isClaudeModel(model: string): boolean {\n  const m = model.toLowerCase()\n  return m.startsWith('claude-') || m.includes('anthropic/')\n}\n\nfunction isGeminiModel(model: string): boolean {\n  const m = model.toLowerCase()\n  return m.startsWith('gemini-') || m.includes('google/gemini')\n}\n\nfunction isReasoningCapable(model: string): boolean {\n  // Authoritative list lives in utils/model/opencodeThinking.ts so the picker\n  // chip and the transformer agree on which rows expose the toggle.\n  return isOpencodeThinkingModel(model)\n}\n\n// \u2500\u2500 Per-model reasoning-effort budget for Anthropic / Gemini upstreams \u2500\u2500\n//\n// The gateway forwards Anthropic-shape `thinking.budget_tokens` and\n// Google-shape `thinking_config.thinking_budget` literally to the underlying\n// provider. Match the budgets opencode-dev's own variants() function uses\n// so a Tau \"high\" feels the same as opencode's \"high\".\nfunction anthropicBudgetFor(effort: OpencodeEffort): number {\n  switch (effort) {\n    case 'low': return 4000\n    case 'medium': return 8000\n    case 'high': return 16000\n    default: return 0\n  }\n}\n\nfunction gemini25BudgetFor(effort: OpencodeEffort): number {\n  switch (effort) {\n    case 'low': return 4000\n    case 'medium': return 8000\n    case 'high': return 16000\n    default: return 0\n  }\n}\n\nfunction isAnthropicRow(model: string): boolean {\n  const m = model.toLowerCase()\n  return m.startsWith('claude-') || m.includes('anthropic/claude')\n}\n\nfunction isGptOrOSeries(model: string): boolean {\n  const m = model.toLowerCase()\n  return (\n    m.startsWith('gpt-5') ||\n    m.startsWith('openai/gpt-5') ||\n    m.includes('codex') ||\n    m.startsWith('o1') || m.startsWith('o3') || m.startsWith('o4')\n  )\n}\n\nfunction isGemini25(model: string): boolean {\n  return model.toLowerCase().includes('gemini-2.5')\n}\n\nfunction isGemini3(model: string): boolean {\n  return model.toLowerCase().includes('gemini-3')\n}\n\nfunction isGrokMini(model: string): boolean {\n  const m = model.toLowerCase()\n  return m.includes('grok-3-mini') || m.includes('xai/grok-3-mini')\n}\n\n// kimi-k2-thinking and glm-4.6 expose reasoning via vLLM/SGLang's\n// chat_template_args switch. The gateway forwards this flag verbatim\n// to the upstream's chat template. See opencode-dev's ProviderTransform.options:\n// (input.model.providerID === \"opencode\" && [\"kimi-k2-thinking\", \"glm-4.6\"].includes(...))\nfunction needsChatTemplateArgs(model: string): boolean {\n  const m = model.toLowerCase()\n  return m === 'kimi-k2-thinking' || m === 'glm-4.6'\n}\n\n// DashScope-style (qwen, qwq, deepseek-r1 on alibaba-cn) needs `enable_thinking`\n// at the top level. opencode-dev applies this for any reasoning model on the\n// alibaba-cn provider with openai-compatible npm. We forward the same flag \u2014\n// upstreams that don't recognize it ignore it (oa-compat tolerant), upstreams\n// that do recognize it (DashScope) start emitting reasoning_content.\nfunction needsEnableThinking(model: string): boolean {\n  const m = model.toLowerCase()\n  if (m === 'kimi-k2-thinking') return false  // already covered by chat_template_args\n  return (\n    m.includes('qwen3') || m.includes('qwen-3') || m.includes('qwq') ||\n    m.includes('deepseek-r1') || m.includes('deepseek/deepseek-r')\n  )\n}\n\n// GLM zai/zhipuai-style switch \u2014 opencode-dev injects this for zai/zhipuai\n// providers with openai-compatible npm. Match for GLM 5.x rows hosted via\n// OpenCode Zen so they actually emit reasoning when the user wants it on.\nfunction needsZaiThinkingSwitch(model: string): boolean {\n  const m = model.toLowerCase()\n  return m.startsWith('glm-5') || m.includes('glm-5') || m === 'glm-4.7'\n}\n\n// DeepSeek V4 / reasoner \u2014 `thinking: { type: \"enabled\" }` toggles thinking\n// mode and the upstream then expects `reasoning_content` echoed back on\n// replayed assistant tool-call messages.\nfunction needsAnthropicShapeThinking(model: string): boolean {\n  const m = model.toLowerCase()\n  return (\n    m.includes('deepseek-v4') ||\n    m.includes('deepseek-reasoner') ||\n    m === 'kimi-k2.5' || m === 'kimi-k2p5' || m.includes('kimi-k2.5') ||\n    m.includes('kimi-k2-5') || m.includes('kimi-k2p5')\n  )\n}\n\nexport const opencodeTransformer: Transformer = {\n  id: 'opencode',\n  displayName: 'OpenCode Zen',\n  defaultBaseUrl: 'https://opencode.ai/zen/v1',\n\n  supportsStrictMode: () => true,\n\n  clampMaxTokens(requested: number): number {\n    // OpenCode Zen is pay-per-use; mirror OpenRouter's conservative cap so\n    // free credit accounts don't trip 402 on the upstream's reserve check.\n    return requested > 8192 ? 8192 : requested\n  },\n\n  transformRequest(body: OpenAIChatRequest, ctx: TransformContext): OpenAIChatRequest {\n    // Anchor the gateway to the same upstream backend across turns for\n    // EVERY family the catalog serves \u2014 each backend has its own caching\n    // primitive:\n    //   - Claude  \u2192 cache_control breakpoints (stamped via cacheControlMode)\n    //               + prompt_cache_key as a gateway affinity hint so the\n    //               same Anthropic worker keeps the prefix warm.\n    //   - GPT-5.x \u2192 OpenAI Responses API auto-caches prefixes >1024 tokens\n    //               and uses prompt_cache_key directly for affinity.\n    //               This is where the cache actually lives on this row.\n    //   - Gemini  \u2192 Google context caching; cache_control breakpoints +\n    //               prompt_cache_key anchor the gateway to one backend.\n    //   - DeepSeek/GLM/Kimi/Grok/Qwen/Nemotron/MiniMax \u2192 most have their\n    //               own server-side implicit cache; affinity hint still\n    //               helps the gateway keep sessions sticky so those\n    //               caches actually hit.\n    //\n    // The field is silently ignored on any backend that doesn't recognize\n    // it, so stamping uniformly is strictly an improvement.\n    if (ctx.sessionId) {\n      body.prompt_cache_key = ctx.sessionId\n    }\n\n    // \u2500\u2500 Per-model thinking effort injection \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    //\n    // The picker stores per-model effort in utils/model/opencodeThinking.ts.\n    // We read it here and inject the correct payload shape per upstream\n    // family so the gateway forwards each provider's native thinking\n    // controls without surprise.\n    //\n    // If the user hasn't picked an effort, we fall through to the gateway's\n    // default behavior \u2014 opencode-dev itself defaults thinking on for\n    // free-tier rows (handled by the store).\n    if (isReasoningCapable(body.model)) {\n      const effort = getOpencodeEffort(body.model)\n      const m = body.model.toLowerCase()\n      if (effort !== 'default') {\n        // Anthropic upstream \u2014 `thinking.budget_tokens`. The gateway converts\n        // oa-compat \u2192 anthropic for Claude rows, so we ALSO need to set\n        // `reasoning_effort` (the field opencode's @ai-sdk/anthropic adapter\n        // recognizes) so the gateway sees the effort hint either way.\n        if (isAnthropicRow(body.model)) {\n          body.thinking = { type: 'enabled' } as { type: 'enabled' }\n          ;(body as any).thinking = {\n            type: 'enabled',\n            budget_tokens: anthropicBudgetFor(effort),\n          }\n          body.reasoning_effort = effort\n        }\n        // GPT-5 / o-series \u2014 Responses API's `reasoning_effort` directly.\n        else if (isGptOrOSeries(body.model)) {\n          body.reasoning_effort = effort\n          body.reasoning = { effort }\n          // Match opencode-dev: GPT-5 rows on opencode also pass these.\n          ;(body as any).reasoning_summary = 'auto'\n          ;(body as any).include = ['reasoning.encrypted_content']\n        }\n        // Gemini 2.5 \u2014 `thinking_config.thinking_budget`.\n        else if (isGemini25(body.model)) {\n          ;(body as any).thinking_config = {\n            include_thoughts: true,\n            thinking_budget: gemini25BudgetFor(effort),\n          }\n        }\n        // Gemini 3+ \u2014 `thinking_config.thinking_level`.\n        else if (isGemini3(body.model)) {\n          ;(body as any).thinking_config = {\n            include_thoughts: true,\n            thinking_level: effort,\n          }\n        }\n        // Grok 3 mini \u2014 `reasoning_effort` (only \"low\" or \"high\" supported\n        // per xAI docs; medium maps to high). Other grok rows have no\n        // effort knob, so skip.\n        else if (isGrokMini(body.model)) {\n          const grokEffort = effort === 'low' ? 'low' : 'high'\n          body.reasoning_effort = grokEffort\n          body.reasoning = { effort: grokEffort }\n        }\n        // Kimi k2-thinking / GLM 4.6 \u2014 vLLM chat template switch.\n        else if (needsChatTemplateArgs(body.model)) {\n          ;(body as any).chat_template_args = { enable_thinking: true }\n        }\n        // GLM 4.7 / 5.x \u2014 zai-style thinking object.\n        else if (needsZaiThinkingSwitch(body.model)) {\n          ;(body as any).thinking = { type: 'enabled', clear_thinking: false }\n        }\n        // DashScope qwen / qwq / deepseek-r1 \u2014 flat enable_thinking flag.\n        else if (needsEnableThinking(body.model)) {\n          ;(body as any).enable_thinking = true\n          // DeepSeek-R / R1 also honors Anthropic-shape thinking; emit it so\n          // either gateway path (DashScope vs DeepSeek native) triggers\n          // reasoning emission.\n          body.thinking = { type: 'enabled' } as { type: 'enabled' }\n          body.reasoning = { effort }\n        }\n        // DeepSeek V4 / reasoner / Kimi 2.5 \u2014 Anthropic-shape thinking.\n        else if (needsAnthropicShapeThinking(body.model)) {\n          body.thinking = { type: 'enabled' } as { type: 'enabled' }\n          body.reasoning = { effort }\n        }\n        // MiniMax M2 / fallback for other reasoning-capable rows \u2014 generic\n        // `reasoning.effort` is the most widely understood shape and gets\n        // ignored by upstreams that don't read it.\n        else {\n          body.reasoning = { effort }\n          body.reasoning_effort = effort\n        }\n      } else {\n        // effort === 'default' \u2014 explicitly mark thinking disabled on the\n        // families where the gateway / upstream's default is ON (DeepSeek V4,\n        // GLM 4.6, kimi-thinking). Without this they 400 on subsequent tool\n        // turns because reasoning_content was emitted on the previous turn\n        // but the replayed assistant message doesn't carry it. The fix here\n        // is symmetric with the picker chip showing \"Default\" = off.\n        if (\n          needsAnthropicShapeThinking(body.model) ||\n          needsChatTemplateArgs(body.model) ||\n          needsZaiThinkingSwitch(body.model) ||\n          needsEnableThinking(body.model)\n        ) {\n          body.thinking = { type: 'disabled' } as { type: 'disabled' }\n        }\n      }\n\n      // Compat fallback: if the lane's bridge passed thinking (via the\n      // global /effort cycle) but we found no per-model override, honor\n      // the bridge's effort hint as well. This preserves existing behavior\n      // for users who only ever used the global cycle.\n      if (effort === 'default' && ctx.isReasoning && ctx.reasoningEffort) {\n        if (isGptOrOSeries(body.model)) {\n          body.reasoning_effort = ctx.reasoningEffort\n          body.reasoning = { effort: ctx.reasoningEffort }\n        } else {\n          body.reasoning = { effort: ctx.reasoningEffort }\n        }\n      }\n    }\n\n    body.messages = sanitizeDeepSeekToolCallAdjacency(body.messages)\n    return body\n  },\n\n  schemaDropList(): Set<string> {\n    return new Set(['$schema', '$id', '$ref', '$comment'])\n  },\n\n  contextExceededMarkers(): string[] {\n    return ['context length', 'context_length_exceeded', 'prompt is too long', 'maximum context', 'token limit']\n  },\n\n  preferredEditFormat(model: string): 'apply_patch' | 'edit_block' | 'str_replace' {\n    if (isClaudeModel(model)) return 'apply_patch'\n    const m = model.toLowerCase()\n    if (m.startsWith('gpt-5') || m.startsWith('openai/gpt-5') || m.startsWith('o1') || m.startsWith('o3') || m.startsWith('o4')) {\n      return 'apply_patch'\n    }\n    if (isGeminiModel(model)) return 'apply_patch'\n    return 'edit_block'\n  },\n\n  smallFastModel(model: string): string | null {\n    // Every id below is verified against the live opencode catalog at\n    // https://opencode.ai/zen/v1/models. Returning a non-existent id 401s\n    // with ModelError; returning a `*-free` / big-pickle / gpt-5-nano row\n    // puts the small-fast call onto the gateway's allowAnonymous=true\n    // IP rate-limit bucket (1-2/day) and triggers FreeUsageLimitError \u2014\n    // never fall back to those from a paid main model.\n    const m = model.toLowerCase()\n    if (isClaudeModel(model)) return 'claude-haiku-4-5'\n    if (m.startsWith('gpt-5') || m.startsWith('openai/gpt-5')) return 'gpt-5.4-mini'\n    if (isGeminiModel(model)) return 'gemini-3-flash'\n    if (m.startsWith('glm-')) return 'glm-5'\n    if (m.startsWith('kimi-')) return 'kimi-k2.5'\n    if (m.startsWith('qwen')) return 'qwen3.5-plus'\n    if (m.startsWith('minimax-') || m.startsWith('minimax/')) return 'minimax-m2.5'\n    // DeepSeek, Grok, Nemotron, Big Pickle: opencode only hosts free\n    // (allowAnonymous=true) variants for these families. Returning null\n    // makes the caller reuse the main model for small-fast tasks rather\n    // than silently routing to a free row that burns the IP daily cap.\n    return null\n  },\n\n  cacheControlMode(model: string): 'none' | 'passthrough' | 'last-only' {\n    // OpenCode Zen routes Claude through Anthropic's native `/v1/messages`\n    // shape internally and Gemini through Google's native shape \u2014 both\n    // honor the rolling cache_control breakpoints we stamp. Strip the\n    // field for every other family.\n    if (isClaudeModel(model)) return 'last-only'\n    if (isGeminiModel(model)) return 'last-only'\n    return 'none'\n  },\n\n  buildHeaders(_apiKey: string, ctx?: HeaderContext): Record<string, string> {\n    // OpenCode Zen's gateway reads five headers. Four are stripped before\n    // the gateway forwards to the upstream (see opencode-dev\n    // packages/console/app/src/routes/zen/util/handler.ts:193-196); they're\n    // gateway-side only \u2014 affinity / rate-limit bucketing / telemetry.\n    //\n    // - User-Agent          \u2192 THE rate-limit gate. ipRateLimiter.ts:13-16\n    //                         (packages/console/app/src/routes/zen/util)\n    //                         runs `request.headers.get(name).toLowerCase()\n    //                         .includes(value)` over a `checkHeaders` map\n    //                         from Subscription.getFreeLimits(). If any\n    //                         check fails the daily quota collapses from\n    //                         `dailyRequests` to `dailyRequestsFallback`\n    //                         (typically 1/day) and the next request 429s\n    //                         with FreeUsageLimitError. The official\n    //                         client sends `opencode/<version>` (see\n    //                         opencode-dev packages/opencode/src/session/\n    //                         llm/request.ts:16,175); we mirror that exact\n    //                         shape so free-tier rows (\"*-free\", big-pickle,\n    //                         gpt-5-nano) actually get their full daily\n    //                         allowance instead of the fallback bucket.\n    // - x-opencode-session  \u2192 sticky-provider routing across turns so the\n    //                         upstream cache (Anthropic prefix, OpenAI\n    //                         Responses, DeepSeek/GLM/Kimi implicit, etc.)\n    //                         actually hits instead of cold-writing every\n    //                         request. Also feeds the gateway's stickyId\n    //                         (handler.ts:124) for per-session affinity.\n    // - x-opencode-request  \u2192 request correlation key for telemetry; the\n    //                         official client passes a user id, we reuse\n    //                         the session id as a stable surrogate.\n    // - x-opencode-project  \u2192 project grouping for telemetry; optional.\n    // - x-opencode-client   \u2192 client identifier; identifies Tau in usage\n    //                         metrics on the OpenCode side.\n    const sessionId = ctx?.sessionId ?? getProcessSessionId()\n    const headers: Record<string, string> = {\n      'User-Agent': `opencode/${OPENCODE_UA_VERSION}`,\n      'x-opencode-client': process.env.OPENCODE_CLIENT ?? `opencode-tau/${MACRO.VERSION}`,\n      'x-opencode-session': sessionId,\n      'x-opencode-request': sessionId,\n    }\n    const project = process.env.OPENCODE_PROJECT\n    if (project) headers['x-opencode-project'] = project\n    return headers\n  },\n}\n", "import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { dirname, join } from 'node:path'\n\nexport type ClineEffort = 'none' | 'low' | 'medium' | 'high'\nexport type ClineWireEffort = Exclude<ClineEffort, 'none'>\n\nexport const CLINE_EFFORT_LEVELS: readonly ClineEffort[] = [\n  'none',\n  'low',\n  'medium',\n  'high',\n]\n\nfunction storePath(): string {\n  return process.env.TAU_CLINE_THINKING_STORE\n    || join(homedir(), '.claude', 'cline-thinking.json')\n}\n\nlet _loadedPath: string | null = null\nlet _cache: Record<string, ClineEffort> = {}\n\nfunction normalizeStoreKey(model: string): string {\n  return model.trim().toLowerCase()\n}\n\nfunction load(): void {\n  const path = storePath()\n  if (_loadedPath === path) return\n  _loadedPath = path\n  _cache = {}\n\n  try {\n    if (!existsSync(path)) return\n    const raw = readFileSync(path, 'utf8')\n    const parsed = JSON.parse(raw) as unknown\n    if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return\n\n    const next: Record<string, ClineEffort> = {}\n    for (const [key, value] of Object.entries(parsed as Record<string, unknown>)) {\n      if (\n        typeof value === 'string'\n        && (CLINE_EFFORT_LEVELS as readonly string[]).includes(value)\n      ) {\n        next[key.toLowerCase()] = value as ClineEffort\n      }\n    }\n    _cache = next\n  } catch {\n    // Persistence is best-effort. A stale/corrupt file should not break the picker.\n  }\n}\n\nfunction save(): void {\n  const path = storePath()\n  try {\n    const dir = dirname(path)\n    if (!existsSync(dir)) mkdirSync(dir, { recursive: true })\n    writeFileSync(path, JSON.stringify(_cache, null, 2), 'utf8')\n  } catch {\n    // Keep the in-memory value for this session even if disk persistence fails.\n  }\n}\n\nexport function isClineThinkingModel(model: string): boolean {\n  const m = model.trim().toLowerCase().replace(/[._]/g, '-')\n\n  if (!m) return false\n  if (m.includes('thinking') || m.includes('reasoning')) return true\n\n  // Cline's model catalog should be authoritative when it exposes\n  // supportsReasoning. These families are the conservative fallback for\n  // fallback catalogs and older API payloads.\n  if (m.includes('deepseek-r1') || m.includes('deepseek/deepseek-r')) return true\n  if (m.includes('deepseek-v4') || m.includes('deepseek-reasoner')) return true\n  if (m.includes('qwq') || m.includes('qwen3') || m.includes('qwen-3')) return true\n  if (m.includes('glm-5') || m.includes('glm-4-7') || m.includes('glm-4-6')) return true\n  if (m.includes('kimi-k2-thinking') || m.includes('kimi-k2-5') || m.includes('kimi-k2p5')) return true\n  if (m.includes('minimax-m2')) return true\n  if (m.includes('grok-3') || m.includes('grok-4') || m.includes('xai/grok-3') || m.includes('xai/grok-4')) return true\n  if (m.includes('gemini-2-5') || m.includes('gemini-3')) return true\n  if (m.includes('claude-sonnet-4') || m.includes('claude-opus-4') || m.includes('claude-haiku-4')) return true\n  if (m.includes('gpt-5') || m.includes('codex')) return true\n  if (m.includes('/o1') || m.includes('/o3') || m.includes('/o4')) return true\n  if (m.startsWith('o1') || m.startsWith('o3') || m.startsWith('o4')) return true\n\n  return false\n}\n\nexport function supportsClineThinkingSelection(\n  model: string,\n  tags?: readonly string[],\n): boolean {\n  if (tags?.some(tag => tag === 'thinking' || tag === 'reasoning')) return true\n  return isClineThinkingModel(model)\n}\n\nexport function getClineEffort(model: string): ClineEffort {\n  load()\n  return _cache[normalizeStoreKey(model)] ?? 'none'\n}\n\nexport function setClineEffort(model: string, effort: ClineEffort): void {\n  load()\n  const key = normalizeStoreKey(model)\n  if (effort === 'none') {\n    delete _cache[key]\n  } else {\n    _cache[key] = effort\n  }\n  save()\n}\n\nexport function cycleClineEffort(\n  model: string,\n  direction: 'left' | 'right',\n): ClineEffort {\n  const current = getClineEffort(model)\n  const idx = CLINE_EFFORT_LEVELS.indexOf(current)\n  const len = CLINE_EFFORT_LEVELS.length\n  const next =\n    direction === 'right'\n      ? CLINE_EFFORT_LEVELS[(idx + 1) % len]!\n      : CLINE_EFFORT_LEVELS[(idx - 1 + len) % len]!\n  setClineEffort(model, next)\n  return next\n}\n\nexport function getClineEffortLabel(effort: ClineEffort): string {\n  return effort === 'none'\n    ? 'Off'\n    : effort.charAt(0).toUpperCase() + effort.slice(1)\n}\n\nexport function getClineRequestEffort(model: string): ClineWireEffort | null {\n  const effort = getClineEffort(model)\n  return effort === 'none' ? null : effort\n}\n\nexport function applyClineReasoningToRequest(\n  body: Record<string, unknown>,\n  effort: ClineWireEffort | null,\n): void {\n  if (!effort) {\n    body.reasoning = { enabled: false }\n    delete body.reasoning_effort\n    return\n  }\n\n  body.reasoning = { enabled: true, effort }\n  body.reasoning_effort = effort\n}\n\nexport function _resetClineThinkingForTests(\n  cache: Record<string, ClineEffort> = {},\n): void {\n  _loadedPath = storePath()\n  _cache = { ...cache }\n}\n", "/**\n * Cline transformer.\n *\n * Cline exposes an OpenAI-compatible chat completions endpoint at\n * api.cline.bot. Authentication is via the OAuth access token as a\n * standard Bearer header (the lane writes that; we don't override here).\n *\n * Extra request headers: `workos:<token>` identifies the OAuth session,\n * `X-Title` / `HTTP-Referer` show up in Cline's analytics so free-tier\n * usage attributes back to Tau (matching the reference executor at\n * reference/9router-master/open-sse/executors/cline.js).\n */\n\nimport type { Transformer, TransformContext } from './base.js'\nimport type { OpenAIChatRequest } from './shared_types.js'\nimport {\n  applyClineReasoningToRequest,\n  getClineRequestEffort,\n  isClineThinkingModel,\n} from '../../../utils/model/clineThinking.js'\n\nexport const clineTransformer: Transformer = {\n  id: 'cline',\n  displayName: 'Cline',\n  defaultBaseUrl: 'https://api.cline.bot/v1',\n\n  supportsStrictMode: () => false,\n\n  clampMaxTokens(requested: number): number {\n    return requested\n  },\n\n  buildHeaders(apiKey: string): Record<string, string> {\n    return {\n      // Cline sends the OAuth token both as Bearer AND as a `workos:` prefix\n      // header. The Bearer comes from the lane's default path; we add\n      // workos here so the backend links the request to the OAuth session.\n      workos: apiKey ? `workos:${apiKey}` : '',\n      'HTTP-Referer': 'https://github.com/AbdoKnbGit/tau',\n      'X-Title': 'Tau',\n    }\n  },\n\n  transformRequest(body: OpenAIChatRequest, _ctx: TransformContext): OpenAIChatRequest {\n    if (isClineThinkingModel(body.model)) {\n      applyClineReasoningToRequest(\n        body as unknown as Record<string, unknown>,\n        getClineRequestEffort(body.model),\n      )\n    }\n    return body\n  },\n\n  schemaDropList(): Set<string> {\n    return new Set(['$schema', '$id', '$ref', '$comment'])\n  },\n\n  contextExceededMarkers(): string[] {\n    return ['context length', 'context_length_exceeded', 'prompt is too long', 'too long']\n  },\n\n  preferredEditFormat(model: string): 'apply_patch' | 'edit_block' | 'str_replace' {\n    const m = model.toLowerCase()\n    // Cline serves frontier Claude/GPT models; keep apply_patch for those.\n    if (m.includes('claude-') || m.includes('anthropic/')) return 'apply_patch'\n    if (m.startsWith('gpt-5') || m.startsWith('o1') || m.startsWith('o3')) return 'apply_patch'\n    return 'edit_block'\n  },\n\n  smallFastModel(_model: string): string | null {\n    return null\n  },\n\n  cacheControlMode(model: string): 'none' | 'passthrough' | 'last-only' {\n    const m = model.toLowerCase()\n    if (m.includes('claude-') || m.includes('anthropic/')) return 'last-only'\n    return 'none'\n  },\n\n  // Curated catalog mirrors reference/9router-master/open-sse/config/providerModels.js\n  // (the `cl` block). Cline's gateway uses OpenRouter-style namespaced ids.\n  staticCatalog() {\n    return [\n      { id: 'anthropic/claude-opus-4.7', name: 'Claude Opus 4.7' },\n      { id: 'anthropic/claude-sonnet-4.6', name: 'Claude Sonnet 4.6' },\n      { id: 'anthropic/claude-opus-4.6', name: 'Claude Opus 4.6' },\n      { id: 'openai/gpt-5.3-codex', name: 'GPT-5.3 Codex' },\n      { id: 'openai/gpt-5.4', name: 'GPT-5.4' },\n      { id: 'google/gemini-3.1-pro-preview', name: 'Gemini 3.1 Pro Preview' },\n      { id: 'google/gemini-3.1-flash-lite-preview', name: 'Gemini 3.1 Flash Lite Preview' },\n      { id: 'kwaipilot/kat-coder-pro', name: 'KAT Coder Pro' },\n    ]\n  },\n}\n", "/**\n * iFlow transformer.\n *\n * iFlow exposes OpenAI-compatible chat completions at\n * https://apis.iflow.cn/v1. The upstream takes an `apiKey` issued by\n * iFlow's OAuth userinfo endpoint (not the OAuth access_token itself),\n * which the provider layer stores at `meta.apiKey` and surfaces via\n * `getIFlowApiKey()`. Headers below mirror the reference executor at\n * reference/9router-master/open-sse/executors/iflow.js.\n */\n\nimport type { Transformer, TransformContext } from './base.js'\nimport type { OpenAIChatRequest } from './shared_types.js'\n\nexport const iflowTransformer: Transformer = {\n  id: 'iflow',\n  displayName: 'iFlow',\n  defaultBaseUrl: 'https://apis.iflow.cn/v1',\n\n  supportsStrictMode: () => false,\n\n  clampMaxTokens(requested: number): number {\n    return requested\n  },\n\n  buildHeaders(_apiKey: string): Record<string, string> {\n    // Bearer is added by the generic header path. Extras identify the\n    // session as a Tau IDE request (matches iflow's expected\n    // User-Agent shape for chat endpoints).\n    return {\n      'User-Agent': 'Tau/0.6.0 (+https://github.com/AbdoKnbGit/tau)',\n      'X-Source': 'tau',\n      'X-Title': 'Tau',\n    }\n  },\n\n  transformRequest(body: OpenAIChatRequest, _ctx: TransformContext): OpenAIChatRequest {\n    return body\n  },\n\n  schemaDropList(): Set<string> {\n    return new Set(['$schema', '$id', '$ref', '$comment'])\n  },\n\n  contextExceededMarkers(): string[] {\n    return ['context length', 'context_length_exceeded', 'prompt is too long', 'too long']\n  },\n\n  preferredEditFormat(model: string): 'apply_patch' | 'edit_block' | 'str_replace' {\n    const m = model.toLowerCase()\n    // iFlow's Qwen-Coder / Kimi / DeepSeek lines land here \u2014 SEARCH/REPLACE\n    // works reliably across that set. Frontier Claude/GPT get apply_patch.\n    if (m.includes('claude-') || m.startsWith('gpt-5') || m.startsWith('o1') || m.startsWith('o3')) {\n      return 'apply_patch'\n    }\n    return 'edit_block'\n  },\n\n  smallFastModel(_model: string): string | null {\n    return null\n  },\n\n  cacheControlMode(model: string): 'none' | 'passthrough' | 'last-only' {\n    const m = model.toLowerCase()\n    if (m.includes('claude-')) return 'last-only'\n    return 'none'\n  },\n\n  // Curated catalog mirrors reference/9router-master/open-sse/config/providerModels.js\n  // (the `if` block). iFlow uses bare model ids \u2014 no provider namespace prefix.\n  staticCatalog() {\n    return [\n      { id: 'qwen3-coder-plus', name: 'Qwen3 Coder Plus' },\n      { id: 'qwen3-max', name: 'Qwen3 Max' },\n      { id: 'qwen3-vl-plus', name: 'Qwen3 VL Plus' },\n      { id: 'qwen3-max-preview', name: 'Qwen3 Max Preview' },\n      { id: 'qwen3-235b', name: 'Qwen3 235B A22B' },\n      { id: 'qwen3-235b-a22b-instruct', name: 'Qwen3 235B A22B Instruct' },\n      { id: 'qwen3-235b-a22b-thinking-2507', name: 'Qwen3 235B A22B Thinking' },\n      { id: 'qwen3-32b', name: 'Qwen3 32B' },\n      { id: 'kimi-k2', name: 'Kimi K2' },\n      { id: 'deepseek-v3.2', name: 'DeepSeek V3.2 Exp' },\n      { id: 'deepseek-v3.1', name: 'DeepSeek V3.1 Terminus' },\n      { id: 'deepseek-v3', name: 'DeepSeek V3 671B' },\n      { id: 'deepseek-r1', name: 'DeepSeek R1' },\n      { id: 'glm-4.7', name: 'GLM 4.7' },\n      { id: 'iflow-rome-30ba3b', name: 'iFlow ROME' },\n    ]\n  },\n}\n", "/**\n * KiloCode transformer.\n *\n * KiloCode exposes an OpenAI-compatible chat completions endpoint at\n * https://kilocode.ai/api/openrouter/v1 (KiloCode routes through an\n * internal OpenRouter-style aggregator, so many of the same model IDs\n * are available). Auth is the OAuth bearer token; extra headers carry\n * the organization id and usage attribution \u2014 see the reference executor\n * at reference/9router-master/open-sse/executors/kiloCode.js.\n */\n\nimport type { Transformer, TransformContext } from './base.js'\nimport type { OpenAIChatRequest } from './shared_types.js'\nimport { getKiloCodeOrgId } from '../../../services/api/auth/oauth_services.js'\n\nexport const kilocodeTransformer: Transformer = {\n  id: 'kilocode',\n  displayName: 'KiloCode',\n  defaultBaseUrl: 'https://kilocode.ai/api/openrouter/v1',\n\n  supportsStrictMode: () => false,\n\n  clampMaxTokens(requested: number): number {\n    return requested > 8192 ? 8192 : requested\n  },\n\n  buildHeaders(_apiKey: string): Record<string, string> {\n    const orgId = getKiloCodeOrgId()\n    const headers: Record<string, string> = {\n      'HTTP-Referer': 'https://github.com/AbdoKnbGit/tau',\n      'X-Title': 'Tau',\n      'X-Kilocode-Version': '0.4.0',\n    }\n    if (orgId) headers['X-Kilocode-OrganizationID'] = orgId\n    return headers\n  },\n\n  transformRequest(body: OpenAIChatRequest, _ctx: TransformContext): OpenAIChatRequest {\n    return body\n  },\n\n  schemaDropList(): Set<string> {\n    return new Set(['$schema', '$id', '$ref', '$comment'])\n  },\n\n  contextExceededMarkers(): string[] {\n    return ['context length', 'context_length_exceeded', 'prompt is too long', 'too long']\n  },\n\n  preferredEditFormat(model: string): 'apply_patch' | 'edit_block' | 'str_replace' {\n    const m = model.toLowerCase()\n    // KiloCode aggregates a broad catalog \u2014 frontier models keep apply_patch,\n    // everything else uses SEARCH/REPLACE for safety.\n    if (m.includes('claude-') || m.includes('anthropic/')) return 'apply_patch'\n    if (m.startsWith('gpt-5') || m.startsWith('o1') || m.startsWith('o3')) return 'apply_patch'\n    if (m.includes('gemini-3') || m.includes('gemini-2.5')) return 'apply_patch'\n    return 'edit_block'\n  },\n\n  smallFastModel(model: string): string | null {\n    const m = model.toLowerCase()\n    if (m.startsWith('anthropic/')) return 'anthropic/claude-haiku-4-5'\n    if (m.startsWith('openai/')) return 'openai/gpt-4o-mini'\n    if (m.startsWith('google/')) return 'google/gemini-2.5-flash-lite'\n    return null\n  },\n\n  cacheControlMode(model: string): 'none' | 'passthrough' | 'last-only' {\n    const m = model.toLowerCase()\n    if (m.includes('claude-') || m.includes('anthropic/')) return 'last-only'\n    if (m.includes('google/gemini')) return 'last-only'\n    return 'none'\n  },\n\n  // Curated catalog mirrors reference/9router-master/open-sse/config/providerModels.js\n  // (the `kc` block). KiloCode uses OpenRouter-style namespaced ids since\n  // the gateway routes through an OpenRouter-style aggregator.\n  staticCatalog() {\n    return [\n      { id: 'anthropic/claude-sonnet-4-20250514', name: 'Claude Sonnet 4' },\n      { id: 'anthropic/claude-opus-4-20250514', name: 'Claude Opus 4' },\n      { id: 'google/gemini-2.5-pro', name: 'Gemini 2.5 Pro' },\n      { id: 'google/gemini-2.5-flash', name: 'Gemini 2.5 Flash' },\n      { id: 'openai/gpt-4.1', name: 'GPT-4.1' },\n      { id: 'openai/o3', name: 'o3' },\n      { id: 'deepseek/deepseek-chat', name: 'DeepSeek Chat' },\n      { id: 'deepseek/deepseek-reasoner', name: 'DeepSeek Reasoner' },\n    ]\n  },\n}\n", "import { getStoredCopilotPlanInfo } from '../../services/api/auth/oauth_services.js'\r\n\r\nexport interface CopilotErrorPayload {\r\n  message?: string\r\n  code?: string\r\n  param?: string\r\n  type?: string\r\n}\r\n\r\nconst COPILOT_FREE_SKUS = new Set([\r\n  'free_limited_copilot',\r\n])\r\n\r\n// Keep this aligned with the curated Copilot catalog in the compat lane.\r\n// These are the entries from that catalog that GitHub currently marks as\r\n// available on Copilot Free.\r\nconst COPILOT_FREE_ALLOWED_MODELS = new Set([\r\n  'claude-haiku-4.5',\r\n  'gpt-4.1',\r\n  'gpt-5-mini',\r\n])\r\n\r\nexport function isCopilotFreePlan(): boolean {\r\n  const sku = getStoredCopilotPlanInfo()?.sku?.toLowerCase()\r\n  if (!sku) return false\r\n  return COPILOT_FREE_SKUS.has(sku) || sku.includes('free')\r\n}\r\n\r\nexport function isCopilotModelAllowedForCurrentPlan(model: string): boolean {\r\n  if (!isCopilotFreePlan()) return true\r\n  return COPILOT_FREE_ALLOWED_MODELS.has(model.trim().toLowerCase())\r\n}\r\n\r\nexport function getCopilotSuggestedModelsForCurrentPlan(): string[] {\r\n  if (isCopilotFreePlan()) {\r\n    return ['gpt-5-mini', 'gpt-4.1', 'claude-haiku-4.5']\r\n  }\r\n  return ['gpt-5-mini', 'gpt-4.1']\r\n}\r\n\r\nexport function formatCopilotModelUnsupportedMessage(model: string): string {\r\n  const planLabel = isCopilotFreePlan()\r\n    ? 'your GitHub Copilot Free account'\r\n    : 'your GitHub Copilot account'\r\n  const suggestions = getCopilotSuggestedModelsForCurrentPlan()\r\n    .map(id => `'${id}'`)\r\n    .join(', ')\r\n\r\n  return (\r\n    `Model '${model}' is not available on ${planLabel}. ` +\r\n    `Try ${suggestions} instead.`\r\n  )\r\n}\r\n\r\nexport function formatCopilotQuotaExceededMessage(): string {\r\n  const suggestions = getCopilotSuggestedModelsForCurrentPlan()\r\n    .map(id => `'${id}'`)\r\n    .join(', ')\r\n\r\n  return (\r\n    'GitHub Copilot rejected this request because the current account has no ' +\r\n    `quota left for this model. Try ${suggestions} or check GitHub Copilot usage/billing.`\r\n  )\r\n}\r\n\r\nexport function parseCopilotErrorPayload(raw: unknown): CopilotErrorPayload | null {\r\n  if (!raw) return null\r\n\r\n  if (typeof raw === 'string') {\r\n    try {\r\n      return parseCopilotErrorPayload(JSON.parse(raw))\r\n    } catch {\r\n      const lowered = raw.toLowerCase()\r\n      if (\r\n        lowered.includes('model_not_supported')\r\n        || lowered.includes('requested model is not supported')\r\n      ) {\r\n        return { code: 'model_not_supported', message: raw }\r\n      }\r\n      if (lowered.includes('quota_exceeded') || lowered.includes('you have no quota')) {\r\n        return { code: 'quota_exceeded', message: raw }\r\n      }\r\n      return null\r\n    }\r\n  }\r\n\r\n  if (typeof raw !== 'object') return null\r\n\r\n  const record = raw as Record<string, unknown>\r\n  const nested = (\r\n    record.error && typeof record.error === 'object'\r\n      ? record.error as Record<string, unknown>\r\n      : record\r\n  )\r\n\r\n  return {\r\n    message: typeof nested.message === 'string' ? nested.message : undefined,\r\n    code: typeof nested.code === 'string' ? nested.code : undefined,\r\n    param: typeof nested.param === 'string' ? nested.param : undefined,\r\n    type: typeof nested.type === 'string' ? nested.type : undefined,\r\n  }\r\n}\r\n\r\nexport function isCopilotModelUnsupportedError(raw: unknown): boolean {\r\n  const parsed = parseCopilotErrorPayload(raw)\r\n  if (!parsed) return false\r\n  return (\r\n    parsed.code === 'model_not_supported'\r\n    || /requested model is not supported/i.test(parsed.message ?? '')\r\n  )\r\n}\r\n\r\nexport function isCopilotQuotaExceededError(raw: unknown): boolean {\r\n  const parsed = parseCopilotErrorPayload(raw)\r\n  if (!parsed) return false\r\n  return (\r\n    parsed.code === 'quota_exceeded'\r\n    || /you have no quota/i.test(parsed.message ?? '')\r\n  )\r\n}\r\n", "/**\r\n * GitHub Copilot transformer.\r\n *\r\n * Copilot exposes an OpenAI-compatible chat completions endpoint at\r\n * https://api.githubcopilot.com/chat/completions. The wire format is\r\n * canonical OpenAI Chat Completions; the quirks are auth (the bearer is\r\n * the Copilot internal token, NOT the GitHub OAuth access token \u2014 see\r\n * oauth_services.ts::completeCopilotOAuth) and a handful of editor-shaped\r\n * headers the gateway uses to gate requests.\r\n *\r\n * Reference: reference/9router-master/open-sse/executors/github.js.\r\n */\r\n\r\nimport type { HeaderContext, Transformer, TransformContext } from './base.js'\nimport type { OpenAIChatMessage, OpenAIChatRequest } from './shared_types.js'\nimport { isCopilotModelAllowedForCurrentPlan } from '../../../utils/model/copilotAccount.js'\r\n\r\n// Headers below mirror the reference executor exactly. The chat gateway\r\n// gates non-VSCode UAs hard, so don't tweak these unless GitHub bumps\r\n// the editor-version expected on api.githubcopilot.com.\r\nconst COPILOT_INTEGRATION_ID = 'vscode-chat'\r\nconst COPILOT_VSCODE_VERSION = '1.110.0'\r\nconst COPILOT_CHAT_VERSION = '0.38.0'\r\nconst COPILOT_USER_AGENT = `GitHubCopilotChat/${COPILOT_CHAT_VERSION}`\r\nconst COPILOT_API_VERSION = '2025-04-01'\r\nconst COPILOT_INTERNAL_ROUTER_PREFIX = 'accounts/msft/routers/'\r\nconst COPILOT_SUPPORTED_MODELS = new Set<string>([\r\n  'gpt-4.1',\r\n  'gpt-5-mini',\r\n  'gpt-5.2',\r\n  'gpt-5.2-codex',\r\n  'gpt-5.3-codex',\r\n  'gpt-5.4',\n  'gpt-5.4-mini',\n  'gpt-5.5',\n  'claude-haiku-4.5',\n  'claude-sonnet-4',\r\n  'claude-sonnet-4.5',\r\n  'claude-sonnet-4.6',\r\n  'claude-opus-4.5',\r\n  'claude-opus-4.6',\r\n  'claude-opus-4.7',\r\n])\r\n\r\nconst COPILOT_RETIRED_MODEL_PATTERNS = [\r\n  /^claude-opus-4\\.1$/i,\r\n  /^claude-opus-4$/i,\r\n  /^claude-sonnet-3\\.5$/i,\r\n  /^claude-sonnet-3\\.7(?:-thinking)?$/i,\r\n  /^gpt-5$/i,\r\n  /^gpt-5-codex$/i,\r\n  /^gpt-5\\.1(?:-codex(?:-mini|-max)?)?$/i,\r\n  /^o1-mini$/i,\r\n  /^o3(?:-mini)?$/i,\r\n  /^o4-mini$/i,\r\n]\r\n\r\nconst COPILOT_NAME_OVERRIDES: Record<string, string> = {\r\n  'claude-haiku-4.5': 'Claude Haiku 4.5',\r\n  'claude-opus-4.5': 'Claude Opus 4.5',\r\n  'claude-opus-4.6': 'Claude Opus 4.6',\r\n  'claude-opus-4.7': 'Claude Opus 4.7',\r\n  'claude-sonnet-4': 'Claude Sonnet 4',\r\n  'claude-sonnet-4.5': 'Claude Sonnet 4.5',\r\n  'claude-sonnet-4.6': 'Claude Sonnet 4.6',\r\n  'gpt-4.1': 'GPT-4.1',\r\n  'gpt-5-mini': 'GPT-5 mini',\r\n  'gpt-5.2': 'GPT-5.2',\r\n  'gpt-5.2-codex': 'GPT-5.2-Codex',\r\n  'gpt-5.3-codex': 'GPT-5.3-Codex',\r\n  'gpt-5.4': 'GPT-5.4',\r\n  'gpt-5.4-mini': 'GPT-5.4 mini',\r\n}\r\n\r\nfunction _requestId(): string {\r\n  // crypto.randomUUID exists on Node 16+; fall back for older runtimes.\r\n  const c = (globalThis as { crypto?: { randomUUID?: () => string } }).crypto\r\n  return c?.randomUUID?.() ?? `${Date.now()}-${Math.random().toString(36).slice(2)}`\r\n}\r\n\r\nfunction _requiresMaxCompletionTokens(model: string): boolean {\r\n  // gpt-5*, o1*, o3*, o4* reject `max_tokens`; they want max_completion_tokens.\r\n  return /gpt-5|o[134]-/i.test(model)\r\n}\r\n\r\nfunction _supportsTemperature(model: string): boolean {\r\n  // gpt-5.4 (and any future variant matching the pattern) rejects temperature.\r\n  return !/gpt-5\\.4/i.test(model)\r\n}\r\n\r\nfunction _isCopilotSnapshotModel(model: string): boolean {\r\n  return /-\\d{4}-\\d{2}-\\d{2}$/i.test(model) || /-\\d{4}$/i.test(model)\r\n}\r\n\r\nfunction _isRetiredCopilotModel(model: string): boolean {\r\n  return COPILOT_RETIRED_MODEL_PATTERNS.some(pattern => pattern.test(model))\r\n}\r\n\r\nfunction _isChatCapableCopilotModel(model: string): boolean {\r\n  const m = model.toLowerCase()\r\n  if (m.startsWith(COPILOT_INTERNAL_ROUTER_PREFIX)) return false\r\n  if (m.startsWith('text-embedding-')) return false\r\n  if (m.startsWith('whisper-') || m.startsWith('tts-') || m.startsWith('omni-moderation-')) return false\r\n  if (_isCopilotSnapshotModel(m)) return false\r\n  if (_isRetiredCopilotModel(m)) return false\r\n  return COPILOT_SUPPORTED_MODELS.has(m)\r\n}\r\n\r\nfunction _isCurrentPlanEligibleCopilotModel(model: string): boolean {\n  return isCopilotModelAllowedForCurrentPlan(model)\n}\n\ntype PendingToolCalls = {\n  assistantIndex: number\n  pendingIds: Set<string>\n  answeredIds: Set<string>\n}\n\nfunction _finalizePendingToolCalls(messages: OpenAIChatMessage[], pending: PendingToolCalls): void {\n  const assistant = messages[pending.assistantIndex]\n  if (!assistant?.tool_calls?.length) return\n\n  const seen = new Set<string>()\n  const keptToolCalls = assistant.tool_calls.filter(call => {\n    if (!pending.answeredIds.has(call.id) || seen.has(call.id)) return false\n    seen.add(call.id)\n    return true\n  })\n\n  if (keptToolCalls.length > 0) {\n    assistant.tool_calls = keptToolCalls\n  } else {\n    delete assistant.tool_calls\n    if (assistant.content == null) assistant.content = ''\n  }\n}\n\nfunction _dedupeToolCalls(message: OpenAIChatMessage): OpenAIChatMessage {\n  if (!message.tool_calls?.length) return message\n\n  const seen = new Set<string>()\n  const toolCalls = message.tool_calls.filter(call => {\n    if (!call.id || seen.has(call.id)) return false\n    seen.add(call.id)\n    return true\n  })\n\n  if (toolCalls.length > 0) {\n    return { ...message, tool_calls: toolCalls }\n  }\n\n  const next = { ...message }\n  delete next.tool_calls\n  if (next.content == null) next.content = ''\n  return next\n}\n\n// Copilot uses OpenAI's strict adjacency rule: assistant tool_calls must be\n// immediately followed by tool messages for every id. Interrupted or compacted\n// histories can replay unresolved tool calls, so trim only the invalid tail.\nfunction _sanitizeToolCallAdjacency(messages: OpenAIChatMessage[]): OpenAIChatMessage[] {\n  const out: OpenAIChatMessage[] = []\n  let pending: PendingToolCalls | null = null\n\n  for (const message of messages) {\n    if (message.role === 'tool') {\n      const toolCallId = message.tool_call_id\n      if (pending && toolCallId && pending.pendingIds.has(toolCallId)) {\n        out.push(message.content == null ? { ...message, content: '' } : message)\n        pending.pendingIds.delete(toolCallId)\n        pending.answeredIds.add(toolCallId)\n        if (pending.pendingIds.size === 0) pending = null\n      }\n      continue\n    }\n\n    if (pending) {\n      _finalizePendingToolCalls(out, pending)\n      pending = null\n    }\n\n    if (message.role === 'assistant' && message.tool_calls?.length) {\n      const assistant = _dedupeToolCalls(message)\n      out.push(assistant)\n\n      if (assistant.tool_calls?.length) {\n        pending = {\n          assistantIndex: out.length - 1,\n          pendingIds: new Set(assistant.tool_calls.map(call => call.id)),\n          answeredIds: new Set<string>(),\n        }\n      }\n      continue\n    }\n\n    out.push(message)\n  }\n\n  if (pending) _finalizePendingToolCalls(out, pending)\n  return out\n}\n\nfunction _copilotDisplayName(id: string): string {\n  const lowered = id.toLowerCase()\n  const override = COPILOT_NAME_OVERRIDES[lowered]\n  if (override) return override\n  return id\n}\r\n\r\nexport const copilotTransformer: Transformer = {\r\n  id: 'copilot',\r\n  displayName: 'GitHub Copilot',\r\n  defaultBaseUrl: 'https://api.githubcopilot.com',\r\n\r\n  supportsStrictMode: () => false,\r\n\r\n  clampMaxTokens(requested: number): number {\r\n    return requested\r\n  },\r\n\r\n  buildHeaders(_apiKey: string, ctx?: HeaderContext): Record<string, string> {\n    const headers: Record<string, string> = {\n      'copilot-integration-id': COPILOT_INTEGRATION_ID,\n      'editor-version': `vscode/${COPILOT_VSCODE_VERSION}`,\n      'editor-plugin-version': `copilot-chat/${COPILOT_CHAT_VERSION}`,\n      'user-agent': COPILOT_USER_AGENT,\n      'openai-intent': 'conversation-panel',\n      'x-github-api-version': COPILOT_API_VERSION,\r\n      'x-vscode-user-agent-library-version': 'electron-fetch',\r\n      'X-Initiator': 'user',\n      'x-request-id': _requestId(),\n    }\n    if (ctx?.sessionId) {\n      headers.session_id = ctx.sessionId\n      headers['x-client-request-id'] = ctx.sessionId\n      headers['x-session-affinity'] = ctx.sessionId\n    }\n    return headers\n  },\n\n  transformRequest(body: OpenAIChatRequest, ctx: TransformContext): OpenAIChatRequest {\n    if (ctx.sessionId) {\n      body.prompt_cache_key = ctx.sessionId\n    }\n    if (_requiresMaxCompletionTokens(ctx.model) && body.max_tokens !== undefined) {\n      const v = body.max_tokens\n      delete body.max_tokens\n      ;(body as unknown as Record<string, unknown>).max_completion_tokens = v\r\n    }\r\n    if (!_supportsTemperature(ctx.model) && body.temperature !== undefined) {\r\n      delete body.temperature\r\n    }\r\n    // Chat-completions endpoint rejects thinking/reasoning_effort. The\r\n    // /responses route handles those, but we don't ship a /responses path\r\n    // in v0.4.1 \u2014 the few Codex-class models that need it can be added later.\r\n    delete body.thinking\n    delete body.reasoning_effort\n    delete body.reasoning\n    body.messages = _sanitizeToolCallAdjacency(body.messages)\n    return body\n  },\n\r\n  schemaDropList(): Set<string> {\r\n    return new Set(['$schema', '$id', '$ref', '$comment'])\r\n  },\r\n\r\n  contextExceededMarkers(): string[] {\r\n    return ['context length', 'context_length_exceeded', 'prompt is too long', 'too long']\r\n  },\r\n\r\n  preferredEditFormat(model: string): 'apply_patch' | 'edit_block' | 'str_replace' {\r\n    const m = model.toLowerCase()\r\n    if (m.includes('claude-')) return 'apply_patch'\r\n    if (m.startsWith('gpt-5') || m.startsWith('o1') || m.startsWith('o3')) return 'apply_patch'\r\n    if (m.includes('gemini-3') || m.includes('gemini-2.5')) return 'apply_patch'\r\n    return 'edit_block'\r\n  },\r\n\r\n  smallFastModel(_model: string): string | null {\r\n    return 'gpt-5-mini'\r\n  },\r\n\r\n  cacheControlMode(model: string): 'none' | 'passthrough' | 'last-only' {\r\n    const m = model.toLowerCase()\r\n    if (m.includes('claude-')) return 'last-only'\r\n    return 'none'\r\n  },\r\n\r\n  // Copilot's supported model set changes often. Prefer the live `/models`\r\n  // response when possible, then fall back to a docs-aligned catalog.\r\n  preferLiveModelCatalog(): boolean {\r\n    return true\r\n  },\r\n\r\n  filterModelCatalog(models: Array<{ id: string; name?: string }>): Array<{ id: string; name?: string }> {\r\n    const deduped = new Map<string, { id: string; name?: string }>()\r\n    for (const model of models) {\r\n      if (!_isChatCapableCopilotModel(model.id)) continue\r\n      if (!_isCurrentPlanEligibleCopilotModel(model.id)) continue\r\n      deduped.set(model.id, {\r\n        id: model.id,\r\n        name: _copilotDisplayName(model.id),\r\n      })\r\n    }\r\n    return Array.from(deduped.values())\r\n  },\r\n\r\n  // Fallback catalog aligned with GitHub's supported-model docs as of\r\n  // April 22, 2026. IDs stay on the Copilot/openai-compat path; OpenAI's\r\n  // native Codex lane remains separate.\r\n  staticCatalog() {\r\n    return [\r\n      // OpenAI\r\n      { id: 'gpt-4.1', name: 'GPT-4.1' },\r\n      { id: 'gpt-5-mini', name: 'GPT-5 mini' },\r\n      { id: 'gpt-5.2', name: 'GPT-5.2' },\r\n      { id: 'gpt-5.2-codex', name: 'GPT-5.2-Codex' },\r\n      { id: 'gpt-5.3-codex', name: 'GPT-5.3-Codex' },\r\n      { id: 'gpt-5.4', name: 'GPT-5.4' },\r\n      { id: 'gpt-5.4-mini', name: 'GPT-5.4 mini' },\r\n      // Anthropic\r\n      { id: 'claude-haiku-4.5', name: 'Claude Haiku 4.5' },\r\n      { id: 'claude-opus-4.5', name: 'Claude Opus 4.5' },\r\n      { id: 'claude-opus-4.6', name: 'Claude Opus 4.6' },\r\n      { id: 'claude-opus-4.7', name: 'Claude Opus 4.7' },\r\n      { id: 'claude-sonnet-4', name: 'Claude Sonnet 4' },\r\n      { id: 'claude-sonnet-4.5', name: 'Claude Sonnet 4.5' },\r\n      { id: 'claude-sonnet-4.6', name: 'Claude Sonnet 4.6' },\r\n    ].filter(model => _isCurrentPlanEligibleCopilotModel(model.id))\r\n  },\r\n}\r\n", "/**\n * Generic OpenAI-compatible transformer.\n *\n * Fallback for xAI, Together, Fireworks, DeepInfra, Cerebras, and\n * anything else that speaks OpenAI Chat Completions without a\n * claudex-specific transformer. Conservative defaults that work\n * across the long tail; users can point `baseUrl` at any such\n * endpoint and get a working lane entry.\n */\n\nimport type { Transformer, TransformContext } from './base.js'\nimport type { OpenAIChatRequest } from './shared_types.js'\n\nexport const genericTransformer: Transformer = {\n  id: 'generic',\n  displayName: 'OpenAI-compatible (generic)',\n  defaultBaseUrl: 'https://api.openai.com/v1',\n\n  supportsStrictMode: () => false,\n\n  clampMaxTokens(requested: number): number {\n    return requested\n  },\n\n  transformRequest(body: OpenAIChatRequest, _ctx: TransformContext): OpenAIChatRequest {\n    return body\n  },\n\n  schemaDropList(): Set<string> {\n    // Conservative drop list \u2014 pattern + format + default can trip\n    // stricter validators on long-tail providers.\n    return new Set(['$schema', '$id', '$ref', '$comment', 'strict', 'pattern', 'format', 'default'])\n  },\n\n  contextExceededMarkers(): string[] {\n    return ['context length', 'context_length_exceeded', 'prompt is too long', 'token limit', 'too long']\n  },\n\n  preferredEditFormat(_model: string): 'apply_patch' | 'edit_block' | 'str_replace' {\n    return 'edit_block'\n  },\n\n  smallFastModel(_model: string): string | null {\n    return null\n  },\n\n  cacheControlMode(): 'none' | 'passthrough' | 'last-only' {\n    return 'none'\n  },\n}\n", "/**\n * Transformer registry. Adding a new provider = add a file in this\n * directory + one line here.\n */\n\nimport { deepseekTransformer } from './deepseek.js'\nimport { groqTransformer } from './groq.js'\nimport { glmTransformer } from './glm.js'\nimport { moonshotTransformer } from './moonshot.js'\nimport { minimaxTransformer } from './minimax.js'\nimport { mistralTransformer } from './mistral.js'\nimport { nimTransformer } from './nim.js'\nimport { ollamaTransformer } from './ollama.js'\nimport { lmStudioTransformer } from './lmstudio.js'\nimport { openrouterTransformer } from './openrouter.js'\nimport { agentrouterTransformer } from './agentrouter.js'\nimport { modelRouterTransformer } from './modelrouter.js'\nimport { vercelTransformer } from './vercel.js'\nimport { requestyTransformer } from './requesty.js'\nimport { opencodeTransformer } from './opencode.js'\nimport { clineTransformer } from './cline.js'\nimport { iflowTransformer } from './iflow.js'\nimport { kilocodeTransformer } from './kilocode.js'\nimport { copilotTransformer } from './copilot.js'\nimport { genericTransformer } from './generic.js'\nimport type { Transformer, ProviderId } from './base.js'\n\nexport const TRANSFORMERS: Record<ProviderId, Transformer> = {\n  deepseek: deepseekTransformer,\n  groq: groqTransformer,\n  glm: glmTransformer,\n  moonshot: moonshotTransformer,\n  minimax: minimaxTransformer,\n  mistral: mistralTransformer,\n  nim: nimTransformer,\n  ollama: ollamaTransformer,\n  lmstudio: lmStudioTransformer,\n  openrouter: openrouterTransformer,\n  agentrouter: agentrouterTransformer,\n  modelrouter: modelRouterTransformer,\n  vercel: vercelTransformer,\n  requesty: requestyTransformer,\n  opencode: opencodeTransformer,\n  cline: clineTransformer,\n  iflow: iflowTransformer,\n  kilocode: kilocodeTransformer,\n  copilot: copilotTransformer,\n  generic: genericTransformer,\n}\n\nexport function getTransformer(provider: ProviderId): Transformer {\n  return TRANSFORMERS[provider] ?? genericTransformer\n}\n\nexport {\n  deepseekTransformer, groqTransformer, mistralTransformer, nimTransformer,\n  glmTransformer, moonshotTransformer, minimaxTransformer, ollamaTransformer, lmStudioTransformer, openrouterTransformer, agentrouterTransformer, modelRouterTransformer, vercelTransformer, requestyTransformer, opencodeTransformer, genericTransformer,\n  clineTransformer, iflowTransformer, kilocodeTransformer, copilotTransformer,\n}\nexport type { Transformer, ProviderId, TransformContext } from './base.js'\nexport type { OpenAIChatRequest, OpenAIChatMessage } from './shared_types.js'\n", "import type { ModelInfo } from '../../services/api/providers/base_provider.js'\r\nimport type { APIProvider } from './providers.js'\r\n\r\ntype ContextWindowMap = Record<string, number>\r\n\r\nconst OPENAI_LONG_CONTEXT_WINDOW = 1_050_000\r\nconst GEMINI_LONG_CONTEXT_WINDOW = 1_048_576\r\nconst GEMINI_15_PRO_CONTEXT_WINDOW = 2_097_152\r\n\r\nconst providerContextWindows = new Map<APIProvider, Map<string, number>>()\r\n\r\nconst PROVIDER_SCOPED_CONTEXT_WINDOWS: Partial<Record<APIProvider, ContextWindowMap>> = {\r\n  firstParty: {\r\n    'claude-opus-4-8': 1_000_000,\r\n    'claude-opus-4-7': 1_000_000,\r\n  },\r\n  kiro: {\r\n    auto: 1_000_000,\r\n    'claude-sonnet-4.5': 200_000,\r\n    'claude-sonnet-4': 200_000,\r\n    'claude-haiku-4.5': 200_000,\r\n    'deepseek-3.2': 164_000,\r\n    'minimax-m2.5': 196_000,\r\n    'minimax-m2.1': 196_000,\r\n    'glm-5': 200_000,\r\n    'qwen3-coder-next': 256_000,\r\n  },\r\n  cursor: {\r\n    'claude-4-sonnet-1m': 1_000_000,\r\n    'claude-4-sonnet-1m-thinking': 1_000_000,\r\n  },\r\n  glm: {\r\n    'glm-5.1': 200_000,\r\n    'glm-5-turbo': 200_000,\r\n    'glm-5': 200_000,\r\n    'glm-4.7': 200_000,\r\n  },\r\n  moonshot: {\r\n    'kimi-k2.6': 262_144,\r\n    'kimi-k2.5': 262_144,\r\n    'kimi-k2-thinking': 262_144,\r\n    'kimi-k2-thinking-turbo': 262_144,\r\n    'kimi-k2-turbo-preview': 262_144,\r\n    'kimi-k2-0905-preview': 262_144,\r\n    'kimi-k2-0711-preview': 131_072,\r\n  },\r\n  minimax: {\r\n    'minimax-m2.7': 204_800,\r\n    'minimax-m2.7-highspeed': 204_800,\r\n    'minimax-m2.5': 196_000,\r\n    'minimax-m2.5-highspeed': 196_000,\r\n    'minimax-m2.1': 196_000,\r\n    'minimax-m2.1-highspeed': 196_000,\r\n  },\r\n}\r\n\r\nconst KNOWN_MODEL_CONTEXT_WINDOWS: ContextWindowMap = {\r\n  // OpenAI and Codex catalogs.\r\n  'gpt-5.5': 272_000,\r\n  'gpt-5.5-pro': 272_000,\r\n  'gpt-5.4': OPENAI_LONG_CONTEXT_WINDOW,\r\n  'gpt-5.4-pro': OPENAI_LONG_CONTEXT_WINDOW,\r\n  'gpt-5.4-mini': 272_000,\r\n  'gpt-5.4-nano': 272_000,\r\n  'gpt-5.3-codex': 272_000,\r\n  'gpt-5.3-codex-spark-preview': 272_000,\r\n  'gpt-5.2': 272_000,\r\n  'gpt-5.2-codex': 272_000,\r\n  'gpt-5.1': 272_000,\r\n  'gpt-5.1-codex-max': 272_000,\r\n  'gpt-5.1-codex-mini': 272_000,\r\n  'gpt-5-mini': 272_000,\r\n  'gpt-5': 200_000,\r\n  'gpt-5-codex': 200_000,\r\n  o1: 200_000,\r\n  'o1-mini': 128_000,\r\n  'o1-preview': 128_000,\r\n  o3: 200_000,\r\n  'o3-mini': 200_000,\r\n  'o4-mini': 200_000,\r\n  'gpt-4.1': 1_000_000,\r\n  'gpt-4o': 128_000,\r\n  'gpt-4-turbo': 128_000,\r\n  'gpt-4': 8_192,\r\n\r\n  // Google Gemini catalogs.\r\n  'gemini-3.1-pro': GEMINI_LONG_CONTEXT_WINDOW,\r\n  'gemini-3.1-pro-high': GEMINI_LONG_CONTEXT_WINDOW,\r\n  'gemini-3.1-pro-low': GEMINI_LONG_CONTEXT_WINDOW,\r\n  'gemini-3.1-pro-preview': GEMINI_LONG_CONTEXT_WINDOW,\r\n  'gemini-3.1-pro-preview-customtools': GEMINI_LONG_CONTEXT_WINDOW,\n  'gemini-3.5-flash-high': GEMINI_LONG_CONTEXT_WINDOW,\n  'gemini-3.5-flash-medium': GEMINI_LONG_CONTEXT_WINDOW,\n  'gemini-3.5-flash-low': GEMINI_LONG_CONTEXT_WINDOW,\n  'gemini-3.1-flash-lite-preview': GEMINI_LONG_CONTEXT_WINDOW,\n  'gemini-3-flash': GEMINI_LONG_CONTEXT_WINDOW,\r\n  'gemini-3-flash-preview': GEMINI_LONG_CONTEXT_WINDOW,\r\n  'gemini-2.5-pro': GEMINI_LONG_CONTEXT_WINDOW,\r\n  'gemini-2.5-flash': GEMINI_LONG_CONTEXT_WINDOW,\r\n  'gemini-2.0': GEMINI_LONG_CONTEXT_WINDOW,\r\n  'gemini-1.5-pro': GEMINI_15_PRO_CONTEXT_WINDOW,\r\n  'gemini-1.5-flash': GEMINI_LONG_CONTEXT_WINDOW,\r\n\r\n  // Provider-owned and OpenAI-compatible catalogs.\r\n  'deepseek-chat': 128_000,\r\n  'deepseek-reasoner': 128_000,\r\n  'deepseek-coder': 128_000,\r\n  'minimax-m2.7': 204_800,\r\n  'minimax-m2.7-highspeed': 204_800,\r\n  'deepseek-3.2': 164_000,\r\n  'minimax-m2.5': 196_000,\r\n  'minimax-m2.1': 196_000,\r\n  'glm-5.1': 200_000,\r\n  'glm-5-turbo': 200_000,\r\n  'glm-5': 200_000,\r\n  'glm-4.7': 200_000,\r\n  'kimi-k2.6': 262_144,\r\n  'kimi-k2.5': 262_144,\r\n  'kimi-k2-thinking': 262_144,\r\n  'kimi-k2-thinking-turbo': 262_144,\r\n  'kimi-k2-turbo-preview': 262_144,\r\n  'kimi-k2-0905-preview': 262_144,\r\n  'kimi-k2-0711-preview': 131_072,\r\n  'qwen3-coder-next': 256_000,\r\n\r\n  // Ollama common models.\r\n  llama3: 8_192,\r\n  'llama3.1': 128_000,\r\n  'llama3.2': 128_000,\r\n  'llama3.3': 128_000,\r\n  codellama: 16_384,\r\n  mixtral: 32_768,\r\n  mistral: 32_768,\r\n  'qwen2.5': 128_000,\r\n  phi3: 128_000,\r\n  'command-r': 128_000,\r\n}\r\n\r\nconst PREFIX_CONTEXT_WINDOWS: ContextWindowMap = {\r\n  'gpt-5.4-mini': 272_000,\r\n  'gpt-5.4-nano': 272_000,\r\n  'gpt-5.4-pro': OPENAI_LONG_CONTEXT_WINDOW,\r\n  'gpt-5.4': OPENAI_LONG_CONTEXT_WINDOW,\r\n  'gpt-5.3-codex': 272_000,\r\n  'gpt-5.2-codex': 272_000,\r\n  'gpt-5.2': 272_000,\r\n  'gpt-5.1-codex-max': 272_000,\r\n  'gpt-5.1-codex-mini': 272_000,\r\n  'gpt-5.1': 272_000,\r\n  'gpt-5-mini': 272_000,\r\n  'gemini-3.5-flash': GEMINI_LONG_CONTEXT_WINDOW,\r\n  'gemini-3.1-pro': GEMINI_LONG_CONTEXT_WINDOW,\r\n  'gemini-3.1-flash-lite': GEMINI_LONG_CONTEXT_WINDOW,\r\n  'gemini-3-flash': GEMINI_LONG_CONTEXT_WINDOW,\r\n  'gemini-2.5-pro': GEMINI_LONG_CONTEXT_WINDOW,\r\n  'gemini-2.5-flash': GEMINI_LONG_CONTEXT_WINDOW,\r\n  'gemini-2.0': GEMINI_LONG_CONTEXT_WINDOW,\r\n  'gemini-1.5-pro': GEMINI_15_PRO_CONTEXT_WINDOW,\r\n  'gemini-1.5-flash': GEMINI_LONG_CONTEXT_WINDOW,\r\n  'deepseek-chat': 128_000,\r\n  'deepseek-reasoner': 128_000,\r\n  'deepseek-coder': 128_000,\r\n  'minimax-m2.7': 204_800,\r\n  'minimax-m2.7-highspeed': 204_800,\r\n  'minimax-m2.5': 196_000,\r\n  'minimax-m2.5-highspeed': 196_000,\r\n  'minimax-m2.1': 196_000,\r\n  'minimax-m2.1-highspeed': 196_000,\r\n  'glm-5.1': 200_000,\r\n  'glm-5-turbo': 200_000,\r\n  'glm-5': 200_000,\r\n  'glm-4.7': 200_000,\r\n  'kimi-k2.6': 262_144,\r\n  'kimi-k2.5': 262_144,\r\n  'kimi-k2-thinking': 262_144,\r\n  'kimi-k2-thinking-turbo': 262_144,\r\n  'kimi-k2-turbo-preview': 262_144,\r\n  'kimi-k2-0905-preview': 262_144,\r\n  'kimi-k2-0711-preview': 131_072,\r\n  'llama3.3': 128_000,\r\n  'llama3.2': 128_000,\r\n  'llama3.1': 128_000,\r\n  llama3: 8_192,\r\n  codellama: 16_384,\r\n  mixtral: 32_768,\r\n  mistral: 32_768,\r\n  'qwen2.5': 128_000,\r\n  phi3: 128_000,\r\n  'command-r': 128_000,\r\n}\r\n\r\nconst VARIANT_SUFFIXES = new Set([\r\n  'fast',\r\n  'high',\r\n  'low',\r\n  'max',\r\n  'medium',\r\n  'minimal',\r\n  'none',\r\n  'thinking',\r\n  'xhigh',\r\n])\r\n\r\nexport function recordProviderModelContextWindows(\r\n  provider: APIProvider,\r\n  models: readonly ModelInfo[],\r\n): void {\r\n  let providerWindows = providerContextWindows.get(provider)\r\n  if (!providerWindows) {\r\n    providerWindows = new Map()\r\n    providerContextWindows.set(provider, providerWindows)\r\n  }\r\n\r\n  for (const model of models) {\r\n    if (\r\n      typeof model.contextWindow !== 'number' ||\r\n      !Number.isFinite(model.contextWindow) ||\r\n      model.contextWindow <= 0\r\n    ) {\r\n      continue\r\n    }\r\n\r\n    for (const candidate of getModelLookupCandidates(model.id)) {\r\n      providerWindows.set(candidate, model.contextWindow)\r\n    }\r\n  }\r\n}\r\n\r\nexport function getProviderCatalogContextWindow(\r\n  model: string,\r\n  provider?: APIProvider,\r\n): number | undefined {\r\n  const candidates = getModelLookupCandidates(model)\r\n  if (candidates.length === 0) {\r\n    return undefined\r\n  }\r\n\r\n  if (provider) {\r\n    const dynamicWindow = lookupMap(candidates, providerContextWindows.get(provider))\r\n    if (dynamicWindow !== undefined) {\r\n      return dynamicWindow\r\n    }\r\n\r\n    const scopedWindow = lookupRecord(candidates, PROVIDER_SCOPED_CONTEXT_WINDOWS[provider])\r\n    if (scopedWindow !== undefined) {\r\n      return scopedWindow\r\n    }\r\n  }\r\n\r\n  const exactWindow = lookupRecord(candidates, KNOWN_MODEL_CONTEXT_WINDOWS)\r\n  if (exactWindow !== undefined) {\r\n    return exactWindow\r\n  }\r\n\r\n  return lookupPrefixes(candidates)\r\n}\r\n\r\nfunction lookupMap(\r\n  candidates: readonly string[],\r\n  values: ReadonlyMap<string, number> | undefined,\r\n): number | undefined {\r\n  if (!values) {\r\n    return undefined\r\n  }\r\n\r\n  for (const candidate of candidates) {\r\n    const value = values.get(candidate)\r\n    if (value !== undefined) {\r\n      return value\r\n    }\r\n  }\r\n\r\n  return undefined\r\n}\r\n\r\nfunction lookupRecord(\r\n  candidates: readonly string[],\r\n  values: ContextWindowMap | undefined,\r\n): number | undefined {\r\n  if (!values) {\r\n    return undefined\r\n  }\r\n\r\n  for (const candidate of candidates) {\r\n    const value = values[candidate]\r\n    if (value !== undefined) {\r\n      return value\r\n    }\r\n  }\r\n\r\n  return undefined\r\n}\r\n\r\nfunction lookupPrefixes(candidates: readonly string[]): number | undefined {\r\n  const keys = Object.keys(PREFIX_CONTEXT_WINDOWS).sort((a, b) => b.length - a.length)\r\n  for (const candidate of candidates) {\r\n    for (const key of keys) {\r\n      if (candidate.startsWith(key)) {\r\n        return PREFIX_CONTEXT_WINDOWS[key]\r\n      }\r\n    }\r\n  }\r\n\r\n  return undefined\r\n}\r\n\r\nfunction getModelLookupCandidates(model: string): string[] {\r\n  const normalized = normalizeModelId(model)\r\n  if (!normalized) {\r\n    return []\r\n  }\r\n\r\n  const baseCandidates = [normalized]\r\n  const slashIndex = normalized.lastIndexOf('/')\r\n  if (slashIndex >= 0 && slashIndex < normalized.length - 1) {\r\n    baseCandidates.push(normalized.slice(slashIndex + 1))\r\n  }\r\n\r\n  const candidates: string[] = []\r\n  for (const candidate of baseCandidates) {\r\n    addVariantCandidates(candidate, candidates)\r\n  }\r\n\r\n  return Array.from(new Set(candidates))\r\n}\r\n\r\nfunction addVariantCandidates(candidate: string, candidates: string[]): void {\r\n  let current = candidate\r\n  for (let i = 0; i < 6; i += 1) {\r\n    candidates.push(current)\r\n    const stripped = stripKnownVariantSuffix(current)\r\n    if (!stripped || stripped === current) {\r\n      return\r\n    }\r\n    current = stripped\r\n  }\r\n}\r\n\r\nfunction stripKnownVariantSuffix(model: string): string | null {\r\n  const parts = model.split('-')\r\n  if (parts.length <= 1) {\r\n    return null\r\n  }\r\n\r\n  const suffix = parts[parts.length - 1]\r\n  if (!suffix || !VARIANT_SUFFIXES.has(suffix)) {\r\n    return null\r\n  }\r\n\r\n  return parts.slice(0, -1).join('-')\r\n}\r\n\r\nfunction normalizeModelId(model: string): string {\r\n  let normalized = model.trim().toLowerCase()\r\n  if (!normalized) {\r\n    return ''\r\n  }\r\n\r\n  const effortSeparator = '::effort='\r\n  const effortIndex = normalized.lastIndexOf(effortSeparator)\r\n  if (effortIndex >= 0) {\r\n    normalized = normalized.slice(0, effortIndex)\r\n  }\r\n\r\n  normalized = normalized.replace(/\\[1m\\]$/i, '').trim()\r\n  normalized = normalized.replace(/^models\\//, '')\r\n  normalized = normalized.replace(/^antigravity-/, '')\r\n\r\n  return normalized\r\n}\r\n", "/**\r\n * OpenAI-Compatible Lane \u2014 Agent Loop + Provider-Shim Entry\r\n *\r\n * Handles every provider that speaks OpenAI Chat Completions:\r\n *   - DeepSeek     (reasoner \u2192 `reasoning_content` \u2192 thinking; max_tokens 8192 cap)\r\n *   - Groq         (strip cache_control / $schema / null function_call; `reasoning` \u2192 thinking; fake_stream when JSON mode)\r\n *   - NVIDIA NIM   (strip stream_options; per-model param filtering)\r\n *   - Ollama       (no API key; Ollama-specific params; strip stream_options)\r\n *   - OpenRouter   (cache_control only for Claude / Gemini; relocate to last content block for 4-breakpoint Anthropic cap)\r\n *   - Mistral      (strip $id / $schema / additionalProperties / strict; tool_choice \"required\" \u2192 \"any\")\r\n *   - Generic long-tail (Fireworks, Together, Deepinfra, xAI, etc.)\r\n *\r\n * Per-provider quirks are consolidated in the transform helpers at the\r\n * bottom \u2014 adding a new provider is ~20 lines. The reference transformer\r\n * files this mirrors: claude-code-router/packages/core/src/transformer,\r\n * litellm/llms/<provider>/chat/transformation.py.\r\n */\r\n\r\nimport type {\r\n  AnthropicStreamEvent,\r\n  ModelInfo,\r\n  ProviderMessage,\r\n  ProviderTool,\r\n} from '../../services/api/providers/base_provider.js'\r\nimport type {\r\n  Lane,\r\n  LaneRunContext,\r\n  LaneRunResult,\r\n  LaneProviderCallParams,\r\n  NormalizedUsage,\r\n} from '../types.js'\r\nimport { OPENAI_COMPAT_TOOL_REGISTRY, selectEditToolSet } from './tools.js'\r\nimport { getCompatShellDescription } from './shell_descriptions.js'\r\nimport { filterToSingleShell } from './single_shell.js'\r\nimport { getPlatform } from '../../utils/platform.js'\r\nimport { getPowerShellEdition } from '../../utils/shell/powershellDetection.js'\r\nimport {\r\n  appendStrictParamsHint,\r\n  OPENAI_COMPAT_TOOL_USAGE_RULES,\r\n} from '../shared/mcp_bridge.js'\r\nimport { getTransformer, type ProviderId } from './transformers/index.js'\r\nimport { resolveEditFormat } from './capabilities.js'\r\nimport {\r\n  formatCopilotModelUnsupportedMessage,\r\n  formatCopilotQuotaExceededMessage,\r\n  isCopilotModelUnsupportedError,\r\n  isCopilotQuotaExceededError,\r\n} from '../../utils/model/copilotAccount.js'\r\nimport {\r\n  toOpenRouterModelInfo,\r\n  type OpenRouterCatalogModel,\r\n} from '../../utils/model/openrouterCatalog.js'\r\nimport { isMoonshotThinkingModel } from '../../utils/model/moonshotCatalog.js'\r\nimport {\r\n  getOpencodeEffort,\r\n  isOpencodeThinkingModel,\r\n} from '../../utils/model/opencodeThinking.js'\r\nimport { recordProviderModelContextWindows } from '../../utils/model/contextWindows.js'\r\n\r\n// \u2500\u2500\u2500 Provider Detection \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\ntype ProviderType =\r\n  | 'deepseek'\r\n  | 'groq'\r\n  | 'glm'\r\n  | 'moonshot'\r\n  | 'minimax'\r\n  | 'mistral'\r\n  | 'nim'\r\n  | 'ollama'\r\n  | 'lmstudio'\r\n  | 'openrouter'\r\n  | 'agentrouter'\r\n  | 'modelrouter'\r\n  | 'vercel'\r\n  | 'requesty'\r\n  | 'opencode'\r\n  | 'cline'\r\n  | 'iflow'\r\n  | 'kilocode'\r\n  | 'copilot'\r\n  | 'generic'\r\n\r\nfunction detectProvider(model: string, baseUrl: string): ProviderType {\r\n  const b = baseUrl.toLowerCase()\r\n  const m = model.toLowerCase()\r\n  if (b.includes('deepseek')) return 'deepseek'\r\n  if (b.includes('bigmodel') || b.includes('zhipu')) return 'glm'\r\n  if (b.includes('moonshot') || b.includes('kimi')) return 'moonshot'\r\n  if (b.includes('minimax')) return 'minimax'\r\n  if (b.includes('groq')) return 'groq'\r\n  if (b.includes('mistral')) return 'mistral'\r\n  if (b.includes('integrate.api.nvidia')) return 'nim'\r\n  if (b.includes('lmstudio') || b.includes('lm-studio')) return 'lmstudio'\r\n  if (b.includes('localhost') || b.includes('127.0.0.1') || b.includes('0.0.0.0') || b.includes(':11434')) return 'ollama'\r\n  if (b.includes('agentrouter.org')) return 'agentrouter'\r\n  if (b.includes('lxg2it') || b.includes('modelrouter')) return 'modelrouter'\r\n  if (b.includes('ai-gateway.vercel') || b.includes('vercel')) return 'vercel'\r\n  if (b.includes('requesty')) return 'requesty'\r\n  if (b.includes('opencode.ai/zen') || b.includes('opencode.ai')) return 'opencode'\r\n  if (b.includes('openrouter')) return 'openrouter'\r\n  if (b.includes('cline.bot')) return 'cline'\r\n  if (b.includes('iflow.cn') || b.includes('apis.iflow')) return 'iflow'\r\n  if (b.includes('kilocode.ai') || b.includes('kilo.ai')) return 'kilocode'\r\n  if (b.includes('githubcopilot.com')) return 'copilot'\r\n  if (m.includes('deepseek')) return 'deepseek'\r\n  if (m.startsWith('glm-')) return 'glm'\r\n  if (m.startsWith('kimi-') || m.includes('moonshot')) return 'moonshot'\r\n  if (m.startsWith('minimax-') || m.includes('minimax')) return 'minimax'\r\n  if (m.startsWith('llama') || m.startsWith('mixtral') || m.startsWith('gemma')) return 'groq'\r\n  if (m.startsWith('mistral-') || m.startsWith('magistral-') || m.startsWith('codestral-')) return 'mistral'\r\n  // qwen removed \u2014 handled by the dedicated Qwen lane (src/lanes/qwen/).\r\n  return 'generic'\r\n}\r\n\r\nfunction isLocalBaseUrl(baseUrl: string): boolean {\r\n  const b = baseUrl.toLowerCase()\r\n  return b.includes('localhost') || b.includes('127.0.0.1') || b.includes('0.0.0.0') || b.includes(':11434')\r\n}\r\n\r\n// \u2500\u2500\u2500 OpenAI Chat Completions Message Shape \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\ninterface OpenAIChatMessage {\r\n  role: 'system' | 'user' | 'assistant' | 'tool'\r\n  content?: string | null | Array<{ type: string; text?: string; image_url?: unknown; cache_control?: { type: string } }>\r\n  reasoning_content?: string\r\n  tool_calls?: Array<{\r\n    id: string\r\n    type: 'function'\r\n    function: { name: string; arguments: string }\r\n  }>\r\n  tool_call_id?: string\r\n  name?: string\r\n  // OpenRouter / DeepSeek reasoning fields come back on the delta; no input field.\r\n}\r\n\r\ninterface OpenAIChatRequest {\r\n  model: string\r\n  messages: OpenAIChatMessage[]\r\n  stream?: boolean\r\n  stream_options?: { include_usage?: boolean }\r\n  tools?: Array<{ type: 'function'; function: { name: string; description: string; parameters: Record<string, unknown> } }>\r\n  tool_choice?: 'auto' | 'required' | 'none' | { type: 'function'; function: { name: string } }\r\n  max_tokens?: number\r\n  temperature?: number\r\n  top_p?: number\r\n  stop?: string[]\r\n  // Reasoning knobs \u2014 provider-specific. Passed through when supported.\r\n  reasoning_effort?: 'low' | 'medium' | 'high'\r\n  reasoning?: { effort?: string }\r\n  thinking?: { type: 'enabled' } | { type: 'disabled' }\r\n  extra_body?: Record<string, unknown>\r\n  // OpenRouter extensions:\r\n  transforms?: string[]\r\n  models?: string[]\r\n  route?: string\r\n  prompt_cache_key?: string\r\n  prompt_cache_retention?: '24h'\r\n  providerOptions?: {\r\n    gateway?: {\r\n      caching?: 'auto'\r\n      [key: string]: unknown\r\n    }\r\n    [key: string]: unknown\r\n  }\r\n  requesty?: {\r\n    auto_cache?: boolean\r\n    [key: string]: unknown\r\n  }\r\n  /**\r\n   * OpenRouter-native detailed-usage flag. When set, the gateway returns\r\n   * cache_discount and per-breakpoint hit counts on the final stream\r\n   * chunk so implicit-cache hits (DeepSeek, OpenAI gpt-5/4.1 on OR) are\r\n   * actually visible in our usage parsing instead of looking like 0.\r\n   */\r\n  usage?: { include?: boolean }\r\n}\r\n\r\ninterface CompatCatalogModel extends OpenRouterCatalogModel {\r\n  owned_by?: string\r\n  max_context_length?: number\r\n  context_window?: number\r\n  max_tokens?: number\r\n  api?: string\r\n  type?: string\r\n  tags?: string[]\r\n  supports_caching?: boolean\r\n  supports_reasoning?: boolean\r\n  supports_tool_calling?: boolean\r\n  supports_vision?: boolean\r\n  capabilities?: {\r\n    completion_chat?: boolean\r\n    function_calling?: boolean\r\n    vision?: boolean\r\n  }\r\n}\r\n\r\ninterface LmStudioNativeModel {\r\n  type?: string\r\n  key?: string\r\n  display_name?: string\r\n  context_length?: number\r\n  max_context_length?: number\r\n  selected_variant?: string\r\n  variants?: string[]\r\n  loaded_instances?: Array<{\r\n    id?: string\r\n    config?: {\r\n      context_length?: number\r\n    }\r\n  }>\r\n  capabilities?: {\r\n    trained_for_tool_use?: boolean\r\n    vision?: boolean\r\n  }\r\n}\r\n\r\ntype LmStudioModelInfo = ModelInfo & {\r\n  lmStudioAliases?: string[]\r\n  lmStudioLoadedContextWindow?: number\r\n  lmStudioMaxContextWindow?: number\r\n}\r\n\r\n// \u2500\u2500\u2500 Lane Implementation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport class OpenAICompatLane implements Lane {\r\n  readonly name = 'openai-compat'\r\n  readonly displayName = 'OpenAI-Compatible (DeepSeek, GLM, Moonshot, MiniMax, Groq, Mistral, NIM, Ollama, LM Studio, OpenRouter, ...)'\r\n\r\n  private configs = new Map<string, { apiKey: string; baseUrl: string }>()\r\n  private _healthy = true\r\n\r\n  registerProvider(name: string, apiKey: string, baseUrl: string): void {\r\n    this.configs.set(name, { apiKey, baseUrl })\r\n    this.invalidateModelCache(name)\r\n  }\r\n\r\n  unregisterProvider(name: string): void {\r\n    this.configs.delete(name)\r\n    this.invalidateModelCache(name)\r\n  }\r\n\r\n  invalidateModelCache(providerFilter?: string): void {\r\n    if (providerFilter) {\r\n      _modelsCacheByProvider.delete(providerFilter)\r\n      _modelsCacheByProvider.delete('__all__')\r\n      return\r\n    }\r\n    _modelsCacheByProvider.clear()\r\n  }\r\n\r\n  private getConfigForModel(\r\n    model: string,\r\n    providerHint?: string,\r\n  ): { apiKey: string; baseUrl: string; provider: ProviderType } | null {\r\n    // Provider-selection wins. The shim was built for a specific\r\n    // sub-provider (the user picked it from /models), and the same model\r\n    // ID can live on multiple hosts (`openai/gpt-oss-120b` is on both\r\n    // Groq and OpenRouter). When the hint names a registered config, use\r\n    // it directly \u2014 don't fall through to the model-name heuristics.\r\n    if (providerHint) {\r\n      if (!this.configs.has(providerHint)) return null\r\n      const c = this.configs.get(providerHint)!\r\n      return { ...c, provider: providerHint as ProviderType }\r\n    }\r\n\r\n    const m = model.toLowerCase()\r\n\r\n    // Explicit routing: model prefix \u2192 provider config\r\n    if (m.includes('deepseek') && this.configs.has('deepseek')) {\r\n      const c = this.configs.get('deepseek')!\r\n      return { ...c, provider: 'deepseek' }\r\n    }\r\n    if (m.startsWith('glm-') && this.configs.has('glm')) {\r\n      const c = this.configs.get('glm')!\r\n      return { ...c, provider: 'glm' }\r\n    }\r\n    if ((m.startsWith('kimi-') || m.includes('moonshot')) && this.configs.has('moonshot')) {\r\n      const c = this.configs.get('moonshot')!\r\n      return { ...c, provider: 'moonshot' }\r\n    }\r\n    if ((m.startsWith('minimax-') || m.includes('minimax')) && this.configs.has('minimax')) {\r\n      const c = this.configs.get('minimax')!\r\n      return { ...c, provider: 'minimax' }\r\n    }\r\n    if ((m.startsWith('llama') || m.startsWith('mixtral') || m.startsWith('gemma')) && this.configs.has('groq')) {\r\n      const c = this.configs.get('groq')!\r\n      return { ...c, provider: 'groq' }\r\n    }\r\n    if ((m.startsWith('mistral-') || m.startsWith('magistral-') || m.startsWith('codestral-')) && this.configs.has('mistral')) {\r\n      const c = this.configs.get('mistral')!\r\n      return { ...c, provider: 'mistral' }\r\n    }\r\n    // Qwen routing moved to the dedicated Qwen lane. Compat never sees qwen-*.\r\n    // `openai/gpt-oss-*` is intentionally NOT pinned to Groq here \u2014\r\n    // the same ID is hosted on both Groq and OpenRouter; the provider\r\n    // hint above is the authoritative signal for picking one. This\r\n    // slash-qualified fallback only fires when the hint didn't match\r\n    // any registered config (e.g. a direct call without a shim).\r\n    if (this.configs.has('openrouter') && m.includes('/')) {\r\n      const c = this.configs.get('openrouter')!\r\n      return { ...c, provider: 'openrouter' }\r\n    }\r\n    if (this.configs.has('nim') && this.configs.has('nim')) {\r\n      const c = this.configs.get('nim')!\r\n      return { ...c, provider: 'nim' }\r\n    }\r\n    if (this.configs.has('ollama')) {\r\n      const c = this.configs.get('ollama')!\r\n      return { ...c, provider: 'ollama' }\r\n    }\r\n    if (this.configs.has('lmstudio')) {\r\n      const c = this.configs.get('lmstudio')!\r\n      return { ...c, provider: 'lmstudio' }\r\n    }\r\n    // Fallback: first registered config.\r\n    const first = this.configs.values().next().value\r\n    if (!first) return null\r\n    return { ...first, provider: detectProvider(model, first.baseUrl) }\r\n  }\r\n\r\n  supportsModel(model: string): boolean {\r\n    const m = model.toLowerCase()\r\n    // Everything that isn't Claude, Gemini, Qwen, or native OpenAI\r\n    // (each handled by its own dedicated lane).\r\n    return !(\r\n      m.startsWith('claude-') || m.includes('anthropic') ||\r\n      m.startsWith('gemini-') || m.startsWith('gemma-') ||\r\n      m.startsWith('qwen') || m === 'coder-model' ||\r\n      m.startsWith('gpt-') || m.startsWith('o1') || m.startsWith('o3') ||\r\n      m.startsWith('o4') || m.startsWith('o5') || m.startsWith('codex-') ||\r\n      m.startsWith('gpt-5-codex')\r\n    )\r\n  }\r\n\r\n  // \u2500\u2500 Provider-shim-compatible single-turn entry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n  async *streamAsProvider(\r\n    params: LaneProviderCallParams,\r\n  ): AsyncGenerator<AnthropicStreamEvent, NormalizedUsage> {\r\n    const { model, messages, system, tools, max_tokens, thinking, temperature, stop_sequences, signal, sessionId, providerHint } = params\r\n\r\n    const cfg = this.getConfigForModel(model, providerHint)\r\n    if (!cfg) {\r\n      throw new Error(`No provider configured for model \"${model}\". Run /provider to connect a provider, or /models to pick a different model.`)\r\n    }\r\n\r\n    const provider = cfg.provider\r\n    const isLocal = isLocalBaseUrl(cfg.baseUrl)\r\n    const cacheSessionId =\r\n      provider === 'copilot' || provider === 'openrouter' || provider === 'agentrouter' || provider === 'opencode' || provider === 'moonshot' || provider === 'mistral'\r\n        ? sessionId\r\n        : undefined\r\n\r\n    // Assemble system text. We keep it simple for Phase-1 (caller's text).\r\n    const rawSystemText = typeof system === 'string'\r\n      ? system\r\n      : (system ?? []).map(b => b.text).join('\\n\\n')\r\n\r\n    // Per-model tool filter: small-tier models (e.g. Groq Llama on free\r\n    // TPM) get a curated subset so the request fits the budget.\r\n    const transformerForTools = getTransformer(provider as ProviderId)\r\n    const perModelFilteredTools = transformerForTools.filterTools?.(model, tools) ?? tools\r\n\r\n    // Drop the non-preferred shell when BOTH Bash and PowerShell are\r\n    // exposed (Windows + ant-default or CLAUDE_CODE_USE_POWERSHELL_TOOL=1\r\n    // + git-bash). Frontier lanes handle two shells fine; weak compat\r\n    // models routinely pick the wrong one and emit cross-shell syntax,\r\n    // so the lane picks for them. See single_shell.ts for selection.\r\n    const filteredTools = filterToSingleShell(perModelFilteredTools)\r\n\r\n    // Resolve the PowerShell edition once per request (memoized in\r\n    // powershellDetection.ts; subsequent requests hit the cache). We\r\n    // need it sync for shell-description rendering \u2014 `await` here, NOT\r\n    // inside buildOpenAITools.\r\n    const psEdition = await getPowerShellEdition()\r\n\r\n    // Tool conversion \u2192 OpenAI function tools with per-provider schema\r\n    // cleanup (strip $schema / $id / additionalProperties / strict etc.).\r\n    // Every function tool gets the STRICT PARAMETERS description hint,\r\n    // plus function.strict: true when the provider honors it. Bash /\r\n    // PowerShell tool descriptions may be replaced with compact\r\n    // example-driven versions for weak compat-lane models \u2014 see\r\n    // shell_descriptions.ts.\r\n    const openaiTools = buildOpenAITools(filteredTools, provider, model, {\r\n      platform: getPlatform() === 'windows' ? 'win32' : (process.platform),\r\n      psEdition,\r\n    })\r\n\r\n    // Prepend OPENAI_COMPAT_TOOL_USAGE_RULES to the system message when\r\n    // tools are present \u2014 in-context reminder of schema authority for\r\n    // providers that don't enforce `strict: true` server-side (Mistral,\r\n    // generic long-tail). Small-tier models (Groq Llama free TPM) can\r\n    // opt out via `skipToolUsagePreamble` to save input tokens.\r\n    const skipPreamble = transformerForTools.skipToolUsagePreamble?.(model) ?? false\r\n    const systemText = openaiTools.length > 0 && !skipPreamble\r\n      ? (rawSystemText\r\n          ? `${OPENAI_COMPAT_TOOL_USAGE_RULES}\\n${rawSystemText}`\r\n          : OPENAI_COMPAT_TOOL_USAGE_RULES)\r\n      : rawSystemText\r\n\r\n    // History conversion \u2192 OpenAI Chat Completions messages.\r\n    const chatMessages = convertHistoryToOpenAI(messages, systemText, provider, model)\r\n\r\n    // Build request body with per-provider quirks applied.\r\n    const body = applyProviderRequestQuirks(\r\n      {\r\n        model,\r\n        messages: chatMessages,\r\n        stream: true,\r\n        stream_options: { include_usage: true },\r\n        // OpenRouter / AgentRouter / OpenCode Zen: surface detailed usage\r\n        // including cache_discount. Mirrors the Kilo lane's body. Without\r\n        // this flag the cache_read / cache_write fields aren't populated\r\n        // on those gateways, which is what made every call look like a\r\n        // cold miss even when the upstream actually had a cache hit.\r\n        ...((provider === 'openrouter' || provider === 'agentrouter' || provider === 'opencode') && { usage: { include: true } }),\r\n        // Ollama and LM Studio expose local OpenAI-compatible tool calling.\r\n        // Keep generic localhost endpoints on the old gate unless they are\r\n        // explicitly selected as one of these local providers.\r\n        tools: openaiTools.length > 0 && (provider === 'ollama' || provider === 'lmstudio' || !isLocal) ? openaiTools : undefined,\r\n        tool_choice: openaiTools.length > 0 && (provider === 'ollama' || provider === 'lmstudio' || !isLocal) ? 'auto' : undefined,\r\n        max_tokens: clampMaxTokens(provider, max_tokens),\r\n        temperature: temperature ?? (isLocal ? 0.7 : undefined),\r\n        stop: stop_sequences?.length ? stop_sequences : undefined,\r\n      },\r\n      provider,\r\n      thinking,\r\n      cacheSessionId,\r\n    )\r\n\r\n    // Ollama branch: skip the OpenAI-compat /v1 path entirely and use\r\n    // the native /api/chat endpoint so we can set num_ctx + keep_alive.\r\n    // The /v1 shim ignores those, so the model runs at its default 4096\r\n    // context (everything beyond gets truncated and prefilled fresh each\r\n    // turn \u2014 that was the latency cancer). Other providers stay on /v1\r\n    // unchanged.\r\n    if (provider === 'ollama') {\r\n      const ollamaUsage = yield* streamOllamaNative(cfg, body, model, signal)\r\n      return ollamaUsage\r\n    }\r\n\r\n    // Headers per-provider.\r\n    const headers = buildRequestHeaders(provider, cfg.apiKey, model, cacheSessionId)\r\n\r\n    // Fire request.\r\n    const url = normalizeBaseUrl(cfg.baseUrl) + '/chat/completions'\r\n\r\n    const messageId = `compat-${Date.now()}`\r\n    let messageStartEmitted = false\r\n    let inputTokens = 0\r\n    let outputTokens = 0\r\n    let reportedCachedInputTokens = 0\r\n    let cacheWriteTokens = 0\r\n    let reasoningTokens = 0\r\n\r\n    const cacheReadTokens = () =>\r\n      cacheWriteTokens > 0\r\n        ? Math.max(0, reportedCachedInputTokens - cacheWriteTokens)\r\n        : reportedCachedInputTokens\r\n\r\n    // Content-block state.\r\n    let currentBlockIndex = 0\r\n    let inTextBlock = false\r\n    let inThinkingBlock = false\r\n    const toolCallBuffers = new Map<number, { id: string; name: string; args: string; anthropicIndex: number }>()\r\n    let emittedAnyToolUse = false\r\n    let emittedAnyAssistantOutput = false\r\n\r\n    const emitMessageStart = () => {\r\n      if (messageStartEmitted) return undefined\r\n      messageStartEmitted = true\r\n      return {\r\n        type: 'message_start' as const,\r\n        message: {\r\n          id: messageId,\r\n          type: 'message' as const,\r\n          role: 'assistant' as const,\r\n          content: [],\r\n          model,\r\n          stop_reason: null,\r\n          stop_sequence: null,\r\n          usage: {\r\n            input_tokens: inputTokens,\r\n            output_tokens: 0,\r\n            ...(cacheReadTokens() > 0 && { cache_read_input_tokens: cacheReadTokens() }),\r\n            ...(cacheWriteTokens > 0 && { cache_creation_input_tokens: cacheWriteTokens }),\r\n          },\r\n        },\r\n      }\r\n    }\r\n\r\n    if (provider === 'lmstudio') {\r\n      const contextMessage = await getLmStudioContextPreflightMessage(cfg, model, body).catch(() => null)\r\n      if (contextMessage) {\r\n        const mst = emitMessageStart()\r\n        if (mst) yield mst\r\n        yield* emitErrorText(contextMessage)\r\n        yield { type: 'message_delta', delta: { stop_reason: 'end_turn' }, usage: { output_tokens: outputTokens } }\r\n        yield { type: 'message_stop' }\r\n        return blankUsage(inputTokens, outputTokens, cacheReadTokens(), reasoningTokens)\r\n      }\r\n    }\r\n\r\n    let response: Response\r\n    try {\r\n      response = await fetch(url, {\r\n        method: 'POST',\r\n        headers,\r\n        body: JSON.stringify(body),\r\n        signal,\r\n      })\r\n    } catch (err: any) {\r\n      if (!messageStartEmitted) {\r\n        const mst = emitMessageStart()\r\n        if (mst) yield mst\r\n      }\r\n      const message = err?.message ?? String(err)\r\n      const detail = provider === 'lmstudio'\r\n        ? `LM Studio server unreachable at ${normalizeBaseUrl(cfg.baseUrl)} (${message}). Start the LM Studio local server and retry.`\r\n        : message\r\n      yield* emitErrorText(`${provider} API connection error: ${detail}`)\r\n      yield { type: 'message_delta', delta: { stop_reason: 'end_turn' }, usage: { output_tokens: outputTokens } }\r\n      yield { type: 'message_stop' }\r\n      return blankUsage(inputTokens, outputTokens, cacheReadTokens(), reasoningTokens)\r\n    }\r\n\r\n    if (!response.ok) {\r\n      const errText = await response.text().catch(() => '')\r\n      if (!messageStartEmitted) {\r\n        const mst = emitMessageStart()\r\n        if (mst) yield mst\r\n      }\r\n      const isCopilotModelUnsupported =\r\n        provider === 'copilot'\r\n        && response.status === 400\r\n        && isCopilotModelUnsupportedError(errText)\r\n      const isCopilotQuotaExceeded =\r\n        provider === 'copilot'\r\n        && response.status === 402\r\n        && isCopilotQuotaExceededError(errText)\r\n\r\n      if (isCopilotModelUnsupported) {\r\n        yield* emitErrorText(formatCopilotModelUnsupportedMessage(model))\r\n        yield { type: 'message_delta', delta: { stop_reason: 'end_turn' }, usage: { output_tokens: outputTokens } }\r\n        yield { type: 'message_stop' }\r\n        return blankUsage(inputTokens, outputTokens, cacheReadTokens(), reasoningTokens)\r\n      }\r\n\r\n      if (isCopilotQuotaExceeded) {\r\n        yield* emitErrorText(formatCopilotQuotaExceededMessage())\r\n        yield { type: 'message_delta', delta: { stop_reason: 'end_turn' }, usage: { output_tokens: outputTokens } }\r\n        yield { type: 'message_stop' }\r\n        return blankUsage(inputTokens, outputTokens, cacheReadTokens(), reasoningTokens)\r\n      }\r\n\r\n      // Detect prompt-too-long / context-window-exceeded per the\r\n      // transformer's known markers. Emit with the \"Prompt is too long\"\r\n      // prefix claude.ts reactive-compact text-matches against \u2014\r\n      // otherwise Flash / smaller models 400 on oversized turns and\r\n      // the user has to `/compact` manually.\r\n      const transformer = getTransformer(provider as ProviderId)\r\n      const markers = transformer.contextExceededMarkers()\r\n      const lowered = errText.toLowerCase()\r\n      const isPromptTooLong = markers.some(m => lowered.includes(m.toLowerCase()))\r\n      yield* emitErrorText(formatProviderHttpError(provider, response.status, errText, isPromptTooLong))\r\n      yield { type: 'message_delta', delta: { stop_reason: 'end_turn' }, usage: { output_tokens: outputTokens } }\r\n      yield { type: 'message_stop' }\r\n      return blankUsage(inputTokens, outputTokens, cacheReadTokens(), reasoningTokens)\r\n    }\r\n\r\n    if (!response.body) {\r\n      throw new Error('OpenAI-compat: empty response body')\r\n    }\r\n\r\n    const reader = response.body.getReader()\r\n    const decoder = new TextDecoder()\r\n    let buffer = ''\r\n\r\n    try {\r\n      reading: while (true) {\r\n        const { done, value } = await reader.read()\r\n        if (!done) {\r\n          buffer += decoder.decode(value, { stream: true })\r\n        } else {\r\n          buffer += decoder.decode()\r\n        }\r\n\r\n        const lines = buffer.split('\\n')\r\n        buffer = done ? '' : (lines.pop() ?? '')\r\n\r\n        for (const rawLine of lines) {\r\n          const line = rawLine.trim()\r\n          if (!line) continue\r\n          if (!line.startsWith('data:')) continue\r\n          const payload = line.slice(5).trim()\r\n          if (payload === '[DONE]') break reading\r\n          if (!payload) continue\r\n\r\n          let chunk: any\r\n          try {\r\n            chunk = JSON.parse(payload)\r\n          } catch { continue }\r\n\r\n          // Apply per-provider response normalization (reasoning field\r\n          // renames etc.) so downstream IR emission is uniform.\r\n          chunk = applyProviderResponseQuirks(chunk, provider)\r\n\r\n          // Stream-level usage (present on final chunk for most providers).\r\n          if (chunk.usage) {\r\n            inputTokens = chunk.usage.prompt_tokens ?? inputTokens\r\n            outputTokens = chunk.usage.completion_tokens ?? outputTokens\r\n            reportedCachedInputTokens =\r\n              chunk.usage.prompt_tokens_details?.cached_tokens\r\n              ?? (provider === 'moonshot' ? chunk.usage.cached_tokens : undefined)\r\n              ?? chunk.usage.prompt_cache_hit_tokens\r\n              ?? reportedCachedInputTokens\r\n            cacheWriteTokens =\r\n              provider === 'copilot' || provider === 'openrouter' || provider === 'agentrouter' || provider === 'modelrouter' || provider === 'opencode'\r\n                ? (\r\n                    chunk.usage.prompt_tokens_details?.cache_write_tokens\r\n                    ?? chunk.usage.cache_write_tokens\r\n                    ?? cacheWriteTokens\r\n                  )\r\n                : 0\r\n            reasoningTokens = chunk.usage.completion_tokens_details?.reasoning_tokens ?? reasoningTokens\r\n\r\n            // Some routers forward Anthropic responses verbatim, so the\r\n            // usage block on Claude rows often arrives in Anthropic-native\r\n            // shape: `cache_read_input_tokens` and\r\n            // `cache_creation_input_tokens` are additive (separate from\r\n            // each other and from `prompt_tokens`'s OpenAI total), not\r\n            // the OpenAI subtractive `cached_tokens` (which already\r\n            // includes writes). Without this fold we read 0 for both\r\n            // and surface cache_hit=0% even when upstream is hitting\r\n            // the cache hard \u2014 the smoking gun is the latency drop\r\n            // without the percentage moving. Pure response read; does\r\n            // not touch the outbound request shape.\r\n            //\r\n            // OpenCode Zen also routes Claude rows through Anthropic's\r\n            // native /v1/messages internally, so its usage block on\r\n            // Claude turns matches this same shape \u2014 fold it in.\r\n            if (provider === 'agentrouter' || provider === 'modelrouter' || provider === 'opencode') {\r\n              const arRead = typeof chunk.usage.cache_read_input_tokens === 'number'\r\n                ? chunk.usage.cache_read_input_tokens\r\n                : undefined\r\n              const arWrite = typeof chunk.usage.cache_creation_input_tokens === 'number'\r\n                ? chunk.usage.cache_creation_input_tokens\r\n                : undefined\r\n              if (arRead !== undefined || arWrite !== undefined) {\r\n                // Re-encode into the OpenAI subtractive convention the rest\r\n                // of the lane assumes: cached_total = read + write, and\r\n                // cache_write is its own bucket.\r\n                cacheWriteTokens = arWrite ?? 0\r\n                reportedCachedInputTokens = (arRead ?? 0) + (arWrite ?? 0)\r\n              }\r\n            }\r\n          }\r\n\r\n          const choice = chunk.choices?.[0]\r\n          if (!choice) continue\r\n          const delta = choice.delta ?? {}\r\n\r\n          if (!messageStartEmitted && (delta.content || delta.tool_calls || delta.reasoning_content || delta.thinking)) {\r\n            const mst = emitMessageStart()\r\n            if (mst) yield mst\r\n          }\r\n\r\n          // Reasoning / thinking content. We normalize into a thinking\r\n          // block that claude.ts can render. Providers disagree: some\r\n          // stream reasoning_content (DeepSeek reasoner), some stream\r\n          // reasoning (Groq / OpenRouter), some stream thinking (already\r\n          // normalized).\r\n          const thinkingDelta: string | undefined =\r\n            delta.thinking ?? delta.reasoning_content ?? delta.reasoning\r\n          if (typeof thinkingDelta === 'string' && thinkingDelta.length > 0) {\r\n            emittedAnyAssistantOutput = true\r\n            if (inTextBlock) {\r\n              yield { type: 'content_block_stop', index: currentBlockIndex }\r\n              currentBlockIndex++\r\n              inTextBlock = false\r\n            }\r\n            if (!inThinkingBlock) {\r\n              yield {\r\n                type: 'content_block_start',\r\n                index: currentBlockIndex,\r\n                content_block: { type: 'thinking', thinking: '' },\r\n              }\r\n              inThinkingBlock = true\r\n            }\r\n            yield {\r\n              type: 'content_block_delta',\r\n              index: currentBlockIndex,\r\n              delta: { type: 'thinking_delta', thinking: thinkingDelta },\r\n            }\r\n          }\r\n\r\n          // Text content.\r\n          if (typeof delta.content === 'string' && delta.content.length > 0) {\r\n            emittedAnyAssistantOutput = true\r\n            if (inThinkingBlock) {\r\n              yield { type: 'content_block_stop', index: currentBlockIndex }\r\n              currentBlockIndex++\r\n              inThinkingBlock = false\r\n            }\r\n            if (!inTextBlock) {\r\n              yield {\r\n                type: 'content_block_start',\r\n                index: currentBlockIndex,\r\n                content_block: { type: 'text', text: '' },\r\n              }\r\n              inTextBlock = true\r\n            }\r\n            yield {\r\n              type: 'content_block_delta',\r\n              index: currentBlockIndex,\r\n              delta: { type: 'text_delta', text: delta.content },\r\n            }\r\n          }\r\n\r\n          // Tool-call deltas. OpenAI-style tool_calls arrive piece-by-piece\r\n          // indexed by position. We accumulate args until finish_reason\r\n          // signals completion.\r\n          if (Array.isArray(delta.tool_calls)) {\r\n            if (delta.tool_calls.length > 0) emittedAnyAssistantOutput = true\r\n            for (const tc of delta.tool_calls) {\r\n              const idx = tc.index ?? 0\r\n              let buf = toolCallBuffers.get(idx)\r\n              if (!buf) {\r\n                // Close any currently-open text/thinking block.\r\n                if (inTextBlock || inThinkingBlock) {\r\n                  yield { type: 'content_block_stop', index: currentBlockIndex }\r\n                  currentBlockIndex++\r\n                  inTextBlock = false\r\n                  inThinkingBlock = false\r\n                }\r\n                buf = {\r\n                  id: tc.id ?? `call_${idx}`,\r\n                  name: tc.function?.name ?? '',\r\n                  args: '',\r\n                  anthropicIndex: currentBlockIndex,\r\n                }\r\n                currentBlockIndex++\r\n                toolCallBuffers.set(idx, buf)\r\n                emittedAnyToolUse = true\r\n              }\r\n              if (tc.id) buf.id = tc.id\r\n              if (tc.function?.name) buf.name = tc.function.name\r\n              if (typeof tc.function?.arguments === 'string') buf.args += tc.function.arguments\r\n            }\r\n          }\r\n\r\n          // finish_reason signals completion of this choice's output.\r\n          const finishReason = choice.finish_reason\r\n          if (finishReason) {\r\n            // Close open text / thinking blocks.\r\n            if (inTextBlock || inThinkingBlock) {\r\n              yield { type: 'content_block_stop', index: currentBlockIndex }\r\n              inTextBlock = false\r\n              inThinkingBlock = false\r\n            }\r\n\r\n            // Emit final tool_use blocks with the accumulated arguments.\r\n            for (const buf of toolCallBuffers.values()) {\r\n              const implId = normalizeToolName(buf.name)\r\n              let input: Record<string, unknown>\r\n              try {\r\n                input = buf.args ? JSON.parse(buf.args) : {}\r\n              } catch {\r\n                input = { _raw: buf.args }\r\n              }\r\n              const anthropicToolUseId = buf.id.startsWith('toolu_') ? buf.id : `toolu_compat_${buf.id}`\r\n              // Three-event sequence: start (empty input) + input_json_delta\r\n              // (args as JSON string) + stop. claude.ts's accumulator reads\r\n              // partial_json, not the inline input field \u2014 inline input gets\r\n              // dropped and every tool sees `{}`.\r\n              yield {\r\n                type: 'content_block_start',\r\n                index: buf.anthropicIndex,\r\n                content_block: {\r\n                  type: 'tool_use',\r\n                  id: anthropicToolUseId,\r\n                  name: implId,\r\n                  input: {},\r\n                },\r\n              }\r\n              yield {\r\n                type: 'content_block_delta',\r\n                index: buf.anthropicIndex,\r\n                delta: {\r\n                  type: 'input_json_delta',\r\n                  partial_json: JSON.stringify(input ?? {}),\r\n                },\r\n              }\r\n              yield { type: 'content_block_stop', index: buf.anthropicIndex }\r\n            }\r\n            toolCallBuffers.clear()\r\n          }\r\n        }\r\n\r\n        if (done) break\r\n      }\r\n    } finally {\r\n      reader.releaseLock()\r\n    }\r\n\r\n    if (provider === 'lmstudio' && !emittedAnyAssistantOutput) {\r\n      const fallback = await fetchLmStudioNonStreamingCompletion(cfg, body, model, signal).catch(() => null)\r\n      const textOnlyFallback = !fallback?.text?.trim() && !fallback?.thinking?.trim() && !(fallback?.toolCalls?.length)\r\n        ? await fetchLmStudioNonStreamingCompletion(cfg, body, model, signal, true).catch(() => null)\r\n        : null\r\n      const recovered = textOnlyFallback ?? fallback\r\n      const fallbackText = recovered?.text?.trim()\r\n      const fallbackThinking = recovered?.thinking?.trim()\r\n      const fallbackToolCalls = recovered?.toolCalls ?? []\r\n      if (fallbackText || fallbackThinking || fallbackToolCalls.length > 0) {\r\n        inputTokens = recovered?.usage?.prompt_tokens ?? inputTokens\r\n        outputTokens = recovered?.usage?.completion_tokens ?? outputTokens\r\n        reasoningTokens = recovered?.usage?.completion_tokens_details?.reasoning_tokens ?? reasoningTokens\r\n\r\n        if (!messageStartEmitted) {\r\n          const mst = emitMessageStart()\r\n          if (mst) yield mst\r\n        }\r\n\r\n        if (fallbackThinking) {\r\n          yield {\r\n            type: 'content_block_start',\r\n            index: currentBlockIndex,\r\n            content_block: { type: 'thinking', thinking: '' },\r\n          }\r\n          yield {\r\n            type: 'content_block_delta',\r\n            index: currentBlockIndex,\r\n            delta: { type: 'thinking_delta', thinking: fallbackThinking },\r\n          }\r\n          yield { type: 'content_block_stop', index: currentBlockIndex }\r\n          currentBlockIndex++\r\n        }\r\n\r\n        if (fallbackText) {\r\n          yield {\r\n            type: 'content_block_start',\r\n            index: currentBlockIndex,\r\n            content_block: { type: 'text', text: '' },\r\n          }\r\n          yield {\r\n            type: 'content_block_delta',\r\n            index: currentBlockIndex,\r\n            delta: { type: 'text_delta', text: fallbackText },\r\n          }\r\n          yield { type: 'content_block_stop', index: currentBlockIndex }\r\n          currentBlockIndex++\r\n        }\r\n\r\n        for (const toolCall of fallbackToolCalls) {\r\n          const toolName = toolCall.function?.name\r\n          if (!toolName) continue\r\n          const implId = normalizeToolName(toolName)\r\n          let input: Record<string, unknown>\r\n          try {\r\n            input = toolCall.function?.arguments ? JSON.parse(toolCall.function.arguments) : {}\r\n          } catch {\r\n            input = { _raw: toolCall.function?.arguments ?? '' }\r\n          }\r\n          const toolId = toolCall.id?.startsWith('toolu_') ? toolCall.id : `toolu_compat_${toolCall.id ?? `lmstudio_${currentBlockIndex}`}`\r\n          yield {\r\n            type: 'content_block_start',\r\n            index: currentBlockIndex,\r\n            content_block: {\r\n              type: 'tool_use',\r\n              id: toolId,\r\n              name: implId,\r\n              input: {},\r\n            },\r\n          }\r\n          yield {\r\n            type: 'content_block_delta',\r\n            index: currentBlockIndex,\r\n            delta: {\r\n              type: 'input_json_delta',\r\n              partial_json: JSON.stringify(input ?? {}),\r\n            },\r\n          }\r\n          yield { type: 'content_block_stop', index: currentBlockIndex }\r\n          currentBlockIndex++\r\n          emittedAnyToolUse = true\r\n        }\r\n\r\n        const stopReason: 'tool_use' | 'end_turn' = emittedAnyToolUse ? 'tool_use' : 'end_turn'\r\n        yield {\r\n          type: 'message_delta',\r\n          delta: { stop_reason: stopReason },\r\n          usage: {\r\n            output_tokens: outputTokens,\r\n            input_tokens: inputTokens,\r\n          },\r\n        }\r\n        yield { type: 'message_stop' }\r\n        return blankUsage(inputTokens, outputTokens, cacheReadTokens(), reasoningTokens)\r\n      }\r\n\r\n      if (!signal?.aborted) {\r\n        if (!messageStartEmitted) {\r\n          const mst = emitMessageStart()\r\n          if (mst) yield mst\r\n        }\r\n        const contextMessage = await getLmStudioContextPreflightMessage(cfg, model, body).catch(() => null)\r\n        yield* emitErrorText(contextMessage ?? 'LM Studio returned an empty response. Check LM Studio logs for the selected local model and retry.')\r\n        yield { type: 'message_delta', delta: { stop_reason: 'end_turn' }, usage: { output_tokens: outputTokens } }\r\n        yield { type: 'message_stop' }\r\n        return blankUsage(inputTokens, outputTokens, cacheReadTokens(), reasoningTokens)\r\n      }\r\n    }\r\n\r\n    if (!messageStartEmitted) {\r\n      const mst = emitMessageStart()\r\n      if (mst) yield mst\r\n    }\r\n\r\n    const stopReason: 'tool_use' | 'end_turn' = emittedAnyToolUse ? 'tool_use' : 'end_turn'\r\n    yield {\r\n      type: 'message_delta',\r\n      delta: { stop_reason: stopReason },\r\n      usage: {\r\n        output_tokens: outputTokens,\r\n        // OpenAI-style `prompt_tokens` is total (fresh + cached). Split\r\n        // into fresh + cache_read to match Anthropic's additive buckets.\r\n        input_tokens: Math.max(0, inputTokens - cacheReadTokens() - cacheWriteTokens),\r\n        ...(cacheReadTokens() > 0 && { cache_read_input_tokens: cacheReadTokens() }),\r\n        ...(cacheWriteTokens > 0 && { cache_creation_input_tokens: cacheWriteTokens }),\r\n      },\r\n    }\r\n    yield { type: 'message_stop' }\r\n\r\n    return {\r\n      input_tokens: inputTokens,\r\n      output_tokens: outputTokens,\r\n      cache_read_tokens: cacheReadTokens(),\r\n      cache_write_tokens: cacheWriteTokens,\r\n      thinking_tokens: reasoningTokens,\r\n    }\r\n  }\r\n\r\n  // \u2500\u2500 Lane-owns-loop (Phase-2, not wired yet) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n  async *run(_context: LaneRunContext): AsyncGenerator<AnthropicStreamEvent, LaneRunResult> {\r\n    throw new Error('OpenAICompatLane.run (lane-owns-loop) is not wired yet \u2014 use streamAsProvider via LaneBackedProvider.')\r\n  }\r\n\r\n  async listModels(providerFilter?: string): Promise<ModelInfo[]> {\r\n    // Query /v1/models on every configured provider in parallel, cache\r\n    // per-provider for 5 minutes. Errors on individual providers don't\r\n    // block the rest \u2014 a slow Ollama install shouldn't delay Groq's list.\r\n    //\r\n    // When `providerFilter` is given, only that sub-provider is queried\r\n    // and returned, so /models groq only shows Groq models (not the\r\n    // union of every compat provider's catalog).\r\n    const now = Date.now()\r\n    const cacheKey = providerFilter ?? '__all__'\r\n    const cached = _modelsCacheByProvider.get(cacheKey)\r\n    if (cached && now - cached.at < MODELS_CACHE_TTL_MS) {\r\n      return cached.models\r\n    }\r\n    const entries = Array.from(this.configs.entries())\r\n      .filter(([name]) => !providerFilter || name === providerFilter)\r\n    const results = await Promise.allSettled(entries.map(async ([providerName, cfg]) => {\r\n      if (providerName === 'lmstudio') {\r\n        const openAIModels = await listLmStudioOpenAIModels(cfg)\r\n        if (openAIModels.length > 0) return openAIModels\r\n        const nativeModels = await listLmStudioNativeModels(cfg)\r\n        if (nativeModels.length > 0) return nativeModels\r\n      }\r\n\r\n      const transformer = getTransformer(providerName as ProviderId)\r\n      // Most compat providers either want a fully-curated catalog or a\r\n      // direct pass-through from `/models`. Copilot is the main exception:\r\n      // its live catalog changes often enough that we want fresh data, but\r\n      // still need a fallback when `/models` is unavailable.\r\n      const fixed = transformer.staticCatalog?.() ?? []\r\n      const preferLiveCatalog = transformer.preferLiveModelCatalog?.() ?? false\r\n      if (!preferLiveCatalog && fixed.length > 0) return fixed\r\n      try {\r\n        const url = `${normalizeBaseUrl(cfg.baseUrl)}/models`\r\n        const headers: Record<string, string> = { 'Accept': 'application/json' }\r\n        if (cfg.apiKey) headers['Authorization'] = `Bearer ${cfg.apiKey}`\r\n        const extra = transformer.buildHeaders?.(cfg.apiKey) ?? {}\r\n        for (const [k, v] of Object.entries(extra)) {\r\n          // Reuse provider-specific auth/catalog headers (e.g. Copilot's\r\n          // editor-version / integration-id) but keep the GET request's\r\n          // Accept as JSON rather than the streaming default.\r\n          if (k.toLowerCase() === 'accept') continue\r\n          headers[k] = v\r\n        }\r\n        const resp = await fetch(url, { headers, method: 'GET' })\r\n        if (resp.ok) {\r\n          const data = await resp.json() as { data?: CompatCatalogModel[] }\r\n          const raw = (data.data ?? [])\r\n            .map(m => toCompatCatalogModel(providerName, m))\r\n            .filter((model): model is ModelInfo => model !== null)\r\n          // Per-provider catalog filter: e.g. Groq hides whisper/preview\r\n          // models so `/models` only shows chat-capable production IDs.\r\n          const filtered = (transformer.filterModelCatalog?.(raw) ?? raw) as ModelInfo[]\r\n          const visible = providerName === 'opencode' && cfg.apiKey === 'public'\r\n            ? filtered.filter(isOpencodeAnonymousCatalogModel)\r\n            : filtered\r\n          if (visible.length > 0) return visible\r\n        }\r\n      } catch {\r\n        // Fall back to the curated list below.\r\n      }\r\n      return fixed\r\n    }))\r\n    const out: ModelInfo[] = []\r\n    for (const r of results) {\r\n      if (r.status !== 'fulfilled') continue\r\n      // filterModelCatalog declares `name?: string` so the union with\r\n      // staticCatalog widens; backfill from id when the upstream omitted it.\r\n      for (const m of r.value) out.push({ ...m, name: m.name ?? m.id })\r\n    }\r\n    const hasIncompleteLmStudioContext =\r\n      providerFilter === 'lmstudio'\r\n      && out.length > 0\r\n      && out.some(model => typeof model.contextWindow !== 'number' || model.contextWindow <= 0)\r\n    if (!hasIncompleteLmStudioContext) {\r\n      _modelsCacheByProvider.set(cacheKey, { models: out, at: now })\r\n    }\r\n    return out\r\n  }\r\n\r\n  resolveModel(model: string): string {\r\n    return model\r\n  }\r\n\r\n  smallFastModel(): string | null {\r\n    // Compat lane: no universal fast model \u2014 provider-specific hints\r\n    // live in each transformer. The caller passes the currently-\r\n    // configured model to resolveSmallFastModel() below to get a\r\n    // provider-appropriate fast model when present.\r\n    return null\r\n  }\r\n\r\n  isHealthy(): boolean {\r\n    return this._healthy\r\n  }\r\n\r\n  setHealthy(healthy: boolean): void {\r\n    this._healthy = healthy\r\n  }\r\n\r\n  dispose(): void {}\r\n}\r\n\r\nfunction isOpencodeAnonymousCatalogModel(model: ModelInfo): boolean {\r\n  return isOpencodeAnonymousModelId(model.id)\r\n    || model.tags?.some(tag => tag.toLowerCase() === 'free') === true\r\n}\r\n\r\nfunction isOpencodeAnonymousModelId(id: string): boolean {\r\n  const normalized = id.toLowerCase()\r\n  return normalized.endsWith('-free')\r\n    || normalized === 'big-pickle'\r\n    || normalized === 'gpt-5-nano'\r\n    || normalized === 'gpt-5.4-nano'\r\n}\r\n\r\nfunction toCompatCatalogModel(\r\n  providerName: string,\r\n  model: CompatCatalogModel,\r\n): ModelInfo | null {\r\n  if (providerName === 'openrouter') {\r\n    return toOpenRouterModelInfo(model)\r\n  }\r\n\r\n  if (providerName === 'mistral') {\r\n    return toMistralCatalogModel(model)\r\n  }\r\n\r\n  if (typeof model.id !== 'string' || model.id.length === 0) {\r\n    return null\r\n  }\r\n\r\n  if (typeof model.api === 'string' && model.api.length > 0 && model.api.toLowerCase() !== 'chat') {\r\n    return null\r\n  }\r\n\r\n  if (!isTextGenerationCatalogType(model.type)) {\r\n    return null\r\n  }\r\n\r\n  const tags = normalizeCompatCatalogTags(model)\r\n  if (providerName === 'opencode' && isOpencodeAnonymousModelId(model.id) && !tags.includes('free')) {\r\n    tags.push('free')\r\n  }\r\n  const provider =\r\n    typeof model.owned_by === 'string'\r\n    && model.owned_by.length > 0\r\n    && model.owned_by.toLowerCase() !== 'system'\r\n      ? model.owned_by\r\n      : undefined\r\n  const contextWindow =\r\n    model.context_length\r\n    ?? model.context_window\r\n    ?? model.max_context_length\r\n\r\n  return {\r\n    id: model.id,\r\n    name: typeof model.name === 'string' && model.name.length > 0\r\n      ? model.name\r\n      : model.id,\r\n    contextWindow,\r\n    ...(provider ? { provider } : {}),\r\n    ...(tags.length > 0 ? { tags } : {}),\r\n    ...(model.supports_tool_calling === true || model.capabilities?.function_calling === true\r\n      ? { supportsToolCalling: true }\r\n      : {}),\r\n  }\r\n}\r\n\r\nfunction isTextGenerationCatalogType(type: string | undefined): boolean {\r\n  if (!type) return true\r\n  const normalized = type.toLowerCase()\r\n  return normalized === 'language' || normalized === 'text' || normalized === 'chat'\r\n}\r\n\r\nfunction normalizeCompatCatalogTags(model: CompatCatalogModel): string[] {\r\n  const tags = new Set<string>()\r\n  for (const tag of model.tags ?? []) {\r\n    if (typeof tag === 'string' && tag.length > 0) tags.add(tag)\r\n  }\r\n  if (model.supports_tool_calling === true || model.capabilities?.function_calling === true) {\r\n    tags.add('tools')\r\n  }\r\n  if (model.supports_reasoning === true || tags.has('reasoning')) {\r\n    tags.add('reasoning')\r\n  }\r\n  if (model.supports_vision === true || model.capabilities?.vision === true || tags.has('vision')) {\r\n    tags.add('vision')\r\n  }\r\n  if (model.supports_caching === true || tags.has('implicit-caching') || tags.has('explicit-caching')) {\r\n    tags.add('caching')\r\n  }\r\n  return [...tags]\r\n}\r\n\r\n// \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n// \u2500\u2500\u2500 Per-lane /v1/models cache \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n// Keyed by provider filter so `/models groq` doesn't share state with\r\n// `/models openrouter`. Unfiltered calls use the `__all__` key.\r\n\r\nconst _modelsCacheByProvider = new Map<string, { models: ModelInfo[]; at: number }>()\r\nconst MODELS_CACHE_TTL_MS = 5 * 60_000\r\n\r\n/**\r\n * Resolve a small/fast model for a given main-loop model by delegating\r\n * to the appropriate transformer. Exported so session-title /\r\n * tool-use-summary callers can request the cheaper model per-provider.\r\n */\r\nexport function resolveCompatSmallFastModel(\r\n  provider: ProviderType,\r\n  model: string,\r\n): string | null {\r\n  return getTransformer(provider as ProviderId).smallFastModel(model)\r\n}\r\n\r\nfunction blankUsage(i: number, o: number, c: number, r: number): NormalizedUsage {\r\n  return {\r\n    input_tokens: i,\r\n    output_tokens: o,\r\n    cache_read_tokens: c,\r\n    cache_write_tokens: 0,\r\n    thinking_tokens: r,\r\n  }\r\n}\r\n\r\nfunction* emitErrorText(text: string): Generator<AnthropicStreamEvent> {\r\n  yield { type: 'content_block_start', index: 0, content_block: { type: 'text', text: '' } }\r\n  yield { type: 'content_block_delta', index: 0, delta: { type: 'text_delta', text } }\r\n  yield { type: 'content_block_stop', index: 0 }\r\n}\r\n\r\ninterface ProviderErrorPayload {\r\n  code?: string\r\n  message?: string\r\n}\r\n\r\nfunction formatProviderHttpError(\r\n  provider: ProviderType,\r\n  status: number,\r\n  errText: string,\r\n  isPromptTooLong: boolean,\r\n): string {\r\n  if (provider === 'glm') {\r\n    return formatGlmHttpError(status, errText, isPromptTooLong)\r\n  }\r\n  if (provider === 'opencode' && status === 429 && errText.includes('FreeUsageLimitError')) {\r\n    // FreeUsageLimitError comes from the gateway's IP-based anonymous\r\n    // limiter for allowAnonymous=true models (big-pickle, *-free rows,\r\n    // gpt-5-nano). A real API key only changes quota when the user also\r\n    // switches to a non-anonymous paid model.\r\n    return [\r\n      'opencode API error 429: This is the IP-based daily limit for OpenCode Zen anonymous/free models',\r\n      '(big-pickle, *-free rows, gpt-5-nano). Use a real OPENCODE_API_KEY and switch to a paid model in /models opencode',\r\n      '(e.g. claude-opus-4-7, claude-sonnet-4-6, gpt-5.4, gemini-3.1-pro, glm-5.1, kimi-k2.5)',\r\n      `to use your API-key quota instead. Raw: ${errText.slice(0, 200)}`,\r\n    ].join(' ')\r\n  }\r\n  const headline = isPromptTooLong\r\n    ? `Prompt is too long (${provider} ${status})`\r\n    : `${provider} API error ${status}`\r\n  return `${headline}: ${errText.slice(0, 500)}`\r\n}\r\n\r\nfunction formatGlmHttpError(\r\n  status: number,\r\n  errText: string,\r\n  isPromptTooLong: boolean,\r\n): string {\r\n  if (isPromptTooLong) {\r\n    return `Prompt is too long (glm ${status})`\r\n  }\r\n\r\n  const parsed = parseProviderErrorPayload(errText)\r\n  const code = parsed?.code\r\n  const detail = parsed?.message ?? errText.trim()\r\n  const isInsufficientBalance =\r\n    status === 429 &&\r\n    (code === '1113' ||\r\n      /\u4F59\u989D\u4E0D\u8DB3|\u65E0\u53EF\u7528\u8D44\u6E90\u5305|\u8BF7\u5145\u503C|\\binsufficient\\b|\\bbalance\\b|\\bquota\\b|\\bresource package\\b/i.test(\r\n        detail,\r\n      ))\r\n\r\n  if (isInsufficientBalance) {\r\n    return [\r\n      `glm API error ${status}: BigModel balance is insufficient or no resource package is available.`,\r\n      'Open /usage for BigModel links, recharge the account, or switch provider/model with /models.',\r\n    ].join(' ')\r\n  }\r\n\r\n  const suffix = code ? ` (${code})` : ''\r\n  const text = detail || errText\r\n  return `glm API error ${status}${suffix}: ${text.slice(0, 500)}`\r\n}\r\n\r\nfunction parseProviderErrorPayload(raw: string): ProviderErrorPayload | null {\r\n  try {\r\n    const value = JSON.parse(raw) as unknown\r\n    if (!value || typeof value !== 'object') return null\r\n    const root = value as Record<string, unknown>\r\n    const error =\r\n      root.error && typeof root.error === 'object'\r\n        ? root.error as Record<string, unknown>\r\n        : root\r\n    const code = error.code\r\n    const message = error.message\r\n    return {\r\n      code: typeof code === 'string' || typeof code === 'number' ? String(code) : undefined,\r\n      message: typeof message === 'string' ? message : undefined,\r\n    }\r\n  } catch {\r\n    return null\r\n  }\r\n}\r\n\r\nfunction toMistralCatalogModel(model: CompatCatalogModel): ModelInfo | null {\r\n  if (typeof model.id !== 'string' || model.id.length === 0) {\r\n    return null\r\n  }\r\n\r\n  const capabilities = model.capabilities\r\n  if (capabilities?.completion_chat === false) {\r\n    return null\r\n  }\r\n\r\n  const tags: string[] = []\r\n  if (capabilities?.function_calling === true) tags.push('tools')\r\n  if (isMistralReasoningModelId(model.id)) tags.push('reasoning')\r\n\r\n  return {\r\n    id: model.id,\r\n    name: typeof model.name === 'string' && model.name.length > 0\r\n      ? model.name\r\n      : model.id,\r\n    contextWindow: model.max_context_length ?? model.context_length,\r\n    supportsToolCalling: capabilities?.function_calling,\r\n    tags: tags.length > 0 ? tags : undefined,\r\n    ...(typeof model.owned_by === 'string' && model.owned_by.length > 0\r\n      ? { provider: model.owned_by }\r\n      : { provider: 'Mistral' }),\r\n  }\r\n}\r\n\r\nfunction isMistralReasoningModelId(modelId: string): boolean {\r\n  const m = modelId.toLowerCase()\r\n  return (\r\n    m.includes('magistral') ||\r\n    m.startsWith('mistral-small') ||\r\n    m === 'mistral-medium-3-5' ||\r\n    m === 'mistral-medium-latest'\r\n  )\r\n}\r\n\r\nasync function listLmStudioNativeModels(\r\n  cfg: { apiKey: string; baseUrl: string },\r\n): Promise<LmStudioModelInfo[]> {\r\n  const url = `${lmStudioServerRoot(cfg.baseUrl)}/api/v1/models`\r\n  const headers: Record<string, string> = { Accept: 'application/json' }\r\n  if (cfg.apiKey) headers.Authorization = `Bearer ${cfg.apiKey}`\r\n\r\n  for (let attempt = 0; attempt < 2; attempt += 1) {\r\n    const controller = new AbortController()\r\n    const timeout = setTimeout(() => controller.abort(), 5_000)\r\n    try {\r\n      const resp = await fetch(url, { headers, method: 'GET', signal: controller.signal })\r\n      if (!resp.ok) continue\r\n      const data = await resp.json() as { models?: LmStudioNativeModel[] }\r\n      const models = (data.models ?? [])\r\n        .map(toLmStudioNativeModelInfo)\r\n        .filter((model): model is LmStudioModelInfo => model !== null)\r\n      if (models.length > 0) {\r\n        recordProviderModelContextWindows('lmstudio', models)\r\n        return models\r\n      }\r\n    } catch {\r\n      // Retry once. LM Studio can briefly reject metadata requests while\r\n      // loading or swapping a local model.\r\n    } finally {\r\n      clearTimeout(timeout)\r\n    }\r\n  }\r\n  return []\r\n}\r\n\r\nasync function getLmStudioContextPreflightMessage(\r\n  cfg: { apiKey: string; baseUrl: string },\r\n  model: string,\r\n  body: OpenAIChatRequest,\r\n): Promise<string | null> {\r\n  const info = await getLmStudioModelInfo(cfg, model)\r\n  const loadedContextWindow = info?.lmStudioLoadedContextWindow\r\n  if (!loadedContextWindow || loadedContextWindow <= 0) return null\r\n\r\n  const estimatedInputTokens = estimateOpenAICompatRequestTokens(body)\r\n  if (estimatedInputTokens < loadedContextWindow) return null\r\n\r\n  const maxContextWindow = info.lmStudioMaxContextWindow ?? info.contextWindow\r\n  const suggestedContextWindow = maxContextWindow\r\n    ? Math.min(\r\n        maxContextWindow,\r\n        roundUpToMultiple(estimatedInputTokens + 4096, 8192),\r\n      )\r\n    : undefined\r\n  const reloadHint = suggestedContextWindow && suggestedContextWindow > loadedContextWindow\r\n    ? ` Reload it with a larger context, for example: lms unload \"${model}\"; lms load \"${model}\" -c ${suggestedContextWindow} -y --identifier \"${model}\".`\r\n    : ''\r\n\r\n  return `LM Studio has \"${model}\" loaded with ${formatTokenCount(loadedContextWindow)} context tokens, but Tau's agent request is about ${formatTokenCount(estimatedInputTokens)} tokens before generation. LM Studio can return an empty response in that state.${maxContextWindow ? ` This model reports up to ${formatTokenCount(maxContextWindow)} tokens available.` : ''}${reloadHint}`\r\n}\r\n\r\nasync function getLmStudioModelInfo(\r\n  cfg: { apiKey: string; baseUrl: string },\r\n  modelId: string,\r\n): Promise<LmStudioModelInfo | null> {\r\n  const models = await listLmStudioNativeModels(cfg)\r\n  const byId = new Map<string, LmStudioModelInfo>()\r\n  for (const model of models) {\r\n    byId.set(model.id, model)\r\n    for (const alias of model.lmStudioAliases ?? []) byId.set(alias, model)\r\n  }\r\n  return byId.get(modelId) ?? null\r\n}\r\n\r\nfunction estimateOpenAICompatRequestTokens(body: OpenAIChatRequest): number {\r\n  const messageChars = JSON.stringify(body.messages).length\r\n  const toolChars = body.tools ? JSON.stringify(body.tools).length : 0\r\n  return Math.ceil((messageChars + toolChars) / 4)\r\n}\r\n\r\nfunction roundUpToMultiple(value: number, multiple: number): number {\r\n  return Math.ceil(value / multiple) * multiple\r\n}\r\n\r\nfunction formatTokenCount(value: number): string {\r\n  return Math.round(value).toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',')\r\n}\r\n\r\nasync function fetchLmStudioNonStreamingCompletion(\r\n  cfg: { apiKey: string; baseUrl: string },\r\n  body: OpenAIChatRequest,\r\n  model: string,\r\n  signal?: AbortSignal,\r\n  textOnly = false,\r\n): Promise<{\r\n  text?: string\r\n  thinking?: string\r\n  toolCalls?: NonNullable<OpenAIChatMessage['tool_calls']>\r\n  usage?: {\r\n    prompt_tokens?: number\r\n    completion_tokens?: number\r\n    completion_tokens_details?: { reasoning_tokens?: number }\r\n  }\r\n} | null> {\r\n  const headers = buildRequestHeaders('lmstudio', cfg.apiKey, model)\r\n  const fallbackBody: OpenAIChatRequest = { ...body, stream: false }\r\n  delete fallbackBody.stream_options\r\n  if (textOnly) {\r\n    delete fallbackBody.tools\r\n    fallbackBody.tool_choice = 'none'\r\n  }\r\n  fallbackBody.thinking = { type: 'disabled' }\r\n\r\n  const resp = await fetch(`${normalizeBaseUrl(cfg.baseUrl)}/chat/completions`, {\r\n    method: 'POST',\r\n    headers,\r\n    body: JSON.stringify(fallbackBody),\r\n    signal,\r\n  })\r\n  if (!resp.ok) return null\r\n\r\n  const data = await resp.json() as {\r\n    choices?: Array<{\r\n      message?: {\r\n        content?: string | null\r\n        reasoning_content?: string\r\n        reasoning?: string\r\n        thinking?: string\r\n        tool_calls?: NonNullable<OpenAIChatMessage['tool_calls']>\r\n      }\r\n    }>\r\n    usage?: {\r\n      prompt_tokens?: number\r\n      completion_tokens?: number\r\n      completion_tokens_details?: { reasoning_tokens?: number }\r\n    }\r\n  }\r\n  const message = data.choices?.[0]?.message\r\n  if (!message) return null\r\n  return {\r\n    text: typeof message.content === 'string' ? message.content : undefined,\r\n    thinking: message.thinking ?? message.reasoning_content ?? message.reasoning,\r\n    toolCalls: message.tool_calls,\r\n    usage: data.usage,\r\n  }\r\n}\r\n\r\nasync function listLmStudioOpenAIModels(\r\n  cfg: { apiKey: string; baseUrl: string },\r\n): Promise<ModelInfo[]> {\r\n  try {\r\n    const headers: Record<string, string> = { Accept: 'application/json' }\r\n    if (cfg.apiKey) headers.Authorization = `Bearer ${cfg.apiKey}`\r\n    const resp = await fetch(`${normalizeBaseUrl(cfg.baseUrl)}/models`, {\r\n      headers,\r\n      method: 'GET',\r\n    })\r\n    if (!resp.ok) return []\r\n    const data = await resp.json() as { data?: CompatCatalogModel[] }\r\n    const openAIModels = (data.data ?? [])\r\n      .map(model => toCompatCatalogModel('lmstudio', model))\r\n      .filter((model): model is ModelInfo => model !== null)\r\n      .filter(model => !looksLikeEmbeddingModel(model.id))\r\n\r\n    const nativeModels = await listLmStudioNativeModels(cfg)\r\n    if (nativeModels.length === 0) return openAIModels\r\n\r\n    const nativeById = new Map<string, ModelInfo>()\r\n    for (const model of nativeModels) {\r\n      nativeById.set(model.id, model)\r\n      const variantIds = (model as ModelInfo & { lmStudioAliases?: string[] }).lmStudioAliases ?? []\r\n      for (const alias of variantIds) nativeById.set(alias, model)\r\n    }\r\n    const enriched = openAIModels\r\n      .filter(model => nativeById.has(model.id))\r\n      .map(model => {\r\n        const native = nativeById.get(model.id)\r\n        return {\r\n          ...model,\r\n          ...(native ?? {}),\r\n          id: model.id,\r\n        }\r\n      })\r\n    return enriched.length > 0 ? enriched : openAIModels\r\n  } catch {\r\n    return []\r\n  }\r\n}\r\n\r\nfunction toLmStudioNativeModelInfo(model: LmStudioNativeModel): LmStudioModelInfo | null {\r\n  if (model.type && model.type !== 'llm') return null\r\n  if (typeof model.key !== 'string' || model.key.length === 0) return null\r\n\r\n  const loaded =\r\n    model.loaded_instances?.find(instance =>\r\n      instance.id === model.key || instance.id?.startsWith(`${model.key}@`),\r\n    )\r\n    ?? model.loaded_instances?.[0]\r\n  const contextWindow =\r\n    model.max_context_length\r\n    ?? model.context_length\r\n    ?? loaded?.config?.context_length\r\n    ?? undefined\r\n  const loadedContextWindow = loaded?.config?.context_length\r\n  const aliases = [\r\n    ...(model.selected_variant ? [model.selected_variant] : []),\r\n    ...(model.variants ?? []),\r\n    ...(model.loaded_instances ?? []).map(instance => instance.id).filter((id): id is string => typeof id === 'string' && id.length > 0),\r\n  ]\r\n\r\n  return {\r\n    id: model.key,\r\n    name: typeof model.display_name === 'string' && model.display_name.length > 0\r\n      ? model.display_name\r\n      : model.key,\r\n    ...(contextWindow ? { contextWindow } : {}),\r\n    ...(loadedContextWindow ? { lmStudioLoadedContextWindow: loadedContextWindow } : {}),\r\n    ...(model.max_context_length ? { lmStudioMaxContextWindow: model.max_context_length } : {}),\r\n    ...(typeof model.capabilities?.trained_for_tool_use === 'boolean'\r\n      ? { supportsToolCalling: model.capabilities.trained_for_tool_use }\r\n      : {}),\r\n    ...(aliases.length > 0 ? { lmStudioAliases: aliases } : {}),\r\n    provider: 'LM Studio',\r\n  }\r\n}\r\n\r\nfunction looksLikeEmbeddingModel(modelId: string): boolean {\r\n  const normalized = modelId.toLowerCase()\r\n  return normalized.includes('embedding') || normalized.includes('embed')\r\n}\r\n\r\nfunction lmStudioServerRoot(baseUrl: string): string {\r\n  return normalizeBaseUrl(baseUrl).replace(/\\/(?:api\\/)?v1$/i, '')\r\n}\r\n\r\nfunction normalizeBaseUrl(baseUrl: string): string {\r\n  return baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl\r\n}\r\n\r\nfunction buildRequestHeaders(\r\n  provider: ProviderType,\r\n  apiKey: string,\r\n  model: string,\r\n  sessionId?: string,\r\n): Record<string, string> {\r\n  const headers: Record<string, string> = {\r\n    'Content-Type': 'application/json',\r\n    'Accept': 'text/event-stream',\r\n  }\r\n  if (apiKey) headers['Authorization'] = `Bearer ${apiKey}`\r\n  // Delegate provider-specific header additions (e.g. OpenRouter's\r\n  // HTTP-Referer) to the transformer. Adding a new provider = one\r\n  // buildHeaders() method in its transformer file.\r\n  const transformer = getTransformer(provider as ProviderId)\r\n  const extra = transformer.buildHeaders?.(apiKey, { model, sessionId }) ?? {}\r\n  for (const [k, v] of Object.entries(extra)) headers[k] = v\r\n  return headers\r\n}\r\n\r\nfunction normalizeToolName(rawName: string): string {\r\n  // Tool name arrives as whatever the model called. If it matches a native\r\n  // entry in the registry, map to shared impl id. Otherwise pass through.\r\n  const reg = OPENAI_COMPAT_TOOL_REGISTRY.find(r => r.nativeName === rawName)\r\n  return reg?.implId ?? rawName\r\n}\r\n\r\nfunction clampMaxTokens(provider: ProviderType, requested: number): number {\r\n  // Per-provider ceilings live in each transformer (e.g. DeepSeek 8192).\r\n  return getTransformer(provider as ProviderId).clampMaxTokens(requested)\r\n}\r\n\r\n// \u2500\u2500\u2500 Per-Provider Request Quirks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n//\r\n// Consolidates the transformations the reference transformers do. Each\r\n// quirk has a brief comment explaining *why* (usually: a specific error\r\n// the provider returns on non-compliant requests).\r\n\r\nfunction applyProviderRequestQuirks(\r\n  body: OpenAIChatRequest,\r\n  provider: ProviderType,\r\n  thinking: LaneProviderCallParams['thinking'] | undefined,\r\n  sessionId?: string,\r\n): OpenAIChatRequest {\r\n  const transformer = getTransformer(provider as ProviderId)\r\n  const isReasoning = !!(thinking && thinking.type !== 'disabled')\r\n  const effort = resolveReasoningEffort(thinking) ?? null\r\n\r\n  // Cache-control placement per-transformer: strip when the provider\r\n  // doesn't honor it (DeepSeek, Groq, Mistral, NIM, Ollama, generic);\r\n  // pass through for OpenRouter (its upstream relocates for Anthropic\r\n  // cap compliance automatically).\r\n  const cacheMode = transformer.cacheControlMode(body.model)\r\n  if (cacheMode === 'none') {\r\n    body.messages = body.messages.map(stripCacheControlFromMessage)\r\n  } else if (cacheMode === 'last-only') {\r\n    // Apply Anthropic's 4-breakpoint rolling cache (one for system, two\r\n    // for the trailing user/tool messages). Without this OpenRouter ships\r\n    // a request without a single cache_control marker, Anthropic upstream\r\n    // never sees the prefix anchor, and every turn is billed as a cold\r\n    // write \u2014 the user-visible \"unstable cache hit\" symptom. After the\r\n    // cold write, the system breakpoint anchors a deep read and the two\r\n    // rolling user breakpoints extend it to the latest tool result, so\r\n    // subsequent turns hit ~100% of the prefix.\r\n    applyLastOnlyCacheBreakpoints(body.messages)\r\n  }\r\n\r\n  // Let the transformer apply its provider-specific quirks. Every\r\n  // provider implements this; adding a new one = one new file.\r\n  transformer.transformRequest(body, {\r\n    model: body.model,\r\n    isReasoning,\r\n    reasoningEffort: effort,\r\n    sessionId,\r\n  })\r\n\r\n  // Per-model default generation params (Qwen 0.55, Kimi-k2 0.6,\r\n  // MiniMax 1.0, Gemini-via-OR 1.0/0.95/64, \u2026). Mirrors opencode's\r\n  // temperature/topP/topK helpers in provider/transform.ts. ONLY\r\n  // applied when the caller passed undefined \u2014 explicit values from\r\n  // claude.ts / frontier defaults always win.\r\n  const defaults = transformer.defaultGenerationParams?.(body.model)\r\n  if (defaults) {\r\n    if (body.temperature === undefined && defaults.temperature !== undefined) {\r\n      body.temperature = defaults.temperature\r\n    }\r\n    if (body.top_p === undefined && defaults.top_p !== undefined) {\r\n      body.top_p = defaults.top_p\r\n    }\r\n    if (defaults.top_k !== undefined) {\r\n      // top_k isn't part of the OpenAI Chat Completions shape; ride\r\n      // along via extra_body so DashScope / OpenRouter / Vercel\r\n      // gateways that accept it forward it to the upstream. Providers\r\n      // that don't recognize it ignore the field. Skip the override if\r\n      // the caller already populated extra_body.top_k.\r\n      const bag = body as unknown as Record<string, any>\r\n      bag.extra_body = bag.extra_body ?? {}\r\n      if (bag.extra_body.top_k === undefined) bag.extra_body.top_k = defaults.top_k\r\n    }\r\n  }\r\n\r\n  // Groq rejects null-valued `function_call` on assistant messages;\r\n  // always strip null tool_calls regardless of provider (the cost of\r\n  // doing it uniformly is < 1ms, the risk of missing it per-provider\r\n  // is a subtle 400 on certain replay flows).\r\n  body.messages = body.messages.map(stripNullToolCall)\r\n\r\n  // Remove undefined fields \u2014 many providers 400 on explicit `null` on\r\n  // optional fields they don't recognize.\r\n  const bag = body as unknown as Record<string, unknown>\r\n  for (const k of Object.keys(bag)) {\r\n    if (bag[k] === undefined) delete bag[k]\r\n  }\r\n\r\n  return body\r\n}\r\n\r\nfunction resolveReasoningEffort(\r\n  thinking: LaneProviderCallParams['thinking'] | undefined,\r\n): 'low' | 'medium' | 'high' | undefined {\r\n  if (!thinking || thinking.type === 'disabled') return undefined\r\n  if (thinking.type === 'adaptive') return 'medium'\r\n  const budget = (thinking as any).budget_tokens as number | undefined\r\n  if (budget == null) return 'medium'\r\n  if (budget < 2000) return 'low'\r\n  if (budget < 8000) return 'medium'\r\n  return 'high'\r\n}\r\n\r\nfunction stripCacheControlFromMessage(m: OpenAIChatMessage): OpenAIChatMessage {\r\n  if (!m.content || typeof m.content === 'string') return m\r\n  const cleanedContent = m.content.map(part => {\r\n    if (typeof part !== 'object' || part === null) return part\r\n    const { cache_control: _cc, ...rest } = part as any\r\n    return rest\r\n  })\r\n  return { ...m, content: cleanedContent as any }\r\n}\r\n\r\n/**\r\n * Anthropic-via-OpenRouter rolling cache: stamp ephemeral cache_control on\r\n * the last text block of the system message and the last two non-system\r\n * user/tool messages. Mirrors the Kilo lane's _applyCacheBreakpoints and\r\n * the strategy native Kilo CLI uses (`slice(-2)` rolling).\r\n *\r\n * Three breakpoints (system + 2 trailing) is the sweet spot for\r\n * Anthropic's 4-breakpoint cap: turn N's trailing breakpoint becomes\r\n * turn N+1's deep cache anchor, so the cached prefix walks forward\r\n * with the conversation instead of resetting to the system block. The\r\n * fourth breakpoint is intentionally left unused so OpenRouter has\r\n * headroom if it inserts its own (it doesn't today, but nothing in the\r\n * docs guarantees it won't).\r\n *\r\n * String content gets promoted to a single-element parts array so the\r\n * marker has somewhere to land. Empty tool results fall back to ' ' so\r\n * the part is well-formed without altering visible prompt content.\r\n *\r\n * Idempotent: existing markers are left untouched, so a SystemBlock that\r\n * arrived with cache_control already set isn't re-stamped.\r\n */\r\nfunction applyLastOnlyCacheBreakpoints(messages: OpenAIChatMessage[]): void {\r\n  const stampLast = (parts: Array<{ type: string; text?: string; cache_control?: { type: string } }>): void => {\r\n    if (parts.length === 0) return\r\n    const last = parts[parts.length - 1]\r\n    if (last && last.type === 'text' && !last.cache_control) {\r\n      last.cache_control = { type: 'ephemeral' }\r\n    }\r\n  }\r\n\r\n  const stampTrailing = (m: OpenAIChatMessage): void => {\r\n    if (typeof m.content === 'string') {\r\n      const text = m.content\r\n      m.content = [\r\n        { type: 'text', text: text.length > 0 ? text : ' ', cache_control: { type: 'ephemeral' } },\r\n      ]\r\n    } else if (Array.isArray(m.content) && m.content.length > 0) {\r\n      stampLast(m.content as any)\r\n    }\r\n  }\r\n\r\n  // 1. System breakpoint \u2014 anchors the whole system-prompt-plus-tools prefix.\r\n  const sys = messages.find((m) => m.role === 'system')\r\n  if (sys) {\r\n    if (typeof sys.content === 'string' && sys.content.length > 0) {\r\n      sys.content = [{ type: 'text', text: sys.content, cache_control: { type: 'ephemeral' } }]\r\n    } else if (Array.isArray(sys.content)) {\r\n      stampLast(sys.content as any)\r\n    }\r\n  }\r\n\r\n  // 2 & 3. Last TWO non-system user/tool breakpoints \u2014 rolling cache.\r\n  let stamped = 0\r\n  for (let i = messages.length - 1; i >= 0 && stamped < 2; i--) {\r\n    const m = messages[i]!\r\n    if (m.role !== 'user' && m.role !== 'tool') continue\r\n    stampTrailing(m)\r\n    stamped++\r\n  }\r\n}\r\n\r\nfunction stripNullToolCall(m: OpenAIChatMessage): OpenAIChatMessage {\r\n  if (!m.tool_calls) return m\r\n  const cleaned = m.tool_calls.filter(tc => tc && tc.function && tc.function.name)\r\n  if (cleaned.length === 0) {\r\n    const { tool_calls: _tc, ...rest } = m\r\n    return rest\r\n  }\r\n  return { ...m, tool_calls: cleaned }\r\n}\r\n\r\nfunction stripNameField(m: OpenAIChatMessage): OpenAIChatMessage {\r\n  if (!m.name) return m\r\n  const { name: _n, ...rest } = m\r\n  return rest\r\n}\r\n\r\nfunction injectMagistralThinkingPrompt(messages: OpenAIChatMessage[]): OpenAIChatMessage[] {\r\n  const thinkingPrompt =\r\n    'Reason step-by-step inside <think>...</think> tags before answering. '\r\n    + 'Emit your thinking first, then provide your final answer outside the tags.'\r\n  const existingSystem = messages.findIndex(m => m.role === 'system')\r\n  if (existingSystem >= 0) {\r\n    const sys = messages[existingSystem]\r\n    const merged = typeof sys.content === 'string'\r\n      ? thinkingPrompt + '\\n\\n' + sys.content\r\n      : thinkingPrompt\r\n    return messages.map((m, i) => i === existingSystem ? { ...m, content: merged } : m)\r\n  }\r\n  return [{ role: 'system', content: thinkingPrompt }, ...messages]\r\n}\r\n\r\n// \u2500\u2500\u2500 Ollama Native /api/chat Path \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n//\r\n// The /v1/chat/completions shim ignores `keep_alive` and `options.num_ctx`,\r\n// so the model runs at its 4096-token default and unloads after 5 minutes\r\n// idle. Both kill latency for agent use: every turn overflows ctx and\r\n// re-prefills from scratch, and every coffee break costs a 20s reload.\r\n// Going direct to /api/chat lets us set both. Tools, tool_call_id, and\r\n// the tools schema use the same shape as OpenAI's API, so this is a\r\n// thin transport swap rather than a full re-implementation.\r\n\r\nfunction safeParseObject(s: string): Record<string, unknown> {\r\n  if (!s) return {}\r\n  try { return JSON.parse(s) as Record<string, unknown> } catch { return {} }\r\n}\r\n\r\nfunction toOllamaMessage(m: OpenAIChatMessage): Record<string, unknown> {\r\n  // Ollama wants flat string content; collapse OpenAI parts arrays.\r\n  let content = ''\r\n  if (typeof m.content === 'string') {\r\n    content = m.content\r\n  } else if (Array.isArray(m.content)) {\r\n    content = m.content\r\n      .filter((p: any) => p && p.type === 'text' && typeof p.text === 'string')\r\n      .map((p: any) => p.text)\r\n      .join('\\n')\r\n  }\r\n\r\n  const out: Record<string, unknown> = { role: m.role, content }\r\n\r\n  if (m.tool_calls && m.tool_calls.length > 0) {\r\n    out.tool_calls = m.tool_calls.map(tc => ({\r\n      ...(tc.id && { id: tc.id }),\r\n      type: 'function',\r\n      function: {\r\n        name: tc.function.name,\r\n        // Ollama's /api/chat accepts arguments as object; we always have\r\n        // a JSON string from the OpenAI conversion path so parse here.\r\n        arguments: safeParseObject(tc.function.arguments),\r\n      },\r\n    }))\r\n  }\r\n  if (m.tool_call_id) out.tool_call_id = m.tool_call_id\r\n\r\n  return out\r\n}\r\n\r\nasync function* streamOllamaNative(\r\n  cfg: { apiKey: string; baseUrl: string },\r\n  body: OpenAIChatRequest,\r\n  model: string,\r\n  signal: AbortSignal | undefined,\r\n): AsyncGenerator<AnthropicStreamEvent, NormalizedUsage> {\r\n  const root = normalizeBaseUrl(cfg.baseUrl).replace(/\\/v1$/i, '')\r\n  const url = `${root}/api/chat`\r\n\r\n  const numCtx = parseInt(process.env.OLLAMA_NUM_CTX ?? '16384', 10)\r\n  const keepAlive = process.env.OLLAMA_KEEP_ALIVE ?? '30m'\r\n\r\n  const ollamaBody: Record<string, unknown> = {\r\n    model: body.model,\r\n    messages: body.messages.map(toOllamaMessage),\r\n    stream: true,\r\n    keep_alive: keepAlive,\r\n    options: {\r\n      num_ctx: numCtx,\r\n      ...(body.max_tokens != null && { num_predict: body.max_tokens }),\r\n      ...(body.temperature !== undefined && { temperature: body.temperature }),\r\n      ...(body.stop?.length && { stop: body.stop }),\r\n    },\r\n  }\r\n  if (body.tools && body.tools.length > 0) ollamaBody.tools = body.tools\r\n\r\n  const headers: Record<string, string> = { 'Content-Type': 'application/json' }\r\n  if (cfg.apiKey) headers['Authorization'] = `Bearer ${cfg.apiKey}`\r\n\r\n  const messageId = `ollama-${Date.now()}`\r\n  let messageStartEmitted = false\r\n  let inputTokens = 0\r\n  let outputTokens = 0\r\n  let currentBlockIndex = 0\r\n  let inTextBlock = false\r\n  let inThinkingBlock = false\r\n  const toolCallBuffers: Array<{ id: string; name: string; args: string; anthropicIndex: number }> = []\r\n  let emittedAnyToolUse = false\r\n\r\n  const emitMessageStart = (): AnthropicStreamEvent | undefined => {\r\n    if (messageStartEmitted) return undefined\r\n    messageStartEmitted = true\r\n    return {\r\n      type: 'message_start',\r\n      message: {\r\n        id: messageId,\r\n        type: 'message',\r\n        role: 'assistant',\r\n        content: [],\r\n        model,\r\n        stop_reason: null,\r\n        stop_sequence: null,\r\n        usage: { input_tokens: 0, output_tokens: 0 },\r\n      },\r\n    }\r\n  }\r\n\r\n  let response: Response\r\n  try {\r\n    response = await fetch(url, {\r\n      method: 'POST',\r\n      headers,\r\n      body: JSON.stringify(ollamaBody),\r\n      signal,\r\n    })\r\n  } catch (err: any) {\r\n    const mst = emitMessageStart()\r\n    if (mst) yield mst\r\n    yield* emitErrorText(`ollama API connection error: ${err?.message ?? String(err)}`)\r\n    yield { type: 'message_delta', delta: { stop_reason: 'end_turn' }, usage: { output_tokens: 0 } }\r\n    yield { type: 'message_stop' }\r\n    return blankUsage(0, 0, 0, 0)\r\n  }\r\n\r\n  if (!response.ok) {\r\n    const errText = await response.text().catch(() => '')\r\n    const mst = emitMessageStart()\r\n    if (mst) yield mst\r\n    const lowered = errText.toLowerCase()\r\n    const isPromptTooLong = ['context length', 'too long', 'context window'].some(m => lowered.includes(m))\r\n    const headline = isPromptTooLong\r\n      ? `Prompt is too long (ollama ${response.status})`\r\n      : `ollama API error ${response.status}`\r\n    yield* emitErrorText(`${headline}: ${errText.slice(0, 500)}`)\r\n    yield { type: 'message_delta', delta: { stop_reason: 'end_turn' }, usage: { output_tokens: 0 } }\r\n    yield { type: 'message_stop' }\r\n    return blankUsage(0, 0, 0, 0)\r\n  }\r\n\r\n  if (!response.body) throw new Error('Ollama: empty response body')\r\n\r\n  const reader = response.body.getReader()\r\n  const decoder = new TextDecoder()\r\n  let buffer = ''\r\n\r\n  try {\r\n    while (true) {\r\n      const { done, value } = await reader.read()\r\n      if (done) break\r\n      buffer += decoder.decode(value, { stream: true })\r\n\r\n      // /api/chat is NDJSON: each line is a complete JSON object.\r\n      const lines = buffer.split('\\n')\r\n      buffer = lines.pop() ?? ''\r\n\r\n      for (const rawLine of lines) {\r\n        const line = rawLine.trim()\r\n        if (!line) continue\r\n        let chunk: any\r\n        try { chunk = JSON.parse(line) } catch { continue }\r\n\r\n        const message = chunk.message ?? {}\r\n        const isDone = chunk.done === true\r\n\r\n        if (typeof chunk.prompt_eval_count === 'number') inputTokens = chunk.prompt_eval_count\r\n        if (typeof chunk.eval_count === 'number') outputTokens = chunk.eval_count\r\n\r\n        const hasContent = typeof message.content === 'string' && message.content.length > 0\r\n        const hasToolCalls = Array.isArray(message.tool_calls) && message.tool_calls.length > 0\r\n\r\n        if (!messageStartEmitted && (hasContent || hasToolCalls)) {\r\n          const mst = emitMessageStart()\r\n          if (mst) yield mst\r\n        }\r\n\r\n        if (hasContent) {\r\n          if (inThinkingBlock) {\r\n            yield { type: 'content_block_stop', index: currentBlockIndex }\r\n            currentBlockIndex++\r\n            inThinkingBlock = false\r\n          }\r\n          if (!inTextBlock) {\r\n            yield {\r\n              type: 'content_block_start',\r\n              index: currentBlockIndex,\r\n              content_block: { type: 'text', text: '' },\r\n            }\r\n            inTextBlock = true\r\n          }\r\n          yield {\r\n            type: 'content_block_delta',\r\n            index: currentBlockIndex,\r\n            delta: { type: 'text_delta', text: message.content },\r\n          }\r\n        }\r\n\r\n        if (hasToolCalls) {\r\n          if (inTextBlock || inThinkingBlock) {\r\n            yield { type: 'content_block_stop', index: currentBlockIndex }\r\n            currentBlockIndex++\r\n            inTextBlock = false\r\n            inThinkingBlock = false\r\n          }\r\n          for (const tc of message.tool_calls) {\r\n            const fn = tc.function ?? {}\r\n            const name = fn.name ?? ''\r\n            const argsStr = typeof fn.arguments === 'string'\r\n              ? fn.arguments\r\n              : JSON.stringify(fn.arguments ?? {})\r\n            const id = tc.id ?? `call_${toolCallBuffers.length}`\r\n            toolCallBuffers.push({\r\n              id,\r\n              name,\r\n              args: argsStr,\r\n              anthropicIndex: currentBlockIndex,\r\n            })\r\n            currentBlockIndex++\r\n            emittedAnyToolUse = true\r\n          }\r\n        }\r\n\r\n        if (isDone) {\r\n          if (inTextBlock || inThinkingBlock) {\r\n            yield { type: 'content_block_stop', index: currentBlockIndex }\r\n            inTextBlock = false\r\n            inThinkingBlock = false\r\n          }\r\n          for (const buf of toolCallBuffers) {\r\n            const implId = normalizeToolName(buf.name)\r\n            let input: Record<string, unknown>\r\n            try { input = buf.args ? JSON.parse(buf.args) : {} }\r\n            catch { input = { _raw: buf.args } }\r\n            const anthropicToolUseId = buf.id.startsWith('toolu_') ? buf.id : `toolu_ollama_${buf.id}`\r\n            yield {\r\n              type: 'content_block_start',\r\n              index: buf.anthropicIndex,\r\n              content_block: { type: 'tool_use', id: anthropicToolUseId, name: implId, input: {} },\r\n            }\r\n            yield {\r\n              type: 'content_block_delta',\r\n              index: buf.anthropicIndex,\r\n              delta: { type: 'input_json_delta', partial_json: JSON.stringify(input ?? {}) },\r\n            }\r\n            yield { type: 'content_block_stop', index: buf.anthropicIndex }\r\n          }\r\n          toolCallBuffers.length = 0\r\n        }\r\n      }\r\n    }\r\n  } finally {\r\n    reader.releaseLock()\r\n  }\r\n\r\n  if (!messageStartEmitted) {\r\n    const mst = emitMessageStart()\r\n    if (mst) yield mst\r\n  }\r\n\r\n  const stopReason: 'tool_use' | 'end_turn' = emittedAnyToolUse ? 'tool_use' : 'end_turn'\r\n  yield {\r\n    type: 'message_delta',\r\n    delta: { stop_reason: stopReason },\r\n    usage: { output_tokens: outputTokens, input_tokens: inputTokens },\r\n  }\r\n  yield { type: 'message_stop' }\r\n\r\n  return {\r\n    input_tokens: inputTokens,\r\n    output_tokens: outputTokens,\r\n    cache_read_tokens: 0,\r\n    cache_write_tokens: 0,\r\n    thinking_tokens: 0,\r\n  }\r\n}\r\n\r\n// \u2500\u2500\u2500 Per-Provider Response Quirks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nfunction applyProviderResponseQuirks(chunk: any, provider: ProviderType): any {\r\n  const choice = chunk?.choices?.[0]\r\n  if (!choice) return chunk\r\n  const delta = choice.delta ?? {}\r\n\r\n  // Groq: returns `reasoning` on deltas; normalize to reasoning_content\r\n  // for uniform downstream handling (not strictly required with our\r\n  // thinking-delta union fallback, but keeps things tidy).\r\n  if (provider === 'groq' && typeof delta.reasoning === 'string' && !delta.reasoning_content) {\r\n    delta.reasoning_content = delta.reasoning\r\n  }\r\n  // Qwen (DashScope compatible-mode) reasoning + DashScope error handling\r\n  // moved to src/lanes/qwen/ (dedicated lane). Compat no longer sees qwen.\r\n  // DeepSeek already sends reasoning_content; nothing to rename.\r\n  // OpenRouter may send either reasoning or reasoning_content depending\r\n  // on the underlying model; the union handling in streamAsProvider\r\n  // covers both.\r\n\r\n  // Rebuild choice with normalized delta.\r\n  return { ...chunk, choices: [{ ...choice, delta }] }\r\n}\r\n\r\n// \u2500\u2500\u2500 Tool Schema Sanitization \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\ninterface BuildToolsCtx {\r\n  platform: NodeJS.Platform\r\n  psEdition: 'desktop' | 'core' | null\r\n}\r\n\r\nfunction buildOpenAITools(\r\n  tools: ProviderTool[],\r\n  provider: ProviderType,\r\n  model: string,\r\n  ctx: BuildToolsCtx,\r\n): Array<{\r\n  type: 'function'\r\n  function: {\r\n    name: string\r\n    description: string\r\n    parameters: Record<string, unknown>\r\n    strict?: boolean\r\n  }\r\n}> {\r\n  // Transformer-driven strict mode + schema drop list. Per-provider\r\n  // config lives in each transformer file \u2014 adding a new provider =\r\n  // one new file; this function is provider-agnostic.\r\n  const transformer = getTransformer(provider as ProviderId)\r\n  const useStrict = transformer.supportsStrictMode()\r\n  return tools.map(t => {\r\n    const parameters = sanitizeToolSchema(\r\n      t.input_schema ?? { type: 'object', properties: {} },\r\n      provider,\r\n      model,\r\n    )\r\n\r\n    // Shell-description override path: replaces caller's verbose\r\n    // frontier-tier description with a compact, example-driven version\r\n    // for Bash / PowerShell so weak compat-lane models stop emitting\r\n    // cross-shell syntax. The transformer can opt in/out per model;\r\n    // the default (used when the transformer doesn't override) is the\r\n    // shared OpenCode-style description from shell_descriptions.ts.\r\n    const isShellTool = t.name === 'Bash' || t.name === 'PowerShell'\r\n    const customShellDesc = isShellTool\r\n      ? transformer.overrideShellToolDescription?.(t.name as 'Bash' | 'PowerShell', model, ctx)\r\n        ?? getCompatShellDescription(t.name, ctx)\r\n      : undefined\r\n    const baseDescription = customShellDesc ?? t.description ?? ''\r\n\r\n    return {\r\n      type: 'function' as const,\r\n      function: {\r\n        name: t.name,\r\n        // Every tool description gets the STRICT PARAMETERS summary\r\n        // appended \u2014 plain-text in-context reminder of required fields\r\n        // + types. Backstops `strict: true` on providers that honor it\r\n        // and does the whole job on providers that don't.\r\n        description: appendStrictParamsHint(baseDescription, parameters),\r\n        parameters,\r\n        ...(useStrict && { strict: true }),\r\n      },\r\n    }\r\n  })\r\n}\r\n\r\n// Strip JSON Schema fields that various providers reject. Drop lists\r\n// are owned by each transformer (schemaDropList()); this wrapper just\r\n// runs the walk. After the walk, `sanitizeToolSchemaExtra()` (when the\r\n// transformer implements it) gets one more pass \u2014 used for shapes the\r\n// flat drop list can't express (Moonshot's \"$ref must have no\r\n// siblings\", tuple-form `items`, Gemini integer\u2192string enums, \u2026).\r\nfunction sanitizeToolSchema(\r\n  schema: Record<string, unknown>,\r\n  provider: ProviderType,\r\n  model: string,\r\n): Record<string, unknown> {\r\n  const transformer = getTransformer(provider as ProviderId)\r\n  const drop = transformer.schemaDropList()\r\n\r\n  function walk(v: unknown): unknown {\r\n    if (Array.isArray(v)) return v.map(walk)\r\n    if (v && typeof v === 'object') {\r\n      const out: Record<string, unknown> = {}\r\n      for (const [k, value] of Object.entries(v as Record<string, unknown>)) {\r\n        if (drop.has(k)) continue\r\n        // OpenAPI 3.0 vendor extensions (x-google-enum-descriptions, x-stripe-*,\r\n        // \u2026) leak in from MCP tool schemas. OpenAI-strict, Mistral, Groq, and\r\n        // other validators 400 on unknown fields, so strip the whole x-* family\r\n        // for every transformer.\r\n        if (k.startsWith('x-')) continue\r\n        out[k] = walk(value)\r\n      }\r\n      return out\r\n    }\r\n    return v\r\n  }\r\n  const dropped = walk(schema) as Record<string, unknown>\r\n  if (transformer.sanitizeToolSchemaExtra) {\r\n    return transformer.sanitizeToolSchemaExtra(dropped, model)\r\n  }\r\n  return dropped\r\n}\r\n\r\n// \u2500\u2500\u2500 History Conversion \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nfunction convertHistoryToOpenAI(\r\n  messages: ProviderMessage[],\r\n  systemText: string,\r\n  provider: ProviderType = 'generic',\r\n  model = '',\r\n): OpenAIChatMessage[] {\r\n  if (provider === 'deepseek' && model.toLowerCase() !== 'deepseek-reasoner') {\r\n    return convertHistoryToOpenAIForDeepSeek(messages, systemText)\r\n  }\r\n  if (provider === 'moonshot' && isMoonshotThinkingModel(model)) {\r\n    return convertHistoryToOpenAIForDeepSeek(messages, systemText)\r\n  }\r\n  // OpenCode Zen with per-model thinking enabled: the gateway forwards\r\n  // `reasoning_content` from streamed deltas, and the downstream upstream\r\n  // (DeepSeek, Qwen-DashScope, Kimi-thinking, etc.) expects that field\r\n  // echoed back on any replayed assistant tool-call message. Without it\r\n  // the next tool turn 400s with \"reasoning_content in thinking mode must\r\n  // be passed back to the API\". The DeepSeek-style conversion already\r\n  // does exactly this carry-back, so reuse it for every reasoning-on\r\n  // opencode row.\r\n  if (provider === 'opencode' && opencodeThinkingActive(model)) {\r\n    return convertHistoryToOpenAIForDeepSeek(messages, systemText)\r\n  }\r\n  return convertHistoryToOpenAIDefault(messages, systemText)\r\n}\r\n\r\nfunction opencodeThinkingActive(model: string): boolean {\r\n  if (!isOpencodeThinkingModel(model)) return false\r\n  return getOpencodeEffort(model) !== 'default'\r\n}\r\n\r\nfunction convertHistoryToOpenAIDefault(\r\n  messages: ProviderMessage[],\r\n  systemText: string,\r\n): OpenAIChatMessage[] {\r\n  const out: OpenAIChatMessage[] = []\r\n  if (systemText) out.push({ role: 'system', content: systemText })\r\n\r\n  for (const msg of messages) {\r\n    if (typeof msg.content === 'string') {\r\n      out.push({\r\n        role: msg.role === 'assistant' ? 'assistant' : 'user',\r\n        content: msg.content,\r\n      })\r\n      continue\r\n    }\r\n\r\n    const texts: string[] = []\r\n    const toolCalls: NonNullable<OpenAIChatMessage['tool_calls']> = []\r\n    const toolResults: OpenAIChatMessage[] = []\r\n\r\n    for (const block of msg.content) {\r\n      switch (block.type) {\r\n        case 'text':\r\n          if (block.text) texts.push(block.text)\r\n          break\r\n        case 'tool_use':\r\n          if (block.id && block.name) {\r\n            toolCalls.push({\r\n              id: block.id,\r\n              type: 'function',\r\n              function: {\r\n                name: block.name,\r\n                arguments: JSON.stringify(block.input ?? {}),\r\n              },\r\n            })\r\n          }\r\n          break\r\n        case 'tool_result':\r\n          if (block.tool_use_id) {\r\n            toolResults.push({\r\n              role: 'tool',\r\n              tool_call_id: block.tool_use_id,\r\n              content: typeof block.content === 'string'\r\n                ? block.content\r\n                : stringifyToolContent(block.content),\r\n            })\r\n          }\r\n          break\r\n        case 'thinking':\r\n          // OpenAI Chat Completions doesn't echo thinking back \u2014 skip.\r\n          break\r\n      }\r\n    }\r\n\r\n    if (texts.length > 0 || toolCalls.length > 0) {\r\n      out.push({\r\n        role: msg.role === 'assistant' ? 'assistant' : 'user',\r\n        content: texts.length > 0 ? texts.join('\\n') : null,\r\n        ...(toolCalls.length > 0 && { tool_calls: toolCalls }),\r\n      })\r\n    }\r\n    out.push(...toolResults)\r\n  }\r\n\r\n  return out\r\n}\r\n\r\nfunction convertHistoryToOpenAIForDeepSeek(\r\n  messages: ProviderMessage[],\r\n  systemText: string,\r\n): OpenAIChatMessage[] {\r\n  const out: OpenAIChatMessage[] = []\r\n  if (systemText) out.push({ role: 'system', content: systemText })\r\n\r\n  let pendingReasoning: string | null = null\r\n  let pendingAssistantTexts: string[] = []\r\n\r\n  const clearPendingAssistant = () => {\r\n    pendingReasoning = null\r\n    pendingAssistantTexts = []\r\n  }\r\n\r\n  const flushPendingAssistantText = () => {\r\n    if (pendingAssistantTexts.length > 0) {\r\n      out.push({ role: 'assistant', content: pendingAssistantTexts.join('\\n') })\r\n    }\r\n    clearPendingAssistant()\r\n  }\r\n\r\n  const appendPendingReasoning = (thinking: string) => {\r\n    pendingReasoning = pendingReasoning\r\n      ? `${pendingReasoning}\\n${thinking}`\r\n      : thinking\r\n  }\r\n\r\n  for (const msg of messages) {\r\n    if (typeof msg.content === 'string') {\r\n      flushPendingAssistantText()\r\n      out.push({\r\n        role: msg.role === 'assistant' ? 'assistant' : 'user',\r\n        content: msg.content,\r\n      })\r\n      continue\r\n    }\r\n\r\n    const texts: string[] = []\r\n    const toolCalls: NonNullable<OpenAIChatMessage['tool_calls']> = []\r\n    const toolResults: OpenAIChatMessage[] = []\r\n    const thinkingBlocks: string[] = []\r\n\r\n    for (const block of msg.content) {\r\n      switch (block.type) {\r\n        case 'text':\r\n          if (block.text) texts.push(block.text)\r\n          break\r\n        case 'tool_use':\r\n          if (block.id && block.name) {\r\n            toolCalls.push({\r\n              id: block.id,\r\n              type: 'function',\r\n              function: {\r\n                name: block.name,\r\n                arguments: JSON.stringify(block.input ?? {}),\r\n              },\r\n            })\r\n          }\r\n          break\r\n        case 'tool_result':\r\n          if (block.tool_use_id) {\r\n            toolResults.push({\r\n              role: 'tool',\r\n              tool_call_id: block.tool_use_id,\r\n              content: typeof block.content === 'string'\r\n                ? block.content\r\n                : stringifyToolContent(block.content),\r\n            })\r\n          }\r\n          break\r\n        case 'thinking':\r\n          if (block.thinking) thinkingBlocks.push(block.thinking)\r\n          break\r\n      }\r\n    }\r\n\r\n    if (msg.role === 'assistant') {\r\n      for (const thinking of thinkingBlocks) appendPendingReasoning(thinking)\r\n\r\n      if (toolCalls.length > 0) {\r\n        const contentParts = [...pendingAssistantTexts, ...texts]\r\n        out.push({\r\n          role: 'assistant',\r\n          content: contentParts.length > 0 ? contentParts.join('\\n') : null,\r\n          // DeepSeek thinking mode requires this field on every replayed\r\n          // assistant tool-call message. Old cross-provider history may not\r\n          // have a thinking block, so preserve protocol shape with \"\".\r\n          reasoning_content: pendingReasoning ?? '',\r\n          tool_calls: toolCalls,\r\n        })\r\n        clearPendingAssistant()\r\n      } else if (texts.length > 0) {\r\n        pendingAssistantTexts.push(...texts)\r\n      }\r\n\r\n      if (toolResults.length > 0) {\r\n        flushPendingAssistantText()\r\n        out.push(...toolResults)\r\n      }\r\n      continue\r\n    }\r\n\r\n    flushPendingAssistantText()\r\n    if (texts.length > 0) {\r\n      out.push({ role: 'user', content: texts.join('\\n') })\r\n    }\r\n    out.push(...toolResults)\r\n  }\r\n\r\n  flushPendingAssistantText()\r\n  return out\r\n}\r\n\r\nexport function _convertHistoryToOpenAIForTest(\r\n  messages: ProviderMessage[],\r\n  systemText: string,\r\n  provider: ProviderType,\r\n  model: string,\r\n): OpenAIChatMessage[] {\r\n  return convertHistoryToOpenAI(messages, systemText, provider, model)\r\n}\r\n\r\nfunction stringifyToolContent(content: unknown): string {\r\n  if (typeof content === 'string') return content\r\n  if (Array.isArray(content)) {\r\n    const parts: string[] = []\r\n    for (const b of content as any[]) {\r\n      if (b && typeof b === 'object') {\r\n        if ('text' in b && typeof b.text === 'string') parts.push(b.text)\r\n        else parts.push(JSON.stringify(b))\r\n      }\r\n    }\r\n    return parts.join('\\n')\r\n  }\r\n  return JSON.stringify(content ?? '')\r\n}\r\n\r\n// \u2500\u2500\u2500 Singleton Export \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport const openaiCompatLane = new OpenAICompatLane()\r\n", "/**\r\n * OpenAI-Compatible Lane \u2014 System Prompt\r\n *\r\n * Shorter, cleaner prompt for models that don't have a native CLI\r\n * to match. Works well with DeepSeek, Groq, NIM, Ollama, OpenRouter,\r\n * Mistral, and the long tail of OpenAI-format models.\r\n *\r\n * Local models (Ollama, LM Studio) get an even shorter variant to\r\n * avoid overwhelming small context windows.\r\n */\r\n\r\nimport type { SystemPromptParts } from '../types.js'\r\n\r\nexport function assembleOpenAICompatPrompt(\r\n  model: string,\r\n  parts: SystemPromptParts,\r\n  isLocal: boolean,\r\n): { stable: string; volatile: string; full: string } {\r\n\r\n  const stableSections: string[] = isLocal\r\n    ? [\r\n        // Shorter prompt for local models with limited context\r\n        `You are a coding assistant. Help the user with their programming tasks.\r\n\r\nUse the provided tools to read files, edit code, search the codebase, and run commands. Be concise.\r\n\r\nWhen a command fails, diagnose first (read the exit code and error) before retrying \u2014 don't guess at variants. For unfamiliar CLIs, check \\`--help\\` once instead of iterating on flags.`,\r\n      ]\r\n    : [\r\n        `You are an expert software engineer helping the user with coding tasks.\r\n\r\nYou have tools for reading files, writing files, editing code, searching the codebase, running shell commands, and searching the web. Use them to understand the code and make changes.`,\r\n\r\n        `## Approach\r\n\r\n1. Read relevant code before making changes\r\n2. Make targeted, minimal edits\r\n3. Verify changes work (run tests if available)\r\n4. Don't add unnecessary features or refactoring`,\r\n\r\n        `## Rules\r\n\r\n- Read a file before editing it\r\n- Don't add comments or docstrings to unchanged code\r\n- Don't create abstractions for one-time operations\r\n- If unsure about something, ask the user\r\n- When a tool call fails, diagnose the cause first \u2014 read the exit code and error text, verify what actually exists (binaries, paths, env) \u2014 before retrying. Do NOT iterate on cosmetic variations of the same call (different shell wrappers, slight flag tweaks); blind retries burn input tokens without progress. If two attempts fail for the same reason, stop and investigate.\r\n- For unfamiliar CLIs, libraries, or APIs, check \\`--help\\` or the official docs once before invoking. Don't guess flags and iterate.`,\r\n      ]\r\n\r\n  if (parts.customInstructions) {\r\n    stableSections.push(`## Instructions\\n\\n${parts.customInstructions}`)\r\n  }\r\n  if (parts.toolsAddendum) {\r\n    stableSections.push(parts.toolsAddendum)\r\n  }\r\n  if (parts.mcpIntro) {\r\n    stableSections.push(`## MCP Tools\\n\\n${parts.mcpIntro}`)\r\n  }\r\n\r\n  const stable = stableSections.join('\\n\\n')\r\n\r\n  const volatileSections: string[] = []\r\n  if (parts.memory) volatileSections.push(parts.memory)\r\n  if (parts.environment) volatileSections.push(parts.environment)\r\n  if (parts.gitStatus && !isLocal) volatileSections.push(`Git status:\\n${parts.gitStatus}`)\r\n\r\n  const volatile = volatileSections.join('\\n\\n')\r\n  const full = volatile ? `${stable}\\n\\n${volatile}` : stable\r\n  return { stable, volatile, full }\r\n}\r\n", "/**\n * OpenAI-Compatible Lane \u2014 Entry Point\n *\n * Handles: DeepSeek, GLM, Moonshot, Groq, Mistral, NIM, Ollama, LM Studio, OpenRouter, and any other\n * provider that speaks OpenAI Chat Completions format.\n *\n * Each provider is registered with its own API key and base URL.\n * The lane auto-detects which provider config to use based on model name.\n */\n\nexport { openaiCompatLane, OpenAICompatLane } from './loop.js'\nexport { OPENAI_COMPAT_TOOL_REGISTRY, buildOpenAICompatFunctions } from './tools.js'\nexport { assembleOpenAICompatPrompt } from './prompt.js'\n\nimport { openaiCompatLane } from './loop.js'\nimport { registerLane } from '../dispatcher.js'\n\n/**\n * Initialize the OpenAI-compat lane with all provider configs.\n * Call this once at startup with whatever API keys are available.\n */\nexport function initOpenAICompatLane(providers?: {\n  deepseek?: { apiKey: string; baseUrl?: string }\n  glm?: { apiKey: string; baseUrl?: string }\n  moonshot?: { apiKey: string; baseUrl?: string }\n  minimax?: { apiKey: string; baseUrl?: string }\n  groq?: { apiKey: string; baseUrl?: string }\n  mistral?: { apiKey: string; baseUrl?: string }\n  nim?: { apiKey: string; baseUrl?: string }\n  ollama?: { apiKey?: string; baseUrl?: string }\n  lmstudio?: { apiKey?: string; baseUrl?: string }\n  openrouter?: { apiKey: string; baseUrl?: string }\n  agentrouter?: { apiKey: string; baseUrl?: string }\n  modelrouter?: { apiKey: string; baseUrl?: string }\n  vercel?: { apiKey: string; baseUrl?: string }\n  requesty?: { apiKey: string; baseUrl?: string }\n  opencode?: { apiKey: string; baseUrl?: string }\n  cline?: { apiKey: string; baseUrl?: string }\n  iflow?: { apiKey: string; baseUrl?: string }\n  kilocode?: { apiKey: string; baseUrl?: string }\n  copilot?: { apiKey: string; baseUrl?: string }\n}): void {\n  const p = providers ?? {}\n\n  const dsKey = p.deepseek?.apiKey ?? process.env.DEEPSEEK_API_KEY\n  if (dsKey) {\n    openaiCompatLane.registerProvider(\n      'deepseek', dsKey,\n      p.deepseek?.baseUrl ?? 'https://api.deepseek.com/v1',\n    )\n  }\n\n  const glmKey = p.glm?.apiKey\n    ?? process.env.GLM_API_KEY\n    ?? process.env.BIGMODEL_API_KEY\n    ?? process.env.ZHIPU_API_KEY\n    ?? process.env.ZAI_API_KEY\n    ?? process.env.Z_AI_API_KEY\n  if (glmKey) {\n    openaiCompatLane.registerProvider(\n      'glm',\n      glmKey,\n      p.glm?.baseUrl\n        ?? process.env.GLM_BASE_URL\n        ?? process.env.GLM_API_URL\n        ?? process.env.BIGMODEL_BASE_URL\n        ?? process.env.ZHIPU_BASE_URL\n        ?? process.env.ZAI_BASE_URL\n        ?? process.env.Z_AI_BASE_URL\n        ?? 'https://open.bigmodel.cn/api/paas/v4',\n    )\n  }\n\n  const moonshotKey = p.moonshot?.apiKey ?? process.env.MOONSHOT_API_KEY ?? process.env.MOONSHOTAI_API_KEY\n  if (moonshotKey) {\n    openaiCompatLane.registerProvider(\n      'moonshot',\n      moonshotKey,\n      p.moonshot?.baseUrl\n        ?? process.env.MOONSHOT_BASE_URL\n        ?? process.env.MOONSHOT_API_BASE_URL\n        ?? 'https://api.moonshot.ai/v1',\n    )\n  }\n\n  const minimaxKey = p.minimax?.apiKey ?? process.env.MINIMAX_API_KEY\n  if (minimaxKey) {\n    openaiCompatLane.registerProvider(\n      'minimax',\n      minimaxKey,\n      p.minimax?.baseUrl\n        ?? process.env.MINIMAX_BASE_URL\n        ?? process.env.MINIMAX_API_BASE_URL\n        ?? 'https://api.minimax.io/v1',\n    )\n  }\n\n  const groqKey = p.groq?.apiKey ?? process.env.GROQ_API_KEY\n  if (groqKey) {\n    openaiCompatLane.registerProvider(\n      'groq', groqKey,\n      p.groq?.baseUrl ?? 'https://api.groq.com/openai/v1',\n    )\n  }\n\n  const mistralKey = p.mistral?.apiKey ?? process.env.MISTRAL_API_KEY\n  if (mistralKey) {\n    openaiCompatLane.registerProvider(\n      'mistral', mistralKey,\n      p.mistral?.baseUrl\n        ?? process.env.MISTRAL_BASE_URL\n        ?? process.env.MISTRAL_API_BASE_URL\n        ?? 'https://api.mistral.ai/v1',\n    )\n  }\n\n  const nimKey = p.nim?.apiKey ?? process.env.NIM_API_KEY\n  if (nimKey) {\n    openaiCompatLane.registerProvider(\n      'nim', nimKey,\n      p.nim?.baseUrl ?? 'https://integrate.api.nvidia.com/v1',\n    )\n  }\n\n  const ollamaUrl = p.ollama?.baseUrl ?? process.env.OLLAMA_HOST ?? 'http://localhost:11434/v1'\n  const ollamaKey = normalizeOllamaApiKey(p.ollama?.apiKey ?? process.env.OLLAMA_API_KEY)\n  openaiCompatLane.registerProvider('ollama', ollamaKey, ollamaUrl)\n\n  const lmStudioUrl = normalizeLmStudioBaseUrl(\n    p.lmstudio?.baseUrl\n      ?? process.env.LMSTUDIO_BASE_URL\n      ?? process.env.LM_STUDIO_BASE_URL\n      ?? 'http://localhost:1234/v1',\n  )\n  const lmStudioKey = normalizeLmStudioApiKey(\n    p.lmstudio?.apiKey ?? process.env.LMSTUDIO_API_KEY,\n  )\n  openaiCompatLane.registerProvider('lmstudio', lmStudioKey, lmStudioUrl)\n\n  const orKey = p.openrouter?.apiKey ?? process.env.OPENROUTER_API_KEY\n  if (orKey) {\n    openaiCompatLane.registerProvider(\n      'openrouter', orKey,\n      p.openrouter?.baseUrl ?? 'https://openrouter.ai/api/v1',\n    )\n  }\n\n  const agentRouterKey = p.agentrouter?.apiKey ?? process.env.AGENT_ROUTER_TOKEN ?? process.env.AGENTROUTER_API_KEY\n  if (agentRouterKey) {\n    openaiCompatLane.registerProvider(\n      'agentrouter', agentRouterKey,\n      p.agentrouter?.baseUrl ?? 'https://agentrouter.org/v1',\n    )\n  }\n\n  const modelRouterKey = p.modelrouter?.apiKey\n    ?? process.env.MODEL_ROUTER_API_KEY\n    ?? process.env.MODELROUTER_API_KEY\n    ?? process.env.LXG2IT_API_KEY\n  if (modelRouterKey) {\n    openaiCompatLane.registerProvider(\n      'modelrouter', modelRouterKey,\n      p.modelrouter?.baseUrl\n        ?? process.env.MODELROUTER_BASE_URL\n        ?? process.env.MODEL_ROUTER_BASE_URL\n        ?? process.env.LXG2IT_BASE_URL\n        ?? 'https://api.lxg2it.com/v1',\n    )\n  }\n\n  const vercelKey = p.vercel?.apiKey\n    ?? process.env.AI_GATEWAY_API_KEY\n    ?? process.env.VERCEL_AI_GATEWAY_API_KEY\n    ?? process.env.VERCEL_OIDC_TOKEN\n  if (vercelKey) {\n    openaiCompatLane.registerProvider(\n      'vercel', vercelKey,\n      p.vercel?.baseUrl\n        ?? process.env.VERCEL_AI_GATEWAY_BASE_URL\n        ?? process.env.AI_GATEWAY_BASE_URL\n        ?? 'https://ai-gateway.vercel.sh/v1',\n    )\n  }\n\n  const requestyKey = p.requesty?.apiKey ?? process.env.REQUESTY_API_KEY\n  if (requestyKey) {\n    openaiCompatLane.registerProvider(\n      'requesty', requestyKey,\n      p.requesty?.baseUrl\n        ?? process.env.REQUESTY_BASE_URL\n        ?? 'https://router.requesty.ai/v1',\n    )\n  }\n\n  const opencodeKey = p.opencode?.apiKey\n    ?? process.env.OPENCODE_API_KEY\n    ?? process.env.OPENCODE_ZEN_API_KEY\n    ?? 'public'\n  openaiCompatLane.registerProvider(\n    'opencode', opencodeKey,\n    p.opencode?.baseUrl\n      ?? process.env.OPENCODE_BASE_URL\n      ?? process.env.OPENCODE_ZEN_BASE_URL\n      ?? 'https://opencode.ai/zen/v1',\n  )\n\n  // Phase 4 OAuth-backed compat providers. Caller (providerShim) passes\n  // the OAuth access token as `apiKey`; the transformer turns that into\n  // the right header shape (Bearer + provider-specific extras).\n  if (p.cline?.apiKey) {\n    openaiCompatLane.registerProvider(\n      'cline', p.cline.apiKey,\n      p.cline.baseUrl ?? 'https://api.cline.bot/v1',\n    )\n  }\n  if (p.iflow?.apiKey) {\n    openaiCompatLane.registerProvider(\n      'iflow', p.iflow.apiKey,\n      p.iflow.baseUrl ?? 'https://apis.iflow.cn/v1',\n    )\n  }\n  if (p.kilocode?.apiKey) {\n    openaiCompatLane.registerProvider(\n      'kilocode', p.kilocode.apiKey,\n      p.kilocode.baseUrl ?? 'https://kilocode.ai/api/openrouter/v1',\n    )\n  }\n  // Copilot's bearer is the *internal* token (Copilot exchanges the GH\n  // OAuth user token for it, ~30 min TTL). providerShim re-exchanges via\n  // refreshCopilotOAuth before init when the cached one is stale.\n  if (p.copilot?.apiKey) {\n    openaiCompatLane.registerProvider(\n      'copilot', p.copilot.apiKey,\n      // Note: no `/v1` suffix \u2014 Copilot serves /chat/completions and\n      // /models off the bare api.githubcopilot.com host.\n      p.copilot.baseUrl ?? 'https://api.githubcopilot.com',\n    )\n  }\n\n  // Qwen moved to its own lane (`src/lanes/qwen/`) \u2014 see Phase 2 of\n  // the native-lane plan. Do NOT register qwen here: it would shadow the\n  // dedicated lane's native OAuth + Qwen-specific tool registry.\n\n  registerLane(openaiCompatLane)\n}\n\nfunction normalizeOllamaApiKey(apiKey: string | undefined): string {\n  const key = apiKey?.trim()\n  return key && key !== 'ollama' ? key : ''\n}\n\nfunction normalizeLmStudioApiKey(apiKey: string | undefined): string {\n  const key = apiKey?.trim()\n  return key || 'lm-studio'\n}\n\nfunction normalizeLmStudioBaseUrl(raw: string): string {\n  const withScheme = /^https?:\\/\\//i.test(raw) ? raw : `http://${raw}`\n  const trimmed = withScheme.replace(/\\/+$/, '')\n  return /\\/v1$/i.test(trimmed) ? trimmed : `${trimmed}/v1`\n}\n", "/**\r\n * Qwen tool registry \u2014 OpenAI function-calling schema shape.\r\n *\r\n * Qwen (and Qwen3-Coder in particular) was post-trained on Qwen Code's\r\n * tool surface, which inherits from gemini-cli for file/shell ops but\r\n * delivered via OpenAI function-calling wire format (tools[] with\r\n * {type:'function', function:{name,description,parameters}}).\r\n *\r\n * Tool names match qwen-code reference where available; adaptInput /\r\n * adaptOutput bridge the native parameter shape to Tau's shared\r\n * tool implementations.\r\n */\r\n\r\nimport type { LaneToolRegistration } from '../types.js'\nimport { WEB_SEARCH_NATIVE_DESCRIPTION } from '../../tools/WebSearchTool/prompt.js'\n\r\nexport const QWEN_TOOL_REGISTRY: LaneToolRegistration[] = [\r\n  {\r\n    nativeName: 'read_file',\r\n    implId: 'Read',\r\n    nativeDescription:\r\n      \"Read the content of a file from disk. Supports text, images, PDFs, and common code formats. Use 'offset' + 'limit' for targeted slicing of large files to save context.\",\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        file_path: { type: 'string', description: 'Absolute path to the file.' },\r\n        offset: { type: 'number', description: '1-based line number to start reading from.' },\r\n        limit: { type: 'number', description: 'Number of lines to read.' },\r\n      },\r\n      required: ['file_path'],\r\n    },\r\n    adaptInput(native) {\r\n      const out: Record<string, unknown> = { file_path: native.file_path }\r\n      if (typeof native.offset === 'number') out.offset = Math.max(0, (native.offset as number) - 1)\r\n      if (typeof native.limit === 'number') out.limit = native.limit\r\n      return out\r\n    },\r\n    adaptOutput(output) {\r\n      return typeof output === 'string' ? output : JSON.stringify(output)\r\n    },\r\n  },\r\n\r\n  {\r\n    nativeName: 'write_file',\r\n    implId: 'Write',\r\n    nativeDescription:\r\n      \"Write full content to a file. Creates parent directories. Overwrites if exists. For targeted edits, prefer 'edit_file'.\",\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        file_path: { type: 'string' },\r\n        content: { type: 'string' },\r\n      },\r\n      required: ['file_path', 'content'],\r\n    },\r\n    adaptInput(native) {\r\n      return { file_path: native.file_path, content: native.content }\r\n    },\r\n    adaptOutput(output) {\r\n      return typeof output === 'string' ? output : JSON.stringify(output)\r\n    },\r\n  },\r\n\r\n  {\r\n    nativeName: 'edit_file',\r\n    implId: 'Edit',\r\n    nativeDescription:\r\n      \"Edit a file by replacing exact text. Provide unique 'old_string' context to target the right occurrence. Set 'replace_all' to true for global rewrites.\",\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        file_path: { type: 'string' },\r\n        old_string: { type: 'string' },\r\n        new_string: { type: 'string' },\r\n        replace_all: { type: 'boolean' },\r\n      },\r\n      required: ['file_path', 'old_string', 'new_string'],\r\n    },\r\n    adaptInput(native) {\r\n      return {\r\n        file_path: native.file_path,\r\n        old_string: native.old_string,\r\n        new_string: native.new_string,\r\n        replace_all: native.replace_all ?? false,\r\n      }\r\n    },\r\n    adaptOutput(output) {\r\n      return typeof output === 'string' ? output : JSON.stringify(output)\r\n    },\r\n  },\r\n\r\n  {\n    nativeName: 'run_shell_command',\n    implId: 'Bash',\n    nativeDescription:\n      'Run a Bash/POSIX shell command. Set is_background=true for long-running processes. Do NOT use \"&\" to background.',\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        command: { type: 'string' },\r\n        description: { type: 'string' },\r\n        is_background: { type: 'boolean' },\r\n      },\r\n      required: ['command'],\r\n    },\r\n    adaptInput(native) {\r\n      const out: Record<string, unknown> = { command: native.command }\r\n      if (native.description) out.description = native.description\r\n      if (native.is_background) out.run_in_background = native.is_background\r\n      return out\r\n    },\r\n    adaptOutput(output) {\r\n      return typeof output === 'string' ? output : JSON.stringify(output)\r\n    },\r\n  },\r\n\r\n  {\r\n    nativeName: 'glob',\r\n    implId: 'Glob',\r\n    nativeDescription:\r\n      'Find files by glob pattern (e.g., \"**/*.ts\"). Returns paths sorted by modification time.',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        pattern: { type: 'string' },\r\n        path: { type: 'string', description: 'Optional directory to search in.' },\r\n      },\r\n      required: ['pattern'],\r\n    },\r\n    adaptInput(native) {\r\n      const out: Record<string, unknown> = { pattern: native.pattern }\r\n      if (native.path) out.path = native.path\r\n      return out\r\n    },\r\n    adaptOutput(output) {\r\n      return typeof output === 'string' ? output : JSON.stringify(output)\r\n    },\r\n  },\r\n\r\n  {\r\n    nativeName: 'search_file_content',\r\n    implId: 'Grep',\r\n    nativeDescription:\r\n      'Search file contents with a regex (ripgrep-powered). Optional glob filter and per-file head limit.',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        pattern: { type: 'string' },\r\n        path: { type: 'string' },\r\n        glob: { type: 'string' },\r\n        output_mode: { type: 'string', enum: ['content', 'files_with_matches', 'count'] },\r\n        head_limit: { type: 'number' },\r\n      },\r\n      required: ['pattern'],\r\n    },\r\n    adaptInput(native) {\r\n      return { ...native }\r\n    },\r\n    adaptOutput(output) {\r\n      return typeof output === 'string' ? output : JSON.stringify(output)\r\n    },\r\n  },\r\n\r\n  {\n    nativeName: 'web_search',\n    implId: 'WebSearch',\n    nativeDescription: WEB_SEARCH_NATIVE_DESCRIPTION,\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: { query: { type: 'string' } },\r\n      required: ['query'],\r\n    },\r\n    adaptInput(native) {\r\n      return { query: native.query }\r\n    },\r\n    adaptOutput(output) {\r\n      return typeof output === 'string' ? output : JSON.stringify(output)\r\n    },\r\n  },\r\n\r\n  {\r\n    nativeName: 'web_fetch',\r\n    implId: 'WebFetch',\r\n    nativeDescription:\r\n      \"Fetch and process one or more URLs embedded in 'prompt'. Up to 20 URLs.\",\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: { prompt: { type: 'string' } },\r\n      required: ['prompt'],\r\n    },\r\n    adaptInput(native) {\r\n      const prompt = typeof native.prompt === 'string' ? native.prompt : ''\r\n      const urlMatch = prompt.match(/https?:\\/\\/[^\\s]+/)\r\n      return { url: urlMatch ? urlMatch[0] : prompt, prompt }\r\n    },\r\n    adaptOutput(output) {\r\n      return typeof output === 'string' ? output : JSON.stringify(output)\r\n    },\r\n  },\r\n]\r\n\r\n// \u2500\u2500\u2500 Lookup \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nconst _byNative = new Map<string, LaneToolRegistration>()\r\nconst _byImpl = new Map<string, LaneToolRegistration[]>()\r\nfunction _ensureIndexed(): void {\r\n  if (_byNative.size > 0) return\r\n  for (const reg of QWEN_TOOL_REGISTRY) {\r\n    _byNative.set(reg.nativeName, reg)\r\n    const list = _byImpl.get(reg.implId) ?? []\r\n    list.push(reg)\r\n    _byImpl.set(reg.implId, list)\r\n  }\r\n}\r\n\r\nexport function getQwenRegistrationByNativeName(name: string): LaneToolRegistration | undefined {\r\n  _ensureIndexed()\r\n  return _byNative.get(name)\r\n}\r\n\r\nexport function getQwenRegistrationsByImplId(implId: string): LaneToolRegistration[] {\r\n  _ensureIndexed()\r\n  return _byImpl.get(implId) ?? []\r\n}\r\n\r\n/** Build Qwen-format function tool defs from the registry. */\r\nexport function buildQwenTools(): Array<{\r\n  type: 'function'\r\n  function: { name: string; description: string; parameters: Record<string, unknown> }\r\n}> {\r\n  return QWEN_TOOL_REGISTRY.map(reg => ({\r\n    type: 'function' as const,\r\n    function: {\r\n      name: reg.nativeName,\r\n      description: reg.nativeDescription,\r\n      parameters: reg.nativeSchema,\r\n    },\r\n  }))\r\n}\r\n", "/**\r\n * Qwen OAuth2 device-code flow.\r\n *\r\n * Port of reference/qwen-code-main/packages/core/src/qwen/qwenOAuth2.ts.\r\n *\r\n * Flow (RFC 8628 device authorization + RFC 7636 PKCE):\r\n *   1. Generate PKCE verifier + challenge.\r\n *   2. POST to chat.qwen.ai device-code endpoint \u2192 { device_code,\r\n *      user_code, verification_uri, expires_in }.\r\n *   3. Display user_code + verification_uri, open browser.\r\n *   4. Poll token endpoint with device_code + code_verifier until\r\n *      `access_token` returns (or timeout).\r\n *   5. Persist { access_token, refresh_token, expiry_date,\r\n *      resource_url } to ~/.qwen/oauth_creds.json.\r\n *\r\n * `resource_url` is the endpoint the token authenticates against \u2014 it\r\n * may differ from the default DashScope base per user account. The\r\n * token manager uses this when constructing upstream URLs.\r\n */\r\n\r\nimport { createHash, randomBytes, randomUUID } from 'crypto'\r\n\r\n// \u2500\u2500\u2500 Endpoints (from reference/qwen-code-main) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nconst QWEN_OAUTH_BASE = 'https://chat.qwen.ai'\r\nexport const QWEN_OAUTH_DEVICE_CODE_ENDPOINT = `${QWEN_OAUTH_BASE}/api/v1/oauth2/device/code`\r\nexport const QWEN_OAUTH_TOKEN_ENDPOINT = `${QWEN_OAUTH_BASE}/api/v1/oauth2/token`\r\n\r\nexport const QWEN_OAUTH_CLIENT_ID = 'f0304373b74a44d2b584a3fb70ca9e56'\r\nexport const QWEN_OAUTH_SCOPE = 'openid profile email model.completion'\r\nexport const QWEN_OAUTH_GRANT_TYPE = 'urn:ietf:params:oauth:grant-type:device_code'\r\n\r\n// \u2500\u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport interface QwenCredentials {\r\n  access_token: string\r\n  refresh_token?: string\r\n  id_token?: string\r\n  /** Absolute ms since epoch when access_token expires. */\r\n  expiry_date: number\r\n  token_type?: string\r\n  /** Account-specific API endpoint (may differ from default DashScope). */\r\n  resource_url?: string\r\n}\r\n\r\nexport interface DeviceAuthorization {\r\n  device_code: string\r\n  user_code: string\r\n  verification_uri: string\r\n  verification_uri_complete: string\r\n  expires_in: number\r\n  /** Polling interval in seconds, per RFC 8628. Default 5. */\r\n  interval?: number\r\n}\r\n\r\nexport interface PKCEPair {\r\n  verifier: string\r\n  challenge: string\r\n}\r\n\r\nexport class QwenCredentialsExpiredError extends Error {\r\n  constructor(message: string) {\r\n    super(message)\r\n    this.name = 'QwenCredentialsExpiredError'\r\n  }\r\n}\r\n\r\n// \u2500\u2500\u2500 PKCE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport function generatePKCE(): PKCEPair {\r\n  const verifier = base64url(randomBytes(32))\r\n  const challenge = base64url(createHash('sha256').update(verifier).digest())\r\n  return { verifier, challenge }\r\n}\r\n\r\nfunction base64url(buf: Buffer): string {\r\n  return buf.toString('base64')\r\n    .replace(/\\+/g, '-')\r\n    .replace(/\\//g, '_')\r\n    .replace(/=+$/, '')\r\n}\r\n\r\n// \u2500\u2500\u2500 Form encoding \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nfunction formEncode(body: Record<string, string>): string {\r\n  return Object.entries(body)\r\n    .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)\r\n    .join('&')\r\n}\r\n\r\n// \u2500\u2500\u2500 Device authorization \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n/**\r\n * Step 1: request device + user codes. Call before opening the browser.\r\n */\r\nexport async function requestDeviceAuthorization(pkce: PKCEPair): Promise<DeviceAuthorization> {\r\n  const resp = await fetch(QWEN_OAUTH_DEVICE_CODE_ENDPOINT, {\r\n    method: 'POST',\r\n    headers: {\r\n      'Content-Type': 'application/x-www-form-urlencoded',\r\n      Accept: 'application/json',\r\n      'x-request-id': randomUUID(),\r\n    },\r\n    body: formEncode({\r\n      client_id: QWEN_OAUTH_CLIENT_ID,\r\n      scope: QWEN_OAUTH_SCOPE,\r\n      code_challenge: pkce.challenge,\r\n      code_challenge_method: 'S256',\r\n    }),\r\n  })\r\n  if (!resp.ok) {\r\n    const text = await resp.text().catch(() => '')\r\n    throw new Error(`Qwen device authorization failed (${resp.status}): ${text.slice(0, 200)}`)\r\n  }\r\n  const data = await resp.json() as DeviceAuthorization | { error: string; error_description?: string }\r\n  if ('error' in data) {\r\n    throw new Error(\r\n      `Qwen device authorization error: ${data.error}${data.error_description ? ` \u2014 ${data.error_description}` : ''}`,\r\n    )\r\n  }\r\n  return data\r\n}\r\n\r\n// \u2500\u2500\u2500 Polling for the token \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\ntype PollResult =\r\n  | { status: 'success'; credentials: QwenCredentials }\r\n  | { status: 'pending'; slowDown?: boolean }\r\n  | { status: 'error'; message: string }\r\n\r\n/**\r\n * Step 2: poll the token endpoint until the user approves (or times out).\r\n * Caller controls the polling cadence \u2014 start with `auth.interval ?? 5`\r\n * seconds between calls and double to \u226430s on `slowDown`.\r\n */\r\nexport async function pollDeviceToken(\r\n  deviceCode: string,\r\n  verifier: string,\r\n): Promise<PollResult> {\r\n  const resp = await fetch(QWEN_OAUTH_TOKEN_ENDPOINT, {\r\n    method: 'POST',\r\n    headers: {\r\n      'Content-Type': 'application/x-www-form-urlencoded',\r\n      Accept: 'application/json',\r\n    },\r\n    body: formEncode({\r\n      grant_type: QWEN_OAUTH_GRANT_TYPE,\r\n      client_id: QWEN_OAUTH_CLIENT_ID,\r\n      device_code: deviceCode,\r\n      code_verifier: verifier,\r\n    }),\r\n  })\r\n  const text = await resp.text().catch(() => '')\r\n\r\n  if (!resp.ok) {\r\n    let err: { error?: string; error_description?: string } | null = null\r\n    try { err = JSON.parse(text) } catch { err = null }\r\n    if (resp.status === 400 && err?.error === 'authorization_pending') {\r\n      return { status: 'pending' }\r\n    }\r\n    if (resp.status === 429 && err?.error === 'slow_down') {\r\n      return { status: 'pending', slowDown: true }\r\n    }\r\n    return {\r\n      status: 'error',\r\n      message: err?.error_description ?? err?.error ?? text.slice(0, 200),\r\n    }\r\n  }\r\n\r\n  let payload: {\r\n    access_token?: string\r\n    refresh_token?: string\r\n    id_token?: string\r\n    token_type?: string\r\n    expires_in?: number\r\n    resource_url?: string\r\n  }\r\n  try {\r\n    payload = JSON.parse(text)\r\n  } catch {\r\n    return { status: 'error', message: 'Qwen token response was not JSON' }\r\n  }\r\n  if (!payload.access_token) {\r\n    return { status: 'pending' }\r\n  }\r\n  const expiresInSec = payload.expires_in ?? 3600\r\n  return {\r\n    status: 'success',\r\n    credentials: {\r\n      access_token: payload.access_token,\r\n      refresh_token: payload.refresh_token,\r\n      id_token: payload.id_token,\r\n      token_type: payload.token_type ?? 'Bearer',\r\n      expiry_date: Date.now() + expiresInSec * 1000,\r\n      resource_url: payload.resource_url,\r\n    },\r\n  }\r\n}\r\n\r\n/**\r\n * Poll with adaptive backoff until the user completes the flow or the\r\n * device code expires. Throws on fatal errors (access_denied, expired,\r\n * etc.). The caller displays user_code + verification_uri and opens\r\n * the browser; this function handles the polling loop.\r\n */\r\nexport async function awaitDeviceToken(\r\n  auth: DeviceAuthorization,\r\n  verifier: string,\r\n  signal?: AbortSignal,\r\n): Promise<QwenCredentials> {\r\n  const startedAt = Date.now()\r\n  const expiresAt = startedAt + auth.expires_in * 1000\r\n  let intervalMs = (auth.interval ?? 5) * 1000\r\n\r\n  // eslint-disable-next-line no-constant-condition\r\n  while (true) {\r\n    if (signal?.aborted) throw new DOMException('Aborted', 'AbortError')\r\n    if (Date.now() >= expiresAt) {\r\n      throw new Error('Qwen device authorization expired; run /login qwen again')\r\n    }\r\n    const result = await pollDeviceToken(auth.device_code, verifier)\r\n    if (result.status === 'success') return result.credentials\r\n    if (result.status === 'error') throw new Error(`Qwen OAuth failed: ${result.message}`)\r\n    if (result.slowDown) intervalMs = Math.min(intervalMs * 2, 30_000)\r\n    await sleep(intervalMs, signal)\r\n  }\r\n}\r\n\r\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\r\n  return new Promise((resolve, reject) => {\r\n    if (signal?.aborted) return reject(new DOMException('Aborted', 'AbortError'))\r\n    const t = setTimeout(() => {\r\n      signal?.removeEventListener('abort', onAbort)\r\n      resolve()\r\n    }, ms)\r\n    const onAbort = (): void => {\r\n      clearTimeout(t)\r\n      reject(new DOMException('Aborted', 'AbortError'))\r\n    }\r\n    signal?.addEventListener('abort', onAbort, { once: true })\r\n  })\r\n}\r\n\r\n// \u2500\u2500\u2500 Refresh \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n/**\r\n * Refresh an expired access token. Returns updated credentials \u2014 the\r\n * OAuth server may or may not rotate the refresh_token (we preserve\r\n * the existing one if it doesn't).\r\n *\r\n * Throws `QwenCredentialsExpiredError` when the server says the\r\n * refresh token itself is invalid (400/401), so the caller can prompt\r\n * for re-authentication rather than loop forever.\r\n */\r\nexport async function refreshAccessToken(creds: QwenCredentials): Promise<QwenCredentials> {\r\n  if (!creds.refresh_token) {\r\n    throw new QwenCredentialsExpiredError('No refresh token; re-run /login qwen')\r\n  }\r\n  const resp = await fetch(QWEN_OAUTH_TOKEN_ENDPOINT, {\r\n    method: 'POST',\r\n    headers: {\r\n      'Content-Type': 'application/x-www-form-urlencoded',\r\n      Accept: 'application/json',\r\n    },\r\n    body: formEncode({\r\n      grant_type: 'refresh_token',\r\n      refresh_token: creds.refresh_token,\r\n      client_id: QWEN_OAUTH_CLIENT_ID,\r\n    }),\r\n  })\r\n  const text = await resp.text().catch(() => '')\r\n  if (!resp.ok) {\r\n    if (resp.status === 400 || resp.status === 401) {\r\n      throw new QwenCredentialsExpiredError(\r\n        `Qwen refresh token rejected (${resp.status}); re-run /login qwen`,\r\n      )\r\n    }\r\n    throw new Error(`Qwen refresh failed (${resp.status}): ${text.slice(0, 200)}`)\r\n  }\r\n  let payload: {\r\n    access_token?: string\r\n    refresh_token?: string\r\n    token_type?: string\r\n    expires_in?: number\r\n    resource_url?: string\r\n  }\r\n  try {\r\n    payload = JSON.parse(text)\r\n  } catch {\r\n    throw new Error('Qwen refresh returned non-JSON response')\r\n  }\r\n  if (!payload.access_token) {\r\n    throw new Error('Qwen refresh returned no access_token')\r\n  }\r\n  const expiresInSec = payload.expires_in ?? 3600\r\n  return {\r\n    ...creds,\r\n    access_token: payload.access_token,\r\n    refresh_token: payload.refresh_token ?? creds.refresh_token,\r\n    token_type: payload.token_type ?? creds.token_type ?? 'Bearer',\r\n    expiry_date: Date.now() + expiresInSec * 1000,\r\n    resource_url: payload.resource_url ?? creds.resource_url,\r\n  }\r\n}\r\n", "/**\r\n * Qwen token lifecycle \u2014 file-backed, refresh-on-demand, race-safe.\r\n *\r\n * Port of reference/qwen-code-main/packages/core/src/qwen/sharedTokenManager.ts\r\n * adapted for claudex (no Config dependency; smaller API surface).\r\n *\r\n * Behavior:\r\n *   - Load from ~/.qwen/oauth_creds.json on first access.\r\n *   - Return cached access_token if still valid (>30s until expiry).\r\n *   - Otherwise refresh via oauth.refreshAccessToken(), persist, return.\r\n *   - Single in-process mutex so concurrent callers share one refresh.\r\n *   - Atomic file write (tmp + rename) to avoid torn reads across procs.\r\n *\r\n * File format matches the qwen-code reference so existing Qwen Code\r\n * installations can share credentials if the user opts in.\r\n */\r\n\r\nimport { readFile, writeFile, mkdir, rename } from 'fs/promises'\r\nimport { join } from 'path'\r\nimport { homedir } from 'os'\r\nimport { existsSync } from 'fs'\r\nimport {\r\n  type QwenCredentials,\r\n  QwenCredentialsExpiredError,\r\n  refreshAccessToken,\r\n} from './oauth.js'\r\n\r\nconst QWEN_DIR = join(homedir(), '.qwen')\r\nconst QWEN_CRED_FILE = join(QWEN_DIR, 'oauth_creds.json')\r\n\r\n/** Cushion before server-side expiry to force refresh. */\r\nconst REFRESH_SKEW_MS = 30_000\r\n\r\nexport class QwenTokenManager {\r\n  private creds: QwenCredentials | null = null\r\n  private loaded = false\r\n  private refreshing: Promise<QwenCredentials> | null = null\r\n\r\n  /**\r\n   * Return a valid access token, refreshing if close to expiry.\r\n   * Throws `QwenCredentialsExpiredError` if refresh fails terminally \u2014\r\n   * caller should surface to the user as \"run /login qwen again\".\r\n   */\r\n  async getAccessToken(): Promise<string> {\r\n    const creds = await this.ensureValid()\r\n    return creds.access_token\r\n  }\r\n\r\n  /** Return valid credentials (access_token + resource_url + more). */\r\n  async getCredentials(): Promise<QwenCredentials> {\r\n    return this.ensureValid()\r\n  }\r\n\r\n  /**\r\n   * Persist fresh credentials (called after `/login qwen` completes).\r\n   * Overwrites the file atomically.\r\n   */\r\n  async setCredentials(creds: QwenCredentials): Promise<void> {\r\n    this.creds = creds\r\n    this.loaded = true\r\n    await this.persist(creds)\r\n  }\r\n\r\n  /** Clear credentials (called on permanent refresh failure). */\r\n  async clear(): Promise<void> {\r\n    this.creds = null\r\n    this.loaded = true\r\n    try {\r\n      await writeFile(QWEN_CRED_FILE, '{}', { encoding: 'utf-8', mode: 0o600 })\r\n    } catch {\r\n      // best-effort\r\n    }\r\n  }\r\n\r\n  /** Whether a set of credentials is currently loaded. */\r\n  async hasCredentials(): Promise<boolean> {\r\n    if (!this.loaded) await this.load()\r\n    return this.creds != null && !!this.creds.access_token\r\n  }\r\n\r\n  // \u2500\u2500\u2500 Internals \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n  private async ensureValid(): Promise<QwenCredentials> {\r\n    if (!this.loaded) await this.load()\r\n    if (!this.creds) {\r\n      throw new QwenCredentialsExpiredError('No Qwen credentials; run /login qwen')\r\n    }\r\n    if (this.creds.expiry_date - Date.now() > REFRESH_SKEW_MS) {\r\n      return this.creds\r\n    }\r\n    // Refresh \u2014 coalesce concurrent callers onto one request.\r\n    if (!this.refreshing) {\r\n      this.refreshing = this.doRefresh(this.creds).finally(() => {\r\n        this.refreshing = null\r\n      })\r\n    }\r\n    return this.refreshing\r\n  }\r\n\r\n  private async doRefresh(old: QwenCredentials): Promise<QwenCredentials> {\r\n    try {\r\n      const next = await refreshAccessToken(old)\r\n      this.creds = next\r\n      await this.persist(next)\r\n      return next\r\n    } catch (err) {\r\n      if (err instanceof QwenCredentialsExpiredError) {\r\n        await this.clear()\r\n      }\r\n      throw err\r\n    }\r\n  }\r\n\r\n  private async load(): Promise<void> {\r\n    this.loaded = true\r\n    if (!existsSync(QWEN_CRED_FILE)) return\r\n    try {\r\n      const raw = await readFile(QWEN_CRED_FILE, 'utf-8')\r\n      const parsed = JSON.parse(raw) as QwenCredentials | Record<string, never>\r\n      if (parsed && typeof parsed === 'object' && 'access_token' in parsed && parsed.access_token) {\r\n        this.creds = parsed as QwenCredentials\r\n      }\r\n    } catch {\r\n      // Corrupt file \u2192 ignore; user re-runs /login qwen.\r\n    }\r\n  }\r\n\r\n  private async persist(creds: QwenCredentials): Promise<void> {\r\n    try {\r\n      if (!existsSync(QWEN_DIR)) {\r\n        await mkdir(QWEN_DIR, { recursive: true, mode: 0o700 })\r\n      }\r\n      const tmp = QWEN_CRED_FILE + '.tmp'\r\n      await writeFile(tmp, JSON.stringify(creds, null, 2), {\r\n        encoding: 'utf-8',\r\n        mode: 0o600,\r\n      })\r\n      await rename(tmp, QWEN_CRED_FILE)\r\n    } catch {\r\n      // best-effort \u2014 in-memory state still works this session.\r\n    }\r\n  }\r\n}\r\n\r\n// \u2500\u2500\u2500 Singleton \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nlet _singleton: QwenTokenManager | null = null\r\n\r\nexport function getQwenTokenManager(): QwenTokenManager {\r\n  if (!_singleton) _singleton = new QwenTokenManager()\r\n  return _singleton\r\n}\r\n\r\nexport function _resetQwenTokenManagerForTest(): void {\r\n  _singleton = null\r\n}\r\n", "/**\r\n * Qwen API client \u2014 OpenAI Chat Completions shape, dual auth paths.\r\n *\r\n * Auth:\r\n *   - OAuth via QwenTokenManager (account-specific resource_url)\r\n *   - API key via DashScope compatible-mode endpoint\r\n *\r\n * Both endpoints speak OpenAI's /v1/chat/completions wire format; the\r\n * tool surface Qwen was post-trained on is OpenAI function-calling.\r\n * Reference: reference/qwen-code-main/packages/core/src/qwen/qwenContentGenerator.ts\r\n */\r\n\r\nimport { getQwenTokenManager } from './token_manager.js'\r\nimport { QwenCredentialsExpiredError } from './oauth.js'\r\n\r\n// Duplicated from services/api/errors.ts to avoid pulling the rest of\r\n// that module into the test runtime (errors.ts transitively imports\r\n// utils/messages.ts which has build-time-only module resolution).\r\nconst PROMPT_TOO_LONG_ERROR_MESSAGE = 'Prompt is too long'\r\n\r\n// DashScope compatible-mode base URL (OpenAI-shape proxy over Qwen).\r\nconst DASHSCOPE_DEFAULT_BASE = 'https://dashscope.aliyuncs.com/compatible-mode/v1'\r\n\r\nexport type QwenAuth =\r\n  | { kind: 'oauth' }                            // uses token_manager\r\n  | { kind: 'api_key'; apiKey: string; baseUrl?: string }\r\n\r\nexport interface QwenChatMessage {\r\n  role: 'system' | 'user' | 'assistant' | 'tool'\r\n  content?: string | null\r\n  tool_calls?: Array<{\r\n    id: string\r\n    type: 'function'\r\n    function: { name: string; arguments: string }\r\n  }>\r\n  tool_call_id?: string\r\n  name?: string\r\n}\r\n\r\nexport interface QwenTool {\r\n  type: 'function'\r\n  function: {\r\n    name: string\r\n    description: string\r\n    parameters: Record<string, unknown>\r\n    /**\r\n     * Server-side schema enforcement \u2014 the OpenAI Chat Completions\r\n     * analogue of Gemini's VALIDATED mode. DashScope honors it for\r\n     * reasoning + function-capable Qwen families; upstream models that\r\n     * don't support it ignore the field rather than error, so it's\r\n     * always safe to include.\r\n     */\r\n    strict?: boolean\r\n  }\r\n}\r\n\r\nexport interface QwenChatRequest {\r\n  model: string\r\n  messages: QwenChatMessage[]\r\n  stream: boolean\r\n  stream_options?: { include_usage?: boolean }\r\n  tools?: QwenTool[]\r\n  tool_choice?: 'auto' | 'required' | 'none'\r\n  max_tokens?: number\r\n  temperature?: number\r\n  top_p?: number\r\n  stop?: string[]\r\n}\r\n\r\nexport interface QwenStreamChunk {\r\n  id?: string\r\n  choices?: Array<{\r\n    index: number\r\n    delta?: {\r\n      content?: string\r\n      role?: string\r\n      reasoning_content?: string\r\n      tool_calls?: Array<{\r\n        index: number\r\n        id?: string\r\n        type?: string\r\n        function?: { name?: string; arguments?: string }\r\n      }>\r\n    }\r\n    finish_reason?: string | null\r\n  }>\r\n  usage?: {\r\n    prompt_tokens?: number\r\n    completion_tokens?: number\r\n    total_tokens?: number\r\n    prompt_tokens_details?: { cached_tokens?: number }\r\n  }\r\n}\r\n\r\n// \u2500\u2500\u2500 Error \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport class QwenApiError extends Error {\r\n  readonly isPromptTooLong: boolean\r\n\r\n  constructor(\r\n    public readonly status: number,\r\n    public readonly body: string,\r\n    public readonly retryAfterMs?: number,\r\n  ) {\r\n    const ptl = /prompt is too long|context length|token limit/i.test(body)\r\n    const head = ptl\r\n      ? `${PROMPT_TOO_LONG_ERROR_MESSAGE} (Qwen ${status})`\r\n      : `Qwen API error ${status}`\r\n    super(`${head}: ${body.slice(0, 200)}`)\r\n    this.name = 'QwenApiError'\r\n    this.isPromptTooLong = ptl\r\n  }\r\n\r\n  get isRetryable(): boolean {\r\n    if (this.status === 400) return false\r\n    return this.status === 429 || this.status === 499 || (this.status >= 500 && this.status < 600)\r\n  }\r\n}\r\n\r\n// \u2500\u2500\u2500 Client \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport class QwenApiClient {\r\n  private auth: QwenAuth = { kind: 'oauth' }\r\n\r\n  configure(auth: QwenAuth): void {\r\n    this.auth = auth\r\n  }\r\n\r\n  /** Has valid credentials available. */\r\n  async isConfigured(): Promise<boolean> {\r\n    if (this.auth.kind === 'api_key') return !!this.auth.apiKey\r\n    return await getQwenTokenManager().hasCredentials()\r\n  }\r\n\r\n  async *streamChat(\r\n    request: QwenChatRequest,\r\n    signal?: AbortSignal,\r\n  ): AsyncGenerator<QwenStreamChunk> {\r\n    const { url, headers } = await this.resolveTarget()\r\n    const resp = await fetch(`${url}/chat/completions`, {\r\n      method: 'POST',\r\n      headers: { ...headers, 'Content-Type': 'application/json' },\r\n      body: JSON.stringify({ ...request, stream: true }),\r\n      signal,\r\n    })\r\n    if (!resp.ok) {\r\n      const text = await resp.text().catch(() => '')\r\n      const retryAfterMs = parseRetryAfter(resp.headers.get('retry-after'))\r\n      throw new QwenApiError(resp.status, text, retryAfterMs)\r\n    }\r\n    if (!resp.body) throw new QwenApiError(0, 'No response body')\r\n\r\n    const reader = resp.body.getReader()\r\n    const decoder = new TextDecoder()\r\n    let buffer = ''\r\n    try {\r\n      while (true) {\r\n        const { done, value } = await reader.read()\r\n        if (done) break\r\n        buffer += decoder.decode(value, { stream: true })\r\n        const lines = buffer.split('\\n')\r\n        buffer = lines.pop() ?? ''\r\n        for (const line of lines) {\r\n          if (!line.startsWith('data: ')) continue\r\n          const data = line.slice(6).trim()\r\n          if (!data || data === '[DONE]') {\r\n            if (data === '[DONE]') return\r\n            continue\r\n          }\r\n          try {\r\n            yield JSON.parse(data) as QwenStreamChunk\r\n          } catch {\r\n            // skip malformed chunk\r\n          }\r\n        }\r\n      }\r\n      if (buffer.startsWith('data: ')) {\r\n        const data = buffer.slice(6).trim()\r\n        if (data && data !== '[DONE]') {\r\n          try {\r\n            yield JSON.parse(data) as QwenStreamChunk\r\n          } catch { /* skip */ }\r\n        }\r\n      }\r\n    } finally {\r\n      reader.releaseLock()\r\n    }\r\n  }\r\n\r\n  /** Resolve target URL + headers per current auth mode. */\r\n  private async resolveTarget(): Promise<{ url: string; headers: Record<string, string> }> {\r\n    if (this.auth.kind === 'api_key') {\r\n      return {\r\n        url: this.auth.baseUrl ?? DASHSCOPE_DEFAULT_BASE,\r\n        headers: { Authorization: `Bearer ${this.auth.apiKey}` },\r\n      }\r\n    }\r\n    // OAuth path\r\n    const mgr = getQwenTokenManager()\r\n    const creds = await mgr.getCredentials().catch(e => {\r\n      if (e instanceof QwenCredentialsExpiredError) throw e\r\n      throw e\r\n    })\r\n    // resource_url from the token is the authoritative API endpoint\r\n    // for this account \u2014 fall back to DashScope default when absent.\r\n    const base = creds.resource_url\r\n      ? normalizeBase(creds.resource_url)\r\n      : DASHSCOPE_DEFAULT_BASE\r\n    return {\r\n      url: base,\r\n      headers: { Authorization: `Bearer ${creds.access_token}` },\r\n    }\r\n  }\r\n}\r\n\r\nfunction normalizeBase(url: string): string {\r\n  let u = url.trim()\r\n  if (!u.startsWith('http://') && !u.startsWith('https://')) u = 'https://' + u\r\n  if (u.endsWith('/')) u = u.slice(0, -1)\r\n  if (!u.endsWith('/v1')) u += '/v1'\r\n  return u\r\n}\r\n\r\nfunction parseRetryAfter(v: string | null): number | undefined {\r\n  if (!v) return undefined\r\n  const asSec = Number(v)\r\n  if (!isNaN(asSec)) return Math.max(0, asSec * 1000)\r\n  const asDate = Date.parse(v)\r\n  if (!isNaN(asDate)) return Math.max(0, asDate - Date.now())\r\n  return undefined\r\n}\r\n\r\n// \u2500\u2500\u2500 Singleton \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport const qwenApi = new QwenApiClient()\r\n", "/**\r\n * Qwen Lane \u2014 native agent loop + provider-shim entry.\r\n *\r\n * Qwen was post-trained against OpenAI function-calling, so the wire\r\n * format is Chat Completions. Two auth paths:\r\n *\r\n *   1. OAuth (chat.qwen.ai \u2192 DashScope or account resource_url)\r\n *   2. API key (DashScope compatible-mode)\r\n *\r\n * Like other lanes: streamAsProvider is the single-API-call entry;\r\n * tool results flow back via the outer claude.ts loop which calls us\r\n * again with updated history.\r\n *\r\n * Reference: reference/qwen-code-main/packages/core/src/qwen/qwenContentGenerator.ts\r\n */\r\n\r\nimport { randomUUID } from 'crypto'\r\nimport type {\r\n  AnthropicStreamEvent,\r\n  ModelInfo,\r\n  ProviderMessage,\r\n} from '../../services/api/providers/base_provider.js'\r\nimport type {\r\n  Lane,\r\n  LaneProviderCallParams,\r\n  LaneRunContext,\r\n  LaneRunResult,\r\n  NormalizedUsage,\r\n} from '../types.js'\r\nimport {\r\n  QWEN_TOOL_REGISTRY,\r\n  getQwenRegistrationByNativeName,\r\n  buildQwenTools,\r\n} from './tools.js'\r\nimport { qwenApi, type QwenChatMessage, type QwenStreamChunk, type QwenTool } from './api.js'\r\nimport {\r\n  sanitizeSchemaForLane,\r\n  appendStrictParamsHint,\r\n  QWEN_TOOL_USAGE_RULES,\r\n} from '../shared/mcp_bridge.js'\r\n\r\nconst MAX_TURNS = 100\r\n\r\n// \u2500\u2500\u2500 Lane \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport class QwenLane implements Lane {\r\n  readonly name = 'qwen'\r\n  readonly displayName = 'Qwen (Native, OAuth + DashScope)'\r\n\r\n  private _healthy = true\r\n\r\n  supportsModel(model: string): boolean {\r\n    const m = model.toLowerCase()\r\n    return m.startsWith('qwen') || m === 'coder-model' || m.includes('qwen3-coder')\r\n  }\r\n\r\n  async *streamAsProvider(\r\n    params: LaneProviderCallParams,\r\n  ): AsyncGenerator<AnthropicStreamEvent, NormalizedUsage> {\r\n    const { model, messages, system, tools, max_tokens, temperature, stop_sequences, signal } = params\r\n    const systemText = typeof system === 'string'\r\n      ? system\r\n      : (system ?? []).map(b => b.text).join('\\n\\n')\r\n\r\n    const toolUseIdToNative = buildToolUseIdToNativeMap(messages)\r\n    const qwenTools = buildQwenToolsForRequest(tools)\r\n\r\n    // Prepend QWEN_TOOL_USAGE_RULES to the system message when tools are\r\n    // present. Qwen3-Coder benefits measurably from the explicit\r\n    // required-field + case-sensitivity reminder even with `strict: true`\r\n    // on each tool \u2014 the server-side enforcement is reactive, this\r\n    // pre-empts the call shape.\r\n    const systemWithRules = qwenTools.length > 0\r\n      ? (systemText ? `${QWEN_TOOL_USAGE_RULES}\\n${systemText}` : QWEN_TOOL_USAGE_RULES)\r\n      : systemText\r\n\r\n    const chatMessages: QwenChatMessage[] = []\r\n    if (systemWithRules) chatMessages.push({ role: 'system', content: systemWithRules })\r\n    chatMessages.push(...convertHistoryToQwen(messages, toolUseIdToNative))\r\n\r\n    const request = {\r\n      model,\r\n      messages: chatMessages,\r\n      stream: true,\r\n      stream_options: { include_usage: true },\r\n      tools: qwenTools.length > 0 ? qwenTools : undefined,\r\n      tool_choice: qwenTools.length > 0 ? 'auto' as const : undefined,\r\n      max_tokens,\r\n      temperature,\r\n      stop: stop_sequences,\r\n    }\r\n\r\n    // \u2500\u2500 Stream state \u2500\u2500\r\n    const messageId = `qwen-${Date.now()}`\r\n    let blockIndex = 0\r\n    let inBlock: 'text' | 'thinking' | null = null\r\n    let inputTokens = 0\r\n    let outputTokens = 0\r\n    let cachedTokens = 0\r\n    let messageStartEmitted = false\r\n\r\n    interface ToolCallBuf {\r\n      id: string\r\n      nativeName: string\r\n      args: string\r\n      anthropicToolUseId: string\r\n      emitted: boolean\r\n    }\r\n    const toolCallsByIndex = new Map<number, ToolCallBuf>()\r\n\r\n    const emitMessageStart = (): AnthropicStreamEvent | undefined => {\r\n      if (messageStartEmitted) return undefined\r\n      messageStartEmitted = true\r\n      return {\r\n        type: 'message_start',\r\n        message: {\r\n          id: messageId,\r\n          type: 'message',\r\n          role: 'assistant',\r\n          content: [],\r\n          model,\r\n          stop_reason: null,\r\n          stop_sequence: null,\r\n          usage: {\r\n            input_tokens: inputTokens,\r\n            output_tokens: 0,\r\n            ...(cachedTokens > 0 && {\r\n              cache_read_input_tokens: cachedTokens,\r\n              cache_creation_input_tokens: 0,\r\n            }),\r\n          },\r\n        },\r\n      }\r\n    }\r\n\r\n    try {\r\n      for await (const chunk of qwenApi.streamChat(request, signal)) {\r\n        if (signal.aborted) break\r\n\r\n        if (chunk.usage) {\r\n          inputTokens = chunk.usage.prompt_tokens ?? inputTokens\r\n          outputTokens = chunk.usage.completion_tokens ?? outputTokens\r\n          cachedTokens = chunk.usage.prompt_tokens_details?.cached_tokens ?? cachedTokens\r\n        }\r\n        if (!messageStartEmitted) {\r\n          const ev = emitMessageStart()\r\n          if (ev) yield ev\r\n        }\r\n\r\n        for (const choice of chunk.choices ?? []) {\r\n          const delta = choice.delta ?? {}\r\n\r\n          // Reasoning-content delta \u2192 thinking block.\r\n          if (typeof delta.reasoning_content === 'string' && delta.reasoning_content.length > 0) {\r\n            if (inBlock === 'text') {\r\n              yield { type: 'content_block_stop', index: blockIndex }\r\n              blockIndex++\r\n              inBlock = null\r\n            }\r\n            if (inBlock !== 'thinking') {\r\n              yield {\r\n                type: 'content_block_start',\r\n                index: blockIndex,\r\n                content_block: { type: 'thinking', thinking: '' },\r\n              }\r\n              inBlock = 'thinking'\r\n            }\r\n            yield {\r\n              type: 'content_block_delta',\r\n              index: blockIndex,\r\n              delta: { type: 'thinking_delta', thinking: delta.reasoning_content },\r\n            }\r\n          }\r\n\r\n          // Text content delta.\r\n          if (typeof delta.content === 'string' && delta.content.length > 0) {\r\n            if (inBlock === 'thinking') {\r\n              yield { type: 'content_block_stop', index: blockIndex }\r\n              blockIndex++\r\n              inBlock = null\r\n            }\r\n            if (inBlock !== 'text') {\r\n              yield {\r\n                type: 'content_block_start',\r\n                index: blockIndex,\r\n                content_block: { type: 'text', text: '' },\r\n              }\r\n              inBlock = 'text'\r\n            }\r\n            yield {\r\n              type: 'content_block_delta',\r\n              index: blockIndex,\r\n              delta: { type: 'text_delta', text: delta.content },\r\n            }\r\n          }\r\n\r\n          // Tool-call deltas \u2014 buffer by index, emit on finish_reason.\r\n          for (const tc of delta.tool_calls ?? []) {\r\n            const idx = tc.index\r\n            let buf = toolCallsByIndex.get(idx)\r\n            if (!buf) {\r\n              buf = {\r\n                id: tc.id ?? `toolu_qwen_${randomUUID()}`,\r\n                nativeName: tc.function?.name ?? '',\r\n                args: '',\r\n                anthropicToolUseId: tc.id ?? `toolu_qwen_${randomUUID()}`,\r\n                emitted: false,\r\n              }\r\n              toolCallsByIndex.set(idx, buf)\r\n            }\r\n            if (tc.function?.name) buf.nativeName = tc.function.name\r\n            if (tc.function?.arguments) buf.args += tc.function.arguments\r\n          }\r\n\r\n          if (choice.finish_reason) {\r\n            // Close any streaming text/thinking.\r\n            if (inBlock !== null) {\r\n              yield { type: 'content_block_stop', index: blockIndex }\r\n              blockIndex++\r\n              inBlock = null\r\n            }\r\n            // Emit atomic tool_use blocks for any buffered calls.\r\n            for (const buf of toolCallsByIndex.values()) {\r\n              if (buf.emitted) continue\r\n              buf.emitted = true\r\n              let parsedArgs: Record<string, unknown> = {}\r\n              try {\r\n                parsedArgs = buf.args ? JSON.parse(buf.args) : {}\r\n              } catch {\r\n                parsedArgs = {}\r\n              }\r\n              const reg = getQwenRegistrationByNativeName(buf.nativeName)\r\n              const implId = reg?.implId ?? buf.nativeName\r\n              const adapted = reg ? reg.adaptInput(parsedArgs) : parsedArgs\r\n              // Three-event sequence: start (empty input) + input_json_delta\r\n              // carrying JSON-stringified args + stop. Required for the\r\n              // claude.ts accumulator to capture the args.\r\n              yield {\r\n                type: 'content_block_start',\r\n                index: blockIndex,\r\n                content_block: {\r\n                  type: 'tool_use',\r\n                  id: buf.anthropicToolUseId,\r\n                  name: implId,\r\n                  input: {},\r\n                },\r\n              }\r\n              yield {\r\n                type: 'content_block_delta',\r\n                index: blockIndex,\r\n                delta: {\r\n                  type: 'input_json_delta',\r\n                  partial_json: JSON.stringify(adapted ?? {}),\r\n                },\r\n              }\r\n              yield { type: 'content_block_stop', index: blockIndex }\r\n              blockIndex++\r\n            }\r\n          }\r\n        }\r\n      }\r\n    } catch (err: any) {\r\n      if (!messageStartEmitted) {\r\n        const ev = emitMessageStart()\r\n        if (ev) yield ev\r\n      }\r\n      if (err?.name === 'AbortError' || signal.aborted) {\r\n        if (inBlock !== null) yield { type: 'content_block_stop', index: blockIndex }\r\n        yield {\r\n          type: 'message_delta',\r\n          delta: { stop_reason: 'end_turn' },\r\n          usage: { output_tokens: outputTokens },\r\n        }\r\n        yield { type: 'message_stop' }\r\n        return {\r\n          input_tokens: inputTokens,\r\n          output_tokens: outputTokens,\r\n          cache_read_tokens: cachedTokens,\r\n          cache_write_tokens: 0,\r\n          thinking_tokens: 0,\r\n        }\r\n      }\r\n      if (inBlock !== null) {\r\n        yield { type: 'content_block_stop', index: blockIndex }\r\n        blockIndex++\r\n      }\r\n      const isPTL = (err as { isPromptTooLong?: boolean })?.isPromptTooLong === true\r\n      const errText = isPTL\r\n        ? (err?.message ?? String(err))\r\n        : `\\n\\nQwen API error: ${err?.message ?? String(err)}`\r\n      yield {\r\n        type: 'content_block_start',\r\n        index: blockIndex,\r\n        content_block: { type: 'text', text: '' },\r\n      }\r\n      yield {\r\n        type: 'content_block_delta',\r\n        index: blockIndex,\r\n        delta: { type: 'text_delta', text: errText },\r\n      }\r\n      yield { type: 'content_block_stop', index: blockIndex }\r\n      yield {\r\n        type: 'message_delta',\r\n        delta: { stop_reason: 'end_turn' },\r\n        usage: { output_tokens: outputTokens },\r\n      }\r\n      yield { type: 'message_stop' }\r\n      return {\r\n        input_tokens: inputTokens,\r\n        output_tokens: outputTokens,\r\n        cache_read_tokens: cachedTokens,\r\n        cache_write_tokens: 0,\r\n        thinking_tokens: 0,\r\n      }\r\n    }\r\n\r\n    if (!messageStartEmitted) {\r\n      const ev = emitMessageStart()\r\n      if (ev) yield ev\r\n    }\r\n    if (inBlock !== null) yield { type: 'content_block_stop', index: blockIndex }\r\n\r\n    const hadToolUse = Array.from(toolCallsByIndex.values()).some(b => b.emitted)\r\n    yield {\r\n      type: 'message_delta',\r\n      delta: { stop_reason: hadToolUse ? 'tool_use' : 'end_turn' },\r\n      usage: { output_tokens: outputTokens },\r\n    }\r\n    yield { type: 'message_stop' }\r\n\r\n    return {\r\n      input_tokens: inputTokens,\r\n      output_tokens: outputTokens,\r\n      cache_read_tokens: cachedTokens,\r\n      cache_write_tokens: 0,\r\n      thinking_tokens: 0,\r\n    }\r\n  }\r\n\r\n  async *run(_ctx: LaneRunContext): AsyncGenerator<AnthropicStreamEvent, LaneRunResult> {\r\n    // Not yet wired; the outer shim still owns the loop.\r\n    return {\r\n      stopReason: 'end_turn',\r\n      usage: {\r\n        input_tokens: 0, output_tokens: 0,\r\n        cache_read_tokens: 0, cache_write_tokens: 0, thinking_tokens: 0,\r\n      },\r\n    }\r\n  }\r\n\r\n  async listModels(): Promise<ModelInfo[]> {\r\n    // Curated list \u2014 matches the Qwen Code reference's defaults.\r\n    // A live /v1/models call is added when the lane moves to Phase-2.\r\n    return [\r\n      { id: 'qwen3-coder-plus', name: 'Qwen3 Coder Plus' },\r\n      { id: 'qwen3-coder-flash', name: 'Qwen3 Coder Flash' },\r\n      { id: 'qwen-max', name: 'Qwen Max' },\r\n      { id: 'qwen-plus', name: 'Qwen Plus' },\r\n      { id: 'qwen-turbo', name: 'Qwen Turbo (fast)' },\r\n    ]\r\n  }\r\n\r\n  resolveModel(model: string): string {\r\n    return model\r\n  }\r\n\r\n  smallFastModel(): string {\r\n    return 'qwen-turbo'\r\n  }\r\n\r\n  isHealthy(): boolean {\r\n    return this._healthy\r\n  }\r\n\r\n  setHealthy(healthy: boolean): void {\r\n    this._healthy = healthy\r\n  }\r\n\r\n  dispose(): void {\r\n    // no-op\r\n  }\r\n}\r\n\r\n// \u2500\u2500\u2500 History conversion \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nfunction buildToolUseIdToNativeMap(messages: ProviderMessage[]): Map<string, string> {\r\n  const map = new Map<string, string>()\r\n  for (const msg of messages) {\r\n    if (typeof msg.content === 'string') continue\r\n    for (const block of msg.content) {\r\n      if (block.type === 'tool_use' && block.id && block.name) {\r\n        map.set(block.id, block.name)\r\n      }\r\n    }\r\n  }\r\n  return map\r\n}\r\n\r\nfunction convertHistoryToQwen(\r\n  messages: ProviderMessage[],\r\n  toolUseIdToNative: Map<string, string>,\r\n): QwenChatMessage[] {\r\n  const out: QwenChatMessage[] = []\r\n  for (const msg of messages) {\r\n    if (msg.role === 'user') {\r\n      // tool_result blocks become role:'tool' messages; plain text stays user.\r\n      if (typeof msg.content === 'string') {\r\n        out.push({ role: 'user', content: msg.content })\r\n        continue\r\n      }\r\n      const textParts: string[] = []\r\n      for (const block of msg.content) {\r\n        if (block.type === 'tool_result') {\r\n          const content = stringifyToolResult(block.content)\r\n          out.push({\r\n            role: 'tool',\r\n            tool_call_id: block.tool_use_id ?? '',\r\n            content,\r\n          })\r\n          continue\r\n        }\r\n        if (block.type === 'text' && block.text) textParts.push(block.text)\r\n      }\r\n      if (textParts.length > 0) out.push({ role: 'user', content: textParts.join('\\n') })\r\n      continue\r\n    }\r\n    // assistant\r\n    if (typeof msg.content === 'string') {\r\n      out.push({ role: 'assistant', content: msg.content })\r\n      continue\r\n    }\r\n    const texts: string[] = []\r\n    const toolCalls: Array<{\r\n      id: string; type: 'function'; function: { name: string; arguments: string }\r\n    }> = []\r\n    for (const block of msg.content) {\r\n      if (block.type === 'text' && block.text) texts.push(block.text)\r\n      if (block.type === 'tool_use' && block.id && block.name) {\r\n        // Prefer the native tool name if we know it; otherwise shared impl id.\r\n        const nativeName = toolUseIdToNative.get(block.id) ?? block.name\r\n        toolCalls.push({\r\n          id: block.id,\r\n          type: 'function',\r\n          function: {\r\n            name: nativeName,\r\n            arguments: JSON.stringify(block.input ?? {}),\r\n          },\r\n        })\r\n      }\r\n    }\r\n    const assistant: QwenChatMessage = {\r\n      role: 'assistant',\r\n      content: texts.length > 0 ? texts.join('\\n') : null,\r\n    }\r\n    if (toolCalls.length > 0) assistant.tool_calls = toolCalls\r\n    out.push(assistant)\r\n  }\r\n  return out\r\n}\r\n\r\nfunction stringifyToolResult(content: unknown): string {\r\n  if (typeof content === 'string') return content\r\n  if (Array.isArray(content)) {\r\n    const texts: string[] = []\r\n    for (const b of content as any[]) {\r\n      if (!b || typeof b !== 'object') continue\r\n      if (typeof b.text === 'string') texts.push(b.text)\r\n      else texts.push(JSON.stringify(b))\r\n    }\r\n    return texts.join('\\n')\r\n  }\r\n  return JSON.stringify(content ?? '')\r\n}\r\n\r\nfunction buildQwenToolsForRequest(\r\n  tools: import('../../services/api/providers/base_provider.js').ProviderTool[],\r\n): QwenTool[] {\r\n  const out: QwenTool[] = []\r\n  for (const tool of tools) {\r\n    // Match by impl id first, then native name, then pass-through.\r\n    // Every tool gets:\r\n    //   - strict: true (server-side schema enforcement, the OpenAI\r\n    //     Chat Completions equivalent of Gemini VALIDATED mode)\r\n    //   - STRICT PARAMETERS description hint (belt-and-suspenders\r\n    //     in-context summary so Flash-like models that ignore `strict`\r\n    //     still see the required-field list in plain text)\r\n    const byImpl = QWEN_TOOL_REGISTRY.find(r => r.implId === tool.name)\r\n    if (byImpl) {\r\n      out.push({\r\n        type: 'function',\r\n        function: {\r\n          name: byImpl.nativeName,\r\n          description: appendStrictParamsHint(byImpl.nativeDescription, byImpl.nativeSchema),\r\n          parameters: byImpl.nativeSchema,\r\n          strict: true,\r\n        },\r\n      })\r\n      continue\r\n    }\r\n    const byNative = getQwenRegistrationByNativeName(tool.name)\r\n    if (byNative) {\r\n      out.push({\r\n        type: 'function',\r\n        function: {\r\n          name: byNative.nativeName,\r\n          description: appendStrictParamsHint(byNative.nativeDescription, byNative.nativeSchema),\r\n          parameters: byNative.nativeSchema,\r\n          strict: true,\r\n        },\r\n      })\r\n      continue\r\n    }\r\n    const parameters = sanitizeSchemaForLane(\r\n      tool.input_schema ?? { type: 'object', properties: {} },\r\n      'qwen',\r\n    )\r\n    out.push({\r\n      type: 'function',\r\n      function: {\r\n        name: tool.name,\r\n        description: appendStrictParamsHint(tool.description ?? '', parameters),\r\n        parameters,\r\n        strict: true,\r\n      },\r\n    })\r\n  }\r\n  return out\r\n}\r\n\r\n// \u2500\u2500\u2500 Singleton \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport const qwenLane = new QwenLane()\r\n", "/**\r\n * Qwen lane \u2014 native system prompt assembly.\r\n *\r\n * Based on reference/qwen-code-main/packages/core/src/prompts/snippets.ts\r\n * (Qwen3-Coder adaptations) plus the cross-lane StableSlot/VolatileSlot\r\n * discipline from shared/system_slots.ts.\r\n */\r\n\r\nimport type { SystemPromptParts } from '../types.js'\r\nimport {\n  type StableSlot,\n  type VolatileSlot,\n  stableFrom,\n  renderVolatileSlot,\n  flatten,\n} from '../shared/system_slots.js'\nimport { WEB_SEARCH_AUTO_USE_GUIDANCE } from '../../tools/WebSearchTool/prompt.js'\n\r\n// \u2500\u2500\u2500 Stable preamble \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nfunction preamble(): string {\r\n  return `You are Qwen Coder, an interactive CLI agent specializing in software engineering.\r\n\r\nYour job: pair-program with the user to read, analyze, modify, and ship code. Carefully assess what information each request needs. Use your tools to gather context before acting. Prefer minimal, targeted changes that follow existing project conventions.`\r\n}\r\n\r\nfunction coreMandates(): string {\r\n  return `## Core Mandates\r\n\r\n- Follow existing project conventions \u2014 read nearby code before writing new code.\r\n- Do NOT assume a library/framework is available without verifying (package.json, imports, nearby files).\r\n- Mimic the surrounding style, naming, and structure.\r\n- Prefer editing existing files over creating new ones.\r\n- Never commit secrets, credentials, or personally-identifying user data.\r\n- If a task has multiple valid approaches, state the tradeoff and let the user pick.\r\n- When unsure, read more code. Don't guess paths, function names, or field names \u2014 search.`\r\n}\r\n\r\nfunction workflow(): string {\r\n  return `## Workflow\r\n\r\n1. Understand \u2014 read relevant files, grep for callers, map the surface area.\r\n2. Plan \u2014 share the approach in 1-3 sentences when it's non-trivial.\r\n3. Execute \u2014 make targeted changes; keep diffs minimal and focused.\r\n4. Verify \u2014 run tests, type checks, or manually probe behavior.\r\n5. Summarize \u2014 tell the user what changed and what's next, briefly.`\r\n}\r\n\r\nfunction toolUsage(): string {\r\n  return `## Tool Usage\r\n\r\n- 'read_file': read before editing. Use 'offset'+'limit' for large files.\r\n- 'edit_file': include unique surrounding context in 'old_string' for precise targeting.\r\n- 'run_shell_command': include a 'description' of what the command does. Prefer native tools (read_file, search_file_content) over shell (cat, grep).\n- 'search_file_content': regex search in file contents. Use this over 'run_shell_command grep'.\n- 'glob': find files by pattern. Use this over 'run_shell_command find'.\n- 'web_search': ${WEB_SEARCH_AUTO_USE_GUIDANCE}\n- 'web_fetch': fetch a specific URL when you already have one.\n\r\nNever call a tool when the answer is already in the current context. Don't re-read files you've just read unless they may have changed.`\r\n}\r\n\r\nfunction operational(): string {\r\n  return `## Style\r\n\r\n- Be concise. Don't narrate what the tool call will do; just do it.\r\n- When referencing code, include file paths (and line numbers when specific).\r\n- Don't refactor code that wasn't part of the task.\r\n- Don't add comments that merely restate what the code does.\r\n- Don't add error handling for scenarios that can't actually occur in this codebase.\r\n- When a tool call fails, diagnose the cause first \u2014 read the exit code (127 = command not found, 2 = misuse, 1 = generic failure) and the error text, then verify what actually exists (binaries, paths, shell context). Don't retry the same call with cosmetic tweaks (different shell, slightly different flags); blind retries burn input tokens without progress. If two attempts fail the same way, stop and investigate.\r\n- For unfamiliar CLIs or APIs, run \\`--help\\` once or read the docs instead of guessing flags and iterating.`\r\n}\r\n\r\nfunction git(): string {\r\n  return `## Git\r\n\r\nThis workspace is (likely) a git repository. Check 'git status' and 'git diff' before committing. Write clear, specific commit messages. Never force-push to shared branches without an explicit user instruction.`\r\n}\r\n\r\n// \u2500\u2500\u2500 Assembly \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport function assembleQwenSystemPrompt(\r\n  model: string,\r\n  parts: SystemPromptParts,\r\n): { stable: StableSlot; volatile: VolatileSlot; full: string } {\r\n  const lanePreamble = [\r\n    preamble(),\r\n    coreMandates(),\r\n    workflow(),\r\n    toolUsage(),\r\n    operational(),\r\n    git(),\r\n  ].join('\\n\\n')\r\n  const stable = stableFrom(lanePreamble, parts)\r\n  const volatile = renderVolatileSlot(parts)\r\n  const full = flatten(stable, volatile)\r\n  return { stable, volatile, full }\r\n}\r\n", "/**\r\n * Qwen Lane entry point.\r\n *\r\n * Two auth paths, auto-detected at init:\r\n *   1. OAuth (default): credentials loaded from ~/.qwen/oauth_creds.json\r\n *      \u2014 populated by the device-code flow in `oauth.ts` via `/login qwen`.\r\n *   2. API key: DASHSCOPE_API_KEY or QWEN_API_KEY env var.\r\n *\r\n * If BOTH are present we prefer OAuth (the user's Qwen account is\r\n * typically the capability the user wants; the API key is the static\r\n * fallback).\r\n */\r\n\r\nexport { qwenLane, QwenLane } from './loop.js'\r\nexport {\r\n  QWEN_TOOL_REGISTRY,\r\n  buildQwenTools,\r\n  getQwenRegistrationByNativeName,\r\n} from './tools.js'\r\nexport { assembleQwenSystemPrompt } from './prompt.js'\r\nexport { qwenApi, QwenApiClient, QwenApiError } from './api.js'\r\nexport {\r\n  generatePKCE,\r\n  requestDeviceAuthorization,\r\n  awaitDeviceToken,\r\n  refreshAccessToken,\r\n  QwenCredentialsExpiredError,\r\n  type QwenCredentials,\r\n  type DeviceAuthorization,\r\n} from './oauth.js'\r\nexport { getQwenTokenManager, QwenTokenManager } from './token_manager.js'\r\n\r\nimport { qwenLane } from './loop.js'\r\nimport { qwenApi } from './api.js'\r\nimport { getQwenTokenManager } from './token_manager.js'\r\nimport { registerLane } from '../dispatcher.js'\r\n\r\nexport function initQwenLane(opts?: {\r\n  apiKey?: string\r\n  baseUrl?: string\r\n  preferOAuth?: boolean\r\n}): void {\r\n  const apiKey = opts?.apiKey\r\n    ?? process.env.DASHSCOPE_API_KEY\r\n    ?? process.env.QWEN_API_KEY\r\n  const preferOAuth = opts?.preferOAuth !== false\r\n\r\n  // Decide auth mode at boot. If OAuth creds exist on disk, prefer them\r\n  // (getCredentials is async; we gate via hasCredentials + a fire-and-forget\r\n  // configure call). If no OAuth creds and no API key, the lane registers\r\n  // unhealthy and waits for /login qwen.\r\n  const mgr = getQwenTokenManager()\r\n  void mgr.hasCredentials().then(hasOAuth => {\r\n    if (hasOAuth && preferOAuth) {\r\n      qwenApi.configure({ kind: 'oauth' })\r\n      qwenLane.setHealthy(true)\r\n      return\r\n    }\r\n    if (apiKey) {\r\n      qwenApi.configure({ kind: 'api_key', apiKey, baseUrl: opts?.baseUrl })\r\n      qwenLane.setHealthy(true)\r\n      return\r\n    }\r\n    // Nothing available \u2014 still register so `/models` can show entries and\r\n    // `/login qwen` can enroll credentials into this lane later.\r\n    qwenLane.setHealthy(false)\r\n  })\r\n\r\n  registerLane(qwenLane)\r\n}\r\n", "/**\n * Claude Lane \u2014 loop shim.\n *\n * See `./index.ts` for the rationale. This lane is currently a\n * registration-only shim: it advertises supported models + the\n * small-fast model so /lane and /models UX are uniform, but it does\n * NOT handle requests. The dispatcher's `isAnthropicModel` special\n * case keeps Claude traffic on the existing `services/api/claude.ts`\n * path \u2014 which IS the native Anthropic Messages API path that Claude\n * Code upstream built.\n *\n * When / if we ever need to override Claude behavior (multi-org\n * rotation, lane-specific cache-marker placement, etc.), implement\n * `streamAsProvider` here, remove the dispatcher's `isAnthropicModel`\n * early return, and flip `isHealthy()` to `true`.\n */\n\nimport type {\n  AnthropicStreamEvent,\n  ModelInfo,\n} from '../../services/api/providers/base_provider.js'\nimport type {\n  Lane,\n  LaneProviderCallParams,\n  LaneRunContext,\n  LaneRunResult,\n  NormalizedUsage,\n} from '../types.js'\n\nexport class ClaudeLane implements Lane {\n  readonly name = 'claude'\n  readonly displayName = 'Anthropic Claude (native Messages API)'\n\n  private _healthy = false\n\n  supportsModel(model: string): boolean {\n    const m = model.toLowerCase()\n    return (\n      m.startsWith('claude-')\n      || m.includes('anthropic/')\n      || m.includes('anthropic.')\n    )\n  }\n\n  // This function exists to satisfy the Lane interface; the dispatcher\n  // never reaches it for Claude models (isAnthropicModel early return).\n  // If it were called, we'd have a bug \u2014 throw loudly.\n  async *streamAsProvider(\n    _params: LaneProviderCallParams,\n  ): AsyncGenerator<AnthropicStreamEvent, NormalizedUsage> {\n    throw new Error(\n      'ClaudeLane.streamAsProvider invoked unexpectedly \u2014 Claude models '\n      + 'should go through the existing services/api/claude.ts path. '\n      + 'If you hit this, the dispatcher\\'s isAnthropicModel special '\n      + 'case may have been removed prematurely.',\n    )\n  }\n\n  async *run(_ctx: LaneRunContext): AsyncGenerator<AnthropicStreamEvent, LaneRunResult> {\n    // Registration-only; never actually invoked.\n    return {\n      stopReason: 'end_turn',\n      usage: {\n        input_tokens: 0, output_tokens: 0,\n        cache_read_tokens: 0, cache_write_tokens: 0, thinking_tokens: 0,\n      },\n    }\n  }\n\n  async listModels(): Promise<ModelInfo[]> {\n    // Curated Anthropic model list. Mirrors what the legacy provider\n    // catalog surfaces. Flip to a live /v1/models call when Anthropic\n    // makes that available on the Messages API.\n    return [\n      { id: 'claude-opus-4-8',        name: 'Claude Opus 4.8' },\n      { id: 'claude-opus-4-7',        name: 'Claude Opus 4.7' },\n      { id: 'claude-opus-4-6',        name: 'Claude Opus 4.6' },\n      { id: 'claude-sonnet-4-6',      name: 'Claude Sonnet 4.6' },\n      { id: 'claude-haiku-4-5',       name: 'Claude Haiku 4.5 (fast)' },\n      { id: 'claude-haiku-4-5-20251001', name: 'Claude Haiku 4.5 (fast, dated)' },\n    ]\n  }\n\n  resolveModel(model: string): string {\n    return model\n  }\n\n  smallFastModel(): string {\n    // Haiku 4.5 is the canonical cheap+fast Claude for session titles,\n    // tool-use summaries, commit-message drafts. Matches configs.ts's\n    // firstParty default.\n    return 'claude-haiku-4-5-20251001'\n  }\n\n  isHealthy(): boolean {\n    return this._healthy\n  }\n\n  setHealthy(healthy: boolean): void {\n    this._healthy = healthy\n  }\n\n  dispose(): void {\n    // No resources \u2014 the Anthropic SDK is managed by claude.ts.\n  }\n}\n\nexport const claudeLane = new ClaudeLane()\n", "/**\n * Claude Lane \u2014 symmetry + /lane / /models surface.\n *\n * Claude is the one lane where the \"extract native behavior into a\n * dedicated lane module\" exercise is genuinely simpler to defer: the\n * existing `src/services/api/claude.ts` already speaks the Anthropic\n * Messages API natively (cache markers, streaming, tool_use IR shape,\n * thinking blocks \u2014 all of it) exactly as Tau upstream does.\n * Tau WAS the native Claude lane; the legacy path IS the\n * native path.\n *\n * This module exists for three specific reasons:\n *\n *   1. **Symmetry** \u2014 `/models` and `/lane status` show every\n *      provider lane uniformly. Users see \"Claude (native Anthropic\n *      Messages)\" alongside \"Gemini\", \"Codex\", \"Qwen\", \"OpenAI-compat\"\n *      rather than a silent special case.\n *   2. **`smallFastModel` lookup** \u2014 session titles / tool-use\n *      summaries / commit-message drafts pick claude-haiku-4-5 when\n *      the main-loop model is Claude, without hard-coding the name\n *      in a dozen places.\n *   3. **Future extraction hook** \u2014 if we ever need to override\n *      Claude behavior (multi-org rotation, custom cache markers,\n *      alt-tool-schema variants), the lane is already wired and we\n *      flip `isHealthy()` to `true` + implement `streamAsProvider`.\n *\n * Until that flip, the lane reports `isHealthy() = false` and the\n * dispatcher correctly falls through to the existing claude.ts path\n * via its `isAnthropicModel` early return. Zero behavioral risk.\n */\n\nexport { claudeLane, ClaudeLane } from './loop.js'\n\nimport { claudeLane } from './loop.js'\nimport { registerLane } from '../dispatcher.js'\n\nexport function initClaudeLane(): void {\n  registerLane(claudeLane)\n  // Unhealthy on purpose \u2014 see the module doc above. Dispatcher's\n  // isAnthropicModel special case means no Claude request ever enters\n  // this lane; we're registered purely for the /lane / /models UX.\n  claudeLane.setHealthy(false)\n}\n", "/**\r\n * AWS EventStream binary frame parser (application/vnd.amazon.eventstream).\r\n *\r\n * CodeWhisperer streams events as a sequence of self-delimited binary\r\n * frames. Each frame:\r\n *\r\n *   \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\r\n *   \u2502 Total length \u2502 Headers len  \u2502 Prelude  \u2502 Headers \u2502 Payload  \u2502  Message \u2502\r\n *   \u2502   (u32 BE)   \u2502   (u32 BE)   \u2502   CRC    \u2502         \u2502          \u2502    CRC   \u2502\r\n *   \u2502   4 bytes    \u2502   4 bytes    \u2502 4 bytes  \u2502   var   \u2502   var    \u2502  4 bytes \u2502\r\n *   \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\r\n *\r\n * Headers are (name_len:u8, name:utf8, type:u8, value). We only need\r\n * type=7 (string) to read the `:event-type` header that tells us what\r\n * the payload JSON represents (assistantResponseEvent, toolUseEvent, \u2026).\r\n *\r\n * Ported from reference/9router-master/open-sse/executors/kiro.js\r\n * (parseEventFrame + the transform loop). Compared to that source we\r\n * drop the CRC validation \u2014 the stream is TLS-protected end-to-end, and\r\n * skipping the check lets the parser stay self-contained (no crc32c\r\n * dependency for a 400-line lane).\r\n */\r\n\r\nexport interface KiroEvent {\r\n  eventType: string\r\n  payload: Record<string, unknown> | null\r\n}\r\n\r\n/**\r\n * Incrementally parse EventStream frames from a growing byte buffer.\r\n * Returns the events parsed this call and the residual bytes that still\r\n * need more data. Carrier is a typed-array view, not a DataView \u2014 the\r\n * consumer loop is simpler if it just appends and re-feeds.\r\n */\r\nexport function parseFrames(buf: Uint8Array): {\r\n  events: KiroEvent[]\r\n  remainder: Uint8Array\r\n} {\r\n  const events: KiroEvent[] = []\r\n  let cursor = buf\r\n\r\n  // Hard cap on iterations per chunk \u2014 identical to the reference guard\r\n  // against pathologically small total-length values from a partial frame.\r\n  let iterations = 0\r\n  const maxIterations = 1000\r\n\r\n  while (cursor.length >= 16 && iterations < maxIterations) {\r\n    iterations++\r\n    const view = new DataView(cursor.buffer, cursor.byteOffset, cursor.length)\r\n    const totalLength = view.getUint32(0, false)\r\n\r\n    // Invalid prelude OR the frame hasn't fully arrived yet.\r\n    if (totalLength < 16 || totalLength > cursor.length) break\r\n\r\n    const frame = cursor.slice(0, totalLength)\r\n    cursor = cursor.slice(totalLength)\r\n    const ev = _parseFrame(frame)\r\n    if (ev) events.push(ev)\r\n  }\r\n\r\n  return { events, remainder: cursor }\r\n}\r\n\r\nfunction _parseFrame(frame: Uint8Array): KiroEvent | null {\r\n  try {\r\n    const view = new DataView(frame.buffer, frame.byteOffset, frame.length)\r\n    const headersLength = view.getUint32(4, false)\r\n\r\n    // Parse headers. Layout:\r\n    //   u8 name_len, utf8 name, u8 type, (type-specific value)\r\n    // We only read type=7 (UTF-8 string). Unknown types \u2192 stop at that\r\n    // header so we can at least read the ones we understand so far.\r\n    const headers: Record<string, string> = {}\r\n    let offset = 12 // 4 (total) + 4 (headers len) + 4 (prelude CRC)\r\n    const headerEnd = 12 + headersLength\r\n\r\n    while (offset < headerEnd && offset < frame.length) {\r\n      const nameLen = frame[offset]!\r\n      offset++\r\n      if (offset + nameLen > frame.length) break\r\n      const name = _utf8(frame, offset, nameLen)\r\n      offset += nameLen\r\n      const headerType = frame[offset]!\r\n      offset++\r\n      if (headerType === 7) {\r\n        const valueLen = (frame[offset]! << 8) | frame[offset + 1]!\r\n        offset += 2\r\n        if (offset + valueLen > frame.length) break\r\n        headers[name] = _utf8(frame, offset, valueLen)\r\n        offset += valueLen\r\n      } else {\r\n        break\r\n      }\r\n    }\r\n\r\n    const payloadStart = 12 + headersLength\r\n    const payloadEnd = frame.length - 4 // trailing message CRC\r\n    let payload: Record<string, unknown> | null = null\r\n    if (payloadEnd > payloadStart) {\r\n      const payloadStr = _utf8(frame, payloadStart, payloadEnd - payloadStart)\r\n      if (payloadStr.trim()) {\r\n        try {\r\n          payload = JSON.parse(payloadStr) as Record<string, unknown>\r\n        } catch {\r\n          // Drop malformed payloads \u2014 the executor logs and the outer\r\n          // loop can fall through on missing event data.\r\n          payload = null\r\n        }\r\n      }\r\n    }\r\n\r\n    const eventType = headers[':event-type'] ?? ''\r\n    return { eventType, payload }\r\n  } catch {\r\n    return null\r\n  }\r\n}\r\n\r\nconst _decoder = new TextDecoder()\r\nfunction _utf8(buf: Uint8Array, offset: number, length: number): string {\r\n  return _decoder.decode(buf.slice(offset, offset + length))\r\n}\r\n", "/**\n * Kiro static model catalog.\n *\n * Mirrors the native `kiro-cli chat --list-models` list so `/models`\n * matches what Kiro currently exposes even when the live catalog API is\n * unavailable or returns stale/internal ids.\n *\n * IDs are the ones the CodeWhisperer chat API expects in the `modelId`\n * field of userInputMessage \u2014 NOT canonical Anthropic/DeepSeek names.\n */\n\r\nimport type { ModelInfo } from '../../services/api/providers/base_provider.js'\n\nexport const KIRO_MODELS: ModelInfo[] = [\n  { id: 'auto', name: 'Auto', contextWindow: 1_000_000, supportsToolCalling: true },\n  { id: 'claude-sonnet-4.5', name: 'Claude Sonnet 4.5', contextWindow: 200_000, supportsToolCalling: true },\n  { id: 'claude-sonnet-4', name: 'Claude Sonnet 4', contextWindow: 200_000, supportsToolCalling: true },\n  { id: 'claude-haiku-4.5', name: 'Claude Haiku 4.5', contextWindow: 200_000, supportsToolCalling: true },\n  { id: 'deepseek-3.2', name: 'DeepSeek 3.2', contextWindow: 164_000, supportsToolCalling: true },\n  { id: 'minimax-m2.5', name: 'MiniMax M2.5', contextWindow: 196_000, supportsToolCalling: true },\n  { id: 'minimax-m2.1', name: 'MiniMax M2.1', contextWindow: 196_000, supportsToolCalling: true },\n  { id: 'glm-5', name: 'GLM 5', contextWindow: 200_000, supportsToolCalling: true },\n  { id: 'qwen3-coder-next', name: 'Qwen3 Coder Next', contextWindow: 256_000, supportsToolCalling: true },\n]\n\nconst KIRO_MODEL_ALIASES = new Map<string, string>([\n  ['claude-sonnet-4.0', 'claude-sonnet-4'],\n  ['minimax-m2.5', 'minimax-m2.5'],\n  ['minimax-m2.1', 'minimax-m2.1'],\n  ['minimax-m2_5', 'minimax-m2.5'],\n  ['minimax-m2_1', 'minimax-m2.1'],\n  ['minimax-m2-5', 'minimax-m2.5'],\n  ['minimax-m2-1', 'minimax-m2.1'],\n  ['minimax m2.5', 'minimax-m2.5'],\n  ['minimax m2.1', 'minimax-m2.1'],\n  ['MiniMax-M2.5'.toLowerCase(), 'minimax-m2.5'],\n  ['MiniMax-M2.1'.toLowerCase(), 'minimax-m2.1'],\n])\n\nexport function normalizeKiroModelId(id: string): string {\n  const trimmed = id.trim()\n  if (!trimmed) return trimmed\n  const lower = trimmed.toLowerCase()\n  const aliased = KIRO_MODEL_ALIASES.get(lower)\n  if (aliased) return aliased\n  const exact = KIRO_MODELS.find(model => model.id.toLowerCase() === lower)\n  return exact?.id ?? trimmed\n}\n\nexport function isKiroModel(id: string): boolean {\n  const normalized = normalizeKiroModelId(id)\n  return KIRO_MODELS.some(m => m.id === normalized)\n}\n", "/**\n * Bidirectional tool name mapping between Tau (Anthropic-format)\n * tool names and Kiro's native tool names.\n *\n * Kiro models are post-trained on their native tool names (shell, read,\n * write, grep, glob, web_search, web_fetch, etc.). Tau uses\n * Anthropic-format names (Bash, Read, Write, Grep, Glob, WebSearch,\n * WebFetch, etc.). This module maps between the two so:\n *\n *   1. Tools sent to the CodeWhisperer API use Kiro-native names.\n *   2. Tool calls returned by Kiro are mapped back to Tau names\n *      before passing to context.executeTool().\n *\n * NOTE: Only 1:1 mappings are listed here. Tools that would create\n * duplicates (e.g. PowerShell \u2192 shell when Bash \u2192 shell already exists)\n * are excluded \u2014 the dedup logic in _buildToolSpecs handles those.\n * Edit is kept as-is because Kiro has no equivalent (Kiro's \"write\"\n * covers both create and edit, but Tau separates them).\n */\n\n/** Tau tool name \u2192 Kiro native tool name */\nconst CLAUDEX_TO_KIRO: Record<string, string> = {\n  // Shell \u2014 Bash on Unix, PowerShell on Windows; only one is active\n  Bash:        'shell',\n  PowerShell:  'shell',\n  // File operations\n  Read:        'read',\n  Write:       'write',\n  // Edit has NO direct Kiro equivalent \u2014 keep as 'Edit'\n  // Search\n  Grep:        'grep',\n  Glob:        'glob',\n  // Web\n  WebSearch:   'web_search',\n  WebFetch:    'web_fetch',\n  // Productivity\n  TodoWrite:   'todo_list',\n  // Agents\n  Agent:       'subagent',\n}\n\nconst SHELL_TOOL_NAMES = new Set(['Bash', 'PowerShell'])\n\n/** Kiro native tool name \u2192 Tau tool name (reverse map) */\nconst KIRO_TO_CLAUDEX: Record<string, string> = {}\nfor (const [claudex, kiro] of Object.entries(CLAUDEX_TO_KIRO)) {\n  // First Tau name wins (Bash beats PowerShell for 'shell')\n  if (!(kiro in KIRO_TO_CLAUDEX)) {\n    KIRO_TO_CLAUDEX[kiro] = claudex\n  }\n}\n\n/**\n * Map a Tau tool name to the Kiro-native name the model was trained\n * on. Returns the original name if no mapping exists (e.g. MCP tools,\n * Edit which has no Kiro equivalent).\n */\nexport function toKiroToolName(claudexName: string): string {\n  return CLAUDEX_TO_KIRO[claudexName] ?? claudexName\n}\n\n/**\n * Choose which local shell tool should back Kiro's single native `shell`\n * capability for this session.\n *\n * On Windows, prefer PowerShell when available so native Kiro shell calls\n * can execute cmdlets like `Get-ChildItem` instead of being forced through\n * the Bash executor. Elsewhere, Bash remains the natural default.\n */\nexport function resolvePreferredKiroShellToolName(\n  toolNames: readonly string[],\n): 'Bash' | 'PowerShell' | null {\n  const hasBash = toolNames.includes('Bash')\n  const hasPowerShell = toolNames.includes('PowerShell')\n\n  if (process.platform === 'win32') {\n    if (hasPowerShell) return 'PowerShell'\n    if (hasBash) return 'Bash'\n  } else {\n    if (hasBash) return 'Bash'\n    if (hasPowerShell) return 'PowerShell'\n  }\n\n  return null\n}\n\nexport function isKiroShellCandidate(claudexName: string): boolean {\n  return SHELL_TOOL_NAMES.has(claudexName)\n}\n\n/**\n * Map a Kiro-native tool name back to the Tau tool name for\n * execution. Returns the original name if no mapping exists.\n */\nexport function toClaudexToolName(\n  kiroName: string,\n  preferredShellToolName?: string | null,\n): string {\n  if (kiroName === 'shell' && preferredShellToolName) {\n    return preferredShellToolName\n  }\n  return KIRO_TO_CLAUDEX[kiroName] ?? kiroName\n}\n", "import type { KiroPayload } from './request.js'\n\nexport interface KiroPayloadTrimStats {\n  originalBytes: number\n  finalBytes: number\n  originalEntries: number\n  finalEntries: number\n  trimmed: boolean\n}\n\ntype KiroHistoryEntry = KiroPayload['conversationState']['history'][number]\n\nexport function checkKiroPayloadSize(payload: KiroPayload): number {\n  return Buffer.byteLength(JSON.stringify(payload), 'utf8')\n}\n\nexport function trimKiroPayloadToLimit(\n  payload: KiroPayload,\n  maxBytes: number,\n  options: {\n    preserveLeadingEntries?: number\n  } = {},\n): KiroPayloadTrimStats {\n  const history = payload.conversationState.history\n  const originalBytes = checkKiroPayloadSize(payload)\n  const originalEntries = history.length\n\n  if (history.length === 0 || maxBytes <= 0) {\n    return {\n      originalBytes,\n      finalBytes: originalBytes,\n      originalEntries,\n      finalEntries: originalEntries,\n      trimmed: false,\n    }\n  }\n\n  _stripEmptyToolUses(history)\n\n  const preserveLeadingEntries = Math.max(\n    0,\n    Math.min(options.preserveLeadingEntries ?? 0, history.length),\n  )\n\n  while (history.length >= preserveLeadingEntries + 2 && checkKiroPayloadSize(payload) > maxBytes) {\n    history.splice(preserveLeadingEntries, 2)\n  }\n\n  if (preserveLeadingEntries === 0) {\n    _alignToUserMessage(history)\n  }\n\n  _repairOrphanedToolResults(history)\n\n  const finalBytes = checkKiroPayloadSize(payload)\n  return {\n    originalBytes,\n    finalBytes,\n    originalEntries,\n    finalEntries: history.length,\n    trimmed: originalEntries !== history.length,\n  }\n}\n\nfunction _stripEmptyToolUses(history: KiroHistoryEntry[]): void {\n  for (const entry of history) {\n    if (!('assistantResponseMessage' in entry)) continue\n    const assistant = entry.assistantResponseMessage\n    if (Array.isArray(assistant.toolUses) && assistant.toolUses.length === 0) {\n      delete assistant.toolUses\n    }\n  }\n}\n\nfunction _alignToUserMessage(history: KiroHistoryEntry[]): void {\n  while (history.length > 0 && !('userInputMessage' in history[0]!)) {\n    history.shift()\n  }\n}\n\nfunction _repairOrphanedToolResults(history: KiroHistoryEntry[]): void {\n  for (let i = 0; i < history.length; i++) {\n    const entry = history[i]!\n    if (!('userInputMessage' in entry)) continue\n\n    const userMessage = entry.userInputMessage\n    const context = userMessage.userInputMessageContext\n    if (!context?.toolResults || context.toolResults.length === 0) continue\n\n    const validToolUseIds = new Set<string>()\n    const previous = i > 0 ? history[i - 1] : null\n    if (previous && 'assistantResponseMessage' in previous) {\n      for (const toolUse of previous.assistantResponseMessage.toolUses ?? []) {\n        if (toolUse.toolUseId) validToolUseIds.add(toolUse.toolUseId)\n      }\n    }\n\n    const kept = context.toolResults.filter(toolResult => validToolUseIds.has(toolResult.toolUseId))\n    if (kept.length === context.toolResults.length) continue\n\n    if (kept.length > 0) {\n      context.toolResults = kept\n    } else {\n      delete context.toolResults\n      if (Object.keys(context).length === 0) {\n        delete userMessage.userInputMessageContext\n      }\n    }\n  }\n}\n", "/**\n * Build a CodeWhisperer `GenerateAssistantResponse` payload from\n * Anthropic-IR messages + tools.\n *\n * Wire format reference: reference/9router-master/open-sse/translator/\n *   request/openai-to-kiro.js. The shape:\n *\n *   conversationState:\n *     chatTriggerType: \"MANUAL\"\n *     conversationId:  uuid\n *     currentMessage:\n *       userInputMessage:\n *         content, modelId, origin: \"AI_EDITOR\"\n *         userInputMessageContext?: { tools?, toolResults? }\n *     history: [ { userInputMessage } | { assistantResponseMessage } ]\n *   profileArn?\n *   inferenceConfig?: { maxTokens, temperature, topP }\n *\n * History rules (the Kiro API rejects traffic that violates these):\n *   - Alternating user/assistant roles only.\n *   - Merge consecutive same-role messages.\n *   - Empty content is illegal \u2014 fall back to \"continue\" (user) / \"...\" (assistant).\n *   - `tools` only live inside `currentMessage.userInputMessageContext`.\n *   - Every historical `userInputMessage` needs `modelId` set.\n */\n\nimport { randomUUID } from 'crypto'\nimport type {\n  ProviderMessage,\n  ProviderTool,\n  ProviderContentBlock,\n} from '../../services/api/providers/base_provider.js'\nimport {\n  appendStrictParamsHint,\n  KIRO_TOOL_USAGE_RULES,\n  sanitizeSchemaForLane,\n} from '../shared/mcp_bridge.js'\nimport { normalizeKiroModelId } from './catalog.js'\nimport {\n  isKiroShellCandidate,\n  resolvePreferredKiroShellToolName,\n  toKiroToolName,\n} from './tool_names.js'\nimport {\n  checkKiroPayloadSize,\n  trimKiroPayloadToLimit,\n} from './payload_guards.js'\nimport { WEB_SEARCH_NATIVE_DESCRIPTION } from '../../tools/WebSearchTool/prompt.js'\n\ninterface KiroToolSpec {\n  toolSpecification: {\n    name: string\n    description: string\n    inputSchema: { json: Record<string, unknown> }\n  }\n}\n\ninterface KiroToolResult {\n  toolUseId: string\n  status: 'success'\n  content: Array<{ text: string }>\n}\n\ninterface KiroToolUse {\n  toolUseId: string\n  name: string\n  input: Record<string, unknown>\n}\n\ninterface KiroUserMessage {\n  userInputMessage: {\n    content: string\n    modelId: string\n    origin?: string\n    userInputMessageContext?: {\n      tools?: KiroToolSpec[]\n      toolResults?: KiroToolResult[]\n    }\n  }\n}\n\ninterface KiroAssistantMessage {\n  assistantResponseMessage: {\n    content: string\n    toolUses?: KiroToolUse[]\n  }\n}\n\ntype KiroHistoryEntry = KiroUserMessage | KiroAssistantMessage\n\nexport interface KiroPayload {\n  conversationState: {\n    chatTriggerType: 'MANUAL'\n    conversationId: string\n    currentMessage: KiroUserMessage\n    history: KiroHistoryEntry[]\n  }\n  profileArn?: string\n  inferenceConfig?: {\n    maxTokens?: number\n    temperature?: number\n    topP?: number\n  }\n}\n\nexport interface BuildKiroPayloadParams {\n  model: string\n  system: string\n  messages: ProviderMessage[]\n  tools: ProviderTool[]\n  conversationId?: string\n  maxTokens?: number\n  temperature?: number\n  topP?: number\n  profileArn?: string\n}\n\nconst KIRO_TOOL_DESCRIPTION_MAX_LENGTH = 10_000\nconst KIRO_DEFAULT_MAX_PAYLOAD_BYTES = 600_000\nconst KIRO_DEFAULT_TARGET_PAYLOAD_BYTES = 220_000\n\nexport function buildKiroPayload(params: BuildKiroPayloadParams): KiroPayload {\n  const {\n    model,\n    system,\n    messages,\n    tools,\n    conversationId,\n    maxTokens,\n    temperature,\n    topP,\n    profileArn,\n  } = params\n  const resolvedModel = normalizeKiroModelId(model)\n  const preferredShellToolName = resolvePreferredKiroShellToolName(\n    tools.map(tool => tool.name),\n  )\n\n  const { specs, toolDocumentation } = _buildToolSpecs(tools, preferredShellToolName)\n  const systemWithRules = specs.length > 0\n    ? _assembleKiroToolSystemPrompt(\n        system,\n        tools,\n        preferredShellToolName,\n        toolDocumentation,\n      )\n    : system\n  const { history, currentMessage } = _convertMessages(messages, systemWithRules, specs, resolvedModel)\n\n  // CodeWhisperer prepends the current wall-clock \u2014 9router does the\n  // same so models that rely on \"current time\" skills (scheduling,\n  // file timestamps) see fresh context each turn.\n  const stampedContent = `[Context: Current time is ${new Date().toISOString()}]\\n\\n${\n    currentMessage.userInputMessage.content\n  }`\n\n  const payload: KiroPayload = {\n    conversationState: {\n      chatTriggerType: 'MANUAL',\n      conversationId: conversationId || randomUUID(),\n      currentMessage: {\n        userInputMessage: {\n          content: stampedContent,\n          modelId: resolvedModel,\n          origin: 'AI_EDITOR',\n          ...(currentMessage.userInputMessage.userInputMessageContext && {\n            userInputMessageContext: currentMessage.userInputMessage.userInputMessageContext,\n          }),\n        },\n      },\n      history,\n    },\n  }\n\n  _optimizeKiroPayload(payload, systemWithRules)\n\n  if (profileArn) payload.profileArn = profileArn\n  if (maxTokens != null || temperature !== undefined || topP !== undefined) {\n    payload.inferenceConfig = {}\n    if (maxTokens != null) payload.inferenceConfig.maxTokens = maxTokens\n    if (temperature !== undefined) payload.inferenceConfig.temperature = temperature\n    if (topP !== undefined) payload.inferenceConfig.topP = topP\n  }\n  return payload\n}\n\nfunction _optimizeKiroPayload(\n  payload: KiroPayload,\n  systemText: string,\n): void {\n  if (payload.conversationState.history.length === 0) return\n\n  const preserveLeadingEntries = systemText.trim().length > 0\n    ? _getSystemBearingHistoryPrefixLength(payload.conversationState.history)\n    : 0\n  const targetBytes = _readKiroPayloadByteBudget(\n    'CLAUDEX_KIRO_TARGET_PAYLOAD_BYTES',\n    KIRO_DEFAULT_TARGET_PAYLOAD_BYTES,\n  )\n  const maxBytes = _readKiroPayloadByteBudget(\n    'CLAUDEX_KIRO_MAX_PAYLOAD_BYTES',\n    KIRO_DEFAULT_MAX_PAYLOAD_BYTES,\n  )\n\n  if (targetBytes > 0 && checkKiroPayloadSize(payload) > targetBytes) {\n    trimKiroPayloadToLimit(payload, targetBytes, { preserveLeadingEntries })\n  }\n\n  const effectiveHardLimit = maxBytes > 0 ? maxBytes : KIRO_DEFAULT_MAX_PAYLOAD_BYTES\n  if (checkKiroPayloadSize(payload) > effectiveHardLimit) {\n    trimKiroPayloadToLimit(payload, effectiveHardLimit, { preserveLeadingEntries })\n  }\n}\n\nfunction _readKiroPayloadByteBudget(\n  envName: string,\n  defaultValue: number,\n): number {\n  const raw = process.env[envName]\n  if (!raw) return defaultValue\n  const parsed = Number.parseInt(raw, 10)\n  return Number.isFinite(parsed) && parsed >= 0 ? parsed : defaultValue\n}\n\nfunction _getSystemBearingHistoryPrefixLength(\n  history: KiroHistoryEntry[],\n): number {\n  const firstUserIndex = history.findIndex(entry => 'userInputMessage' in entry)\n  if (firstUserIndex === -1) return 0\n  const nextIndex = firstUserIndex + 1\n  if (nextIndex < history.length && 'assistantResponseMessage' in history[nextIndex]!) {\n    return nextIndex + 1\n  }\n  return firstUserIndex + 1\n}\n\n// \u2500\u2500\u2500 Tool specs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction _buildToolSpecs(\n  tools: ProviderTool[],\n  preferredShellToolName: string | null,\n): {\n  specs: KiroToolSpec[]\n  toolDocumentation: string\n} {\n  const seen = new Set<string>()\n  const specs: KiroToolSpec[] = []\n  const documentationSections: string[] = []\n  for (const t of tools) {\n    const kiroName = toKiroToolName(t.name)\n    if (\n      kiroName === 'shell'\n      && preferredShellToolName\n      && isKiroShellCandidate(t.name)\n      && t.name !== preferredShellToolName\n    ) {\n      continue\n    }\n    // Skip duplicates \u2014 e.g. Bash + PowerShell both map to 'shell'\n    if (seen.has(kiroName)) continue\n    seen.add(kiroName)\n    const schema = sanitizeSchemaForLane(\n      t.input_schema ?? { type: 'object', properties: {} },\n      'kiro',\n    )\n    // Kiro 400s \"Improperly formed request\" on empty `required: []` and on\n    // any `additionalProperties` keyword (per kiro-gateway reference). Both\n    // are stripped recursively by sanitizeSchemaForLane for the kiro profile,\n    // so do NOT add `required: []` back here.\n    const normalized = Object.keys(schema).length === 0\n      ? { type: 'object', properties: {} }\n      : schema\n    const baseDescription = _normalizeKiroToolDescription(\n      t.name,\n      kiroName,\n      t.description,\n    )\n    const fullDescription = appendStrictParamsHint(\n      baseDescription,\n      normalized as Record<string, unknown>,\n    )\n    const { inlineDescription, documentationSection } = _compressKiroToolDescription(\n      kiroName,\n      fullDescription,\n    )\n    if (documentationSection) documentationSections.push(documentationSection)\n    specs.push({\n      toolSpecification: {\n        name: kiroName,\n        description: inlineDescription,\n        inputSchema: { json: normalized as Record<string, unknown> },\n      },\n    })\n  }\n  return {\n    specs,\n    toolDocumentation: documentationSections.length > 0\n      ? [\n          '<tool_documentation>',\n          'Some Kiro tool descriptions are too long to send inline. Read the referenced sections below when a tool points here.',\n          ...documentationSections,\n          '</tool_documentation>',\n        ].join('\\n')\n      : '',\n  }\n}\n\nfunction _assembleKiroToolSystemPrompt(\n  system: string,\n  tools: ProviderTool[],\n  preferredShellToolName: string | null,\n  toolDocumentation: string,\n): string {\n  const sections = [KIRO_TOOL_USAGE_RULES]\n  const guide = _buildKiroToolSelectionGuide(tools, preferredShellToolName)\n  if (guide) sections.push(guide)\n  if (toolDocumentation) sections.push(toolDocumentation)\n  if (system) sections.push(system)\n  return sections.join('\\n')\n}\n\nfunction _buildKiroToolSelectionGuide(\n  tools: ProviderTool[],\n  preferredShellToolName: string | null,\n): string {\n  const toolNames = new Set(tools.map(tool => tool.name))\n  const lines: string[] = []\n\n  const addCategory = (label: string, entries: string[]): void => {\n    if (entries.length === 0) return\n    lines.push(`- ${label}: ${entries.join(', ')}`)\n  }\n\n  const pick = (name: string, description: string): string | null =>\n    toolNames.has(name) ? `${name} (${description})` : null\n\n  const collect = (...entries: Array<string | null>): string[] =>\n    entries.filter((entry): entry is string => typeof entry === 'string')\n\n  addCategory('Files', collect(\n    pick('Read', 'read files'),\n    pick('Write', 'create or overwrite files'),\n    pick('Edit', 'modify existing files in place'),\n    pick('Glob', 'find files by pattern'),\n    pick('Grep', 'search file contents'),\n    pick('NotebookEdit', 'edit Jupyter notebook cells'),\n  ))\n\n  addCategory('Code', collect(\n    pick('LSP', 'semantic code operations like definitions, references, and symbols'),\n  ))\n\n  const shellEntries: string[] = []\n  if (preferredShellToolName && toolNames.has(preferredShellToolName)) {\n    const shellDescription = preferredShellToolName === 'PowerShell'\n      ? 'run Windows shell and git commands'\n      : 'run shell and git commands'\n    shellEntries.push(`${preferredShellToolName} (${shellDescription})`)\n  } else {\n    shellEntries.push(...collect(\n      pick('Bash', 'run shell and git commands'),\n      pick('PowerShell', 'run Windows shell and git commands'),\n    ))\n  }\n  shellEntries.push(...collect(\n    pick('TaskOutput', 'read background task output'),\n    pick('TaskStop', 'stop a background task'),\n  ))\n  addCategory('Shell', shellEntries)\n\n  addCategory('Planning', collect(\n    pick('TodoWrite', 'manage the session checklist'),\n    pick('TaskCreate', 'create a task'),\n    pick('TaskGet', 'read a task'),\n    pick('TaskList', 'list tasks'),\n    pick('TaskUpdate', 'update a task'),\n    pick('EnterPlanMode', 'switch into planning mode'),\n    pick('ExitPlanMode', 'present a plan and exit planning mode'),\n    pick('EnterWorktree', 'create and enter an isolated git worktree'),\n    pick('ExitWorktree', 'leave the current worktree'),\n  ))\n\n  addCategory('Web', collect(\n    pick('WebFetch', 'fetch web content'),\n    pick('WebSearch', WEB_SEARCH_NATIVE_DESCRIPTION),\n  ))\n\n  addCategory('Interaction', collect(\n    pick('AskUserQuestion', 'ask the user a clarifying question'),\n    pick('Skill', 'invoke a slash-command skill'),\n    pick('SendUserMessage', 'send a message back to the user'),\n    pick('Config', 'read or change Tau settings'),\n  ))\n\n  addCategory('Agents', collect(\n    pick('Agent', 'launch a subagent'),\n    pick('SendMessage', 'message a running agent teammate'),\n    pick('TeamCreate', 'create a multi-agent team'),\n    pick('TeamDelete', 'disband a multi-agent team'),\n  ))\n\n  addCategory('MCP', collect(\n    pick('ListMcpResourcesTool', 'list MCP resources'),\n    pick('ReadMcpResourceTool', 'read a specific MCP resource'),\n  ))\n\n  const mcpServerTools = tools\n    .map(tool => tool.name)\n    .filter(name => name.startsWith('mcp__'))\n  if (mcpServerTools.length > 0) {\n    lines.push(`- MCP server tools: ${mcpServerTools.length} tool(s) named mcp__* are available; use the exact tool name shown in the tool list when you need one.`)\n  }\n\n  if (lines.length === 0) return ''\n\n  return [\n    '<tool_selection_guide>',\n    'Prefer specialized tools over shell when a direct tool exists for files, notebooks, planning, worktrees, questions, skills, tasks, or MCP resources.',\n    'For Agent/subagent results, report the tool output as observed; only describe rate limiting when the result explicitly says 429, rate limit, quota, or throttled.',\n    ...lines,\n    '</tool_selection_guide>',\n  ].join('\\n')\n}\n\nfunction _normalizeKiroToolDescription(\n  claudexName: string,\n  kiroName: string,\n  description: string | undefined,\n): string {\n  const trimmed = description?.trim()\n  let resolved = trimmed || `Tool: ${kiroName}`\n\n  if (kiroName !== 'shell') return resolved\n\n  if (claudexName === 'PowerShell') {\n    return `${resolved}\\nUse Windows PowerShell syntax for commands.`\n  }\n\n  if (claudexName === 'Bash') {\n    return `${resolved}\\nUse POSIX/bash syntax for commands. Do not use PowerShell cmdlets.`\n  }\n\n  return resolved\n}\n\nfunction _compressKiroToolDescription(\n  toolName: string,\n  description: string,\n): {\n  inlineDescription: string\n  documentationSection: string\n} {\n  if (\n    KIRO_TOOL_DESCRIPTION_MAX_LENGTH <= 0\n    || description.length <= KIRO_TOOL_DESCRIPTION_MAX_LENGTH\n  ) {\n    return {\n      inlineDescription: description,\n      documentationSection: '',\n    }\n  }\n\n  return {\n    inlineDescription: `[Full documentation in system prompt under '## Tool: ${toolName}']`,\n    documentationSection: `## Tool: ${toolName}\\n\\n${description}`,\n  }\n}\n\n// \u2500\u2500\u2500 Message conversion \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction _convertMessages(\n  messages: ProviderMessage[],\n  systemText: string,\n  tools: KiroToolSpec[],\n  model: string,\n): { history: KiroHistoryEntry[]; currentMessage: KiroUserMessage } {\n  const history: KiroHistoryEntry[] = []\n\n  let currentRole: 'user' | 'assistant' | null = null\n  let pendingUserText: string[] = []\n  let pendingAssistantText: string[] = []\n  let pendingToolResults: KiroToolResult[] = []\n\n  const flush = (): void => {\n    if (currentRole === 'user') {\n      const content = pendingUserText.join('\\n\\n').trim() || 'continue'\n      const msg: KiroUserMessage = {\n        userInputMessage: { content, modelId: model },\n      }\n      if (pendingToolResults.length > 0) {\n        msg.userInputMessage.userInputMessageContext = {\n          toolResults: pendingToolResults,\n        }\n      }\n      history.push(msg)\n      pendingUserText = []\n      pendingToolResults = []\n    } else if (currentRole === 'assistant') {\n      const content = pendingAssistantText.join('\\n\\n').trim() || '...'\n      history.push({ assistantResponseMessage: { content } })\n      pendingAssistantText = []\n    }\n  }\n\n  // Kiro has no system role \u2014 9router prepends the system prompt onto\n  // the first user turn. Mirror that so CLAUDE.md / environment / git\n  // status still reach the model. Sent once; subsequent user turns carry\n  // only their own content.\n  let systemInjected = !systemText\n\n  for (const msg of messages) {\n    const role: 'user' | 'assistant' = msg.role === 'assistant' ? 'assistant' : 'user'\n\n    if (currentRole !== null && role !== currentRole) flush()\n    currentRole = role\n\n    if (role === 'user') {\n      const { text, toolResults } = _extractUserBlocks(msg.content)\n      let content = text\n      if (!systemInjected) {\n        content = content ? `${systemText}\\n\\n${content}` : systemText\n        systemInjected = true\n      }\n      if (content) pendingUserText.push(content)\n      pendingToolResults.push(...toolResults)\n    } else {\n      const { text, toolUses } = _extractAssistantBlocks(msg.content)\n      if (text) pendingAssistantText.push(text)\n      if (toolUses.length > 0) {\n        flush()\n        const last = history[history.length - 1]\n        if (last && 'assistantResponseMessage' in last) {\n          last.assistantResponseMessage.toolUses = toolUses\n        } else {\n          // Tool call with no preceding text \u2014 Kiro still wants an\n          // assistant envelope to attach the toolUses to.\n          history.push({ assistantResponseMessage: { content: '...', toolUses } })\n        }\n        currentRole = null\n      }\n    }\n  }\n\n  if (currentRole !== null) flush()\n\n  // The Kiro envelope separates `currentMessage` (the prompt we're\n  // sending this turn) from `history` (the preceding turns). Pop the\n  // LAST user message off history and promote it. If the trailing turn\n  // is an assistant tool-call (common: model just returned a tool call\n  // and we are about to send tool_result back), inject a placeholder\n  // \"continue\" user message so there's always a currentMessage.\n  let currentMessage: KiroUserMessage | undefined\n  for (let i = history.length - 1; i >= 0; i--) {\n    const entry = history[i]!\n    if ('userInputMessage' in entry) {\n      currentMessage = entry\n      history.splice(i, 1)\n      break\n    }\n  }\n  if (!currentMessage) {\n    currentMessage = {\n      userInputMessage: { content: 'continue', modelId: model },\n    }\n  }\n\n  // Clean up stale tool scaffolding from historical user messages \u2014\n  // only the currentMessage carries the active `tools` array.\n  for (const entry of history) {\n    if ('userInputMessage' in entry) {\n      const ctx = entry.userInputMessage.userInputMessageContext\n      if (ctx) {\n        delete (ctx as { tools?: unknown }).tools\n        if (Object.keys(ctx).length === 0) {\n          delete entry.userInputMessage.userInputMessageContext\n        }\n      }\n      if (!entry.userInputMessage.modelId) entry.userInputMessage.modelId = model\n    }\n  }\n\n  // Merge consecutive user messages (Kiro requires alternating roles).\n  const merged: KiroHistoryEntry[] = []\n  for (const entry of history) {\n    const last = merged[merged.length - 1]\n    if (\n      last\n      && 'userInputMessage' in entry\n      && 'userInputMessage' in last\n    ) {\n      last.userInputMessage.content += `\\n\\n${entry.userInputMessage.content}`\n    } else {\n      merged.push(entry)\n    }\n  }\n\n  // Attach tools to the outgoing prompt (only ever on currentMessage).\n  if (tools.length > 0) {\n    if (!currentMessage.userInputMessage.userInputMessageContext) {\n      currentMessage.userInputMessage.userInputMessageContext = {}\n    }\n    currentMessage.userInputMessage.userInputMessageContext.tools = tools\n  }\n\n  return { history: merged, currentMessage }\n}\n\nfunction _extractUserBlocks(content: string | ProviderContentBlock[]): {\n  text: string\n  toolResults: KiroToolResult[]\n} {\n  if (typeof content === 'string') return { text: content, toolResults: [] }\n\n  const texts: string[] = []\n  const toolResults: KiroToolResult[] = []\n  for (const block of content) {\n    if (block.type === 'text' && typeof block.text === 'string') {\n      texts.push(block.text)\n    } else if (block.type === 'tool_result' && block.tool_use_id) {\n      toolResults.push({\n        toolUseId: block.tool_use_id,\n        status: 'success',\n        content: [{ text: _stringifyToolResultContent(block.content) }],\n      })\n    }\n    // Images: Kiro supports base64 via a separate `images` field on\n    // userInputMessage, but the claudex tool stack never emits image\n    // blocks in provider messages (screenshots go through the Read\n    // tool), so we intentionally skip them.\n  }\n  return { text: texts.join('\\n'), toolResults }\n}\n\nfunction _extractAssistantBlocks(content: string | ProviderContentBlock[]): {\n  text: string\n  toolUses: KiroToolUse[]\n} {\n  if (typeof content === 'string') return { text: content, toolUses: [] }\n\n  const texts: string[] = []\n  const toolUses: KiroToolUse[] = []\n  for (const block of content) {\n    if (block.type === 'text' && typeof block.text === 'string') {\n      texts.push(block.text)\n    } else if (block.type === 'tool_use' && block.id && block.name) {\n      toolUses.push({\n        toolUseId: block.id,\n        name: toKiroToolName(block.name),\n        input: (block.input ?? {}) as Record<string, unknown>,\n      })\n    }\n    // thinking blocks: Kiro has no reasoning channel we can round-trip \u2014\n    // the model emits reasoningContentEvent but won't accept it back.\n    // Dropping on re-submission keeps the history legal.\n  }\n  return { text: texts.join('\\n').trim(), toolUses }\n}\n\nfunction _stringifyToolResultContent(\n  content: string | ProviderContentBlock[] | undefined,\n): string {\n  if (typeof content === 'string') return content\n  if (!Array.isArray(content)) return ''\n  const parts: string[] = []\n  for (const block of content) {\n    if (typeof block === 'object' && block && 'text' in block && typeof block.text === 'string') {\n      parts.push(block.text)\n    } else if (typeof block === 'object' && block) {\n      parts.push(JSON.stringify(block))\n    }\n  }\n  return parts.join('\\n')\n}\n", "/**\r\n * Kiro Lane \u2014 CodeWhisperer streaming (AWS EventStream binary frames).\r\n *\r\n * Wire: POST https://codewhisperer.us-east-1.amazonaws.com/generateAssistantResponse\r\n *   Headers:\r\n *     Content-Type: application/json\r\n *     Accept: application/vnd.amazon.eventstream\r\n *     X-Amz-Target: AmazonCodeWhispererStreamingService.GenerateAssistantResponse\r\n *     Authorization: Bearer <accessToken>\r\n *     X-Amz-User-Agent / User-Agent: aws-sdk-js/3.0.0 kiro-ide/1.0.0\r\n *     Amz-Sdk-Invocation-Id: <uuid>\r\n *\r\n * The response body is a sequence of binary EventStream frames; we\r\n * normalize each frame's JSON payload into Anthropic-IR events so\r\n * claude.ts renders Kiro turns identically to every other lane.\r\n *\r\n * Event type \u2192 Anthropic-IR mapping:\r\n *   assistantResponseEvent  \u2192 text_delta\r\n *   codeEvent               \u2192 text_delta (appended as code block)\r\n *   reasoningContentEvent   \u2192 thinking_delta (wrapped)\r\n *   toolUseEvent            \u2192 tool_use block (input_json_delta accumulation)\r\n *   messageStopEvent        \u2192 closes open blocks, emits message_delta\r\n *   metricsEvent            \u2192 folds usage into final message_delta\r\n *   contextUsageEvent       \u2192 estimates input tokens when metrics absent\r\n */\r\n\r\nimport type {\r\n  AnthropicStreamEvent,\r\n  ModelInfo,\r\n} from '../../services/api/providers/base_provider.js'\r\nimport type {\r\n  Lane,\r\n  LaneRunContext,\r\n  LaneRunResult,\r\n  LaneProviderCallParams,\r\n  NormalizedUsage,\r\n} from '../types.js'\r\nimport { parseFrames, type KiroEvent } from './eventstream.js'\r\nimport { buildKiroPayload } from './request.js'\r\nimport { KIRO_MODELS, isKiroModel, normalizeKiroModelId } from './catalog.js'\r\nimport {\r\n  resolvePreferredKiroShellToolName,\r\n  toClaudexToolName,\r\n} from './tool_names.js'\r\nimport { randomUUID } from 'crypto'\r\nimport { getSessionId } from '../../bootstrap/state.js'\r\nimport { loadProviderKey } from '../../services/api/auth/api_key_manager.js'\r\n\r\nconst KIRO_ENDPOINT = 'https://codewhisperer.us-east-1.amazonaws.com/generateAssistantResponse'\r\nconst KIRO_MODELS_ENDPOINT = 'https://codewhisperer.us-east-1.amazonaws.com'\r\n// Default when the stored token blob lacks a profileArn (Builder-ID\r\n// users don't get one back from the device-code exchange). Matches the\r\n// reference DEFAULT_PROFILE_ARN in 9router-master/open-sse/services/usage.js.\r\nconst DEFAULT_PROFILE_ARN = 'arn:aws:codewhisperer:us-east-1:638616132270:profile/AAAACCCCXXXX'\r\n// Kiro context window used when we have to estimate prompt tokens from\r\n// contextUsagePercentage (no metricsEvent was emitted). Claude/Kiro pairs\r\n// all use a 200k window.\r\nconst KIRO_CONTEXT_WINDOW = 200_000\r\nconst KIRO_MODELS_CACHE_TTL_MS = 5 * 60_000\r\nconst MAX_TURNS = 100\r\nconst DSML_TOKEN = '\\uFF5CDSML\\uFF5C'\r\nconst DSML_FUNCTION_CALLS_OPEN = `<${DSML_TOKEN}function_calls>`\r\nconst DSML_FUNCTION_CALLS_CLOSE = `</${DSML_TOKEN}function_calls>`\r\n\r\ninterface ParsedDsmlToolCall {\r\n  name: string\r\n  input: Record<string, unknown>\r\n}\r\n\r\ninterface DerivedKiroPromptUsage {\r\n  inputTokens: number\r\n  cacheReadTokens: number\r\n  cacheWriteTokens: number\r\n  nextContextTokens: number\r\n}\r\n\r\ninterface KiroAvailableModel {\r\n  modelId?: string\r\n  modelName?: string\r\n  tokenLimits?: {\r\n    maxInputTokens?: number\r\n  }\r\n}\r\n\r\ninterface StoredKiroOAuthBlob {\r\n  accessToken?: string\r\n  refreshToken?: string\r\n  meta?: {\r\n    profileArn?: string | null\r\n  }\r\n}\r\n\r\nfunction _isLikelyKiroModelId(id: string): boolean {\r\n  const normalized = id.toLowerCase()\r\n  return (\r\n    normalized.startsWith('claude-')\r\n    || normalized.startsWith('deepseek-')\r\n    || normalized.startsWith('qwen')\r\n    || normalized.startsWith('glm-')\r\n    || normalized.startsWith('minimax-')\r\n  )\r\n}\r\n\r\nfunction _dedupeKiroModels(models: readonly ModelInfo[]): ModelInfo[] {\r\n  const seen = new Set<string>()\r\n  const out: ModelInfo[] = []\r\n  for (const model of models) {\r\n    if (!model.id) continue\r\n    const normalizedId = normalizeKiroModelId(model.id)\r\n    const dedupeKey = normalizedId.toLowerCase()\r\n    if (seen.has(dedupeKey)) continue\r\n    seen.add(dedupeKey)\r\n    out.push({\r\n      ...model,\r\n      id: normalizedId,\r\n      name: model.name || normalizedId,\r\n    })\r\n  }\r\n  return out\r\n}\r\n\r\nfunction _normalizeKiroModelCatalog(models: readonly KiroAvailableModel[]): ModelInfo[] {\r\n  const normalized = models\r\n    .filter((model): model is KiroAvailableModel & { modelId: string } => typeof model.modelId === 'string' && model.modelId.length > 0)\r\n    .filter(model => _isLikelyKiroModelId(model.modelId) || isKiroModel(model.modelId))\r\n    .map(model => ({\r\n      id: normalizeKiroModelId(model.modelId),\r\n      name: model.modelName || normalizeKiroModelId(model.modelId),\r\n      contextWindow: model.tokenLimits?.maxInputTokens,\r\n      supportsToolCalling: true,\r\n    }))\r\n\r\n  return _dedupeKiroModels(normalized)\r\n}\r\n\r\nexport class KiroLane implements Lane {\r\n  readonly name = 'kiro'\r\n  readonly displayName = 'Kiro (AWS CodeWhisperer)'\r\n\r\n  private accessToken: string | null = null\r\n  private profileArn: string | null = null\r\n  private discoveredModels = new Map<string, ModelInfo>()\r\n  private modelsCache: { at: number; models: ModelInfo[] } | null = null\r\n  private promptContextTokensByConversation = new Map<string, number>()\r\n\r\n  configure(opts: { accessToken?: string; profileArn?: string | null }): void {\r\n    const authChanged =\r\n      (opts.accessToken !== undefined && (opts.accessToken || null) !== this.accessToken)\r\n      || (opts.profileArn !== undefined && (opts.profileArn ?? null) !== this.profileArn)\r\n    if (opts.accessToken !== undefined) this.accessToken = opts.accessToken || null\r\n    if (opts.profileArn !== undefined) this.profileArn = opts.profileArn || null\r\n    this.modelsCache = null\r\n    this.discoveredModels.clear()\r\n    if (authChanged) this.promptContextTokensByConversation.clear()\r\n  }\r\n\r\n  supportsModel(model: string): boolean {\r\n    // Kiro catalog uses dot-versioned aliases (`claude-sonnet-4.5`,\r\n    // `deepseek-3.2`\u2026) that DON'T collide with Anthropic-canonical ids\r\n    // like `claude-sonnet-4-20250514`. Route strictly on the static\r\n    // list so the dispatcher doesn't accidentally steal a canonical\r\n    // Claude id away from the Anthropic path.\r\n    const normalized = normalizeKiroModelId(model)\r\n    return isKiroModel(normalized) || this.discoveredModels.has(normalized)\r\n  }\r\n\r\n  isHealthy(): boolean {\r\n    return !!this.accessToken\r\n  }\r\n\r\n  resolveModel(model: string): string {\r\n    return normalizeKiroModelId(model)\r\n  }\r\n\r\n  async listModels(_providerFilter?: string): Promise<ModelInfo[]> {\r\n    const now = Date.now()\r\n    if (this.modelsCache && now - this.modelsCache.at < KIRO_MODELS_CACHE_TTL_MS) {\r\n      return this.modelsCache.models\r\n    }\r\n\r\n    const dynamicModels = await this._listAvailableModels().catch(() => [])\r\n    const models = dynamicModels.length > 0 ? dynamicModels : KIRO_MODELS\r\n    const deduped = _dedupeKiroModels(models)\r\n    this.discoveredModels.clear()\r\n    for (const model of deduped) {\r\n      this.discoveredModels.set(model.id, model)\r\n    }\r\n    this.modelsCache = { at: now, models: deduped }\r\n    return deduped\r\n  }\r\n\r\n  dispose(): void {}\r\n\r\n  private _readStoredAuthBlob(): StoredKiroOAuthBlob | null {\r\n    try {\r\n      const raw = loadProviderKey('kiro_oauth')\r\n      if (!raw) return null\r\n      return JSON.parse(raw) as StoredKiroOAuthBlob\r\n    } catch {\r\n      return null\r\n    }\r\n  }\r\n\r\n  private _reloadAuthFromDisk(): boolean {\r\n    const blob = this._readStoredAuthBlob()\r\n    if (!blob?.accessToken) return false\r\n\r\n    const nextAccessToken = blob.accessToken\r\n    const nextProfileArn = blob.meta?.profileArn ?? null\r\n    const changed = nextAccessToken !== this.accessToken || nextProfileArn !== this.profileArn\r\n    if (changed) {\r\n      this.configure({ accessToken: nextAccessToken, profileArn: nextProfileArn })\r\n    }\r\n    return changed\r\n  }\r\n\r\n  private async _recoverInvalidBearer(): Promise<boolean> {\r\n    // Step 1: Check if a fresh token was already written to disk\r\n    // (e.g. by a concurrent /login kiro or token refresh elsewhere).\r\n    if (this._reloadAuthFromDisk()) return true\r\n\r\n    // Step 2: If we have a refresh token, try refreshing via HTTPS.\r\n    // This is fully native \u2014 no CLI binary needed.\r\n    const blob = this._readStoredAuthBlob()\r\n    const refreshToken = blob?.refreshToken\r\n    if (refreshToken) {\r\n      try {\r\n        const { refreshKiroOAuth } = await import('../../services/api/auth/oauth_services.js')\r\n        await refreshKiroOAuth(refreshToken)\r\n      } catch {\r\n        // Refresh failed \u2014 token may be revoked. User needs to re-login.\r\n      }\r\n    }\r\n\r\n    // Step 3: Reload from disk one more time \u2014 the refresh above\r\n    // saves the new token to disk before returning.\r\n    return this._reloadAuthFromDisk() || !!this.accessToken\r\n  }\r\n\r\n  private async _listAvailableModels(): Promise<ModelInfo[]> {\r\n    if (!this.accessToken) return []\r\n\r\n    const response = await fetch(KIRO_MODELS_ENDPOINT, {\r\n      method: 'POST',\r\n      headers: {\r\n        'Content-Type': 'application/x-amz-json-1.0',\r\n        'x-amz-target': 'AmazonCodeWhispererService.ListAvailableModels',\r\n        'Authorization': `Bearer ${this.accessToken}`,\r\n        'Accept': 'application/json',\r\n      },\r\n      body: JSON.stringify({\r\n        origin: 'AI_EDITOR',\r\n        profileArn: this.profileArn ?? DEFAULT_PROFILE_ARN,\r\n      }),\r\n    })\r\n    if (!response.ok) return []\r\n\r\n    const data = await response.json() as { models?: KiroAvailableModel[] }\r\n    return _normalizeKiroModelCatalog(data.models ?? [])\r\n  }\r\n\r\n  async *run(_context: LaneRunContext): AsyncGenerator<AnthropicStreamEvent, LaneRunResult> {\r\n    const context = _context\r\n    const { model, messages, systemParts, availableTools, mcpTools, signal, maxTokens } = context\r\n\r\n    const systemText = assembleSystemFromParts(systemParts)\r\n    const allTools = [\r\n      ...availableTools.map(tool => tool.anthropicDef),\r\n      ...mcpTools,\r\n    ]\r\n\r\n    const totalUsage: NormalizedUsage = {\r\n      input_tokens: 0,\r\n      output_tokens: 0,\r\n      cache_read_tokens: 0,\r\n      cache_write_tokens: 0,\r\n      thinking_tokens: 0,\r\n    }\r\n\r\n    let currentMessages = messages\r\n    let turnCount = 0\r\n\r\n    while (turnCount < MAX_TURNS) {\r\n      if (signal.aborted) return { stopReason: 'aborted', usage: totalUsage }\r\n      turnCount++\r\n\r\n      const toolUsesByIndex = new Map<number, {\r\n        id: string\r\n        name: string\r\n        inputJson: string\r\n      }>()\r\n      let done = false\r\n      let stopReason: 'end_turn' | 'tool_use' = 'end_turn'\r\n\r\n      const gen = this.streamAsProvider({\r\n        model,\r\n        messages: currentMessages,\r\n        system: systemText,\r\n        tools: allTools,\r\n        max_tokens: maxTokens,\r\n        signal,\r\n      })\r\n\r\n      while (!done) {\r\n        const next = await gen.next()\r\n        if (next.done) {\r\n          const usage = next.value\r\n          totalUsage.input_tokens += usage.input_tokens\r\n          totalUsage.output_tokens += usage.output_tokens\r\n          totalUsage.cache_read_tokens += usage.cache_read_tokens\r\n          totalUsage.cache_write_tokens += usage.cache_write_tokens\r\n          totalUsage.thinking_tokens += usage.thinking_tokens\r\n          done = true\r\n          break\r\n        }\r\n\r\n        const event = next.value\r\n        yield event\r\n\r\n        if (\r\n          event.type === 'content_block_start'\r\n          && event.content_block?.type === 'tool_use'\r\n          && typeof event.index === 'number'\r\n          && event.content_block.id\r\n          && event.content_block.name\r\n        ) {\r\n          toolUsesByIndex.set(event.index, {\r\n            id: event.content_block.id,\r\n            name: event.content_block.name,\r\n            inputJson: '',\r\n          })\r\n        }\r\n\r\n        if (\r\n          event.type === 'content_block_delta'\r\n          && event.delta?.type === 'input_json_delta'\r\n          && typeof event.index === 'number'\r\n        ) {\r\n          const toolUse = toolUsesByIndex.get(event.index)\r\n          if (toolUse) {\r\n            toolUse.inputJson += event.delta.partial_json ?? ''\r\n          }\r\n        }\r\n\r\n        if (event.type === 'message_delta' && event.delta?.stop_reason === 'tool_use') {\r\n          stopReason = 'tool_use'\r\n        }\r\n      }\r\n\r\n      const collectedToolUses = Array.from(toolUsesByIndex.values()).map(toolUse => {\r\n        let input: Record<string, unknown> = {}\r\n        if (toolUse.inputJson) {\r\n          try {\r\n            input = JSON.parse(toolUse.inputJson) as Record<string, unknown>\r\n          } catch {\r\n            input = {}\r\n          }\r\n        }\r\n        return { id: toolUse.id, name: toolUse.name, input }\r\n      })\r\n\r\n      if (stopReason !== 'tool_use' || collectedToolUses.length === 0) {\r\n        return { stopReason: 'end_turn', usage: totalUsage }\r\n      }\r\n\r\n      const toolResults = await Promise.all(\r\n        collectedToolUses.map(async toolUse => {\r\n          try {\r\n            const result = await context.executeTool(toolUse.name, toolUse.input)\r\n            return {\r\n              type: 'tool_result' as const,\r\n              tool_use_id: toolUse.id,\r\n              content: typeof result.content === 'string'\r\n                ? result.content\r\n                : JSON.stringify(result.content),\r\n              is_error: result.isError,\r\n            }\r\n          } catch (error: any) {\r\n            return {\r\n              type: 'tool_result' as const,\r\n              tool_use_id: toolUse.id,\r\n              content: `Error: ${error?.message ?? String(error)}`,\r\n              is_error: true,\r\n            }\r\n          }\r\n        }),\r\n      )\r\n\r\n      currentMessages = [\r\n        ...currentMessages,\r\n        {\r\n          role: 'assistant',\r\n          content: collectedToolUses.map(toolUse => ({\r\n            type: 'tool_use' as const,\r\n            id: toolUse.id,\r\n            name: toolUse.name,\r\n            input: toolUse.input,\r\n          })),\r\n        },\r\n        {\r\n          role: 'user',\r\n          content: toolResults,\r\n        },\r\n      ]\r\n    }\r\n\r\n    return { stopReason: 'max_turns', usage: totalUsage }\r\n  }\r\n\r\n  async *streamAsProvider(\r\n    params: LaneProviderCallParams,\r\n  ): AsyncGenerator<AnthropicStreamEvent, NormalizedUsage> {\r\n    const { model, messages, system, tools, max_tokens, temperature, signal } = params\r\n    const resolvedModel = this.resolveModel(model)\r\n    const conversationId = params.sessionId || getSessionId()\r\n\r\n    if (!this.accessToken) {\r\n      throw new Error(\r\n        'Kiro lane: not authenticated. Run `/login kiro` to sign in with AWS Builder ID.',\r\n      )\r\n    }\r\n\r\n    const systemText = typeof system === 'string'\r\n      ? system\r\n      : (system ?? []).map(b => b.text).join('\\n\\n')\r\n\r\n    const body = buildKiroPayload({\r\n      model: resolvedModel,\r\n      system: systemText,\r\n      messages,\r\n      tools,\r\n      conversationId,\r\n      // CodeWhisperer caps at 32k output; the caller's max_tokens is\r\n      // usually 8192 already, but clamp for safety.\r\n      maxTokens: Math.min(max_tokens ?? 8192, 32_000),\r\n      temperature,\r\n      profileArn: this.profileArn ?? DEFAULT_PROFILE_ARN,\r\n    })\r\n\r\n    const messageId = `kiro-${Date.now()}`\r\n    let messageStartEmitted = false\r\n    let outputTokens = 0\r\n    let inputTokens = 0\r\n    let cacheReadTokens = 0\r\n    let cacheWriteTokens = 0\r\n    let reasoningTokens = 0\r\n\r\n    // Content-block state. Kiro interleaves text + code + tool_use freely,\r\n    // so we track what's currently open and switch cleanly.\r\n    let currentIndex = 0\r\n    let openBlock: 'text' | 'thinking' | null = null\r\n    // Per-tool accumulation. Kiro's toolUseEvent fires once per tool with\r\n    // the input already resolved (no argument-streaming), but the same\r\n    // toolUseId may repeat if the model extends its input mid-stream, so\r\n    // we reuse the block index and accumulate partial_json into it.\r\n    const toolBlocks = new Map<string, ToolBlockState>()\r\n    let pendingAssistantText = ''\r\n    let sawToolUse = false\r\n    let syntheticToolCounter = 0\r\n    const preferredShellToolName = resolvePreferredKiroShellToolName(\r\n      tools.map(tool => tool.name),\r\n    )\r\n\r\n    // Kiro often emits messageStopEvent before metrics/context bookkeeping.\r\n    // Keep reading until the HTTP stream ends so final usage is not dropped.\r\n    let totalContentChars = 0\r\n    let contextUsagePercentage = 0\r\n\r\n    const emitMessageStart = (): AnthropicStreamEvent | undefined => {\r\n      if (messageStartEmitted) return undefined\r\n      messageStartEmitted = true\r\n      return {\r\n        type: 'message_start',\r\n        message: {\r\n          id: messageId,\r\n          type: 'message',\r\n          role: 'assistant',\r\n          content: [],\r\n          model: resolvedModel,\r\n          stop_reason: null,\r\n          stop_sequence: null,\r\n          usage: { input_tokens: 0, output_tokens: 0 },\r\n        },\r\n      }\r\n    }\r\n\r\n    const handlerState: EventHandlerState = {\r\n      model: resolvedModel,\r\n      messageId,\r\n      toolBlocks,\r\n      getCurrentIndex: () => currentIndex,\r\n      setCurrentIndex: v => { currentIndex = v },\r\n      getOpenBlock: () => openBlock,\r\n      setOpenBlock: v => { openBlock = v },\r\n      getPendingAssistantText: () => pendingAssistantText,\r\n      setPendingAssistantText: v => { pendingAssistantText = v },\r\n      markSawToolUse: () => { sawToolUse = true },\r\n      nextSyntheticToolUseId: () => `toolu_kiro_${++syntheticToolCounter}`,\r\n      preferredShellToolName,\r\n    }\r\n\r\n    let response: Response | null = null\r\n    let responseStatus = 0\r\n    let responseErrorText = ''\r\n    try {\r\n      for (let attempt = 0; attempt < 2; attempt++) {\r\n        response = await fetch(KIRO_ENDPOINT, {\r\n          method: 'POST',\r\n          headers: {\r\n            'Content-Type': 'application/json',\r\n            'Accept': 'application/vnd.amazon.eventstream',\r\n            'X-Amz-Target': 'AmazonCodeWhispererStreamingService.GenerateAssistantResponse',\r\n            'Authorization': `Bearer ${this.accessToken}`,\r\n            'User-Agent': 'aws-sdk-js/3.0.0 kiro-ide/1.0.0',\r\n            'X-Amz-User-Agent': 'aws-sdk-js/3.0.0 kiro-ide/1.0.0',\r\n            'Amz-Sdk-Invocation-Id': randomUUID(),\r\n            'Amz-Sdk-Request': 'attempt=1; max=3',\r\n          },\r\n          body: JSON.stringify(body),\r\n          signal,\r\n        })\r\n\r\n        if (response.ok) break\r\n\r\n        responseStatus = response.status\r\n        responseErrorText = await response.text().catch(() => '')\r\n        if (\r\n          attempt === 0\r\n          && _isInvalidBearerResponse(responseStatus, responseErrorText)\r\n          && await this._recoverInvalidBearer()\r\n        ) {\r\n          response = null\r\n          responseStatus = 0\r\n          responseErrorText = ''\r\n          continue\r\n        }\r\n\r\n        break\r\n      }\r\n    } catch (err: unknown) {\r\n      const mst = emitMessageStart()\r\n      if (mst) yield mst\r\n      const message = err instanceof Error ? err.message : String(err)\r\n      yield* _emitErrorText(`kiro API connection error: ${message}`)\r\n      yield { type: 'message_delta', delta: { stop_reason: 'end_turn' }, usage: { output_tokens: 0 } }\r\n      yield { type: 'message_stop' }\r\n      return _blankUsage()\r\n    }\r\n\r\n    if (!response?.ok) {\r\n      const errText = responseErrorText\r\n      const mst = emitMessageStart()\r\n      if (mst) yield mst\r\n      const lowered = errText.toLowerCase()\r\n      const isPromptTooLong =\r\n        lowered.includes('context length')\r\n        || lowered.includes('context window')\r\n        || lowered.includes('too long')\r\n        || lowered.includes('inputtokens')\r\n      const isImproperlyFormed =\r\n        responseStatus === 400 && lowered.includes('improperly formed')\r\n      const headline = isPromptTooLong\r\n        ? `Prompt is too long (kiro ${responseStatus})`\r\n        : `kiro API error ${responseStatus}`\r\n      // \"Improperly formed request\" is a generic AWS-side 400 with no\r\n      // structured reason. The most useful thing we can do is (a) dump the\r\n      // payload so the user can inspect what Kiro rejected, and (b) hint at\r\n      // the common causes so a fix is one step closer.\r\n      let extra = ''\r\n      if (isImproperlyFormed) {\r\n        const dumpPath = _dumpKiroRequestBody(body)\r\n        const hint =\r\n          'Common causes: an MCP tool name with characters Kiro disallows, ' +\r\n          'a tool input_schema field not handled by sanitizeSchemaForLane, ' +\r\n          'or a history shape that lost role alternation during fallback.'\r\n        extra = dumpPath\r\n          ? ` ${hint} Request body dumped to ${dumpPath}.`\r\n          : ` ${hint} Set CLAUDEX_KIRO_DEBUG_DUMP=1 to capture the request body on the next failure.`\r\n      }\r\n      yield* _emitErrorText(`${headline}: ${errText.slice(0, 500)}${extra}`)\r\n      yield { type: 'message_delta', delta: { stop_reason: 'end_turn' }, usage: { output_tokens: 0 } }\r\n      yield { type: 'message_stop' }\r\n      return _blankUsage()\r\n    }\r\n\r\n    if (!response.body) throw new Error('Kiro: empty response body')\r\n\r\n    const reader = response.body.getReader()\r\n    // Explicit widen from ArrayBuffer \u2192 ArrayBufferLike so the remainder\r\n    // returned by parseFrames() (which starts from a fetch() chunk whose\r\n    // underlying buffer is ArrayBufferLike) assigns back without a cast.\r\n    let buffer: Uint8Array<ArrayBufferLike> = new Uint8Array(0)\r\n\r\n    try {\r\n      while (true) {\r\n        const { done, value } = await reader.read()\r\n        if (done) break\r\n        if (value && value.length > 0) {\r\n          // Append incoming chunk to the residual buffer from the last\r\n          // parse pass (frames can straddle chunk boundaries).\r\n          const merged = new Uint8Array(buffer.length + value.length)\r\n          merged.set(buffer)\r\n          merged.set(value, buffer.length)\r\n          buffer = merged\r\n        }\r\n\r\n        const { events, remainder } = parseFrames(buffer)\r\n        buffer = remainder\r\n\r\n        for (const ev of events) {\r\n          // Track how much content the model has produced so we can\r\n          // estimate output_tokens when metricsEvent is absent.\r\n          if (ev.eventType === 'assistantResponseEvent' || ev.eventType === 'codeEvent') {\r\n            const contentPayload = _asRecord(_unwrapKiroEventPayload(ev.eventType, ev.payload))\r\n            const c = typeof contentPayload?.content === 'string' ? contentPayload.content : ''\r\n            totalContentChars += c.length\r\n          }\r\n\r\n          const emissions = _handleKiroEvent(ev, handlerState)\r\n          for (const ev2 of emissions) {\r\n            if (!messageStartEmitted && _shouldTriggerMessageStart(ev2)) {\r\n              const mst = emitMessageStart()\r\n              if (mst) yield mst\r\n            }\r\n            yield ev2\r\n          }\r\n\r\n          if (ev.eventType === 'metricsEvent') {\r\n            const m = (ev.payload?.metricsEvent as Record<string, unknown> | undefined)\r\n              ?? ev.payload\r\n              ?? {}\r\n            const usage = _extractKiroMetricsUsage(m)\r\n            if (usage.inputTokens > 0) inputTokens = usage.inputTokens\r\n            if (usage.outputTokens > 0) outputTokens = usage.outputTokens\r\n            if (usage.cacheReadTokens > 0) cacheReadTokens = usage.cacheReadTokens\r\n            if (usage.cacheWriteTokens > 0) cacheWriteTokens = usage.cacheWriteTokens\r\n            if (usage.reasoningTokens > 0) reasoningTokens = usage.reasoningTokens\r\n          }\r\n\r\n          if (ev.eventType === 'contextUsageEvent') {\r\n            const pct = _extractKiroContextUsagePercentage(ev.payload)\r\n            if (pct > 0) contextUsagePercentage = pct\r\n          }\r\n        }\r\n      }\r\n    } finally {\r\n      reader.releaseLock()\r\n    }\r\n\r\n    // Flush any buffered assistant text and close any still-open block.\r\n    // The messageStopEvent path usually does this for clean exits; this\r\n    // also covers mid-stream aborts and DSML marker tails.\r\n    const finalEmissions: AnthropicStreamEvent[] = []\r\n    _flushPendingAssistantText(handlerState, finalEmissions, true)\r\n    _closeOpenContentBlock(handlerState, finalEmissions)\r\n    _closeOpenToolUseBlocks(handlerState, finalEmissions)\r\n    for (const ev2 of finalEmissions) {\r\n      if (!messageStartEmitted && _shouldTriggerMessageStart(ev2)) {\r\n        const mst = emitMessageStart()\r\n        if (mst) yield mst\r\n      }\r\n      yield ev2\r\n    }\r\n\r\n    if (!messageStartEmitted) {\r\n      const mst = emitMessageStart()\r\n      if (mst) yield mst\r\n    }\r\n\r\n    // Backfill usage from text length when metricsEvent was missing.\r\n    if (outputTokens === 0 && totalContentChars > 0) {\r\n      outputTokens = Math.max(1, Math.floor(totalContentChars / 4))\r\n    }\r\n    const estimatedContextTokens = contextUsagePercentage > 0\r\n      ? Math.floor(contextUsagePercentage * KIRO_CONTEXT_WINDOW / 100)\r\n      : 0\r\n    if (inputTokens === 0 && estimatedContextTokens > 0) inputTokens = estimatedContextTokens\r\n\r\n    const promptUsageKey = `${conversationId}:${resolvedModel}`\r\n    const promptUsage = _deriveKiroPromptUsage({\r\n      rawInputTokens: inputTokens,\r\n      contextTokens: estimatedContextTokens,\r\n      cacheReadTokens,\r\n      cacheWriteTokens,\r\n      previousContextTokens: this.promptContextTokensByConversation.get(promptUsageKey) ?? 0,\r\n    })\r\n    inputTokens = promptUsage.inputTokens\r\n    cacheReadTokens = promptUsage.cacheReadTokens\r\n    cacheWriteTokens = promptUsage.cacheWriteTokens\r\n    if (promptUsage.nextContextTokens > 0) {\r\n      this.promptContextTokensByConversation.set(promptUsageKey, promptUsage.nextContextTokens)\r\n    }\r\n\r\n    const hadToolUse = sawToolUse\r\n    const stopReason: 'tool_use' | 'end_turn' = hadToolUse ? 'tool_use' : 'end_turn'\r\n    yield {\r\n      type: 'message_delta',\r\n      delta: { stop_reason: stopReason },\r\n      usage: {\r\n        output_tokens: outputTokens,\r\n        input_tokens: inputTokens,\r\n        ...(cacheReadTokens > 0 && { cache_read_input_tokens: cacheReadTokens }),\r\n        ...(cacheWriteTokens > 0 && { cache_creation_input_tokens: cacheWriteTokens }),\r\n      },\r\n    }\r\n    yield { type: 'message_stop' }\r\n\r\n    return {\r\n      input_tokens: inputTokens,\r\n      output_tokens: outputTokens,\r\n      cache_read_tokens: cacheReadTokens,\r\n      cache_write_tokens: cacheWriteTokens,\r\n      thinking_tokens: reasoningTokens,\r\n    }\r\n  }\r\n}\r\n\r\n// \u2500\u2500\u2500 Event \u2192 IR translation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\ninterface EventHandlerState {\r\n  model: string\r\n  messageId: string\r\n  toolBlocks: Map<string, ToolBlockState>\r\n  getCurrentIndex: () => number\r\n  setCurrentIndex: (v: number) => void\r\n  getOpenBlock: () => 'text' | 'thinking' | null\r\n  setOpenBlock: (v: 'text' | 'thinking' | null) => void\r\n  getPendingAssistantText: () => string\r\n  setPendingAssistantText: (v: string) => void\r\n  markSawToolUse: () => void\r\n  nextSyntheticToolUseId: () => string\r\n  preferredShellToolName: string | null\r\n}\r\n\r\ninterface ToolBlockState {\r\n  anthropicIndex: number\r\n  emittedStart: boolean\r\n  closed: boolean\r\n}\r\n\r\nfunction _closeOpenContentBlock(\r\n  state: EventHandlerState,\r\n  out: AnthropicStreamEvent[],\r\n): void {\r\n  const openBlock = state.getOpenBlock()\r\n  if (openBlock === null) return\r\n  out.push({ type: 'content_block_stop', index: state.getCurrentIndex() })\r\n  state.setCurrentIndex(state.getCurrentIndex() + 1)\r\n  state.setOpenBlock(null)\r\n}\r\n\r\nexport function _closeOpenToolUseBlocks(\r\n  state: Pick<EventHandlerState, 'toolBlocks'>,\r\n  out: AnthropicStreamEvent[],\r\n): void {\r\n  for (const [, entry] of state.toolBlocks) {\r\n    if (entry.emittedStart && !entry.closed) {\r\n      out.push({ type: 'content_block_stop', index: entry.anthropicIndex })\r\n      entry.closed = true\r\n    }\r\n  }\r\n  state.toolBlocks.clear()\r\n}\r\n\r\nfunction _asRecord(value: unknown): Record<string, unknown> | null {\r\n  return value && typeof value === 'object' && !Array.isArray(value)\r\n    ? value as Record<string, unknown>\r\n    : null\r\n}\r\n\r\nfunction _numberFrom(value: unknown): number {\r\n  if (typeof value === 'number' && Number.isFinite(value) && value > 0) {\r\n    return Math.floor(value)\r\n  }\r\n  if (typeof value === 'string' && value.trim()) {\r\n    const parsed = Number(value)\r\n    if (Number.isFinite(parsed) && parsed > 0) return Math.floor(parsed)\r\n  }\r\n  return 0\r\n}\r\n\r\nfunction _firstNumber(record: Record<string, unknown>, keys: readonly string[]): number {\r\n  for (const key of keys) {\r\n    const value = _numberFrom(record[key])\r\n    if (value > 0) return value\r\n  }\r\n  return 0\r\n}\r\n\r\nfunction _unwrapKiroEventPayload(eventType: string, payload: Record<string, unknown> | null): unknown {\r\n  if (!payload) return {}\r\n  const nested = payload[eventType]\r\n  return nested !== undefined ? nested : payload\r\n}\r\n\r\nfunction _extractKiroMetricsUsage(metrics: Record<string, unknown>): {\r\n  inputTokens: number\r\n  outputTokens: number\r\n  cacheReadTokens: number\r\n  cacheWriteTokens: number\r\n  reasoningTokens: number\r\n} {\r\n  return {\r\n    inputTokens: _firstNumber(metrics, [\r\n      'inputTokens',\r\n      'input_tokens',\r\n      'promptTokens',\r\n      'prompt_tokens',\r\n    ]),\r\n    outputTokens: _firstNumber(metrics, [\r\n      'outputTokens',\r\n      'output_tokens',\r\n      'completionTokens',\r\n      'completion_tokens',\r\n    ]),\r\n    cacheReadTokens: _firstNumber(metrics, [\r\n      'cacheReadInputTokens',\r\n      'cache_read_input_tokens',\r\n      'cachedInputTokens',\r\n      'cached_input_tokens',\r\n      'cachedTokens',\r\n      'cached_tokens',\r\n    ]),\r\n    cacheWriteTokens: _firstNumber(metrics, [\r\n      'cacheCreationInputTokens',\r\n      'cache_creation_input_tokens',\r\n      'cacheWriteInputTokens',\r\n      'cache_write_input_tokens',\r\n    ]),\r\n    reasoningTokens: _firstNumber(metrics, [\r\n      'reasoningTokens',\r\n      'reasoning_tokens',\r\n      'thinkingTokens',\r\n      'thinking_tokens',\r\n    ]),\r\n  }\r\n}\r\n\r\nfunction _extractKiroContextUsagePercentage(payload: Record<string, unknown> | null): number {\r\n  const source = _asRecord(_unwrapKiroEventPayload('contextUsageEvent', payload)) ?? payload ?? {}\r\n  return _numberFrom(source.contextUsagePercentage)\r\n}\r\n\r\nexport function _deriveKiroPromptUsage(args: {\r\n  rawInputTokens: number\r\n  contextTokens: number\r\n  cacheReadTokens: number\r\n  cacheWriteTokens: number\r\n  previousContextTokens: number\r\n}): DerivedKiroPromptUsage {\r\n  const rawInputTokens = _numberFrom(args.rawInputTokens)\r\n  const contextTokens = _numberFrom(args.contextTokens)\r\n  const explicitCacheReadTokens = _numberFrom(args.cacheReadTokens)\r\n  const explicitCacheWriteTokens = _numberFrom(args.cacheWriteTokens)\r\n  const previousContextTokens = _numberFrom(args.previousContextTokens)\r\n  const explicitCacheTokens = explicitCacheReadTokens + explicitCacheWriteTokens\r\n\r\n  if (explicitCacheTokens > 0) {\r\n    const inputTokens = rawInputTokens >= explicitCacheTokens\r\n      ? rawInputTokens - explicitCacheTokens\r\n      : rawInputTokens\r\n    const nextContextTokens = contextTokens > 0\r\n      ? contextTokens\r\n      : inputTokens + explicitCacheTokens\r\n    return {\r\n      inputTokens,\r\n      cacheReadTokens: explicitCacheReadTokens,\r\n      cacheWriteTokens: explicitCacheWriteTokens,\r\n      nextContextTokens,\r\n    }\r\n  }\r\n\r\n  const totalContextTokens = contextTokens > 0 ? contextTokens : rawInputTokens\r\n  if (totalContextTokens <= 0) {\r\n    return {\r\n      inputTokens: rawInputTokens,\r\n      cacheReadTokens: 0,\r\n      cacheWriteTokens: 0,\r\n      nextContextTokens: 0,\r\n    }\r\n  }\r\n\r\n  if (previousContextTokens <= 0) {\r\n    return {\r\n      inputTokens: rawInputTokens > 0 ? rawInputTokens : totalContextTokens,\r\n      cacheReadTokens: 0,\r\n      cacheWriteTokens: 0,\r\n      nextContextTokens: totalContextTokens,\r\n    }\r\n  }\r\n\r\n  const cacheReadTokens = Math.min(previousContextTokens, totalContextTokens)\r\n  return {\r\n    inputTokens: Math.max(0, totalContextTokens - cacheReadTokens),\r\n    cacheReadTokens,\r\n    cacheWriteTokens: 0,\r\n    nextContextTokens: totalContextTokens,\r\n  }\r\n}\r\n\r\nfunction _emitText(\r\n  state: EventHandlerState,\r\n  out: AnthropicStreamEvent[],\r\n  text: string,\r\n): void {\r\n  if (!text) return\r\n  if (state.getOpenBlock() === 'thinking') {\r\n    _closeOpenContentBlock(state, out)\r\n  }\r\n  if (state.getOpenBlock() !== 'text') {\r\n    out.push({\r\n      type: 'content_block_start',\r\n      index: state.getCurrentIndex(),\r\n      content_block: { type: 'text', text: '' },\r\n    })\r\n    state.setOpenBlock('text')\r\n  }\r\n  out.push({\r\n    type: 'content_block_delta',\r\n    index: state.getCurrentIndex(),\r\n    delta: { type: 'text_delta', text },\r\n  })\r\n}\r\n\r\nfunction _emitThinking(\r\n  state: EventHandlerState,\r\n  out: AnthropicStreamEvent[],\r\n  text: string,\r\n): void {\r\n  if (!text) return\r\n  if (state.getOpenBlock() === 'text') {\r\n    _closeOpenContentBlock(state, out)\r\n  }\r\n  if (state.getOpenBlock() !== 'thinking') {\r\n    out.push({\r\n      type: 'content_block_start',\r\n      index: state.getCurrentIndex(),\r\n      content_block: { type: 'thinking', thinking: '' },\r\n    })\r\n    state.setOpenBlock('thinking')\r\n  }\r\n  out.push({\r\n    type: 'content_block_delta',\r\n    index: state.getCurrentIndex(),\r\n    delta: { type: 'thinking_delta', thinking: text },\r\n  })\r\n}\r\n\r\nfunction _emitToolUse(\r\n  state: EventHandlerState,\r\n  out: AnthropicStreamEvent[],\r\n  toolUse: { toolUseId: string; name: string; input: unknown },\r\n  opts: { closeImmediately?: boolean } = {},\r\n): void {\r\n  let entry = state.toolBlocks.get(toolUse.toolUseId)\r\n  if (!entry) {\r\n    _closeOpenContentBlock(state, out)\r\n    entry = {\r\n      anthropicIndex: state.getCurrentIndex(),\r\n      emittedStart: false,\r\n      closed: false,\r\n    }\r\n    state.toolBlocks.set(toolUse.toolUseId, entry)\r\n    state.setCurrentIndex(state.getCurrentIndex() + 1)\r\n  }\r\n\r\n  if (!entry.emittedStart) {\r\n    out.push({\r\n      type: 'content_block_start',\r\n      index: entry.anthropicIndex,\r\n      content_block: {\r\n        type: 'tool_use',\r\n        id: toolUse.toolUseId,\r\n        name: toClaudexToolName(toolUse.name, state.preferredShellToolName),\r\n        input: {},\r\n      },\r\n    })\r\n    entry.emittedStart = true\r\n    state.markSawToolUse()\r\n  }\r\n\r\n  if (toolUse.input !== undefined) {\r\n    const json = typeof toolUse.input === 'string'\r\n      ? toolUse.input\r\n      : JSON.stringify(toolUse.input)\r\n    out.push({\r\n      type: 'content_block_delta',\r\n      index: entry.anthropicIndex,\r\n      delta: { type: 'input_json_delta', partial_json: json },\r\n    })\r\n  }\r\n\r\n  if (opts.closeImmediately && !entry.closed) {\r\n    out.push({ type: 'content_block_stop', index: entry.anthropicIndex })\r\n    entry.closed = true\r\n  }\r\n}\r\n\r\nexport function _parseDsmlFunctionCalls(block: string): ParsedDsmlToolCall[] | null {\r\n  if (!block.startsWith(DSML_FUNCTION_CALLS_OPEN) || !block.endsWith(DSML_FUNCTION_CALLS_CLOSE)) {\r\n    return null\r\n  }\r\n\r\n  const inner = block.slice(\r\n    DSML_FUNCTION_CALLS_OPEN.length,\r\n    block.length - DSML_FUNCTION_CALLS_CLOSE.length,\r\n  )\r\n  const calls: ParsedDsmlToolCall[] = []\r\n  const invokeRegex = new RegExp(\r\n    `<${DSML_TOKEN}invoke name=\"([^\"]+)\">([\\\\s\\\\S]*?)</${DSML_TOKEN}invoke>`,\r\n    'g',\r\n  )\r\n  const parameterRegex = new RegExp(\r\n    `<${DSML_TOKEN}parameter name=\"([^\"]+)\" string=\"(true|false)\">([\\\\s\\\\S]*?)</${DSML_TOKEN}parameter>`,\r\n    'g',\r\n  )\r\n\r\n  let lastInvokeEnd = 0\r\n  for (const match of inner.matchAll(invokeRegex)) {\r\n    const full = match[0]\r\n    const name = match[1]\r\n    const argsBlock = match[2]\r\n    if (!(full && name != null && argsBlock != null && match.index != null)) return null\r\n    if (inner.slice(lastInvokeEnd, match.index).trim()) return null\r\n\r\n    const input: Record<string, unknown> = {}\r\n    let lastParamEnd = 0\r\n    for (const param of argsBlock.matchAll(parameterRegex)) {\r\n      const [, paramName, isString, rawValue] = param\r\n      if (!(paramName && isString && rawValue != null && param.index != null)) return null\r\n      if (argsBlock.slice(lastParamEnd, param.index).trim()) return null\r\n      if (Object.prototype.hasOwnProperty.call(input, paramName)) return null\r\n\r\n      if (isString === 'true') {\r\n        input[paramName] = rawValue\r\n      } else {\r\n        const trimmed = rawValue.trim()\r\n        if (!trimmed) {\r\n          input[paramName] = null\r\n        } else {\r\n          try {\r\n            input[paramName] = JSON.parse(trimmed) as unknown\r\n          } catch {\r\n            return null\r\n          }\r\n        }\r\n      }\r\n\r\n      lastParamEnd = param.index + param[0].length\r\n    }\r\n\r\n    if (argsBlock.slice(lastParamEnd).trim()) return null\r\n\r\n    calls.push({ name, input })\r\n    lastInvokeEnd = match.index + full.length\r\n  }\r\n\r\n  if (inner.slice(lastInvokeEnd).trim()) return null\r\n\r\n  return calls\r\n}\r\n\r\nfunction _flushPendingAssistantText(\r\n  state: EventHandlerState,\r\n  out: AnthropicStreamEvent[],\r\n  flushAll: boolean,\r\n): void {\r\n  let pending = state.getPendingAssistantText()\r\n  if (!pending) return\r\n\r\n  while (pending.length > 0) {\r\n    const openIndex = pending.indexOf(DSML_FUNCTION_CALLS_OPEN)\r\n    if (openIndex === -1) {\r\n      if (!flushAll) {\r\n        const keepTail = Math.min(pending.length, DSML_FUNCTION_CALLS_OPEN.length - 1)\r\n        const emitLength = pending.length - keepTail\r\n        if (emitLength > 0) {\r\n          _emitText(state, out, pending.slice(0, emitLength))\r\n          pending = pending.slice(emitLength)\r\n        }\r\n        break\r\n      }\r\n\r\n      const stripped = _stripDanglingDsmlText(pending)\r\n      if (stripped) _emitText(state, out, stripped)\r\n      pending = ''\r\n      break\r\n    }\r\n\r\n    if (openIndex > 0) {\r\n      _emitText(state, out, pending.slice(0, openIndex))\r\n      pending = pending.slice(openIndex)\r\n      continue\r\n    }\r\n\r\n    const closeIndex = pending.indexOf(\r\n      DSML_FUNCTION_CALLS_CLOSE,\r\n      DSML_FUNCTION_CALLS_OPEN.length,\r\n    )\r\n    if (closeIndex === -1) {\r\n      if (flushAll) {\r\n        const stripped = _stripDanglingDsmlText(pending)\r\n        if (stripped) _emitText(state, out, stripped)\r\n        pending = ''\r\n      }\r\n      break\r\n    }\r\n\r\n    const blockEnd = closeIndex + DSML_FUNCTION_CALLS_CLOSE.length\r\n    const block = pending.slice(0, blockEnd)\r\n    const toolCalls = _parseDsmlFunctionCalls(block)\r\n    if (toolCalls === null) {\r\n      _emitText(state, out, block)\r\n    } else {\r\n      for (const toolCall of toolCalls) {\r\n        _emitToolUse(\r\n          state,\r\n          out,\r\n          {\r\n            toolUseId: state.nextSyntheticToolUseId(),\r\n            name: toolCall.name,\r\n            input: toolCall.input,\r\n          },\r\n          { closeImmediately: true },\r\n        )\r\n      }\r\n    }\r\n    pending = pending.slice(blockEnd)\r\n  }\r\n\r\n  state.setPendingAssistantText(pending)\r\n}\r\n\r\nfunction _stripDanglingDsmlText(text: string): string {\r\n  const marker = `<${DSML_TOKEN}`\r\n  const markerIndex = text.lastIndexOf(marker)\r\n  if (markerIndex === -1) return text\r\n  return text.slice(0, markerIndex)\r\n}\r\n\r\nexport function _handleKiroEvent(\r\n  ev: KiroEvent,\r\n  state: EventHandlerState,\r\n): AnthropicStreamEvent[] {\r\n  const out: AnthropicStreamEvent[] = []\r\n\r\n  const payload = _unwrapKiroEventPayload(ev.eventType, ev.payload)\r\n  const payloadRecord = _asRecord(payload) ?? {}\r\n\r\n  switch (ev.eventType) {\r\n    case 'assistantResponseEvent': {\r\n      const content = typeof payloadRecord.content === 'string' ? payloadRecord.content : ''\r\n      if (content) {\r\n        state.setPendingAssistantText(state.getPendingAssistantText() + content)\r\n        _flushPendingAssistantText(state, out, false)\r\n      }\r\n      break\r\n    }\r\n    case 'codeEvent': {\r\n      const content = typeof payloadRecord.content === 'string' ? payloadRecord.content : ''\r\n      if (content) _emitText(state, out, content)\r\n      break\r\n    }\r\n    case 'reasoningContentEvent': {\r\n      const content = typeof payloadRecord.content === 'string' ? payloadRecord.content : ''\r\n      if (content) _emitThinking(state, out, content)\r\n      break\r\n    }\r\n    case 'toolUseEvent': {\r\n      // Payload can be a single tool or an array \u2014 normalize.\r\n      const items: Array<Record<string, unknown>> = Array.isArray(payload)\r\n        ? payload.filter((item): item is Record<string, unknown> => _asRecord(item) !== null)\r\n        : [payloadRecord]\r\n      for (const tu of items) {\r\n        const toolUseId = (typeof tu.toolUseId === 'string' && tu.toolUseId)\r\n          || `call_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`\r\n        const toolName = typeof tu.name === 'string' ? tu.name : ''\r\n        _emitToolUse(state, out, {\r\n          toolUseId,\r\n          name: toolName,\r\n          input: tu.input,\r\n        })\r\n      }\r\n      break\r\n    }\r\n    case 'messageStopEvent': {\r\n      _flushPendingAssistantText(state, out, true)\r\n      _closeOpenContentBlock(state, out)\r\n      // Finalize any in-flight tool_use blocks.\r\n      _closeOpenToolUseBlocks(state, out)\r\n      break\r\n    }\r\n    // meteringEvent / metricsEvent / contextUsageEvent / supplementaryWebLinksEvent:\r\n    // metrics are consumed in the outer loop; other bookkeeping events\r\n    // don't map to Anthropic IR.\r\n  }\r\n\r\n  return out\r\n}\r\n\r\nfunction _shouldTriggerMessageStart(ev: AnthropicStreamEvent): boolean {\r\n  return ev.type === 'content_block_start' || ev.type === 'content_block_delta'\r\n}\r\n\r\nfunction assembleSystemFromParts(parts: {\r\n  memory?: string\r\n  environment?: string\r\n  gitStatus?: string\r\n  toolsAddendum?: string\r\n  mcpIntro?: string\r\n  skillsContext?: string\r\n  customInstructions?: string\r\n}): string {\r\n  const sections: string[] = []\r\n  if (parts.customInstructions) sections.push(parts.customInstructions)\r\n  if (parts.toolsAddendum) sections.push(parts.toolsAddendum)\r\n  if (parts.mcpIntro) sections.push(parts.mcpIntro)\r\n  if (parts.skillsContext) sections.push(`Skills:\\n${parts.skillsContext}`)\r\n  if (parts.memory) sections.push(`Context:\\n${parts.memory}`)\r\n  if (parts.environment) sections.push(parts.environment)\r\n  if (parts.gitStatus) sections.push(`Git status:\\n${parts.gitStatus}`)\r\n  return sections.join('\\n\\n')\r\n}\r\n\r\nfunction _blankUsage(): NormalizedUsage {\r\n  return {\r\n    input_tokens: 0,\r\n    output_tokens: 0,\r\n    cache_read_tokens: 0,\r\n    cache_write_tokens: 0,\r\n    thinking_tokens: 0,\r\n  }\r\n}\r\n\r\nfunction _isInvalidBearerResponse(status: number, errText: string): boolean {\r\n  if (status !== 401 && status !== 403) return false\r\n  const lowered = errText.toLowerCase()\r\n  return (\r\n    lowered.includes('bearer token')\r\n    || lowered.includes('invalid token')\r\n    || lowered.includes('token included in the request is invalid')\r\n    || lowered.includes('expired token')\r\n    || lowered.includes('unauthorized')\r\n  )\r\n}\r\n\r\nfunction* _emitErrorText(text: string): Generator<AnthropicStreamEvent> {\r\n  yield { type: 'content_block_start', index: 0, content_block: { type: 'text', text: '' } }\r\n  yield { type: 'content_block_delta', index: 0, delta: { type: 'text_delta', text } }\r\n  yield { type: 'content_block_stop', index: 0 }\r\n}\r\n\r\n/**\r\n * Persist the rejected Kiro request body to a tmp file for inspection.\r\n * Gated by CLAUDEX_KIRO_DEBUG_DUMP=1 so it never fires for normal users.\r\n * Returns the file path on success, null otherwise (env off, write failed).\r\n * Best-effort: never throws \u2014 diagnostic logging must not double-fault a\r\n * request that already failed.\r\n */\r\nfunction _dumpKiroRequestBody(body: unknown): string | null {\r\n  if (process.env.CLAUDEX_KIRO_DEBUG_DUMP !== '1') return null\r\n  try {\r\n    /* eslint-disable @typescript-eslint/no-require-imports */\r\n    const fs = require('node:fs') as typeof import('node:fs')\r\n    const path = require('node:path') as typeof import('node:path')\r\n    const os = require('node:os') as typeof import('node:os')\r\n    /* eslint-enable @typescript-eslint/no-require-imports */\r\n    const dir = path.join(os.tmpdir(), 'tau-kiro-debug')\r\n    fs.mkdirSync(dir, { recursive: true })\r\n    const fileName = `kiro-improperly-formed-${Date.now()}.json`\r\n    const filePath = path.join(dir, fileName)\r\n    fs.writeFileSync(filePath, JSON.stringify(body, null, 2), 'utf-8')\r\n    return filePath\r\n  } catch {\r\n    return null\r\n  }\r\n}\r\n\r\n// \u2500\u2500\u2500 Singleton \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport const kiroLane = new KiroLane()\r\n", "/**\r\n * Kiro Lane entry point.\r\n *\r\n * Wires the Kiro lane into the dispatcher. Auth source: the OAuth token\r\n * + meta blob written by `/login kiro` at\r\n * `~/.config/claude-code/provider-keys.json:kiro_oauth`. Builder-ID users\r\n * don't get a profileArn from the device-code exchange; the lane falls\r\n * back to a known-public default on first call (social-login users have\r\n * a real profileArn stored in meta).\r\n */\r\n\r\nexport { kiroLane, KiroLane } from './loop.js'\r\nexport { KIRO_MODELS, isKiroModel } from './catalog.js'\r\nexport { buildKiroPayload } from './request.js'\r\nexport { parseFrames } from './eventstream.js'\r\n\r\nimport { kiroLane } from './loop.js'\r\nimport { registerLane } from '../dispatcher.js'\r\nimport { loadProviderKey } from '../../services/api/auth/api_key_manager.js'\r\n\r\nexport interface KiroLaneOptions {\r\n  accessToken?: string\r\n  /** Optional \u2014 social-login users have one, Builder-ID users don't. */\r\n  profileArn?: string\r\n}\r\n\r\nexport function initKiroLane(opts?: KiroLaneOptions): void {\r\n  let accessToken = opts?.accessToken\r\n  let profileArn = opts?.profileArn ?? null\r\n\r\n  // Pull meta.profileArn from the stored token blob when available, so\r\n  // we don't fall back to the hardcoded default unnecessarily.\r\n  if (!profileArn) {\r\n    try {\r\n      const raw = loadProviderKey('kiro_oauth')\r\n      if (raw) {\r\n        const parsed = JSON.parse(raw) as {\r\n          accessToken?: string\r\n          meta?: { profileArn?: string }\r\n        }\r\n        if (!accessToken && parsed.accessToken) accessToken = parsed.accessToken\r\n        if (parsed.meta?.profileArn) profileArn = parsed.meta.profileArn\r\n      }\r\n    } catch {\r\n      // ignore \u2014 the lane will start unhealthy and /login kiro repairs it\r\n    }\r\n  }\r\n\r\n  kiroLane.configure({ accessToken, profileArn })\r\n  registerLane(kiroLane)\r\n}\r\n", "/**\r\n * Cursor InferenceService protobuf codec.\r\n *\r\n * Cursor's current chat lane uses `aiserver.v1.InferenceService/Stream`\r\n * over ConnectRPC framing, not the older unified-chat schema. This file\r\n * encodes the request fields we need for native Cursor chat and decodes the\r\n * streaming response parts Cursor emits back to the agent loop.\r\n */\r\n\r\nimport { gunzipSync, gzipSync, inflateSync, inflateRawSync } from 'zlib'\r\n\r\nconst WIRE = { VARINT: 0, FIXED64: 1, LEN: 2, FIXED32: 5 } as const\r\n\r\nconst INFERENCE_ROLE = {\r\n  UNSPECIFIED: 0,\r\n  USER: 1,\r\n  ASSISTANT: 2,\r\n  TOOL: 3,\r\n  SYSTEM: 4,\r\n} as const\r\n\r\nconst F = {\r\n  REQUEST_MESSAGES: 1,\r\n  REQUEST_TOOLS: 2,\r\n  REQUEST_PROVIDER_DEFINED_TOOLS: 3,\r\n  REQUEST_MODEL_CONFIG: 4,\r\n  REQUEST_MODEL_ID: 5,\r\n  REQUEST_INVOCATION_ID: 6,\r\n  REQUEST_REQUESTED_MODEL: 7,\r\n  REQUEST_CONVERSATION_ID: 8,\r\n\r\n  CORE_ROLE: 1,\r\n  CORE_TEXT: 2,\r\n  CORE_PARTS: 3,\r\n  CORE_TOOL_CALLS: 4,\r\n  CORE_TOOL_CONTENT: 6,\r\n\r\n  CONTENT_PARTS: 1,\r\n  CONTENT_PART_TEXT: 1,\r\n  CONTENT_PART_IMAGE: 2,\r\n  CONTENT_PART_FILE: 3,\r\n\r\n  TEXT_PART_TEXT: 1,\r\n\r\n  TOOL_CALL_ID: 1,\r\n  TOOL_CALL_NAME: 2,\r\n  TOOL_CALL_ARGS: 3,\r\n\r\n  AGENT_TOOL_NAME: 1,\r\n  AGENT_TOOL_DESCRIPTION: 2,\r\n  AGENT_TOOL_PARAMETERS: 3,\r\n  AGENT_TOOL_CUSTOM_FORMAT: 4,\r\n\r\n  CUSTOM_TOOL_FORMAT_TYPE: 1,\r\n  CUSTOM_TOOL_FORMAT_DEFINITION: 2,\r\n  CUSTOM_TOOL_FORMAT_SYNTAX: 3,\r\n\r\n  REQUESTED_MODEL_ID: 1,\r\n  REQUESTED_MODEL_MAX_MODE: 2,\r\n  REQUESTED_MODEL_PARAMETERS: 3,\r\n  REQUESTED_MODEL_BUILT_IN: 4,\r\n  REQUESTED_MODEL_VARIANT_REPR: 5,\r\n\r\n  MODEL_PARAMETER_ID: 1,\r\n  MODEL_PARAMETER_VALUE: 2,\r\n\r\n  TOOL_RESULT_CONTENT_PARTS: 1,\r\n  TOOL_RESULT_PART_ID: 1,\r\n  TOOL_RESULT_PART_NAME: 2,\r\n  TOOL_RESULT_PART_RESULT: 3,\r\n  TOOL_RESULT_PART_IS_ERROR: 4,\r\n\r\n  MODEL_CONFIG_MAX_TOKENS: 1,\r\n  MODEL_CONFIG_TEMPERATURE: 2,\r\n  MODEL_CONFIG_TOP_P: 3,\r\n  MODEL_CONFIG_STOP_SEQUENCES: 4,\r\n\r\n  RESPONSE_TEXT_PART: 1,\r\n  RESPONSE_TOOL_CALL_PART: 2,\r\n  RESPONSE_USAGE: 3,\r\n  RESPONSE_INFO: 4,\r\n  RESPONSE_EXTENDED_USAGE: 5,\r\n  RESPONSE_PROVIDER_METADATA: 6,\r\n  RESPONSE_INVOCATION_ID: 7,\r\n  RESPONSE_ERROR: 8,\r\n  RESPONSE_THINKING_PART: 9,\r\n\r\n  TEXT_STREAM_TEXT: 1,\r\n  TEXT_STREAM_IS_FINAL: 2,\r\n\r\n  THINKING_STREAM_TEXT: 1,\r\n  THINKING_STREAM_SIGNATURE: 2,\r\n  THINKING_STREAM_IS_FINAL: 3,\r\n\r\n  TOOL_CALL_STREAM_ID: 1,\r\n  TOOL_CALL_STREAM_NAME: 2,\r\n  TOOL_CALL_STREAM_ARGS: 3,\r\n  TOOL_CALL_STREAM_IS_COMPLETE: 4,\r\n  TOOL_CALL_STREAM_INDEX: 5,\r\n\r\n  USAGE_PROMPT_TOKENS: 1,\r\n  USAGE_COMPLETION_TOKENS: 2,\r\n  USAGE_TOTAL_TOKENS: 3,\r\n\r\n  EXTENDED_USAGE_INPUT_TOKENS: 1,\r\n  EXTENDED_USAGE_OUTPUT_TOKENS: 2,\r\n  EXTENDED_USAGE_CACHE_READ_TOKENS: 3,\r\n  EXTENDED_USAGE_CACHE_WRITE_TOKENS: 4,\r\n  EXTENDED_USAGE_MAX_TOKENS: 5,\r\n\r\n  RESPONSE_INFO_ID: 1,\r\n  RESPONSE_INFO_MODEL: 2,\r\n  RESPONSE_INFO_CREATED_AT: 3,\r\n  RESPONSE_INFO_MESSAGES: 4,\r\n  RESPONSE_INFO_ERROR_MESSAGE: 5,\r\n  RESPONSE_INFO_EXTRA_DATA: 6,\r\n\r\n  INVOCATION_INFO_ID: 1,\r\n\r\n  ERROR_MESSAGE: 1,\r\n  ERROR_CODE: 2,\r\n  ERROR_IS_INPUT_TOKEN_LIMIT: 3,\r\n  ERROR_IS_OUTPUT_TOKEN_LIMIT: 4,\r\n  ERROR_TYPE: 5,\r\n\r\n  PROVIDER_METADATA_METADATA: 1,\r\n\r\n  PROVIDER_OPTIONS_ANTHROPIC: 1,\r\n  ANTHROPIC_OPTIONS_CACHE_CONTROL: 1,\r\n  CACHE_CONTROL_TYPE: 1,\r\n\r\n  JSON_STRUCT_FIELDS: 1,\r\n  JSON_STRUCT_ENTRY_KEY: 1,\r\n  JSON_STRUCT_ENTRY_VALUE: 2,\r\n  JSON_VALUE_NULL: 1,\r\n  JSON_VALUE_NUMBER: 2,\r\n  JSON_VALUE_STRING: 3,\r\n  JSON_VALUE_BOOL: 4,\r\n  JSON_VALUE_STRUCT: 5,\r\n  JSON_VALUE_LIST: 6,\r\n  JSON_LIST_VALUES: 1,\r\n} as const\r\n\r\nconst _encoder = new TextEncoder()\r\nconst _decoder = new TextDecoder()\r\n\r\nfunction concat(...parts: Uint8Array[]): Uint8Array {\r\n  let total = 0\r\n  for (const part of parts) total += part.length\r\n  const out = new Uint8Array(total)\r\n  let offset = 0\r\n  for (const part of parts) {\r\n    out.set(part, offset)\r\n    offset += part.length\r\n  }\r\n  return out\r\n}\r\n\r\nfunction encodeTag(fieldNum: number, wireType: number): Uint8Array {\r\n  return encodeVarint((fieldNum << 3) | wireType)\r\n}\r\n\r\nfunction encodeFixed64Double(value: number): Uint8Array {\r\n  const out = new Uint8Array(8)\r\n  const view = new DataView(out.buffer)\r\n  view.setFloat64(0, value, true)\r\n  return out\r\n}\r\n\r\nfunction encodeFieldVarint(fieldNum: number, value: number): Uint8Array {\r\n  return concat(encodeTag(fieldNum, WIRE.VARINT), encodeVarint(value))\r\n}\r\n\r\nfunction encodeFieldLen(fieldNum: number, value: string | Uint8Array): Uint8Array {\r\n  const data = typeof value === 'string' ? _encoder.encode(value) : value\r\n  return concat(encodeTag(fieldNum, WIRE.LEN), encodeVarint(data.length), data)\r\n}\r\n\r\nfunction encodeFieldFixed64(fieldNum: number, value: number): Uint8Array {\r\n  return concat(encodeTag(fieldNum, WIRE.FIXED64), encodeFixed64Double(value))\r\n}\r\n\r\nfunction encodeJsonStruct(\r\n  input: Record<string, unknown> | null | undefined,\r\n): Uint8Array {\r\n  if (!input || typeof input !== 'object' || Array.isArray(input)) {\r\n    return new Uint8Array(0)\r\n  }\r\n\r\n  const fields: Uint8Array[] = []\r\n  for (const [key, value] of Object.entries(input)) {\r\n    const entry = concat(\r\n      encodeFieldLen(F.JSON_STRUCT_ENTRY_KEY, key),\r\n      encodeFieldLen(F.JSON_STRUCT_ENTRY_VALUE, encodeJsonValue(value)),\r\n    )\r\n    fields.push(encodeFieldLen(F.JSON_STRUCT_FIELDS, entry))\r\n  }\r\n  return concat(...fields)\r\n}\r\n\r\nfunction encodeJsonList(values: unknown[]): Uint8Array {\r\n  return concat(...values.map(value => encodeFieldLen(F.JSON_LIST_VALUES, encodeJsonValue(value))))\r\n}\r\n\r\nfunction encodeJsonValue(value: unknown): Uint8Array {\r\n  if (value == null) {\r\n    return encodeFieldVarint(F.JSON_VALUE_NULL, 0)\r\n  }\r\n  if (typeof value === 'string') {\r\n    return encodeFieldLen(F.JSON_VALUE_STRING, value)\r\n  }\r\n  if (typeof value === 'boolean') {\r\n    return encodeFieldVarint(F.JSON_VALUE_BOOL, value ? 1 : 0)\r\n  }\r\n  if (typeof value === 'number') {\r\n    return encodeFieldFixed64(F.JSON_VALUE_NUMBER, value)\r\n  }\r\n  if (Array.isArray(value)) {\r\n    return encodeFieldLen(F.JSON_VALUE_LIST, encodeJsonList(value))\r\n  }\r\n  if (typeof value === 'object') {\r\n    return encodeFieldLen(F.JSON_VALUE_STRUCT, encodeJsonStruct(value as Record<string, unknown>))\r\n  }\r\n  return encodeFieldLen(F.JSON_VALUE_STRING, String(value))\r\n}\r\n\r\nfunction encodeProviderOptions(\r\n  input: CursorProviderOptions | undefined,\r\n): Uint8Array {\r\n  const cacheType = input?.anthropic?.cacheControl?.type\r\n  if (!cacheType) return new Uint8Array(0)\r\n\r\n  const cacheControl = encodeFieldLen(\r\n    F.ANTHROPIC_OPTIONS_CACHE_CONTROL,\r\n    encodeFieldLen(F.CACHE_CONTROL_TYPE, cacheType),\r\n  )\r\n  const anthropic = encodeFieldLen(F.PROVIDER_OPTIONS_ANTHROPIC, cacheControl)\r\n  return anthropic\r\n}\r\n\r\nexport function encodeVarint(value: number): Uint8Array {\r\n  const out: number[] = []\r\n  let current = value >>> 0\r\n  while (current >= 0x80) {\r\n    out.push((current & 0x7f) | 0x80)\r\n    current >>>= 7\r\n  }\r\n  out.push(current)\r\n  return new Uint8Array(out)\r\n}\r\n\r\nexport function decodeVarint(\r\n  buf: Uint8Array,\r\n  offset: number,\r\n): { value: number; next: number } {\r\n  let result = 0\r\n  let shift = 0\r\n  let pos = offset\r\n  while (pos < buf.length) {\r\n    const byte = buf[pos]!\r\n    result |= (byte & 0x7f) << shift\r\n    pos += 1\r\n    if ((byte & 0x80) === 0) break\r\n    shift += 7\r\n  }\r\n  return { value: result, next: pos }\r\n}\r\n\r\ninterface DecodedField {\r\n  fieldNum: number\r\n  wireType: number\r\n  value: Uint8Array | number | null\r\n  next: number\r\n}\r\n\r\nfunction decodeField(buf: Uint8Array, offset: number): DecodedField | null {\r\n  if (offset >= buf.length) return null\r\n  const { value: tag, next: afterTag } = decodeVarint(buf, offset)\r\n  const fieldNum = tag >>> 3\r\n  const wireType = tag & 0x07\r\n\r\n  if (wireType === WIRE.VARINT) {\r\n    const { value, next } = decodeVarint(buf, afterTag)\r\n    return { fieldNum, wireType, value, next }\r\n  }\r\n  if (wireType === WIRE.LEN) {\r\n    const { value: len, next: afterLen } = decodeVarint(buf, afterTag)\r\n    const end = afterLen + len\r\n    return { fieldNum, wireType, value: buf.slice(afterLen, end), next: end }\r\n  }\r\n  if (wireType === WIRE.FIXED64) {\r\n    return {\r\n      fieldNum,\r\n      wireType,\r\n      value: buf.slice(afterTag, afterTag + 8),\r\n      next: afterTag + 8,\r\n    }\r\n  }\r\n  if (wireType === WIRE.FIXED32) {\r\n    return {\r\n      fieldNum,\r\n      wireType,\r\n      value: buf.slice(afterTag, afterTag + 4),\r\n      next: afterTag + 4,\r\n    }\r\n  }\r\n  return null\r\n}\r\n\r\nexport function decodeMessage(\r\n  buf: Uint8Array,\r\n): Map<number, Array<{ wireType: number; value: Uint8Array | number | null }>> {\r\n  const fields = new Map<number, Array<{ wireType: number; value: Uint8Array | number | null }>>()\r\n  let pos = 0\r\n  while (pos < buf.length) {\r\n    const field = decodeField(buf, pos)\r\n    if (!field) break\r\n    if (!fields.has(field.fieldNum)) fields.set(field.fieldNum, [])\r\n    fields.get(field.fieldNum)!.push({ wireType: field.wireType, value: field.value })\r\n    pos = field.next\r\n  }\r\n  return fields\r\n}\r\n\r\nfunction fieldBytes(\r\n  fields: Map<number, Array<{ wireType: number; value: Uint8Array | number | null }>>,\r\n  fieldNum: number,\r\n): Uint8Array | null {\r\n  const value = fields.get(fieldNum)?.[0]?.value\r\n  return value instanceof Uint8Array ? value : null\r\n}\r\n\r\nfunction fieldString(\r\n  fields: Map<number, Array<{ wireType: number; value: Uint8Array | number | null }>>,\r\n  fieldNum: number,\r\n): string | undefined {\r\n  const value = fieldBytes(fields, fieldNum)\r\n  return value ? _decoder.decode(value) : undefined\r\n}\r\n\r\nfunction fieldNumber(\r\n  fields: Map<number, Array<{ wireType: number; value: Uint8Array | number | null }>>,\r\n  fieldNum: number,\r\n): number | undefined {\r\n  const value = fields.get(fieldNum)?.[0]?.value\r\n  return typeof value === 'number' ? value : undefined\r\n}\r\n\r\nfunction fieldBool(\r\n  fields: Map<number, Array<{ wireType: number; value: Uint8Array | number | null }>>,\r\n  fieldNum: number,\r\n): boolean | undefined {\r\n  const value = fieldNumber(fields, fieldNum)\r\n  return value == null ? undefined : value !== 0\r\n}\r\n\r\nfunction decodeFixed64Double(bytes: Uint8Array | null): number | undefined {\r\n  if (!bytes || bytes.length !== 8) return undefined\r\n  const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength)\r\n  return view.getFloat64(0, true)\r\n}\r\n\r\nfunction fieldDouble(\r\n  fields: Map<number, Array<{ wireType: number; value: Uint8Array | number | null }>>,\r\n  fieldNum: number,\r\n): number | undefined {\r\n  return decodeFixed64Double(fieldBytes(fields, fieldNum))\r\n}\r\n\r\nexport interface EncodeToolResultInput {\r\n  tool_call_id: string\r\n  tool_name: string\r\n  result_content: string\r\n  raw_args?: string\r\n  tool_index?: number\r\n}\r\n\r\nexport interface CursorProviderOptions {\r\n  anthropic?: {\r\n    cacheControl?: {\r\n      type: string\r\n    }\r\n  }\r\n}\r\n\r\nexport type CursorContentPart =\r\n  | {\r\n      type: 'text'\r\n      text: string\r\n      providerOptions?: CursorProviderOptions\r\n    }\r\n  | {\r\n      type: 'tool-call'\r\n      toolCallId: string\r\n      toolName: string\r\n      args: Record<string, unknown>\r\n    }\r\n  | {\r\n      type: 'tool-result'\r\n      toolCallId: string\r\n      toolName: string\r\n      result: unknown\r\n      isError?: boolean\r\n    }\r\n\r\nexport interface NormalizedCursorMessage {\r\n  role: 'user' | 'assistant' | 'tool' | 'system'\r\n  content: string | CursorContentPart[]\r\n}\r\n\r\nexport interface EncodeMcpToolInput {\r\n  name: string\r\n  description?: string\r\n  parameters?: Record<string, unknown>\r\n  customToolFormat?: {\r\n    type: string\r\n    definition: string\r\n    syntax: string\r\n  }\r\n}\r\n\r\nfunction encodeTextContentPart(part: Extract<CursorContentPart, { type: 'text' }>): Uint8Array {\r\n  const providerOptions = encodeProviderOptions(part.providerOptions)\r\n  const textPart = concat(\r\n    encodeFieldLen(F.TEXT_PART_TEXT, part.text),\r\n    ...(providerOptions.length > 0 ? [encodeFieldLen(2, providerOptions)] : []),\r\n  )\r\n  return encodeFieldLen(F.CONTENT_PART_TEXT, textPart)\r\n}\r\n\r\nfunction encodeContentParts(parts: CursorContentPart[]): Uint8Array {\r\n  const out: Uint8Array[] = []\r\n  for (const part of parts) {\r\n    if (part.type === 'text') {\r\n      out.push(encodeFieldLen(F.CONTENT_PARTS, encodeTextContentPart(part)))\r\n    }\r\n  }\r\n  return concat(...out)\r\n}\r\n\r\nfunction encodeToolCall(part: Extract<CursorContentPart, { type: 'tool-call' }>): Uint8Array {\r\n  return concat(\r\n    encodeFieldLen(F.TOOL_CALL_ID, part.toolCallId),\r\n    encodeFieldLen(F.TOOL_CALL_NAME, part.toolName),\r\n    encodeFieldLen(F.TOOL_CALL_ARGS, encodeJsonStruct(part.args)),\r\n  )\r\n}\r\n\r\nfunction encodeToolResultPart(\r\n  part: Extract<CursorContentPart, { type: 'tool-result' }>,\r\n): Uint8Array {\r\n  return concat(\r\n    encodeFieldLen(F.TOOL_RESULT_PART_ID, part.toolCallId),\r\n    encodeFieldLen(F.TOOL_RESULT_PART_NAME, part.toolName),\r\n    encodeFieldLen(F.TOOL_RESULT_PART_RESULT, encodeJsonValue(part.result)),\r\n    ...(part.isError ? [encodeFieldVarint(F.TOOL_RESULT_PART_IS_ERROR, 1)] : []),\r\n  )\r\n}\r\n\r\nfunction encodeToolResultContent(\r\n  parts: Array<Extract<CursorContentPart, { type: 'tool-result' }>>,\r\n): Uint8Array {\r\n  return concat(\r\n    ...parts.map(part => encodeFieldLen(F.TOOL_RESULT_CONTENT_PARTS, encodeToolResultPart(part))),\r\n  )\r\n}\r\n\r\nfunction encodeCoreMessage(message: NormalizedCursorMessage): Uint8Array {\r\n  const role = message.role === 'user'\r\n    ? INFERENCE_ROLE.USER\r\n    : message.role === 'assistant'\r\n      ? INFERENCE_ROLE.ASSISTANT\r\n      : message.role === 'tool'\r\n        ? INFERENCE_ROLE.TOOL\r\n        : INFERENCE_ROLE.SYSTEM\r\n\r\n  const out: Uint8Array[] = [encodeFieldVarint(F.CORE_ROLE, role)]\r\n\r\n  if (typeof message.content === 'string') {\r\n    out.push(encodeFieldLen(F.CORE_TEXT, message.content))\r\n    return concat(...out)\r\n  }\r\n\r\n  if (message.role === 'tool') {\r\n    const toolResults = message.content.filter(\r\n      (part): part is Extract<CursorContentPart, { type: 'tool-result' }> =>\r\n        part.type === 'tool-result',\r\n    )\r\n    if (toolResults.length > 0) {\r\n      out.push(encodeFieldLen(F.CORE_TOOL_CONTENT, encodeToolResultContent(toolResults)))\r\n    }\r\n    return concat(...out)\r\n  }\r\n\r\n  if (message.role === 'assistant') {\r\n    const text = message.content\r\n      .filter((part): part is Extract<CursorContentPart, { type: 'text' }> => part.type === 'text')\r\n      .map(part => part.text)\r\n      .join('')\r\n    if (text) {\r\n      out.push(encodeFieldLen(F.CORE_TEXT, text))\r\n    }\r\n    const toolCalls = message.content.filter(\r\n      (part): part is Extract<CursorContentPart, { type: 'tool-call' }> =>\r\n        part.type === 'tool-call',\r\n    )\r\n    out.push(...toolCalls.map(part => encodeFieldLen(F.CORE_TOOL_CALLS, encodeToolCall(part))))\r\n    return concat(...out)\r\n  }\r\n\r\n  const encodedParts = encodeContentParts(message.content)\r\n  if (encodedParts.length > 0) {\r\n    out.push(encodeFieldLen(F.CORE_PARTS, encodedParts))\r\n  }\r\n  return concat(...out)\r\n}\r\n\r\nfunction encodeCustomToolFormat(\r\n  tool: EncodeMcpToolInput,\r\n): Uint8Array {\r\n  if (!tool.customToolFormat) return new Uint8Array(0)\r\n  return concat(\r\n    encodeFieldLen(F.CUSTOM_TOOL_FORMAT_TYPE, tool.customToolFormat.type),\r\n    encodeFieldLen(F.CUSTOM_TOOL_FORMAT_DEFINITION, tool.customToolFormat.definition),\r\n    encodeFieldLen(F.CUSTOM_TOOL_FORMAT_SYNTAX, tool.customToolFormat.syntax),\r\n  )\r\n}\r\n\r\nfunction encodeTool(tool: EncodeMcpToolInput): Uint8Array {\r\n  const parameters = encodeJsonStruct(tool.parameters ?? {})\r\n  const customToolFormat = encodeCustomToolFormat(tool)\r\n  return concat(\r\n    encodeFieldLen(F.AGENT_TOOL_NAME, tool.name),\r\n    encodeFieldLen(F.AGENT_TOOL_DESCRIPTION, tool.description ?? ''),\r\n    encodeFieldLen(F.AGENT_TOOL_PARAMETERS, parameters),\r\n    ...(customToolFormat.length > 0\r\n      ? [encodeFieldLen(F.AGENT_TOOL_CUSTOM_FORMAT, customToolFormat)]\r\n      : []),\r\n  )\r\n}\r\n\r\nfunction encodeRequestedModel(\r\n  modelName: string,\r\n  options?: {\r\n    maxMode?: boolean\r\n    builtInModel?: boolean\r\n    isVariantStringRepresentation?: boolean\r\n    parameters?: Array<{ id: string; value: string }>\r\n  },\r\n): Uint8Array {\r\n  return concat(\r\n    encodeFieldLen(F.REQUESTED_MODEL_ID, modelName),\r\n    ...(options?.maxMode ? [encodeFieldVarint(F.REQUESTED_MODEL_MAX_MODE, 1)] : []),\r\n    ...(options?.parameters ?? []).map(parameter =>\r\n      encodeFieldLen(\r\n        F.REQUESTED_MODEL_PARAMETERS,\r\n        concat(\r\n          encodeFieldLen(F.MODEL_PARAMETER_ID, parameter.id),\r\n          encodeFieldLen(F.MODEL_PARAMETER_VALUE, parameter.value),\r\n        ),\r\n      ),\r\n    ),\r\n    ...((options?.builtInModel ?? true) ? [encodeFieldVarint(F.REQUESTED_MODEL_BUILT_IN, 1)] : []),\r\n    ...(options?.isVariantStringRepresentation\r\n      ? [encodeFieldVarint(F.REQUESTED_MODEL_VARIANT_REPR, 1)]\r\n      : []),\r\n  )\r\n}\r\n\r\nfunction encodeModelConfig(config: {\r\n  maxTokens?: number\r\n  temperature?: number\r\n  topP?: number\r\n  stopSequences?: string[]\r\n}): Uint8Array {\r\n  return concat(\r\n    ...(config.maxTokens != null ? [encodeFieldVarint(F.MODEL_CONFIG_MAX_TOKENS, config.maxTokens)] : []),\r\n    ...(config.temperature != null ? [encodeFieldFixed64(F.MODEL_CONFIG_TEMPERATURE, config.temperature)] : []),\r\n    ...(config.topP != null ? [encodeFieldFixed64(F.MODEL_CONFIG_TOP_P, config.topP)] : []),\r\n    ...(config.stopSequences ?? []).map(stop => encodeFieldLen(F.MODEL_CONFIG_STOP_SEQUENCES, stop)),\r\n  )\r\n}\r\n\r\nexport function encodeRequest(\r\n  messages: NormalizedCursorMessage[],\r\n  modelName: string,\r\n  tools: EncodeMcpToolInput[],\r\n  _supportedToolEnums: number[],\r\n  _reasoningEffort: 'medium' | 'high' | null,\r\n  opts?: {\r\n    conversationId?: string | null\r\n    invocationId?: string | null\r\n    modelConfig?: {\r\n      maxTokens?: number\r\n      temperature?: number\r\n      topP?: number\r\n      stopSequences?: string[]\r\n    }\r\n  },\r\n): Uint8Array {\r\n  const conversationId =\r\n    typeof opts?.conversationId === 'string' && opts.conversationId.trim()\r\n      ? opts.conversationId.trim()\r\n      : _randomUUID()\r\n  const invocationId =\r\n    typeof opts?.invocationId === 'string' && opts.invocationId.trim()\r\n      ? opts.invocationId.trim()\r\n      : _randomUUID()\r\n\r\n  const requestFields: Uint8Array[] = [\r\n    ...messages.map(message => encodeFieldLen(F.REQUEST_MESSAGES, encodeCoreMessage(message))),\r\n    ...tools.map(tool => encodeFieldLen(F.REQUEST_TOOLS, encodeTool(tool))),\r\n    encodeFieldLen(F.REQUEST_MODEL_ID, modelName),\r\n    encodeFieldLen(F.REQUEST_REQUESTED_MODEL, encodeRequestedModel(modelName)),\r\n    encodeFieldLen(F.REQUEST_INVOCATION_ID, invocationId),\r\n    encodeFieldLen(F.REQUEST_CONVERSATION_ID, conversationId),\r\n  ]\r\n\r\n  if (opts?.modelConfig) {\r\n    const encodedModelConfig = encodeModelConfig(opts.modelConfig)\r\n    if (encodedModelConfig.length > 0) {\r\n      requestFields.splice(\r\n        requestFields.length - 2,\r\n        0,\r\n        encodeFieldLen(F.REQUEST_MODEL_CONFIG, encodedModelConfig),\r\n      )\r\n    }\r\n  }\r\n\r\n  return concat(...requestFields)\r\n}\r\n\r\nexport function wrapConnectFrame(payload: Uint8Array, compress = false): Uint8Array {\r\n  let body = payload\r\n  let flags = 0\r\n  if (compress) {\r\n    body = new Uint8Array(gzipSync(Buffer.from(payload)))\r\n    flags = 1\r\n  }\r\n  const frame = new Uint8Array(5 + body.length)\r\n  frame[0] = flags\r\n  frame[1] = (body.length >>> 24) & 0xff\r\n  frame[2] = (body.length >>> 16) & 0xff\r\n  frame[3] = (body.length >>> 8) & 0xff\r\n  frame[4] = body.length & 0xff\r\n  frame.set(body, 5)\r\n  return frame\r\n}\r\n\r\nexport function generateCursorBody(\r\n  messages: NormalizedCursorMessage[],\r\n  modelName: string,\r\n  tools: EncodeMcpToolInput[],\r\n  supportedToolEnums: number[],\r\n  reasoningEffort: 'medium' | 'high' | null,\r\n  opts?: {\r\n    conversationId?: string | null\r\n    invocationId?: string | null\r\n  },\r\n): Uint8Array {\r\n  const protobuf = encodeRequest(\r\n    messages,\r\n    modelName,\r\n    tools,\r\n    supportedToolEnums,\r\n    reasoningEffort,\r\n    opts,\r\n  )\r\n  return wrapConnectFrame(protobuf, false)\r\n}\r\n\r\nexport function parseConnectFrame(\r\n  buf: Uint8Array,\r\n): { payload: Uint8Array<ArrayBufferLike>; consumed: number } | null {\r\n  if (buf.length < 5) return null\r\n  const flags = buf[0]!\r\n  const length = ((buf[1]! << 24) | (buf[2]! << 16) | (buf[3]! << 8) | buf[4]!) >>> 0\r\n  const total = 5 + length\r\n  if (buf.length < total) return null\r\n\r\n  let payload: Uint8Array<ArrayBufferLike> = buf.slice(5, total)\r\n\r\n  if (payload.length > 0 && payload[0] === 0x7b) {\r\n    return { payload, consumed: total }\r\n  }\r\n  if (flags & 0x01) {\r\n    payload = _decompressWithFallback(payload)\r\n  }\r\n  return { payload, consumed: total }\r\n}\r\n\r\nfunction _decompressWithFallback(payload: Uint8Array): Uint8Array<ArrayBufferLike> {\r\n  try {\r\n    return new Uint8Array(gunzipSync(Buffer.from(payload)))\r\n  } catch {\r\n    try {\r\n      return new Uint8Array(inflateSync(Buffer.from(payload)))\r\n    } catch {\r\n      try {\r\n        return new Uint8Array(inflateRawSync(Buffer.from(payload)))\r\n      } catch {\r\n        return payload\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\nexport interface CursorToolCall {\r\n  id: string\r\n  name: string\r\n  argumentsDelta: string\r\n  isLast: boolean\r\n}\r\n\r\nexport interface CursorExtracted {\r\n  text: string | null\r\n  thinking: string | null\r\n  toolCall: CursorToolCall | null\r\n  error: string | null\r\n  decodeError: string | null\r\n  usage?: {\r\n    promptTokens?: number\r\n    completionTokens?: number\r\n    totalTokens?: number\r\n    inputTokens?: number\r\n    outputTokens?: number\r\n    cacheReadTokens?: number\r\n    cacheWriteTokens?: number\r\n  } | null\r\n}\r\n\r\nfunction extractCursorJsonErrorText(parsed: unknown): string | null {\r\n  if (parsed == null || typeof parsed !== 'object' || Array.isArray(parsed)) {\r\n    return typeof parsed === 'string' && parsed.trim() ? parsed.trim() : null\r\n  }\r\n\r\n  const record = parsed as Record<string, unknown>\r\n  const topLevelDetails =\r\n    record.details != null\r\n    && typeof record.details === 'object'\r\n    && !Array.isArray(record.details)\r\n      ? record.details as Record<string, unknown>\r\n      : null\r\n  const topLevelTitle =\r\n    topLevelDetails && typeof topLevelDetails.title === 'string'\r\n      ? topLevelDetails.title.trim()\r\n      : ''\r\n  const topLevelDetail =\r\n    topLevelDetails && typeof topLevelDetails.detail === 'string'\r\n      ? topLevelDetails.detail.trim()\r\n      : ''\r\n  if (topLevelTitle || topLevelDetail) {\r\n    return [topLevelTitle, topLevelDetail].filter(Boolean).join('\\n')\r\n  }\r\n\r\n  const errorValue = record.error\r\n  const nestedError =\r\n    errorValue != null\r\n    && typeof errorValue === 'object'\r\n    && !Array.isArray(errorValue)\r\n      ? errorValue as Record<string, unknown>\r\n      : null\r\n  const detailFromDebug =\r\n    nestedError && Array.isArray(nestedError.details)\r\n      ? nestedError.details\r\n          .map(detail => {\r\n            if (!detail || typeof detail !== 'object') return ''\r\n            const debug = 'debug' in detail ? detail.debug : null\r\n            if (!debug || typeof debug !== 'object') return ''\r\n            const debugRecord = debug as Record<string, unknown>\r\n            const debugDetails =\r\n              debugRecord.details != null\r\n              && typeof debugRecord.details === 'object'\r\n              && !Array.isArray(debugRecord.details)\r\n                ? debugRecord.details as Record<string, unknown>\r\n                : null\r\n            const title =\r\n              debugDetails && typeof debugDetails.title === 'string'\r\n                ? debugDetails.title.trim()\r\n                : ''\r\n            const body =\r\n              debugDetails && typeof debugDetails.detail === 'string'\r\n                ? debugDetails.detail.trim()\r\n                : ''\r\n            if (title || body) return [title, body].filter(Boolean).join('\\n')\r\n            return typeof debugRecord.error === 'string' ? debugRecord.error.trim() : ''\r\n          })\r\n          .find(Boolean) ?? null\r\n      : null\r\n  if (detailFromDebug) return detailFromDebug\r\n\r\n  const nestedMessage =\r\n    nestedError && typeof nestedError.message === 'string'\r\n      ? nestedError.message.trim()\r\n      : ''\r\n  if (nestedMessage) return nestedMessage\r\n\r\n  const topLevelMessage =\r\n    typeof record.message === 'string'\r\n      ? record.message.trim()\r\n      : ''\r\n  if (topLevelMessage) return topLevelMessage\r\n\r\n  const stringError =\r\n    typeof errorValue === 'string'\r\n      ? errorValue.trim()\r\n      : ''\r\n  return stringError || null\r\n}\r\n\r\nfunction decodeJsonValue(\r\n  bytes: Uint8Array | null,\r\n): unknown {\r\n  if (!bytes) return null\r\n  const fields = decodeMessage(bytes)\r\n  if (fieldNumber(fields, F.JSON_VALUE_NULL) != null) return null\r\n  const stringValue = fieldString(fields, F.JSON_VALUE_STRING)\r\n  if (stringValue != null) return stringValue\r\n  const numberValue = fieldDouble(fields, F.JSON_VALUE_NUMBER)\r\n  if (numberValue != null) return numberValue\r\n  const boolValue = fieldBool(fields, F.JSON_VALUE_BOOL)\r\n  if (boolValue != null) return boolValue\r\n\r\n  const structBytes = fieldBytes(fields, F.JSON_VALUE_STRUCT)\r\n  if (structBytes) {\r\n    const structFields = decodeMessage(structBytes)\r\n    const entries = structFields.get(F.JSON_STRUCT_FIELDS) ?? []\r\n    const out: Record<string, unknown> = {}\r\n    for (const entry of entries) {\r\n      if (!(entry.value instanceof Uint8Array)) continue\r\n      const decoded = decodeMessage(entry.value)\r\n      const key = fieldString(decoded, F.JSON_STRUCT_ENTRY_KEY)\r\n      if (!key) continue\r\n      out[key] = decodeJsonValue(fieldBytes(decoded, F.JSON_STRUCT_ENTRY_VALUE))\r\n    }\r\n    return out\r\n  }\r\n\r\n  const listBytes = fieldBytes(fields, F.JSON_VALUE_LIST)\r\n  if (listBytes) {\r\n    const listFields = decodeMessage(listBytes)\r\n    return (listFields.get(F.JSON_LIST_VALUES) ?? [])\r\n      .map(value => value.value instanceof Uint8Array ? decodeJsonValue(value.value) : null)\r\n  }\r\n\r\n  return null\r\n}\r\n\r\nfunction decodeJsonStructBytes(\r\n  bytes: Uint8Array | null,\r\n): Record<string, unknown> | null {\r\n  if (!bytes) return null\r\n  const fields = decodeMessage(bytes)\r\n  const entries = fields.get(F.JSON_STRUCT_FIELDS)\r\n  if (!entries) return null\r\n\r\n  const out: Record<string, unknown> = {}\r\n  for (const entry of entries) {\r\n    if (!(entry.value instanceof Uint8Array)) continue\r\n    const decoded = decodeMessage(entry.value)\r\n    const key = fieldString(decoded, F.JSON_STRUCT_ENTRY_KEY)\r\n    if (!key) continue\r\n    out[key] = decodeJsonValue(fieldBytes(decoded, F.JSON_STRUCT_ENTRY_VALUE))\r\n  }\r\n\r\n  return out\r\n}\r\n\r\nfunction extractToolCallArgs(\r\n  fields: Map<number, Array<{ wireType: number; value: Uint8Array | number | null }>>,\r\n  isComplete: boolean,\r\n): string {\r\n  const argsBytes = fieldBytes(fields, F.TOOL_CALL_STREAM_ARGS)\r\n  if (!argsBytes) return ''\r\n\r\n  const rawText = _decoder.decode(argsBytes)\r\n  const trimmedText = rawText.trim()\r\n  if (\r\n    trimmedText\r\n    && (\r\n      trimmedText.startsWith('{')\r\n      || trimmedText.startsWith('[')\r\n      || trimmedText.startsWith('\"')\r\n    )\r\n  ) {\r\n    return trimmedText\r\n  }\r\n\r\n  // Cursor sometimes streams structured protobuf args as full snapshots on\r\n  // multiple frames. Emit the structured payload on every frame \u2014 the loop\r\n  // overwrites the entire rawArgs accumulator with each snapshot so\r\n  // duplicates are harmless. Previously gated on `isComplete`, which caused\r\n  // args to be silently dropped when the flag was never set.\r\n  const structuredArgs = decodeJsonStructBytes(argsBytes)\r\n  if (structuredArgs != null) {\r\n    return JSON.stringify(structuredArgs)\r\n  }\r\n\r\n  const jsonValue = decodeJsonValue(argsBytes)\r\n  if (jsonValue != null) {\r\n    return typeof jsonValue === 'string'\r\n      ? jsonValue\r\n      : JSON.stringify(jsonValue)\r\n  }\r\n\r\n  // Fallback: try JSON.parse on the raw decoded text. Some models encode\r\n  // args as raw UTF-8 JSON that doesn't start with '{' due to leading\r\n  // whitespace or BOM bytes that were already trimmed above.\r\n  if (trimmedText) {\r\n    try {\r\n      JSON.parse(trimmedText)\r\n      return trimmedText\r\n    } catch {\r\n      // Not valid JSON \u2014 fall through.\r\n    }\r\n  }\r\n\r\n  return /[\\u0000-\\u001f]/.test(rawText) ? '' : trimmedText\r\n}\r\n\r\nfunction extractToolCall(data: Uint8Array): CursorToolCall | null {\r\n  const fields = decodeMessage(data)\r\n  const id = fieldString(fields, F.TOOL_CALL_STREAM_ID)\r\n  const name = fieldString(fields, F.TOOL_CALL_STREAM_NAME)\r\n  const isComplete = fieldBool(fields, F.TOOL_CALL_STREAM_IS_COMPLETE) ?? false\r\n  const args = extractToolCallArgs(fields, isComplete)\r\n\r\n  if (!id || (!name && !args)) return null\r\n  return {\r\n    id,\r\n    name: name ?? '',\r\n    argumentsDelta: args,\r\n    isLast: isComplete,\r\n  }\r\n}\r\n\r\nfunction extractUsage(data: Uint8Array): CursorExtracted['usage'] {\r\n  const fields = decodeMessage(data)\r\n  return {\r\n    promptTokens: fieldNumber(fields, F.USAGE_PROMPT_TOKENS),\r\n    completionTokens: fieldNumber(fields, F.USAGE_COMPLETION_TOKENS),\r\n    totalTokens: fieldNumber(fields, F.USAGE_TOTAL_TOKENS),\r\n  }\r\n}\r\n\r\nfunction extractExtendedUsage(data: Uint8Array): CursorExtracted['usage'] {\r\n  const fields = decodeMessage(data)\r\n  return {\r\n    inputTokens: fieldNumber(fields, F.EXTENDED_USAGE_INPUT_TOKENS),\r\n    outputTokens: fieldNumber(fields, F.EXTENDED_USAGE_OUTPUT_TOKENS),\r\n    cacheReadTokens: fieldNumber(fields, F.EXTENDED_USAGE_CACHE_READ_TOKENS),\r\n    cacheWriteTokens: fieldNumber(fields, F.EXTENDED_USAGE_CACHE_WRITE_TOKENS),\r\n  }\r\n}\r\n\r\nfunction extractResponseInfoError(data: Uint8Array): string | null {\r\n  const fields = decodeMessage(data)\r\n  return fieldString(fields, F.RESPONSE_INFO_ERROR_MESSAGE) ?? null\r\n}\r\n\r\nexport function extractFromResponsePayload(payload: Uint8Array): CursorExtracted {\r\n  if (payload.length === 0) {\r\n    return { text: null, thinking: null, toolCall: null, error: null, decodeError: null }\r\n  }\r\n\r\n  if (payload[0] === 0x7b) {\r\n    try {\r\n      const text = _decoder.decode(payload)\r\n      const parsed = JSON.parse(text) as unknown\r\n\r\n      return {\r\n        text: null,\r\n        thinking: null,\r\n        toolCall: null,\r\n        error: extractCursorJsonErrorText(parsed),\r\n        decodeError: null,\r\n      }\r\n    } catch (error) {\r\n      return {\r\n        text: null,\r\n        thinking: null,\r\n        toolCall: null,\r\n        error: null,\r\n        decodeError: error instanceof Error ? error.message : String(error),\r\n      }\r\n    }\r\n  }\r\n\r\n  try {\r\n    const fields = decodeMessage(payload)\r\n\r\n    const errorBytes = fieldBytes(fields, F.RESPONSE_ERROR)\r\n    if (errorBytes) {\r\n      const nested = decodeMessage(errorBytes)\r\n      return {\r\n        text: null,\r\n        thinking: null,\r\n        toolCall: null,\r\n        error: fieldString(nested, F.ERROR_MESSAGE) ?? fieldString(nested, F.ERROR_CODE) ?? 'API error',\r\n        decodeError: null,\r\n      }\r\n    }\r\n\r\n    const toolCallBytes = fieldBytes(fields, F.RESPONSE_TOOL_CALL_PART)\r\n    if (toolCallBytes) {\r\n      const toolCall = extractToolCall(toolCallBytes)\r\n      return { text: null, thinking: null, toolCall, error: null, decodeError: null }\r\n    }\r\n\r\n    const textBytes = fieldBytes(fields, F.RESPONSE_TEXT_PART)\r\n    if (textBytes) {\r\n      const nested = decodeMessage(textBytes)\r\n      return {\r\n        text: fieldString(nested, F.TEXT_STREAM_TEXT) ?? null,\r\n        thinking: null,\r\n        toolCall: null,\r\n        error: null,\r\n        decodeError: null,\r\n      }\r\n    }\r\n\r\n    const thinkingBytes = fieldBytes(fields, F.RESPONSE_THINKING_PART)\r\n    if (thinkingBytes) {\r\n      const nested = decodeMessage(thinkingBytes)\r\n      return {\r\n        text: null,\r\n        thinking: fieldString(nested, F.THINKING_STREAM_TEXT) ?? null,\r\n        toolCall: null,\r\n        error: null,\r\n        decodeError: null,\r\n      }\r\n    }\r\n\r\n    const usageBytes = fieldBytes(fields, F.RESPONSE_USAGE)\r\n    if (usageBytes) {\r\n      return {\r\n        text: null,\r\n        thinking: null,\r\n        toolCall: null,\r\n        error: null,\r\n        decodeError: null,\r\n        usage: extractUsage(usageBytes),\r\n      }\r\n    }\r\n\r\n    const extendedUsageBytes = fieldBytes(fields, F.RESPONSE_EXTENDED_USAGE)\r\n    if (extendedUsageBytes) {\r\n      return {\r\n        text: null,\r\n        thinking: null,\r\n        toolCall: null,\r\n        error: null,\r\n        decodeError: null,\r\n        usage: extractExtendedUsage(extendedUsageBytes),\r\n      }\r\n    }\r\n\r\n    const responseInfoBytes = fieldBytes(fields, F.RESPONSE_INFO)\r\n    if (responseInfoBytes) {\r\n      const error = extractResponseInfoError(responseInfoBytes)\r\n      return {\r\n        text: null,\r\n        thinking: null,\r\n        toolCall: null,\r\n        error,\r\n        decodeError: null,\r\n      }\r\n    }\r\n\r\n    return { text: null, thinking: null, toolCall: null, error: null, decodeError: null }\r\n  } catch (error) {\r\n    return {\r\n      text: null,\r\n      thinking: null,\r\n      toolCall: null,\r\n      error: null,\r\n      decodeError: error instanceof Error ? error.message : String(error),\r\n    }\r\n  }\r\n}\r\n\r\nexport function formatCursorToolName(name: string): string {\r\n  const base = name || 'tool'\r\n  if (base.startsWith('mcp__')) {\r\n    const rest = base.slice(5)\r\n    const idx = rest.indexOf('__')\r\n    if (idx >= 0) {\r\n      const server = rest.slice(0, idx) || 'custom'\r\n      const tool = rest.slice(idx + 2) || 'tool'\r\n      return `mcp_${server}_${tool}`\r\n    }\r\n    return `mcp_custom_${rest || 'tool'}`\r\n  }\r\n  if (base.startsWith('mcp_')) return base\r\n  return `mcp_custom_${base}`\r\n}\r\n\r\nexport function unformatCursorToolName(formatted: string): string {\r\n  if (formatted.startsWith('mcp_custom_')) {\r\n    return formatted.slice('mcp_custom_'.length)\r\n  }\r\n  if (formatted.startsWith('mcp_')) {\r\n    const tail = formatted.slice(4)\r\n    const idx = tail.indexOf('_')\r\n    return idx >= 0 ? tail.slice(idx + 1) : tail\r\n  }\r\n  return formatted\r\n}\r\n\r\nfunction _randomUUID(): string {\r\n  if (typeof globalThis.crypto?.randomUUID === 'function') {\r\n    return globalThis.crypto.randomUUID()\r\n  }\r\n  const bytes = new Uint8Array(16)\r\n  for (let i = 0; i < 16; i++) bytes[i] = Math.floor(Math.random() * 256)\r\n  bytes[6] = (bytes[6]! & 0x0f) | 0x40\r\n  bytes[8] = (bytes[8]! & 0x3f) | 0x80\r\n  const hex = [...bytes].map(b => b.toString(16).padStart(2, '0')).join('')\r\n  return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`\r\n}\r\n", "import type { ProviderTool } from '../../services/api/providers/base_provider.js'\nimport type { LaneToolRegistration } from '../types.js'\nimport { windowsPathToPosixPath } from '../../utils/windowsPaths.js'\nimport { GEMINI_TOOL_REGISTRY } from '../gemini/tools.js'\nimport { WEB_SEARCH_NATIVE_DESCRIPTION } from '../../tools/WebSearchTool/prompt.js'\n\r\nexport const CURSOR_CLIENT_SIDE_TOOL_V2 = {\r\n  READ_SEMSEARCH_FILES: 1,\r\n  RIPGREP_SEARCH: 3,\r\n  READ_FILE: 5,\r\n  LIST_DIR: 6,\r\n  EDIT_FILE: 7,\r\n  FILE_SEARCH: 8,\r\n  SEMANTIC_SEARCH_FULL: 9,\r\n  DELETE_FILE: 11,\r\n  REAPPLY: 12,\r\n  RUN_TERMINAL_COMMAND_V2: 15,\r\n  FETCH_RULES: 16,\r\n  WEB_SEARCH: 18,\r\n  MCP: 19,\r\n  SEARCH_SYMBOLS: 23,\r\n  BACKGROUND_COMPOSER_FOLLOWUP: 24,\r\n  KNOWLEDGE_BASE: 25,\r\n  FETCH_PULL_REQUEST: 26,\r\n  DEEP_SEARCH: 27,\r\n  CREATE_DIAGRAM: 28,\r\n  FIX_LINTS: 29,\r\n  READ_LINTS: 30,\r\n  GO_TO_DEFINITION: 31,\r\n  TASK: 32,\r\n  AWAIT_TASK: 33,\r\n  TODO_READ: 34,\r\n  TODO_WRITE: 35,\r\n  EDIT_FILE_V2: 38,\r\n  LIST_DIR_V2: 39,\r\n  READ_FILE_V2: 40,\r\n  RIPGREP_RAW_SEARCH: 41,\r\n  GLOB_FILE_SEARCH: 42,\r\n  CREATE_PLAN: 43,\r\n  LIST_MCP_RESOURCES: 44,\r\n  READ_MCP_RESOURCE: 45,\r\n  READ_PROJECT: 46,\r\n  UPDATE_PROJECT: 47,\r\n  TASK_V2: 48,\r\n  CALL_MCP_TOOL: 49,\r\n  APPLY_AGENT_DIFF: 50,\r\n  ASK_QUESTION: 51,\r\n  SWITCH_MODE: 52,\r\n  GENERATE_IMAGE: 53,\r\n  COMPUTER_USE: 54,\r\n  WRITE_SHELL_STDIN: 55,\r\n} as const\r\n\r\nconst CURSOR_NATIVE_TOOL_NAMES = new Set([\r\n  'read_file',\r\n  'write_file',\r\n  'replace',\r\n  'run_shell_command',\r\n  'glob',\r\n  'grep_search',\r\n  'google_web_search',\r\n  'web_fetch',\r\n  'ask_user',\r\n  'enter_plan_mode',\r\n  'exit_plan_mode',\r\n  'list_directory',\r\n])\r\n\r\nconst CT = CURSOR_CLIENT_SIDE_TOOL_V2\r\n\r\nconst _stringifyToolOutput = (output: string | unknown): string =>\n  typeof output === 'string' ? output : JSON.stringify(output)\n\ntype JsonSchema = Record<string, unknown>\n\nexport interface CursorToolResolutionOptions {\n  toolSchemas?: ReadonlyMap<string, JsonSchema>\n}\n\ntype AskUserOption = {\n  label: string\n  description: string\n}\n\nfunction _asRecord(value: unknown): Record<string, unknown> | null {\n  return value && typeof value === 'object' && !Array.isArray(value)\n    ? value as Record<string, unknown>\n    : null\n}\n\nfunction _nonEmptyString(value: unknown): string | null {\n  return typeof value === 'string' && value.trim().length > 0\n    ? value.trim()\n    : null\n}\n\nfunction _firstDefined(\n  native: Record<string, unknown>,\n  keys: readonly string[],\n): unknown {\n  for (const key of keys) {\n    if (native[key] != null) return native[key]\n  }\n  return undefined\n}\n\nfunction _firstString(\n  native: Record<string, unknown>,\n  keys: readonly string[],\n): string | undefined {\n  for (const key of keys) {\n    const value = _nonEmptyString(native[key])\n    if (value) return value\n  }\n  return undefined\n}\n\nfunction _askUserHeader(value: unknown, question: string, index: number): string {\n  const explicit = _nonEmptyString(value)\n  if (explicit) return explicit.slice(0, 12)\n  const fromQuestion = question\n    .replace(/[^\\w\\s]/g, ' ')\n    .trim()\n    .split(/\\s+/)\n    .slice(0, 2)\n    .join(' ')\n  return (fromQuestion || `Q${index + 1}`).slice(0, 12)\n}\n\nfunction _askUserOptions(rawOptions: unknown, type: unknown): AskUserOption[] {\n  const options: AskUserOption[] = []\n  if (Array.isArray(rawOptions)) {\n    for (let i = 0; i < rawOptions.length; i++) {\n      const raw = rawOptions[i]\n      if (typeof raw === 'string') {\n        const label = raw.trim()\n        if (label) options.push({ label, description: `Select ${label}.` })\n        continue\n      }\n\n      const record = _asRecord(raw)\n      if (!record) continue\n      const label =\n        _nonEmptyString(record.label) ??\n        _nonEmptyString(record.text) ??\n        _nonEmptyString(record.value) ??\n        `Option ${i + 1}`\n      const description =\n        _nonEmptyString(record.description) ??\n        _nonEmptyString(record.desc) ??\n        `Select ${label}.`\n      options.push({ label, description })\n    }\n  }\n\n  const deduped: AskUserOption[] = []\n  const seen = new Set<string>()\n  for (const option of options) {\n    const key = option.label.toLowerCase()\n    if (seen.has(key)) continue\n    seen.add(key)\n    deduped.push(option)\n    if (deduped.length >= 4) break\n  }\n\n  const fallback = String(type ?? '').toLowerCase() === 'yesno'\n    ? [\n        { label: 'Yes', description: 'Confirm this option.' },\n        { label: 'No', description: 'Decline this option.' },\n      ]\n    : [\n        { label: 'Answer', description: 'Provide a custom answer.' },\n        { label: 'Skip', description: 'Do not answer this now.' },\n      ]\n\n  for (const option of fallback) {\n    if (deduped.length >= 2) break\n    if (!seen.has(option.label.toLowerCase())) {\n      deduped.push(option)\n      seen.add(option.label.toLowerCase())\n    }\n  }\n\n  return deduped.slice(0, 4)\n}\n\nfunction _normalizeAskUserInput(\n  native: Record<string, unknown>,\n): Record<string, unknown> {\n  const rawQuestions = Array.isArray(native.questions) && native.questions.length > 0\n    ? native.questions\n    : [native]\n\n  const questions = rawQuestions.map((raw, index) => {\n    const record = _asRecord(raw) ?? {}\n    const question =\n      _nonEmptyString(record.question) ??\n      _nonEmptyString(record.prompt) ??\n      _nonEmptyString(native.question) ??\n      _nonEmptyString(native.prompt) ??\n      'Please choose an option.'\n    const type = record.type ?? native.type\n    return {\n      question,\n      header: _askUserHeader(record.header ?? native.header, question, index),\n      options: _askUserOptions(record.options ?? native.options, type),\n      multiSelect: Boolean(\n        record.multiSelect ??\n        record.multi_select ??\n        native.multiSelect ??\n        native.multi_select,\n      ),\n    }\n  })\n\n  return { questions }\n}\n\nfunction _schemaProperties(schema: JsonSchema | undefined): Record<string, JsonSchema> {\n  const properties = _asRecord(schema?.properties)\n  if (!properties) return {}\n  const out: Record<string, JsonSchema> = {}\n  for (const [key, value] of Object.entries(properties)) {\n    const property = _asRecord(value)\n    if (property) out[key] = property\n  }\n  return out\n}\n\nfunction _schemaRequired(schema: JsonSchema | undefined): string[] {\n  return Array.isArray(schema?.required)\n    ? schema.required.filter((value): value is string => typeof value === 'string')\n    : []\n}\n\nfunction _schemaTypeIncludes(property: JsonSchema | undefined, type: string): boolean {\n  const raw = property?.type\n  if (raw === type) return true\n  if (Array.isArray(raw)) return raw.includes(type)\n  return false\n}\n\nfunction _schemaRequiredStringKeys(schema: JsonSchema | undefined): string[] {\n  const properties = _schemaProperties(schema)\n  return _schemaRequired(schema).filter(key => {\n    const property = properties[key]\n    return !property || _schemaTypeIncludes(property, 'string')\n  })\n}\n\nfunction _camelToSnake(value: string): string {\n  return value.replace(/([a-z0-9])([A-Z])/g, '$1_$2').toLowerCase()\n}\n\nfunction _fieldAliases(key: string): string[] {\n  const snake = _camelToSnake(key)\n  const kebab = snake.replace(/_/g, '-')\n  const lower = key.toLowerCase()\n  const aliases = [\n    key,\n    snake,\n    kebab,\n    lower,\n    'query',\n    'q',\n    'search',\n    'searchQuery',\n    'search_query',\n    'term',\n    'text',\n    'value',\n    'input',\n  ]\n  if (lower.includes('name')) aliases.push('name')\n  if (lower.includes('id')) aliases.push('id')\n  if (lower.includes('library')) aliases.push('library', 'library_name')\n  if (lower.includes('path')) aliases.push('path', 'file_path')\n  return [...new Set(aliases)]\n}\n\nfunction _structuralFieldAliases(key: string): string[] {\n  const snake = _camelToSnake(key)\n  const kebab = snake.replace(/_/g, '-')\n  const lower = key.toLowerCase()\n  const aliases = [key, snake, kebab, lower]\n  if (lower.includes('name')) aliases.push('name')\n  if (lower.includes('id')) aliases.push('id')\n  if (lower.includes('path')) aliases.push('path', 'file_path')\n  return [...new Set(aliases)]\n}\n\nfunction _schemaHasProperty(schema: JsonSchema | undefined, key: string): boolean {\n  return Object.prototype.hasOwnProperty.call(_schemaProperties(schema), key)\n}\n\nfunction _schemaAllowsAdditionalProperties(schema: JsonSchema | undefined): boolean {\n  return schema?.additionalProperties !== false\n}\n\nfunction _singleStringCandidate(\n  input: Record<string, unknown>,\n  schema: JsonSchema | undefined,\n): { key: string; value: string } | null {\n  const candidates: Array<{ key: string; value: string }> = []\n  for (const [key, value] of Object.entries(input)) {\n    const text = _nonEmptyString(value)\n    if (!text) continue\n    if (schema && _schemaHasProperty(schema, key)) continue\n    candidates.push({ key, value: text })\n  }\n  return candidates.length === 1 ? candidates[0]! : null\n}\n\nfunction _schemaForTool(\n  toolName: string,\n  options?: CursorToolResolutionOptions,\n): JsonSchema | undefined {\n  return options?.toolSchemas?.get(toolName)\n}\n\nfunction _normalizeMcpNamePart(value: string): string {\n  return value.toLowerCase().replace(/[-_\\s]+/g, '')\n}\n\nfunction _mcpNameParts(name: string): { server: string; toolName: string } | null {\n  if (!name.startsWith('mcp__')) return null\n  const rest = name.slice('mcp__'.length)\n  const idx = rest.indexOf('__')\n  if (idx < 0) return null\n  return {\n    server: rest.slice(0, idx),\n    toolName: rest.slice(idx + 2),\n  }\n}\n\nfunction _resolveMcpImplId(\n  server: string,\n  toolName: string,\n  options?: CursorToolResolutionOptions,\n): string {\n  const exact = `mcp__${server}__${toolName}`\n  if (options?.toolSchemas?.has(exact)) return exact\n\n  const normalizedServer = _normalizeMcpNamePart(server)\n  const normalizedToolName = _normalizeMcpNamePart(toolName)\n  for (const candidate of options?.toolSchemas?.keys() ?? []) {\n    const parts = _mcpNameParts(candidate)\n    if (!parts) continue\n    if (\n      _normalizeMcpNamePart(parts.server) === normalizedServer &&\n      _normalizeMcpNamePart(parts.toolName) === normalizedToolName\n    ) {\n      return candidate\n    }\n  }\n\n  return exact\n}\n\nfunction _unwrapCursorToolInput(\n  nativeInput: Record<string, unknown>,\n  schema?: JsonSchema,\n): Record<string, unknown> {\n  for (const key of ['tool_args', 'arguments', 'args', 'input', 'parameters']) {\n    if (_schemaHasProperty(schema, key)) continue\n    const nested = _asRecord(nativeInput[key])\n    if (nested) return nested\n  }\n  return nativeInput\n}\n\nfunction _schemaArrayItem(schema: JsonSchema | undefined): JsonSchema | undefined {\n  return _asRecord(schema?.items) ?? undefined\n}\n\nfunction _coerceStringValue(value: unknown): unknown {\n  if (typeof value === 'string') return value\n  if (typeof value === 'number' || typeof value === 'boolean') return String(value)\n  return value\n}\n\nfunction _coerceArrayItemValue(value: unknown, itemSchema: JsonSchema | undefined): unknown {\n  if (_schemaTypeIncludes(itemSchema, 'string')) return _coerceStringValue(value)\n  if (_schemaTypeIncludes(itemSchema, 'number') || _schemaTypeIncludes(itemSchema, 'integer')) {\n    return _coerceNumberValue(value)\n  }\n  if (_schemaTypeIncludes(itemSchema, 'boolean')) return _coerceBooleanValue(value)\n  if (_schemaTypeIncludes(itemSchema, 'object')) return _coerceObjectValue(value)\n  return value\n}\n\nfunction _coerceArrayValue(value: unknown, property: JsonSchema | undefined): unknown[] {\n  const itemSchema = _schemaArrayItem(property)\n  if (Array.isArray(value)) {\n    return value.map(item => _coerceArrayItemValue(item, itemSchema))\n  }\n  if (typeof value === 'string') {\n    const trimmed = value.trim()\n    if (!trimmed) return []\n    if (trimmed.startsWith('[')) {\n      try {\n        const parsed = JSON.parse(trimmed) as unknown\n        if (Array.isArray(parsed)) {\n          return parsed.map(item => _coerceArrayItemValue(item, itemSchema))\n        }\n      } catch {\n        // Fall through to delimiter handling.\n      }\n    }\n    const parts = trimmed\n      .split(/[,\\n]/)\n      .map(part => part.trim())\n      .filter(Boolean)\n    const raw = parts.length > 1 ? parts : [trimmed]\n    return raw.map(item => _coerceArrayItemValue(item, itemSchema))\n  }\n  return value == null ? [] : [_coerceArrayItemValue(value, itemSchema)]\n}\n\nfunction _coerceObjectValue(value: unknown): unknown {\n  if (_asRecord(value)) return value\n  if (typeof value !== 'string') return value\n  const trimmed = value.trim()\n  if (!trimmed.startsWith('{')) return value\n  try {\n    const parsed = JSON.parse(trimmed) as unknown\n    return _asRecord(parsed) ?? value\n  } catch {\n    return value\n  }\n}\n\nfunction _coerceBooleanValue(value: unknown): unknown {\n  if (typeof value !== 'string') return value\n  const lower = value.trim().toLowerCase()\n  if (lower === 'true') return true\n  if (lower === 'false') return false\n  return value\n}\n\nfunction _coerceNumberValue(value: unknown): unknown {\n  if (typeof value !== 'string') return value\n  const trimmed = value.trim()\n  if (!trimmed) return value\n  const parsed = Number(trimmed)\n  return Number.isFinite(parsed) ? parsed : value\n}\n\nfunction _coerceSchemaPropertyValue(\n  value: unknown,\n  property: JsonSchema | undefined,\n): unknown {\n  if (_schemaTypeIncludes(property, 'array')) return _coerceArrayValue(value, property)\n  if (_schemaTypeIncludes(property, 'object')) return _coerceObjectValue(value)\n  if (_schemaTypeIncludes(property, 'boolean')) return _coerceBooleanValue(value)\n  if (_schemaTypeIncludes(property, 'number') || _schemaTypeIncludes(property, 'integer')) {\n    return _coerceNumberValue(value)\n  }\n  if (_schemaTypeIncludes(property, 'string')) return _coerceStringValue(value)\n  return value\n}\n\nexport function normalizeCursorSchemaToolInput(\n  nativeInput: Record<string, unknown>,\n  schema?: JsonSchema,\n): Record<string, unknown> {\n  const input: Record<string, unknown> = { ..._unwrapCursorToolInput(nativeInput, schema) }\n  const properties = _schemaProperties(schema)\n  const requiredStringKeys = _schemaRequiredStringKeys(schema)\n\n  for (const key of Object.keys(properties)) {\n    if (input[key] != null) continue\n    for (const alias of _structuralFieldAliases(key)) {\n      if (alias === key || input[alias] == null) continue\n      input[key] = input[alias]\n      if (!_schemaHasProperty(schema, alias)) delete input[alias]\n      break\n    }\n  }\n\n  for (const key of requiredStringKeys) {\n    if (input[key] != null) continue\n\n    let mappedFrom: string | null = null\n    for (const alias of _fieldAliases(key)) {\n      if (alias === key) continue\n      const value = _nonEmptyString(input[alias])\n      if (!value) continue\n      input[key] = value\n      mappedFrom = alias\n      break\n    }\n\n    if (!mappedFrom) {\n      const single = _singleStringCandidate(input, schema)\n      if (single) {\n        input[key] = single.value\n        mappedFrom = single.key\n      }\n    }\n\n    if (\n      mappedFrom &&\n      mappedFrom !== key &&\n      !_schemaHasProperty(schema, mappedFrom)\n    ) {\n      delete input[mappedFrom]\n    }\n  }\n\n  for (const [key, property] of Object.entries(properties)) {\n    if (input[key] == null) continue\n    input[key] = _coerceSchemaPropertyValue(input[key], property)\n  }\n\n  if (!_schemaAllowsAdditionalProperties(schema)) {\n    for (const key of Object.keys(input)) {\n      if (!_schemaHasProperty(schema, key)) delete input[key]\n    }\n  }\n\n  return input\n}\n\nconst CURSOR_EXTRA_TOOL_REGISTRY: LaneToolRegistration[] = [\r\n  {\r\n    nativeName: 'run_terminal_cmd',\r\n    implId: 'Bash',\r\n    nativeDescription:\r\n      'Execute a shell command in the workspace. Use this for running commands, tests, git, and development workflows.',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        command: { type: 'string', description: 'Shell command to execute.' },\r\n        cwd: { type: 'string', description: 'Optional working directory override.' },\r\n        description: { type: 'string', description: 'Brief description for the command.' },\r\n        is_background: { type: 'boolean', description: 'Whether the command should keep running in the background.' },\r\n      },\r\n      required: ['command'],\r\n    },\r\n    adaptInput(native) {\r\n      const command = native.command\r\n      const cwd = native.cwd\r\n      const input: Record<string, unknown> = { command }\r\n      if (native.description) input.description = native.description\r\n      if (native.is_background) input.run_in_background = native.is_background\r\n      if (cwd) input.command = `cd ${JSON.stringify(cwd)} && ${command}`\r\n      return input\r\n    },\r\n    adaptOutput: _stringifyToolOutput,\r\n  },\r\n  {\r\n    nativeName: 'glob_file_search',\r\n    implId: 'Glob',\r\n    nativeDescription: 'Find files matching a glob pattern.',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        pattern: { type: 'string', description: 'Glob pattern to match.' },\r\n        path: { type: 'string', description: 'Optional path to search within.' },\r\n      },\r\n      required: ['pattern'],\r\n    },\r\n    adaptInput(native) {\r\n      const pattern =\r\n        native.pattern ??\r\n        native.glob_pattern ??\r\n        native.query\r\n      const path =\r\n        native.path ??\r\n        native.target_directory ??\r\n        native.dir_path\r\n      const input: Record<string, unknown> = { pattern }\r\n      if (path) input.path = path\r\n      return input\r\n    },\r\n    adaptOutput: _stringifyToolOutput,\r\n  },\r\n  {\n    nativeName: 'web_search',\n    implId: 'WebSearch',\n    nativeDescription: WEB_SEARCH_NATIVE_DESCRIPTION,\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        query: { type: 'string', description: 'Search query.' },\r\n      },\r\n      required: ['query'],\r\n    },\r\n    adaptInput(native) {\r\n      return { query: native.query ?? native.search_term }\r\n    },\r\n    adaptOutput: _stringifyToolOutput,\r\n  },\r\n  {\r\n    nativeName: 'ask_question',\r\n    implId: 'AskUserQuestion',\r\n    nativeDescription: 'Ask the user a structured clarification question.',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        questions: {\r\n          type: 'array',\r\n          description: 'Structured questions to present to the user.',\r\n        },\r\n      },\r\n      required: ['questions'],\r\n    },\r\n    adaptInput(native) {\r\n      return {\r\n        question: native.question ?? native.prompt,\r\n        questions: native.questions,\r\n      }\r\n    },\r\n    adaptOutput: _stringifyToolOutput,\r\n  },\r\n  {\r\n    nativeName: 'create_plan',\r\n    implId: 'EnterPlanMode',\r\n    nativeDescription: 'Enter planning mode before implementation.',\r\n    nativeSchema: { type: 'object', properties: {} },\r\n    adaptInput(native) {\r\n      return native\r\n    },\r\n    adaptOutput: _stringifyToolOutput,\r\n  },\r\n  {\r\n    nativeName: 'list_mcp_resources',\r\n    implId: 'ListMcpResourcesTool',\r\n    nativeDescription: 'List MCP resources from configured servers.',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        server: { type: 'string', description: 'Optional MCP server name.' },\r\n      },\r\n    },\r\n    adaptInput(native) {\r\n      const input: Record<string, unknown> = { ...native }\r\n      if (input.path == null && native.target_directory != null) {\r\n        input.path = native.target_directory\r\n      }\r\n      if (input.pattern == null && native.query != null) {\r\n        input.pattern = native.query\r\n      }\r\n      if (input.glob == null && native.glob_pattern != null) {\r\n        input.glob = native.glob_pattern\r\n      }\r\n      return input\r\n    },\r\n    adaptOutput: _stringifyToolOutput,\r\n  },\r\n  {\r\n    nativeName: 'read_mcp_resource',\r\n    implId: 'ReadMcpResourceTool',\r\n    nativeDescription: 'Read a specific MCP resource by URI.',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        server: { type: 'string', description: 'MCP server name.' },\r\n        uri: { type: 'string', description: 'Resource URI.' },\r\n      },\r\n      required: ['server', 'uri'],\r\n    },\r\n    adaptInput(native) {\r\n      return native\r\n    },\r\n    adaptOutput: _stringifyToolOutput,\r\n  },\r\n  {\r\n    nativeName: 'task',\r\n    implId: 'Agent',\r\n    nativeDescription: 'Spawn a delegated subagent for a bounded task.',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        description: { type: 'string' },\r\n        prompt: { type: 'string' },\r\n      },\r\n      required: ['description', 'prompt'],\r\n    },\r\n    adaptInput(native) {\r\n      return native\r\n    },\r\n    adaptOutput: _stringifyToolOutput,\r\n  },\r\n]\r\n\r\nconst CURSOR_COMPAT_ALIAS_REGISTRY: LaneToolRegistration[] = [\r\n  {\r\n    nativeName: 'Shell',\r\n    implId: 'Bash',\r\n    nativeDescription: 'Execute a shell command in the workspace.',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        command: { type: 'string', description: 'Shell command to execute.' },\r\n        cwd: { type: 'string', description: 'Optional working directory override.' },\r\n        description: { type: 'string', description: 'Brief description for the command.' },\r\n      },\r\n      required: ['command'],\r\n    },\r\n    adaptInput(native) {\r\n      const command = native.command\r\n      const cwd = native.cwd ?? native.dir_path\r\n      const input: Record<string, unknown> = { command }\r\n      if (native.description) input.description = native.description\r\n      if (cwd) input.command = `cd ${JSON.stringify(cwd)} && ${command}`\r\n      return input\r\n    },\r\n    adaptOutput: _stringifyToolOutput,\r\n  },\r\n  {\r\n    nativeName: 'list_dir',\r\n    implId: 'Bash',\r\n    nativeDescription: 'List directory contents.',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        dir_path: { type: 'string', description: 'Optional directory path to list.' },\r\n      },\r\n    },\r\n    adaptInput(native) {\r\n      const dirPath = typeof native.dir_path === 'string' ? native.dir_path : undefined\r\n      return {\r\n        command: _cursorListDirCommand(dirPath),\r\n        description: dirPath ? `List directory contents for ${dirPath}` : 'List directory contents',\r\n      }\r\n    },\r\n    adaptOutput: _stringifyToolOutput,\r\n  },\r\n  {\r\n    nativeName: 'list_dir_v2',\r\n    implId: 'Bash',\r\n    nativeDescription: 'List directory contents.',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        dir_path: { type: 'string', description: 'Optional directory path to list.' },\r\n      },\r\n    },\r\n    adaptInput(native) {\r\n      const dirPath = typeof native.dir_path === 'string' ? native.dir_path : undefined\r\n      return {\r\n        command: _cursorListDirCommand(dirPath),\r\n        description: dirPath ? `List directory contents for ${dirPath}` : 'List directory contents',\r\n      }\r\n    },\r\n    adaptOutput: _stringifyToolOutput,\r\n  },\r\n  {\r\n    nativeName: 'grep',\r\n    implId: 'Grep',\r\n    nativeDescription: 'Search file contents with a regular expression.',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        pattern: { type: 'string' },\r\n        path: { type: 'string' },\r\n      },\r\n      required: ['pattern'],\r\n    },\r\n    adaptInput(native) {\r\n      return native\r\n    },\r\n    adaptOutput: _stringifyToolOutput,\r\n  },\r\n  {\r\n    nativeName: 'search_replace',\r\n    implId: 'Edit',\r\n    nativeDescription: 'Edit a file by replacing exact text.',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        file_path: { type: 'string' },\r\n        old_string: { type: 'string' },\r\n        new_string: { type: 'string' },\r\n      },\r\n      required: ['file_path', 'old_string', 'new_string'],\r\n    },\r\n    adaptInput(native) {\r\n      return {\r\n        file_path: native.file_path,\r\n        old_string: native.old_string,\r\n        new_string: native.new_string,\r\n        replace_all: native.replace_all ?? native.allow_multiple ?? false,\r\n      }\r\n    },\r\n    adaptOutput: _stringifyToolOutput,\r\n  },\r\n  {\r\n    nativeName: 'write',\r\n    implId: 'Write',\r\n    nativeDescription: 'Write a file in one shot.',\r\n    nativeSchema: {\r\n      type: 'object',\r\n      properties: {\r\n        file_path: { type: 'string' },\r\n        content: { type: 'string' },\r\n      },\r\n      required: ['file_path', 'content'],\r\n    },\r\n    adaptInput(native) {\r\n      return {\r\n        file_path: native.file_path,\r\n        content: native.content,\r\n      }\r\n    },\r\n    adaptOutput: _stringifyToolOutput,\r\n  },\r\n]\r\n\r\nexport const CURSOR_TOOL_REGISTRY: LaneToolRegistration[] = [\r\n  ...CURSOR_EXTRA_TOOL_REGISTRY,\r\n  ...GEMINI_TOOL_REGISTRY.filter(reg => CURSOR_NATIVE_TOOL_NAMES.has(reg.nativeName)),\r\n  ...CURSOR_COMPAT_ALIAS_REGISTRY,\r\n]\r\n\r\nconst CURSOR_PRESERVE_SHARED_SCHEMA_IMPL_IDS = new Set([\r\n  'Agent',\r\n  'AskUserQuestion',\r\n  'EnterPlanMode',\r\n  'ExitPlanMode',\r\n  'ListMcpResourcesTool',\r\n  'ReadMcpResourceTool',\r\n])\r\n\r\nconst CURSOR_MCP_TOOL_ENUMS = [\r\n  CT.MCP,\r\n  CT.CALL_MCP_TOOL,\r\n] as const\r\n\r\nconst CURSOR_TOOL_ENUMS_BY_NAME: Record<string, readonly number[]> = {\r\n  Read: [CT.READ_FILE, CT.READ_FILE_V2],\r\n  read_file: [CT.READ_FILE, CT.READ_FILE_V2],\r\n  FileReadTool: [CT.READ_FILE, CT.READ_FILE_V2],\r\n\r\n  Glob: [CT.GLOB_FILE_SEARCH, CT.FILE_SEARCH],\r\n  glob: [CT.GLOB_FILE_SEARCH, CT.FILE_SEARCH],\r\n  file_search: [CT.FILE_SEARCH],\r\n  glob_file_search: [CT.GLOB_FILE_SEARCH],\r\n\r\n  Grep: [CT.RIPGREP_SEARCH, CT.RIPGREP_RAW_SEARCH],\r\n  grep: [CT.RIPGREP_SEARCH, CT.RIPGREP_RAW_SEARCH],\r\n  grep_search: [CT.RIPGREP_SEARCH, CT.RIPGREP_RAW_SEARCH],\r\n  ripgrep_search: [CT.RIPGREP_SEARCH],\r\n  ripgrep_raw_search: [CT.RIPGREP_RAW_SEARCH],\r\n\r\n  Bash: [CT.RUN_TERMINAL_COMMAND_V2],\r\n  Shell: [CT.RUN_TERMINAL_COMMAND_V2],\r\n  PowerShell: [CT.RUN_TERMINAL_COMMAND_V2],\r\n  list_dir: [CT.LIST_DIR, CT.LIST_DIR_V2],\r\n  list_dir_v2: [CT.LIST_DIR_V2],\r\n  run_shell_command: [CT.RUN_TERMINAL_COMMAND_V2],\r\n  run_terminal_cmd: [CT.RUN_TERMINAL_COMMAND_V2],\r\n  run_terminal_command_v2: [CT.RUN_TERMINAL_COMMAND_V2],\r\n\r\n  WebSearch: [CT.WEB_SEARCH],\r\n  google_web_search: [CT.WEB_SEARCH],\r\n  web_search: [CT.WEB_SEARCH],\r\n\r\n  Agent: [CT.TASK, CT.TASK_V2, CT.AWAIT_TASK],\r\n  task: [CT.TASK, CT.TASK_V2, CT.AWAIT_TASK],\r\n  task_v2: [CT.TASK_V2, CT.AWAIT_TASK],\r\n\r\n  AskUserQuestion: [CT.ASK_QUESTION],\r\n  ask_user: [CT.ASK_QUESTION],\r\n  ask_question: [CT.ASK_QUESTION],\r\n\r\n  EnterPlanMode: [CT.CREATE_PLAN, CT.SWITCH_MODE],\r\n  enter_plan_mode: [CT.CREATE_PLAN, CT.SWITCH_MODE],\r\n  create_plan: [CT.CREATE_PLAN, CT.SWITCH_MODE],\r\n  ExitPlanMode: [CT.CREATE_PLAN, CT.SWITCH_MODE],\r\n  exit_plan_mode: [CT.CREATE_PLAN, CT.SWITCH_MODE],\r\n\r\n  ListMcpResourcesTool: [CT.LIST_MCP_RESOURCES],\r\n  list_mcp_resources: [CT.LIST_MCP_RESOURCES],\r\n  ReadMcpResourceTool: [CT.READ_MCP_RESOURCE],\r\n  read_mcp_resource: [CT.READ_MCP_RESOURCE],\r\n  LSP: [CT.SEARCH_SYMBOLS, CT.GO_TO_DEFINITION],\r\n  TodoWrite: [CT.TODO_READ, CT.TODO_WRITE],\r\n}\r\n\r\nconst CURSOR_TOOL_ALIAS_BY_NAME: Record<string, string> = {\r\n  Read: 'read_file',\r\n  Write: 'write',\r\n  Edit: 'search_replace',\r\n  Bash: 'run_terminal_cmd',\r\n  Shell: 'run_terminal_cmd',\r\n  Glob: 'glob_file_search',\r\n  Grep: 'grep',\r\n  WebSearch: 'web_search',\r\n  Agent: 'task',\r\n  AskUserQuestion: 'ask_question',\r\n  EnterPlanMode: 'create_plan',\r\n  ExitPlanMode: 'create_plan',\r\n  ListMcpResourcesTool: 'list_mcp_resources',\r\n  ReadMcpResourceTool: 'read_mcp_resource',\r\n  read_file_v2: 'read_file',\r\n  list_dir: 'list_directory',\r\n  list_dir_v2: 'list_directory',\r\n  file_search: 'glob',\r\n  glob_file_search: 'glob',\r\n  ripgrep_search: 'grep_search',\r\n  ripgrep_raw_search: 'grep_search',\r\n  task: 'Agent',\r\n  task_v2: 'Agent',\r\n  run_terminal_cmd: 'run_shell_command',\r\n  run_terminal_command_v2: 'run_shell_command',\r\n  web_search: 'google_web_search',\r\n  ask_question: 'ask_user',\r\n  create_plan: 'enter_plan_mode',\r\n  switch_mode: 'enter_plan_mode',\r\n}\r\n\r\nconst _byNativeName = new Map<string, LaneToolRegistration>()\r\nconst _byImplId = new Map<string, LaneToolRegistration>()\r\n\r\nfunction _ensureIndexed(): void {\r\n  if (_byNativeName.size > 0) return\r\n  for (const reg of CURSOR_TOOL_REGISTRY) {\r\n    _byNativeName.set(reg.nativeName, reg)\r\n    if (!_byImplId.has(reg.implId)) {\r\n      _byImplId.set(reg.implId, reg)\r\n    }\r\n  }\r\n}\r\n\r\nexport function getCursorRegistrationByNativeName(\r\n  name: string,\r\n): LaneToolRegistration | undefined {\r\n  _ensureIndexed()\r\n  return _byNativeName.get(name)\r\n}\r\n\r\nexport function getCursorRegistrationByImplId(\r\n  implId: string,\r\n): LaneToolRegistration | undefined {\r\n  _ensureIndexed()\r\n  return _byImplId.get(implId)\r\n}\r\n\r\nexport function buildCursorToolDefinitions(tools: ProviderTool[]): ProviderTool[] {\r\n  const out: ProviderTool[] = []\r\n  const seen = new Set<string>()\r\n\r\n  for (const tool of tools) {\r\n    const reg =\r\n      getCursorRegistrationByImplId(tool.name) ??\r\n      getCursorRegistrationByNativeName(tool.name)\r\n\r\n    if (reg) {\r\n      if (seen.has(reg.nativeName)) continue\r\n      seen.add(reg.nativeName)\r\n      const preserveSharedShape = CURSOR_PRESERVE_SHARED_SCHEMA_IMPL_IDS.has(reg.implId)\r\n      out.push({\r\n        name: reg.nativeName,\r\n        description: preserveSharedShape\r\n          ? ((tool.description && tool.description.trim()) || reg.nativeDescription)\r\n          : reg.nativeDescription,\r\n        input_schema: preserveSharedShape\r\n          ? ((tool.input_schema ?? {}) as Record<string, unknown>)\r\n          : reg.nativeSchema,\r\n      })\r\n      continue\r\n    }\r\n\r\n    if (seen.has(tool.name)) continue\r\n    seen.add(tool.name)\r\n    out.push(tool)\r\n  }\r\n\r\n  return out\r\n}\r\n\r\nexport function buildCursorSupportedToolEnums(tools: ProviderTool[]): number[] {\r\n  const enums = new Set<number>()\r\n\r\n  if (tools.length > 0) {\r\n    for (const toolEnum of CURSOR_MCP_TOOL_ENUMS) {\r\n      enums.add(toolEnum)\r\n    }\r\n  }\r\n\r\n  for (const tool of tools) {\r\n    for (const toolEnum of _cursorToolEnumsForName(tool.name)) {\r\n      enums.add(toolEnum)\r\n    }\r\n\r\n    const reg =\r\n      getCursorRegistrationByImplId(tool.name) ??\r\n      getCursorRegistrationByNativeName(tool.name)\r\n    if (reg) {\r\n      for (const toolEnum of _cursorToolEnumsForName(reg.nativeName)) {\r\n        enums.add(toolEnum)\r\n      }\r\n    }\r\n\r\n    if (tool.name.startsWith('mcp__')) {\r\n      for (const toolEnum of CURSOR_MCP_TOOL_ENUMS) {\r\n        enums.add(toolEnum)\r\n      }\r\n    }\r\n  }\r\n\r\n  return [...enums]\r\n}\r\n\r\nexport function resolveCursorToolCall(\n  nativeName: string,\n  nativeInput: Record<string, unknown>,\n  options?: CursorToolResolutionOptions,\n): { implId: string; input: Record<string, unknown> } | null {\n  const normalizedName = CURSOR_TOOL_ALIAS_BY_NAME[nativeName] ?? nativeName\n\r\n  if (nativeName === 'task' || nativeName === 'task_v2') {\r\n    return { implId: 'Agent', input: nativeInput }\r\n  }\r\n\r\n  if (normalizedName === 'read_file') {\n    return {\n      implId: 'Read',\n      input: _adaptCursorReadInput(nativeInput),\n    }\n  }\n\n  if (normalizedName === 'write_file' || normalizedName === 'write') {\n    return {\n      implId: 'Write',\n      input: _adaptCursorWriteInput(nativeInput),\n    }\n  }\n\r\n  if (nativeName === 'file_search') {\r\n    const query = typeof nativeInput.query === 'string' ? nativeInput.query : '*'\r\n    return {\r\n      implId: 'Glob',\r\n      input: { pattern: query.includes('*') ? query : `**/*${query}*` },\r\n    }\r\n  }\r\n\r\n  if (normalizedName === 'google_web_search') {\r\n    return {\r\n      implId: 'WebSearch',\r\n      input: {\r\n        query: nativeInput.query ?? nativeInput.search_term,\r\n      },\r\n    }\r\n  }\r\n\r\n  if (normalizedName === 'ask_user') {\n    return {\n      implId: 'AskUserQuestion',\n      input: _normalizeAskUserInput(nativeInput),\n    }\n  }\n\r\n  if (normalizedName === 'enter_plan_mode') {\r\n    return { implId: 'EnterPlanMode', input: {} }\r\n  }\r\n\r\n  if (normalizedName === 'run_shell_command') {\r\n    const command = nativeInput.command\r\n    const cwd = nativeInput.dir_path ?? nativeInput.cwd\r\n    const input: Record<string, unknown> = { command }\r\n    if (nativeInput.description) input.description = nativeInput.description\r\n    if (nativeInput.is_background) input.run_in_background = nativeInput.is_background\r\n    if (cwd) input.command = `cd ${JSON.stringify(cwd)} && ${command}`\r\n    return { implId: 'Bash', input }\r\n  }\r\n\r\n  if (nativeName === 'list_mcp_resources') {\r\n    return { implId: 'ListMcpResourcesTool', input: nativeInput }\r\n  }\r\n\r\n  if (nativeName === 'read_mcp_resource') {\r\n    return { implId: 'ReadMcpResourceTool', input: nativeInput }\r\n  }\r\n\r\n  if (nativeName === 'call_mcp_tool') {\n    const server =\n      typeof nativeInput.server === 'string'\n        ? nativeInput.server\n        : typeof nativeInput.server_name === 'string'\n          ? nativeInput.server_name\n          : typeof nativeInput.serverName === 'string'\n            ? nativeInput.serverName\n            : typeof nativeInput.mcp_server === 'string'\n              ? nativeInput.mcp_server\n              : ''\n    const toolName =\n      typeof nativeInput.tool_name === 'string'\n        ? nativeInput.tool_name\n        : typeof nativeInput.toolName === 'string'\n          ? nativeInput.toolName\n          : typeof nativeInput.name === 'string'\n            ? nativeInput.name\n            : ''\n    if (server && toolName) {\n      const implId = _resolveMcpImplId(server, toolName, options)\n      const toolArgs =\n        _asRecord(nativeInput.tool_args) ??\n        _asRecord(nativeInput.arguments) ??\n        _asRecord(nativeInput.args) ??\n        _asRecord(nativeInput.input) ??\n        nativeInput\n      return {\n        implId,\n        input: normalizeCursorSchemaToolInput(\n          toolArgs,\n          _schemaForTool(implId, options),\n        ),\n      }\n    }\n  }\n\r\n  if (normalizedName === 'replace' || nativeName === 'edit_file' || nativeName === 'edit_file_v2') {\n    return _adaptCursorEditInput(nativeInput)\n  }\n\n  if (nativeName === 'NotebookEdit') {\n    return {\n      implId: 'NotebookEdit',\n      input: _adaptCursorNotebookEditInput(nativeInput),\n    }\n  }\n\r\n  // \u2500\u2500 TaskCreate \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  // The model sometimes wraps multiple tasks in a `tasks` array instead\r\n  // of sending `{subject, description}` as the flat schema requires.\r\n  if (nativeName === 'TaskCreate') {\r\n    if (Array.isArray(nativeInput.tasks) && (nativeInput.tasks as Array<Record<string, unknown>>).length > 0) {\r\n      const first = (nativeInput.tasks as Array<Record<string, unknown>>)[0]!\r\n      return {\r\n        implId: 'TaskCreate',\r\n        input: {\r\n          subject: first.subject ?? '',\r\n          description: first.description ?? '',\r\n          ...(first.activeForm ? { activeForm: first.activeForm } : {}),\r\n        },\r\n      }\r\n    }\r\n    return { implId: 'TaskCreate', input: nativeInput }\r\n  }\r\n\r\n  // \u2500\u2500 WebFetch \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  // The model sometimes puts the prompt text in the `url` field or omits\r\n  // the `url` entirely. Detect these cases and fix them.\r\n  if (nativeName === 'WebFetch' || normalizedName === 'web_fetch') {\r\n    const rawUrl = typeof nativeInput.url === 'string' ? nativeInput.url : ''\r\n    const rawPrompt = typeof nativeInput.prompt === 'string' ? nativeInput.prompt : ''\r\n\r\n    // Case 1: url field contains prompt text (no URL), prompt also has same text\r\n    // Case 2: url is a valid URL, prompt is a valid prompt \u2014 pass through\r\n    // Case 3: prompt contains a URL but url doesn't \u2014 extract from prompt\r\n    const urlInUrl = rawUrl.match(/https?:\\/\\/[^\\s]+/)\r\n    const urlInPrompt = rawPrompt.match(/https?:\\/\\/[^\\s]+/)\r\n\r\n    let finalUrl = rawUrl\r\n    let finalPrompt = rawPrompt\r\n\r\n    if (!urlInUrl && urlInPrompt) {\r\n      // URL is in the prompt field instead of url field\r\n      finalUrl = urlInPrompt[0]\r\n      finalPrompt = rawPrompt\r\n    } else if (!urlInUrl && !urlInPrompt) {\r\n      // Neither field has a URL \u2014 pass through as-is for error reporting\r\n      finalUrl = rawUrl || rawPrompt\r\n      finalPrompt = rawPrompt || rawUrl\r\n    }\r\n\r\n    return {\r\n      implId: 'WebFetch',\r\n      input: { url: finalUrl, prompt: finalPrompt },\r\n    }\r\n  }\r\n\r\n  // \u2500\u2500 MCP tools called by direct mcp__* name \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  // When the model calls an MCP tool directly (e.g. mcp__context7__resolve-library-id)\r\n  // instead of going through call_mcp_tool, pass through with the native input.\r\n  if (nativeName.startsWith('mcp__')) {\n    return {\n      implId: nativeName,\n      input: normalizeCursorSchemaToolInput(\n        nativeInput,\n        _schemaForTool(nativeName, options),\n      ),\n    }\n  }\n\n  const reg = getCursorRegistrationByNativeName(normalizedName)\n  if (!reg) {\n    const schema = _schemaForTool(nativeName, options)\n    if (schema) {\n      return {\n        implId: nativeName,\n        input: normalizeCursorSchemaToolInput(nativeInput, schema),\n      }\n    }\n    return null\n  }\n  return {\n    implId: reg.implId,\n    input: reg.adaptInput(nativeInput),\n  }\r\n}\r\n\r\nfunction _cursorToolEnumsForName(name: string): readonly number[] {\r\n  return CURSOR_TOOL_ENUMS_BY_NAME[name] ?? []\r\n}\r\n\r\nfunction _adaptCursorReadInput(native: Record<string, unknown>): Record<string, unknown> {\n  const filePath =\n    _firstDefined(native, [\n      'file_path',\n      'relative_workspace_path',\n      'relativeWorkspacePath',\n      'target_file',\n      'targetFile',\n      'path',\n      'absolute_path',\n      'absolutePath',\n      'filename',\n      'file',\n      'uri',\n    ])\n  const start =\n    _asNumber(native.start_line) ??\n    _asNumber(native.start_line_one_indexed) ??\n    (_asNumber(native.offset) != null ? _asNumber(native.offset)! + 1 : undefined)\r\n  const end =\r\n    _asNumber(native.end_line) ??\r\n    _asNumber(native.end_line_one_indexed_inclusive) ??\r\n    (start != null && _asNumber(native.limit) != null ? start + _asNumber(native.limit)! - 1 : undefined)\r\n\r\n  const result: Record<string, unknown> = { file_path: filePath }\r\n  if (start != null) {\r\n    result.offset = Math.max(0, start - 1)\r\n    if (end != null) result.limit = Math.max(1, end - start + 1)\r\n  }\r\n  return result\n}\n\nfunction _adaptCursorWriteInput(native: Record<string, unknown>): Record<string, unknown> {\n  return {\n    file_path: _firstDefined(native, [\n      'file_path',\n      'relative_workspace_path',\n      'relativeWorkspacePath',\n      'target_file',\n      'targetFile',\n      'path',\n      'absolute_path',\n      'absolutePath',\n      'filename',\n      'file',\n    ]),\n    content: _firstDefined(native, [\n      'content',\n      'contents',\n      'text',\n      'source',\n      'new_source',\n      'newSource',\n      'data',\n    ]),\n  }\n}\n\nfunction _adaptCursorEditInput(\n  native: Record<string, unknown>,\n): { implId: string; input: Record<string, unknown> } | null {\n  const filePath =\n    _firstDefined(native, [\n      'file_path',\n      'relative_workspace_path',\n      'relativeWorkspacePath',\n      'target_file',\n      'targetFile',\n      'path',\n      'absolute_path',\n      'absolutePath',\n      'filename',\n      'file',\n    ])\n\r\n  if (native.old_string != null || native.new_string != null) {\r\n    return {\r\n      implId: 'Edit',\r\n      input: {\r\n        file_path: filePath,\r\n        old_string: native.old_string,\r\n        new_string: native.new_string,\r\n        replace_all: native.allow_multiple ?? false,\r\n      },\r\n    }\r\n  }\r\n\r\n  const content = native.content ?? native.contents ?? native.contents_after_edit\r\n  if (content != null) {\r\n    return {\r\n      implId: 'Write',\r\n      input: {\r\n        file_path: filePath,\r\n        content,\r\n      },\r\n    }\r\n  }\r\n\r\n  const reg = getCursorRegistrationByNativeName('replace')\n  return reg\n    ? { implId: reg.implId, input: reg.adaptInput(native) }\n    : null\n}\n\nfunction _adaptCursorNotebookEditInput(\n  native: Record<string, unknown>,\n): Record<string, unknown> {\n  const editMode =\n    _firstString(native, ['edit_mode', 'editMode', 'mode', 'operation']) ??\n    'replace'\n  const input: Record<string, unknown> = {\n    notebook_path: _firstDefined(native, [\n      'notebook_path',\n      'notebookPath',\n      'file_path',\n      'path',\n      'absolute_path',\n      'absolutePath',\n      'filename',\n      'file',\n    ]),\n    new_source: _firstDefined(native, [\n      'new_source',\n      'newSource',\n      'source',\n      'cell_source',\n      'cellSource',\n      'content',\n      'text',\n    ]),\n    edit_mode: editMode,\n  }\n\n  if (input.new_source == null && editMode === 'delete') {\n    input.new_source = ''\n  }\n\n  const cellId = _cursorNotebookCellId(native)\n  if (cellId != null) input.cell_id = cellId\n\n  const cellType = _firstString(native, ['cell_type', 'cellType', 'type'])\n  if (cellType === 'code' || cellType === 'markdown') {\n    input.cell_type = cellType\n  } else if (editMode === 'insert') {\n    input.cell_type = 'code'\n  }\n\n  return input\n}\n\nfunction _cursorNotebookCellId(native: Record<string, unknown>): unknown {\n  const explicit = _firstDefined(native, [\n    'cell_id',\n    'cellId',\n    'target_cell_id',\n    'targetCellId',\n    'after_cell_id',\n    'afterCellId',\n    'insert_after',\n    'insertAfter',\n    'id',\n  ])\n  if (explicit != null) return explicit\n\n  const index = _firstDefined(native, [\n    'cell_index',\n    'cellIndex',\n    'cell_number',\n    'cellNumber',\n    'index',\n  ])\n  const numericIndex =\n    typeof index === 'number'\n      ? index\n      : typeof index === 'string' && index.trim() !== ''\n        ? Number(index.trim())\n        : NaN\n  return Number.isInteger(numericIndex) && numericIndex >= 0\n    ? `cell-${numericIndex}`\n    : undefined\n}\n\nfunction _asNumber(value: unknown): number | undefined {\n  return typeof value === 'number' && Number.isFinite(value) ? value : undefined\n}\n\r\nfunction _cursorListDirCommand(dirPath: string | undefined): string {\n  if (!dirPath) return 'ls -la'\n  const bashPath = process.platform === 'win32' ? windowsPathToPosixPath(dirPath) : dirPath\n  return `ls -la -- ${JSON.stringify(bashPath)}`\n}\n", "/**\r\n * Build a Cursor ConnectRPC chat request body from Anthropic-IR inputs.\r\n *\r\n * Tool-output representation follows 9router's stable pattern from\r\n * `reference/9router-master/open-sse/translator/request/openai-to-cursor.js`:\r\n * tool outputs are emitted as `<tool_result>\u2026</tool_result>` XML blocks\r\n * inside user messages. On the ConnectRPC protobuf lane we ALSO attach the\r\n * matching structured `tool_results` entries so Cursor gets the tool call id,\r\n * advertised tool name, and raw args from the prior assistant tool_use block.\r\n * This preserves the reference's stable XML path while giving the native\r\n * protobuf request the explicit tool-call context it expects on follow-up turns.\r\n *\r\n * Mapping summary:\r\n *   - System prompt \u2192 prepended as its own \"[System Instructions]\" user turn.\r\n *   - User text blocks  \u2192 joined verbatim.\r\n *   - User tool_result  \u2192 <tool_result> XML (with cached tool-name lookup).\r\n *   - Assistant text    \u2192 joined verbatim.\r\n *   - Assistant tool_use\u2192 dropped (the paired user-side XML result narrates\r\n *                         the call context for the model implicitly).\r\n *   - Images            \u2192 dropped (claudex's tool stack doesn't emit them\r\n *                         on provider messages).\r\n */\r\n\r\nimport type {\r\n  ProviderMessage,\r\n  ProviderTool,\r\n  ProviderContentBlock,\r\n} from '../../services/api/providers/base_provider.js'\r\nimport {\r\n  generateCursorBody,\r\n  type NormalizedCursorMessage,\r\n  type EncodeMcpToolInput,\r\n  type CursorContentPart,\r\n} from './protobuf.js'\r\nimport {\r\n  buildCursorSupportedToolEnums,\r\n  buildCursorToolDefinitions,\r\n  getCursorRegistrationByImplId,\r\n  getCursorRegistrationByNativeName,\r\n} from './tools.js'\r\n\r\nexport interface BuildCursorBodyParams {\r\n  model: string\r\n  system: string\r\n  messages: ProviderMessage[]\r\n  tools: ProviderTool[]\r\n  reasoningEffort?: 'medium' | 'high' | null\r\n  conversationId?: string | null\r\n}\r\n\r\nexport function buildCursorBody(params: BuildCursorBodyParams): Uint8Array {\r\n  const { model, system, messages, tools, reasoningEffort, conversationId } = params\r\n  const encodedTools = _encodeTools(tools)\r\n  const supportedToolEnums = buildCursorSupportedToolEnums(tools)\r\n  const converted = _convertMessages(\r\n    messages,\r\n    [\r\n      _rewriteCursorSystemToolReferences(system, tools),\r\n      _buildCursorToolHint(tools, encodedTools),\r\n    ].filter(Boolean).join('\\n\\n'),\r\n  )\r\n  return generateCursorBody(\r\n    converted,\r\n    model,\r\n    encodedTools,\r\n    supportedToolEnums,\r\n    reasoningEffort ?? null,\r\n    { conversationId },\r\n  )\r\n}\r\n\r\nfunction _encodeTools(tools: ProviderTool[]): EncodeMcpToolInput[] {\r\n  return buildCursorToolDefinitions(tools).map(t => ({\r\n    name: t.name,\r\n    description: (t.description && t.description.trim()) || `Tool: ${t.name}`,\r\n    parameters: (t.input_schema ?? {}) as Record<string, unknown>,\r\n  }))\r\n}\r\n\r\nfunction _buildCursorToolHint(\r\n  originalTools: ProviderTool[],\r\n  encodedTools: EncodeMcpToolInput[],\r\n): string {\r\n  if (encodedTools.length === 0) return ''\r\n  const toolNames = encodedTools.map(t => t.name).filter(Boolean)\r\n  const shownToolNames = toolNames.slice(0, 80)\r\n  const nativeNames = encodedTools\r\n    .map(t => t.name)\r\n    .filter(name => CURSOR_NATIVE_TOOL_HINT_NAMES.has(name))\r\n  return [\r\n    '[Cursor Tool Surface]',\r\n    'You are running inside Tau through the native Cursor provider. The tools advertised in this request are active and callable; do not claim that workspace, shell, MCP, skill, task, or agent tools are unavailable when their names are listed.',\r\n    `Available tool names include: ${shownToolNames.join(', ')}${toolNames.length > shownToolNames.length ? `, and ${toolNames.length - shownToolNames.length} more` : ''}.`,\r\n    ...(nativeNames.length > 0\r\n      ? [`Use Cursor-native tool names when calling these tools: ${nativeNames.join(', ')}.`]\r\n      : []),\r\n    ...(_buildCursorAliasGuide(originalTools)\r\n      ? [_buildCursorAliasGuide(originalTools)]\r\n      : []),\r\n    'Tau tools without a Cursor-native alias keep their advertised names, including Skill, TaskCreate, TaskUpdate, TaskList, TaskGet, EnterWorktree, ExitWorktree, and mcp__server__tool MCP names.',\r\n    _buildCursorToolSelectionGuide(originalTools, encodedTools),\n    _buildCursorPreconditionGuide(originalTools),\n  ].join('\\n')\n}\n\r\nconst CURSOR_NATIVE_TOOL_HINT_NAMES = new Set([\r\n  'read_file',\r\n  'write_file',\r\n  'replace',\r\n  'glob',\r\n  'glob_file_search',\r\n  'grep_search',\r\n  'run_shell_command',\r\n  'run_terminal_cmd',\r\n  'google_web_search',\r\n  'web_search',\r\n  'web_fetch',\r\n  'ask_user',\r\n  'ask_question',\r\n  'enter_plan_mode',\r\n  'create_plan',\r\n  'exit_plan_mode',\r\n  'list_mcp_resources',\r\n  'read_mcp_resource',\r\n  'task',\r\n  'task_v2',\r\n])\r\n\r\nfunction _buildCursorToolSelectionGuide(\n  originalTools: ProviderTool[],\n  encodedTools: EncodeMcpToolInput[],\n): string {\n  const originalNames = new Set(originalTools.map(tool => tool.name))\r\n  const encodedNames = new Set(encodedTools.map(tool => tool.name))\r\n  const lines: string[] = []\r\n\r\n  const addCategory = (label: string, entries: string[]): void => {\r\n    if (entries.length > 0) lines.push(`- ${label}: ${entries.join(', ')}`)\r\n  }\r\n\r\n  const add = (entries: Array<string | null>): string[] =>\r\n    entries.filter((entry): entry is string => typeof entry === 'string')\r\n\r\n  const hasOriginal = (name: string): boolean => originalNames.has(name)\r\n  const hasEncoded = (name: string): boolean => encodedNames.has(name)\r\n\r\n  addCategory('Files', add([\r\n    hasEncoded('read_file') ? 'read_file (read files)' : null,\r\n    hasEncoded('write_file') ? 'write_file (create or overwrite files)' : null,\r\n    hasEncoded('replace') ? 'replace (edit files in place)' : null,\r\n    hasEncoded('glob_file_search') ? 'glob_file_search (find files by glob)' : null,\r\n    hasEncoded('glob') ? 'glob (find files by glob)' : null,\r\n    hasEncoded('grep_search') ? 'grep_search (search file contents)' : null,\r\n    hasEncoded('run_terminal_cmd') ? 'run_terminal_cmd (run shell commands)' : null,\r\n    hasEncoded('run_shell_command') ? 'run_shell_command (run shell commands)' : null,\r\n  ]))\r\n\r\n  addCategory('Planning', add([\r\n    hasEncoded('create_plan') ? 'create_plan (enter planning mode before coding)' : null,\r\n    hasOriginal('ExitPlanMode') ? 'ExitPlanMode (present a plan and exit plan mode)' : null,\r\n    hasOriginal('TaskCreate') ? 'TaskCreate (create a tracked task)' : null,\r\n    hasOriginal('TaskGet') ? 'TaskGet (read a tracked task)' : null,\r\n    hasOriginal('TaskList') ? 'TaskList (list tracked tasks)' : null,\r\n    hasOriginal('TaskUpdate') ? 'TaskUpdate (update a tracked task)' : null,\r\n  ]))\r\n\r\n  addCategory('Agents', add([\r\n    hasEncoded('task') ? 'task (spawn a subagent for delegated work)' : null,\r\n    hasEncoded('task_v2') ? 'task_v2 (spawn a subagent for delegated work)' : null,\r\n    hasOriginal('Skill') ? 'Skill (run a Tau skill / slash-command skill)' : null,\r\n    hasOriginal('EnterWorktree') ? 'EnterWorktree (enter an isolated git worktree)' : null,\r\n    hasOriginal('ExitWorktree') ? 'ExitWorktree (leave the current worktree)' : null,\r\n  ]))\r\n\r\n  addCategory('Interaction', add([\n    hasEncoded('ask_question') ? 'ask_question (ask the user a structured question)' : null,\n    hasEncoded('web_search') ? 'web_search (current/live web information)' : null,\n    hasEncoded('google_web_search') ? 'google_web_search (current/live web information)' : null,\n    hasEncoded('web_fetch') ? 'web_fetch (fetch a specific URL)' : null,\n  ]))\n\r\n  addCategory('MCP', add([\r\n    hasEncoded('list_mcp_resources') ? 'list_mcp_resources (list MCP resources)' : null,\r\n    hasEncoded('read_mcp_resource') ? 'read_mcp_resource (read an MCP resource)' : null,\r\n  ]))\r\n\r\n  const mcpServerTools = originalTools\r\n    .map(tool => tool.name)\r\n    .filter(name => name.startsWith('mcp__'))\r\n  if (mcpServerTools.length > 0) {\r\n    lines.push(`- MCP server tools: ${mcpServerTools.length} tool(s) named mcp__* are available; use the exact tool name shown when you need a specific MCP server tool.`)\r\n  }\r\n\r\n  if (lines.length === 0) return ''\r\n\r\n  return [\r\n    '[Cursor Tool Guide]',\r\n    'Use the most specific tool available instead of claiming the capability is unavailable.',\r\n    ...lines,\r\n  ].join('\\n')\n}\n\nfunction _buildCursorPreconditionGuide(originalTools: ProviderTool[]): string {\n  const originalNames = new Set(originalTools.map(tool => tool.name))\n  const lines: string[] = []\n\n  if (originalNames.has('NotebookEdit')) {\n    lines.push('Before NotebookEdit, read the target .ipynb with read_file and use a real cell_id for replace/delete. For insert, include cell_type as \"code\" or \"markdown\".')\n  }\n\n  if (originalNames.has('EnterWorktree') || originalNames.has('ExitWorktree')) {\n    lines.push('Use EnterWorktree only after confirming the current directory is a git repository or has configured worktree hooks. Use ExitWorktree only after EnterWorktree succeeded in this session.')\n  }\n\n  if (originalNames.has('Bash')) {\n    lines.push('When repo state is uncertain, run git rev-parse --is-inside-work-tree before git diff, git status, or other git-only commands.')\n  }\n\n  if (originalTools.some(tool => tool.name.startsWith('mcp__'))) {\n    lines.push('For mcp__server__tool calls, follow the advertised JSON schema exactly. If a tool asks for a named string field, send that exact key rather than a generic query key.')\n  }\n\n  if (lines.length === 0) return ''\n  return ['[Cursor Tool Preconditions]', ...lines].join('\\n')\n}\n\nfunction _buildToolNameMap(messages: ProviderMessage[]): Map<string, string> {\n  const map = new Map<string, string>()\r\n  for (const msg of messages) {\r\n    if (msg.role !== 'assistant' || typeof msg.content === 'string') continue\r\n    for (const block of msg.content) {\r\n      if (block.type === 'tool_use' && block.id && block.name) {\r\n        const nativeName = _cursorDisplayedToolName(block.name)\r\n        map.set(block.id, nativeName)\r\n        const normalized = _normalizeCursorToolCallId(block.id)\r\n        if (normalized && normalized !== block.id) {\r\n          map.set(normalized, nativeName)\r\n        }\r\n      }\r\n    }\r\n  }\r\n  return map\r\n}\r\n\r\nfunction _convertMessages(\r\n  messages: ProviderMessage[],\r\n  systemText: string,\r\n): NormalizedCursorMessage[] {\r\n  const out: NormalizedCursorMessage[] = []\r\n  const toolNames = _buildToolNameMap(messages)\r\n\r\n  if (systemText) {\r\n    out.push({ role: 'system', content: systemText })\r\n  }\r\n\r\n  for (const msg of messages) {\r\n    const role: 'user' | 'assistant' = msg.role === 'assistant' ? 'assistant' : 'user'\r\n\r\n    if (role === 'user') {\r\n      if (typeof msg.content === 'string') {\r\n        if (msg.content) out.push({ role: 'user', content: msg.content })\r\n      } else {\r\n        const toolMessages: NormalizedCursorMessage[] = []\r\n        const parts: CursorContentPart[] = []\r\n        for (const block of msg.content) {\r\n          if (block.type === 'text' && typeof block.text === 'string' && block.text) {\r\n            parts.push({ type: 'text', text: block.text })\r\n          } else if (block.type === 'tool_result' && block.tool_use_id) {\r\n            const nativeName =\r\n              toolNames.get(block.tool_use_id) ??\r\n              toolNames.get(_normalizeCursorToolCallId(block.tool_use_id))\r\n            toolMessages.push({\r\n              role: 'tool',\r\n              content: [{\r\n                type: 'tool-result',\r\n                toolCallId: block.tool_use_id,\r\n                toolName: nativeName ?? 'tool',\r\n                result: _sanitize(_stringifyToolResult(block.content)),\r\n                ...(block.is_error ? { isError: true } : {}),\r\n              }],\r\n            })\r\n          }\r\n        }\r\n\r\n        out.push(...toolMessages)\r\n        if (parts.length > 0) {\r\n          out.push(\r\n            parts.length === 1 && parts[0]?.type === 'text'\r\n              ? { role: 'user', content: parts[0].text }\r\n              : { role: 'user', content: parts },\r\n          )\r\n        }\r\n      }\r\n      continue\r\n    }\r\n\r\n    if (typeof msg.content === 'string') {\r\n      if (msg.content) out.push({ role: 'assistant', content: msg.content })\r\n    } else {\r\n      const parts: CursorContentPart[] = []\r\n      for (const block of msg.content) {\r\n        if (block.type === 'text' && typeof block.text === 'string' && block.text) {\r\n          parts.push({ type: 'text', text: block.text })\r\n        } else if (block.type === 'tool_use' && block.id && block.name) {\r\n          parts.push({\r\n            type: 'tool-call',\r\n            toolCallId: block.id,\r\n            toolName: _cursorDisplayedToolName(block.name),\r\n            args: (block.input ?? {}) as Record<string, unknown>,\r\n          })\r\n        }\r\n      }\r\n      if (parts.length > 0) {\r\n        const textOnly = parts.every(part => part.type === 'text')\r\n        if (textOnly) {\r\n          const content = parts\r\n            .filter((part): part is Extract<CursorContentPart, { type: 'text' }> => part.type === 'text')\r\n            .map(part => part.text)\r\n            .join('\\n')\r\n            .trim()\r\n          if (content) out.push({ role: 'assistant', content })\r\n        } else {\r\n          out.push({ role: 'assistant', content: parts })\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  return out\r\n}\r\n\r\nfunction _stringifyToolResult(\r\n  content: string | ProviderContentBlock[] | undefined,\r\n): string {\r\n  if (typeof content === 'string') return content\r\n  if (!Array.isArray(content)) return ''\r\n  const parts: string[] = []\r\n  for (const block of content) {\r\n    if (typeof block === 'object' && block && 'text' in block && typeof block.text === 'string') {\r\n      parts.push(block.text)\r\n    } else if (typeof block === 'object' && block) {\r\n      parts.push(JSON.stringify(block))\r\n    }\r\n  }\r\n  return parts.join('\\n')\r\n}\r\n\r\nfunction _sanitize(text: string): string {\r\n  // Strip non-printable control chars \u2014 the Cursor backend errors on them.\r\n  // eslint-disable-next-line no-control-regex\r\n  return text.replace(/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]/g, '')\r\n}\r\n\r\nfunction _buildCursorAliasGuide(originalTools: ProviderTool[]): string {\r\n  const aliases = originalTools\r\n    .map(tool => {\r\n      const native = _cursorDisplayedToolName(tool.name)\r\n      return native !== tool.name ? `${tool.name} -> ${native}` : null\r\n    })\r\n    .filter((alias): alias is string => typeof alias === 'string')\r\n\r\n  if (aliases.length === 0) return ''\r\n  return (\r\n    'If other Tau instructions mention shared tool ids, treat them as aliases for the callable Cursor names in this session: '\r\n    + aliases.join(', ')\r\n    + '.'\r\n  )\r\n}\r\n\r\nfunction _rewriteCursorSystemToolReferences(\r\n  systemText: string,\r\n  tools: ProviderTool[],\r\n): string {\r\n  if (!systemText.trim()) return systemText\r\n\r\n  let rewritten = systemText\r\n  const replacements = tools\r\n    .map(tool => {\r\n      const native = _cursorDisplayedToolName(tool.name)\r\n      return native !== tool.name ? [tool.name, native] as const : null\r\n    })\r\n    .filter((pair): pair is readonly [string, string] => Array.isArray(pair))\r\n    .sort((a, b) => b[0].length - a[0].length)\r\n\r\n  for (const [sharedName, nativeName] of replacements) {\r\n    rewritten = rewritten.replaceAll(`\\`${sharedName}\\``, `\\`${nativeName}\\``)\r\n    rewritten = rewritten.replace(\r\n      new RegExp(`\\\\b${_escapeRegex(sharedName)}\\\\b`, 'g'),\r\n      nativeName,\r\n    )\r\n  }\r\n\r\n  return rewritten\r\n}\r\n\r\nfunction _cursorDisplayedToolName(name: string): string {\r\n  const reg =\r\n    getCursorRegistrationByImplId(name) ??\r\n    getCursorRegistrationByNativeName(name)\r\n  return reg?.nativeName ?? name\r\n}\r\n\r\nfunction _escapeRegex(text: string): string {\r\n  return text.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n}\r\n\r\nfunction _normalizeCursorToolCallId(id: string | undefined): string {\r\n  if (typeof id !== 'string') return ''\r\n  const idx = id.indexOf('\\nmc_')\r\n  return idx >= 0 ? id.slice(0, idx) : id\r\n}\r\n", "/**\r\n * Cursor header + checksum generation.\r\n *\r\n * Port of reference/9router-master/open-sse/utils/cursorChecksum.js.\r\n * The x-cursor-checksum header uses a \"jyh cipher\": XOR each byte of the\r\n * (Date.now()/1e6) timestamp with a rolling key (seeded at 165), base64\r\n * the result, concatenate the machineId.\r\n *\r\n * Cursor's server rejects requests whose checksum/timestamp clock-skews\r\n * more than a few minutes \u2014 so we regenerate per request; no caching.\r\n */\r\n\r\nimport { createHash, randomUUID } from 'crypto'\r\nimport { existsSync, readFileSync } from 'fs'\r\nimport { join } from 'path'\r\n\r\n/** SHA-256(input + salt) as 64-char lowercase hex. */\r\nexport function hashed64Hex(input: string, salt = ''): string {\r\n  return createHash('sha256').update(input + salt).digest('hex')\r\n}\r\n\r\n/**\r\n * Tiny UUIDv5 over the DNS namespace. We only use it to derive a stable\r\n * session id from the access token \u2014 pulling the full `uuid` package in\r\n * for this one call is overkill.\r\n */\r\nconst _DNS_NAMESPACE = [\r\n  0x6b, 0xa7, 0xb8, 0x10, 0x9d, 0xad, 0x11, 0xd1,\r\n  0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8,\r\n]\r\nexport function uuidV5(name: string): string {\r\n  const bytes = Buffer.from(name, 'utf8')\r\n  const h = createHash('sha1')\r\n  h.update(Buffer.from(_DNS_NAMESPACE))\r\n  h.update(bytes)\r\n  const digest = h.digest()\r\n  // Per RFC 4122 \u00A74.3: take the first 16 bytes, set version + variant.\r\n  const out = Buffer.from(digest.slice(0, 16))\r\n  out[6] = (out[6]! & 0x0f) | 0x50 // version 5\r\n  out[8] = (out[8]! & 0x3f) | 0x80 // RFC 4122 variant\r\n  const hex = out.toString('hex')\r\n  return (\r\n    `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-`\r\n    + `${hex.slice(16, 20)}-${hex.slice(20, 32)}`\r\n  )\r\n}\r\n\r\n/**\r\n * Jyh-cipher checksum. The algorithm below matches the reference 1:1:\r\n *   1. timestamp = floor(Date.now() / 1e6)\r\n *   2. bytes = timestamp as 6-byte big-endian\r\n *   3. t = 165\r\n *   4. for i in 0..5: bytes[i] = ((bytes[i] ^ t) + (i % 256)) & 0xFF; t = bytes[i]\r\n *   5. URL-safe base64 (no padding) using the custom alphabet below\r\n *   6. append machineId\r\n *\r\n * The custom alphabet places '-' / '_' at positions 62 / 63 (URL-safe).\r\n */\r\nexport function cursorChecksum(machineId: string): string {\r\n  const timestamp = Math.floor(Date.now() / 1_000_000)\r\n  const bytes = new Uint8Array([\r\n    (timestamp >>> 40) & 0xff,\r\n    (timestamp >>> 32) & 0xff,\r\n    (timestamp >>> 24) & 0xff,\r\n    (timestamp >>> 16) & 0xff,\r\n    (timestamp >>> 8) & 0xff,\r\n    timestamp & 0xff,\r\n  ])\r\n\r\n  let t = 165\r\n  for (let i = 0; i < bytes.length; i++) {\r\n    bytes[i] = ((bytes[i]! ^ t) + (i % 256)) & 0xff\r\n    t = bytes[i]!\r\n  }\r\n\r\n  const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'\r\n  let encoded = ''\r\n  for (let i = 0; i < bytes.length; i += 3) {\r\n    const a = bytes[i]!\r\n    const b = i + 1 < bytes.length ? bytes[i + 1]! : 0\r\n    const c = i + 2 < bytes.length ? bytes[i + 2]! : 0\r\n    encoded += alphabet[a >> 2]!\r\n    encoded += alphabet[((a & 3) << 4) | (b >> 4)]!\r\n    if (i + 1 < bytes.length) encoded += alphabet[((b & 15) << 2) | (c >> 6)]!\r\n    if (i + 2 < bytes.length) encoded += alphabet[c & 63]!\r\n  }\r\n\r\n  return `${encoded}${machineId}`\r\n}\r\n\r\n/**\r\n * Build the full Cursor request header set. machineId is optional \u2014 when\r\n * the user paste-flow didn't capture one we derive it from the token\r\n * (same SHA-256 scheme the reference uses). The client identity mirrors\r\n * Cursor's IDE ConnectRPC endpoint expectations, but does not require the\r\n * `cursor` binary or Cursor IDE to be installed.\r\n */\r\nexport function buildCursorHeaders(opts: {\r\n  accessToken: string\r\n  machineId?: string | null\r\n  ghostMode?: boolean\r\n}): Record<string, string> {\r\n  // Tokens copy-pasted from state.vscdb sometimes come prefixed with\r\n  // \"<uuid>::\" \u2014 strip that so we send only the real JWT.\r\n  const clean = opts.accessToken.includes('::')\r\n    ? (opts.accessToken.split('::')[1] ?? opts.accessToken)\r\n    : opts.accessToken\r\n\r\n  const machineId =\r\n    opts.machineId\r\n    || process.env.CURSOR_MACHINE_ID\r\n    || _detectCursorMachineId()\r\n    || hashed64Hex(clean, 'machineId')\r\n  const sessionId = uuidV5(clean)\r\n  const clientKey = hashed64Hex(clean)\r\n  const checksum = cursorChecksum(machineId)\r\n  const clientVersion = process.env.CURSOR_CLIENT_VERSION ?? _detectCursorClientVersion()\r\n  const clientType = process.env.CURSOR_CLIENT_TYPE ?? 'ide'\r\n\r\n  let os = 'linux'\r\n  if (process.platform === 'win32') os = 'windows'\r\n  else if (process.platform === 'darwin') os = 'macos'\r\n  const arch = process.arch === 'arm64' ? 'aarch64' : 'x64'\r\n\r\n  return {\r\n    'Authorization': `Bearer ${clean}`,\r\n    'connect-accept-encoding': 'gzip',\r\n    'connect-protocol-version': '1',\r\n    'Content-Type': 'application/connect+proto',\r\n    'User-Agent': 'connect-es/1.6.1',\r\n    'x-amzn-trace-id': `Root=${randomUUID()}`,\r\n    'x-client-key': clientKey,\r\n    'x-cursor-checksum': checksum,\r\n    'x-cursor-client-version': clientVersion,\r\n    'x-cursor-client-type': clientType,\r\n    'x-cursor-client-os': os,\r\n    'x-cursor-client-arch': arch,\r\n    'x-cursor-client-device-type': 'desktop',\r\n    'x-cursor-config-version': randomUUID(),\r\n    'x-cursor-timezone': Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC',\r\n    'x-ghost-mode': opts.ghostMode === false ? 'false' : 'true',\r\n    'x-verified-ghost-mode': opts.ghostMode === false ? 'false' : 'true',\r\n    'x-request-id': randomUUID(),\r\n    'x-session-id': sessionId,\r\n  }\r\n}\r\n\r\nfunction _detectCursorMachineId(): string | null {\r\n  for (const candidate of _cursorGlobalStoragePaths('storage.json')) {\r\n    try {\r\n      if (!existsSync(candidate)) continue\r\n      const raw = readFileSync(candidate, 'utf8')\r\n      const parsed = JSON.parse(raw) as Record<string, unknown>\r\n      const machineId =\r\n        _readStringRecordField(parsed, 'storage.serviceMachineId')\r\n        ?? _readStringRecordField(parsed, 'telemetry.machineId')\r\n        ?? _readStringRecordField(parsed, 'machineId')\r\n      if (machineId) return machineId\r\n    } catch {\r\n      // ignore and keep falling back\r\n    }\r\n  }\r\n\r\n  return null\r\n}\r\n\r\nfunction _cursorGlobalStoragePaths(filename: string): string[] {\r\n  const candidates: string[] = []\r\n  const appData = process.env.APPDATA\r\n  const xdgConfigHome = process.env.XDG_CONFIG_HOME\r\n  const home = process.env.HOME ?? process.env.USERPROFILE\r\n\r\n  if (appData) {\r\n    candidates.push(join(appData, 'Cursor', 'User', 'globalStorage', filename))\r\n  }\r\n  if (xdgConfigHome) {\r\n    candidates.push(join(xdgConfigHome, 'Cursor', 'User', 'globalStorage', filename))\r\n  }\r\n  if (home) {\r\n    candidates.push(join(home, '.config', 'Cursor', 'User', 'globalStorage', filename))\r\n    candidates.push(join(home, 'Library', 'Application Support', 'Cursor', 'User', 'globalStorage', filename))\r\n  }\r\n\r\n  return candidates\r\n}\r\n\r\nfunction _readStringRecordField(\r\n  record: Record<string, unknown>,\r\n  key: string,\r\n): string | null {\r\n  const value = record[key]\r\n  return typeof value === 'string' && value.trim() ? value.trim() : null\r\n}\r\n\r\nfunction _detectCursorClientVersion(): string {\r\n  const candidates: string[] = []\r\n  const localAppData = process.env.LOCALAPPDATA\r\n  const home = process.env.HOME ?? process.env.USERPROFILE\r\n\r\n  if (localAppData) {\r\n    candidates.push(join(localAppData, 'Programs', 'cursor', 'resources', 'app', 'package.json'))\r\n    candidates.push(join(localAppData, 'Programs', 'Cursor', 'resources', 'app', 'package.json'))\r\n  }\r\n  if (home) {\r\n    candidates.push(join(home, 'Applications', 'Cursor.app', 'Contents', 'Resources', 'app', 'package.json'))\r\n  }\r\n  candidates.push('/Applications/Cursor.app/Contents/Resources/app/package.json')\r\n  candidates.push('/opt/Cursor/resources/app/package.json')\r\n  candidates.push('/usr/share/cursor/resources/app/package.json')\r\n\r\n  for (const candidate of candidates) {\r\n    try {\r\n      if (!existsSync(candidate)) continue\r\n      const raw = readFileSync(candidate, 'utf8')\r\n      const parsed = JSON.parse(raw) as { version?: string }\r\n      if (typeof parsed.version === 'string' && parsed.version.trim()) {\r\n        return parsed.version.trim()\r\n      }\r\n    } catch {\r\n      // ignore and keep falling back\r\n    }\r\n  }\r\n\r\n  return '3.1.17'\r\n}\r\n", "/**\r\n * Cursor static model catalog.\r\n *\r\n * These ids are Cursor-native chat model ids. They stay provider-scoped,\r\n * so ids such as `gpt-5.3-codex` remain on the Cursor lane when Cursor is\r\n * the active provider.\r\n */\r\n\r\nimport type { ModelInfo } from '../../services/api/providers/base_provider.js'\r\n\r\nexport const CURSOR_AUTO_MODEL_ID = 'auto'\r\nexport const CURSOR_AUTO_WIRE_MODEL_ID = 'default'\r\n\r\nexport type CursorModelSection =\r\n  | 'recommended'\r\n  | 'cursor'\r\n  | 'anthropic'\r\n  | 'openai'\r\n  | 'other'\r\n\r\nexport type CursorVariantTag = 'thinking' | 'fast'\r\n\r\nexport interface CursorModelVariant {\r\n  id: string\r\n  label: string\r\n  name?: string\r\n  tags?: readonly CursorVariantTag[]\r\n}\r\n\r\nexport interface CursorModelGroup {\r\n  id: string\r\n  name: string\r\n  section: CursorModelSection\r\n  defaultVariantId?: string\r\n  variants: readonly CursorModelVariant[]\r\n}\r\n\r\nfunction variant(\r\n  id: string,\r\n  label: string,\r\n  name: string,\r\n  tags?: readonly CursorVariantTag[],\r\n): CursorModelVariant {\r\n  return tags ? { id, label, name, tags } : { id, label, name }\r\n}\r\n\r\nexport const CURSOR_MODEL_GROUPS: readonly CursorModelGroup[] = [\r\n  {\r\n    id: 'auto',\r\n    name: 'Auto',\r\n    section: 'recommended',\r\n    defaultVariantId: 'auto',\r\n    variants: [variant('auto', 'Auto', 'Auto')],\r\n  },\r\n  {\r\n    id: 'composer-2',\r\n    name: 'Composer 2',\r\n    section: 'cursor',\r\n    defaultVariantId: 'composer-2',\r\n    variants: [\r\n      variant('composer-2-fast', 'Fast', 'Composer 2 Fast', ['fast']),\r\n      variant('composer-2', 'Default', 'Composer 2'),\r\n    ],\r\n  },\r\n  {\r\n    id: 'composer-1.5',\r\n    name: 'Composer 1.5',\r\n    section: 'cursor',\r\n    defaultVariantId: 'composer-1.5',\r\n    variants: [variant('composer-1.5', 'Default', 'Composer 1.5')],\r\n  },\r\n  {\r\n    id: 'gpt-5.3-codex',\r\n    name: 'GPT-5.3 Codex',\r\n    section: 'openai',\r\n    defaultVariantId: 'gpt-5.3-codex',\r\n    variants: [\r\n      variant('gpt-5.3-codex-low', 'Low', 'GPT-5.3 Codex Low'),\r\n      variant('gpt-5.3-codex-low-fast', 'Low Fast', 'GPT-5.3 Codex Low Fast', ['fast']),\r\n      variant('gpt-5.3-codex', 'Default', 'GPT-5.3 Codex'),\r\n      variant('gpt-5.3-codex-fast', 'Fast', 'GPT-5.3 Codex Fast', ['fast']),\r\n      variant('gpt-5.3-codex-high', 'High', 'GPT-5.3 Codex High'),\r\n      variant('gpt-5.3-codex-high-fast', 'High Fast', 'GPT-5.3 Codex High Fast', ['fast']),\r\n      variant('gpt-5.3-codex-xhigh', 'XHigh', 'GPT-5.3 Codex XHigh'),\r\n      variant('gpt-5.3-codex-xhigh-fast', 'XHigh Fast', 'GPT-5.3 Codex XHigh Fast', ['fast']),\r\n    ],\r\n  },\r\n  {\r\n    id: 'gpt-5.3-codex-spark-preview',\r\n    name: 'GPT-5.3 Codex Spark Preview',\r\n    section: 'openai',\r\n    defaultVariantId: 'gpt-5.3-codex-spark-preview',\r\n    variants: [\r\n      variant('gpt-5.3-codex-spark-preview-low', 'Low', 'GPT-5.3 Codex Spark Preview Low'),\r\n      variant('gpt-5.3-codex-spark-preview', 'Default', 'GPT-5.3 Codex Spark Preview'),\r\n      variant('gpt-5.3-codex-spark-preview-high', 'High', 'GPT-5.3 Codex Spark Preview High'),\r\n      variant('gpt-5.3-codex-spark-preview-xhigh', 'XHigh', 'GPT-5.3 Codex Spark Preview XHigh'),\r\n    ],\r\n  },\r\n  {\r\n    id: 'gpt-5.2-codex',\r\n    name: 'GPT-5.2 Codex',\r\n    section: 'openai',\r\n    defaultVariantId: 'gpt-5.2-codex',\r\n    variants: [\r\n      variant('gpt-5.2-codex-low', 'Low', 'GPT-5.2 Codex Low'),\r\n      variant('gpt-5.2-codex-low-fast', 'Low Fast', 'GPT-5.2 Codex Low Fast', ['fast']),\r\n      variant('gpt-5.2-codex', 'Default', 'GPT-5.2 Codex'),\r\n      variant('gpt-5.2-codex-fast', 'Fast', 'GPT-5.2 Codex Fast', ['fast']),\r\n      variant('gpt-5.2-codex-high', 'High', 'GPT-5.2 Codex High'),\r\n      variant('gpt-5.2-codex-high-fast', 'High Fast', 'GPT-5.2 Codex High Fast', ['fast']),\r\n      variant('gpt-5.2-codex-xhigh', 'XHigh', 'GPT-5.2 Codex XHigh'),\r\n      variant('gpt-5.2-codex-xhigh-fast', 'XHigh Fast', 'GPT-5.2 Codex XHigh Fast', ['fast']),\r\n    ],\r\n  },\r\n  {\r\n    id: 'gpt-5.1-codex-max',\r\n    name: 'GPT-5.1 Codex Max',\r\n    section: 'openai',\r\n    defaultVariantId: 'gpt-5.1-codex-max-medium',\r\n    variants: [\r\n      variant('gpt-5.1-codex-max-low', 'Low', 'GPT-5.1 Codex Max Low'),\r\n      variant('gpt-5.1-codex-max-low-fast', 'Low Fast', 'GPT-5.1 Codex Max Low Fast', ['fast']),\r\n      variant('gpt-5.1-codex-max-medium', 'Medium', 'GPT-5.1 Codex Max Medium'),\r\n      variant('gpt-5.1-codex-max-medium-fast', 'Medium Fast', 'GPT-5.1 Codex Max Medium Fast', ['fast']),\r\n      variant('gpt-5.1-codex-max-high', 'High', 'GPT-5.1 Codex Max High'),\r\n      variant('gpt-5.1-codex-max-high-fast', 'High Fast', 'GPT-5.1 Codex Max High Fast', ['fast']),\r\n      variant('gpt-5.1-codex-max-xhigh', 'XHigh', 'GPT-5.1 Codex Max XHigh'),\r\n      variant('gpt-5.1-codex-max-xhigh-fast', 'XHigh Fast', 'GPT-5.1 Codex Max XHigh Fast', ['fast']),\r\n    ],\r\n  },\r\n  {\r\n    id: 'gpt-5.4',\r\n    name: 'GPT-5.4',\r\n    section: 'openai',\r\n    defaultVariantId: 'gpt-5.4-medium',\r\n    variants: [\r\n      variant('gpt-5.4-low', 'Low', 'GPT-5.4 Low'),\r\n      variant('gpt-5.4-medium', 'Medium', 'GPT-5.4 Medium'),\r\n      variant('gpt-5.4-medium-fast', 'Medium Fast', 'GPT-5.4 Medium Fast', ['fast']),\r\n      variant('gpt-5.4-high', 'High', 'GPT-5.4 High'),\r\n      variant('gpt-5.4-high-fast', 'High Fast', 'GPT-5.4 High Fast', ['fast']),\r\n      variant('gpt-5.4-xhigh', 'XHigh', 'GPT-5.4 XHigh'),\r\n      variant('gpt-5.4-xhigh-fast', 'XHigh Fast', 'GPT-5.4 XHigh Fast', ['fast']),\r\n    ],\r\n  },\r\n  {\r\n    id: 'gpt-5.2',\r\n    name: 'GPT-5.2',\r\n    section: 'openai',\r\n    defaultVariantId: 'gpt-5.2',\r\n    variants: [\r\n      variant('gpt-5.2-low', 'Low', 'GPT-5.2 Low'),\r\n      variant('gpt-5.2-low-fast', 'Low Fast', 'GPT-5.2 Low Fast', ['fast']),\r\n      variant('gpt-5.2', 'Default', 'GPT-5.2'),\r\n      variant('gpt-5.2-fast', 'Fast', 'GPT-5.2 Fast', ['fast']),\r\n      variant('gpt-5.2-high', 'High', 'GPT-5.2 High'),\r\n      variant('gpt-5.2-high-fast', 'High Fast', 'GPT-5.2 High Fast', ['fast']),\r\n      variant('gpt-5.2-xhigh', 'XHigh', 'GPT-5.2 XHigh'),\r\n      variant('gpt-5.2-xhigh-fast', 'XHigh Fast', 'GPT-5.2 XHigh Fast', ['fast']),\r\n    ],\r\n  },\r\n  {\r\n    id: 'gpt-5.4-mini',\r\n    name: 'GPT-5.4 Mini',\r\n    section: 'openai',\r\n    defaultVariantId: 'gpt-5.4-mini-medium',\r\n    variants: [\r\n      variant('gpt-5.4-mini-none', 'None', 'GPT-5.4 Mini None'),\r\n      variant('gpt-5.4-mini-low', 'Low', 'GPT-5.4 Mini Low'),\r\n      variant('gpt-5.4-mini-medium', 'Medium', 'GPT-5.4 Mini Medium'),\r\n      variant('gpt-5.4-mini-high', 'High', 'GPT-5.4 Mini High'),\r\n      variant('gpt-5.4-mini-xhigh', 'XHigh', 'GPT-5.4 Mini XHigh'),\r\n    ],\r\n  },\r\n  {\r\n    id: 'gpt-5.4-nano',\r\n    name: 'GPT-5.4 Nano',\r\n    section: 'openai',\r\n    defaultVariantId: 'gpt-5.4-nano-medium',\r\n    variants: [\r\n      variant('gpt-5.4-nano-none', 'None', 'GPT-5.4 Nano None'),\r\n      variant('gpt-5.4-nano-low', 'Low', 'GPT-5.4 Nano Low'),\r\n      variant('gpt-5.4-nano-medium', 'Medium', 'GPT-5.4 Nano Medium'),\r\n      variant('gpt-5.4-nano-high', 'High', 'GPT-5.4 Nano High'),\r\n      variant('gpt-5.4-nano-xhigh', 'XHigh', 'GPT-5.4 Nano XHigh'),\r\n    ],\r\n  },\r\n  {\r\n    id: 'gpt-5.1',\r\n    name: 'GPT-5.1',\r\n    section: 'openai',\r\n    defaultVariantId: 'gpt-5.1',\r\n    variants: [\r\n      variant('gpt-5.1-low', 'Low', 'GPT-5.1 Low'),\r\n      variant('gpt-5.1', 'Default', 'GPT-5.1'),\r\n      variant('gpt-5.1-high', 'High', 'GPT-5.1 High'),\r\n    ],\r\n  },\r\n  {\r\n    id: 'gpt-5.1-codex-mini',\r\n    name: 'GPT-5.1 Codex Mini',\r\n    section: 'openai',\r\n    defaultVariantId: 'gpt-5.1-codex-mini',\r\n    variants: [\r\n      variant('gpt-5.1-codex-mini-low', 'Low', 'GPT-5.1 Codex Mini Low'),\r\n      variant('gpt-5.1-codex-mini', 'Default', 'GPT-5.1 Codex Mini'),\r\n      variant('gpt-5.1-codex-mini-high', 'High', 'GPT-5.1 Codex Mini High'),\r\n    ],\r\n  },\r\n  {\r\n    id: 'gpt-5-mini',\r\n    name: 'GPT-5 Mini',\r\n    section: 'openai',\r\n    defaultVariantId: 'gpt-5-mini',\r\n    variants: [variant('gpt-5-mini', 'Default', 'GPT-5 Mini')],\r\n  },\r\n  {\r\n    id: 'claude-opus-4-7',\r\n    name: 'Claude Opus 4.7',\r\n    section: 'anthropic',\r\n    defaultVariantId: 'claude-opus-4-7-high',\r\n    variants: [\r\n      variant('claude-opus-4-7-low', 'Low', 'Claude Opus 4.7 Low'),\r\n      variant('claude-opus-4-7-medium', 'Medium', 'Claude Opus 4.7 Medium'),\r\n      variant('claude-opus-4-7-high', 'High', 'Claude Opus 4.7 High'),\r\n      variant('claude-opus-4-7-xhigh', 'XHigh', 'Claude Opus 4.7 XHigh'),\r\n      variant('claude-opus-4-7-max', 'Max', 'Claude Opus 4.7 Max'),\r\n      variant('claude-opus-4-7-thinking-low', 'Thinking Low', 'Claude Opus 4.7 Thinking Low', ['thinking']),\r\n      variant('claude-opus-4-7-thinking-medium', 'Thinking Medium', 'Claude Opus 4.7 Thinking Medium', ['thinking']),\r\n      variant('claude-opus-4-7-thinking-high', 'Thinking High', 'Claude Opus 4.7 Thinking High', ['thinking']),\r\n      variant('claude-opus-4-7-thinking-xhigh', 'Thinking XHigh', 'Claude Opus 4.7 Thinking XHigh', ['thinking']),\r\n      variant('claude-opus-4-7-thinking-max', 'Thinking Max', 'Claude Opus 4.7 Thinking Max', ['thinking']),\r\n    ],\r\n  },\r\n  {\r\n    id: 'claude-4.6-sonnet',\r\n    name: 'Claude 4.6 Sonnet',\r\n    section: 'anthropic',\r\n    defaultVariantId: 'claude-4.6-sonnet-medium',\r\n    variants: [\r\n      variant('claude-4.6-sonnet-medium', 'Medium', 'Claude 4.6 Sonnet Medium'),\r\n      variant('claude-4.6-sonnet-medium-thinking', 'Medium Thinking', 'Claude 4.6 Sonnet Medium Thinking', ['thinking']),\r\n    ],\r\n  },\r\n  {\r\n    id: 'claude-4.6-opus',\r\n    name: 'Claude 4.6 Opus',\r\n    section: 'anthropic',\r\n    defaultVariantId: 'claude-4.6-opus-high',\r\n    variants: [\r\n      variant('claude-4.6-opus-high', 'High', 'Claude 4.6 Opus High'),\r\n      variant('claude-4.6-opus-max', 'Max', 'Claude 4.6 Opus Max'),\r\n      variant('claude-4.6-opus-high-thinking', 'High Thinking', 'Claude 4.6 Opus High Thinking', ['thinking']),\r\n      variant('claude-4.6-opus-max-thinking', 'Max Thinking', 'Claude 4.6 Opus Max Thinking', ['thinking']),\r\n    ],\r\n  },\r\n  {\r\n    id: 'claude-4.5-opus',\r\n    name: 'Claude 4.5 Opus',\r\n    section: 'anthropic',\r\n    defaultVariantId: 'claude-4.5-opus-high',\r\n    variants: [\r\n      variant('claude-4.5-opus-high', 'High', 'Claude 4.5 Opus High'),\r\n      variant('claude-4.5-opus-high-thinking', 'High Thinking', 'Claude 4.5 Opus High Thinking', ['thinking']),\r\n    ],\r\n  },\r\n  {\r\n    id: 'claude-4.5-sonnet',\r\n    name: 'Claude 4.5 Sonnet',\r\n    section: 'anthropic',\r\n    defaultVariantId: 'claude-4.5-sonnet',\r\n    variants: [\r\n      variant('claude-4.5-sonnet', 'Default', 'Claude 4.5 Sonnet'),\r\n      variant('claude-4.5-sonnet-thinking', 'Thinking', 'Claude 4.5 Sonnet Thinking', ['thinking']),\r\n    ],\r\n  },\r\n  {\r\n    id: 'claude-4-sonnet',\r\n    name: 'Claude 4 Sonnet',\r\n    section: 'anthropic',\r\n    defaultVariantId: 'claude-4-sonnet',\r\n    variants: [\r\n      variant('claude-4-sonnet', 'Default', 'Claude 4 Sonnet'),\r\n      variant('claude-4-sonnet-1m', '1M', 'Claude 4 Sonnet 1M'),\r\n      variant('claude-4-sonnet-thinking', 'Thinking', 'Claude 4 Sonnet Thinking', ['thinking']),\r\n      variant('claude-4-sonnet-1m-thinking', '1M Thinking', 'Claude 4 Sonnet 1M Thinking', ['thinking']),\r\n    ],\r\n  },\r\n  {\r\n    id: 'gemini-3.1-pro',\r\n    name: 'Gemini 3.1 Pro',\r\n    section: 'other',\r\n    defaultVariantId: 'gemini-3.1-pro',\r\n    variants: [variant('gemini-3.1-pro', 'Default', 'Gemini 3.1 Pro')],\r\n  },\r\n  {\r\n    id: 'gemini-3-flash',\r\n    name: 'Gemini 3 Flash',\r\n    section: 'other',\r\n    defaultVariantId: 'gemini-3-flash',\r\n    variants: [variant('gemini-3-flash', 'Default', 'Gemini 3 Flash')],\r\n  },\r\n  {\r\n    id: 'grok-4-20',\r\n    name: 'Grok 4.20',\r\n    section: 'other',\r\n    defaultVariantId: 'grok-4-20',\r\n    variants: [\r\n      variant('grok-4-20', 'Default', 'Grok 4.20'),\r\n      variant('grok-4-20-thinking', 'Thinking', 'Grok 4.20 Thinking', ['thinking']),\r\n    ],\r\n  },\r\n  {\r\n    id: 'kimi-k2.5',\r\n    name: 'Kimi K2.5',\r\n    section: 'other',\r\n    defaultVariantId: 'kimi-k2.5',\r\n    variants: [variant('kimi-k2.5', 'Default', 'Kimi K2.5')],\r\n  },\r\n]\r\n\r\nconst CURSOR_GROUP_ORDER = [\r\n  'auto',\r\n  'composer-2',\r\n  'composer-1.5',\r\n  'gpt-5.3-codex',\r\n  'gpt-5.2',\r\n  'gpt-5.3-codex-spark-preview',\r\n  'gpt-5.2-codex',\r\n  'gpt-5.1-codex-max',\r\n  'gpt-5.4',\r\n  'claude-opus-4-7',\r\n  'claude-4.6-sonnet',\r\n  'claude-4.6-opus',\r\n  'claude-4.5-opus',\r\n  'gemini-3.1-pro',\r\n  'gpt-5.4-mini',\r\n  'gpt-5.4-nano',\r\n  'grok-4-20',\r\n  'claude-4.5-sonnet',\r\n  'gpt-5.1',\r\n  'gemini-3-flash',\r\n  'gpt-5.1-codex-mini',\r\n  'claude-4-sonnet',\r\n  'gpt-5-mini',\r\n  'kimi-k2.5',\r\n] as const\r\n\r\nconst CURSOR_GROUP_ORDER_INDEX = new Map(\r\n  CURSOR_GROUP_ORDER.map((id, index) => [id, index]),\r\n)\r\n\r\nexport const CURSOR_ORDERED_MODEL_GROUPS: readonly CursorModelGroup[] = [...CURSOR_MODEL_GROUPS]\r\n  .sort((left, right) => {\r\n    const leftIndex = CURSOR_GROUP_ORDER_INDEX.get(left.id) ?? Number.MAX_SAFE_INTEGER\r\n    const rightIndex = CURSOR_GROUP_ORDER_INDEX.get(right.id) ?? Number.MAX_SAFE_INTEGER\r\n    return leftIndex - rightIndex\r\n  })\r\n\r\nexport const CURSOR_MODELS: ModelInfo[] = CURSOR_ORDERED_MODEL_GROUPS.flatMap(group =>\r\n  group.variants.map(variantInfo => ({\r\n    id: variantInfo.id,\r\n    name: variantInfo.name ?? `${group.name} ${variantInfo.label}`,\r\n  })),\r\n)\r\n\r\nconst CURSOR_MODEL_IDS = new Set(CURSOR_MODELS.map(model => model.id))\r\n\r\nconst CURSOR_LEGACY_MODEL_ALIASES = new Map<string, string>([\r\n  ['composer-1', 'composer-1.5'],\r\n  ['gpt-5.1-codex-max', 'gpt-5.1-codex-max-medium'],\r\n  ['gpt-5.4', 'gpt-5.4-medium'],\r\n  ['gpt-5.4-fast', 'gpt-5.4-medium-fast'],\r\n  ['opus-4.6', 'claude-4.6-opus-high'],\r\n  ['opus-4.6-thinking', 'claude-4.6-opus-high-thinking'],\r\n  ['sonnet-4.6', 'claude-4.6-sonnet-medium'],\r\n  ['sonnet-4.6-thinking', 'claude-4.6-sonnet-medium-thinking'],\r\n  ['opus-4.5', 'claude-4.5-opus-high'],\r\n  ['opus-4.5-thinking', 'claude-4.5-opus-high-thinking'],\r\n  ['sonnet-4.5', 'claude-4.5-sonnet'],\r\n  ['sonnet-4.5-thinking', 'claude-4.5-sonnet-thinking'],\r\n  ['grok', 'grok-4-20'],\r\n])\r\n\r\nconst CURSOR_MODEL_DISPLAY_NAMES = new Map<string, string>()\r\n\r\nfor (const group of CURSOR_MODEL_GROUPS) {\r\n  CURSOR_MODEL_DISPLAY_NAMES.set(group.id, group.name)\r\n  for (const variantInfo of group.variants) {\r\n    CURSOR_MODEL_DISPLAY_NAMES.set(\r\n      variantInfo.id,\r\n      variantInfo.name ?? `${group.name} ${variantInfo.label}`,\r\n    )\r\n  }\r\n}\r\n\r\nexport function isCursorModel(id: string): boolean {\r\n  return CURSOR_MODEL_IDS.has(id) || id === CURSOR_AUTO_WIRE_MODEL_ID || CURSOR_LEGACY_MODEL_ALIASES.has(id)\r\n}\r\n\r\nexport function isCursorAutoModelId(id: string): boolean {\r\n  return id === CURSOR_AUTO_MODEL_ID || id === CURSOR_AUTO_WIRE_MODEL_ID\r\n}\r\n\r\nexport function getCursorModelDisplayName(id: string): string | null {\r\n  const resolvedId =\r\n    isCursorAutoModelId(id)\r\n      ? CURSOR_AUTO_MODEL_ID\r\n      : (CURSOR_LEGACY_MODEL_ALIASES.get(id) ?? id)\r\n  return CURSOR_MODEL_DISPLAY_NAMES.get(resolvedId) ?? null\r\n}\r\n\r\nexport function resolveCursorModelId(id: string): string {\r\n  if (isCursorAutoModelId(id)) {\r\n    return CURSOR_AUTO_WIRE_MODEL_ID\r\n  }\r\n  return CURSOR_LEGACY_MODEL_ALIASES.get(id) ?? id\r\n}\r\n", "/**\r\n * Cursor Lane \u2014 ConnectRPC protobuf streaming.\r\n *\r\n * Wire: POST https://api2.cursor.sh/aiserver.v1.ChatService/StreamUnifiedChatWithTools\r\n *   Content-Type: application/connect+proto\r\n *   Authorization: Bearer <accessToken>\r\n *   x-cursor-checksum: <jyh(now/1e6) ^ rolling-key(165) base64 || machineId>\r\n *\r\n * The response body is a stream of 5-byte-prefixed protobuf frames. Each\r\n * frame carries text, thinking content, a tool-call delta, a JSON error\r\n * envelope, or trailer metadata. We normalize each frame's payload into\r\n * Anthropic-IR events so claude.ts renders a Cursor turn identically to\r\n * every other lane.\r\n *\r\n * Frame \u2192 IR mapping:\r\n *   RESPONSE_TEXT          \u2192 text_delta\r\n *   RESPONSE.THINKING.TEXT \u2192 thinking_delta\r\n *   TOOL_CALL              \u2192 tool_use block (input_json_delta accumulation)\r\n *   JSON {\"error\": \u2026}      \u2192 surfaces as an error text block pre-content;\r\n *                            dropped silently post-content (9router pattern).\r\n */\r\n\r\nimport type {\r\n  AnthropicStreamEvent,\r\n  ModelInfo,\r\n  ProviderTool,\r\n} from '../../services/api/providers/base_provider.js'\r\nimport type {\r\n  Lane,\r\n  LaneRunContext,\r\n  LaneRunResult,\r\n  LaneProviderCallParams,\r\n  NormalizedUsage,\r\n} from '../types.js'\r\nimport { buildCursorBody } from './request.js'\r\nimport {\r\n  parseConnectFrame,\r\n  extractFromResponsePayload,\r\n  formatCursorToolName,\r\n  unformatCursorToolName,\r\n} from './protobuf.js'\r\nimport { buildCursorHeaders } from './checksum.js'\r\nimport {\r\n  CURSOR_MODELS,\r\n  isCursorAutoModelId,\r\n  isCursorModel,\r\n  resolveCursorModelId,\r\n} from './catalog.js'\r\nimport {\r\n  getCursorRegistrationByImplId,\r\n  getCursorRegistrationByNativeName,\r\n  resolveCursorToolCall,\r\n} from './tools.js'\r\nimport { OPENAI_COMPAT_TOOL_USAGE_RULES } from '../shared/mcp_bridge.js'\r\n\r\nconst CURSOR_ENDPOINT = 'https://api2.cursor.sh/aiserver.v1.InferenceService/Stream'\r\nconst CURSOR_HTTP_TIMEOUT_MS = 60_000\r\nconst CURSOR_THINK_CLOSE_MARKER = '</think>'\r\nconst CURSOR_PRINTED_TOOL_CALLS_OPEN = '<|tool_calls_begin|>'\r\nconst CURSOR_PRINTED_TOOL_CALLS_CLOSE = '<|tool_calls_end|>'\r\nconst CURSOR_PRINTED_TOOL_CALL_OPEN = '<|tool_call_begin|>'\r\nconst CURSOR_PRINTED_TOOL_CALL_CLOSE = '<|tool_call_end|>'\r\nconst CURSOR_PRINTED_TOOL_SEP = '<|tool_sep|>'\r\nconst CURSOR_PRINTED_TOOL_MARKERS = [\r\n  CURSOR_PRINTED_TOOL_CALLS_OPEN,\r\n  CURSOR_PRINTED_TOOL_CALLS_CLOSE,\r\n  CURSOR_PRINTED_TOOL_CALL_OPEN,\r\n  CURSOR_PRINTED_TOOL_CALL_CLOSE,\r\n  CURSOR_PRINTED_TOOL_SEP,\r\n] as const\r\n\r\ninterface CursorHttpStreamResponse {\r\n  status: number\r\n  body: AsyncIterable<Uint8Array>\r\n}\r\n\r\ninterface CursorAttemptResult {\r\n  usage: NormalizedUsage\r\n  retry: boolean\r\n}\r\n\r\ninterface CursorThinkingSplitState {\r\n  mode: 'thinking' | 'text'\r\n  carry: string\r\n  trimLeadingText: boolean\r\n}\r\n\r\nexport interface CursorPrintedToolCall {\r\n  name: string\r\n  input: Record<string, unknown>\r\n}\r\n\r\nexport interface CursorPrintedToolTextState {\r\n  pending: string\r\n}\r\n\r\nexport type CursorPrintedToolTextChunk =\r\n  | { type: 'text'; text: string }\r\n  | { type: 'tool_calls'; calls: CursorPrintedToolCall[] }\r\n\r\nexport class CursorLane implements Lane {\r\n  readonly name = 'cursor'\r\n  readonly displayName = 'Cursor (ConnectRPC)'\r\n\r\n  private accessToken: string | null = null\r\n  private machineId: string | null = null\r\n  private conversationId = _newCursorConversationId()\r\n\r\n  configure(opts: { accessToken?: string | null; machineId?: string | null }): void {\r\n    const accessTokenChanged =\r\n      opts.accessToken !== undefined && (opts.accessToken || null) !== this.accessToken\r\n    const machineIdChanged =\r\n      opts.machineId !== undefined && (opts.machineId || null) !== this.machineId\r\n\r\n    if (opts.accessToken !== undefined) this.accessToken = opts.accessToken || null\r\n    if (opts.machineId !== undefined) this.machineId = opts.machineId || null\r\n\r\n    if (accessTokenChanged || machineIdChanged) {\r\n      this._resetSessionState()\r\n    }\r\n  }\r\n\r\n  supportsModel(model: string): boolean {\r\n    // Catalog membership only. Provider-shim routing is provider-scoped, so\r\n    // same-looking ids such as `gpt-5.3-codex` stay on Cursor when the active\r\n    // provider is Cursor and stay on OpenAI when the active provider is OpenAI.\r\n    return isCursorModel(model)\r\n  }\r\n\r\n  isHealthy(): boolean {\r\n    return !!this.accessToken\r\n  }\r\n\r\n  resolveModel(model: string): string {\r\n    return resolveCursorModelId(model)\r\n  }\r\n\r\n  async listModels(_providerFilter?: string): Promise<ModelInfo[]> {\r\n    // Cursor's GetDefaultModelNudgeData endpoint is noisy + includes\r\n    // retired aliases. The static catalog is what Cursor's own IDE ships.\r\n    return CURSOR_MODELS\r\n  }\r\n\r\n  dispose(): void {\r\n    this._resetSessionState()\r\n  }\r\n\r\n  async *run(_context: LaneRunContext): AsyncGenerator<AnthropicStreamEvent, LaneRunResult> {\r\n    throw new Error(\r\n      'CursorLane.run (lane-owns-loop) is not wired yet \u2014 use streamAsProvider via LaneBackedProvider.',\r\n    )\r\n  }\r\n\r\n  async *streamAsProvider(\r\n    params: LaneProviderCallParams,\r\n  ): AsyncGenerator<AnthropicStreamEvent, NormalizedUsage> {\r\n    const { model, messages, system, tools, signal, thinking } = params\r\n\r\n    if (!this.accessToken) {\r\n      throw new Error(\r\n        'Cursor lane: not authenticated. Run `/login cursor` to complete the browser login.',\r\n      )\r\n    }\r\n\r\n    const rawSystemText = typeof system === 'string'\r\n      ? system\r\n      : (system ?? []).map(b => b.text).join('\\n\\n')\r\n\r\n    // Prepend OPENAI_COMPAT_TOOL_USAGE_RULES at the top of system text\r\n    // when tools are present. Same pattern as the cline / kilo / openai-\r\n    // compat lanes \u2014 Cursor proxies to Anthropic / OpenAI / Gemini upstream\r\n    // and the rule is already in the upstream prompt, but lifting it to\r\n    // the very top is the difference between \"buried hint the model\r\n    // ignores\" and \"first thing it reads\", which materially reduces the\r\n    // syntax-flailing retry loops that burn input tokens on non-Claude\r\n    // routes through Cursor.\r\n    const systemText = (tools && tools.length > 0)\r\n      ? (rawSystemText\r\n          ? `${OPENAI_COMPAT_TOOL_USAGE_RULES}\\n${rawSystemText}`\r\n          : OPENAI_COMPAT_TOOL_USAGE_RULES)\r\n      : rawSystemText\r\n\r\n    // Cursor only exposes UNSPECIFIED / MEDIUM / HIGH, not a continuous\r\n    // thinking budget \u2014 bucket the caller's budget_tokens into those.\r\n    const reasoningEffort: 'medium' | 'high' | null =\r\n      thinking?.type === 'enabled'\r\n        ? ((thinking.budget_tokens ?? 0) >= 16_000 ? 'high' : 'medium')\r\n        : null\r\n\r\n    const accessToken = this.accessToken\r\n    if (_looksLikeFreshCursorConversation(messages)) {\r\n      this.conversationId = _newCursorConversationId()\r\n    }\r\n    const gen = _streamCursorAttempt({\r\n      displayModel: model,\r\n      cursorModel: this.resolveModel(model),\r\n      accessToken,\r\n      machineId: this.machineId,\r\n      conversationId: this.conversationId,\r\n      systemText,\r\n      messages,\r\n      tools,\r\n      reasoningEffort,\r\n      signal,\r\n    })\r\n\r\n    while (true) {\r\n      const next = await gen.next()\r\n      if (next.done) {\r\n        return next.value.usage\r\n      }\r\n      yield next.value\r\n    }\r\n\r\n    return _blankUsage()\r\n  }\r\n\r\n  private _resetSessionState(): void {\r\n    this.conversationId = _newCursorConversationId()\r\n  }\r\n}\r\n\r\nexport function createCursorThinkingSplitState(): CursorThinkingSplitState {\r\n  return { mode: 'thinking', carry: '', trimLeadingText: false }\r\n}\r\n\r\nexport function splitCursorThinkingDelta(\r\n  chunk: string,\r\n  state: CursorThinkingSplitState,\r\n): { thinking: string | null; text: string | null } {\r\n  if (!chunk) return { thinking: null, text: null }\r\n  if (state.mode === 'text') {\r\n    const text = state.trimLeadingText ? _trimLeadingCursorThinkText(chunk) : chunk\r\n    state.trimLeadingText = false\r\n    return { thinking: null, text: text || null }\r\n  }\r\n\r\n  let combined = _stripLeadingCursorThinkTag(state.carry + chunk)\r\n  state.carry = ''\r\n\r\n  const closeIdx = combined.indexOf(CURSOR_THINK_CLOSE_MARKER)\r\n  if (closeIdx >= 0) {\r\n    const thinking = combined.slice(0, closeIdx) || null\r\n    const text = _trimLeadingCursorThinkText(\r\n      combined.slice(closeIdx + CURSOR_THINK_CLOSE_MARKER.length),\r\n    )\r\n    state.mode = 'text'\r\n    state.trimLeadingText = !text\r\n    return { thinking, text: text || null }\r\n  }\r\n\r\n  const suffixLen = _cursorThinkClosePrefixSuffixLen(combined)\r\n  if (suffixLen > 0) {\r\n    state.carry = combined.slice(-suffixLen)\r\n    combined = combined.slice(0, -suffixLen)\r\n  }\r\n\r\n  return { thinking: combined || null, text: null }\r\n}\r\n\r\nexport function flushCursorThinkingSplitState(\r\n  state: CursorThinkingSplitState,\r\n): { thinking: string | null; text: string | null } {\r\n  if (!state.carry) return { thinking: null, text: null }\r\n  const carry = state.carry\r\n  state.carry = ''\r\n  if (state.mode === 'text') {\r\n    const text = state.trimLeadingText ? _trimLeadingCursorThinkText(carry) : carry\r\n    state.trimLeadingText = false\r\n    return { thinking: null, text: text || null }\r\n  }\r\n  return { thinking: carry, text: null }\r\n}\r\n\r\nexport function createCursorPrintedToolTextState(): CursorPrintedToolTextState {\r\n  return { pending: '' }\r\n}\r\n\r\nexport function consumeCursorPrintedToolText(\r\n  chunk: string,\r\n  state: CursorPrintedToolTextState,\r\n  flushAll = false,\r\n): CursorPrintedToolTextChunk[] {\r\n  if (chunk) state.pending += chunk\r\n\r\n  const out: CursorPrintedToolTextChunk[] = []\r\n  let pending = state.pending\r\n\r\n  while (pending.length > 0) {\r\n    const openIndex = _findCursorToolMarker(pending, CURSOR_PRINTED_TOOL_CALLS_OPEN)\r\n    if (openIndex === -1) {\r\n      if (!flushAll) {\r\n        const keepTail = _cursorPrintedToolOpenPrefixSuffixLen(pending)\r\n        const emitLength = pending.length - keepTail\r\n        if (emitLength > 0) {\r\n          out.push({ type: 'text', text: pending.slice(0, emitLength) })\r\n          pending = pending.slice(emitLength)\r\n        }\r\n        break\r\n      }\r\n\r\n      const stripped = _stripDanglingCursorPrintedToolText(pending)\r\n      if (stripped) out.push({ type: 'text', text: stripped })\r\n      pending = ''\r\n      break\r\n    }\r\n\r\n    if (openIndex > 0) {\r\n      out.push({ type: 'text', text: pending.slice(0, openIndex) })\r\n      pending = pending.slice(openIndex)\r\n      continue\r\n    }\r\n\r\n    const closeIndex = _findCursorToolMarker(\r\n      pending,\r\n      CURSOR_PRINTED_TOOL_CALLS_CLOSE,\r\n      CURSOR_PRINTED_TOOL_CALLS_OPEN.length,\r\n    )\r\n    if (closeIndex === -1) {\r\n      if (flushAll) {\r\n        const stripped = _stripDanglingCursorPrintedToolText(pending)\r\n        if (stripped) out.push({ type: 'text', text: stripped })\r\n        pending = ''\r\n      }\r\n      break\r\n    }\r\n\r\n    const blockEnd = closeIndex + CURSOR_PRINTED_TOOL_CALLS_CLOSE.length\r\n    const block = pending.slice(0, blockEnd)\r\n    const calls = parseCursorPrintedToolCalls(block)\r\n    if (calls === null) {\r\n      out.push({ type: 'text', text: block })\r\n    } else if (calls.length > 0) {\r\n      out.push({ type: 'tool_calls', calls })\r\n    }\r\n    pending = pending.slice(blockEnd)\r\n  }\r\n\r\n  state.pending = pending\r\n  return out\r\n}\r\n\r\nexport function flushCursorPrintedToolText(\r\n  state: CursorPrintedToolTextState,\r\n): CursorPrintedToolTextChunk[] {\r\n  return consumeCursorPrintedToolText('', state, true)\r\n}\r\n\r\nexport function parseCursorPrintedToolCalls(\r\n  block: string,\r\n): CursorPrintedToolCall[] | null {\r\n  if (\r\n    !_cursorToolMarkerMatchesAt(block, 0, CURSOR_PRINTED_TOOL_CALLS_OPEN) ||\r\n    !_cursorToolMarkerMatchesAt(\r\n      block,\r\n      block.length - CURSOR_PRINTED_TOOL_CALLS_CLOSE.length,\r\n      CURSOR_PRINTED_TOOL_CALLS_CLOSE,\r\n    )\r\n  ) {\r\n    return null\r\n  }\r\n\r\n  const inner = block.slice(\r\n    CURSOR_PRINTED_TOOL_CALLS_OPEN.length,\r\n    block.length - CURSOR_PRINTED_TOOL_CALLS_CLOSE.length,\r\n  )\r\n  const calls: CursorPrintedToolCall[] = []\r\n  let pos = 0\r\n\r\n  while (pos < inner.length) {\r\n    const trimmedLeading = inner.slice(pos).match(/^\\s*/)\r\n    pos += trimmedLeading?.[0]?.length ?? 0\r\n    if (pos >= inner.length) break\r\n\r\n    if (!_cursorToolMarkerMatchesAt(inner, pos, CURSOR_PRINTED_TOOL_CALL_OPEN)) return null\r\n    pos += CURSOR_PRINTED_TOOL_CALL_OPEN.length\r\n\r\n    const closeIndex = _findCursorToolMarker(inner, CURSOR_PRINTED_TOOL_CALL_CLOSE, pos)\r\n    if (closeIndex === -1) return null\r\n\r\n    const call = _parseCursorPrintedToolCallBody(inner.slice(pos, closeIndex))\r\n    if (!call) return null\r\n    calls.push(call)\r\n\r\n    pos = closeIndex + CURSOR_PRINTED_TOOL_CALL_CLOSE.length\r\n  }\r\n\r\n  return calls\r\n}\r\n\r\nasync function* _streamCursorAttempt(params: {\r\n  displayModel: string\r\n  cursorModel: string\r\n  accessToken: string\r\n  machineId: string | null\r\n  conversationId: string\r\n  systemText: string\r\n  messages: LaneProviderCallParams['messages']\r\n  tools: LaneProviderCallParams['tools']\r\n  reasoningEffort: 'medium' | 'high' | null\r\n  signal: AbortSignal\r\n}): AsyncGenerator<AnthropicStreamEvent, CursorAttemptResult> {\r\n  const body = buildCursorBody({\r\n    model: params.cursorModel,\r\n    system: params.systemText,\r\n    messages: params.messages,\r\n    tools: params.tools,\r\n    reasoningEffort: params.reasoningEffort,\r\n    conversationId: params.conversationId,\r\n  })\r\n  const toolNameMap = _buildCursorToolNameMap(params.tools)\r\n  const toolSchemas = _buildCursorToolSchemaMap(params.tools, toolNameMap)\r\n\r\n  const headers = buildCursorHeaders({\r\n    accessToken: params.accessToken,\r\n    machineId: params.machineId,\r\n  })\r\n\r\n  const messageId = `cursor-${Date.now()}`\r\n  let messageStartEmitted = false\r\n  let inputTokens = 0\r\n  let outputTokens = 0\r\n  let cacheReadTokens = 0\r\n  let cacheWriteTokens = 0\r\n  let totalContentChars = 0\r\n\r\n  // Content-block state.\r\n  let currentIndex = 0\r\n  let openBlock: 'text' | 'thinking' | null = null\r\n  const thinkingSplitState = createCursorThinkingSplitState()\r\n  const printedToolTextState = createCursorPrintedToolTextState()\r\n  let syntheticToolCallCount = 0\r\n\r\n  // Per-tool accumulation. Cursor re-emits the same toolCallId across\r\n  // frames and appends raw-args chunks. We buffer arguments so Cursor-native\r\n  // schemas (read_file, replace, run_shell_command, ...) can be adapted back\r\n  // to Tau executor schemas before the shared tool runner sees them.\r\n  interface ToolEntry {\r\n    anthropicIndex: number\r\n    nativeName: string\r\n    name: string\r\n    rawArgs: string\r\n  }\r\n  const toolBlocks = new Map<string, ToolEntry>()\r\n\r\n  const emitMessageStart = (): AnthropicStreamEvent | undefined => {\r\n    if (messageStartEmitted) return undefined\r\n    messageStartEmitted = true\r\n    return {\r\n      type: 'message_start',\r\n      message: {\r\n        id: messageId,\r\n        type: 'message',\r\n        role: 'assistant',\r\n        content: [],\r\n        model: params.displayModel,\r\n        stop_reason: null,\r\n        stop_sequence: null,\r\n        usage: { input_tokens: 0, output_tokens: 0 },\r\n      },\r\n    }\r\n  }\r\n\r\n  const emitTextDelta = function* (text: string): Generator<AnthropicStreamEvent> {\r\n    if (!text) return\r\n    totalContentChars += text.length\r\n    const mst = emitMessageStart()\r\n    if (mst) yield mst\r\n    if (openBlock === 'thinking') {\r\n      yield { type: 'content_block_stop', index: currentIndex }\r\n      currentIndex++\r\n      openBlock = null\r\n    }\r\n    if (openBlock !== 'text') {\r\n      yield {\r\n        type: 'content_block_start',\r\n        index: currentIndex,\r\n        content_block: { type: 'text', text: '' },\r\n      }\r\n      openBlock = 'text'\r\n    }\r\n    yield {\r\n      type: 'content_block_delta',\r\n      index: currentIndex,\r\n      delta: { type: 'text_delta', text },\r\n    }\r\n  }\r\n\r\n  const emitThinkingDelta = function* (thinking: string): Generator<AnthropicStreamEvent> {\r\n    if (!thinking) return\r\n    const mst = emitMessageStart()\r\n    if (mst) yield mst\r\n    if (openBlock === 'text') {\r\n      yield { type: 'content_block_stop', index: currentIndex }\r\n      currentIndex++\r\n      openBlock = null\r\n    }\r\n    if (openBlock !== 'thinking') {\r\n      yield {\r\n        type: 'content_block_start',\r\n        index: currentIndex,\r\n        content_block: { type: 'thinking', thinking: '' },\r\n      }\r\n      openBlock = 'thinking'\r\n    }\r\n    yield {\r\n      type: 'content_block_delta',\r\n      index: currentIndex,\r\n      delta: { type: 'thinking_delta', thinking },\r\n    }\r\n  }\r\n\r\n  const flushThinkingCarry = function* (): Generator<AnthropicStreamEvent> {\r\n    const flushed = flushCursorThinkingSplitState(thinkingSplitState)\r\n    if (flushed.thinking) yield* emitThinkingDelta(flushed.thinking)\r\n    if (flushed.text) yield* emitCursorVisibleText(flushed.text)\r\n  }\r\n\r\n  const queueToolUse = (toolName: string, rawInput: Record<string, unknown>): void => {\r\n    const nativeName = _normalizeCursorToolName(toolName, toolNameMap)\r\n    const resolved = resolveCursorToolCall(nativeName, rawInput, {\r\n      toolSchemas,\r\n    })\r\n    const entryName = resolved?.implId ?? _implNameForCursorToolName(nativeName)\r\n    const entryInput = resolved?.input ?? rawInput\r\n    const id = `cursor-printed-tool-${++syntheticToolCallCount}`\r\n    toolBlocks.set(id, {\r\n      anthropicIndex: currentIndex,\r\n      nativeName,\r\n      name: entryName,\r\n      rawArgs: JSON.stringify(entryInput),\r\n    })\r\n    currentIndex++\r\n  }\r\n\r\n  const emitCursorPrintedToolChunks = function* (\r\n    chunks: CursorPrintedToolTextChunk[],\r\n  ): Generator<AnthropicStreamEvent> {\r\n    for (const chunk of chunks) {\r\n      if (chunk.type === 'text') {\r\n        yield* emitTextDelta(chunk.text)\r\n        continue\r\n      }\r\n      if (chunk.type === 'tool_calls') {\r\n        if (openBlock !== null) {\r\n          yield { type: 'content_block_stop', index: currentIndex }\r\n          currentIndex++\r\n          openBlock = null\r\n        }\r\n        for (const call of chunk.calls) {\r\n          queueToolUse(call.name, call.input)\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  const emitCursorVisibleText = function* (\r\n    text: string,\r\n  ): Generator<AnthropicStreamEvent> {\r\n    if (!text) return\r\n    const chunks = consumeCursorPrintedToolText(text, printedToolTextState, false)\r\n    yield* emitCursorPrintedToolChunks(chunks)\r\n  }\r\n\r\n  const flushPrintedToolText = function* (\r\n    flushAll: boolean,\r\n  ): Generator<AnthropicStreamEvent> {\r\n    const chunks = flushAll\r\n      ? flushCursorPrintedToolText(printedToolTextState)\r\n      : consumeCursorPrintedToolText('', printedToolTextState, false)\r\n    yield* emitCursorPrintedToolChunks(chunks)\r\n  }\r\n\r\n  let response: CursorHttpStreamResponse\r\n  try {\r\n    response = await _openCursorHttpStream({\r\n      url: CURSOR_ENDPOINT,\r\n      headers,\r\n      body,\r\n      signal: params.signal,\r\n    })\r\n  } catch (err: unknown) {\r\n    const mst = emitMessageStart()\r\n    if (mst) yield mst\r\n    const message = err instanceof Error ? err.message : String(err)\r\n    yield* _emitErrorText(`cursor API connection error: ${message}`)\r\n    yield { type: 'message_delta', delta: { stop_reason: 'end_turn' }, usage: { output_tokens: 0 } }\r\n    yield { type: 'message_stop' }\r\n    return { usage: _blankUsage(), retry: false }\r\n  }\r\n\r\n  if (response.status < 200 || response.status >= 300) {\r\n    const errText = await _collectStreamText(response.body).catch(() => '')\r\n    const mst = emitMessageStart()\r\n    if (mst) yield mst\r\n    yield* _emitErrorText(formatCursorApiError(response.status, errText, params.cursorModel))\r\n    yield { type: 'message_delta', delta: { stop_reason: 'end_turn' }, usage: { output_tokens: 0 } }\r\n    yield { type: 'message_stop' }\r\n    return { usage: _blankUsage(), retry: false }\r\n  }\r\n\r\n  // Residual buffer for partial frames that straddle fetch() chunks.\r\n  let buffer: Uint8Array<ArrayBufferLike> = new Uint8Array(0)\r\n  let deferredError: string | null = null\r\n  let sawAnyFrame = false\r\n\r\n  for await (const value of response.body) {\r\n    if (value && value.length > 0) {\r\n      const merged = new Uint8Array(buffer.length + value.length)\r\n      merged.set(buffer)\r\n      merged.set(value, buffer.length)\r\n      buffer = merged\r\n    }\r\n\r\n    // Drain every complete frame from the buffer.\r\n    while (true) {\r\n      const frame = parseConnectFrame(buffer)\r\n      if (!frame) break\r\n      buffer = buffer.slice(frame.consumed)\r\n      sawAnyFrame = true\r\n\r\n      const result = extractFromResponsePayload(frame.payload)\r\n\r\n      if (result.usage) {\r\n        if (typeof result.usage.promptTokens === 'number') {\r\n          inputTokens = result.usage.promptTokens\r\n        }\r\n        if (typeof result.usage.completionTokens === 'number') {\r\n          outputTokens = result.usage.completionTokens\r\n        }\r\n        if (typeof result.usage.inputTokens === 'number') {\r\n          inputTokens = result.usage.inputTokens\r\n        }\r\n        if (typeof result.usage.outputTokens === 'number') {\r\n          outputTokens = result.usage.outputTokens\r\n        }\r\n        if (typeof result.usage.cacheReadTokens === 'number') {\r\n          cacheReadTokens = result.usage.cacheReadTokens\r\n        }\r\n        if (typeof result.usage.cacheWriteTokens === 'number') {\r\n          cacheWriteTokens = result.usage.cacheWriteTokens\r\n        }\r\n      }\r\n\r\n      if (result.error) {\r\n        // 9router's pattern: if the turn already produced content,\r\n        // swallow a trailing error frame (usually a soft rate-limit\r\n        // notice). Otherwise surface it.\r\n        const hadContent = messageStartEmitted && (totalContentChars > 0 || toolBlocks.size > 0)\r\n        if (!hadContent) deferredError = _formatCursorNativeError(result.error, params.cursorModel)\r\n        continue\r\n      }\r\n\r\n      if (result.text) {\r\n        yield* flushThinkingCarry()\r\n        yield* emitCursorVisibleText(result.text)\r\n      }\r\n\r\n      if (result.thinking) {\r\n        const split = splitCursorThinkingDelta(result.thinking, thinkingSplitState)\r\n        if (split.thinking) {\r\n          yield* flushPrintedToolText(true)\r\n          yield* emitThinkingDelta(split.thinking)\r\n        }\r\n        if (split.text) yield* emitCursorVisibleText(split.text)\r\n      }\r\n\r\n      if (result.toolCall) {\r\n        yield* flushPrintedToolText(true)\r\n        yield* flushThinkingCarry()\r\n        const tc = result.toolCall\r\n        const nativeName = _normalizeCursorToolName(tc.name, toolNameMap)\r\n        const toolName = _implNameForCursorToolName(nativeName)\r\n        const mst = emitMessageStart()\r\n        if (mst) yield mst\r\n\r\n        let entry = toolBlocks.get(tc.id)\r\n        if (!entry) {\r\n          // First slice of this tool \u2014 close any open text/thinking\r\n          // block, claim the next block index.\r\n          if (openBlock !== null) {\r\n            yield { type: 'content_block_stop', index: currentIndex }\r\n            currentIndex++\r\n            openBlock = null\r\n          }\r\n          entry = {\r\n            anthropicIndex: currentIndex,\r\n            nativeName,\r\n            name: toolName,\r\n            rawArgs: '',\r\n          }\r\n          toolBlocks.set(tc.id, entry)\r\n          currentIndex++\r\n        }\r\n\r\n        if (tc.argumentsDelta) {\r\n          // Structured protobuf snapshots resend the full args object on\r\n          // each frame. Detect a complete JSON snapshot and replace\r\n          // (overwrite) instead of concatenating \u2014 otherwise we get\r\n          // malformed JSON like `{\"cmd\":\"ls\"}{\"cmd\":\"ls\"}`.\r\n          const delta = tc.argumentsDelta.trim()\r\n          if (\r\n            delta.startsWith('{') &&\r\n            delta.endsWith('}') &&\r\n            entry.rawArgs.trim().startsWith('{')\r\n          ) {\r\n            entry.rawArgs = delta\r\n          } else {\r\n            entry.rawArgs += tc.argumentsDelta\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  yield* flushPrintedToolText(true)\r\n  yield* flushThinkingCarry()\r\n\r\n  // If a pre-content error was deferred, surface it now.\r\n  if (deferredError !== null && !messageStartEmitted) {\r\n    const mst = emitMessageStart()\r\n    if (mst) yield mst\r\n    yield* _emitErrorText(deferredError)\r\n  }\r\n  if (!sawAnyFrame && deferredError === null) {\r\n    const mst = emitMessageStart()\r\n    if (mst) yield mst\r\n    yield* _emitErrorText('Cursor returned an empty stream.')\r\n  }\r\n\r\n  // Close any still-open text/thinking block.\r\n  if (openBlock !== null) {\r\n    yield { type: 'content_block_stop', index: currentIndex }\r\n    openBlock = null\r\n  }\r\n\r\n  // Emit complete tool_use blocks after native-to-shared input adaptation.\r\n  for (const [id, entry] of toolBlocks) {\r\n    const nativeInput = _parseCursorToolArgs(entry.rawArgs)\r\n    const resolved = resolveCursorToolCall(entry.nativeName, nativeInput, {\r\n      toolSchemas,\r\n    })\r\n    const name = resolved?.implId ?? entry.name\r\n    const input = resolved?.input ?? nativeInput\r\n    yield {\r\n      type: 'content_block_start',\r\n      index: entry.anthropicIndex,\r\n      content_block: {\r\n        type: 'tool_use',\r\n        id,\r\n        name,\r\n        input: {},\r\n      },\r\n    }\r\n    yield {\r\n      type: 'content_block_delta',\r\n      index: entry.anthropicIndex,\r\n      delta: { type: 'input_json_delta', partial_json: JSON.stringify(input) },\r\n    }\r\n    yield { type: 'content_block_stop', index: entry.anthropicIndex }\r\n  }\r\n\r\n  if (!messageStartEmitted) {\r\n    const mst = emitMessageStart()\r\n    if (mst) yield mst\r\n  }\r\n\r\n  // Cursor doesn't emit token counts \u2014 estimate output from char count.\r\n  if (outputTokens === 0 && totalContentChars > 0) {\r\n    outputTokens = Math.max(1, Math.floor(totalContentChars / 4))\r\n  }\r\n\r\n  const hadToolUse = toolBlocks.size > 0\r\n  yield {\r\n    type: 'message_delta',\r\n    delta: { stop_reason: hadToolUse ? 'tool_use' : 'end_turn' },\r\n    usage: { output_tokens: outputTokens },\r\n  }\r\n  yield { type: 'message_stop' }\r\n\r\n  return {\r\n    usage: {\r\n      input_tokens: inputTokens,\r\n      output_tokens: outputTokens,\r\n      cache_read_tokens: cacheReadTokens,\r\n      cache_write_tokens: cacheWriteTokens,\r\n      thinking_tokens: 0,\r\n    },\r\n    retry: false,\r\n  }\r\n}\r\n\r\nfunction _blankUsage(): NormalizedUsage {\r\n  return {\r\n    input_tokens: 0,\r\n    output_tokens: 0,\r\n    cache_read_tokens: 0,\r\n    cache_write_tokens: 0,\r\n    thinking_tokens: 0,\r\n  }\r\n}\r\n\r\nfunction _cursorThinkClosePrefixSuffixLen(text: string): number {\r\n  const maxLen = Math.min(text.length, CURSOR_THINK_CLOSE_MARKER.length - 1)\r\n  for (let len = maxLen; len > 0; len--) {\r\n    if (CURSOR_THINK_CLOSE_MARKER.startsWith(text.slice(-len))) {\r\n      return len\r\n    }\r\n  }\r\n  return 0\r\n}\r\n\r\nfunction _stripLeadingCursorThinkTag(text: string): string {\r\n  if (text.startsWith('<think>')) return text.slice('<think>'.length)\r\n  if (text.startsWith('<thinking>')) return text.slice('<thinking>'.length)\r\n  return text\r\n}\r\n\r\nfunction _trimLeadingCursorThinkText(text: string): string {\r\n  return text.replace(/^\\r?\\n/, '')\r\n}\r\n\r\nfunction _cursorPrintedToolOpenPrefixSuffixLen(text: string): number {\r\n  const maxLen = Math.min(text.length, CURSOR_PRINTED_TOOL_CALLS_OPEN.length - 1)\r\n  for (let len = maxLen; len > 0; len--) {\r\n    if (_cursorToolMarkerPrefixMatches(text, text.length - len, CURSOR_PRINTED_TOOL_CALLS_OPEN)) {\r\n      return len\r\n    }\r\n  }\r\n  return 0\r\n}\r\n\r\nfunction _stripDanglingCursorPrintedToolText(text: string): string {\r\n  const markerIndex = _findLastCursorToolMarkerPrefixIndex(text)\r\n  if (markerIndex === -1) return text\r\n  return text.slice(0, markerIndex)\r\n}\r\n\r\nfunction _parseCursorPrintedToolCallBody(body: string): CursorPrintedToolCall | null {\r\n  const trimmed = body.trim()\r\n  if (!trimmed) return null\r\n\r\n  const firstSep = _findCursorToolMarker(trimmed, CURSOR_PRINTED_TOOL_SEP)\r\n  const header = (firstSep === -1 ? trimmed : trimmed.slice(0, firstSep)).trim()\r\n  const name = header\r\n    .split(/\\r?\\n/)\r\n    .map(line => line.trim())\r\n    .find(Boolean)\r\n  if (!name) return null\r\n\r\n  const input: Record<string, unknown> = {}\r\n  if (firstSep === -1) return { name, input }\r\n\r\n  let params = trimmed.slice(firstSep)\r\n  while (params.length > 0) {\r\n    if (!_cursorToolMarkerMatchesAt(params, 0, CURSOR_PRINTED_TOOL_SEP)) return null\r\n    params = params.slice(CURSOR_PRINTED_TOOL_SEP.length)\r\n    const nextSep = _findCursorToolMarker(params, CURSOR_PRINTED_TOOL_SEP)\r\n    const segment = nextSep === -1 ? params : params.slice(0, nextSep)\r\n    const parsed = _parseCursorPrintedToolParam(segment)\r\n    if (!parsed) return null\r\n    if (Object.prototype.hasOwnProperty.call(input, parsed.key)) return null\r\n    input[parsed.key] = parsed.value\r\n    params = nextSep === -1 ? '' : params.slice(nextSep)\r\n  }\r\n\r\n  return { name, input }\r\n}\r\n\r\nfunction _parseCursorPrintedToolParam(\r\n  segment: string,\r\n): { key: string; value: unknown } | null {\r\n  const trimmed = segment.replace(/^\\s+/, '')\r\n  const keyMatch = trimmed.match(/^([A-Za-z0-9_.-]+)/)\r\n  if (!keyMatch) return null\r\n  const key = keyMatch[1]\r\n  const rawValue = trimmed.slice(key.length).replace(/^\\s+/, '').trimEnd()\r\n  return { key, value: _parseCursorPrintedToolValue(rawValue) }\r\n}\r\n\r\nfunction _parseCursorPrintedToolValue(raw: string): unknown {\r\n  const trimmed = raw.trim()\r\n  if (!trimmed) return ''\r\n  if (trimmed === 'true') return true\r\n  if (trimmed === 'false') return false\r\n  if (trimmed === 'null') return null\r\n  if (/^-?\\d+(?:\\.\\d+)?$/.test(trimmed)) return Number(trimmed)\r\n  if (\r\n    (trimmed.startsWith('{') && trimmed.endsWith('}')) ||\r\n    (trimmed.startsWith('[') && trimmed.endsWith(']')) ||\r\n    (trimmed.startsWith('\"') && trimmed.endsWith('\"'))\r\n  ) {\r\n    try {\r\n      return JSON.parse(trimmed) as unknown\r\n    } catch {\r\n      return trimmed\r\n    }\r\n  }\r\n  return trimmed\r\n}\r\n\r\nfunction _findCursorToolMarker(\r\n  text: string,\r\n  marker: string,\r\n  fromIndex = 0,\r\n): number {\r\n  const start = Math.max(0, fromIndex)\r\n  const lastStart = text.length - marker.length\r\n  for (let i = start; i <= lastStart; i++) {\r\n    if (_cursorToolMarkerMatchesAt(text, i, marker)) return i\r\n  }\r\n  return -1\r\n}\r\n\r\nfunction _findLastCursorToolMarkerPrefixIndex(text: string): number {\r\n  for (let i = text.length - 1; i >= 0; i--) {\r\n    if (text[i] !== '<') continue\r\n    for (const marker of CURSOR_PRINTED_TOOL_MARKERS) {\r\n      if (_cursorToolMarkerPrefixMatches(text, i, marker)) return i\r\n    }\r\n  }\r\n  return -1\r\n}\r\n\r\nfunction _cursorToolMarkerMatchesAt(\r\n  text: string,\r\n  start: number,\r\n  marker: string,\r\n): boolean {\r\n  if (start < 0 || start + marker.length > text.length) return false\r\n  for (let i = 0; i < marker.length; i++) {\r\n    if (!_cursorToolMarkerCharMatches(text[start + i]!, marker[i]!)) return false\r\n  }\r\n  return true\r\n}\r\n\r\nfunction _cursorToolMarkerPrefixMatches(\r\n  text: string,\r\n  start: number,\r\n  marker: string,\r\n): boolean {\r\n  const len = text.length - start\r\n  if (len <= 0 || len > marker.length) return false\r\n  for (let i = 0; i < len; i++) {\r\n    if (!_cursorToolMarkerCharMatches(text[start + i]!, marker[i]!)) return false\r\n  }\r\n  return true\r\n}\r\n\r\nfunction _cursorToolMarkerCharMatches(actual: string, expected: string): boolean {\r\n  if (expected === '|') return actual === '|' || actual === '\\uFF5C'\r\n  if (expected === '_') return actual === '_' || actual === '\\u2581' || actual === '?'\r\n  return actual === expected\r\n}\r\n\r\nfunction _buildCursorToolNameMap(\r\n  tools: LaneProviderCallParams['tools'],\r\n): Map<string, string> {\r\n  const map = new Map<string, string>()\r\n  const selectedMcpNames = new Map<string, string | null>()\r\n\r\n  for (const tool of tools) {\r\n    const original = tool.name\r\n    if (!original) continue\r\n\r\n    const formatted = formatCursorToolName(original)\r\n    map.set(original, original)\r\n    map.set(formatted, original)\r\n    if (original.startsWith('mcp__')) {\r\n      map.set(formatted.replace(/-/g, '_'), original)\r\n    }\r\n\r\n    const reg =\r\n      getCursorRegistrationByImplId(original) ??\r\n      getCursorRegistrationByNativeName(original)\r\n    if (reg) {\r\n      map.set(reg.nativeName, reg.nativeName)\r\n      map.set(formatCursorToolName(reg.nativeName), reg.nativeName)\r\n    }\r\n\r\n    if (original.startsWith('mcp__')) {\r\n      const selected = _extractMcpSelectedToolName(original)\r\n      if (selected) {\r\n        for (const variant of _mcpSelectedToolNameVariants(selected)) {\r\n          selectedMcpNames.set(\r\n            variant,\r\n            selectedMcpNames.has(variant) ? null : original,\r\n          )\r\n        }\r\n      }\r\n      continue\r\n    }\r\n\r\n    const unformatted = unformatCursorToolName(formatted)\r\n    if (unformatted && !map.has(unformatted)) {\r\n      map.set(unformatted, original)\r\n    }\r\n  }\r\n\r\n  for (const [selected, original] of selectedMcpNames) {\r\n    if (original && !map.has(selected)) {\r\n      map.set(selected, original)\r\n    }\r\n  }\r\n\r\n  return map\r\n}\r\n\r\nfunction _mcpSelectedToolNameVariants(name: string): string[] {\r\n  return [...new Set([\r\n    name,\r\n    name.replace(/-/g, '_'),\r\n    name.replace(/_/g, '-'),\r\n  ])]\r\n}\r\n\r\nfunction _buildCursorToolSchemaMap(\r\n  tools: ProviderTool[],\r\n  toolNameMap: Map<string, string>,\r\n): Map<string, Record<string, unknown>> {\r\n  const schemas = new Map<string, Record<string, unknown>>()\r\n  for (const tool of tools) {\r\n    if (!tool.name) continue\r\n    const schema = tool.input_schema ?? {}\r\n    const names = new Set<string>([\r\n      tool.name,\r\n      formatCursorToolName(tool.name),\r\n      unformatCursorToolName(formatCursorToolName(tool.name)),\r\n    ])\r\n    if (tool.name.startsWith('mcp__')) {\r\n      names.add(formatCursorToolName(tool.name).replace(/-/g, '_'))\r\n    }\r\n\r\n    const reg =\r\n      getCursorRegistrationByImplId(tool.name) ??\r\n      getCursorRegistrationByNativeName(tool.name)\r\n    if (reg) {\r\n      names.add(reg.nativeName)\r\n      names.add(formatCursorToolName(reg.nativeName))\r\n    }\r\n\r\n    const selected = _extractMcpSelectedToolName(tool.name)\r\n    if (selected && toolNameMap.get(selected) === tool.name) {\r\n      for (const variant of _mcpSelectedToolNameVariants(selected)) {\r\n        names.add(variant)\r\n      }\r\n    }\r\n\r\n    for (const name of names) {\r\n      schemas.set(name, schema)\r\n    }\r\n  }\r\n  return schemas\r\n}\r\n\r\nfunction _extractMcpSelectedToolName(name: string): string | null {\r\n  const rest = name.startsWith('mcp__') ? name.slice('mcp__'.length) : ''\r\n  const idx = rest.indexOf('__')\r\n  if (idx < 0) return null\r\n  return rest.slice(idx + 2) || null\r\n}\r\n\r\nfunction _normalizeCursorToolName(\r\n  name: string,\r\n  toolNameMap: Map<string, string>,\r\n): string {\r\n  return (\r\n    toolNameMap.get(name) ??\r\n    toolNameMap.get(formatCursorToolName(name)) ??\r\n    unformatCursorToolName(name)\r\n  )\r\n}\r\n\r\nfunction _implNameForCursorToolName(name: string): string {\r\n  return getCursorRegistrationByNativeName(name)?.implId ?? name\r\n}\r\n\r\nfunction _parseCursorToolArgs(raw: string): Record<string, unknown> {\r\n  if (!raw.trim()) {\r\n    if (process.env.CLAUDE_CODE_DEBUG) {\r\n      // eslint-disable-next-line no-console\r\n      console.error('[cursor] _parseCursorToolArgs: empty raw args')\r\n    }\r\n    return {}\r\n  }\r\n  try {\r\n    const parsed = JSON.parse(raw) as unknown\r\n    if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\r\n      return parsed as Record<string, unknown>\r\n    }\r\n    if (process.env.CLAUDE_CODE_DEBUG) {\r\n      // eslint-disable-next-line no-console\r\n      console.error('[cursor] _parseCursorToolArgs: parsed to non-object:', typeof parsed)\r\n    }\r\n    return {}\r\n  } catch (err) {\r\n    if (process.env.CLAUDE_CODE_DEBUG) {\r\n      // eslint-disable-next-line no-console\r\n      console.error(\r\n        '[cursor] _parseCursorToolArgs: JSON parse failed:',\r\n        err instanceof Error ? err.message : String(err),\r\n        '| raw (first 200 chars):',\r\n        raw.slice(0, 200),\r\n      )\r\n    }\r\n    return {}\r\n  }\r\n}\r\n\r\nfunction* _emitErrorText(text: string): Generator<AnthropicStreamEvent> {\r\n  yield { type: 'content_block_start', index: 0, content_block: { type: 'text', text: '' } }\r\n  yield { type: 'content_block_delta', index: 0, delta: { type: 'text_delta', text } }\r\n  yield { type: 'content_block_stop', index: 0 }\r\n}\r\n\r\nasync function _openCursorHttpStream(opts: {\r\n  url: string\r\n  headers: Record<string, string>\r\n  body: Uint8Array\r\n  signal?: AbortSignal\r\n}): Promise<CursorHttpStreamResponse> {\r\n  const controller = new AbortController()\r\n  const cleanup = (): void => {\r\n    if (abortHandler && opts.signal) {\r\n      opts.signal.removeEventListener('abort', abortHandler)\r\n      abortHandler = null\r\n    }\r\n    if (timeout) {\r\n      clearTimeout(timeout)\r\n      timeout = null\r\n    }\r\n  }\r\n\r\n  let abortHandler: (() => void) | null = null\r\n  let timeout: ReturnType<typeof setTimeout> | null = setTimeout(() => {\r\n    controller.abort(new Error('Cursor HTTP request timed out'))\r\n  }, CURSOR_HTTP_TIMEOUT_MS)\r\n\r\n  abortHandler = () => {\r\n    controller.abort(opts.signal?.reason ?? new DOMException('Aborted', 'AbortError'))\r\n  }\r\n  if (opts.signal?.aborted) {\r\n    abortHandler()\r\n  } else {\r\n    opts.signal?.addEventListener('abort', abortHandler, { once: true })\r\n  }\r\n\r\n  try {\r\n    const response = await fetch(opts.url, {\r\n      method: 'POST',\r\n      headers: opts.headers,\r\n      body: opts.body,\r\n      signal: controller.signal,\r\n    })\r\n\r\n    return {\r\n      status: response.status,\r\n      body: _iterateFetchBody(response.body, cleanup),\r\n    }\r\n  } catch (error) {\r\n    cleanup()\r\n    throw error\r\n  }\r\n}\r\n\r\nasync function* _iterateFetchBody(\r\n  body: ReadableStream<Uint8Array> | null,\r\n  cleanup: () => void,\r\n): AsyncGenerator<Uint8Array> {\r\n  try {\r\n    if (!body) return\r\n    for await (const chunk of body as AsyncIterable<Uint8Array | Buffer>) {\r\n      yield chunk instanceof Uint8Array ? chunk : new Uint8Array(chunk)\r\n    }\r\n  } finally {\r\n    cleanup()\r\n  }\r\n}\r\n\r\nasync function _collectStreamText(body: AsyncIterable<Uint8Array>): Promise<string> {\r\n  const chunks: Uint8Array[] = []\r\n  let total = 0\r\n  for await (const chunk of body) {\r\n    chunks.push(chunk)\r\n    total += chunk.length\r\n  }\r\n  const merged = new Uint8Array(total)\r\n  let offset = 0\r\n  for (const chunk of chunks) {\r\n    merged.set(chunk, offset)\r\n    offset += chunk.length\r\n  }\r\n  return new TextDecoder().decode(merged)\r\n}\r\n\r\nexport function formatCursorApiError(status: number, body: string, model: string): string {\r\n  const detail = _extractCursorErrorDetail(body)\r\n  if (detail) return _formatCursorNativeError(detail, model)\r\n  if (status === 464 && !isCursorAutoModelId(model)) {\r\n    return _namedModelUnavailableMessage()\r\n  }\r\n  return `Cursor request failed (${status}).`\r\n}\r\n\r\nfunction _extractCursorErrorDetail(body: string): string {\r\n  const trimmed = body.trim()\r\n  if (!trimmed) return ''\r\n\r\n  try {\r\n    const parsed = JSON.parse(trimmed) as unknown\r\n    const detail = _extractCursorJsonErrorDetail(parsed)\r\n    return detail ? detail.slice(0, 500) : ''\r\n  } catch {\r\n    return trimmed.slice(0, 500)\r\n  }\r\n}\r\n\r\nfunction _formatCursorNativeError(detail: string, model: string): string {\r\n  const normalized = detail.trim()\r\n  if (!normalized) {\r\n    return !isCursorAutoModelId(model)\r\n      ? _namedModelUnavailableMessage()\r\n      : 'Cursor request failed.'\r\n  }\r\n\r\n  if (\r\n    !isCursorAutoModelId(model)\r\n    && (\r\n      /named models unavailable/i.test(normalized)\r\n      || /free plans can only use auto/i.test(normalized)\r\n    )\r\n  ) {\r\n    return _namedModelUnavailableMessage()\r\n  }\r\n\r\n  return normalized\r\n}\r\n\r\nfunction _extractCursorJsonErrorDetail(parsed: unknown): string | null {\r\n  if (parsed == null || typeof parsed !== 'object' || Array.isArray(parsed)) {\r\n    return typeof parsed === 'string' && parsed.trim() ? parsed.trim() : null\r\n  }\r\n\r\n  const record = parsed as Record<string, unknown>\r\n  const topLevelDetails =\r\n    record.details != null\r\n    && typeof record.details === 'object'\r\n    && !Array.isArray(record.details)\r\n      ? record.details as Record<string, unknown>\r\n      : null\r\n  const topLevelTitle =\r\n    topLevelDetails && typeof topLevelDetails.title === 'string'\r\n      ? topLevelDetails.title.trim()\r\n      : ''\r\n  const topLevelDetail =\r\n    topLevelDetails && typeof topLevelDetails.detail === 'string'\r\n      ? topLevelDetails.detail.trim()\r\n      : ''\r\n  if (topLevelTitle || topLevelDetail) {\r\n    return [topLevelTitle, topLevelDetail].filter(Boolean).join('\\n')\r\n  }\r\n\r\n  const errorValue = record.error\r\n  const nestedError =\r\n    errorValue != null\r\n    && typeof errorValue === 'object'\r\n    && !Array.isArray(errorValue)\r\n      ? errorValue as Record<string, unknown>\r\n      : null\r\n  const detailFromDebug =\r\n    nestedError && Array.isArray(nestedError.details)\r\n      ? nestedError.details\r\n          .map(detail => {\r\n            if (!detail || typeof detail !== 'object') return ''\r\n            const debug = 'debug' in detail ? detail.debug : null\r\n            if (!debug || typeof debug !== 'object') return ''\r\n            const debugRecord = debug as Record<string, unknown>\r\n            const debugDetails =\r\n              debugRecord.details != null\r\n              && typeof debugRecord.details === 'object'\r\n              && !Array.isArray(debugRecord.details)\r\n                ? debugRecord.details as Record<string, unknown>\r\n                : null\r\n            const title =\r\n              debugDetails && typeof debugDetails.title === 'string'\r\n                ? debugDetails.title.trim()\r\n                : ''\r\n            const body =\r\n              debugDetails && typeof debugDetails.detail === 'string'\r\n                ? debugDetails.detail.trim()\r\n                : ''\r\n            if (title || body) return [title, body].filter(Boolean).join('\\n')\r\n            return typeof debugRecord.error === 'string' ? debugRecord.error.trim() : ''\r\n          })\r\n          .find(Boolean) ?? null\r\n      : null\r\n  if (detailFromDebug) return detailFromDebug\r\n\r\n  const nestedMessage =\r\n    nestedError && typeof nestedError.message === 'string'\r\n      ? nestedError.message.trim()\r\n      : ''\r\n  if (nestedMessage) return nestedMessage\r\n\r\n  const topLevelMessage =\r\n    typeof record.message === 'string'\r\n      ? record.message.trim()\r\n      : ''\r\n  if (topLevelMessage) return topLevelMessage\r\n\r\n  const stringError =\r\n    typeof errorValue === 'string'\r\n      ? errorValue.trim()\r\n      : ''\r\n  return stringError || null\r\n}\r\n\r\nfunction _namedModelUnavailableMessage(): string {\r\n  return [\r\n    'Cursor rejected the request: named Claude models are not available on the free plan.',\r\n    'Pick \"Auto\" in the model picker, or upgrade your Cursor plan, to keep using Cursor as the provider.',\r\n  ].join('\\n')\r\n}\r\n\r\nexport const cursorLane = new CursorLane()\r\n\r\nfunction _looksLikeFreshCursorConversation(\r\n  messages: LaneProviderCallParams['messages'],\r\n): boolean {\r\n  return messages.length <= 1 && messages.every(message => message.role === 'user')\r\n}\r\n\r\nfunction _newCursorConversationId(): string {\r\n  if (typeof globalThis.crypto?.randomUUID === 'function') {\r\n    return globalThis.crypto.randomUUID()\r\n  }\r\n  return `cursor-${Date.now()}-${Math.random().toString(16).slice(2)}`\r\n}\r\n", "/**\r\n * Cursor Lane entry point.\r\n *\r\n * Auth source: the blob written by `/login cursor` at\r\n * `~/.config/claude-code/provider-keys.json:cursor_oauth`. `/login cursor`\r\n * now uses Cursor's native browser login (`loginDeepControl` \u2192 `auth/poll`)\r\n * and stores the resulting access/refresh tokens here. Legacy manual token\r\n * imports may still include a machineId; otherwise `buildCursorHeaders`\r\n * derives one from the token (same SHA-256 scheme the reference uses).\r\n */\r\n\r\nexport { cursorLane, CursorLane } from './loop.js'\r\nexport {\r\n  CURSOR_AUTO_MODEL_ID,\r\n  CURSOR_AUTO_WIRE_MODEL_ID,\r\n  CURSOR_MODEL_GROUPS,\r\n  CURSOR_MODELS,\r\n  isCursorModel,\r\n  resolveCursorModelId,\r\n} from './catalog.js'\r\nexport { buildCursorBody } from './request.js'\r\nexport { buildCursorHeaders, cursorChecksum } from './checksum.js'\r\n\r\nimport { cursorLane } from './loop.js'\r\nimport { registerLane } from '../dispatcher.js'\r\nimport { loadProviderKey } from '../../services/api/auth/api_key_manager.js'\r\n\r\nexport interface CursorLaneOptions {\r\n  accessToken?: string\r\n  /** Optional \u2014 inferred from the token when absent (see checksum.ts). */\r\n  machineId?: string\r\n}\r\n\r\nexport function initCursorLane(opts?: CursorLaneOptions): void {\r\n  let accessToken = opts?.accessToken\r\n  let machineId = opts?.machineId\r\n\r\n  if (!accessToken || !machineId) {\r\n    try {\r\n      const raw = loadProviderKey('cursor_oauth')\r\n      if (raw) {\r\n        const parsed = JSON.parse(raw) as {\r\n          accessToken?: string\r\n          meta?: { machineId?: string }\r\n        }\r\n        if (!accessToken && parsed.accessToken) accessToken = parsed.accessToken\r\n        if (!machineId && parsed.meta?.machineId) machineId = parsed.meta.machineId\r\n      }\r\n    } catch {\r\n      // ignore \u2014 the lane will start unhealthy and /login cursor repairs it\r\n    }\r\n  }\r\n\r\n  cursorLane.configure({\r\n    accessToken: accessToken ?? null,\r\n    machineId: machineId ?? null,\r\n  })\r\n  registerLane(cursorLane)\r\n}\r\n", "/**\n * Cline Lane\n *\n * Native transport for Cline's own gateway:\n *   - chat:   POST /api/v1/chat/completions\n *   - models: GET  /api/v1/ai/cline/models\n *\n * Auth path:\n *   - Cline OAuth session -> Authorization: Bearer workos:<token>\n *\n * Provider-scoped routing is intentional. Cline exposes upstream model ids\n * like `anthropic/claude-sonnet-4.6` and `openai/gpt-5.4`; selecting this\n * lane by model name alone would collide with other native lanes. The shim\n * routes provider `cline` here explicitly.\n */\n\nimport type {\n  AnthropicStreamEvent,\n  ModelInfo,\n  SystemBlock,\n} from '../../services/api/providers/base_provider.js'\nimport type {\n  Lane,\n  LaneProviderCallParams,\n  LaneRunContext,\n  LaneRunResult,\n  NormalizedUsage,\n} from '../types.js'\nimport {\n  anthropicMessagesToOpenAI,\n  anthropicToolsToOpenAI,\n  type OpenAIMessage,\n  type OpenAITool,\n} from '../../services/api/adapters/anthropic_to_openai.js'\nimport {\n  openAIStreamToAnthropicEvents,\n  type OpenAIChatCompletionChunk,\n} from '../../services/api/adapters/openai_to_anthropic.js'\nimport { getProviderBaseUrl } from '../../utils/auth.js'\nimport { loadProviderKey } from '../../services/api/auth/api_key_manager.js'\nimport { refreshClineOAuth } from '../../services/api/auth/oauth_services.js'\nimport {\n  OPENAI_COMPAT_TOOL_USAGE_RULES,\n  appendStrictParamsHint,\n} from '../shared/mcp_bridge.js'\nimport {\n  applyClineReasoningToRequest,\n  getClineRequestEffort,\n  isClineThinkingModel,\n} from '../../utils/model/clineThinking.js'\n\ninterface StoredClineOAuthBlob {\n  accessToken?: string\n  refreshToken?: string\n  expiresAt?: number\n}\n\ninterface ClineAuthSession {\n  token: string\n}\n\ninterface RawClineModelInfo {\n  id?: string\n  name?: string\n  description?: string | null\n  supportsReasoning?: boolean | null\n  supportsThinking?: boolean | null\n  supports_reasoning?: boolean | null\n  supports_thinking?: boolean | null\n  capabilities?: string[] | null\n  model_info?: {\n    supports_reasoning?: boolean | null\n    supportsThinking?: boolean | null\n    supportsReasoning?: boolean | null\n    capabilities?: string[] | null\n  } | null\n  context_length?: number | null\n  top_provider?: {\n    context_length?: number | null\n    max_completion_tokens?: number | null\n  } | null\n  architecture?: {\n    modality?: string | string[] | null\n    input_modalities?: string[] | null\n    output_modalities?: string[] | null\n  } | null\n  supported_parameters?: string[] | null\n}\n\ninterface RecommendedModelEntry {\n  id?: string\n  name?: string\n  tags?: string[]\n  description?: string\n}\n\ninterface RecommendedModelResponse {\n  recommended?: RecommendedModelEntry[]\n  free?: RecommendedModelEntry[]\n}\n\ninterface ClineModelsResponse {\n  data?: RawClineModelInfo[]\n  models?: RawClineModelInfo[]\n}\n\nconst CLINE_MODELS_CACHE_TTL_MS = 5 * 60_000\nconst CLINE_REFRESH_BUFFER_MS = 5 * 60_000\nconst CLINE_CONTEXT_EXCEEDED_MARKERS = [\n  'context length',\n  'context_length_exceeded',\n  'prompt is too long',\n  'maximum context',\n]\n\nconst CLINE_FALLBACK_MODELS: ModelInfo[] = [\n  { id: 'kwaipilot/kat-coder-pro', name: 'Kat Coder Pro' },\n  { id: 'minimax/minimax-m2.7', name: 'MiniMax M2.7' },\n  { id: 'minimax/minimax-m2.5', name: 'MiniMax M2.5' },\n  { id: 'arcee-ai/trinity-large-preview:free', name: 'Arcee Trinity Large Preview' },\n  { id: 'z-ai/glm-5', name: 'GLM-5' },\n  { id: 'anthropic/claude-opus-4.8', name: 'Claude Opus 4.8' },\n  { id: 'openai/gpt-5.5', name: 'GPT-5.5' },\n  { id: 'deepseek/deepseek-v4-pro', name: 'DeepSeek V4 Pro' },\n  { id: 'anthropic/claude-sonnet-4.6', name: 'Claude Sonnet 4.6' },\n  { id: 'anthropic/claude-opus-4.7', name: 'Claude Opus 4.7' },\n  { id: 'anthropic/claude-opus-4.6', name: 'Claude Opus 4.6' },\n  { id: 'openai/gpt-5.4', name: 'GPT-5.4' },\n  { id: 'openai/gpt-5.3-codex', name: 'GPT-5.3 Codex' },\n  { id: 'openai/gpt-5-codex', name: 'GPT-5 Codex' },\n  { id: 'google/gemini-3.1-pro-preview', name: 'Gemini 3.1 Pro Preview' },\n  { id: 'google/gemini-3.1-flash-lite-preview', name: 'Gemini 3.1 Flash Lite Preview' },\n  { id: 'qwen/qwen3-coder:exacto', name: 'Qwen3 Coder Exacto' },\n  { id: 'qwen/qwen3-coder', name: 'Qwen3 Coder' },\n  { id: 'moonshotai/kimi-k2.6', name: 'Kimi K2.6' },\n  { id: 'moonshotai/kimi-k2:exacto', name: 'Kimi K2 Exacto' },\n  { id: 'moonshotai/kimi-k2', name: 'Kimi K2' },\n  { id: 'z-ai/glm-4.6:exacto', name: 'GLM 4.6 Exacto' },\n  { id: 'deepseek/deepseek-v3.1-terminus:exacto', name: 'DeepSeek V3.1 Terminus Exacto' },\n  { id: 'deepseek/deepseek-chat', name: 'DeepSeek Chat' },\n  { id: 'x-ai/grok-code-fast-1', name: 'Grok Code Fast 1' },\n]\n\nconst CLINE_FALLBACK_FREE_MODEL_IDS = new Set([\n  'kwaipilot/kat-coder-pro',\n  'moonshotai/kimi-k2.6',\n  'minimax/minimax-m2.5',\n  'arcee-ai/trinity-large-preview:free',\n  'z-ai/glm-5',\n].map(normalizeClineModelId))\n\nconst CLINE_FALLBACK_RECOMMENDED_MODEL_IDS = new Set([\n  'minimax/minimax-m2.7',\n  'google/gemini-3.1-pro-preview',\n  'anthropic/claude-sonnet-4.6',\n  'anthropic/claude-opus-4.8',\n  'openai/gpt-5.5',\n  'deepseek/deepseek-v4-pro',\n  'anthropic/claude-opus-4.6',\n  'openai/gpt-5.3-codex',\n  'anthropic/claude-opus-4.7',\n  'openai/gpt-5.4',\n  'openai/gpt-5-codex',\n].map(normalizeClineModelId))\n\nconst CLINE_LATEST_MODEL_IDS = new Set([\n  'minimax/minimax-m2.7',\n  'google/gemini-3.1-pro-preview',\n  'google/gemini-3.1-flash-lite-preview',\n  'anthropic/claude-sonnet-4.6',\n  'anthropic/claude-opus-4.8',\n  'anthropic/claude-opus-4.6',\n  'anthropic/claude-opus-4.7',\n  'openai/gpt-5.5',\n  'openai/gpt-5.4',\n  'openai/gpt-5.3-codex',\n  'openai/gpt-5-codex',\n  'z-ai/glm-5',\n  'moonshotai/kimi-k2.6',\n  'deepseek/deepseek-v3.1-terminus:exacto',\n].map(normalizeClineModelId))\n\nconst CLINE_VALUE_MODEL_IDS = new Set([\n  'minimax/minimax-m2.7',\n  'qwen/qwen3-coder:exacto',\n  'qwen/qwen3-coder',\n  'moonshotai/kimi-k2.6',\n  'moonshotai/kimi-k2:exacto',\n  'moonshotai/kimi-k2',\n  'z-ai/glm-4.6:exacto',\n  'z-ai/glm-4.6',\n  'deepseek/deepseek-v3.1-terminus:exacto',\n  'deepseek/deepseek-chat',\n  'google/gemini-3.1-flash-lite-preview',\n  'x-ai/grok-code-fast-1',\n  'kwaipilot/kat-coder-pro',\n  'minimax/minimax-m2.5',\n].map(normalizeClineModelId))\n\nexport class ClineLane implements Lane {\n  readonly name = 'cline'\n  readonly displayName = 'Cline'\n\n  private oauthTokenHint: string | null = null\n  private modelCache: { models: ModelInfo[]; at: number } | null = null\n  private reasoningModelIds = new Set<string>()\n  private refreshInFlight: Promise<string | null> | null = null\n\n  configure(opts: { oauthToken?: string | null }): void {\n    if (opts.oauthToken !== undefined) this.oauthTokenHint = opts.oauthToken || null\n  }\n\n  invalidateModelCache(): void {\n    this.modelCache = null\n  }\n\n  supportsModel(_model: string): boolean {\n    // Cline's catalog overlaps other providers' ids. Provider-scoped routing\n    // from providerShim is the only authoritative selector for this lane.\n    return false\n  }\n\n  isHealthy(): boolean {\n    return !!this._peekStoredOAuthCredential()\n  }\n\n  resolveModel(model: string): string {\n    return model\n  }\n\n  dispose(): void {}\n\n  async *run(_context: LaneRunContext): AsyncGenerator<AnthropicStreamEvent, LaneRunResult> {\n    throw new Error(\n      'ClineLane.run (lane-owns-loop) is not wired yet - use streamAsProvider via LaneBackedProvider.',\n    )\n  }\n\n  async listModels(): Promise<ModelInfo[]> {\n    if (this.modelCache && Date.now() - this.modelCache.at < CLINE_MODELS_CACHE_TTL_MS) {\n      return this.modelCache.models\n    }\n\n    const apiRoot = this._apiRoot()\n    const auth = await this._resolveAuth().catch(() => null)\n    const discoveryHeaders = this._buildDiscoveryHeaders(auth)\n    const [modelsResult, recommendedResult] = await Promise.allSettled([\n      fetch(`${apiRoot}/ai/cline/models`, {\n        method: 'GET',\n        headers: discoveryHeaders,\n      }),\n      fetch(`${apiRoot}/ai/cline/recommended-models`, {\n        method: 'GET',\n        headers: discoveryHeaders,\n      }),\n    ])\n\n    const recommendedIds = new Set<string>()\n    const freeIds = new Set<string>()\n    const recommendedModels: ModelInfo[] = []\n\n    if (recommendedResult.status === 'fulfilled' && recommendedResult.value.ok) {\n      try {\n        const payload = await recommendedResult.value.json() as RecommendedModelResponse\n        for (const entry of payload.recommended ?? []) {\n          const model = recommendedEntryToModel(entry)\n          if (model) {\n            recommendedIds.add(model.id)\n            recommendedModels.push(model)\n          }\n        }\n        for (const entry of payload.free ?? []) {\n          const model = recommendedEntryToModel(entry)\n          if (model) {\n            freeIds.add(model.id)\n            recommendedModels.push(model)\n          }\n        }\n      } catch {\n        // Ignore recommended-model parse failures and keep the base catalog.\n      }\n    }\n\n    let models: ModelInfo[] = []\n    if (modelsResult.status === 'fulfilled' && modelsResult.value.ok) {\n      try {\n        const payload = await modelsResult.value.json() as ClineModelsResponse\n        models = extractClineModelData(payload)\n          .filter((model): model is RawClineModelInfo & { id: string } =>\n            typeof model.id === 'string' && model.id.length > 0,\n          )\n          .map((model) => ({\n            id: model.id,\n            name: model.name ?? model.id,\n            contextWindow: model.context_length ?? model.top_provider?.context_length ?? undefined,\n            supportsToolCalling: (\n              Array.isArray(model.supported_parameters)\n              ? model.supported_parameters.includes('tools') || model.supported_parameters.includes('tool_choice')\n              : true\n            ),\n            tags: rawClineModelSupportsReasoning(model) ? ['thinking'] : undefined,\n          }))\n      } catch {\n        models = []\n      }\n    }\n\n    models.push(...recommendedModels)\n\n    if (models.length === 0) {\n      models = [...CLINE_FALLBACK_MODELS]\n    }\n\n    models = this._curateModels(models, recommendedIds, freeIds)\n    this.reasoningModelIds = new Set(\n      models\n        .filter(model => model.tags?.some(tag => tag === 'thinking' || tag === 'reasoning'))\n        .map(model => normalizeClineModelId(model.id)),\n    )\n\n    this.modelCache = { models, at: Date.now() }\n    return models\n  }\n\n  private _curateModels(\n    models: ModelInfo[],\n    recommendedIds: Set<string>,\n    freeIds: Set<string>,\n  ): ModelInfo[] {\n    const normalizedRecommended = new Set(\n      [...recommendedIds].map((id) => normalizeClineModelId(id)),\n    )\n    const normalizedFree = new Set(\n      [...freeIds].map((id) => normalizeClineModelId(id)),\n    )\n    const useFallbackSignals = normalizedRecommended.size === 0 && normalizedFree.size === 0\n\n    const originalRank = new Map<string, number>()\n    const byId = new Map<string, ModelInfo>()\n    models.forEach((model, index) => {\n      const normalizedId = normalizeClineModelId(model.id)\n      if (!originalRank.has(normalizedId)) originalRank.set(normalizedId, index)\n      const previous = byId.get(normalizedId)\n      byId.set(normalizedId, previous ? mergeClineModelInfo(previous, model) : model)\n    })\n    const uniqueModels = Array.from(byId.values())\n\n    uniqueModels.sort((left, right) => {\n      const scoreDiff =\n        scoreClineModel(right, normalizedRecommended, normalizedFree, useFallbackSignals)\n        - scoreClineModel(left, normalizedRecommended, normalizedFree, useFallbackSignals)\n      if (scoreDiff !== 0) return scoreDiff\n\n      const leftRank = originalRank.get(normalizeClineModelId(left.id)) ?? Number.MAX_SAFE_INTEGER\n      const rightRank = originalRank.get(normalizeClineModelId(right.id)) ?? Number.MAX_SAFE_INTEGER\n      if (leftRank !== rightRank) return leftRank - rightRank\n\n      const leftContext = left.contextWindow ?? 0\n      const rightContext = right.contextWindow ?? 0\n      if (leftContext !== rightContext) return rightContext - leftContext\n\n      const leftName = (left.name ?? left.id).toLowerCase()\n      const rightName = (right.name ?? right.id).toLowerCase()\n      if (leftName !== rightName) return leftName.localeCompare(rightName)\n      return left.id.localeCompare(right.id)\n    })\n\n    return uniqueModels\n      .map((model) => {\n        const tags = mergeClineTags(\n          model.tags,\n          getClineModelTags(model.id, normalizedRecommended, normalizedFree, useFallbackSignals),\n          clineModelSupportsReasoning(model.id) ? ['thinking'] : undefined,\n        )\n        return tags.length > 0 ? { ...model, tags } : model\n      })\n  }\n\n  async *streamAsProvider(\n    params: LaneProviderCallParams,\n  ): AsyncGenerator<AnthropicStreamEvent, NormalizedUsage> {\n    const auth = await this._resolveAuth()\n    if (!auth) {\n      throw new Error('Cline lane: not authenticated. Run `/login cline` to authenticate.')\n    }\n\n    const preserveCacheControl = this._supportsPromptCache(params.model)\n    const system = this._prependToolUsageRules(params.system, params.tools.length > 0)\n    const messages = anthropicMessagesToOpenAI(\n      params.messages,\n      system,\n      { preserveCacheControl },\n    )\n    const tools = this._buildTools(params.tools)\n    const body = this._buildRequestBody({\n      model: params.model,\n      messages,\n      tools,\n      maxTokens: params.max_tokens,\n      temperature: params.temperature,\n      stopSequences: params.stop_sequences,\n      thinking: params.thinking,\n    })\n\n    let response: Response\n    try {\n      response = await fetch(`${this._apiRoot()}/chat/completions`, {\n        method: 'POST',\n        headers: this._buildHeaders(auth),\n        body: JSON.stringify(body),\n        signal: params.signal,\n      })\n    } catch (error: unknown) {\n      const message = error instanceof Error ? error.message : String(error)\n      yield* emitErrorTurn(`cline API connection error: ${message}`)\n      return blankUsage()\n    }\n\n    if (!response.ok) {\n      const errText = await response.text().catch(() => '')\n      const lowered = errText.toLowerCase()\n      const isPromptTooLong = CLINE_CONTEXT_EXCEEDED_MARKERS.some((marker) => lowered.includes(marker))\n      const headline = isPromptTooLong\n        ? `Prompt is too long (cline ${response.status})`\n        : `cline API error ${response.status}`\n      yield* emitErrorTurn(`${headline}: ${errText.slice(0, 500)}`)\n      return blankUsage()\n    }\n\n    if (!response.body) {\n      throw new Error('Cline lane: empty response body')\n    }\n\n    let finalUsage = blankUsage()\n    const chunkStream = this._normalizeChunkStream(this._parseSSE(response.body))\n\n    for await (const event of openAIStreamToAnthropicEvents(chunkStream)) {\n      if (event.type === 'message_delta' && event.usage) {\n        finalUsage = {\n          input_tokens: event.usage.input_tokens ?? finalUsage.input_tokens,\n          output_tokens: event.usage.output_tokens ?? finalUsage.output_tokens,\n          cache_read_tokens: event.usage.cache_read_input_tokens ?? finalUsage.cache_read_tokens,\n          cache_write_tokens: event.usage.cache_creation_input_tokens ?? finalUsage.cache_write_tokens,\n          thinking_tokens: 0,\n        }\n      }\n      yield event\n    }\n\n    return finalUsage\n  }\n\n  private _buildTools(tools: LaneProviderCallParams['tools']): OpenAITool[] {\n    return anthropicToolsToOpenAI(tools).map((tool) => ({\n      ...tool,\n      function: {\n        ...tool.function,\n        description: appendStrictParamsHint(\n          tool.function.description ?? '',\n          tool.function.parameters,\n        ),\n      },\n    }))\n  }\n\n  private _buildRequestBody(opts: {\n    model: string\n    messages: OpenAIMessage[]\n    tools: OpenAITool[]\n    maxTokens: number\n    temperature?: number\n    stopSequences?: string[]\n    thinking?: LaneProviderCallParams['thinking']\n  }): Record<string, unknown> {\n    const body: Record<string, unknown> = {\n      model: opts.model,\n      messages: opts.messages,\n      stream: true,\n      stream_options: { include_usage: true },\n      max_tokens: opts.maxTokens,\n      ...(opts.tools.length > 0 && {\n        tools: opts.tools,\n        tool_choice: 'auto',\n      }),\n      ...(opts.temperature !== undefined && { temperature: opts.temperature }),\n      ...(opts.stopSequences && opts.stopSequences.length > 0 && { stop: opts.stopSequences }),\n    }\n\n    if (this._modelSupportsReasoning(opts.model)) {\n      applyClineReasoningToRequest(body, getClineRequestEffort(opts.model))\n    }\n\n    return body\n  }\n\n  private _modelSupportsReasoning(model: string): boolean {\n    return (\n      this.reasoningModelIds.has(normalizeClineModelId(model))\n      || clineModelSupportsReasoning(model)\n    )\n  }\n\n  private _prependToolUsageRules(\n    system: string | SystemBlock[],\n    hasTools: boolean,\n  ): string | SystemBlock[] {\n    if (!hasTools) return system\n    if (typeof system === 'string') {\n      return system\n        ? `${OPENAI_COMPAT_TOOL_USAGE_RULES}\\n${system}`\n        : OPENAI_COMPAT_TOOL_USAGE_RULES\n    }\n\n    const blocks = [...system]\n    if (blocks.length === 0) {\n      return [{ type: 'text', text: OPENAI_COMPAT_TOOL_USAGE_RULES }]\n    }\n\n    const first = blocks[0] as SystemBlock & { cache_control?: { type: string } }\n    return [\n      { ...first, text: `${OPENAI_COMPAT_TOOL_USAGE_RULES}\\n${first.text}` },\n      ...blocks.slice(1),\n    ]\n  }\n\n  private _buildHeaders(auth: ClineAuthSession): Record<string, string> {\n    const headers: Record<string, string> = {\n      'Content-Type': 'application/json',\n      Accept: 'text/event-stream',\n      'HTTP-Referer': 'https://github.com/AbdoKnbGit/tau',\n      'X-Title': 'Tau',\n    }\n\n    const workosToken = clineBearerToken(auth.token)\n    headers.Authorization = `Bearer ${workosToken}`\n    headers.workos = workosToken\n    return headers\n  }\n\n  private _buildDiscoveryHeaders(\n    auth: ClineAuthSession | null,\n  ): Record<string, string> {\n    const headers: Record<string, string> = {\n      Accept: 'application/json',\n    }\n    if (!auth) return headers\n\n    const workosToken = clineBearerToken(auth.token)\n    headers.Authorization = `Bearer ${workosToken}`\n    headers.workos = workosToken\n    return headers\n  }\n\n  private _supportsPromptCache(model: string): boolean {\n    const normalized = model.toLowerCase()\n    return (\n      normalized.startsWith('anthropic/')\n      || normalized.startsWith('openai/')\n      || normalized.startsWith('google/')\n      || normalized.includes('claude-')\n      || normalized.includes('gemini-')\n      || normalized.includes('gpt-5')\n    )\n  }\n\n  private _peekStoredOAuthCredential(): StoredClineOAuthBlob | null {\n    try {\n      const raw = loadProviderKey('cline_oauth')\n      if (!raw) {\n        if (this.oauthTokenHint) return { accessToken: this.oauthTokenHint }\n        return null\n      }\n      const parsed = JSON.parse(raw) as StoredClineOAuthBlob\n      if (\n        (typeof parsed.accessToken === 'string' && parsed.accessToken.length > 0)\n        || (typeof parsed.refreshToken === 'string' && parsed.refreshToken.length > 0)\n      ) {\n        return parsed\n      }\n      return null\n    } catch {\n      return this.oauthTokenHint ? { accessToken: this.oauthTokenHint } : null\n    }\n  }\n\n  private async _resolveAuth(): Promise<ClineAuthSession | null> {\n    const oauth = await this._getValidOAuthToken()\n    if (!oauth) return null\n    return { token: oauth }\n  }\n\n  private async _getValidOAuthToken(): Promise<string | null> {\n    const stored = this._peekStoredOAuthCredential()\n    if (!stored) return null\n\n    const accessToken = typeof stored.accessToken === 'string' ? stored.accessToken : null\n    const refreshToken = typeof stored.refreshToken === 'string' ? stored.refreshToken : null\n    const expiresAt = typeof stored.expiresAt === 'number' ? stored.expiresAt : null\n    const needsRefresh = !accessToken || (expiresAt !== null && Date.now() > expiresAt - CLINE_REFRESH_BUFFER_MS)\n\n    if (!needsRefresh) return accessToken\n    if (!refreshToken) return accessToken\n\n    if (!this.refreshInFlight) {\n      this.refreshInFlight = refreshClineOAuth(refreshToken)\n        .then((token) => {\n          this.oauthTokenHint = token\n          return token\n        })\n        .catch(() => null)\n        .finally(() => {\n          this.refreshInFlight = null\n        })\n    }\n\n    const refreshed = await this.refreshInFlight\n    if (refreshed) return refreshed\n\n    const currentStillValid = accessToken && (\n      expiresAt === null || Date.now() <= expiresAt\n    )\n    return currentStillValid ? accessToken : null\n  }\n\n  private _apiRoot(): string {\n    return `${this._apiBase()}/api/v1`\n  }\n\n  private _apiBase(): string {\n    const baseUrl = getProviderBaseUrl('cline').replace(/\\/+$/, '')\n    return baseUrl\n      .replace(/\\/api\\/v1$/i, '')\n      .replace(/\\/v1$/i, '')\n  }\n\n  private async *_parseSSE(\n    body: ReadableStream<Uint8Array>,\n  ): AsyncGenerator<OpenAIChatCompletionChunk> {\n    const reader = body.getReader()\n    const decoder = new TextDecoder()\n    let buffer = ''\n\n    try {\n      while (true) {\n        const { done, value } = await reader.read()\n        if (done) break\n        buffer += decoder.decode(value, { stream: true })\n\n        const lines = buffer.split('\\n')\n        buffer = lines.pop() ?? ''\n\n        for (const rawLine of lines) {\n          const line = rawLine.trim()\n          if (!line.startsWith('data:')) continue\n          const payload = line.slice(5).trim()\n          if (!payload || payload === '[DONE]') continue\n          try {\n            yield JSON.parse(payload) as OpenAIChatCompletionChunk\n          } catch {\n            // Ignore malformed chunks and keep draining the stream.\n          }\n        }\n      }\n\n      const trailing = buffer.trim()\n      if (trailing.startsWith('data:')) {\n        const payload = trailing.slice(5).trim()\n        if (payload && payload !== '[DONE]') {\n          try {\n            yield JSON.parse(payload) as OpenAIChatCompletionChunk\n          } catch {\n            // Ignore malformed trailing chunks.\n          }\n        }\n      }\n    } finally {\n      reader.releaseLock()\n    }\n  }\n\n  private async *_normalizeChunkStream(\n    chunks: AsyncIterable<OpenAIChatCompletionChunk>,\n  ): AsyncGenerator<OpenAIChatCompletionChunk> {\n    for await (const chunk of chunks) {\n      const choices = Array.isArray(chunk.choices)\n        ? chunk.choices.map((choice) => {\n          const delta = { ...(choice.delta ?? {}) } as OpenAIChatCompletionChunk['choices'][number]['delta'] & {\n            reasoning?: string\n          }\n          if (typeof delta.reasoning === 'string' && !delta.reasoning_content) {\n            delta.reasoning_content = delta.reasoning\n          }\n          return { ...choice, delta }\n        })\n        : chunk.choices\n\n      yield { ...chunk, choices }\n    }\n  }\n}\n\nfunction normalizeClineModelId(id: string): string {\n  return id.toLowerCase().replace(/[._]/g, '-')\n}\n\nfunction extractClineModelData(payload: unknown): RawClineModelInfo[] {\n  if (Array.isArray(payload)) return payload as RawClineModelInfo[]\n  if (!payload || typeof payload !== 'object') return []\n  const record = payload as ClineModelsResponse\n  if (Array.isArray(record.data)) return record.data\n  if (Array.isArray(record.models)) return record.models\n  return []\n}\n\nfunction rawClineModelSupportsReasoning(model: RawClineModelInfo): boolean {\n  if (\n    model.supportsReasoning === true\n    || model.supportsThinking === true\n    || model.supports_reasoning === true\n    || model.supports_thinking === true\n    || model.model_info?.supportsReasoning === true\n    || model.model_info?.supportsThinking === true\n    || model.model_info?.supports_reasoning === true\n  ) {\n    return true\n  }\n\n  const capabilities = [\n    ...(model.capabilities ?? []),\n    ...(model.model_info?.capabilities ?? []),\n  ].map(capability => capability.toLowerCase())\n\n  return capabilities.includes('reasoning') || capabilities.includes('thinking')\n}\n\nfunction recommendedEntryToModel(entry: RecommendedModelEntry): ModelInfo | null {\n  if (typeof entry.id !== 'string' || entry.id.length === 0) return null\n  const tags = Array.isArray(entry.tags)\n    ? entry.tags.filter(tag => tag === 'thinking' || tag === 'reasoning')\n    : []\n  return {\n    id: entry.id,\n    name: typeof entry.name === 'string' && entry.name.length > 0 ? entry.name : entry.id,\n    ...(tags.length > 0 && { tags }),\n  }\n}\n\nfunction mergeClineTags(\n  ...tagGroups: Array<readonly string[] | undefined>\n): string[] {\n  const merged = new Set<string>()\n  for (const group of tagGroups) {\n    if (!group) continue\n    for (const tag of group) {\n      merged.add(tag)\n    }\n  }\n  return Array.from(merged)\n}\n\nfunction mergeClineModelInfo(left: ModelInfo, right: ModelInfo): ModelInfo {\n  const tags = new Set<string>([\n    ...(left.tags ?? []),\n    ...(right.tags ?? []),\n  ])\n  return {\n    ...left,\n    ...right,\n    name: right.name && right.name !== right.id ? right.name : left.name,\n    contextWindow: right.contextWindow ?? left.contextWindow,\n    supportsToolCalling: right.supportsToolCalling ?? left.supportsToolCalling,\n    tags: tags.size > 0 ? [...tags] : undefined,\n  }\n}\n\nfunction isLikelyLatestClineModel(normalizedId: string): boolean {\n  return (\n    normalizedId.includes('gpt-5-4')\n    || normalizedId.includes('gpt-5-5')\n    || normalizedId.includes('gpt-5-3')\n    || normalizedId.includes('gpt-5-codex')\n    || normalizedId.includes('claude-opus-4-8')\n    || normalizedId.includes('claude-sonnet-4-6')\n    || normalizedId.includes('claude-opus-4-7')\n    || normalizedId.includes('claude-opus-4-6')\n    || normalizedId.includes('gemini-3-1')\n    || normalizedId.includes('glm-5')\n    || normalizedId.includes('deepseek-v3-1')\n    || normalizedId.includes('minimax-m2-7')\n    || normalizedId.includes('kimi-k2-6')\n    || normalizedId.includes('kimi-k2-5')\n    || normalizedId.includes('0905')\n  )\n}\n\nfunction isLikelyValueClineModel(normalizedId: string): boolean {\n  return (\n    normalizedId.includes(':exacto')\n    || normalizedId.includes('qwen3-coder')\n    || normalizedId.includes('minimax-m2-7')\n    || normalizedId.includes('kimi-k2-6')\n    || normalizedId.includes('kimi-k2')\n    || normalizedId.includes('glm-4-6')\n    || normalizedId.includes('deepseek-chat')\n    || normalizedId.includes('deepseek-v3-1')\n    || normalizedId.includes('flash-lite')\n    || normalizedId.includes('flash')\n    || normalizedId.includes('mini')\n    || normalizedId.includes('haiku')\n    || normalizedId.includes('kat-coder')\n    || normalizedId.includes('grok-code-fast')\n  )\n}\n\nfunction scoreClineModel(\n  model: ModelInfo,\n  recommendedIds: Set<string>,\n  freeIds: Set<string>,\n  useFallbackSignals: boolean,\n): number {\n  const normalizedId = normalizeClineModelId(model.id)\n  let score = 0\n\n  if (\n    recommendedIds.has(normalizedId)\n    || (useFallbackSignals && CLINE_FALLBACK_RECOMMENDED_MODEL_IDS.has(normalizedId))\n  ) {\n    score += 20_000\n  }\n  if (\n    freeIds.has(normalizedId)\n    || (useFallbackSignals && CLINE_FALLBACK_FREE_MODEL_IDS.has(normalizedId))\n  ) {\n    score += 10_000\n  }\n  if (CLINE_LATEST_MODEL_IDS.has(normalizedId) || isLikelyLatestClineModel(normalizedId)) {\n    score += 4_000\n  }\n  if (CLINE_VALUE_MODEL_IDS.has(normalizedId) || isLikelyValueClineModel(normalizedId)) {\n    score += 3_000\n  }\n  if (model.supportsToolCalling) {\n    score += 200\n  }\n\n  const contextWindow = model.contextWindow ?? 0\n  if (contextWindow >= 1_000_000) score += 80\n  else if (contextWindow >= 200_000) score += 40\n\n  return score\n}\n\nfunction getClineModelTags(\n  modelId: string,\n  recommendedIds: Set<string>,\n  freeIds: Set<string>,\n  useFallbackSignals: boolean,\n): string[] | undefined {\n  const normalizedId = normalizeClineModelId(modelId)\n  const tags: string[] = []\n  if (\n    recommendedIds.has(normalizedId)\n    || (useFallbackSignals && CLINE_FALLBACK_RECOMMENDED_MODEL_IDS.has(normalizedId))\n  ) {\n    tags.push('recommended')\n  }\n  if (\n    freeIds.has(normalizedId)\n    || (useFallbackSignals && CLINE_FALLBACK_FREE_MODEL_IDS.has(normalizedId))\n  ) {\n    tags.push('free')\n  }\n\n  return tags.length > 0 ? tags : undefined\n}\n\nfunction clineBearerToken(token: string): string {\n  return token.toLowerCase().startsWith('workos:') ? token : `workos:${token}`\n}\n\nfunction clineModelSupportsReasoning(model: string): boolean {\n  return isClineThinkingModel(model)\n}\n\nfunction blankUsage(): NormalizedUsage {\n  return {\n    input_tokens: 0,\n    output_tokens: 0,\n    cache_read_tokens: 0,\n    cache_write_tokens: 0,\n    thinking_tokens: 0,\n  }\n}\n\nfunction* emitErrorTurn(text: string): Generator<AnthropicStreamEvent, void> {\n  yield {\n    type: 'message_start',\n    message: {\n      id: `cline-error-${Date.now()}`,\n      type: 'message',\n      role: 'assistant',\n      content: [],\n      model: 'cline',\n      stop_reason: null,\n      stop_sequence: null,\n      usage: { input_tokens: 0, output_tokens: 0 },\n    },\n  }\n  yield { type: 'content_block_start', index: 0, content_block: { type: 'text', text: '' } }\n  yield { type: 'content_block_delta', index: 0, delta: { type: 'text_delta', text } }\n  yield { type: 'content_block_stop', index: 0 }\n  yield { type: 'message_delta', delta: { stop_reason: 'end_turn' }, usage: { output_tokens: 0 } }\n  yield { type: 'message_stop' }\n}\n\nexport const clineLane = new ClineLane()\n", "/**\n * Cline lane entry point.\n *\n * Cline's catalog overlaps Anthropic/OpenAI/Gemini model ids, so model-only\n * dispatch is not authoritative here. The provider shim routes the `cline`\n * provider directly to this lane by name; this lane then resolves auth and\n * talks to Cline's own gateway natively.\n */\n\nexport { clineLane, ClineLane } from './loop.js'\n\nimport { registerLane } from '../dispatcher.js'\nimport { clineLane } from './loop.js'\nimport { loadProviderKey } from '../../services/api/auth/api_key_manager.js'\n\nfunction readStoredClineOAuthToken(): string | undefined {\n  try {\n    const raw = loadProviderKey('cline_oauth')\n    if (!raw) return undefined\n    const parsed = JSON.parse(raw) as { accessToken?: string }\n    return parsed.accessToken\n  } catch {\n    return undefined\n  }\n}\n\nexport function initClineLane(): void {\n  clineLane.configure({\n    oauthToken: readStoredClineOAuthToken(),\n  })\n  registerLane(clineLane)\n}\n", "/**\n * Kilo fallback catalog.\n *\n * Used only when /api/openrouter/models fails (network blip, token revoked\n * mid-session, gateway outage). The authoritative source is the live\n * endpoint \u2014 see KiloLane.listModels() for the dynamic path and the\n * subscription-aware filtering that happens server-side.\n *\n * Order = curated preference when scores tie. Mirrors the \"default\" model\n * order exposed by https://api.kilo.ai/api/openrouter/models for a\n * logged-in individual user (no org context).\n */\n\nimport type { ModelInfo } from '../../services/api/providers/base_provider.js'\n\nexport const KILO_FALLBACK_MODELS: readonly ModelInfo[] = [\n  { id: 'kilo-auto/balanced', name: 'Kilo Auto (balanced)' },\n  { id: 'kilo-auto/coder', name: 'Kilo Auto (coder)' },\n  { id: 'kilo-auto/free', name: 'Kilo Auto (free)' },\n  { id: 'anthropic/claude-sonnet-4.6', name: 'Claude Sonnet 4.6' },\n  { id: 'anthropic/claude-opus-4.7', name: 'Claude Opus 4.7' },\n  { id: 'anthropic/claude-opus-4.6', name: 'Claude Opus 4.6' },\n  { id: 'anthropic/claude-haiku-4.5', name: 'Claude Haiku 4.5' },\n  { id: 'openai/gpt-5.4', name: 'GPT-5.4' },\n  { id: 'openai/gpt-5.3-codex', name: 'GPT-5.3 Codex' },\n  { id: 'openai/gpt-5-codex', name: 'GPT-5 Codex' },\n  { id: 'google/gemini-3.1-pro-preview', name: 'Gemini 3.1 Pro Preview' },\n  { id: 'google/gemini-2.5-pro', name: 'Gemini 2.5 Pro' },\n  { id: 'google/gemini-2.5-flash', name: 'Gemini 2.5 Flash' },\n  { id: 'qwen/qwen3-coder', name: 'Qwen3 Coder' },\n  { id: 'deepseek/deepseek-chat', name: 'DeepSeek Chat' },\n  { id: 'deepseek/deepseek-reasoner', name: 'DeepSeek Reasoner' },\n  { id: 'z-ai/glm-5', name: 'GLM-5' },\n  { id: 'moonshotai/kimi-k2.6', name: 'Kimi K2.6' },\n  { id: 'x-ai/grok-code-fast-1', name: 'Grok Code Fast 1' },\n]\n\nexport const KILO_FALLBACK_FREE_IDS: ReadonlySet<string> = new Set([\n  'kilo-auto/free',\n  'google/gemini-2.5-flash',\n  'deepseek/deepseek-chat',\n  'z-ai/glm-5',\n  'moonshotai/kimi-k2.6',\n  'qwen/qwen3-coder',\n])\n\nexport function isKiloFreeId(id: string): boolean {\n  return KILO_FALLBACK_FREE_IDS.has(id.toLowerCase())\n}\n", "import type {\n  OpenAIContentPart,\n  OpenAIMessage,\n} from '../../services/api/adapters/anthropic_to_openai.js'\n\n/**\n * Kilo prompt-cache breakpoints.\n *\n * Kilo speaks OpenAI Chat Completions to an OpenRouter-style gateway, while\n * prompt caching is ultimately forwarded to Anthropic-style cache_control\n * markers. Keep the rolling markers on user messages only. Tool results are\n * represented as OpenAI `role: \"tool\"` messages in this lane, and cache markers\n * on that role have proven unstable under tool-heavy loops.\n */\nexport function applyKiloCacheBreakpoints(messages: OpenAIMessage[]): void {\n  const stamp = (parts: OpenAIContentPart[]): void => {\n    if (parts.length === 0) return\n    const last = parts[parts.length - 1]\n    if (last && last.type === 'text' && !last.cache_control) {\n      last.cache_control = { type: 'ephemeral' }\n    }\n  }\n\n  const stampUserMessage = (m: OpenAIMessage): void => {\n    if (m.role !== 'user') return\n    if (typeof m.content === 'string') {\n      const text = m.content\n      m.content = [\n        { type: 'text', text: text.length > 0 ? text : ' ', cache_control: { type: 'ephemeral' } },\n      ]\n    } else if (Array.isArray(m.content) && m.content.length > 0) {\n      stamp(m.content)\n    }\n  }\n\n  const sys = messages.find((m) => m.role === 'system')\n  if (sys) {\n    if (typeof sys.content === 'string') {\n      const text = sys.content\n      if (text.length > 0) {\n        sys.content = [{ type: 'text', text, cache_control: { type: 'ephemeral' } }]\n      }\n    } else if (Array.isArray(sys.content)) {\n      stamp(sys.content)\n    }\n  }\n\n  let stamped = 0\n  for (let i = messages.length - 1; i >= 0 && stamped < 2; i--) {\n    const m = messages[i]!\n    if (m.role !== 'user') continue\n    stampUserMessage(m)\n    stamped++\n  }\n}\n", "type KiloAskUserOption = {\n  label: string\n  description: string\n}\n\ntype KiloAskUserQuestion = {\n  question: string\n  header: string\n  options: KiloAskUserOption[]\n  multiSelect: boolean\n}\n\nexport function kiloToolCallKey(choiceIndex: number, toolIndex: number): string {\n  return `${choiceIndex}:${toolIndex}`\n}\n\nexport function parseKiloToolCallKey(key: string): { choiceIndex: number; toolIndex: number } | null {\n  const [choice, tool] = key.split(':', 2)\n  const choiceIndex = Number(choice)\n  const toolIndex = Number(tool)\n  if (!Number.isInteger(choiceIndex) || !Number.isInteger(toolIndex)) return null\n  return { choiceIndex, toolIndex }\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n  return value && typeof value === 'object' && !Array.isArray(value)\n    ? value as Record<string, unknown>\n    : null\n}\n\nfunction firstDefined(\n  native: Record<string, unknown>,\n  keys: readonly string[],\n): unknown {\n  for (const key of keys) {\n    if (native[key] != null) return native[key]\n  }\n  return undefined\n}\n\nfunction nonEmptyString(value: unknown): string | null {\n  return typeof value === 'string' && value.trim().length > 0\n    ? value.trim()\n    : null\n}\n\nfunction looksLikeJsonText(value: string): boolean {\n  const trimmed = value.trim()\n  if (trimmed.length < 2) return false\n  const first = trimmed[0]\n  const last = trimmed[trimmed.length - 1]\n  return (first === '{' && last === '}') || (first === '[' && last === ']')\n}\n\nfunction parseJsonStringValue(value: unknown): unknown {\n  if (typeof value !== 'string' || !looksLikeJsonText(value)) return value\n  try {\n    return JSON.parse(value)\n  } catch {\n    return value\n  }\n}\n\nfunction parseKiloToolArgsObject(raw: string): Record<string, unknown> | null {\n  let parsed: unknown\n  try {\n    parsed = JSON.parse(raw)\n  } catch {\n    return null\n  }\n\n  if (typeof parsed === 'string' && looksLikeJsonText(parsed)) {\n    try {\n      parsed = JSON.parse(parsed)\n    } catch {\n      return null\n    }\n  }\n\n  return asRecord(parsed)\n}\n\nexport function tryNormalizeKiloToolCallArgumentString(\n  toolName: string,\n  raw: string,\n): string | null {\n  const args = parseKiloToolArgsObject(raw)\n  if (!args) return null\n  return JSON.stringify(normalizeKiloToolCallArguments(toolName, args))\n}\n\nexport function normalizeKiloToolCallArgumentString(\n  toolName: string,\n  raw: string,\n): string {\n  return tryNormalizeKiloToolCallArgumentString(toolName, raw) ?? raw\n}\n\nexport function normalizeKiloToolCallArguments(\n  toolName: string,\n  args: Record<string, unknown>,\n): Record<string, unknown> {\n  switch (toolName) {\n    case 'AskUserQuestion':\n      return normalizeKiloAskUserQuestionInput(args)\n    case 'Edit':\n      return normalizeKiloEditInput(args)\n    case 'Read':\n      return normalizeKiloReadInput(args)\n    case 'Write':\n      return normalizeKiloWriteInput(args)\n    case 'TaskGet':\n      return normalizeKiloTaskGetInput(args)\n    default:\n      return args\n  }\n}\n\nfunction normalizeKiloAskUserQuestionInput(\n  nativeInput: Record<string, unknown>,\n): Record<string, unknown> {\n  const native = { ...nativeInput }\n  const parsedQuestions = parseJsonStringValue(native.questions)\n  if (Array.isArray(parsedQuestions)) {\n    native.questions = parsedQuestions\n  } else if (asRecord(parsedQuestions)) {\n    native.questions = [parsedQuestions]\n  } else if (typeof parsedQuestions === 'string') {\n    native.question = parsedQuestions\n    delete native.questions\n  }\n\n  const rawQuestions = Array.isArray(native.questions) && native.questions.length > 0\n    ? native.questions\n    : [native]\n\n  const questions = rawQuestions.map((raw, index) => {\n    const record = asRecord(raw) ?? {}\n    const question =\n      nonEmptyString(record.question) ??\n      nonEmptyString(record.prompt) ??\n      nonEmptyString(raw) ??\n      nonEmptyString(native.question) ??\n      nonEmptyString(native.prompt) ??\n      'Please choose an option.'\n    const type = record.type ?? native.type\n\n    return {\n      question,\n      header: askUserHeader(record.header ?? native.header, question, index),\n      options: askUserOptions(record.options ?? native.options, type),\n      multiSelect: asBoolean(\n        record.multiSelect ??\n        record.multi_select ??\n        native.multiSelect ??\n        native.multi_select,\n      ),\n    } satisfies KiloAskUserQuestion\n  })\n\n  const out: Record<string, unknown> = { questions }\n  for (const key of ['answers', 'annotations', 'metadata']) {\n    if (native[key] != null) out[key] = parseJsonStringValue(native[key])\n  }\n  return out\n}\n\nfunction askUserHeader(value: unknown, question: string, index: number): string {\n  const explicit = nonEmptyString(value)\n  if (explicit) return explicit.slice(0, 12)\n  const fromQuestion = question\n    .replace(/[^\\w\\s]/g, ' ')\n    .trim()\n    .split(/\\s+/)\n    .slice(0, 2)\n    .join(' ')\n  return (fromQuestion || `Q${index + 1}`).slice(0, 12)\n}\n\nfunction askUserOptions(rawOptions: unknown, type: unknown): KiloAskUserOption[] {\n  const parsed = parseJsonStringValue(rawOptions)\n  const options: KiloAskUserOption[] = []\n\n  if (Array.isArray(parsed)) {\n    for (let i = 0; i < parsed.length; i++) {\n      const raw = parsed[i]\n      if (typeof raw === 'string') {\n        const label = raw.trim()\n        if (label) options.push({ label, description: `Select ${label}.` })\n        continue\n      }\n\n      const record = asRecord(raw)\n      if (!record) continue\n      const label =\n        nonEmptyString(record.label) ??\n        nonEmptyString(record.text) ??\n        nonEmptyString(record.value) ??\n        `Option ${i + 1}`\n      const description =\n        nonEmptyString(record.description) ??\n        nonEmptyString(record.desc) ??\n        `Select ${label}.`\n      options.push({ label, description })\n    }\n  }\n\n  const deduped: KiloAskUserOption[] = []\n  const seen = new Set<string>()\n  for (const option of options) {\n    const key = option.label.toLowerCase()\n    if (seen.has(key)) continue\n    seen.add(key)\n    deduped.push(option)\n    if (deduped.length >= 4) break\n  }\n\n  const fallback = String(type ?? '').toLowerCase() === 'yesno'\n    ? [\n        { label: 'Yes', description: 'Confirm this option.' },\n        { label: 'No', description: 'Decline this option.' },\n      ]\n    : [\n        { label: 'Answer', description: 'Provide a custom answer.' },\n        { label: 'Skip', description: 'Do not answer this now.' },\n      ]\n\n  for (const option of fallback) {\n    if (deduped.length >= 2) break\n    const key = option.label.toLowerCase()\n    if (!seen.has(key)) {\n      deduped.push(option)\n      seen.add(key)\n    }\n  }\n\n  return deduped.slice(0, 4)\n}\n\nfunction asBoolean(value: unknown): boolean {\n  if (typeof value === 'boolean') return value\n  if (typeof value === 'string') {\n    return ['1', 'true', 'yes', 'y'].includes(value.trim().toLowerCase())\n  }\n  return false\n}\n\nconst KILO_FILE_PATH_KEYS = [\n  'file_path',\n  'path',\n  'target_file',\n  'targetFile',\n  'absolute_path',\n  'absolutePath',\n  'relative_workspace_path',\n  'relativeWorkspacePath',\n  'filename',\n  'file',\n] as const\n\nfunction normalizeKiloReadInput(native: Record<string, unknown>): Record<string, unknown> {\n  const out: Record<string, unknown> = {\n    file_path: firstDefined(native, KILO_FILE_PATH_KEYS),\n  }\n  if (native.offset != null) out.offset = native.offset\n  if (native.limit != null) out.limit = native.limit\n  return out\n}\n\nfunction normalizeKiloWriteInput(native: Record<string, unknown>): Record<string, unknown> {\n  return {\n    file_path: firstDefined(native, KILO_FILE_PATH_KEYS),\n    content: firstDefined(native, ['content', 'contents', 'text', 'source', 'data']),\n  }\n}\n\nfunction normalizeKiloEditInput(native: Record<string, unknown>): Record<string, unknown> {\n  const out: Record<string, unknown> = {\n    file_path: firstDefined(native, KILO_FILE_PATH_KEYS),\n    old_string: firstDefined(native, [\n      'old_string',\n      'old_str',\n      'old_text',\n      'search',\n      'find',\n      'original',\n    ]),\n    new_string: firstDefined(native, [\n      'new_string',\n      'new_str',\n      'new_text',\n      'replace',\n      'replacement',\n    ]),\n  }\n  const replaceAll = firstDefined(native, ['replace_all', 'replaceAll', 'all', 'allow_multiple'])\n  if (replaceAll != null) out.replace_all = replaceAll\n  return out\n}\n\nfunction normalizeKiloTaskGetInput(native: Record<string, unknown>): Record<string, unknown> {\n  return {\n    taskId: firstDefined(native, ['taskId', 'task_id', 'id', 'task']),\n  }\n}\n", "/**\r\n * Kilo Lane\r\n *\r\n * Native transport for the Kilo Gateway (https://api.kilo.ai).\r\n *\r\n * Wire format \u2014 OpenAI chat completions with OpenRouter extensions. Kilo\r\n * fronts an OpenRouter-compatible aggregator, so Claude/Gemini/OpenAI\r\n * models keep their native cache semantics (`cache_control: {type:\r\n * ephemeral}` is passed through untouched).\r\n *\r\n *   - chat:     POST  https://api.kilo.ai/api/openrouter/chat/completions\r\n *   - models:   GET   https://api.kilo.ai/api/openrouter/models                  (personal)\r\n *               GET   https://api.kilo.ai/api/organizations/<orgId>/models       (org)\r\n *   - defaults: GET   https://api.kilo.ai/api/defaults | /api/organizations/<orgId>/defaults\r\n *\r\n * NB: the kilo-gateway OSS repo (packages/kilo-gateway/src/provider.ts) builds\r\n * the SDK baseURL as `${KILO_API_BASE}/openrouter/` (no `/api/`), which 404s\r\n * against the live gateway. 9router's probed config at\r\n * reference/9router-master/open-sse/config/providers.js:213 has the\r\n * authoritative URL \u2014 `/api/openrouter/chat/completions`.\r\n *\r\n * Auth \u2014 long-lived bearer (1 year) issued by the device-auth flow in\r\n * services/api/auth/oauth_services.ts::startKiloCodeOAuth. No refresh\r\n * endpoint; on 401 we surface a `/login kilocode` prompt.\r\n *\r\n * Headers mirror the native Kilo CLI (packages/kilo-gateway/src/headers.ts):\r\n * editor name, feature tag, organization id. Organization scoping for\r\n * chat is header-only \u2014 the chat URL never changes per org.\r\n *\r\n * Subscription-aware visibility \u2014 `/api/openrouter/models` returns the\r\n * catalog the user's plan is entitled to. We additionally filter out\r\n * image-only models and models that don't advertise `tools` support,\r\n * matching the native Kilo CLI's kilo-gateway/src/api/models.ts filter.\r\n */\r\n\r\nimport type {\r\n  AnthropicStreamEvent,\r\n  ModelInfo,\r\n  SystemBlock,\r\n} from '../../services/api/providers/base_provider.js'\r\nimport type {\r\n  Lane,\r\n  LaneProviderCallParams,\r\n  LaneRunContext,\r\n  LaneRunResult,\r\n  NormalizedUsage,\r\n} from '../types.js'\r\nimport {\n  anthropicMessagesToOpenAI,\n  anthropicToolsToOpenAI,\n  type OpenAIMessage,\n  type OpenAITool,\n} from '../../services/api/adapters/anthropic_to_openai.js'\nimport {\r\n  openAIStreamToAnthropicEvents,\r\n  type OpenAIChatCompletionChunk,\r\n} from '../../services/api/adapters/openai_to_anthropic.js'\r\nimport { loadProviderKey } from '../../services/api/auth/api_key_manager.js'\r\nimport {\r\n  OPENAI_COMPAT_TOOL_USAGE_RULES,\r\n  appendStrictParamsHint,\r\n} from '../shared/mcp_bridge.js'\r\nimport {\n  KILO_FALLBACK_MODELS,\n  KILO_FALLBACK_FREE_IDS,\n} from './catalog.js'\nimport { applyKiloCacheBreakpoints } from './cache.js'\nimport {\n  kiloToolCallKey,\n  normalizeKiloToolCallArgumentString,\n  parseKiloToolCallKey,\n  tryNormalizeKiloToolCallArgumentString,\n} from './tool_args.js'\n\r\nconst KILO_API_BASE = 'https://api.kilo.ai'\r\nconst KILO_MODEL_LIST_LIMIT = 40\r\nconst KILO_MODELS_CACHE_TTL_MS = 5 * 60_000\r\nconst KILO_CONTEXT_EXCEEDED_MARKERS = [\n  'context length',\n  'context_length_exceeded',\n  'prompt is too long',\n  'maximum context',\n  'too long',\n]\n\nconst KILO_TOOL_USAGE_RULES = `${OPENAI_COMPAT_TOOL_USAGE_RULES}\n<kilocode_tool_quirks>\nKiloCode must call the tools using the schema names shown in this session, not aliases remembered from other coding CLIs:\n- AskUserQuestion.questions must be an array of question objects, not a JSON string.\n- Edit, Read, and Write use file_path for the file path.\n- TaskGet.taskId must come from a current TaskList or TaskCreate result; do not guess stale task IDs.\n</kilocode_tool_quirks>\n`\n\r\n/** `X-KILOCODE-EDITORNAME` \u2014 matches Kilo CLI's DEFAULT_EDITOR_NAME path. */\r\nconst KILO_EDITOR_NAME = 'Tau'\r\n/** `User-Agent` base \u2014 kilo-gateway/src/headers.ts::getUserAgent. */\r\nconst KILO_USER_AGENT = 'claudex-kilo-provider'\r\n\r\ninterface StoredKiloOAuthBlob {\r\n  accessToken?: string\r\n  meta?: {\r\n    email?: string\r\n    orgId?: string | null\r\n  }\r\n}\r\n\r\ninterface KiloAuthSession {\r\n  token: string\r\n  orgId: string | null\r\n}\r\n\r\ninterface RawKiloModelInfo {\r\n  id?: string\r\n  name?: string\r\n  description?: string\r\n  context_length?: number | null\r\n  max_completion_tokens?: number | null\r\n  top_provider?: {\r\n    max_completion_tokens?: number | null\r\n    context_length?: number | null\r\n  } | null\r\n  supported_parameters?: string[] | null\r\n  architecture?: {\r\n    input_modalities?: string[] | null\r\n    output_modalities?: string[] | null\r\n  } | null\r\n  pricing?: {\r\n    prompt?: string | null\r\n    completion?: string | null\r\n    input_cache_read?: string | null\r\n    input_cache_write?: string | null\r\n  } | null\r\n  isFree?: boolean\r\n  preferredIndex?: number\r\n}\r\n\r\ninterface KiloModelsResponse {\r\n  data?: RawKiloModelInfo[]\r\n}\r\n\r\ninterface KiloDefaultsResponse {\r\n  defaultModel?: string\r\n  defaultFreeModel?: string\r\n}\r\n\r\nexport class KiloLane implements Lane {\r\n  readonly name = 'kilo'\r\n  readonly displayName = 'Kilo Code'\r\n\r\n  private tokenHint: string | null = null\r\n  private orgIdHint: string | null = null\r\n  private modelCache: { models: ModelInfo[]; at: number } | null = null\r\n  private defaultModelCache: { id: string; at: number } | null = null\r\n\r\n  configure(opts: { accessToken?: string | null; orgId?: string | null }): void {\r\n    if (opts.accessToken !== undefined) this.tokenHint = opts.accessToken || null\r\n    if (opts.orgId !== undefined) this.orgIdHint = opts.orgId || null\r\n  }\r\n\r\n  invalidateModelCache(): void {\r\n    this.modelCache = null\r\n    this.defaultModelCache = null\r\n  }\r\n\r\n  // Kilo's catalog shares ids with Anthropic/OpenAI/Gemini/OpenRouter (it\r\n  // IS an OpenRouter aggregator). Model-heuristic dispatch would collide;\r\n  // providerShim routes `kilocode` here explicitly instead.\r\n  supportsModel(_model: string): boolean {\r\n    return false\r\n  }\r\n\r\n  isHealthy(): boolean {\r\n    return !!this._peekStored()\r\n  }\r\n\r\n  resolveModel(model: string): string {\r\n    return model\r\n  }\r\n\r\n  dispose(): void {}\r\n\r\n  async *run(_context: LaneRunContext): AsyncGenerator<AnthropicStreamEvent, LaneRunResult> {\r\n    throw new Error(\r\n      'KiloLane.run (lane-owns-loop) is not wired yet \u2014 use streamAsProvider via LaneBackedProvider.',\r\n    )\r\n  }\r\n\r\n  async listModels(): Promise<ModelInfo[]> {\r\n    if (this.modelCache && Date.now() - this.modelCache.at < KILO_MODELS_CACHE_TTL_MS) {\r\n      return this.modelCache.models\r\n    }\r\n\r\n    const auth = this._peekStored()\r\n    // A healthy lane path always has auth (providerShim gates on\r\n    // isHealthy()). We still fall back to the public models URL when\r\n    // auth is absent so /models works during transient credential loss.\r\n    const modelsURL = auth?.orgId\r\n      ? `${KILO_API_BASE}/api/organizations/${auth.orgId}/models`\r\n      : `${KILO_API_BASE}/api/openrouter/models`\r\n\r\n    let rawModels: RawKiloModelInfo[] = []\r\n    try {\r\n      const response = await fetch(modelsURL, {\r\n        method: 'GET',\r\n        headers: this._buildDiscoveryHeaders(auth),\r\n        signal: AbortSignal.timeout(10_000),\r\n      })\r\n\r\n      if (response.ok) {\r\n        const payload = await response.json() as KiloModelsResponse\r\n        rawModels = Array.isArray(payload.data) ? payload.data : []\r\n      }\r\n    } catch {\r\n      // Fall through to the curated fallback below.\r\n    }\r\n\r\n    let models = rawModels\r\n      .filter((m): m is RawKiloModelInfo & { id: string } => typeof m.id === 'string' && m.id.length > 0)\r\n      // Kilo CLI's kilo-gateway/src/api/models.ts filter: skip image-only\r\n      // and skip models that don't advertise tool support. Chat work\r\n      // needs tool calling; image-gen models would break the agent loop.\r\n      .filter((m) => !(m.architecture?.output_modalities?.includes('image')))\r\n      .filter((m) => {\r\n        const sp = m.supported_parameters\r\n        if (!Array.isArray(sp)) return true\r\n        return sp.includes('tools') || sp.includes('tool_choice')\r\n      })\r\n      .map<ModelInfo>((m) => ({\r\n        id: m.id,\r\n        name: m.name ?? m.id,\r\n        contextWindow: m.context_length ?? m.top_provider?.context_length ?? undefined,\r\n        supportsToolCalling: true,\r\n        tags: kiloModelTags(m),\r\n      }))\r\n\r\n    if (models.length === 0) {\r\n      models = KILO_FALLBACK_MODELS.map((m) => ({\r\n        ...m,\r\n        supportsToolCalling: true,\r\n        tags: KILO_FALLBACK_FREE_IDS.has(m.id.toLowerCase()) ? ['free'] : undefined,\r\n      }))\r\n    }\r\n\r\n    models = this._curateModels(models, rawModels)\r\n    this.modelCache = { models, at: Date.now() }\r\n    return models\r\n  }\r\n\r\n  smallFastModel(): string | null {\r\n    // The live /api/defaults endpoint would be preferable but the Lane\r\n    // interface declares this sync. We opportunistically return the\r\n    // cached default when _getDefaultModelId() has run, else fall back\r\n    // to Kilo's kilo-auto/free (if the plan exposes it) or Claude Haiku.\r\n    if (this.defaultModelCache) return this.defaultModelCache.id\r\n    // Kick off a background refresh so subsequent calls get the real value.\r\n    void this._getDefaultModelId().catch(() => undefined)\r\n    return 'anthropic/claude-haiku-4.5'\r\n  }\r\n\r\n  async *streamAsProvider(\r\n    params: LaneProviderCallParams,\r\n  ): AsyncGenerator<AnthropicStreamEvent, NormalizedUsage> {\r\n    const auth = this._peekStored()\r\n    if (!auth) {\r\n      throw new Error('Kilo lane: not authenticated. Run `/login kilocode` to authenticate.')\r\n    }\r\n\r\n    const preserveCacheControl = this._supportsPromptCache(params.model)\r\n    const system = this._prependToolUsageRules(params.system, params.tools.length > 0)\r\n    const messages = anthropicMessagesToOpenAI(\r\n      params.messages,\r\n      system,\r\n      { preserveCacheControl },\r\n    )\r\n    // Re-inject Kilo's prompt-cache breakpoints after the shared adapter\n    // has flattened plain user text. Keep rolling markers on user messages\n    // only; Kilo tool results are OpenAI role:\"tool\" messages, and markers\n    // on that role have proven unstable in tool-heavy loops.\n    if (preserveCacheControl) {\n      applyKiloCacheBreakpoints(messages)\n    }\n    const tools = this._buildTools(params.tools)\r\n    const body = this._buildRequestBody({\r\n      model: params.model,\r\n      messages,\r\n      tools,\r\n      maxTokens: params.max_tokens,\r\n      temperature: params.temperature,\r\n      stopSequences: params.stop_sequences,\r\n      thinking: params.thinking,\r\n    })\r\n\r\n    let response: Response\r\n    try {\r\n      response = await fetch(`${KILO_API_BASE}/api/openrouter/chat/completions`, {\r\n        method: 'POST',\r\n        headers: this._buildHeaders(auth),\r\n        body: JSON.stringify(body),\r\n        signal: params.signal,\r\n      })\r\n    } catch (error: unknown) {\r\n      const message = error instanceof Error ? error.message : String(error)\r\n      yield* emitErrorTurn(`kilo API connection error: ${message}`)\r\n      return blankUsage()\r\n    }\r\n\r\n    if (!response.ok) {\r\n      const errText = await response.text().catch(() => '')\r\n      const lowered = errText.toLowerCase()\r\n      const isPromptTooLong = KILO_CONTEXT_EXCEEDED_MARKERS.some((marker) => lowered.includes(marker))\r\n      const headline = isPromptTooLong\r\n        ? `Prompt is too long (kilo ${response.status})`\r\n        : response.status === 401 || response.status === 403\r\n          ? `kilo auth error ${response.status} \u2014 run \\`/login kilocode\\``\r\n          : `kilo API error ${response.status}`\r\n      yield* emitErrorTurn(`${headline}: ${errText.slice(0, 500)}`)\r\n      return blankUsage()\r\n    }\r\n\r\n    if (!response.body) {\r\n      throw new Error('Kilo lane: empty response body')\r\n    }\r\n\r\n    let finalUsage = blankUsage()\r\n    const chunkStream = this._normalizeChunkStream(this._parseSSE(response.body))\r\n\r\n    for await (const event of openAIStreamToAnthropicEvents(chunkStream)) {\r\n      if (event.type === 'message_delta' && event.usage) {\r\n        finalUsage = {\r\n          input_tokens: event.usage.input_tokens ?? finalUsage.input_tokens,\r\n          output_tokens: event.usage.output_tokens ?? finalUsage.output_tokens,\r\n          cache_read_tokens: event.usage.cache_read_input_tokens ?? finalUsage.cache_read_tokens,\r\n          cache_write_tokens: event.usage.cache_creation_input_tokens ?? finalUsage.cache_write_tokens,\r\n          thinking_tokens: 0,\r\n        }\r\n      }\r\n      yield event\r\n    }\r\n\r\n    return finalUsage\r\n  }\r\n\r\n  private _buildTools(tools: LaneProviderCallParams['tools']): OpenAITool[] {\r\n    return anthropicToolsToOpenAI(tools).map((tool) => ({\r\n      ...tool,\r\n      function: {\r\n        ...tool.function,\r\n        description: appendStrictParamsHint(\r\n          tool.function.description ?? '',\r\n          tool.function.parameters,\r\n        ),\r\n      },\r\n    }))\r\n  }\r\n\r\n  private _buildRequestBody(opts: {\r\n    model: string\r\n    messages: OpenAIMessage[]\r\n    tools: OpenAITool[]\r\n    maxTokens: number\r\n    temperature?: number\r\n    stopSequences?: string[]\r\n    thinking?: LaneProviderCallParams['thinking']\r\n  }): Record<string, unknown> {\r\n    const effort = resolveReasoningEffort(opts.thinking)\r\n    // Kilo proxies OpenRouter, which caps max_tokens per-model. 8192 is a\r\n    // safe upper bound for the chat path (matches the prior openai-compat\r\n    // transformer clamp). Kilo-auto routes internally, no per-model cap.\r\n    const capped = Math.min(opts.maxTokens, 8192)\r\n    const body: Record<string, unknown> = {\r\n      model: opts.model,\r\n      messages: opts.messages,\r\n      stream: true,\r\n      stream_options: { include_usage: true },\r\n      // OpenRouter-native detailed usage block \u2014 Kilo CLI sets this via\r\n      // providerOptions.openrouter.usage.include. Surfaces cost plus\r\n      // cache_discount and per-breakpoint hit counts in the final chunk\r\n      // so billing reconciliation matches Kilo CLI's view.\r\n      usage: { include: true },\r\n      max_tokens: capped,\r\n      ...(opts.tools.length > 0 && {\r\n        tools: opts.tools,\r\n        tool_choice: 'auto',\r\n      }),\r\n      ...(opts.temperature !== undefined && { temperature: opts.temperature }),\r\n      ...(opts.stopSequences && opts.stopSequences.length > 0 && { stop: opts.stopSequences }),\r\n    }\r\n\r\n    if (effort && kiloModelSupportsReasoning(opts.model)) {\r\n      body.reasoning = { effort }\r\n    }\r\n\r\n    return body\r\n  }\r\n\r\n  private _prependToolUsageRules(\n    system: string | SystemBlock[],\r\n    hasTools: boolean,\r\n  ): string | SystemBlock[] {\r\n    if (!hasTools) return system\n    if (typeof system === 'string') {\n      return system\n        ? `${KILO_TOOL_USAGE_RULES}\\n${system}`\n        : KILO_TOOL_USAGE_RULES\n    }\n\n    const blocks = [...system]\n    if (blocks.length === 0) {\n      return [{ type: 'text', text: KILO_TOOL_USAGE_RULES }]\n    }\n\n    const first = blocks[0] as SystemBlock & { cache_control?: { type: string } }\n    return [\n      { ...first, text: `${KILO_TOOL_USAGE_RULES}\\n${first.text}` },\n      ...blocks.slice(1),\n    ]\n  }\n\r\n  private _buildHeaders(auth: KiloAuthSession): Record<string, string> {\r\n    const headers: Record<string, string> = {\r\n      'Content-Type': 'application/json',\r\n      Accept: 'text/event-stream',\r\n      'User-Agent': KILO_USER_AGENT,\r\n      'HTTP-Referer': 'https://github.com/AbdoKnbGit/tau',\n      'X-Title': 'Tau',\r\n      // Kilo CLI-parity attribution headers \u2014 see kilo-gateway/src/headers.ts.\r\n      'X-KILOCODE-EDITORNAME': KILO_EDITOR_NAME,\r\n      Authorization: `Bearer ${auth.token}`,\r\n    }\r\n    if (auth.orgId) {\r\n      headers['X-KILOCODE-ORGANIZATIONID'] = auth.orgId\r\n    }\r\n    const feature = process.env.KILOCODE_FEATURE\r\n    if (feature) headers['X-KILOCODE-FEATURE'] = feature\r\n    return headers\r\n  }\r\n\r\n  private _buildDiscoveryHeaders(auth: KiloAuthSession | null): Record<string, string> {\r\n    const headers: Record<string, string> = {\r\n      Accept: 'application/json',\r\n      'User-Agent': KILO_USER_AGENT,\r\n      'X-KILOCODE-EDITORNAME': KILO_EDITOR_NAME,\r\n    }\r\n    if (auth) {\r\n      headers.Authorization = `Bearer ${auth.token}`\r\n      if (auth.orgId) headers['X-KILOCODE-ORGANIZATIONID'] = auth.orgId\r\n    }\r\n    return headers\r\n  }\r\n\r\n  private _supportsPromptCache(model: string): boolean {\r\n    const normalized = model.toLowerCase()\r\n    return (\r\n      normalized.startsWith('anthropic/')\r\n      || normalized.startsWith('openai/')\r\n      || normalized.startsWith('google/')\r\n      // kilo-auto/* routes internally (kilo-auto/balanced \u2192 Claude\r\n      // Sonnet, coder \u2192 Claude Opus, etc.). Missing this prefix meant\r\n      // the default subscription model got no cache markers \u2014 the\r\n      // exact billing-parity gap we care about here.\r\n      || normalized.startsWith('kilo-auto/')\r\n      || normalized.includes('claude-')\r\n      || normalized.includes('gemini-')\r\n      || normalized.includes('gpt-5')\r\n    )\r\n  }\r\n\r\n  private _curateModels(models: ModelInfo[], raw: RawKiloModelInfo[]): ModelInfo[] {\r\n    const rawById = new Map<string, RawKiloModelInfo>()\r\n    for (const m of raw) {\r\n      if (typeof m.id === 'string') rawById.set(m.id, m)\r\n    }\r\n\r\n    const unique = Array.from(new Map(models.map((m) => [m.id, m])).values())\r\n\r\n    unique.sort((left, right) => {\r\n      const scoreDiff = scoreKiloModel(right, rawById) - scoreKiloModel(left, rawById)\r\n      if (scoreDiff !== 0) return scoreDiff\r\n\r\n      const leftCtx = left.contextWindow ?? 0\r\n      const rightCtx = right.contextWindow ?? 0\r\n      if (leftCtx !== rightCtx) return rightCtx - leftCtx\r\n\r\n      const leftName = (left.name ?? left.id).toLowerCase()\r\n      const rightName = (right.name ?? right.id).toLowerCase()\r\n      if (leftName !== rightName) return leftName.localeCompare(rightName)\r\n      return left.id.localeCompare(right.id)\r\n    })\r\n\r\n    return unique.slice(0, KILO_MODEL_LIST_LIMIT)\r\n  }\r\n\r\n  private async _getDefaultModelId(): Promise<string | null> {\r\n    if (this.defaultModelCache && Date.now() - this.defaultModelCache.at < KILO_MODELS_CACHE_TTL_MS) {\r\n      return this.defaultModelCache.id\r\n    }\r\n    const auth = this._peekStored()\r\n    const url = auth?.orgId\r\n      ? `${KILO_API_BASE}/api/organizations/${auth.orgId}/defaults`\r\n      : `${KILO_API_BASE}/api/defaults`\r\n    try {\r\n      const response = await fetch(url, {\r\n        method: 'GET',\r\n        headers: this._buildDiscoveryHeaders(auth),\r\n        signal: AbortSignal.timeout(5_000),\r\n      })\r\n      if (!response.ok) return null\r\n      const payload = await response.json() as KiloDefaultsResponse\r\n      const id = auth ? payload.defaultModel : payload.defaultFreeModel\r\n      if (typeof id === 'string' && id.length > 0) {\r\n        this.defaultModelCache = { id, at: Date.now() }\r\n        return id\r\n      }\r\n    } catch {\r\n      // swallow \u2014 sensible fallback returned by caller.\r\n    }\r\n    return null\r\n  }\r\n\r\n  private _peekStored(): KiloAuthSession | null {\r\n    try {\r\n      const raw = loadProviderKey('kilocode_oauth')\r\n      if (!raw) {\r\n        return this.tokenHint\r\n          ? { token: this.tokenHint, orgId: this.orgIdHint }\r\n          : null\r\n      }\r\n      const parsed = JSON.parse(raw) as StoredKiloOAuthBlob\r\n      const token = typeof parsed.accessToken === 'string' && parsed.accessToken.length > 0\r\n        ? parsed.accessToken\r\n        : this.tokenHint\r\n      if (!token) return null\r\n      const orgId = (typeof parsed.meta?.orgId === 'string' && parsed.meta.orgId.length > 0)\r\n        ? parsed.meta.orgId\r\n        : this.orgIdHint\r\n      return { token, orgId: orgId ?? null }\r\n    } catch {\r\n      return this.tokenHint ? { token: this.tokenHint, orgId: this.orgIdHint } : null\r\n    }\r\n  }\r\n\r\n  private async *_parseSSE(\r\n    body: ReadableStream<Uint8Array>,\r\n  ): AsyncGenerator<OpenAIChatCompletionChunk> {\r\n    const reader = body.getReader()\r\n    const decoder = new TextDecoder()\r\n    let buffer = ''\r\n\r\n    try {\r\n      while (true) {\r\n        const { done, value } = await reader.read()\r\n        if (done) break\r\n        buffer += decoder.decode(value, { stream: true })\r\n\r\n        const lines = buffer.split('\\n')\r\n        buffer = lines.pop() ?? ''\r\n\r\n        for (const rawLine of lines) {\r\n          const line = rawLine.trim()\r\n          if (!line.startsWith('data:')) continue\r\n          const payload = line.slice(5).trim()\r\n          if (!payload || payload === '[DONE]') continue\r\n          try {\r\n            yield JSON.parse(payload) as OpenAIChatCompletionChunk\r\n          } catch {\r\n            // Ignore malformed chunks and keep draining the stream.\r\n          }\r\n        }\r\n      }\r\n\r\n      const trailing = buffer.trim()\r\n      if (trailing.startsWith('data:')) {\r\n        const payload = trailing.slice(5).trim()\r\n        if (payload && payload !== '[DONE]') {\r\n          try {\r\n            yield JSON.parse(payload) as OpenAIChatCompletionChunk\r\n          } catch {\r\n            // Ignore malformed trailing chunks.\r\n          }\r\n        }\r\n      }\r\n    } finally {\r\n      reader.releaseLock()\r\n    }\r\n  }\r\n\r\n  private async *_normalizeChunkStream(\n    chunks: AsyncIterable<OpenAIChatCompletionChunk>,\n  ): AsyncGenerator<OpenAIChatCompletionChunk> {\n    const pendingToolArgs = new Map<string, { name: string; args: string }>()\n\n    for await (const chunk of chunks) {\n      const choices = Array.isArray(chunk.choices)\r\n        ? chunk.choices.map((choice) => {\r\n          const delta = { ...(choice.delta ?? {}) } as OpenAIChatCompletionChunk['choices'][number]['delta'] & {\r\n            reasoning?: string\n          }\n          const choiceIndex = typeof choice.index === 'number' ? choice.index : 0\n\n          // OpenRouter-flavoured `delta.reasoning` \u2192 normalize to\r\n          // `reasoning_content` so openAIStreamToAnthropicEvents picks it up.\r\n          if (typeof delta.reasoning === 'string' && !delta.reasoning_content) {\n            delta.reasoning_content = delta.reasoning\n          }\n\n          if (Array.isArray(delta.tool_calls)) {\n            delta.tool_calls = delta.tool_calls.map((toolCall) => {\n              const toolIndex = toolCall.index ?? 0\n              const key = kiloToolCallKey(choiceIndex, toolIndex)\n              const pending = pendingToolArgs.get(key) ?? { name: '', args: '' }\n              const fn = toolCall.function ? { ...toolCall.function } : undefined\n\n              if (fn?.name) pending.name = fn.name\n              if (typeof fn?.arguments === 'string' && fn.arguments.length > 0) {\n                pending.args += fn.arguments\n                pendingToolArgs.set(key, pending)\n\n                const normalized = pending.name\n                  ? tryNormalizeKiloToolCallArgumentString(\n                      pending.name,\n                      pending.args,\n                    )\n                  : null\n                if (normalized !== null) {\n                  fn.arguments = normalized\n                  pendingToolArgs.delete(key)\n                } else {\n                  delete fn.arguments\n                }\n              }\n\n              return fn ? { ...toolCall, function: fn } : toolCall\n            })\n          }\n\n          if (choice.finish_reason) {\n            const injected: NonNullable<typeof delta.tool_calls> = []\n            for (const [key, pending] of Array.from(pendingToolArgs.entries())) {\n              const parsed = parseKiloToolCallKey(key)\n              if (!parsed || parsed.choiceIndex !== choiceIndex) continue\n              injected.push({\n                index: parsed.toolIndex,\n                function: {\n                  arguments: normalizeKiloToolCallArgumentString(\n                    pending.name,\n                    pending.args,\n                  ),\n                },\n              })\n              pendingToolArgs.delete(key)\n            }\n            if (injected.length > 0) {\n              delta.tool_calls = [...(delta.tool_calls ?? []), ...injected]\n            }\n          }\n\n          return { ...choice, delta }\n        })\n        : chunk.choices\r\n\r\n      yield { ...chunk, choices }\r\n    }\r\n  }\n}\n\nfunction resolveReasoningEffort(\n  thinking: LaneProviderCallParams['thinking'] | undefined,\n): 'low' | 'medium' | 'high' | undefined {\n  if (!thinking || thinking.type === 'disabled') return undefined\r\n  if (thinking.type === 'adaptive') return 'medium'\r\n  const budget = (thinking as { budget_tokens?: number }).budget_tokens\r\n  if (budget == null) return 'medium'\r\n  if (budget < 2_000) return 'low'\r\n  if (budget < 8_000) return 'medium'\r\n  return 'high'\r\n}\r\n\r\nfunction kiloModelSupportsReasoning(model: string): boolean {\r\n  const normalized = model.toLowerCase()\r\n  return (\r\n    normalized.includes('claude-sonnet-4')\r\n    || normalized.includes('claude-opus-4')\r\n    || normalized.includes('gemini-2.5')\r\n    || normalized.includes('gemini-3')\r\n    || normalized.startsWith('gpt-5')\r\n    || normalized.includes('/gpt-5')\r\n    || normalized.includes('/o1')\r\n    || normalized.includes('/o3')\r\n    || normalized.includes('/o4')\r\n    || normalized.includes('deepseek-reasoner')\r\n    || normalized.includes('deepseek-r1')\r\n    || normalized.includes('thinking')\r\n  )\r\n}\r\n\r\nfunction kiloModelTags(raw: RawKiloModelInfo): string[] | undefined {\r\n  const tags: string[] = []\r\n  const promptPrice = parsePrice(raw.pricing?.prompt)\r\n  const completionPrice = parsePrice(raw.pricing?.completion)\r\n  const isZero = (promptPrice === 0 || promptPrice === undefined)\r\n    && (completionPrice === 0 || completionPrice === undefined)\r\n  if (raw.isFree === true || isZero) tags.push('free')\r\n  if (typeof raw.preferredIndex === 'number') tags.push('recommended')\r\n  return tags.length > 0 ? tags : undefined\r\n}\r\n\r\nfunction parsePrice(price: string | null | undefined): number | undefined {\r\n  if (price == null) return undefined\r\n  const n = parseFloat(price)\r\n  return Number.isFinite(n) ? n : undefined\r\n}\r\n\r\nfunction scoreKiloModel(\r\n  model: ModelInfo,\r\n  rawById: Map<string, RawKiloModelInfo>,\r\n): number {\r\n  let score = 0\r\n  const raw = rawById.get(model.id)\r\n  if (raw?.preferredIndex != null) {\r\n    // Lower preferredIndex = higher priority; large base so it dominates.\r\n    score += 10_000 - raw.preferredIndex\r\n  }\r\n  if (model.tags?.includes('free')) score += 5_000\r\n  if (model.tags?.includes('recommended')) score += 2_000\r\n  if (model.id.startsWith('kilo-auto/')) score += 1_500\r\n\r\n  const ctx = model.contextWindow ?? 0\r\n  if (ctx >= 1_000_000) score += 80\r\n  else if (ctx >= 200_000) score += 40\r\n\r\n  return score\r\n}\r\n\r\nfunction blankUsage(): NormalizedUsage {\r\n  return {\r\n    input_tokens: 0,\r\n    output_tokens: 0,\r\n    cache_read_tokens: 0,\r\n    cache_write_tokens: 0,\r\n    thinking_tokens: 0,\r\n  }\r\n}\r\n\r\nfunction* emitErrorTurn(text: string): Generator<AnthropicStreamEvent, void> {\r\n  yield {\r\n    type: 'message_start',\r\n    message: {\r\n      id: `kilo-error-${Date.now()}`,\r\n      type: 'message',\r\n      role: 'assistant',\r\n      content: [],\r\n      model: 'kilo',\r\n      stop_reason: null,\r\n      stop_sequence: null,\r\n      usage: { input_tokens: 0, output_tokens: 0 },\r\n    },\r\n  }\r\n  yield { type: 'content_block_start', index: 0, content_block: { type: 'text', text: '' } }\r\n  yield { type: 'content_block_delta', index: 0, delta: { type: 'text_delta', text } }\r\n  yield { type: 'content_block_stop', index: 0 }\r\n  yield { type: 'message_delta', delta: { stop_reason: 'end_turn' }, usage: { output_tokens: 0 } }\r\n  yield { type: 'message_stop' }\r\n}\r\n\r\nexport const kiloLane = new KiloLane()\r\n", "/**\n * Kilo lane entry point.\n *\n * Registration-only \u2014 the provider shim routes `kilocode` to this lane by\n * name. supportsModel() intentionally returns false: Kilo's catalog is\n * made of OpenRouter-style namespaced ids that overlap anthropic/ openai/\n * google/ on other native lanes, so model-heuristic dispatch would\n * collide.\n */\n\nexport { kiloLane, KiloLane } from './loop.js'\n\nimport { registerLane } from '../dispatcher.js'\nimport { kiloLane } from './loop.js'\nimport { loadProviderKey } from '../../services/api/auth/api_key_manager.js'\n\ninterface StoredKiloOAuthBlob {\n  accessToken?: string\n  meta?: {\n    orgId?: string | null\n  }\n}\n\nfunction readStoredKiloAuth(): { accessToken?: string; orgId?: string | null } {\n  try {\n    const raw = loadProviderKey('kilocode_oauth')\n    if (!raw) return {}\n    const parsed = JSON.parse(raw) as StoredKiloOAuthBlob\n    return {\n      accessToken: parsed.accessToken,\n      orgId: parsed.meta?.orgId ?? null,\n    }\n  } catch {\n    return {}\n  }\n}\n\nexport function initKiloLane(opts?: {\n  accessToken?: string\n  orgId?: string | null\n}): void {\n  const stored = readStoredKiloAuth()\n  kiloLane.configure({\n    accessToken: opts?.accessToken ?? stored.accessToken ?? null,\n    orgId: opts?.orgId ?? stored.orgId ?? null,\n  })\n  registerLane(kiloLane)\n}\n", "/**\r\n * Lane Architecture \u2014 Entry Point\r\n *\r\n * Bootstraps all lanes and the dispatcher. Call initLanes() once at\r\n * startup after provider auth is resolved.\r\n *\r\n * After init, the dispatcher auto-routes every model to its native lane.\r\n * No env vars, no config files needed. User picks a model, it works.\r\n */\r\n\r\nexport {\r\n  registerLane,\r\n  getLane,\r\n  getAllLanes,\r\n  dispatch,\r\n  resolveRoute,\r\n  getLaneStatus,\r\n} from './dispatcher.js'\r\n\r\nexport type {\r\n  Lane,\r\n  LaneRunContext,\r\n  LaneRunResult,\r\n  NormalizedUsage,\r\n  LaneToolRegistration,\r\n  SystemPromptParts,\r\n  SharedTool,\r\n  ToolResult,\r\n  LaneEvent,\r\n} from './types.js'\r\n\r\nexport { shouldUseNativeLane, runNativeLane } from './bridge.js'\r\nexport { LaneBackedProvider } from './provider-bridge.js'\r\n\r\nimport { initGeminiLane } from './gemini/index.js'\r\nimport { initCodexLane } from './codex/index.js'\r\nimport { initOpenAICompatLane } from './openai-compat/index.js'\r\nimport { initQwenLane } from './qwen/index.js'\r\nimport { initClaudeLane } from './claude/index.js'\r\nimport { initKiroLane } from './kiro/index.js'\r\nimport { initCursorLane } from './cursor/index.js'\r\nimport { initClineLane } from './cline/index.js'\r\nimport { initKiloLane } from './kilo/index.js'\r\n\r\n/**\r\n * Initialize all lanes with available auth credentials.\r\n *\r\n * Auth resolution: each lane reads from the opts parameter first,\r\n * then falls back to environment variables, then to stored credentials\r\n * from /login. If no auth is available, the lane registers but marks\r\n * itself unhealthy \u2014 models that need it fall through to the existing\r\n * shim path until the user authenticates.\r\n *\r\n * Call this once at startup.\r\n */\r\nexport function initLanes(opts?: {\r\n  // Gemini\r\n  geminiApiKey?: string\r\n  geminiOAuthToken?: string\r\n  /** Dual-OAuth: token for the Gemini CLI executor (free tier). */\r\n  geminiCliOAuthToken?: string\r\n  /** Dual-OAuth: token for the Antigravity executor (3.x pro/flash). */\r\n  geminiAntigravityOAuthToken?: string\r\n  // OpenAI / Codex\r\n  openaiApiKey?: string\r\n  openaiBaseUrl?: string\r\n  // DeepSeek\r\n  deepseekApiKey?: string\r\n  // GLM / BigModel\r\n  glmApiKey?: string\r\n  glmBaseUrl?: string\r\n  // Moonshot AI / Kimi\r\n  moonshotApiKey?: string\r\n  moonshotBaseUrl?: string\r\n  // MiniMax AI\r\n  minimaxApiKey?: string\r\n  minimaxBaseUrl?: string\r\n  // Groq\r\n  groqApiKey?: string\r\n  // Mistral\r\n  mistralApiKey?: string\r\n  mistralBaseUrl?: string\r\n  // NVIDIA NIM\r\n  nimApiKey?: string\r\n  // Ollama\r\n  ollamaApiKey?: string\r\n  ollamaBaseUrl?: string\r\n  // LM Studio\r\n  lmstudioApiKey?: string\r\n  lmstudioBaseUrl?: string\r\n  // OpenRouter\r\n  openrouterApiKey?: string\r\n  // AgentRouter (independent OpenRouter-style gateway)\r\n  agentrouterApiKey?: string\r\n  // Model Router (lxg2it)\r\n  modelrouterApiKey?: string\r\n  modelrouterBaseUrl?: string\r\n  // Vercel AI Gateway\r\n  vercelApiKey?: string\r\n  vercelBaseUrl?: string\r\n  // Requesty router\r\n  requestyApiKey?: string\r\n  requestyBaseUrl?: string\r\n  // OpenCode Zen gateway\r\n  opencodeApiKey?: string\r\n  opencodeBaseUrl?: string\r\n  // Qwen (DashScope)\r\n  qwenApiKey?: string\r\n  // OAuth-backed providers on the shared compat transport. iFlow uses a\r\n  // derived apiKey pulled from the userinfo endpoint during OAuth.\r\n  iflowApiKey?: string\r\n  kilocodeApiKey?: string\r\n  /** Kilo organization id (stored alongside the OAuth token in\r\n   *  provider-keys.json:kilocode_oauth.meta.orgId). Scopes model\r\n   *  discovery and attribution headers. */\r\n  kilocodeOrgId?: string | null\r\n  /** GitHub Copilot internal token (NOT the GH OAuth access token \u2014 see\r\n   *  oauth_services.ts::completeCopilotOAuth). */\r\n  copilotApiKey?: string\r\n  /** Kiro OAuth access token (AWS SSO OIDC). */\r\n  kiroApiKey?: string\r\n  /** Kiro profileArn (optional \u2014 social-login users have one, Builder-ID\r\n   *  users don't; the lane falls back to a public default when unset). */\r\n  kiroProfileArn?: string\r\n  /** Cursor access token (manual paste from Cursor IDE state.vscdb). */\r\n  cursorApiKey?: string\r\n  /** Cursor machineId (optional \u2014 derived from the token when absent). */\r\n  cursorMachineId?: string\r\n}): void {\r\n  // \u2500\u2500 Claude lane (registration-only: Anthropic traffic uses\r\n  //    services/api/claude.ts directly \u2014 this lane exists for /lane\r\n  //    and /models UX symmetry + smallFastModel lookup). \u2500\u2500\r\n  initClaudeLane()\r\n\r\n  // \u2500\u2500 Gemini lane (Gemini models) \u2500\u2500\r\n  initGeminiLane({\r\n    apiKey: opts?.geminiApiKey,\r\n    oauthToken: opts?.geminiOAuthToken,\r\n    cliOAuthToken: opts?.geminiCliOAuthToken,\r\n    antigravityOAuthToken: opts?.geminiAntigravityOAuthToken,\r\n  })\r\n\r\n  // \u2500\u2500 Codex lane (OpenAI GPT-5, Codex, o-series) \u2500\u2500\r\n  initCodexLane({\r\n    apiKey: opts?.openaiApiKey,\r\n    baseUrl: opts?.openaiBaseUrl,\r\n  })\r\n\r\n  // \u2500\u2500 Qwen lane (native OAuth + DashScope) \u2500\u2500\r\n  // Must register BEFORE openai-compat so the dispatcher picks the\r\n  // dedicated Qwen lane first for qwen-* / coder-model ids. Openai-compat\r\n  // keeps no qwen provider after Phase 2B.\r\n  initQwenLane({\r\n    apiKey: opts?.qwenApiKey,\r\n  })\r\n\r\n  // \u2500\u2500 Kiro lane (AWS CodeWhisperer via EventStream binary frames) \u2500\u2500\r\n  // Registered before openai-compat so its dispatcher-scoped\r\n  // supportsModel() claim on `claude-sonnet-4.5` / `deepseek-3.x` etc.\r\n  // wins over any compat-side fallback. In practice the LaneBackedProvider\r\n  // path routes by provider name, not model heuristic, so ordering is a\r\n  // belt-and-suspenders guard for the future Phase-2 dispatch path.\r\n  initKiroLane({\r\n    accessToken: opts?.kiroApiKey,\r\n    profileArn: opts?.kiroProfileArn,\r\n  })\r\n\r\n  // \u2500\u2500 Cursor lane (ConnectRPC protobuf to api2.cursor.sh) \u2500\u2500\r\n  // Dotted catalog ids (`claude-4.5-sonnet`, `gpt-5.2-codex`) don't\r\n  // collide with Anthropic/OpenAI canonical ids, so the dispatcher's\r\n  // per-provider routing (not model-heuristic) is what matters here.\r\n  initCursorLane({\r\n    accessToken: opts?.cursorApiKey,\r\n    machineId: opts?.cursorMachineId,\r\n  })\r\n\r\n  // \u2500\u2500 Cline lane (native Cline gateway via OAuth) \u2500\u2500\r\n  initClineLane()\r\n\r\n  // \u2500\u2500 Kilo lane (native Kilo Gateway via OAuth bearer) \u2500\u2500\r\n  // Registered before openai-compat so provider-scoped routing for the\r\n  // `kilocode` provider always hits this native lane instead of the\r\n  // legacy compat transformer. Catalog is fetched from\r\n  // api.kilo.ai/api/openrouter/models (subscription-aware) with a\r\n  // curated static fallback.\r\n  initKiloLane({\r\n    accessToken: opts?.kilocodeApiKey,\r\n    orgId: opts?.kilocodeOrgId ?? null,\r\n  })\r\n\r\n  // \u2500\u2500 OpenAI-compat lane (DeepSeek, GLM, Moonshot, Groq, Mistral,\r\n  //    NIM, Ollama, OpenRouter, iFlow, KiloCode, Copilot) \u2500\u2500\r\n  initOpenAICompatLane({\r\n    deepseek: opts?.deepseekApiKey ? { apiKey: opts.deepseekApiKey } : undefined,\r\n    glm: opts?.glmApiKey ? { apiKey: opts.glmApiKey, baseUrl: opts.glmBaseUrl } : undefined,\r\n    moonshot: opts?.moonshotApiKey ? { apiKey: opts.moonshotApiKey, baseUrl: opts.moonshotBaseUrl } : undefined,\r\n    minimax: opts?.minimaxApiKey ? { apiKey: opts.minimaxApiKey, baseUrl: opts.minimaxBaseUrl } : undefined,\r\n    groq: opts?.groqApiKey ? { apiKey: opts.groqApiKey } : undefined,\r\n    mistral: opts?.mistralApiKey ? { apiKey: opts.mistralApiKey, baseUrl: opts.mistralBaseUrl } : undefined,\r\n    nim: opts?.nimApiKey ? { apiKey: opts.nimApiKey } : undefined,\r\n    ollama: opts?.ollamaApiKey || opts?.ollamaBaseUrl\r\n      ? { apiKey: opts?.ollamaApiKey ?? '', baseUrl: opts?.ollamaBaseUrl }\r\n      : undefined,\r\n    lmstudio: opts?.lmstudioApiKey || opts?.lmstudioBaseUrl\r\n      ? { apiKey: opts?.lmstudioApiKey ?? '', baseUrl: opts?.lmstudioBaseUrl }\r\n      : undefined,\r\n    openrouter: opts?.openrouterApiKey ? { apiKey: opts.openrouterApiKey } : undefined,\r\n    agentrouter: opts?.agentrouterApiKey ? { apiKey: opts.agentrouterApiKey } : undefined,\r\n    modelrouter: opts?.modelrouterApiKey ? { apiKey: opts.modelrouterApiKey, baseUrl: opts.modelrouterBaseUrl } : undefined,\r\n    vercel: opts?.vercelApiKey ? { apiKey: opts.vercelApiKey, baseUrl: opts.vercelBaseUrl } : undefined,\r\n    requesty: opts?.requestyApiKey ? { apiKey: opts.requestyApiKey, baseUrl: opts.requestyBaseUrl } : undefined,\r\n    opencode: opts?.opencodeApiKey ? { apiKey: opts.opencodeApiKey, baseUrl: opts.opencodeBaseUrl } : undefined,\r\n    iflow: opts?.iflowApiKey ? { apiKey: opts.iflowApiKey } : undefined,\r\n    kilocode: opts?.kilocodeApiKey ? { apiKey: opts.kilocodeApiKey } : undefined,\r\n    copilot: opts?.copilotApiKey ? { apiKey: opts.copilotApiKey } : undefined,\r\n  })\r\n}\r\n", "/**\r\n * Provider Shim Factory\r\n *\r\n * Returns a duck-typed object that matches the Anthropic SDK interface\r\n * so that claude.ts, withRetry.ts, and the full agent loop work unchanged.\r\n *\r\n * Critical call patterns from claude.ts that we must support:\r\n *\r\n *   // Streaming (line ~1822):\r\n *   const result = await anthropic.beta.messages\r\n *     .create({ ...params, stream: true }, { signal, headers })\r\n *     .withResponse()\r\n *   // result = { data: AsyncIterable<StreamEvent>, request_id, response }\r\n *   stream = result.data\r\n *   for await (const part of stream) { ... }\r\n *\r\n *   // Non-streaming (line ~864):\r\n *   return await anthropic.beta.messages.create(params, { signal, timeout })\r\n *\r\n * The withRetry wrapper expects getClient() \u2192 Promise<Anthropic>.\r\n */\r\n\r\nimport type { APIProvider } from '../../../utils/model/providers.js'\r\nimport {\n  getProviderApiKey,\n  getProviderRuntimeApiKey,\n  getProviderBaseUrl,\n  getProviderAuthMethod,\n  getProviderOAuthToken,\n} from '../../../utils/auth.js'\nimport { loadProviderKey } from '../auth/api_key_manager.js'\r\nimport { getOpenAISessionToken } from '../auth/openai_oauth.js'\r\nimport {\r\n  getClineOAuthToken,\r\n  getIFlowApiKey, getIFlowOAuthToken,\r\n  getKiloCodeOAuthToken, getKiloCodeOrgId,\r\n  getCopilotOAuthToken,\r\n  getKiroOAuthToken,\r\n  getValidCursorOAuthToken,\r\n  getCursorMachineId,\r\n} from '../auth/oauth_services.js'\r\nimport type {\r\n  BaseProvider,\r\n  AnthropicStreamEvent,\r\n  AnthropicMessage,\r\n  ProviderStreamResult,\r\n} from './base_provider.js'\r\nimport { OpenAIProvider } from './openai_provider.js'\nimport { CommandCodeProvider } from './commandcode_provider.js'\nimport { GeminiProvider } from './gemini_provider.js'\nimport { OpenRouterProvider } from './openrouter_provider.js'\r\nimport { GroqProvider } from './groq_provider.js'\r\nimport { NimProvider } from './nim_provider.js'\r\nimport { DeepSeekProvider } from './deepseek_provider.js'\r\nimport { GlmProvider } from './glm_provider.js'\r\nimport { MoonshotProvider } from './moonshot_provider.js'\r\nimport { MiniMaxProvider } from './minimax_provider.js'\r\nimport { OllamaProvider } from './ollama_provider.js'\r\nimport { sanitizeProviderMessagesForNonCursorTransport } from './sanitizeProviderMessages.js'\r\nimport { warmupCodeAssist } from './gemini_code_assist.js'\r\nimport { initLanes, getLane } from '../../../lanes/index.js'\r\nimport { LaneBackedProvider } from '../../../lanes/provider-bridge.js'\r\n\r\n// Lazy-init lanes once per process. Reads env-vars AND stored credentials\r\n// (the ones /login writes to provider-keys.json) so users who authenticated\r\n// interactively get lane-routing without having to export env vars.\r\nlet _lanesInitialized = false\r\n\r\nfunction normalizeOllamaApiKey(apiKey: string | null | undefined): string | null {\r\n  const key = apiKey?.trim()\r\n  return key && key !== 'ollama' ? key : null\r\n}\r\n\r\nfunction normalizeLmStudioApiKey(apiKey: string | null | undefined): string | null {\r\n  const key = apiKey?.trim()\r\n  return key || 'lm-studio'\r\n}\r\n\r\nfunction _ensureLanesInitialized(): void {\r\n  if (_lanesInitialized) return\r\n  _lanesInitialized = true\r\n  try {\r\n    // Dual Gemini OAuth: the CLI token covers free-tier flash/lite models,\r\n    // Antigravity covers Gemini 3.x pro/flash. Stored separately so both can\r\n    // coexist \u2014 the lane routes per-model via executorForModel.\r\n    const cliOAuthToken = _readStoredGeminiToken('gemini_oauth_cli') ?? undefined\r\n    const antigravityOAuthToken = _readStoredGeminiToken('gemini_oauth_antigravity') ?? undefined\r\n    // Phase 4 OAuth providers \u2014 the stored OAuth token IS the lane's\r\n    // bearer credential (iFlow is the odd one: chat uses a derived apiKey\r\n    // pulled from the userinfo endpoint during OAuth, stashed at meta.apiKey).\r\n    const iflowChatKey = getIFlowApiKey() ?? getIFlowOAuthToken() ?? undefined\r\n    const kilocodeToken = getKiloCodeOAuthToken() ?? undefined\r\n    const kilocodeOrgId = getKiloCodeOrgId() ?? null\r\n    // Copilot's stored token IS the internal Copilot API token (not the GH\r\n    // OAuth token). When it expires, refreshCopilotOAuth re-mints via the\r\n    // stored GH refresh token. The session-cached lane snapshot is stale-\r\n    // tolerant: 401s here surface as \"/login github-copilot\" prompts.\r\n    const copilotToken = getCopilotOAuthToken() ?? undefined\r\n    // Kiro: accessToken is the AWS SSO OIDC bearer; profileArn lives in\r\n    // the stored meta for social-login users and defaults in the lane for\r\n    // Builder-ID users (who don't get one back from the token endpoint).\r\n    const kiroToken = getKiroOAuthToken() ?? undefined\r\n    const kiroProfileArn = _readStoredKiroProfileArn() ?? undefined\r\n    // Cursor: accessToken comes from browser login (or a legacy manual\r\n    // import). machineId is optional \u2014 the lane derives it from the\r\n    // token when absent.\r\n    const cursorToken = getValidCursorOAuthToken() ?? undefined\r\n    const cursorMachineId = getCursorMachineId() ?? undefined\r\n    const ollamaApiKey = normalizeOllamaApiKey(getProviderApiKey('ollama'))\r\n    const lmStudioApiKey = normalizeLmStudioApiKey(getProviderApiKey('lmstudio'))\r\n    initLanes({\r\n      geminiApiKey: getProviderApiKey('gemini') ?? undefined,\r\n      geminiCliOAuthToken: cliOAuthToken,\r\n      geminiAntigravityOAuthToken: antigravityOAuthToken,\r\n      openaiApiKey: getProviderApiKey('openai') ?? undefined,\r\n      openaiBaseUrl: process.env.OPENAI_BASE_URL ?? getProviderBaseUrl('openai'),\r\n      deepseekApiKey: getProviderApiKey('deepseek') ?? undefined,\r\n      glmApiKey: getProviderApiKey('glm') ?? undefined,\r\n      glmBaseUrl: getProviderBaseUrl('glm'),\r\n      moonshotApiKey: getProviderApiKey('moonshot') ?? undefined,\r\n      moonshotBaseUrl: getProviderBaseUrl('moonshot'),\r\n      minimaxApiKey: getProviderApiKey('minimax') ?? undefined,\r\n      minimaxBaseUrl: getProviderBaseUrl('minimax'),\r\n      groqApiKey: getProviderApiKey('groq') ?? undefined,\r\n      mistralApiKey: getProviderApiKey('mistral') ?? undefined,\r\n      mistralBaseUrl: getProviderBaseUrl('mistral'),\r\n      nimApiKey: getProviderApiKey('nim') ?? undefined,\r\n      ollamaApiKey: ollamaApiKey ?? undefined,\r\n      ollamaBaseUrl: process.env.OLLAMA_BASE_URL ?? getProviderBaseUrl('ollama'),\r\n      lmstudioApiKey: lmStudioApiKey ?? undefined,\r\n      lmstudioBaseUrl: getProviderBaseUrl('lmstudio'),\r\n      openrouterApiKey: getProviderApiKey('openrouter') ?? undefined,\r\n      agentrouterApiKey: getProviderApiKey('agentrouter') ?? undefined,\r\n      modelrouterApiKey: getProviderApiKey('modelrouter') ?? undefined,\r\n      modelrouterBaseUrl: getProviderBaseUrl('modelrouter'),\r\n      vercelApiKey: getProviderApiKey('vercel') ?? undefined,\r\n      vercelBaseUrl: getProviderBaseUrl('vercel'),\r\n      requestyApiKey: getProviderApiKey('requesty') ?? undefined,\r\n      requestyBaseUrl: getProviderBaseUrl('requesty'),\r\n      opencodeApiKey: getProviderRuntimeApiKey('opencode') ?? undefined,\n      opencodeBaseUrl: getProviderBaseUrl('opencode'),\r\n      qwenApiKey: process.env.DASHSCOPE_API_KEY ?? process.env.QWEN_API_KEY,\r\n      iflowApiKey: iflowChatKey,\r\n      kilocodeApiKey: kilocodeToken,\r\n      kilocodeOrgId: kilocodeOrgId,\r\n      copilotApiKey: copilotToken,\r\n      kiroApiKey: kiroToken,\r\n      kiroProfileArn: kiroProfileArn,\r\n      cursorApiKey: cursorToken,\r\n      cursorMachineId: cursorMachineId,\r\n    })\r\n  } catch {\r\n    // Lane init failure must not break the legacy provider path.\r\n    // The dispatcher will report the lane as unhealthy and the shim\r\n    // falls through to the existing provider implementation.\r\n  }\r\n}\r\n\r\n// Map each shim provider name to the native lane it should route to.\r\n// - Anthropic-native providers (claude-*) don't dispatch through a lane.\r\n// - `openai` \u2192 codex lane (Responses API, apply_patch).\r\n// - `gemini` \u2192 gemini lane.\r\n// - DeepSeek / Groq / NIM / Ollama / OpenRouter \u2192 openai-compat lane.\r\nfunction _laneNameForProvider(provider: APIProvider): string {\r\n  switch (provider) {\r\n    case 'openai':      return 'codex'\r\n    case 'gemini':      return 'gemini'\r\n    // Antigravity rides the same lane as Gemini \u2014 the lane's\r\n    // executorForModel() sends gemini-3-* to cloudcode-pa via the\r\n    // antigravity OAuth pool. Lane picks the right executor and creds\r\n    // per-model, the provider split is purely a UX surface.\r\n    case 'antigravity': return 'gemini'\r\n    case 'deepseek':\r\n    case 'glm':\r\n    case 'moonshot':\r\n    case 'minimax':\r\n    case 'groq':\r\n    case 'mistral':\r\n    case 'nim':\r\n    case 'ollama':\r\n    case 'lmstudio':\r\n    case 'openrouter':\r\n    case 'agentrouter':\r\n    case 'modelrouter':\r\n    case 'vercel':\r\n    case 'requesty':\r\n    case 'opencode':\r\n      return 'openai-compat'\r\n    case 'cline':\r\n      return 'cline'\r\n    // Phase 4 / Phase 5 OAuth-backed OpenAI-compat providers \u2014 share\r\n    // the lane; each gets its own model catalog + base URL branch.\r\n    // Copilot is OAI-compat at the wire level (just needs special headers\r\n    // + the internal token from the github\u2192copilot exchange).\r\n    case 'iflow':\r\n    case 'copilot':\r\n      return 'openai-compat'\r\n    // Kilo has its own lane (native Kilo Gateway wire + subscription-\r\n    // aware catalog). Not compat \u2014 matches Kilo CLI behavior.\r\n    case 'kilocode':\r\n      return 'kilo'\r\n    // Kiro has its own lane (CodeWhisperer EventStream) \u2014 not compat.\r\n    case 'kiro':\r\n      return 'kiro'\r\n    // Cursor has its own lane (ConnectRPC protobuf) \u2014 not compat.\r\n    case 'cursor':\r\n      return 'cursor'\r\n    default:\r\n      return provider as string\r\n  }\r\n}\r\n\r\n// Native lanes are ON by default \u2014 each model sees its home environment\r\n// (native tools, native prompt, native cache, native streaming). The lane\r\n// auto-disables itself when it can't serve the request (e.g. OAuth-only\r\n// Gemini users fall through to legacy gemini_provider until OAuth is\r\n// ported into the lane), so this flip is safe for all auth paths.\r\n//\r\n// Explicit opt-out for debugging:\r\n//   CLAUDEX_NATIVE_LANES=off             \u2192 every lane disabled, legacy path\r\n//   CLAUDEX_NATIVE_LANES=legacy          \u2192 same as off\r\n//   CLAUDEX_NATIVE_LANES=-gemini,-codex  \u2192 disable specific lanes\r\n//   CLAUDEX_NATIVE_LANES=gemini          \u2192 legacy default (named allow-list)\r\nfunction _nativeLaneEnabledFor(provider: APIProvider): boolean {\r\n  const raw = process.env.CLAUDEX_NATIVE_LANES\r\n  if (!raw) return true  // default ON\r\n  const normalized = raw.toLowerCase().trim()\r\n  if (normalized === 'off' || normalized === 'legacy' || normalized === '0' || normalized === 'false') {\r\n    return false\r\n  }\r\n  if (normalized === 'all' || normalized === '1' || normalized === 'true') return true\r\n  const laneName = _laneNameForProvider(provider)\r\n  const tokens = normalized.split(/[,\\s]+/).filter(Boolean)\r\n  // Entries prefixed with `-` opt specific lanes OUT of the default-on set.\r\n  const disabled = new Set(tokens.filter(t => t.startsWith('-')).map(t => t.slice(1)))\r\n  if (disabled.has(laneName) || disabled.has(provider)) return false\r\n  const enabled = tokens.filter(t => !t.startsWith('-'))\r\n  // No allow-list entries \u2192 default ON for any lane not explicitly disabled.\r\n  if (enabled.length === 0) return true\r\n  return enabled.includes(laneName) || enabled.includes(provider)\r\n}\r\n\r\n/**\r\n * Create a provider instance for the given provider type.\r\n * Resolves auth method (API key vs OAuth) and injects the right credentials.\r\n */\r\nfunction createProvider(provider: APIProvider): BaseProvider {\r\n  _ensureLanesInitialized()\r\n\r\n  // Native-lane opt-in. When set, use the LaneBackedProvider so the model\r\n  // sees its home environment (native tools, native prompt, native cache,\r\n  // native API). Otherwise fall through to the legacy shim path.\r\n  if (_nativeLaneEnabledFor(provider)) {\r\n    const laneName = _laneNameForProvider(provider)\r\n    const lane = getLane(laneName)\r\n    if (lane && lane.isHealthy()) {\r\n      // Pass the provider name as a hint so shared lanes (openai-compat)\r\n      // can filter /v1/models per-provider \u2014 otherwise /models groq\r\n      // returns the union of every compat provider's catalog.\r\n      return new LaneBackedProvider(lane, provider)\r\n    }\r\n    // Lane not registered / unhealthy \u2192 legacy path below.\r\n  }\n\n  const authMethod = getProviderAuthMethod(provider)\n  const apiKey = provider === 'opencode'\n    ? getProviderRuntimeApiKey(provider) ?? ''\n    : getProviderApiKey(provider) ?? ''\n  const baseUrl = getProviderBaseUrl(provider)\n\r\n  switch (provider) {\r\n    case 'openai': {\r\n      if (authMethod === 'oauth') {\r\n        const oauthToken = getProviderOAuthToken('openai') ?? ''\r\n        const sessionToken = getOpenAISessionToken() ?? undefined\r\n        return new OpenAIProvider({ apiKey: oauthToken, baseUrl, sessionToken })\r\n      }\r\n      return new OpenAIProvider({ apiKey, baseUrl })\r\n    }\r\n    case 'gemini': {\r\n      if (authMethod === 'oauth') {\r\n        // CLI-tier OAuth only \u2014 Antigravity has its own provider row.\r\n        const cliToken = _readStoredGeminiToken('gemini_oauth_cli')\r\n        warmupCodeAssist(cliToken ?? undefined, undefined)\r\n        return new GeminiProvider({\r\n          apiKey: apiKey ?? '',\r\n          baseUrl,\r\n          cliOAuthToken: cliToken ?? undefined,\r\n        })\r\n      }\r\n      return new GeminiProvider({ apiKey, baseUrl })\r\n    }\r\n    case 'antigravity': {\r\n      // Antigravity is OAuth-only, wrapping the same Gemini provider but\r\n      // fed ONLY the antigravity OAuth token. Lane's executorForModel()\r\n      // recognizes the gemini-3-* ids and routes them to cloudcode-pa\r\n      // with the correct Code Assist body envelope.\r\n      const antigravityToken = _readStoredGeminiToken('gemini_oauth_antigravity')\r\n      warmupCodeAssist(undefined, antigravityToken ?? undefined)\r\n      return new GeminiProvider({\r\n        apiKey: '',\r\n        baseUrl,\r\n        antigravityOAuthToken: antigravityToken ?? undefined,\r\n      })\r\n    }\r\n    case 'openrouter':\r\n      return new OpenRouterProvider({ apiKey })\r\n    case 'agentrouter':\r\n      // Routed through the openai-compat lane (LaneBackedProvider) above.\r\n      // We only reach this branch if the lane is unhealthy / not registered,\r\n      // so surface a useful message rather than constructing a stub.\r\n      throw new Error(\r\n        'AgentRouter chat requires the openai-compat lane to be healthy. '\r\n        + 'Run `/login` to authenticate, or check that AGENT_ROUTER_TOKEN or AGENTROUTER_API_KEY is set.',\r\n      )\r\n    case 'modelrouter':\n    case 'vercel':\n    case 'requesty':\n    case 'opencode':\n      return new OpenAIProvider({ apiKey, baseUrl })\n    case 'commandcode':\n      return new CommandCodeProvider({ apiKey, baseUrl })\n    case 'groq':\r\n      return new GroqProvider({ apiKey })\r\n    case 'mistral':\r\n      throw new Error(\r\n        'Mistral chat requires the openai-compat lane to be healthy. '\r\n        + 'Run `/login` to authenticate, or check that MISTRAL_API_KEY is set.',\r\n      )\r\n    case 'nim':\r\n      return new NimProvider({ apiKey, baseUrl })\r\n    case 'deepseek':\r\n      return new DeepSeekProvider({ apiKey, baseUrl })\r\n    case 'glm':\r\n      return new GlmProvider({ apiKey, baseUrl })\r\n    case 'moonshot':\r\n      return new MoonshotProvider({ apiKey, baseUrl })\r\n    case 'minimax':\r\n      return new MiniMaxProvider({ apiKey, baseUrl })\r\n    case 'ollama':\r\n      return new OllamaProvider({ apiKey, baseUrl })\r\n    case 'lmstudio':\r\n      return new OpenAIProvider({ apiKey: apiKey || 'lm-studio', baseUrl })\r\n    // Phase 4 / Phase 5 OAuth-compat providers: they're expected to reach\r\n    // the openai-compat lane above. If we got here, the lane is unhealthy\r\n    // (missing creds or the register step failed) \u2014 surface a useful\r\n    // message instead of \"Unknown provider\".\r\n    case 'cline':\n      throw new Error(\n        'Cline chat requires the cline lane to be healthy. Run `/login cline` to complete the device login.',\n      )\n    case 'iflow':\r\n    case 'copilot':\r\n      throw new Error(\r\n        `${provider} chat requires the openai-compat lane to be healthy. ` +\r\n        `Run \\`/login\\` to authenticate, or check that the OAuth tokens were stored.`,\r\n      )\r\n    case 'kilocode':\r\n      throw new Error(\r\n        'Kilo chat requires the kilo lane to be healthy. Run `/login kilocode` to authenticate.',\r\n      )\r\n    case 'kiro':\r\n      // Kiro chat routes through the dedicated kiro lane above. We only\r\n      // reach this branch when the lane is unhealthy (no stored token).\r\n      throw new Error(\r\n        'Kiro chat requires the kiro lane to be healthy. Run `/login kiro` to authenticate.',\r\n      )\r\n    case 'cursor':\r\n      throw new Error(\r\n        'Cursor chat requires the cursor lane to be healthy. Run `/login cursor` to complete the browser login.',\r\n      )\r\n    default:\r\n      throw new Error(`Unknown third-party provider: ${provider}`)\r\n  }\r\n}\r\n\r\n/**\r\n * Wraps a ProviderStreamResult so that it looks like an Anthropic SDK\r\n * `Stream<BetaRawMessageStreamEvent>`, which is what claude.ts iterates.\r\n *\r\n * Critically, the `controller` is wired to the provider's own abort so\r\n * that calling `stream.controller.abort()` in claude.ts actually cancels\r\n * the in-flight fetch request \u2014 not just a disconnected dummy.\r\n */\r\nfunction wrapAsAnthropicStream(\r\n  providerStream: ProviderStreamResult,\r\n): AsyncIterable<AnthropicStreamEvent> & { controller: AbortController } {\r\n  const controller = new AbortController()\r\n  const iterable = providerStream[Symbol.asyncIterator]()\r\n\r\n  // Bridge: when claude.ts aborts the controller, propagate to provider.\r\n  controller.signal.addEventListener('abort', () => {\r\n    providerStream.abort()\r\n  }, { once: true })\r\n\r\n  return {\r\n    controller,\r\n    [Symbol.asyncIterator]() {\r\n      return iterable\r\n    },\r\n  }\r\n}\r\n\r\n/**\r\n * Creates a `.create()` method that returns a \"thenable\" matching the\r\n * Anthropic SDK pattern: `create(params, opts).withResponse()`.\r\n *\r\n * - If params.stream === true \u2192 returns an async iterable of stream events\r\n *   with `.withResponse()` returning `{ data, request_id, response }`\r\n * - If params.stream is falsy \u2192 returns an AnthropicMessage directly\r\n *   with `.withResponse()` returning `{ data, request_id, response }`\r\n *\r\n * Supports opts.signal (AbortSignal) and opts.timeout (ms) from claude.ts.\r\n */\r\nfunction createMethod(p: BaseProvider) {\r\n  return function create(params: Record<string, unknown>, opts?: Record<string, unknown>) {\r\n    const isStreaming = params.stream === true\r\n    const outboundParams =\r\n      p.name === 'cursor'\r\n        ? params\r\n        : sanitizeOutboundParamsForProvider(params)\r\n\r\n    // Extract signal and timeout from opts (claude.ts passes these).\r\n    const externalSignal = opts?.signal as AbortSignal | undefined\r\n    const timeoutMs = opts?.timeout as number | undefined\r\n\r\n    // Build the base promise. For non-streaming with timeout, use\r\n    // AbortSignal.timeout() combined with any external signal.\r\n    let basePromise: Promise<ProviderStreamResult | AnthropicMessage>\r\n    if (isStreaming) {\r\n      basePromise = p.stream(outboundParams as any)\r\n    } else {\r\n      basePromise = p.create(outboundParams as any)\r\n      // Apply timeout for non-streaming requests (claude.ts passes\r\n      // timeout: 120000 or 300000 for the non-streaming fallback).\r\n      if (timeoutMs && timeoutMs > 0) {\r\n        const timer = setTimeout(() => {}, 0) // no-op, we use race\r\n        basePromise = Promise.race([\r\n          basePromise,\r\n          new Promise<never>((_, reject) => {\r\n            const t = setTimeout(() => reject(new Error(\r\n              `Gemini API error 408: Request timed out after ${timeoutMs}ms`,\r\n            )), timeoutMs)\r\n            // Clean up if the request finishes first.\r\n            basePromise.finally(() => clearTimeout(t))\r\n          }),\r\n        ])\r\n        clearTimeout(timer)\r\n      }\r\n    }\r\n\r\n    // If an external signal is provided and already aborted, reject now.\r\n    if (externalSignal?.aborted) {\r\n      basePromise = Promise.reject(new DOMException('Aborted', 'AbortError'))\r\n    }\r\n\r\n    // Attach .withResponse() to the promise\r\n    const enhanced = basePromise.then((result: any) => {\r\n      if (isStreaming) {\r\n        // result is a ProviderStreamResult \u2192 wrap as Anthropic Stream\r\n        return wrapAsAnthropicStream(result as ProviderStreamResult)\r\n      }\r\n      // result is an AnthropicMessage\r\n      return result\r\n    }) as Promise<any> & {\r\n      withResponse: () => Promise<{ data: any; request_id: string | null; response: Response | null }>\r\n    }\r\n\r\n    // .withResponse() wraps the result in { data, request_id, response }\r\n    enhanced.withResponse = () => {\r\n      return basePromise.then((result: any) => {\r\n        if (isStreaming) {\r\n          const stream = wrapAsAnthropicStream(result as ProviderStreamResult)\r\n          return {\r\n            data: stream,\r\n            request_id: null as string | null,\r\n            response: null as Response | null,\r\n          }\r\n        }\r\n        return {\r\n          data: result,\r\n          request_id: null as string | null,\r\n          response: null as Response | null,\r\n        }\r\n      })\r\n    }\r\n\r\n    return enhanced\r\n  }\r\n}\r\n\r\nfunction sanitizeOutboundParamsForProvider(\r\n  params: Record<string, unknown>,\r\n): Record<string, unknown> {\r\n  const messages = params.messages\r\n  if (!Array.isArray(messages)) return params\r\n  const sanitizedMessages = sanitizeProviderMessagesForNonCursorTransport(\r\n    messages as import('./base_provider.js').ProviderMessage[],\r\n  )\r\n  return sanitizedMessages === messages\r\n    ? params\r\n    : { ...params, messages: sanitizedMessages }\r\n}\r\n\r\n/**\r\n * Creates a duck-typed object that matches enough of the Anthropic SDK\r\n * interface for claude.ts, withRetry.ts, and the agent loop to use\r\n * transparently.\r\n *\r\n * Supports:\r\n *   anthropic.beta.messages.create(params).withResponse()\r\n *   anthropic.beta.messages.create(params)  (plain)\r\n *   anthropic.messages.create(params)\r\n *   for await (const part of stream) { ... }\r\n */\r\nexport function createProviderShim(provider: APIProvider): unknown {\r\n  const p = createProvider(provider)\r\n  const create = createMethod(p)\r\n\r\n  return {\r\n    beta: {\r\n      messages: {\r\n        create,\r\n        stream: (params: Record<string, unknown>) =>\r\n          p.stream({ ...params, stream: true } as any),\r\n      },\r\n    },\r\n    messages: {\r\n      create,\r\n      stream: (params: Record<string, unknown>) =>\r\n        p.stream({ ...params, stream: true } as any),\r\n    },\r\n    // Expose provider metadata for diagnostics\r\n    _provider: p,\r\n    _providerName: p.name,\r\n  }\r\n}\r\n\r\n/**\r\n * Get a provider instance directly (for listModels, etc.).\r\n */\r\nexport function getProvider(provider: APIProvider): BaseProvider {\r\n  return createProvider(provider)\r\n}\r\n\r\n/**\r\n * Synchronously read a stored Gemini OAuth token from provider-keys.json.\r\n * Returns the accessToken if stored and not expired, null otherwise.\r\n * No async refresh \u2014 that's handled by the client.ts pre-flight.\r\n */\r\n/**\r\n * Read a stored Gemini OAuth token synchronously from disk.\r\n *\r\n * Behavior:\r\n *   - Returns the access_token string when present.\r\n *   - If the stored blob is past its `expiresAt` timestamp, fire an\r\n *     async background refresh via `refreshGeminiOAuth` using the\r\n *     saved refresh_token; the updated token gets written back to\r\n *     storage and the NEXT call to this function (next request) will\r\n *     see the fresh token. We still return the expired token right\r\n *     now \u2014 the API call will 401 and the lane's retry path picks up\r\n *     the refreshed token from storage on re-read. Better than\r\n *     returning null and forcing the user to `/login` again.\r\n *\r\n * If there's no refresh token (first run, or user revoked), we return\r\n * null as before.\r\n */\r\nfunction _readStoredGeminiToken(storageKey: string): string | null {\r\n  try {\r\n    const raw = loadProviderKey(storageKey)\r\n    if (!raw) return null\r\n    const tokens = JSON.parse(raw) as {\r\n      accessToken?: string\r\n      refreshToken?: string\r\n      expiresAt?: number\r\n    }\r\n    const accessToken = tokens.accessToken ?? null\r\n    const isExpired = tokens.expiresAt != null\r\n      && Date.now() > tokens.expiresAt - 5 * 60 * 1000\r\n    if (isExpired && tokens.refreshToken) {\r\n      // Fire-and-forget refresh \u2014 the updated token lands in storage\r\n      // before the request completes in most cases, and if not the 401\r\n      // path re-reads and retries. Avoids blocking the sync boot path.\r\n      _refreshGeminiTokenInBackground(storageKey, tokens.refreshToken)\r\n    }\r\n    return accessToken\r\n  } catch {\r\n    return null\r\n  }\r\n}\r\n\r\n/**\r\n * Async background refresh of a stored Gemini OAuth token. Writes the\r\n * refreshed access_token + expires_at back via saveProviderKey, AND\r\n * reconfigures the in-memory Gemini API client so the next request on\r\n * the SAME session picks up the new token without a process restart.\r\n */\r\nconst _geminiRefreshInFlight = new Map<string, Promise<void>>()\r\nfunction _refreshGeminiTokenInBackground(\r\n  storageKey: string,\r\n  refreshToken: string,\r\n): void {\r\n  if (_geminiRefreshInFlight.has(storageKey)) return\r\n  const p = (async () => {\r\n    try {\r\n      const type = storageKey === 'gemini_oauth_cli' ? 'cli' : 'antigravity'\r\n      // Dynamic import avoids circular deps between providerShim and\r\n      // google_oauth (which imports from auth/api_key_manager that this\r\n      // file transitively depends on).\r\n      const { refreshGeminiOAuth } = await import('../auth/google_oauth.js')\r\n      await refreshGeminiOAuth(type, refreshToken)\r\n      // refreshGeminiOAuth() already saved the new token blob. Now push\r\n      // it into the lane's in-memory API client so this session uses it.\r\n      const next = loadProviderKey(storageKey)\r\n      if (next) {\r\n        try {\r\n          const parsed = JSON.parse(next) as { accessToken?: string }\r\n          if (parsed.accessToken) {\r\n            const { geminiApi } = await import('../../../lanes/gemini/api.js')\r\n            if (type === 'cli') {\r\n              geminiApi.configure({ cliOAuthToken: parsed.accessToken })\r\n            } else {\r\n              geminiApi.configure({ antigravityOAuthToken: parsed.accessToken })\r\n            }\r\n          }\r\n        } catch {\r\n          // best-effort; the disk write succeeded which is what matters\r\n        }\r\n      }\r\n    } catch {\r\n      // Refresh failed \u2014 the access_token may simply have expired AND\r\n      // the refresh_token may have been revoked. The next request will\r\n      // 401 and the auth-stale path prompts the user to re-login.\r\n    } finally {\r\n      _geminiRefreshInFlight.delete(storageKey)\r\n    }\r\n  })()\r\n  _geminiRefreshInFlight.set(storageKey, p)\r\n}\r\n\r\n/**\r\n * Read the stored Kiro profileArn (set for social-login users;\r\n * undefined for Builder-ID users, who get a hardcoded default in the\r\n * lane itself). Synchronous \u2014 used during lane init.\r\n */\r\nfunction _readStoredKiroProfileArn(): string | null {\r\n  try {\r\n    const raw = loadProviderKey('kiro_oauth')\r\n    if (!raw) return null\r\n    const parsed = JSON.parse(raw) as { meta?: { profileArn?: string } }\r\n    return parsed.meta?.profileArn ?? null\r\n  } catch {\r\n    return null\r\n  }\r\n}\r\n\r\n/**\r\n * Reconfigure the Kiro lane's in-memory auth from whatever is currently\r\n * on disk. Called by /login kiro after it writes new tokens so the\r\n * session picks them up without a process restart.\r\n */\r\nexport async function reloadKiroLaneAuth(): Promise<void> {\r\n  const accessToken = getKiroOAuthToken() ?? undefined\r\n  const profileArn = _readStoredKiroProfileArn() ?? undefined\r\n  const { kiroLane } = await import('../../../lanes/kiro/index.js')\r\n  kiroLane.configure({ accessToken, profileArn })\r\n}\r\n\r\n/**\r\n * Reconfigure the Copilot provider inside the shared openai-compat lane\r\n * from whatever token is currently stored on disk. Called after `/login\r\n * copilot` and after automatic token refresh so the running session\r\n * stops using any stale bearer captured during lane init.\r\n */\r\nexport async function reloadCopilotLaneAuth(): Promise<void> {\r\n  const { openaiCompatLane } = await import('../../../lanes/openai-compat/index.js')\r\n  const accessToken = getCopilotOAuthToken() ?? undefined\r\n  if (!accessToken) {\r\n    openaiCompatLane.unregisterProvider('copilot')\r\n    return\r\n  }\r\n  openaiCompatLane.registerProvider(\r\n    'copilot',\r\n    accessToken,\r\n    'https://api.githubcopilot.com',\r\n  )\r\n}\r\n\r\n/**\r\n * Reconfigure the Cursor lane's in-memory auth from whatever is currently\r\n * on disk. Called by /login cursor after it writes a fresh token so the\r\n * session picks it up without a process restart.\r\n */\r\nexport async function reloadCursorLaneAuth(): Promise<void> {\r\n  const accessToken = getValidCursorOAuthToken() ?? undefined\r\n  const machineId = getCursorMachineId() ?? undefined\r\n  const { cursorLane } = await import('../../../lanes/cursor/index.js')\r\n  cursorLane.configure({ accessToken, machineId })\r\n}\r\n\r\n/**\r\n * Refresh the Cline lane's in-memory auth hints and model cache from disk.\r\n * The lane also re-reads provider keys dynamically at request time, so this\r\n * is mainly about immediate health flips after login/logout.\r\n */\r\nexport async function reloadClineLaneAuth(): Promise<void> {\r\n  const accessToken = getClineOAuthToken() ?? undefined\r\n  const { clineLane } = await import('../../../lanes/cline/index.js')\r\n  clineLane.configure({ oauthToken: accessToken })\r\n  clineLane.invalidateModelCache()\r\n}\r\n\r\n/**\r\n * Reconfigure the Kilo lane's in-memory auth + orgId hint from disk and\r\n * drop its model cache. Called by /login kilocode after writing new\r\n * tokens so the session picks them up without a process restart.\r\n */\r\nexport async function reloadKiloLaneAuth(): Promise<void> {\r\n  const accessToken = getKiloCodeOAuthToken() ?? null\r\n  const orgId = getKiloCodeOrgId() ?? null\r\n  const { kiloLane } = await import('../../../lanes/kilo/index.js')\r\n  kiloLane.configure({ accessToken, orgId })\r\n  kiloLane.invalidateModelCache()\r\n}\r\n\r\n/**\r\n * Reconfigure an API-key-backed provider inside the shared openai-compat\r\n * lane. Called after /login writes a new key so DeepSeek/NIM/OpenRouter\r\n * become usable immediately in the current process.\r\n */\r\nexport async function reloadOpenAICompatProviderAuth(provider: APIProvider): Promise<void> {\r\n  switch (provider) {\r\n    case 'deepseek':\r\n    case 'glm':\r\n    case 'moonshot':\r\n    case 'minimax':\r\n    case 'mistral':\r\n    case 'nim':\r\n    case 'openrouter':\r\n    case 'agentrouter':\r\n    case 'modelrouter':\r\n    case 'vercel':\r\n    case 'requesty':\r\n    case 'opencode':\r\n    case 'groq':\r\n    case 'ollama':\r\n    case 'lmstudio':\r\n      break\r\n    default:\r\n      return\r\n  }\r\n\r\n  const { openaiCompatLane } = await import('../../../lanes/openai-compat/index.js')\r\n  if (provider === 'ollama') {\r\n    openaiCompatLane.registerProvider(\r\n      'ollama',\r\n      normalizeOllamaApiKey(getProviderApiKey('ollama')) ?? '',\r\n      getProviderBaseUrl('ollama'),\r\n    )\r\n    openaiCompatLane.setHealthy(true)\r\n    return\r\n  }\r\n\r\n  if (provider === 'lmstudio') {\r\n    openaiCompatLane.registerProvider(\r\n      'lmstudio',\r\n      normalizeLmStudioApiKey(getProviderApiKey('lmstudio')) ?? '',\r\n      getProviderBaseUrl('lmstudio'),\r\n    )\r\n    openaiCompatLane.setHealthy(true)\r\n    return\r\n  }\r\n\r\n  const apiKey = provider === 'opencode'\n    ? getProviderRuntimeApiKey(provider)\n    : getProviderApiKey(provider)\n  if (!apiKey) {\n    openaiCompatLane.unregisterProvider(provider)\n    return\n  }\r\n\r\n  openaiCompatLane.registerProvider(provider, apiKey, getProviderBaseUrl(provider))\r\n  openaiCompatLane.setHealthy(true)\r\n}\r\n\r\n/**\r\n * Reconfigure the Gemini lane's in-memory API client from whatever is\r\n * currently on disk. Called by the /login command right after it writes\r\n * new tokens, so the session picks them up without a restart.\r\n */\r\nexport async function reloadGeminiLaneAuth(): Promise<void> {\r\n  const cliToken = _readStoredGeminiToken('gemini_oauth_cli') ?? undefined\r\n  const antigravityToken = _readStoredGeminiToken('gemini_oauth_antigravity') ?? undefined\r\n  const apiKey = getProviderApiKey('gemini') ?? undefined\r\n  const { geminiApi } = await import('../../../lanes/gemini/api.js')\r\n  geminiApi.configure({\r\n    apiKey,\r\n    cliOAuthToken: cliToken,\r\n    antigravityOAuthToken: antigravityToken,\r\n  })\r\n  // Mark the lane healthy now that auth is fresh. If neither token is\r\n  // present, configure() already falls back to unhealthy via its own\r\n  // isConfigured check \u2014 we just call setHealthy to surface the change.\r\n  const { geminiLane } = await import('../../../lanes/gemini/loop.js')\r\n  geminiLane.setHealthy(!!(apiKey || cliToken || antigravityToken))\r\n}\r\n", "/**\r\n * API Key Manager \u2014 persistent storage for third-party provider API keys.\r\n *\r\n * Stores keys in: ~/.config/claude-code/provider-keys.json\r\n * Keys are encrypted at rest using a machine-local key derived from the OS username.\r\n *\r\n * This allows users to configure provider keys once via `claude config` or\r\n * env vars, and have them persist across sessions without re-entry.\r\n */\r\n\r\nimport { homedir } from 'os'\r\nimport { join } from 'path'\r\nimport { readFileSync, writeFileSync, mkdirSync, existsSync } from 'fs'\r\n\r\nconst CONFIG_DIR = join(homedir(), '.config', 'claude-code')\r\nconst KEYS_FILE = join(CONFIG_DIR, 'provider-keys.json')\r\n\r\ninterface KeyStore {\r\n  version: 1\r\n  keys: Record<string, string>  // provider \u2192 API key\r\n  metadata: Record<string, {    // provider \u2192 metadata\r\n    savedAt: string\r\n    format?: string\r\n  }>\r\n}\r\n\r\n// \u2500\u2500\u2500 In-memory cache \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n// Avoids repeated synchronous disk reads on every hasStoredKey/loadProviderKey call.\r\n// Invalidated on write and after a TTL to pick up external edits.\r\n\r\nlet _cachedStore: KeyStore | null = null\r\nlet _cacheTimestamp = 0\r\nconst CACHE_TTL_MS = 30_000 // 30 seconds\r\n\r\nfunction ensureConfigDir(): void {\r\n  if (!existsSync(CONFIG_DIR)) {\r\n    mkdirSync(CONFIG_DIR, { recursive: true })\r\n  }\r\n}\r\n\r\nfunction readStore(): KeyStore {\r\n  const now = Date.now()\r\n  if (_cachedStore && (now - _cacheTimestamp) < CACHE_TTL_MS) {\r\n    return _cachedStore\r\n  }\r\n  try {\r\n    if (!existsSync(KEYS_FILE)) {\r\n      _cachedStore = { version: 1, keys: {}, metadata: {} }\r\n      _cacheTimestamp = now\r\n      return _cachedStore\r\n    }\r\n    const data = readFileSync(KEYS_FILE, 'utf-8')\r\n    const parsed = JSON.parse(data)\r\n    if (parsed.version !== 1) {\r\n      _cachedStore = { version: 1, keys: {}, metadata: {} }\r\n      _cacheTimestamp = now\r\n      return _cachedStore\r\n    }\r\n    _cachedStore = parsed as KeyStore\r\n    _cacheTimestamp = now\r\n    return _cachedStore\r\n  } catch {\r\n    _cachedStore = { version: 1, keys: {}, metadata: {} }\r\n    _cacheTimestamp = now\r\n    return _cachedStore\r\n  }\r\n}\r\n\r\nfunction writeStore(store: KeyStore): void {\r\n  ensureConfigDir()\r\n  writeFileSync(KEYS_FILE, JSON.stringify(store, null, 2), {\r\n    mode: 0o600,  // Owner read/write only\r\n  })\r\n  // Update cache immediately after write\r\n  _cachedStore = store\r\n  _cacheTimestamp = Date.now()\r\n}\r\n\r\n/**\r\n * Save an API key for a provider.\r\n */\r\nexport function saveProviderKey(provider: string, key: string): void {\r\n  const store = readStore()\r\n  store.keys[provider] = key\r\n  store.metadata[provider] = {\r\n    savedAt: new Date().toISOString(),\r\n    format: detectKeyFormat(provider, key),\r\n  }\r\n  writeStore(store)\r\n}\r\n\r\n/**\r\n * Load a stored API key for a provider.\r\n * Returns null if no key is stored.\r\n */\r\nexport function loadProviderKey(provider: string): string | null {\r\n  const store = readStore()\r\n  return store.keys[provider] ?? null\r\n}\r\n\r\n/**\r\n * Delete a stored API key for a provider.\r\n */\r\nexport function deleteProviderKey(provider: string): void {\r\n  const store = readStore()\r\n  delete store.keys[provider]\r\n  delete store.metadata[provider]\r\n  writeStore(store)\r\n}\r\n\r\n/**\r\n * List all providers that have stored API keys.\r\n */\r\nexport function listConfiguredProviders(): string[] {\r\n  const store = readStore()\r\n  return Object.keys(store.keys)\r\n}\r\n\r\n/**\r\n * Check if a provider has a stored API key.\r\n */\r\nexport function hasStoredKey(provider: string): boolean {\r\n  const store = readStore()\r\n  return provider in store.keys\r\n}\r\n\r\n/**\r\n * Returns true if any third-party provider has a stored credential\r\n * (API key or OAuth token). Used by the first-run wizard to decide\r\n * whether to prompt for provider setup.\r\n *\r\n * Note: Anthropic-native auth lives in a separate config file and\r\n * should be checked separately via hasAnthropicApiKeyAuth() or\r\n * getClaudeAIOAuthTokens() \u2014 this helper covers only third-party\r\n * providers stored in provider-keys.json.\r\n */\r\nexport function hasAnyThirdPartyProviderConfigured(): boolean {\r\n  const store = readStore()\r\n  return Object.keys(store.keys).some(key => key !== 'firecrawl')\r\n}\r\n\r\n/**\r\n * Detect key format based on known provider prefixes.\r\n */\r\nfunction detectKeyFormat(provider: string, key: string): string {\r\n  // OAuth token entries are JSON blobs, not raw keys\r\n  if (provider.endsWith('_oauth')) return 'oauth_token'\r\n\r\n  const prefixes: Record<string, string> = {\r\n    openai: 'sk-',\r\n    openrouter: 'sk-or-',\r\n    agentrouter: 'sk-',\r\n    modelrouter: '',\r\n    vercel: '',\n    requesty: '',\n    opencode: '',\n    commandcode: '',\n    groq: 'gsk_',\n    mistral: '',\r\n    nim: 'nvapi-',\r\n    gemini: 'AIza',\r\n    deepseek: 'sk-',\r\n    moonshot: 'sk-',\r\n    firecrawl: 'fc-',\r\n  }\r\n  const expected = prefixes[provider]\r\n  if (expected && key.startsWith(expected)) return 'standard'\r\n  if (expected && !key.startsWith(expected)) return 'non-standard'\r\n  return 'unknown'\r\n}\r\n\r\n// \u2500\u2500\u2500 Key Validation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\ninterface KeyValidation {\r\n  prefix: string\r\n  minLength: number\r\n  displayName: string\r\n}\r\n\r\nconst KEY_VALIDATIONS: Record<string, KeyValidation> = {\r\n  openai: { prefix: 'sk-', minLength: 20, displayName: 'OpenAI' },\r\n  openrouter: { prefix: 'sk-or-', minLength: 20, displayName: 'OpenRouter' },\r\n  agentrouter: { prefix: 'sk-', minLength: 16, displayName: 'AgentRouter' },\r\n  modelrouter: { prefix: '', minLength: 10, displayName: 'Model Router' },\r\n  vercel: { prefix: '', minLength: 10, displayName: 'Vercel AI Gateway' },\r\n  requesty: { prefix: '', minLength: 10, displayName: 'Requesty' },\n  opencode: { prefix: '', minLength: 10, displayName: 'OpenCode Zen' },\n  commandcode: { prefix: '', minLength: 10, displayName: 'Command Code' },\n  groq: { prefix: 'gsk_', minLength: 20, displayName: 'Groq' },\n  mistral: { prefix: '', minLength: 20, displayName: 'Mistral' },\r\n  nim: { prefix: 'nvapi-', minLength: 20, displayName: 'NVIDIA NIM' },\r\n  gemini: { prefix: 'AIza', minLength: 30, displayName: 'Gemini' },\r\n  deepseek: { prefix: 'sk-', minLength: 20, displayName: 'DeepSeek' },\r\n  moonshot: { prefix: 'sk-', minLength: 20, displayName: 'Moonshot AI' },\r\n  minimax: { prefix: '', minLength: 10, displayName: 'MiniMax AI' },\r\n  firecrawl: { prefix: 'fc-', minLength: 10, displayName: 'Firecrawl' },\r\n}\r\n\r\n/**\r\n * Validate an API key format for a specific provider.\r\n * Returns { valid: true } or { valid: false, error: string }.\r\n */\r\nexport function validateKeyFormat(\r\n  provider: string,\r\n  key: string,\r\n): { valid: boolean; error?: string } {\r\n  const trimmed = key.trim()\r\n\r\n  if (!trimmed) {\r\n    return { valid: false, error: 'API key cannot be empty.' }\r\n  }\r\n\r\n  if (trimmed.includes(' ') || trimmed.includes('\\n')) {\r\n    return { valid: false, error: 'API key should not contain spaces or newlines.' }\r\n  }\r\n\r\n  const rule = KEY_VALIDATIONS[provider]\r\n  if (!rule) {\r\n    // Unknown provider \u2014 accept any non-empty key\r\n    return { valid: true }\r\n  }\r\n\r\n  if (!trimmed.startsWith(rule.prefix)) {\r\n    return {\r\n      valid: false,\r\n      error: `${rule.displayName} API keys should start with \"${rule.prefix}\". Got: \"${trimmed.slice(0, 8)}...\"`,\r\n    }\r\n  }\r\n\r\n  if (trimmed.length < rule.minLength) {\r\n    return {\r\n      valid: false,\r\n      error: `${rule.displayName} API key seems too short (${trimmed.length} chars). Expected at least ${rule.minLength}.`,\r\n    }\r\n  }\r\n\r\n  return { valid: true }\r\n}\r\n\r\n/**\r\n * Delete all credentials (API key + OAuth tokens) for a provider.\r\n *\r\n * Gemini and Antigravity both store Google OAuth tokens but under\r\n * separate keys, and they are now independent provider rows, so a\r\n * Gemini logout must NOT touch Antigravity tokens (and vice versa).\r\n */\r\nexport function deleteAllProviderCredentials(provider: string): void {\r\n  deleteProviderKey(provider)\r\n  deleteProviderKey(`${provider}_oauth`)\r\n  if (provider === 'gemini') {\r\n    deleteProviderKey('gemini_oauth_cli')\r\n    deleteProviderKey('gemini_oauth')\r\n  }\r\n  if (provider === 'antigravity') {\n    deleteProviderKey('gemini_oauth_antigravity')\n  }\n  if (provider === 'commandcode') {\n    delete process.env.CMD_API_KEY\n    delete process.env.COMMANDCODE_API_KEY\n    delete process.env.COMMAND_CODE_API_KEY\n  }\n\n  // Keep lane-backed providers in sync with credential deletion so the\n  // current session doesn't require a restart to forget stale auth.\r\n  if (provider === 'copilot') {\r\n    void import('../providers/providerShim.js')\r\n      .then(({ reloadCopilotLaneAuth }) => reloadCopilotLaneAuth())\r\n      .catch(() => {})\r\n  } else if (provider === 'cline') {\r\n    void import('../providers/providerShim.js')\r\n      .then(({ reloadClineLaneAuth }) => reloadClineLaneAuth())\r\n      .catch(() => {})\r\n  } else if (provider === 'kiro') {\r\n    void import('../providers/providerShim.js')\r\n      .then(({ reloadKiroLaneAuth }) => reloadKiroLaneAuth())\r\n      .catch(() => {})\r\n  } else if (provider === 'kilocode') {\r\n    void import('../providers/providerShim.js')\r\n      .then(({ reloadKiloLaneAuth }) => reloadKiloLaneAuth())\r\n      .catch(() => {})\r\n  } else if (provider === 'cursor') {\r\n    void import('../providers/providerShim.js')\r\n      .then(({ reloadCursorLaneAuth }) => reloadCursorLaneAuth())\r\n      .catch(() => {})\r\n  } else if (provider === 'gemini' || provider === 'antigravity') {\r\n    void import('../providers/providerShim.js')\r\n      .then(({ reloadGeminiLaneAuth }) => reloadGeminiLaneAuth())\r\n      .catch(() => {})\r\n  } else if (provider === 'ollama') {\r\n    void import('../providers/providerShim.js')\r\n      .then(({ reloadOpenAICompatProviderAuth }) =>\r\n        reloadOpenAICompatProviderAuth('ollama'),\r\n      )\r\n      .catch(() => {})\r\n  } else if (provider === 'lmstudio') {\r\n    void import('../providers/providerShim.js')\r\n      .then(({ reloadOpenAICompatProviderAuth }) =>\r\n        reloadOpenAICompatProviderAuth('lmstudio'),\r\n      )\r\n      .catch(() => {})\r\n  } else if (provider === 'glm') {\r\n    void import('../providers/providerShim.js')\r\n      .then(({ reloadOpenAICompatProviderAuth }) =>\r\n        reloadOpenAICompatProviderAuth('glm'),\r\n      )\r\n      .catch(() => {})\r\n  } else if (provider === 'mistral') {\r\n    void import('../providers/providerShim.js')\r\n      .then(({ reloadOpenAICompatProviderAuth }) =>\r\n        reloadOpenAICompatProviderAuth('mistral'),\r\n      )\r\n      .catch(() => {})\r\n  } else if (provider === 'moonshot') {\r\n    void import('../providers/providerShim.js')\r\n      .then(({ reloadOpenAICompatProviderAuth }) =>\r\n        reloadOpenAICompatProviderAuth('moonshot'),\r\n      )\r\n      .catch(() => {})\r\n  } else if (provider === 'minimax') {\r\n    void import('../providers/providerShim.js')\r\n      .then(({ reloadOpenAICompatProviderAuth }) =>\r\n        reloadOpenAICompatProviderAuth('minimax'),\r\n      )\r\n      .catch(() => {})\r\n  } else if (\r\n    provider === 'modelrouter' ||\r\n    provider === 'vercel' ||\r\n    provider === 'requesty' ||\n    provider === 'opencode' ||\n    provider === 'commandcode' ||\n    provider === 'groq'\n  ) {\n    void import('../providers/providerShim.js')\n      .then(({ reloadOpenAICompatProviderAuth }) =>\n        reloadOpenAICompatProviderAuth(provider as 'modelrouter' | 'vercel' | 'requesty' | 'opencode' | 'commandcode' | 'groq'),\n      )\n      .catch(() => {})\n  }\n}\n", "import { getMainLoopModelOverride } from '../../bootstrap/state.js'\r\nimport { loadOpenCodeApiKeyFromAuthFile } from '../opencodeAuth.js'\r\nimport type { ModelName } from './model.js'\r\nimport type { APIProvider } from './providers.js'\r\n\r\n/** Anthropic-native provider keys only (used by Claude model configs) */\r\nexport type AnthropicProvider = Extract<APIProvider, 'firstParty' | 'bedrock' | 'vertex' | 'foundry'>\r\n\r\n/** Model config mapping for Anthropic-native providers */\r\nexport type ModelConfig = Record<AnthropicProvider, ModelName>\r\n\r\n// \u2500\u2500\u2500 Third-Party Provider Tier System \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n//\r\n// Each third-party provider offers models at different access tiers:\r\n//   free  \u2014 no payment required, rate-limited\r\n//   pro   \u2014 requires API key with billing, standard limits\r\n//   plus  \u2014 premium tier or enterprise, highest limits\r\n//\r\n// The tier is determined by PROVIDER_TIER env var or auto-detected\r\n// from the API key format / account status.\r\n//\r\n// Model IDs are pinned to confirmed-working identifiers as of 2025-Q4.\r\n// Override any model via env vars (e.g. OPENAI_MODEL_OPUS).\r\n\r\nexport type ProviderTier = 'free' | 'pro' | 'plus'\r\n\r\nconst GLM_BASE_URL = process.env.GLM_BASE_URL\r\n  ?? process.env.GLM_API_URL\r\n  ?? process.env.BIGMODEL_BASE_URL\r\n  ?? process.env.ZHIPU_BASE_URL\r\n  ?? process.env.ZAI_BASE_URL\r\n  ?? process.env.Z_AI_BASE_URL\r\n  ?? 'https://open.bigmodel.cn/api/paas/v4'\r\n\r\nconst MOONSHOT_BASE_URL = process.env.MOONSHOT_BASE_URL\r\n  ?? process.env.MOONSHOT_API_BASE_URL\r\n  ?? 'https://api.moonshot.ai/v1'\r\n\r\nconst MINIMAX_BASE_URL = process.env.MINIMAX_BASE_URL\r\n  ?? process.env.MINIMAX_API_BASE_URL\r\n  ?? 'https://api.minimax.io/v1'\r\n\r\nconst MISTRAL_BASE_URL = process.env.MISTRAL_BASE_URL\r\n  ?? process.env.MISTRAL_API_BASE_URL\r\n  ?? 'https://api.mistral.ai/v1'\r\n\r\nconst LMSTUDIO_BASE_URL = process.env.LMSTUDIO_BASE_URL\r\n  ?? process.env.LM_STUDIO_BASE_URL\r\n  ?? 'http://localhost:1234/v1'\r\n\r\nconst MODELROUTER_BASE_URL = process.env.MODELROUTER_BASE_URL\r\n  ?? process.env.MODEL_ROUTER_BASE_URL\r\n  ?? process.env.LXG2IT_BASE_URL\r\n  ?? 'https://api.lxg2it.com/v1'\r\n\r\nconst VERCEL_AI_GATEWAY_BASE_URL = process.env.VERCEL_AI_GATEWAY_BASE_URL\r\n  ?? process.env.AI_GATEWAY_BASE_URL\r\n  ?? 'https://ai-gateway.vercel.sh/v1'\r\n\r\nconst REQUESTY_BASE_URL = process.env.REQUESTY_BASE_URL\r\n  ?? 'https://router.requesty.ai/v1'\r\n\r\nconst OPENCODE_BASE_URL = process.env.OPENCODE_BASE_URL\n  ?? process.env.OPENCODE_ZEN_BASE_URL\n  ?? 'https://opencode.ai/zen/v1'\n\nconst COMMANDCODE_BASE_URL = normalizeCommandCodeBaseUrl(\n  process.env.COMMANDCODE_BASE_URL\n  ?? process.env.COMMAND_CODE_BASE_URL\n  ?? process.env.CMD_BASE_URL\n  ?? 'https://api.commandcode.ai/provider/v1',\n)\n\nconst MODELROUTER_DEFAULT_OPUS = 'claude-opus-4-7'\nconst MODELROUTER_DEFAULT_SONNET = 'claude-sonnet-4-6'\r\nconst MODELROUTER_DEFAULT_HAIKU = 'claude-haiku-4-5'\r\n\r\nexport interface TierModelSet {\r\n  opus: string    // Best reasoning / most capable model\r\n  sonnet: string  // Balanced quality/speed for everyday tasks\r\n  haiku: string   // Fastest / cheapest for simple tasks\r\n}\r\n\r\nexport interface ProviderModelConfig {\r\n  /** Human-readable provider name */\r\n  displayName: string\r\n  /** Provider API base URL */\r\n  baseUrl: string\r\n  /** Auth header format: 'bearer' for Authorization: Bearer, 'x-api-key' for custom */\r\n  authType: 'bearer' | 'x-api-key'\r\n  /** Env var name for the API key */\r\n  apiKeyEnv: string\r\n  /** Models available at each tier */\r\n  tiers: Record<ProviderTier, TierModelSet>\r\n  /** Which tier to use when none is explicitly set \u2014 typically 'pro' for paid keys */\r\n  defaultTier: ProviderTier\r\n  /** Whether the provider supports streaming */\r\n  supportsStreaming: boolean\r\n  /** Whether the provider supports tool/function calling */\r\n  supportsToolCalling: boolean\r\n}\r\n\r\nconst AGENTROUTER_MODEL_IDS = new Set([\r\n  'claude-haiku-4-5-20251001',\r\n  'claude-opus-4-6',\r\n  'glm-4.5',\r\n  'glm-4.6',\r\n  'glm-5.1',\r\n  'deepseek-r1-0528',\r\n  'deepseek-v3.1',\r\n  'deepseek-v3.2',\r\n])\r\n\r\nexport function isAgentRouterModelId(model: string): boolean {\r\n  const normalized = model.toLowerCase()\r\n  if (AGENTROUTER_MODEL_IDS.has(normalized)) {\r\n    return true\r\n  }\r\n  const configured = getProviderModelSet('agentrouter')\r\n  return Object.values(configured).some(\r\n    value => value.toLowerCase() === normalized,\r\n  )\r\n}\r\n\r\n/**\r\n * Detects the provider tier from env var or falls back to the provider's default.\r\n *\r\n * Set PROVIDER_TIER=free|pro|plus to override auto-detection.\r\n * Provider-specific overrides: OPENAI_TIER, GEMINI_TIER, etc.\r\n *\r\n * For OpenRouter specifically, when no override is set, the active main-loop\r\n * model is sniffed for a `:free` suffix \u2014 OpenRouter's free models all carry\r\n * it, and a user who picked one through `/model` clearly wants subagent\r\n * spawns to stay in the free pool too. Without this, a free-tier user gets\r\n * subagents resolved against `defaultTier: 'pro'` (gpt-5.5 etc.), which\r\n * silently leaves the free credit pool and was the root cause of the\r\n * \"subagents spawn with random models\" report \u2014 those pro IDs are not all\r\n * hosted, so OpenRouter routed to whatever it could.\r\n */\r\nexport function getProviderTier(provider: string): ProviderTier {\r\n  // Provider-specific override first\r\n  const providerEnv = process.env[`${provider.toUpperCase()}_TIER`]\r\n  if (providerEnv && isValidTier(providerEnv)) return providerEnv\r\n\r\n  // Global override\r\n  const globalTier = process.env.PROVIDER_TIER\r\n  if (globalTier && isValidTier(globalTier)) return globalTier\r\n\r\n  // Sticky free-tier inference for OpenRouter based on the user's current\r\n  // main-loop selection. Reads three sources in priority order \u2014 the same\r\n  // order getUserSpecifiedModelSetting() uses (session override > env >\r\n  // settings) \u2014 so a user who picked a `:free` model via /model at runtime\r\n  // gets free-tier subagents on the very next spawn, not just after\r\n  // restarting with ANTHROPIC_MODEL set.\r\n  //\r\n  // bootstrap/state is safe to import here \u2014 it only type-imports model.ts,\r\n  // so no runtime cycle. Settings is read lazily via dynamic require to\r\n  // avoid pulling in the settings module at module-load time (it pulls in\r\n  // file I/O and would slow cold start of every consumer of configs.ts).\r\n  if (provider === 'openrouter') {\r\n    if (looksLikeFreeOpenRouterId(getMainLoopModelOverride())) return 'free'\r\n    if (looksLikeFreeOpenRouterId(process.env.ANTHROPIC_MODEL)) return 'free'\r\n    try {\r\n      // eslint-disable-next-line @typescript-eslint/no-require-imports\r\n      const settingsMod = require('../settings/settings.js') as { getSettings_DEPRECATED?: () => { model?: unknown } | undefined }\r\n      const settings = settingsMod.getSettings_DEPRECATED?.()\r\n      if (looksLikeFreeOpenRouterId(settings?.model)) return 'free'\r\n    } catch {\r\n      // Settings unavailable (cold-start path) \u2014 fall through to default tier.\r\n    }\r\n  }\r\n\r\n  if (provider === 'opencode' && !hasOpencodeAccountKey()) {\r\n    return 'free'\r\n  }\r\n\r\n  // Auto-detect from provider config default\r\n  return PROVIDER_CONFIGS[provider]?.defaultTier ?? 'pro'\r\n}\r\n\r\nfunction isValidTier(t: string): t is ProviderTier {\r\n  return ['free', 'pro', 'plus'].includes(t)\r\n}\r\n\r\nfunction looksLikeFreeOpenRouterId(value: unknown): boolean {\r\n  return typeof value === 'string' && value.toLowerCase().endsWith(':free')\r\n}\r\n\r\nfunction hasOpencodeAccountKey(): boolean {\r\n  if (process.env.OPENCODE_API_KEY || process.env.OPENCODE_ZEN_API_KEY) {\r\n    return true\r\n  }\r\n  if (loadOpenCodeApiKeyFromAuthFile()) return true\r\n  try {\r\n    // eslint-disable-next-line @typescript-eslint/no-require-imports\r\n    const keyManager = require('../../services/api/auth/api_key_manager.js') as {\r\n      loadProviderKey?: (provider: string) => string | null\r\n    }\r\n    return !!keyManager.loadProviderKey?.('opencode')\r\n  } catch {\r\n    return false\r\n  }\r\n}\r\n\r\n// \u2500\u2500\u2500 Provider Configurations (Updated April 2026) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n//\r\n// Model selection rationale per provider (latest confirmed model IDs):\r\n//\r\n// OpenAI (April 2026):\r\n//   free  \u2192 gpt-5.4-mini (cheapest 5.x, tool calling, 128k context)\r\n//   pro   \u2192 gpt-5.5 (frontier coding/research model from Codex catalog)\r\n//   plus  \u2192 gpt-5.5 (frontier coding/research model from Codex catalog)\r\n//   Haiku \u2192 gpt-5.4-nano (smallest/fastest/cheapest)\r\n//\r\n// Gemini (April 2026):\r\n//   free  \u2192 gemini-3-flash-preview (free in AI Studio, fast, tools)\r\n//   pro   \u2192 gemini-3.1-pro-preview (latest, 1M context, reasoning-first)\r\n//   plus  \u2192 gemini-3.1-pro-preview (same \u2014 best available)\r\n//   Haiku \u2192 gemini-3.1-flash-lite-preview (cost-efficient, high-volume)\r\n//\r\n// OpenRouter (April 2026):\r\n//   free  \u2192 tencent/hy3-preview:free / inclusionai/ling-2.6-1t:free\r\n//   pro   \u2192 anthropic/claude-opus-4.7 / openai/gpt-5.5\r\n//   plus  \u2192 anthropic/claude-opus-4.7 (best stable Opus on OR)\r\n//\r\n// Groq (April 2026 \u2014 all models free with rate limits):\r\n//   free  \u2192 deepseek-r1-distill-llama-70b (best reasoning, free)\r\n//   pro   \u2192 qwen/qwen3-32b (strong coding, replaced qwq)\r\n//   plus  \u2192 openai/gpt-oss-120b (flagship open model on Groq)\r\n//   Haiku \u2192 llama-3.3-70b-versatile (proven fast workhorse)\r\n//\r\n// NVIDIA NIM (April 2026):\r\n//   free  \u2192 nvidia/nemotron-3-super-120b-a12b (NVIDIA-hosted default)\r\n//   pro   \u2192 nvidia/llama-3.1-nemotron-ultra-253b-v1\r\n//   plus  \u2192 nvidia/llama-3.1-nemotron-ultra-253b-v1\r\n//   Haiku \u2192 nvidia/nemotron-3-nano-30b-a3b\r\n\r\nfunction normalizeCommandCodeBaseUrl(raw: string): string {\n  const trimmed = raw.replace(/\\/+$/, '')\n  return /\\/v1$/i.test(trimmed) ? trimmed : `${trimmed}/v1`\n}\n\nexport const PROVIDER_CONFIGS: Record<string, ProviderModelConfig> = {\n  openai: {\r\n    displayName: 'OpenAI',\r\n    baseUrl: process.env.OPENAI_BASE_URL ?? 'https://api.openai.com/v1',\r\n    authType: 'bearer',\r\n    apiKeyEnv: 'OPENAI_API_KEY',\r\n    supportsStreaming: true,\r\n    supportsToolCalling: true,\r\n    defaultTier: 'pro',\r\n    tiers: {\r\n      free: {\r\n        opus:   'gpt-5.4-mini',\r\n        sonnet: 'gpt-5.4-mini',\r\n        haiku:  'gpt-5.4-mini',\r\n      },\r\n      pro: {\r\n        opus:   process.env.OPENAI_MODEL_OPUS   ?? 'gpt-5.5',\r\n        sonnet: process.env.OPENAI_MODEL_SONNET ?? 'gpt-5.5',\r\n        haiku:  process.env.OPENAI_MODEL_HAIKU  ?? 'gpt-5.4-mini',\r\n      },\r\n      plus: {\r\n        opus:   process.env.OPENAI_MODEL_OPUS   ?? 'gpt-5.5',\r\n        sonnet: process.env.OPENAI_MODEL_SONNET ?? 'gpt-5.5',\r\n        haiku:  process.env.OPENAI_MODEL_HAIKU  ?? 'gpt-5.4-mini',\r\n      },\r\n    },\r\n  },\r\n\r\n  copilot: {\r\n    displayName: 'GitHub Copilot',\r\n    baseUrl: 'https://api.githubcopilot.com',\r\n    authType: 'bearer',\r\n    apiKeyEnv: 'COPILOT_OAUTH_TOKEN',\r\n    supportsStreaming: true,\r\n    supportsToolCalling: true,\r\n    defaultTier: 'pro',\r\n    tiers: {\r\n      free: {\r\n        opus: 'gpt-5-mini',\r\n        sonnet: 'gpt-5-mini',\r\n        haiku: 'gpt-5-mini',\r\n      },\r\n      pro: {\r\n        opus: process.env.COPILOT_MODEL_OPUS ?? 'claude-opus-4.7',\r\n        sonnet: process.env.COPILOT_MODEL_SONNET ?? 'gpt-5-mini',\r\n        haiku: process.env.COPILOT_MODEL_HAIKU ?? 'gpt-5-mini',\r\n      },\r\n      plus: {\r\n        opus: process.env.COPILOT_MODEL_OPUS ?? 'claude-opus-4.7',\r\n        sonnet: process.env.COPILOT_MODEL_SONNET ?? 'gpt-5.4',\r\n        haiku: process.env.COPILOT_MODEL_HAIKU ?? 'gpt-5-mini',\r\n      },\r\n    },\r\n  },\r\n\r\n  gemini: {\r\n    displayName: 'Google Gemini',\r\n    baseUrl: 'https://generativelanguage.googleapis.com/v1beta',\r\n    authType: 'x-api-key',\r\n    apiKeyEnv: 'GEMINI_API_KEY',\r\n    supportsStreaming: true,\r\n    supportsToolCalling: true,\r\n    defaultTier: 'pro',\r\n    tiers: {\r\n      free: {\r\n        opus:   'gemini-3-flash-preview',\r\n        sonnet: 'gemini-3-flash-preview',\r\n        haiku:  'gemini-3.1-flash-lite-preview',\r\n      },\r\n      pro: {\r\n        opus:   process.env.GEMINI_MODEL_OPUS   ?? 'gemini-3.1-pro-preview',\r\n        sonnet: process.env.GEMINI_MODEL_SONNET ?? 'gemini-2.5-pro',\r\n        haiku:  process.env.GEMINI_MODEL_HAIKU  ?? 'gemini-3.1-flash-lite-preview',\r\n      },\r\n      plus: {\r\n        opus:   process.env.GEMINI_MODEL_OPUS   ?? 'gemini-3.1-pro-preview',\r\n        sonnet: process.env.GEMINI_MODEL_SONNET ?? 'gemini-3.1-pro-preview',\r\n        haiku:  process.env.GEMINI_MODEL_HAIKU  ?? 'gemini-2.5-flash-lite',\r\n      },\r\n    },\r\n  },\r\n\r\n  openrouter: {\r\n    displayName: 'OpenRouter',\r\n    baseUrl: 'https://openrouter.ai/api/v1',\r\n    authType: 'bearer',\r\n    apiKeyEnv: 'OPENROUTER_API_KEY',\r\n    supportsStreaming: true,\r\n    supportsToolCalling: true,\r\n    defaultTier: 'pro',\r\n    tiers: {\r\n      free: {\r\n        // All three tiers point at confirmed-existing free OpenRouter\r\n        // model IDs (verified against /v1/models pricing.prompt == 0).\r\n        // Subagents pinned to `haiku` (Explore, claudeCodeGuide) used to\r\n        // resolve to `inclusionai/ling-2.6-flash:free`, which OpenRouter\r\n        // doesn't host \u2014 the gateway then routed to whatever variant was\r\n        // available, which is the \"random model spawn\" the user sees.\r\n        // Mapping every tier to a real free model with a consistent ID\r\n        // makes spawn behavior deterministic.\r\n        //\r\n        // Capability ranking (highest \u2192 lowest), all 256K+ context:\r\n        //   ling-2.6-1t      \u2014 trillion-param flagship; best for opus/sonnet\r\n        //   nemotron-nano    \u2014 30B / 3B-active reasoning model; small + fast\r\n        //   poolside-laguna  \u2014 efficient coding-focused agent\r\n        //\r\n        // Override per-tier via OR_MODEL_OPUS / OR_MODEL_SONNET /\r\n        // OR_MODEL_HAIKU.\r\n        opus:   process.env.OR_MODEL_OPUS_FREE   ?? 'inclusionai/ling-2.6-1t:free',\r\n        sonnet: process.env.OR_MODEL_SONNET_FREE ?? 'inclusionai/ling-2.6-1t:free',\r\n        haiku:  process.env.OR_MODEL_HAIKU_FREE  ?? 'nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free',\r\n      },\r\n      pro: {\r\n        opus:   process.env.OR_MODEL_OPUS   ?? 'anthropic/claude-opus-4.7',\r\n        sonnet: process.env.OR_MODEL_SONNET ?? 'openai/gpt-5.5',\r\n        haiku:  process.env.OR_MODEL_HAIKU  ?? 'openai/gpt-5.4-mini',\r\n      },\r\n      plus: {\r\n        opus:   process.env.OR_MODEL_OPUS   ?? 'anthropic/claude-opus-4.7',\r\n        sonnet: process.env.OR_MODEL_SONNET ?? 'anthropic/claude-sonnet-4-6',\r\n        haiku:  process.env.OR_MODEL_HAIKU  ?? 'google/gemini-3.1-flash-lite-preview',\r\n      },\r\n    },\r\n  },\r\n\r\n  // AgentRouter \u2014 independent OpenRouter-style gateway. Curated catalog\r\n  // of 8 models (claude-haiku-4-5-20251001, claude-opus-4-6, glm-4.5/4.6/5.1,\r\n  // deepseek-r1-0528 / -v3.1 / -v3.2). The default pro sonnet/haiku slots use\r\n  // Claude Haiku because it is the cheapest Claude Code-compatible target and\r\n  // preserves Anthropic prompt-cache usage through AgentRouter.\r\n  agentrouter: {\r\n    displayName: 'AgentRouter',\r\n    baseUrl: 'https://agentrouter.org/v1',\r\n    authType: 'bearer',\r\n    apiKeyEnv: 'AGENT_ROUTER_TOKEN',\r\n    supportsStreaming: true,\r\n    supportsToolCalling: true,\r\n    defaultTier: 'pro',\r\n    tiers: {\r\n      free: {\r\n        opus:   process.env.AR_MODEL_OPUS   ?? 'glm-4.6',\r\n        sonnet: process.env.AR_MODEL_SONNET ?? 'glm-4.6',\r\n        haiku:  process.env.AR_MODEL_HAIKU  ?? 'glm-4.5',\r\n      },\r\n      pro: {\r\n        opus:   process.env.AR_MODEL_OPUS   ?? 'claude-opus-4-6',\r\n        sonnet: process.env.AR_MODEL_SONNET ?? 'claude-haiku-4-5-20251001',\r\n        haiku:  process.env.AR_MODEL_HAIKU  ?? 'claude-haiku-4-5-20251001',\r\n      },\r\n      plus: {\r\n        opus:   process.env.AR_MODEL_OPUS   ?? 'claude-opus-4-6',\r\n        sonnet: process.env.AR_MODEL_SONNET ?? 'claude-opus-4-6',\r\n        haiku:  process.env.AR_MODEL_HAIKU  ?? 'claude-haiku-4-5-20251001',\r\n      },\r\n    },\r\n  },\r\n\r\n  modelrouter: {\r\n    displayName: 'Model Router',\r\n    baseUrl: MODELROUTER_BASE_URL,\r\n    authType: 'bearer',\r\n    apiKeyEnv: 'MODEL_ROUTER_API_KEY',\r\n    supportsStreaming: true,\r\n    supportsToolCalling: true,\r\n    defaultTier: 'pro',\r\n    tiers: {\r\n      free: {\r\n        opus:   process.env.MODELROUTER_MODEL_OPUS_FREE   ?? process.env.LXG2IT_MODEL_OPUS_FREE   ?? MODELROUTER_DEFAULT_OPUS,\r\n        sonnet: process.env.MODELROUTER_MODEL_SONNET_FREE ?? process.env.LXG2IT_MODEL_SONNET_FREE ?? MODELROUTER_DEFAULT_SONNET,\r\n        haiku:  process.env.MODELROUTER_MODEL_HAIKU_FREE  ?? process.env.LXG2IT_MODEL_HAIKU_FREE  ?? MODELROUTER_DEFAULT_HAIKU,\r\n      },\r\n      pro: {\r\n        opus:   process.env.MODELROUTER_MODEL_OPUS   ?? process.env.LXG2IT_MODEL_OPUS   ?? MODELROUTER_DEFAULT_OPUS,\r\n        sonnet: process.env.MODELROUTER_MODEL_SONNET ?? process.env.LXG2IT_MODEL_SONNET ?? MODELROUTER_DEFAULT_SONNET,\r\n        haiku:  process.env.MODELROUTER_MODEL_HAIKU  ?? process.env.LXG2IT_MODEL_HAIKU  ?? MODELROUTER_DEFAULT_HAIKU,\r\n      },\r\n      plus: {\r\n        opus:   process.env.MODELROUTER_MODEL_OPUS   ?? process.env.LXG2IT_MODEL_OPUS   ?? MODELROUTER_DEFAULT_OPUS,\r\n        sonnet: process.env.MODELROUTER_MODEL_SONNET ?? process.env.LXG2IT_MODEL_SONNET ?? MODELROUTER_DEFAULT_SONNET,\r\n        haiku:  process.env.MODELROUTER_MODEL_HAIKU  ?? process.env.LXG2IT_MODEL_HAIKU  ?? MODELROUTER_DEFAULT_HAIKU,\r\n      },\r\n    },\r\n  },\r\n\r\n  vercel: {\r\n    displayName: 'Vercel AI Gateway',\r\n    baseUrl: VERCEL_AI_GATEWAY_BASE_URL,\r\n    authType: 'bearer',\r\n    apiKeyEnv: 'AI_GATEWAY_API_KEY',\r\n    supportsStreaming: true,\r\n    supportsToolCalling: true,\r\n    defaultTier: 'pro',\r\n    tiers: {\r\n      free: {\r\n        opus:   process.env.VERCEL_MODEL_OPUS_FREE   ?? process.env.AI_GATEWAY_MODEL_OPUS_FREE   ?? 'anthropic/claude-sonnet-4-6',\r\n        sonnet: process.env.VERCEL_MODEL_SONNET_FREE ?? process.env.AI_GATEWAY_MODEL_SONNET_FREE ?? 'anthropic/claude-sonnet-4-6',\r\n        haiku:  process.env.VERCEL_MODEL_HAIKU_FREE  ?? process.env.AI_GATEWAY_MODEL_HAIKU_FREE  ?? 'anthropic/claude-haiku-4-5',\r\n      },\r\n      pro: {\r\n        opus:   process.env.VERCEL_MODEL_OPUS   ?? process.env.AI_GATEWAY_MODEL_OPUS   ?? 'anthropic/claude-opus-4-7',\r\n        sonnet: process.env.VERCEL_MODEL_SONNET ?? process.env.AI_GATEWAY_MODEL_SONNET ?? 'anthropic/claude-sonnet-4-6',\r\n        haiku:  process.env.VERCEL_MODEL_HAIKU  ?? process.env.AI_GATEWAY_MODEL_HAIKU  ?? 'anthropic/claude-haiku-4-5',\r\n      },\r\n      plus: {\r\n        opus:   process.env.VERCEL_MODEL_OPUS   ?? process.env.AI_GATEWAY_MODEL_OPUS   ?? 'anthropic/claude-opus-4-7',\r\n        sonnet: process.env.VERCEL_MODEL_SONNET ?? process.env.AI_GATEWAY_MODEL_SONNET ?? 'anthropic/claude-sonnet-4-6',\r\n        haiku:  process.env.VERCEL_MODEL_HAIKU  ?? process.env.AI_GATEWAY_MODEL_HAIKU  ?? 'anthropic/claude-haiku-4-5',\r\n      },\r\n    },\r\n  },\r\n\r\n  opencode: {\n    displayName: 'OpenCode Zen',\n    baseUrl: OPENCODE_BASE_URL,\n    authType: 'bearer',\r\n    apiKeyEnv: 'OPENCODE_API_KEY',\r\n    supportsStreaming: true,\r\n    supportsToolCalling: true,\r\n    defaultTier: 'pro',\r\n    tiers: {\r\n      free: {\r\n        opus:   process.env.OPENCODE_MODEL_OPUS_FREE   ?? 'big-pickle',\r\n        sonnet: process.env.OPENCODE_MODEL_SONNET_FREE ?? 'deepseek-v4-flash-free',\r\n        haiku:  process.env.OPENCODE_MODEL_HAIKU_FREE  ?? 'nemotron-3-super-free',\r\n      },\r\n      pro: {\r\n        opus:   process.env.OPENCODE_MODEL_OPUS   ?? 'claude-opus-4-7',\r\n        sonnet: process.env.OPENCODE_MODEL_SONNET ?? 'claude-sonnet-4-6',\r\n        haiku:  process.env.OPENCODE_MODEL_HAIKU  ?? 'claude-haiku-4-5',\r\n      },\r\n      plus: {\r\n        opus:   process.env.OPENCODE_MODEL_OPUS   ?? 'claude-opus-4-7',\r\n        sonnet: process.env.OPENCODE_MODEL_SONNET ?? 'claude-sonnet-4-6',\r\n        haiku:  process.env.OPENCODE_MODEL_HAIKU  ?? 'claude-haiku-4-5',\r\n      },\r\n    },\n  },\n\n  commandcode: {\n    displayName: 'Command Code',\n    baseUrl: COMMANDCODE_BASE_URL,\n    authType: 'bearer',\n    apiKeyEnv: 'CMD_API_KEY',\n    supportsStreaming: true,\n    supportsToolCalling: true,\n    defaultTier: 'free',\n    tiers: {\n      free: {\n        opus:   process.env.COMMANDCODE_MODEL_OPUS_FREE   ?? process.env.COMMAND_CODE_MODEL_OPUS_FREE   ?? 'MiniMaxAI/MiniMax-M3',\n        sonnet: process.env.COMMANDCODE_MODEL_SONNET_FREE ?? process.env.COMMAND_CODE_MODEL_SONNET_FREE ?? 'moonshotai/Kimi-K2.6',\n        haiku:  process.env.COMMANDCODE_MODEL_HAIKU_FREE  ?? process.env.COMMAND_CODE_MODEL_HAIKU_FREE  ?? 'Qwen/Qwen3.7-Plus',\n      },\n      pro: {\n        opus:   process.env.COMMANDCODE_MODEL_OPUS   ?? process.env.COMMAND_CODE_MODEL_OPUS   ?? 'MiniMaxAI/MiniMax-M3',\n        sonnet: process.env.COMMANDCODE_MODEL_SONNET ?? process.env.COMMAND_CODE_MODEL_SONNET ?? 'moonshotai/Kimi-K2.6',\n        haiku:  process.env.COMMANDCODE_MODEL_HAIKU  ?? process.env.COMMAND_CODE_MODEL_HAIKU  ?? 'Qwen/Qwen3.7-Plus',\n      },\n      plus: {\n        opus:   process.env.COMMANDCODE_MODEL_OPUS   ?? process.env.COMMAND_CODE_MODEL_OPUS   ?? 'MiniMaxAI/MiniMax-M3',\n        sonnet: process.env.COMMANDCODE_MODEL_SONNET ?? process.env.COMMAND_CODE_MODEL_SONNET ?? 'moonshotai/Kimi-K2.6',\n        haiku:  process.env.COMMANDCODE_MODEL_HAIKU  ?? process.env.COMMAND_CODE_MODEL_HAIKU  ?? 'Qwen/Qwen3.7-Plus',\n      },\n    },\n  },\n\n  requesty: {\n    displayName: 'Requesty',\n    baseUrl: REQUESTY_BASE_URL,\n    authType: 'bearer',\r\n    apiKeyEnv: 'REQUESTY_API_KEY',\r\n    supportsStreaming: true,\r\n    supportsToolCalling: true,\r\n    defaultTier: 'pro',\r\n    tiers: {\r\n      free: {\r\n        opus:   process.env.REQUESTY_MODEL_OPUS_FREE   ?? 'anthropic/claude-sonnet-4-6',\r\n        sonnet: process.env.REQUESTY_MODEL_SONNET_FREE ?? 'anthropic/claude-sonnet-4-6',\r\n        haiku:  process.env.REQUESTY_MODEL_HAIKU_FREE  ?? 'anthropic/claude-haiku-4-5',\r\n      },\r\n      pro: {\r\n        opus:   process.env.REQUESTY_MODEL_OPUS   ?? 'anthropic/claude-opus-4-7',\r\n        sonnet: process.env.REQUESTY_MODEL_SONNET ?? 'anthropic/claude-sonnet-4-6',\r\n        haiku:  process.env.REQUESTY_MODEL_HAIKU  ?? 'anthropic/claude-haiku-4-5',\r\n      },\r\n      plus: {\r\n        opus:   process.env.REQUESTY_MODEL_OPUS   ?? 'anthropic/claude-opus-4-7',\r\n        sonnet: process.env.REQUESTY_MODEL_SONNET ?? 'anthropic/claude-sonnet-4-6',\r\n        haiku:  process.env.REQUESTY_MODEL_HAIKU  ?? 'anthropic/claude-haiku-4-5',\r\n      },\r\n    },\r\n  },\r\n\r\n  groq: {\r\n    displayName: 'Groq',\r\n    baseUrl: 'https://api.groq.com/openai/v1',\r\n    authType: 'bearer',\r\n    apiKeyEnv: 'GROQ_API_KEY',\r\n    supportsStreaming: true,\r\n    supportsToolCalling: true,\r\n    defaultTier: 'free',  // Groq is free-tier by nature\r\n    tiers: {\r\n      free: {\r\n        opus:   process.env.GROQ_MODEL_OPUS   ?? 'deepseek-r1-distill-llama-70b',\r\n        sonnet: process.env.GROQ_MODEL_SONNET ?? 'llama-3.3-70b-versatile',\r\n        haiku:  process.env.GROQ_MODEL_HAIKU  ?? 'llama-3.3-70b-versatile',\r\n      },\r\n      pro: {\r\n        opus:   process.env.GROQ_MODEL_OPUS   ?? 'qwen/qwen3-32b',\r\n        sonnet: process.env.GROQ_MODEL_SONNET ?? 'deepseek-r1-distill-llama-70b',\r\n        haiku:  process.env.GROQ_MODEL_HAIKU  ?? 'llama-3.3-70b-versatile',\r\n      },\r\n      plus: {\r\n        opus:   process.env.GROQ_MODEL_OPUS   ?? 'openai/gpt-oss-120b',\r\n        sonnet: process.env.GROQ_MODEL_SONNET ?? 'qwen/qwen3-32b',\r\n        haiku:  process.env.GROQ_MODEL_HAIKU  ?? 'deepseek-r1-distill-llama-70b',\r\n      },\r\n    },\r\n  },\r\n\r\n  mistral: {\r\n    displayName: 'Mistral',\r\n    baseUrl: MISTRAL_BASE_URL,\r\n    authType: 'bearer',\r\n    apiKeyEnv: 'MISTRAL_API_KEY',\r\n    supportsStreaming: true,\r\n    supportsToolCalling: true,\r\n    defaultTier: 'pro',\r\n    tiers: {\r\n      free: {\r\n        opus:   process.env.MISTRAL_MODEL_OPUS_FREE   ?? 'mistral-small-latest',\r\n        sonnet: process.env.MISTRAL_MODEL_SONNET_FREE ?? 'mistral-small-latest',\r\n        haiku:  process.env.MISTRAL_MODEL_HAIKU_FREE  ?? 'mistral-small-latest',\r\n      },\r\n      pro: {\r\n        opus:   process.env.MISTRAL_MODEL_OPUS   ?? 'mistral-medium-3-5',\r\n        sonnet: process.env.MISTRAL_MODEL_SONNET ?? 'devstral-latest',\r\n        haiku:  process.env.MISTRAL_MODEL_HAIKU  ?? 'mistral-small-latest',\r\n      },\r\n      plus: {\r\n        opus:   process.env.MISTRAL_MODEL_OPUS   ?? 'mistral-medium-3-5',\r\n        sonnet: process.env.MISTRAL_MODEL_SONNET ?? 'devstral-latest',\r\n        haiku:  process.env.MISTRAL_MODEL_HAIKU  ?? 'mistral-small-latest',\r\n      },\r\n    },\r\n  },\r\n\r\n  deepseek: {\r\n    displayName: 'DeepSeek',\r\n    baseUrl: process.env.DEEPSEEK_BASE_URL ?? 'https://api.deepseek.com/v1',\r\n    authType: 'bearer',\r\n    apiKeyEnv: 'DEEPSEEK_API_KEY',\r\n    supportsStreaming: true,\r\n    supportsToolCalling: true,\r\n    defaultTier: 'pro',\r\n    tiers: {\r\n      free: {\r\n        opus:   'deepseek-chat',\r\n        sonnet: 'deepseek-chat',\r\n        haiku:  'deepseek-chat',\r\n      },\r\n      pro: {\r\n        opus:   process.env.DEEPSEEK_MODEL_OPUS   ?? 'deepseek-reasoner',\r\n        sonnet: process.env.DEEPSEEK_MODEL_SONNET ?? 'deepseek-chat',\r\n        haiku:  process.env.DEEPSEEK_MODEL_HAIKU  ?? 'deepseek-chat',\r\n      },\r\n      plus: {\r\n        opus:   process.env.DEEPSEEK_MODEL_OPUS   ?? 'deepseek-reasoner',\r\n        sonnet: process.env.DEEPSEEK_MODEL_SONNET ?? 'deepseek-reasoner',\r\n        haiku:  process.env.DEEPSEEK_MODEL_HAIKU  ?? 'deepseek-chat',\r\n      },\r\n    },\r\n  },\r\n\r\n  glm: {\r\n    displayName: 'GLM',\r\n    baseUrl: GLM_BASE_URL,\r\n    authType: 'bearer',\r\n    apiKeyEnv: 'GLM_API_KEY',\r\n    supportsStreaming: true,\r\n    supportsToolCalling: true,\r\n    defaultTier: 'pro',\r\n    tiers: {\r\n      free: {\r\n        opus:   process.env.GLM_MODEL_OPUS_FREE   ?? 'glm-4.7',\r\n        sonnet: process.env.GLM_MODEL_SONNET_FREE ?? 'glm-4.7',\r\n        haiku:  process.env.GLM_MODEL_HAIKU_FREE  ?? 'glm-4.7',\r\n      },\r\n      pro: {\r\n        opus:   process.env.GLM_MODEL_OPUS   ?? 'glm-5.1',\r\n        sonnet: process.env.GLM_MODEL_SONNET ?? 'glm-5-turbo',\r\n        haiku:  process.env.GLM_MODEL_HAIKU  ?? 'glm-4.7',\r\n      },\r\n      plus: {\r\n        opus:   process.env.GLM_MODEL_OPUS   ?? 'glm-5.1',\r\n        sonnet: process.env.GLM_MODEL_SONNET ?? 'glm-5',\r\n        haiku:  process.env.GLM_MODEL_HAIKU  ?? 'glm-4.7',\r\n      },\r\n    },\r\n  },\r\n\r\n  moonshot: {\r\n    displayName: 'Moonshot AI',\r\n    baseUrl: MOONSHOT_BASE_URL,\r\n    authType: 'bearer',\r\n    apiKeyEnv: 'MOONSHOT_API_KEY',\r\n    supportsStreaming: true,\r\n    supportsToolCalling: true,\r\n    defaultTier: 'pro',\r\n    tiers: {\r\n      free: {\r\n        opus:   'kimi-k2.6',\r\n        sonnet: 'kimi-k2.6',\r\n        haiku:  'kimi-k2-turbo-preview',\r\n      },\r\n      pro: {\r\n        opus:   process.env.MOONSHOT_MODEL_OPUS   ?? 'kimi-k2.6',\r\n        sonnet: process.env.MOONSHOT_MODEL_SONNET ?? 'kimi-k2.6',\r\n        haiku:  process.env.MOONSHOT_MODEL_HAIKU  ?? 'kimi-k2-turbo-preview',\r\n      },\r\n      plus: {\r\n        opus:   process.env.MOONSHOT_MODEL_OPUS   ?? 'kimi-k2.6',\r\n        sonnet: process.env.MOONSHOT_MODEL_SONNET ?? 'kimi-k2.6',\r\n        haiku:  process.env.MOONSHOT_MODEL_HAIKU  ?? 'kimi-k2-turbo-preview',\r\n      },\r\n    },\r\n  },\r\n\r\n  minimax: {\r\n    displayName: 'MiniMax AI',\r\n    baseUrl: MINIMAX_BASE_URL,\r\n    authType: 'bearer',\r\n    apiKeyEnv: 'MINIMAX_API_KEY',\r\n    supportsStreaming: true,\r\n    supportsToolCalling: true,\r\n    defaultTier: 'pro',\r\n    tiers: {\r\n      free: {\r\n        opus:   'MiniMax-M2.7',\r\n        sonnet: 'MiniMax-M2.7',\r\n        haiku:  'MiniMax-M2.7-highspeed',\r\n      },\r\n      pro: {\r\n        opus:   process.env.MINIMAX_MODEL_OPUS   ?? 'MiniMax-M2.7',\r\n        sonnet: process.env.MINIMAX_MODEL_SONNET ?? 'MiniMax-M2.7',\r\n        haiku:  process.env.MINIMAX_MODEL_HAIKU  ?? 'MiniMax-M2.7-highspeed',\r\n      },\r\n      plus: {\r\n        opus:   process.env.MINIMAX_MODEL_OPUS   ?? 'MiniMax-M2.7',\r\n        sonnet: process.env.MINIMAX_MODEL_SONNET ?? 'MiniMax-M2.7',\r\n        haiku:  process.env.MINIMAX_MODEL_HAIKU  ?? 'MiniMax-M2.7-highspeed',\r\n      },\r\n    },\r\n  },\r\n\r\n  lmstudio: {\r\n    displayName: 'LM Studio',\r\n    baseUrl: LMSTUDIO_BASE_URL,\r\n    authType: 'bearer',\r\n    apiKeyEnv: 'LMSTUDIO_API_KEY',\r\n    supportsStreaming: true,\r\n    supportsToolCalling: true,\r\n    defaultTier: 'pro',\r\n    tiers: {\r\n      free: {\r\n        opus:   process.env.LMSTUDIO_MODEL_OPUS   ?? process.env.LMSTUDIO_MODEL ?? 'local-model',\r\n        sonnet: process.env.LMSTUDIO_MODEL_SONNET ?? process.env.LMSTUDIO_MODEL ?? 'local-model',\r\n        haiku:  process.env.LMSTUDIO_MODEL_HAIKU  ?? process.env.LMSTUDIO_MODEL ?? 'local-model',\r\n      },\r\n      pro: {\r\n        opus:   process.env.LMSTUDIO_MODEL_OPUS   ?? process.env.LMSTUDIO_MODEL ?? 'local-model',\r\n        sonnet: process.env.LMSTUDIO_MODEL_SONNET ?? process.env.LMSTUDIO_MODEL ?? 'local-model',\r\n        haiku:  process.env.LMSTUDIO_MODEL_HAIKU  ?? process.env.LMSTUDIO_MODEL ?? 'local-model',\r\n      },\r\n      plus: {\r\n        opus:   process.env.LMSTUDIO_MODEL_OPUS   ?? process.env.LMSTUDIO_MODEL ?? 'local-model',\r\n        sonnet: process.env.LMSTUDIO_MODEL_SONNET ?? process.env.LMSTUDIO_MODEL ?? 'local-model',\r\n        haiku:  process.env.LMSTUDIO_MODEL_HAIKU  ?? process.env.LMSTUDIO_MODEL ?? 'local-model',\r\n      },\r\n    },\r\n  },\r\n\r\n  nim: {\r\n    displayName: 'NVIDIA NIM',\r\n    baseUrl: process.env.NIM_BASE_URL ?? 'https://integrate.api.nvidia.com/v1',\r\n    authType: 'bearer',\r\n    apiKeyEnv: 'NIM_API_KEY',\r\n    supportsStreaming: true,\r\n    supportsToolCalling: true,\r\n    defaultTier: 'pro',\r\n    tiers: {\r\n      free: {\r\n        opus:   'nvidia/nemotron-3-super-120b-a12b',\r\n        sonnet: 'nvidia/llama-3.3-nemotron-super-49b-v1.5',\r\n        haiku:  'nvidia/nemotron-3-nano-30b-a3b',\r\n      },\r\n      pro: {\r\n        opus:   process.env.NIM_MODEL_OPUS   ?? 'nvidia/llama-3.1-nemotron-ultra-253b-v1',\r\n        sonnet: process.env.NIM_MODEL_SONNET ?? 'nvidia/nemotron-3-super-120b-a12b',\r\n        haiku:  process.env.NIM_MODEL_HAIKU  ?? 'nvidia/nemotron-3-nano-30b-a3b',\r\n      },\r\n      plus: {\r\n        opus:   process.env.NIM_MODEL_OPUS   ?? 'nvidia/llama-3.1-nemotron-ultra-253b-v1',\r\n        sonnet: process.env.NIM_MODEL_SONNET ?? 'nvidia/nemotron-3-super-120b-a12b',\r\n        haiku:  process.env.NIM_MODEL_HAIKU  ?? 'nvidia/nemotron-3-nano-30b-a3b',\r\n      },\r\n    },\r\n  },\r\n}\r\n\r\n/**\r\n * Resolves the effective model set for a third-party provider based on\r\n * the detected or configured tier.\r\n */\r\nexport function getProviderModelSet(provider: string): TierModelSet {\r\n  const config = PROVIDER_CONFIGS[provider]\r\n  if (!config) {\r\n    // Fallback for unknown providers \u2014 use a generic OpenAI-compatible default\r\n    return { opus: 'gpt-5.4', sonnet: 'gpt-5.4', haiku: 'gpt-5.4-mini' }\r\n  }\r\n  const tier = getProviderTier(provider)\r\n  const modelSet = config.tiers[tier]\r\n  const currentOpenAIModel = getCurrentOpenAIModelSelection(provider)\r\n  if (!currentOpenAIModel) return modelSet\r\n\r\n  return {\r\n    ...modelSet,\r\n    opus: process.env.OPENAI_MODEL_OPUS ?? currentOpenAIModel,\r\n    sonnet: process.env.OPENAI_MODEL_SONNET ?? currentOpenAIModel,\r\n  }\r\n}\r\n\r\nfunction getCurrentOpenAIModelSelection(provider: string): string | null {\r\n  if (provider !== 'openai') return null\r\n\r\n  const selected = getMainLoopModelOverride()\r\n  if (selected !== undefined) {\r\n    return looksLikeConcreteOpenAIModelId(selected) ? selected : null\r\n  }\r\n\r\n  if (looksLikeConcreteOpenAIModelId(process.env.ANTHROPIC_MODEL)) {\r\n    return process.env.ANTHROPIC_MODEL\r\n  }\r\n\r\n  try {\r\n    // eslint-disable-next-line @typescript-eslint/no-require-imports\r\n    const settingsMod = require('../settings/settings.js') as {\r\n      getSettings_DEPRECATED?: () => { model?: unknown } | undefined\r\n    }\r\n    const settings = settingsMod.getSettings_DEPRECATED?.()\r\n    return looksLikeConcreteOpenAIModelId(settings?.model) ? settings.model : null\r\n  } catch {\r\n    return null\r\n  }\r\n}\r\n\r\nfunction looksLikeConcreteOpenAIModelId(value: unknown): value is string {\r\n  return typeof value === 'string' && value.toLowerCase().startsWith('gpt-')\r\n}\r\n\r\n/**\r\n * Legacy flat map for backward compat \u2014 resolves to current tier's models.\r\n * Use getProviderModelSet() directly for tier-aware access.\r\n */\r\nexport const PROVIDER_MODEL_MAP: Record<string, TierModelSet> = new Proxy(\r\n  {} as Record<string, TierModelSet>,\r\n  {\r\n    get(_target, prop: string) {\r\n      return getProviderModelSet(prop)\r\n    },\r\n  },\r\n)\r\n\r\n// @[MODEL LAUNCH]: Add a new CLAUDE_*_CONFIG constant here. Double check the correct model strings\r\n// here since the pattern may change.\r\n\r\nexport const CLAUDE_3_7_SONNET_CONFIG = {\r\n  firstParty: 'claude-3-7-sonnet-20250219',\r\n  bedrock: 'us.anthropic.claude-3-7-sonnet-20250219-v1:0',\r\n  vertex: 'claude-3-7-sonnet@20250219',\r\n  foundry: 'claude-3-7-sonnet',\r\n} as const satisfies ModelConfig\r\n\r\nexport const CLAUDE_3_5_V2_SONNET_CONFIG = {\r\n  firstParty: 'claude-3-5-sonnet-20241022',\r\n  bedrock: 'anthropic.claude-3-5-sonnet-20241022-v2:0',\r\n  vertex: 'claude-3-5-sonnet-v2@20241022',\r\n  foundry: 'claude-3-5-sonnet',\r\n} as const satisfies ModelConfig\r\n\r\nexport const CLAUDE_3_5_HAIKU_CONFIG = {\r\n  firstParty: 'claude-3-5-haiku-20241022',\r\n  bedrock: 'us.anthropic.claude-3-5-haiku-20241022-v1:0',\r\n  vertex: 'claude-3-5-haiku@20241022',\r\n  foundry: 'claude-3-5-haiku',\r\n} as const satisfies ModelConfig\r\n\r\nexport const CLAUDE_HAIKU_4_5_CONFIG = {\r\n  firstParty: 'claude-haiku-4-5-20251001',\r\n  bedrock: 'us.anthropic.claude-haiku-4-5-20251001-v1:0',\r\n  vertex: 'claude-haiku-4-5@20251001',\r\n  foundry: 'claude-haiku-4-5',\r\n} as const satisfies ModelConfig\r\n\r\nexport const CLAUDE_SONNET_4_CONFIG = {\r\n  firstParty: 'claude-sonnet-4-20250514',\r\n  bedrock: 'us.anthropic.claude-sonnet-4-20250514-v1:0',\r\n  vertex: 'claude-sonnet-4@20250514',\r\n  foundry: 'claude-sonnet-4',\r\n} as const satisfies ModelConfig\r\n\r\nexport const CLAUDE_SONNET_4_5_CONFIG = {\r\n  firstParty: 'claude-sonnet-4-5-20250929',\r\n  bedrock: 'us.anthropic.claude-sonnet-4-5-20250929-v1:0',\r\n  vertex: 'claude-sonnet-4-5@20250929',\r\n  foundry: 'claude-sonnet-4-5',\r\n} as const satisfies ModelConfig\r\n\r\nexport const CLAUDE_OPUS_4_CONFIG = {\r\n  firstParty: 'claude-opus-4-20250514',\r\n  bedrock: 'us.anthropic.claude-opus-4-20250514-v1:0',\r\n  vertex: 'claude-opus-4@20250514',\r\n  foundry: 'claude-opus-4',\r\n} as const satisfies ModelConfig\r\n\r\nexport const CLAUDE_OPUS_4_1_CONFIG = {\r\n  firstParty: 'claude-opus-4-1-20250805',\r\n  bedrock: 'us.anthropic.claude-opus-4-1-20250805-v1:0',\r\n  vertex: 'claude-opus-4-1@20250805',\r\n  foundry: 'claude-opus-4-1',\r\n} as const satisfies ModelConfig\r\n\r\nexport const CLAUDE_OPUS_4_5_CONFIG = {\r\n  firstParty: 'claude-opus-4-5-20251101',\r\n  bedrock: 'us.anthropic.claude-opus-4-5-20251101-v1:0',\r\n  vertex: 'claude-opus-4-5@20251101',\r\n  foundry: 'claude-opus-4-5',\r\n} as const satisfies ModelConfig\r\n\r\nexport const CLAUDE_OPUS_4_6_CONFIG = {\r\n  firstParty: 'claude-opus-4-6',\r\n  bedrock: 'us.anthropic.claude-opus-4-6-v1',\r\n  vertex: 'claude-opus-4-6',\r\n  foundry: 'claude-opus-4-6',\r\n} as const satisfies ModelConfig\r\n\r\nexport const CLAUDE_OPUS_4_7_CONFIG = {\r\n  firstParty: 'claude-opus-4-7',\r\n  bedrock: 'us.anthropic.claude-opus-4-7-v1',\r\n  vertex: 'claude-opus-4-7',\r\n  foundry: 'claude-opus-4-7',\r\n} as const satisfies ModelConfig\r\n\r\nexport const CLAUDE_OPUS_4_8_CONFIG = {\r\n  firstParty: 'claude-opus-4-8',\r\n  bedrock: 'us.anthropic.claude-opus-4-8-v1',\r\n  vertex: 'claude-opus-4-8',\r\n  foundry: 'claude-opus-4-8',\r\n} as const satisfies ModelConfig\r\n\r\nexport const CLAUDE_SONNET_4_6_CONFIG = {\r\n  firstParty: 'claude-sonnet-4-6',\r\n  bedrock: 'us.anthropic.claude-sonnet-4-6',\r\n  vertex: 'claude-sonnet-4-6',\r\n  foundry: 'claude-sonnet-4-6',\r\n} as const satisfies ModelConfig\r\n\r\n// @[MODEL LAUNCH]: Register the new config here.\r\nexport const ALL_MODEL_CONFIGS = {\r\n  haiku35: CLAUDE_3_5_HAIKU_CONFIG,\r\n  haiku45: CLAUDE_HAIKU_4_5_CONFIG,\r\n  sonnet35: CLAUDE_3_5_V2_SONNET_CONFIG,\r\n  sonnet37: CLAUDE_3_7_SONNET_CONFIG,\r\n  sonnet40: CLAUDE_SONNET_4_CONFIG,\r\n  sonnet45: CLAUDE_SONNET_4_5_CONFIG,\r\n  sonnet46: CLAUDE_SONNET_4_6_CONFIG,\r\n  opus40: CLAUDE_OPUS_4_CONFIG,\r\n  opus41: CLAUDE_OPUS_4_1_CONFIG,\r\n  opus45: CLAUDE_OPUS_4_5_CONFIG,\r\n  opus46: CLAUDE_OPUS_4_6_CONFIG,\r\n  opus47: CLAUDE_OPUS_4_7_CONFIG,\r\n  opus48: CLAUDE_OPUS_4_8_CONFIG,\r\n} as const satisfies Record<string, ModelConfig>\r\n\r\nexport type ModelKey = keyof typeof ALL_MODEL_CONFIGS\r\n\r\n/** Union of all canonical first-party model IDs, e.g. 'claude-opus-4-6' | 'claude-sonnet-4-5-20250929' | \u2026 */\r\nexport type CanonicalModelId =\r\n  (typeof ALL_MODEL_CONFIGS)[ModelKey]['firstParty']\r\n\r\n/** Runtime list of canonical model IDs \u2014 used by comprehensiveness tests. */\r\nexport const CANONICAL_MODEL_IDS = Object.values(ALL_MODEL_CONFIGS).map(\r\n  c => c.firstParty,\r\n) as [CanonicalModelId, ...CanonicalModelId[]]\r\n\r\n/** Map canonical ID \u2192 internal short key. Used to apply settings-based modelOverrides. */\r\nexport const CANONICAL_ID_TO_KEY: Record<CanonicalModelId, ModelKey> =\r\n  Object.fromEntries(\r\n    (Object.entries(ALL_MODEL_CONFIGS) as [ModelKey, ModelConfig][]).map(\r\n      ([key, cfg]) => [cfg.firstParty, key],\r\n    ),\r\n  ) as Record<CanonicalModelId, ModelKey>\r\n", "/**\n * Forced-Provider Context\n *\n * AsyncLocalStorage that pins a specific APIProvider for the duration of an\n * async call tree. Used by /team-mode so each spawned agent can route through\n * a different provider+lane than the session-global one set via /provider.\n *\n * How it threads through the stack:\n *\n *   runWithForcedProvider({ provider: 'kiro' }, () => runAgent(...))\n *       \u2514\u2500 Agent loop calls getAnthropicClient(...)\n *           \u2514\u2500 Reads getAPIProvider() \u2014 returns 'kiro' (forced)\n *               \u2514\u2500 createProvider('kiro') builds a LaneBackedProvider\n *                   \u2514\u2500 All model calls land on the Kiro lane\n *\n * Without forcing, getAPIProvider() falls back to its normal session-cached\n * value, so non-team-mode code is unchanged.\n *\n * IMPORTANT: AsyncLocalStorage is preserved across awaits and promise chains\n * within the same async context, but does NOT propagate across `setImmediate`\n * scheduled outside the run callback, `worker_threads`, or fresh event-loop\n * tasks. The agent loop runs entirely inside the callback so this is fine.\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks'\nimport type { APIProvider } from './model/providers.js'\n\nexport interface ForcedProviderContext {\n  provider: APIProvider\n}\n\nconst _forcedProvider = new AsyncLocalStorage<ForcedProviderContext>()\n\n/**\n * Run `fn` with `provider` pinned as the active APIProvider for every\n * getAPIProvider() call inside this async context tree.\n */\nexport function runWithForcedProvider<T>(\n  ctx: ForcedProviderContext,\n  fn: () => T,\n): T {\n  return _forcedProvider.run(ctx, fn)\n}\n\n/**\n * Read the currently forced provider, if any. Returns undefined when the\n * call is happening outside a runWithForcedProvider() scope.\n */\nexport function getForcedProvider(): APIProvider | undefined {\n  return _forcedProvider.getStore()?.provider\n}\n", "import { feature } from 'bun:bundle'\n\nexport const CLAUDE_CODE_20250219_BETA_HEADER = 'claude-code-20250219'\nexport const INTERLEAVED_THINKING_BETA_HEADER =\n  'interleaved-thinking-2025-05-14'\nexport const CONTEXT_1M_BETA_HEADER = 'context-1m-2025-08-07'\nexport const CONTEXT_MANAGEMENT_BETA_HEADER = 'context-management-2025-06-27'\nexport const STRUCTURED_OUTPUTS_BETA_HEADER = 'structured-outputs-2025-12-15'\nexport const WEB_SEARCH_BETA_HEADER = 'web-search-2025-03-05'\n// Tool search beta headers differ by provider:\n// - Claude API / Foundry: advanced-tool-use-2025-11-20\n// - Vertex AI / Bedrock: tool-search-tool-2025-10-19\nexport const TOOL_SEARCH_BETA_HEADER_1P = 'advanced-tool-use-2025-11-20'\nexport const TOOL_SEARCH_BETA_HEADER_3P = 'tool-search-tool-2025-10-19'\nexport const EFFORT_BETA_HEADER = 'effort-2025-11-24'\nexport const TASK_BUDGETS_BETA_HEADER = 'task-budgets-2026-03-13'\nexport const PROMPT_CACHING_SCOPE_BETA_HEADER =\n  'prompt-caching-scope-2026-01-05'\nexport const FAST_MODE_BETA_HEADER = 'fast-mode-2026-02-01'\nexport const REDACT_THINKING_BETA_HEADER = 'redact-thinking-2026-02-12'\nexport const TOKEN_EFFICIENT_TOOLS_BETA_HEADER =\n  'token-efficient-tools-2026-03-28'\nexport const SUMMARIZE_CONNECTOR_TEXT_BETA_HEADER = feature('CONNECTOR_TEXT')\n  ? 'summarize-connector-text-2026-03-13'\n  : ''\nexport const AFK_MODE_BETA_HEADER = feature('TRANSCRIPT_CLASSIFIER')\n  ? 'afk-mode-2026-01-31'\n  : ''\nexport const CLI_INTERNAL_BETA_HEADER =\n  process.env.USER_TYPE === 'ant' ? 'cli-internal-2026-02-09' : ''\nexport const ADVISOR_BETA_HEADER = 'advisor-tool-2026-03-01'\n\n/**\n * Bedrock only supports a limited number of beta headers and only through\n * extraBodyParams. This set maintains the beta strings that should be in\n * Bedrock extraBodyParams *and not* in Bedrock headers.\n */\nexport const BEDROCK_EXTRA_PARAMS_HEADERS = new Set([\n  INTERLEAVED_THINKING_BETA_HEADER,\n  CONTEXT_1M_BETA_HEADER,\n  TOOL_SEARCH_BETA_HEADER_3P,\n])\n\n/**\n * Betas allowed on Vertex countTokens API.\n * Other betas will cause 400 errors.\n */\nexport const VERTEX_COUNT_TOKENS_ALLOWED_BETAS = new Set([\n  CLAUDE_CODE_20250219_BETA_HEADER,\n  INTERLEAVED_THINKING_BETA_HEADER,\n  CONTEXT_MANAGEMENT_BETA_HEADER,\n])\n", "import Anthropic, { type ClientOptions } from '@anthropic-ai/sdk'\r\nimport { randomUUID } from 'crypto'\r\nimport type { GoogleAuth } from 'google-auth-library'\r\nimport {\r\n  checkAndRefreshOAuthTokenIfNeeded,\r\n  getAnthropicApiKey,\r\n  getApiKeyFromApiKeyHelper,\r\n  getClaudeAIOAuthTokens,\r\n  getProviderApiKey,\r\n  getProviderBaseUrl,\r\n  isClaudeAISubscriber,\r\n  refreshAndGetAwsCredentials,\r\n  refreshGcpCredentialsIfNeeded,\r\n  validateProviderAuth,\r\n} from 'src/utils/auth.js'\r\nimport { getUserAgent } from 'src/utils/http.js'\r\nimport { getSmallFastModel } from 'src/utils/model/model.js'\r\nimport {\r\n  getAPIProvider,\r\n  isFirstPartyAnthropicBaseUrl,\r\n  isThirdPartyProvider,\r\n} from 'src/utils/model/providers.js'\r\nimport { getForcedProvider } from 'src/utils/forcedProvider.js'\r\nimport { createProviderShim } from './providers/providerShim.js'\r\nimport { getProxyFetchOptions } from 'src/utils/proxy.js'\r\nimport {\r\n  getIsNonInteractiveSession,\r\n  getSessionId,\r\n} from '../../bootstrap/state.js'\r\nimport { getOauthConfig } from '../../constants/oauth.js'\r\nimport { isDebugToStdErr, logForDebugging } from '../../utils/debug.js'\r\nimport {\r\n  getAWSRegion,\r\n  getVertexRegionForModel,\r\n  isEnvTruthy,\r\n} from '../../utils/envUtils.js'\r\nimport { ANTIGRAVITY_MODEL_IDS } from './providers/gemini_code_assist.js'\r\n\r\n/**\r\n * Environment variables for different client types:\r\n *\r\n * Direct API:\r\n * - ANTHROPIC_API_KEY: Required for direct API access\r\n *\r\n * AWS Bedrock:\r\n * - AWS credentials configured via aws-sdk defaults\r\n * - AWS_REGION or AWS_DEFAULT_REGION: Sets the AWS region for all models (default: us-east-1)\r\n * - ANTHROPIC_SMALL_FAST_MODEL_AWS_REGION: Optional. Override AWS region specifically for the small fast model (Haiku)\r\n *\r\n * Foundry (Azure):\r\n * - ANTHROPIC_FOUNDRY_RESOURCE: Your Azure resource name (e.g., 'my-resource')\r\n *   For the full endpoint: https://{resource}.services.ai.azure.com/anthropic/v1/messages\r\n * - ANTHROPIC_FOUNDRY_BASE_URL: Optional. Alternative to resource - provide full base URL directly\r\n *   (e.g., 'https://my-resource.services.ai.azure.com')\r\n *\r\n * Authentication (one of the following):\r\n * - ANTHROPIC_FOUNDRY_API_KEY: Your Microsoft Foundry API key (if using API key auth)\r\n * - Azure AD authentication: If no API key is provided, uses DefaultAzureCredential\r\n *   which supports multiple auth methods (environment variables, managed identity,\r\n *   Azure CLI, etc.). See: https://docs.microsoft.com/en-us/javascript/api/@azure/identity\r\n *\r\n * Vertex AI:\r\n * - Model-specific region variables (highest priority):\r\n *   - VERTEX_REGION_CLAUDE_3_5_HAIKU: Region for Claude 3.5 Haiku model\r\n *   - VERTEX_REGION_CLAUDE_HAIKU_4_5: Region for Claude Haiku 4.5 model\r\n *   - VERTEX_REGION_CLAUDE_3_5_SONNET: Region for Claude 3.5 Sonnet model\r\n *   - VERTEX_REGION_CLAUDE_3_7_SONNET: Region for Claude 3.7 Sonnet model\r\n * - CLOUD_ML_REGION: Optional. The default GCP region to use for all models\r\n *   If specific model region not specified above\r\n * - ANTHROPIC_VERTEX_PROJECT_ID: Required. Your GCP project ID\r\n * - Standard GCP credentials configured via google-auth-library\r\n *\r\n * Priority for determining region:\r\n * 1. Hardcoded model-specific environment variables\r\n * 2. Global CLOUD_ML_REGION variable\r\n * 3. Default region from config\r\n * 4. Fallback region (us-east5)\r\n */\r\n\r\n/**\r\n * Auto-correct the provider when the selected model clearly belongs\r\n * to a different provider. Prevents routing Gemini models to OpenAI,\r\n * or OpenAI models to Gemini, etc.\r\n */\r\nfunction _autoCorrectProvider(\r\n  current: import('../../utils/model/providers.js').APIProvider,\r\n  model: string,\r\n): import('../../utils/model/providers.js').APIProvider {\r\n  // If a caller explicitly pinned a provider via runWithForcedProvider\r\n  // (team-mode roles, per-agent provider overrides), never rewrite the\r\n  // choice. The whole point of forcing is to bypass session-level routing.\r\n  if (getForcedProvider() !== undefined) {\r\n    return current\r\n  }\r\n\r\n  // Explicitly-selected third-party providers are authoritative. The user\r\n  // (or /team-mode roster) picked this provider for this model \u2014 don't\r\n  // second-guess it just because some sibling provider also lists the\r\n  // model id. Without this guard, claude-sonnet-4-6 on Kiro silently\r\n  // re-routed to Antigravity, gemini-3-flash on OpenRouter silently\r\n  // re-routed to Antigravity, etc. \u2014 exactly the cross-provider\r\n  // contamination users hit when picking flash via opencode.\r\n  if (\r\n    current === 'kiro'\r\n    || current === 'antigravity'\r\n    || current === 'openrouter'\r\n    || current === 'agentrouter'\r\n    || current === 'modelrouter'\r\n    || current === 'vercel'\n    || current === 'requesty'\n    || current === 'opencode'\n    || current === 'commandcode'\n    || current === 'groq'\n    || current === 'mistral'\r\n    || current === 'nim'\r\n    || current === 'deepseek'\r\n    || current === 'glm'\r\n    || current === 'moonshot'\r\n    || current === 'minimax'\r\n    || current === 'ollama'\r\n    || current === 'lmstudio'\r\n    || current === 'cline'\r\n    || current === 'iflow'\r\n    || current === 'kilocode'\r\n    || current === 'copilot'\r\n    || current === 'cursor'\r\n  ) {\r\n    return current\r\n  }\r\n\r\n  // Below here, `current` is one of {openai, gemini} \u2014 the legacy single-\r\n  // provider paths where users routinely mismatch model + provider. These\r\n  // get the cross-domain auto-correct so a Gemini model picked on the\r\n  // OpenAI provider still lands somewhere sane.\r\n\r\n  const m = model.toLowerCase()\r\n\r\n  // Antigravity hosts a small fixed set of Gemini 3.x + Claude 4.6 ids on\r\n  // cloudcode-pa. Only auto-route to it from a non-pinned provider \u2014 never\r\n  // from another 3P provider that may also serve the same id.\r\n  if (ANTIGRAVITY_MODEL_IDS.has(m)) {\r\n    return 'antigravity'\r\n  }\r\n\r\n  // Gemini models \u2192 must use the Gemini provider\r\n  if (\r\n    current === 'openai'\r\n    && (m.startsWith('gemini-') || m.startsWith('gemma-'))\r\n  ) {\r\n    return 'gemini'\r\n  }\r\n  // OpenAI models \u2192 must use the OpenAI provider\r\n  if (\r\n    current === 'gemini'\r\n    && (m.startsWith('gpt-') || m.startsWith('o1') || m.startsWith('o3') || m.startsWith('o4') || m.startsWith('codex-'))\r\n  ) {\r\n    return 'openai'\r\n  }\r\n  // Everything else: trust the user's /provider selection\r\n  return current\r\n}\r\n\r\nfunction createStderrLogger(): ClientOptions['logger'] {\r\n  return {\r\n    error: (msg, ...args) =>\r\n      // biome-ignore lint/suspicious/noConsole:: intentional console output -- SDK logger must use console\r\n      console.error('[Anthropic SDK ERROR]', msg, ...args),\r\n    // biome-ignore lint/suspicious/noConsole:: intentional console output -- SDK logger must use console\r\n    warn: (msg, ...args) => console.error('[Anthropic SDK WARN]', msg, ...args),\r\n    // biome-ignore lint/suspicious/noConsole:: intentional console output -- SDK logger must use console\r\n    info: (msg, ...args) => console.error('[Anthropic SDK INFO]', msg, ...args),\r\n    debug: (msg, ...args) =>\r\n      // biome-ignore lint/suspicious/noConsole:: intentional console output -- SDK logger must use console\r\n      console.error('[Anthropic SDK DEBUG]', msg, ...args),\r\n  }\r\n}\r\n\r\nexport async function getAnthropicClient({\r\n  apiKey,\r\n  maxRetries,\r\n  model,\r\n  fetchOverride,\r\n  source,\r\n}: {\r\n  apiKey?: string\r\n  maxRetries: number\r\n  model?: string\r\n  fetchOverride?: ClientOptions['fetch']\r\n  source?: string\r\n}): Promise<Anthropic> {\r\n  const containerId = process.env.CLAUDE_CODE_CONTAINER_ID\r\n  const remoteSessionId = process.env.CLAUDE_CODE_REMOTE_SESSION_ID\r\n  const clientApp = process.env.CLAUDE_AGENT_SDK_CLIENT_APP\r\n  const customHeaders = getCustomHeaders()\r\n  const defaultHeaders: { [key: string]: string } = {\r\n    'x-app': 'cli',\r\n    'User-Agent': getUserAgent(),\r\n    'X-Claude-Code-Session-Id': getSessionId(),\r\n    ...customHeaders,\r\n    ...(containerId ? { 'x-claude-remote-container-id': containerId } : {}),\r\n    ...(remoteSessionId\r\n      ? { 'x-claude-remote-session-id': remoteSessionId }\r\n      : {}),\r\n    // SDK consumers can identify their app/library for backend analytics\r\n    ...(clientApp ? { 'x-client-app': clientApp } : {}),\r\n  }\r\n\r\n  // Log API client configuration for HFI debugging\r\n  logForDebugging(\r\n    `[API:request] Creating client, ANTHROPIC_CUSTOM_HEADERS present: ${!!process.env.ANTHROPIC_CUSTOM_HEADERS}, has Authorization header: ${!!customHeaders['Authorization']}`,\r\n  )\r\n\r\n  // Add additional protection header if enabled via env var\r\n  const additionalProtectionEnabled = isEnvTruthy(\r\n    process.env.CLAUDE_CODE_ADDITIONAL_PROTECTION,\r\n  )\r\n  if (additionalProtectionEnabled) {\r\n    defaultHeaders['x-anthropic-additional-protection'] = 'true'\r\n  }\r\n\r\n  logForDebugging('[API:auth] OAuth token check starting')\r\n  await checkAndRefreshOAuthTokenIfNeeded()\r\n  logForDebugging('[API:auth] OAuth token check complete')\r\n\r\n  if (!isClaudeAISubscriber()) {\r\n    await configureApiKeyHeaders(defaultHeaders, getIsNonInteractiveSession())\r\n  }\r\n\r\n  const resolvedFetch = buildFetch(fetchOverride, source)\r\n\r\n  // \u2500\u2500 Third-party (non-Anthropic) providers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  // Route to the provider shim BEFORE checking Bedrock/Vertex/Foundry.\r\n  // The shim duck-types the Anthropic SDK interface so withRetry,\r\n  // streaming, and MCP tool loops all work unchanged.\r\n  //\r\n  // Auto-correct provider when the model clearly belongs to another.\r\n  // Prevents \"openai API error 404: gemini-3.1-pro-low does not exist\"\r\n  // when the user picks a Gemini model while /provider is set to openai.\r\n  let currentProvider = getAPIProvider()\r\n  if (model && isThirdPartyProvider(currentProvider)) {\r\n    const corrected = _autoCorrectProvider(currentProvider, model)\r\n    if (corrected !== currentProvider) {\r\n      logForDebugging(`[API:route] Auto-corrected provider ${currentProvider} \u2192 ${corrected} for model ${model}`)\r\n      currentProvider = corrected\r\n    }\r\n  }\r\n  if (isThirdPartyProvider(currentProvider)) {\r\n    const authCheck = validateProviderAuth(currentProvider)\r\n    if (!authCheck.valid) {\r\n      throw new Error(authCheck.reason)\r\n    }\r\n\r\n    // For OAuth-authenticated providers, ensure tokens are fresh.\r\n    // resolveProviderAuth() handles async refresh before we create the shim.\r\n    if (authCheck.method === 'oauth') {\r\n      const { resolveProviderAuth } = await import('./auth/provider_auth.js')\r\n      await resolveProviderAuth(currentProvider)  // refreshes token if expired\r\n    }\r\n\r\n    // AgentRouter's Claude Code integration is Anthropic Messages-compatible,\r\n    // not the OpenAI chat-completions wire path. Its official setup uses\r\n    // ANTHROPIC_BASE_URL=https://agentrouter.org/ with the same token in\r\n    // ANTHROPIC_AUTH_TOKEN/ANTHROPIC_API_KEY, so route the selectable provider\r\n    // through the real Anthropic SDK client and let the SDK emit the Claude Code\r\n    // request shape.\r\n    if (currentProvider === 'agentrouter') {\r\n      const agentRouterKey = getProviderApiKey('agentrouter')\r\n      if (!agentRouterKey) {\r\n        throw new Error('No credentials found for agentrouter. Set AGENT_ROUTER_TOKEN or run `/login`.')\r\n      }\r\n      const baseURL = getProviderBaseUrl('agentrouter').replace(/\\/v1\\/?$/i, '/')\r\n      return new Anthropic({\r\n        apiKey: agentRouterKey,\r\n        authToken: agentRouterKey,\r\n        baseURL,\r\n        defaultHeaders,\r\n        maxRetries,\r\n        timeout: parseInt(process.env.API_TIMEOUT_MS || String(600 * 1000), 10),\r\n        dangerouslyAllowBrowser: true,\r\n        fetchOptions: getProxyFetchOptions({\r\n          forAnthropicAPI: true,\r\n        }) as ClientOptions['fetchOptions'],\r\n        ...(resolvedFetch && {\r\n          fetch: resolvedFetch,\r\n        }),\r\n        ...(isDebugToStdErr() && { logger: createStderrLogger() }),\r\n      })\r\n    }\r\n\r\n    // Return the shim cast as Anthropic \u2014 it quacks like an Anthropic client\r\n    return createProviderShim(currentProvider) as unknown as Anthropic\r\n  }\r\n\r\n  const ARGS = {\r\n    defaultHeaders,\r\n    maxRetries,\r\n    timeout: parseInt(process.env.API_TIMEOUT_MS || String(600 * 1000), 10),\r\n    dangerouslyAllowBrowser: true,\r\n    fetchOptions: getProxyFetchOptions({\r\n      forAnthropicAPI: true,\r\n    }) as ClientOptions['fetchOptions'],\r\n    ...(resolvedFetch && {\r\n      fetch: resolvedFetch,\r\n    }),\r\n  }\r\n  if (isEnvTruthy(process.env.CLAUDE_CODE_USE_BEDROCK)) {\r\n    const { AnthropicBedrock } = await import('@anthropic-ai/bedrock-sdk')\r\n    // Use region override for small fast model if specified\r\n    const awsRegion =\r\n      model === getSmallFastModel() &&\r\n      process.env.ANTHROPIC_SMALL_FAST_MODEL_AWS_REGION\r\n        ? process.env.ANTHROPIC_SMALL_FAST_MODEL_AWS_REGION\r\n        : getAWSRegion()\r\n\r\n    const bedrockArgs: ConstructorParameters<typeof AnthropicBedrock>[0] = {\r\n      ...ARGS,\r\n      awsRegion,\r\n      ...(isEnvTruthy(process.env.CLAUDE_CODE_SKIP_BEDROCK_AUTH) && {\r\n        skipAuth: true,\r\n      }),\r\n      ...(isDebugToStdErr() && { logger: createStderrLogger() }),\r\n    }\r\n\r\n    // Add API key authentication if available\r\n    if (process.env.AWS_BEARER_TOKEN_BEDROCK) {\r\n      bedrockArgs.skipAuth = true\r\n      // Add the Bearer token for Bedrock API key authentication\r\n      bedrockArgs.defaultHeaders = {\r\n        ...bedrockArgs.defaultHeaders,\r\n        Authorization: `Bearer ${process.env.AWS_BEARER_TOKEN_BEDROCK}`,\r\n      }\r\n    } else if (!isEnvTruthy(process.env.CLAUDE_CODE_SKIP_BEDROCK_AUTH)) {\r\n      // Refresh auth and get credentials with cache clearing\r\n      const cachedCredentials = await refreshAndGetAwsCredentials()\r\n      if (cachedCredentials) {\r\n        bedrockArgs.awsAccessKey = cachedCredentials.accessKeyId\r\n        bedrockArgs.awsSecretKey = cachedCredentials.secretAccessKey\r\n        bedrockArgs.awsSessionToken = cachedCredentials.sessionToken\r\n      }\r\n    }\r\n    // we have always been lying about the return type - this doesn't support batching or models\r\n    return new AnthropicBedrock(bedrockArgs) as unknown as Anthropic\r\n  }\r\n  if (isEnvTruthy(process.env.CLAUDE_CODE_USE_FOUNDRY)) {\r\n    const { AnthropicFoundry } = await import('@anthropic-ai/foundry-sdk')\r\n    // Determine Azure AD token provider based on configuration\r\n    // SDK reads ANTHROPIC_FOUNDRY_API_KEY by default\r\n    let azureADTokenProvider: (() => Promise<string>) | undefined\r\n    if (!process.env.ANTHROPIC_FOUNDRY_API_KEY) {\r\n      if (isEnvTruthy(process.env.CLAUDE_CODE_SKIP_FOUNDRY_AUTH)) {\r\n        // Mock token provider for testing/proxy scenarios (similar to Vertex mock GoogleAuth)\r\n        azureADTokenProvider = () => Promise.resolve('')\r\n      } else {\r\n        // Use real Azure AD authentication with DefaultAzureCredential\r\n        const {\r\n          DefaultAzureCredential: AzureCredential,\r\n          getBearerTokenProvider,\r\n        } = await import('@azure/identity')\r\n        azureADTokenProvider = getBearerTokenProvider(\r\n          new AzureCredential(),\r\n          'https://cognitiveservices.azure.com/.default',\r\n        )\r\n      }\r\n    }\r\n\r\n    const foundryArgs: ConstructorParameters<typeof AnthropicFoundry>[0] = {\r\n      ...ARGS,\r\n      ...(azureADTokenProvider && { azureADTokenProvider }),\r\n      ...(isDebugToStdErr() && { logger: createStderrLogger() }),\r\n    }\r\n    // we have always been lying about the return type - this doesn't support batching or models\r\n    return new AnthropicFoundry(foundryArgs) as unknown as Anthropic\r\n  }\r\n  if (isEnvTruthy(process.env.CLAUDE_CODE_USE_VERTEX)) {\r\n    // Refresh GCP credentials if gcpAuthRefresh is configured and credentials are expired\r\n    // This is similar to how we handle AWS credential refresh for Bedrock\r\n    if (!isEnvTruthy(process.env.CLAUDE_CODE_SKIP_VERTEX_AUTH)) {\r\n      await refreshGcpCredentialsIfNeeded()\r\n    }\r\n\r\n    const [{ AnthropicVertex }, { GoogleAuth }] = await Promise.all([\r\n      import('@anthropic-ai/vertex-sdk'),\r\n      import('google-auth-library'),\r\n    ])\r\n    // TODO: Cache either GoogleAuth instance or AuthClient to improve performance\r\n    // Currently we create a new GoogleAuth instance for every getAnthropicClient() call\r\n    // This could cause repeated authentication flows and metadata server checks\r\n    // However, caching needs careful handling of:\r\n    // - Credential refresh/expiration\r\n    // - Environment variable changes (GOOGLE_APPLICATION_CREDENTIALS, project vars)\r\n    // - Cross-request auth state management\r\n    // See: https://github.com/googleapis/google-auth-library-nodejs/issues/390 for caching challenges\r\n\r\n    // Prevent metadata server timeout by providing projectId as fallback\r\n    // google-auth-library checks project ID in this order:\r\n    // 1. Environment variables (GCLOUD_PROJECT, GOOGLE_CLOUD_PROJECT, etc.)\r\n    // 2. Credential files (service account JSON, ADC file)\r\n    // 3. gcloud config\r\n    // 4. GCE metadata server (causes 12s timeout outside GCP)\r\n    //\r\n    // We only set projectId if user hasn't configured other discovery methods\r\n    // to avoid interfering with their existing auth setup\r\n\r\n    // Check project environment variables in same order as google-auth-library\r\n    // See: https://github.com/googleapis/google-auth-library-nodejs/blob/main/src/auth/googleauth.ts\r\n    const hasProjectEnvVar =\r\n      process.env['GCLOUD_PROJECT'] ||\r\n      process.env['GOOGLE_CLOUD_PROJECT'] ||\r\n      process.env['gcloud_project'] ||\r\n      process.env['google_cloud_project']\r\n\r\n    // Check for credential file paths (service account or ADC)\r\n    // Note: We're checking both standard and lowercase variants to be safe,\r\n    // though we should verify what google-auth-library actually checks\r\n    const hasKeyFile =\r\n      process.env['GOOGLE_APPLICATION_CREDENTIALS'] ||\r\n      process.env['google_application_credentials']\r\n\r\n    const googleAuth = isEnvTruthy(process.env.CLAUDE_CODE_SKIP_VERTEX_AUTH)\r\n      ? ({\r\n          // Mock GoogleAuth for testing/proxy scenarios\r\n          getClient: () => ({\r\n            getRequestHeaders: () => ({}),\r\n          }),\r\n        } as unknown as GoogleAuth)\r\n      : new GoogleAuth({\r\n          scopes: ['https://www.googleapis.com/auth/cloud-platform'],\r\n          // Only use ANTHROPIC_VERTEX_PROJECT_ID as last resort fallback\r\n          // This prevents the 12-second metadata server timeout when:\r\n          // - No project env vars are set AND\r\n          // - No credential keyfile is specified AND\r\n          // - ADC file exists but lacks project_id field\r\n          //\r\n          // Risk: If auth project != API target project, this could cause billing/audit issues\r\n          // Mitigation: Users can set GOOGLE_CLOUD_PROJECT to override\r\n          ...(hasProjectEnvVar || hasKeyFile\r\n            ? {}\r\n            : {\r\n                projectId: process.env.ANTHROPIC_VERTEX_PROJECT_ID,\r\n              }),\r\n        })\r\n\r\n    const vertexArgs: ConstructorParameters<typeof AnthropicVertex>[0] = {\r\n      ...ARGS,\r\n      region: getVertexRegionForModel(model),\r\n      googleAuth,\r\n      ...(isDebugToStdErr() && { logger: createStderrLogger() }),\r\n    }\r\n    // we have always been lying about the return type - this doesn't support batching or models\r\n    return new AnthropicVertex(vertexArgs) as unknown as Anthropic\r\n  }\r\n\r\n  // Determine authentication method based on available tokens\r\n  const clientConfig: ConstructorParameters<typeof Anthropic>[0] = {\r\n    apiKey: isClaudeAISubscriber() ? null : apiKey || getAnthropicApiKey(),\r\n    authToken: isClaudeAISubscriber()\r\n      ? getClaudeAIOAuthTokens()?.accessToken\r\n      : undefined,\r\n    // Set baseURL from OAuth config when using staging OAuth\r\n    ...(process.env.USER_TYPE === 'ant' &&\r\n    isEnvTruthy(process.env.USE_STAGING_OAUTH)\r\n      ? { baseURL: getOauthConfig().BASE_API_URL }\r\n      : {}),\r\n    ...ARGS,\r\n    ...(isDebugToStdErr() && { logger: createStderrLogger() }),\r\n  }\r\n\r\n  return new Anthropic(clientConfig)\r\n}\r\n\r\nasync function configureApiKeyHeaders(\r\n  headers: Record<string, string>,\r\n  isNonInteractiveSession: boolean,\r\n): Promise<void> {\r\n  const token =\r\n    process.env.ANTHROPIC_AUTH_TOKEN ||\r\n    (await getApiKeyFromApiKeyHelper(isNonInteractiveSession))\r\n  if (token) {\r\n    headers['Authorization'] = `Bearer ${token}`\r\n  }\r\n}\r\n\r\nfunction getCustomHeaders(): Record<string, string> {\r\n  const customHeaders: Record<string, string> = {}\r\n  const customHeadersEnv = process.env.ANTHROPIC_CUSTOM_HEADERS\r\n\r\n  if (!customHeadersEnv) return customHeaders\r\n\r\n  // Split by newlines to support multiple headers\r\n  const headerStrings = customHeadersEnv.split(/\\n|\\r\\n/)\r\n\r\n  for (const headerString of headerStrings) {\r\n    if (!headerString.trim()) continue\r\n\r\n    // Parse header in format \"Name: Value\" (curl style). Split on first `:`\r\n    // then trim \u2014 avoids regex backtracking on malformed long header lines.\r\n    const colonIdx = headerString.indexOf(':')\r\n    if (colonIdx === -1) continue\r\n    const name = headerString.slice(0, colonIdx).trim()\r\n    const value = headerString.slice(colonIdx + 1).trim()\r\n    if (name) {\r\n      customHeaders[name] = value\r\n    }\r\n  }\r\n\r\n  return customHeaders\r\n}\r\n\r\nexport const CLIENT_REQUEST_ID_HEADER = 'x-client-request-id'\r\n\r\nfunction buildFetch(\r\n  fetchOverride: ClientOptions['fetch'],\r\n  source: string | undefined,\r\n): ClientOptions['fetch'] {\r\n  // eslint-disable-next-line eslint-plugin-n/no-unsupported-features/node-builtins\r\n  const inner = fetchOverride ?? globalThis.fetch\r\n  // Only send to the first-party API \u2014 Bedrock/Vertex/Foundry don't log it\r\n  // and unknown headers risk rejection by strict proxies (inc-4029 class).\r\n  const injectClientRequestId =\r\n    getAPIProvider() === 'firstParty' && isFirstPartyAnthropicBaseUrl()\r\n  return (input, init) => {\r\n    // eslint-disable-next-line eslint-plugin-n/no-unsupported-features/node-builtins\r\n    const headers = new Headers(init?.headers)\r\n    // Generate a client-side request ID so timeouts (which return no server\r\n    // request ID) can still be correlated with server logs by the API team.\r\n    // Callers that want to track the ID themselves can pre-set the header.\r\n    if (injectClientRequestId && !headers.has(CLIENT_REQUEST_ID_HEADER)) {\r\n      headers.set(CLIENT_REQUEST_ID_HEADER, randomUUID())\r\n    }\r\n    try {\r\n      // eslint-disable-next-line eslint-plugin-n/no-unsupported-features/node-builtins\r\n      const url = input instanceof Request ? input.url : String(input)\r\n      const id = headers.get(CLIENT_REQUEST_ID_HEADER)\r\n      logForDebugging(\r\n        `[API REQUEST] ${new URL(url).pathname}${id ? ` ${CLIENT_REQUEST_ID_HEADER}=${id}` : ''} source=${source ?? 'unknown'}`,\r\n      )\r\n    } catch {\r\n      // never let logging crash the fetch\r\n    }\r\n    return inner(input, { ...init, headers })\r\n  }\r\n}\r\n", "import { readFileSync } from 'fs'\nimport { mkdir, writeFile } from 'fs/promises'\nimport isEqual from 'lodash-es/isEqual.js'\nimport memoize from 'lodash-es/memoize.js'\nimport { join } from 'path'\nimport { z } from 'zod/v4'\nimport { OAUTH_BETA_HEADER } from '../../constants/oauth.js'\nimport { getAnthropicClient } from '../../services/api/client.js'\nimport { isClaudeAISubscriber } from '../auth.js'\nimport { logForDebugging } from '../debug.js'\nimport { getClaudeConfigHomeDir } from '../envUtils.js'\nimport { safeParseJSON } from '../json.js'\nimport { lazySchema } from '../lazySchema.js'\nimport { isEssentialTrafficOnly } from '../privacyLevel.js'\nimport { jsonStringify } from '../slowOperations.js'\nimport { getAPIProvider, isFirstPartyAnthropicBaseUrl } from './providers.js'\n\n// .strip() \u2014 don't persist internal-only fields (mycro_deployments etc.) to disk\nconst ModelCapabilitySchema = lazySchema(() =>\n  z\n    .object({\n      id: z.string(),\n      max_input_tokens: z.number().optional(),\n      max_tokens: z.number().optional(),\n    })\n    .strip(),\n)\n\nconst CacheFileSchema = lazySchema(() =>\n  z.object({\n    models: z.array(ModelCapabilitySchema()),\n    timestamp: z.number(),\n  }),\n)\n\nexport type ModelCapability = z.infer<ReturnType<typeof ModelCapabilitySchema>>\n\nfunction getCacheDir(): string {\n  return join(getClaudeConfigHomeDir(), 'cache')\n}\n\nfunction getCachePath(): string {\n  return join(getCacheDir(), 'model-capabilities.json')\n}\n\nfunction isModelCapabilitiesEligible(): boolean {\n  if (process.env.USER_TYPE !== 'ant') return false\n  if (getAPIProvider() !== 'firstParty') return false\n  if (!isFirstPartyAnthropicBaseUrl()) return false\n  return true\n}\n\n// Longest-id-first so substring match prefers most specific; secondary key for stable isEqual\nfunction sortForMatching(models: ModelCapability[]): ModelCapability[] {\n  return [...models].sort(\n    (a, b) => b.id.length - a.id.length || a.id.localeCompare(b.id),\n  )\n}\n\n// Keyed on cache path so tests that set CLAUDE_CONFIG_DIR get a fresh read\nconst loadCache = memoize(\n  (path: string): ModelCapability[] | null => {\n    try {\n      // eslint-disable-next-line custom-rules/no-sync-fs -- memoized; called from sync getContextWindowForModel\n      const raw = readFileSync(path, 'utf-8')\n      const parsed = CacheFileSchema().safeParse(safeParseJSON(raw, false))\n      return parsed.success ? parsed.data.models : null\n    } catch {\n      return null\n    }\n  },\n  path => path,\n)\n\nexport function getModelCapability(model: string): ModelCapability | undefined {\n  if (!isModelCapabilitiesEligible()) return undefined\n  const cached = loadCache(getCachePath())\n  if (!cached || cached.length === 0) return undefined\n  const m = model.toLowerCase()\n  const exact = cached.find(c => c.id.toLowerCase() === m)\n  if (exact) return exact\n  return cached.find(c => m.includes(c.id.toLowerCase()))\n}\n\nexport async function refreshModelCapabilities(): Promise<void> {\n  if (!isModelCapabilitiesEligible()) return\n  if (isEssentialTrafficOnly()) return\n\n  try {\n    const anthropic = await getAnthropicClient({ maxRetries: 1 })\n    const betas = isClaudeAISubscriber() ? [OAUTH_BETA_HEADER] : undefined\n    const parsed: ModelCapability[] = []\n    for await (const entry of anthropic.models.list({ betas })) {\n      const result = ModelCapabilitySchema().safeParse(entry)\n      if (result.success) parsed.push(result.data)\n    }\n    if (parsed.length === 0) return\n\n    const path = getCachePath()\n    const models = sortForMatching(parsed)\n    if (isEqual(loadCache(path), models)) {\n      logForDebugging('[modelCapabilities] cache unchanged, skipping write')\n      return\n    }\n\n    await mkdir(getCacheDir(), { recursive: true })\n    await writeFile(path, jsonStringify({ models, timestamp: Date.now() }), {\n      encoding: 'utf-8',\n      mode: 0o600,\n    })\n    loadCache.cache.delete(path)\n    logForDebugging(`[modelCapabilities] cached ${models.length} models`)\n  } catch (error) {\n    logForDebugging(\n      `[modelCapabilities] fetch failed: ${error instanceof Error ? error.message : 'unknown'}`,\n    )\n  }\n}\n", "// biome-ignore-all assist/source/organizeImports: ANT-ONLY import markers must not be reordered\r\nimport { CONTEXT_1M_BETA_HEADER } from '../constants/betas.js'\r\nimport { getGlobalConfig } from './config.js'\r\nimport { isEnvTruthy } from './envUtils.js'\r\nimport { getProviderCatalogContextWindow } from './model/contextWindows.js'\r\nimport { getCanonicalName } from './model/model.js'\r\nimport { getModelCapability } from './model/modelCapabilities.js'\r\nimport { getAPIProvider } from './model/providers.js'\r\n\r\n// Conservative fallback when no provider or model metadata is available.\r\nexport const MODEL_CONTEXT_WINDOW_DEFAULT = 200_000\r\n\r\n// Maximum output tokens for compact operations\r\nexport const COMPACT_MAX_OUTPUT_TOKENS = 20_000\r\n\r\n// Default max output tokens\r\nconst MAX_OUTPUT_TOKENS_DEFAULT = 32_000\r\nconst MAX_OUTPUT_TOKENS_UPPER_LIMIT = 64_000\r\n\r\n// Capped default for slot-reservation optimization. BQ p99 output = 4,911\r\n// tokens, so 32k/64k defaults over-reserve 8-16\u00D7 slot capacity. With the cap\r\n// enabled, <1% of requests hit the limit; those get one clean retry at 64k\r\n// (see query.ts max_output_tokens_escalate). Cap is applied in\r\n// claude.ts:getMaxOutputTokensForModel to avoid the growthbook\u2192betas\u2192context\r\n// import cycle.\r\nexport const CAPPED_DEFAULT_MAX_TOKENS = 8_000\r\nexport const ESCALATED_MAX_TOKENS = 64_000\r\n\r\n/**\r\n * Check if 1M context is disabled via environment variable.\r\n * Used by C4E admins to disable 1M context for HIPAA compliance.\r\n */\r\nexport function is1mContextDisabled(): boolean {\r\n  return isEnvTruthy(process.env.CLAUDE_CODE_DISABLE_1M_CONTEXT)\r\n}\r\n\r\nexport function has1mContext(model: string): boolean {\r\n  if (is1mContextDisabled()) {\r\n    return false\r\n  }\r\n  return /\\[1m\\]/i.test(model)\r\n}\r\n\r\n// @[MODEL LAUNCH]: Update this pattern if the new model supports 1M context\r\nexport function modelSupports1M(model: string): boolean {\r\n  if (is1mContextDisabled()) {\r\n    return false\r\n  }\r\n  const canonical = getCanonicalName(model)\r\n  return (\r\n    canonical.includes('claude-sonnet-4') ||\r\n    canonical.includes('opus-4-8') ||\r\n    canonical.includes('opus-4-7') ||\r\n    canonical.includes('opus-4-6')\r\n  )\r\n}\r\n\r\nexport function getContextWindowForModel(\r\n  model: string,\r\n  betas?: string[],\r\n): number {\r\n  // Allow override via environment variable (ant-only)\r\n  // This takes precedence over all other context window resolution, including 1M detection,\r\n  // so users can cap the effective context window for local decisions (auto-compact, etc.)\r\n  // while still using a 1M-capable endpoint.\r\n  if (\r\n    process.env.USER_TYPE === 'ant' &&\r\n    process.env.CLAUDE_CODE_MAX_CONTEXT_TOKENS\r\n  ) {\r\n    const override = parseInt(process.env.CLAUDE_CODE_MAX_CONTEXT_TOKENS, 10)\r\n    if (!isNaN(override) && override > 0) {\r\n      return override\r\n    }\r\n  }\r\n\r\n  // [1m] suffix \u2014 explicit client-side opt-in, respected over all detection\r\n  if (has1mContext(model)) {\r\n    return 1_000_000\r\n  }\r\n\r\n  const cap = getModelCapability(model)\r\n  if (cap?.max_input_tokens && cap.max_input_tokens >= 100_000) {\r\n    if (\r\n      cap.max_input_tokens > MODEL_CONTEXT_WINDOW_DEFAULT &&\r\n      is1mContextDisabled()\r\n    ) {\r\n      return MODEL_CONTEXT_WINDOW_DEFAULT\r\n    }\r\n    return cap.max_input_tokens\r\n  }\r\n\r\n  if (betas?.includes(CONTEXT_1M_BETA_HEADER) && modelSupports1M(model)) {\r\n    return 1_000_000\r\n  }\r\n  if (getSonnet1mExpTreatmentEnabled(model)) {\r\n    return 1_000_000\r\n  }\r\n  if (process.env.USER_TYPE === 'ant') {\r\n    const antModel = resolveAntModel(model)\r\n    if (antModel?.contextWindow) {\r\n      return antModel.contextWindow\r\n    }\r\n  }\r\n\r\n  const provider = getAPIProvider()\r\n  const providerWindow = getProviderCatalogContextWindow(model, provider)\r\n  if (providerWindow) {\r\n    if (\r\n      provider === 'firstParty' &&\r\n      providerWindow > MODEL_CONTEXT_WINDOW_DEFAULT &&\r\n      is1mContextDisabled()\r\n    ) {\r\n      return MODEL_CONTEXT_WINDOW_DEFAULT\r\n    }\r\n    return providerWindow\r\n  }\r\n\r\n  return MODEL_CONTEXT_WINDOW_DEFAULT\r\n}\r\n\r\nexport function getSonnet1mExpTreatmentEnabled(model: string): boolean {\r\n  if (is1mContextDisabled()) {\r\n    return false\r\n  }\r\n  // Only applies to sonnet 4.6 without an explicit [1m] suffix\r\n  if (has1mContext(model)) {\r\n    return false\r\n  }\r\n  if (!getCanonicalName(model).includes('sonnet-4-6')) {\r\n    return false\r\n  }\r\n  return getGlobalConfig().clientDataCache?.['coral_reef_sonnet'] === 'true'\r\n}\r\n\r\n/**\r\n * Calculate context window usage percentage from token usage data.\r\n * Returns used and remaining percentages, or null values if no usage data.\r\n */\r\nexport function calculateContextPercentages(\r\n  currentUsage: {\r\n    input_tokens: number\r\n    cache_creation_input_tokens: number\r\n    cache_read_input_tokens: number\r\n  } | null,\r\n  contextWindowSize: number,\r\n): { used: number | null; remaining: number | null } {\r\n  if (!currentUsage) {\r\n    return { used: null, remaining: null }\r\n  }\r\n\r\n  const totalInputTokens =\r\n    currentUsage.input_tokens +\r\n    currentUsage.cache_creation_input_tokens +\r\n    currentUsage.cache_read_input_tokens\r\n\r\n  const usedPercentage = Math.round(\r\n    (totalInputTokens / contextWindowSize) * 100,\r\n  )\r\n  const clampedUsed = Math.min(100, Math.max(0, usedPercentage))\r\n\r\n  return {\r\n    used: clampedUsed,\r\n    remaining: 100 - clampedUsed,\r\n  }\r\n}\r\n\r\n/**\r\n * Returns the model's default and upper limit for max output tokens.\r\n */\r\nexport function getModelMaxOutputTokens(model: string): {\r\n  default: number\r\n  upperLimit: number\r\n} {\r\n  let defaultTokens: number\r\n  let upperLimit: number\r\n\r\n  if (process.env.USER_TYPE === 'ant') {\r\n    const antModel = resolveAntModel(model.toLowerCase())\r\n    if (antModel) {\r\n      defaultTokens = antModel.defaultMaxTokens ?? MAX_OUTPUT_TOKENS_DEFAULT\r\n      upperLimit = antModel.upperMaxTokensLimit ?? MAX_OUTPUT_TOKENS_UPPER_LIMIT\r\n      return { default: defaultTokens, upperLimit }\r\n    }\r\n  }\r\n\r\n  const m = getCanonicalName(model)\r\n\r\n  if (m.includes('opus-4-8') || m.includes('opus-4-7') || m.includes('opus-4-6')) {\r\n    defaultTokens = 64_000\r\n    upperLimit = 128_000\r\n  } else if (m.includes('sonnet-4-6')) {\r\n    defaultTokens = 32_000\r\n    upperLimit = 128_000\r\n  } else if (\r\n    m.includes('opus-4-5') ||\r\n    m.includes('sonnet-4') ||\r\n    m.includes('haiku-4')\r\n  ) {\r\n    defaultTokens = 32_000\r\n    upperLimit = 64_000\r\n  } else if (m.includes('opus-4-1') || m.includes('opus-4')) {\r\n    defaultTokens = 32_000\r\n    upperLimit = 32_000\r\n  } else if (m.includes('claude-3-opus')) {\r\n    defaultTokens = 4_096\r\n    upperLimit = 4_096\r\n  } else if (m.includes('claude-3-sonnet')) {\r\n    defaultTokens = 8_192\r\n    upperLimit = 8_192\r\n  } else if (m.includes('claude-3-haiku')) {\r\n    defaultTokens = 4_096\r\n    upperLimit = 4_096\r\n  } else if (m.includes('3-5-sonnet') || m.includes('3-5-haiku')) {\r\n    defaultTokens = 8_192\r\n    upperLimit = 8_192\r\n  } else if (m.includes('3-7-sonnet')) {\r\n    defaultTokens = 32_000\r\n    upperLimit = 64_000\r\n  } else {\r\n    defaultTokens = MAX_OUTPUT_TOKENS_DEFAULT\r\n    upperLimit = MAX_OUTPUT_TOKENS_UPPER_LIMIT\r\n  }\r\n\r\n  const cap = getModelCapability(model)\r\n  if (cap?.max_tokens && cap.max_tokens >= 4_096) {\r\n    upperLimit = cap.max_tokens\r\n    defaultTokens = Math.min(defaultTokens, upperLimit)\r\n  }\r\n\r\n  return { default: defaultTokens, upperLimit }\r\n}\r\n\r\n/**\r\n * Returns the max thinking budget tokens for a given model. The max\r\n * thinking tokens should be strictly less than the max output tokens.\r\n *\r\n * Deprecated since newer models use adaptive thinking rather than a\r\n * strict thinking token budget.\r\n */\r\nexport function getMaxThinkingTokensForModel(model: string): number {\r\n  return getModelMaxOutputTokens(model).upperLimit - 1\r\n}\r\n", "import axios from 'axios'\nimport { getOauthConfig, OAUTH_BETA_HEADER } from 'src/constants/oauth.js'\nimport { getFeatureValue_CACHED_MAY_BE_STALE } from 'src/services/analytics/growthbook.js'\nimport {\n  getIsNonInteractiveSession,\n  getKairosActive,\n  preferThirdPartyAuthentication,\n} from '../bootstrap/state.js'\nimport {\n  type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,\n  logEvent,\n} from '../services/analytics/index.js'\nimport {\n  getAnthropicApiKey,\n  getClaudeAIOAuthTokens,\n  handleOAuth401Error,\n  hasProfileScope,\n} from './auth.js'\nimport { isInBundledMode } from './bundledMode.js'\nimport { getGlobalConfig, saveGlobalConfig } from './config.js'\nimport { logForDebugging } from './debug.js'\nimport { isEnvTruthy } from './envUtils.js'\nimport {\n  getDefaultMainLoopModelSetting,\n  isOpus1mMergeEnabled,\n  type ModelSetting,\n  parseUserSpecifiedModel,\n} from './model/model.js'\nimport { getAPIProvider } from './model/providers.js'\nimport { isEssentialTrafficOnly } from './privacyLevel.js'\nimport {\n  getInitialSettings,\n  getSettingsForSource,\n  updateSettingsForSource,\n} from './settings/settings.js'\nimport { createSignal } from './signal.js'\n\nexport function isFastModeEnabled(): boolean {\n  return !isEnvTruthy(process.env.CLAUDE_CODE_DISABLE_FAST_MODE)\n}\n\nexport function isFastModeAvailable(): boolean {\n  if (!isFastModeEnabled()) {\n    return false\n  }\n  return getFastModeUnavailableReason() === null\n}\n\ntype AuthType = 'oauth' | 'api-key'\n\nfunction getDisabledReasonMessage(\n  disabledReason: FastModeDisabledReason,\n  authType: AuthType,\n): string {\n  switch (disabledReason) {\n    case 'free':\n      return authType === 'oauth'\n        ? 'Fast mode requires a paid subscription'\n        : 'Fast mode unavailable during evaluation. Please purchase credits.'\n    case 'preference':\n      return 'Fast mode has been disabled by your organization'\n    case 'extra_usage_disabled':\n      // Only OAuth users can have extra_usage_disabled; console users don't have this concept\n      return 'Fast mode requires extra usage billing \u00B7 /extra-usage to enable'\n    case 'network_error':\n      return 'Fast mode unavailable due to network connectivity issues'\n    case 'unknown':\n      return 'Fast mode is currently unavailable'\n  }\n}\n\nexport function getFastModeUnavailableReason(): string | null {\n  if (!isFastModeEnabled()) {\n    return 'Fast mode is not available'\n  }\n\n  const statigReason = getFeatureValue_CACHED_MAY_BE_STALE(\n    'tengu_penguins_off',\n    null,\n  )\n  // Statsig reason has priority over other reasons.\n  if (statigReason !== null) {\n    logForDebugging(`Fast mode unavailable: ${statigReason}`)\n    return statigReason\n  }\n\n  // Previously, fast mode required the native binary (bun build). This is no\n  // longer necessary, but we keep this option behind a flag just in case.\n  if (\n    !isInBundledMode() &&\n    getFeatureValue_CACHED_MAY_BE_STALE('tengu_marble_sandcastle', false)\n  ) {\n    return 'Fast mode requires the native binary \u00B7 Install from: https://claude.com/product/claude-code'\n  }\n\n  // Not available in the SDK unless explicitly opted in via --settings.\n  // Assistant daemon mode is exempt \u2014 it's first-party orchestration, and\n  // kairosActive is set before this check runs (main.tsx:~1626 vs ~3249).\n  if (\n    getIsNonInteractiveSession() &&\n    preferThirdPartyAuthentication() &&\n    !getKairosActive()\n  ) {\n    const flagFastMode = getSettingsForSource('flagSettings')?.fastMode\n    if (!flagFastMode) {\n      const reason = 'Fast mode is not available in the Agent SDK'\n      logForDebugging(`Fast mode unavailable: ${reason}`)\n      return reason\n    }\n  }\n\n  // Only available for 1P (not Bedrock/Vertex/Foundry)\n  if (getAPIProvider() !== 'firstParty') {\n    const reason = 'Fast mode is not available on Bedrock, Vertex, or Foundry'\n    logForDebugging(`Fast mode unavailable: ${reason}`)\n    return reason\n  }\n\n  if (orgStatus.status === 'disabled') {\n    if (\n      orgStatus.reason === 'network_error' ||\n      orgStatus.reason === 'unknown'\n    ) {\n      // The org check can fail behind corporate proxies that block the\n      // endpoint. We add CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS=1 to\n      // bypass this check in the CC binary. This is OK since we have\n      // another check in the API to error out when disabled by org.\n      if (isEnvTruthy(process.env.CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS)) {\n        return null\n      }\n    }\n    const authType: AuthType =\n      getClaudeAIOAuthTokens() !== null ? 'oauth' : 'api-key'\n    const reason = getDisabledReasonMessage(orgStatus.reason, authType)\n    logForDebugging(`Fast mode unavailable: ${reason}`)\n    return reason\n  }\n\n  return null\n}\n\n// @[MODEL LAUNCH]: Update supported Fast Mode models.\nexport const FAST_MODE_MODEL_DISPLAY = 'Opus 4.8'\n\nexport function getFastModeModel(): string {\n  return 'opus' + (isOpus1mMergeEnabled() ? '[1m]' : '')\n}\n\nexport function getInitialFastModeSetting(model: ModelSetting): boolean {\n  if (!isFastModeEnabled()) {\n    return false\n  }\n  if (!isFastModeAvailable()) {\n    return false\n  }\n  if (!isFastModeSupportedByModel(model)) {\n    return false\n  }\n  const settings = getInitialSettings()\n  // If per-session opt-in is required, fast mode starts off each session\n  if (settings.fastModePerSessionOptIn) {\n    return false\n  }\n  return settings.fastMode === true\n}\n\nexport function isFastModeSupportedByModel(\n  modelSetting: ModelSetting,\n): boolean {\n  if (!isFastModeEnabled()) {\n    return false\n  }\n  const model = modelSetting ?? getDefaultMainLoopModelSetting()\n  const parsedModel = parseUserSpecifiedModel(model)\n  const normalized = parsedModel.toLowerCase()\n  return (\n    normalized.includes('opus-4-8') ||\n    normalized.includes('opus-4-7') ||\n    normalized.includes('opus-4-6')\n  )\n}\n\n// --- Fast mode runtime state ---\n// Separate from user preference (settings.fastMode). This tracks the actual\n// operational state: whether we're actively sending fast speed or in cooldown\n// after a rate limit.\n\nexport type FastModeRuntimeState =\n  | { status: 'active' }\n  | { status: 'cooldown'; resetAt: number; reason: CooldownReason }\n\nlet runtimeState: FastModeRuntimeState = { status: 'active' }\nlet hasLoggedCooldownExpiry = false\n\n// --- Cooldown event listeners ---\nexport type CooldownReason = 'rate_limit' | 'overloaded'\n\nconst cooldownTriggered =\n  createSignal<[resetAt: number, reason: CooldownReason]>()\nconst cooldownExpired = createSignal()\nexport const onCooldownTriggered = cooldownTriggered.subscribe\nexport const onCooldownExpired = cooldownExpired.subscribe\n\nexport function getFastModeRuntimeState(): FastModeRuntimeState {\n  if (\n    runtimeState.status === 'cooldown' &&\n    Date.now() >= runtimeState.resetAt\n  ) {\n    if (isFastModeEnabled() && !hasLoggedCooldownExpiry) {\n      logForDebugging('Fast mode cooldown expired, re-enabling fast mode')\n      hasLoggedCooldownExpiry = true\n      cooldownExpired.emit()\n    }\n    runtimeState = { status: 'active' }\n  }\n  return runtimeState\n}\n\nexport function triggerFastModeCooldown(\n  resetTimestamp: number,\n  reason: CooldownReason,\n): void {\n  if (!isFastModeEnabled()) {\n    return\n  }\n  runtimeState = { status: 'cooldown', resetAt: resetTimestamp, reason }\n  hasLoggedCooldownExpiry = false\n  const cooldownDurationMs = resetTimestamp - Date.now()\n  logForDebugging(\n    `Fast mode cooldown triggered (${reason}), duration ${Math.round(cooldownDurationMs / 1000)}s`,\n  )\n  logEvent('tengu_fast_mode_fallback_triggered', {\n    cooldown_duration_ms: cooldownDurationMs,\n    cooldown_reason:\n      reason as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,\n  })\n  cooldownTriggered.emit(resetTimestamp, reason)\n}\n\nexport function clearFastModeCooldown(): void {\n  runtimeState = { status: 'active' }\n}\n\n/**\n * Called when the API rejects a fast mode request (e.g., 400 \"Fast mode is\n * not enabled for your organization\"). Permanently disables fast mode using\n * the same flow as when the prefetch discovers the org has it disabled.\n */\nexport function handleFastModeRejectedByAPI(): void {\n  if (orgStatus.status === 'disabled') {\n    return\n  }\n  orgStatus = { status: 'disabled', reason: 'preference' }\n  updateSettingsForSource('userSettings', { fastMode: undefined })\n  saveGlobalConfig(current => ({\n    ...current,\n    penguinModeOrgEnabled: false,\n  }))\n  orgFastModeChange.emit(false)\n}\n\n// --- Overage rejection listeners ---\n// Fired when a 429 indicates fast mode was rejected because extra usage\n// (overage billing) is not available. Distinct from org-level disabling.\nconst overageRejection = createSignal<[message: string]>()\nexport const onFastModeOverageRejection = overageRejection.subscribe\n\nfunction getOverageDisabledMessage(reason: string | null): string {\n  switch (reason) {\n    case 'out_of_credits':\n      return 'Fast mode disabled \u00B7 extra usage credits exhausted'\n    case 'org_level_disabled':\n    case 'org_service_level_disabled':\n      return 'Fast mode disabled \u00B7 extra usage disabled by your organization'\n    case 'org_level_disabled_until':\n      return 'Fast mode disabled \u00B7 extra usage spending cap reached'\n    case 'member_level_disabled':\n      return 'Fast mode disabled \u00B7 extra usage disabled for your account'\n    case 'seat_tier_level_disabled':\n    case 'seat_tier_zero_credit_limit':\n    case 'member_zero_credit_limit':\n      return 'Fast mode disabled \u00B7 extra usage not available for your plan'\n    case 'overage_not_provisioned':\n    case 'no_limits_configured':\n      return 'Fast mode requires extra usage billing \u00B7 /extra-usage to enable'\n    default:\n      return 'Fast mode disabled \u00B7 extra usage not available'\n  }\n}\n\nfunction isOutOfCreditsReason(reason: string | null): boolean {\n  return reason === 'org_level_disabled_until' || reason === 'out_of_credits'\n}\n\n/**\n * Called when a 429 indicates fast mode was rejected because extra usage\n * is not available. Permanently disables fast mode (unless the user has\n * ran out of credits) and notifies with a reason-specific message.\n */\nexport function handleFastModeOverageRejection(reason: string | null): void {\n  const message = getOverageDisabledMessage(reason)\n  logForDebugging(\n    `Fast mode overage rejection: ${reason ?? 'unknown'} \u2014 ${message}`,\n  )\n  logEvent('tengu_fast_mode_overage_rejected', {\n    overage_disabled_reason: (reason ??\n      'unknown') as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,\n  })\n  // Disable fast mode permanently unless the user has ran out of credits\n  if (!isOutOfCreditsReason(reason)) {\n    updateSettingsForSource('userSettings', { fastMode: undefined })\n    saveGlobalConfig(current => ({\n      ...current,\n      penguinModeOrgEnabled: false,\n    }))\n  }\n  overageRejection.emit(message)\n}\n\nexport function isFastModeCooldown(): boolean {\n  return getFastModeRuntimeState().status === 'cooldown'\n}\n\nexport function getFastModeState(\n  model: ModelSetting,\n  fastModeUserEnabled: boolean | undefined,\n): 'off' | 'cooldown' | 'on' {\n  const enabled =\n    isFastModeEnabled() &&\n    isFastModeAvailable() &&\n    !!fastModeUserEnabled &&\n    isFastModeSupportedByModel(model)\n  if (enabled && isFastModeCooldown()) {\n    return 'cooldown'\n  }\n  if (enabled) {\n    return 'on'\n  }\n  return 'off'\n}\n\n// Disabled reason returned by the API. The API is the canonical source for why\n// fast mode is disabled (free account, admin preference, extra usage not enabled).\nexport type FastModeDisabledReason =\n  | 'free'\n  | 'preference'\n  | 'extra_usage_disabled'\n  | 'network_error'\n  | 'unknown'\n\n// In-memory cache of the fast mode status from the API.\n// Distinct from the user's fastMode app state \u2014 this represents\n// whether the org *allows* fast mode and why it may be disabled.\n// Modeled as a discriminated union so the invalid state\n// (disabled without a reason) is unrepresentable.\ntype FastModeOrgStatus =\n  | { status: 'pending' }\n  | { status: 'enabled' }\n  | { status: 'disabled'; reason: FastModeDisabledReason }\n\nlet orgStatus: FastModeOrgStatus = { status: 'pending' }\n\n// Listeners notified when org-level fast mode status changes\nconst orgFastModeChange = createSignal<[orgEnabled: boolean]>()\nexport const onOrgFastModeChanged = orgFastModeChange.subscribe\n\ntype FastModeResponse = {\n  enabled: boolean\n  disabled_reason: FastModeDisabledReason | null\n}\n\nasync function fetchFastModeStatus(\n  auth: { accessToken: string } | { apiKey: string },\n): Promise<FastModeResponse> {\n  const endpoint = `${getOauthConfig().BASE_API_URL}/api/claude_code_penguin_mode`\n  const headers: Record<string, string> =\n    'accessToken' in auth\n      ? {\n          Authorization: `Bearer ${auth.accessToken}`,\n          'anthropic-beta': OAUTH_BETA_HEADER,\n        }\n      : { 'x-api-key': auth.apiKey }\n\n  const response = await axios.get<FastModeResponse>(endpoint, { headers })\n  return response.data\n}\n\nconst PREFETCH_MIN_INTERVAL_MS = 30_000\nlet lastPrefetchAt = 0\nlet inflightPrefetch: Promise<void> | null = null\n\n/**\n * Resolve orgStatus from the persisted cache without making any API calls.\n * Used when startup prefetches are throttled to avoid hitting the network\n * while still making fast mode availability checks work.\n */\nexport function resolveFastModeStatusFromCache(): void {\n  if (!isFastModeEnabled()) {\n    return\n  }\n  if (orgStatus.status !== 'pending') {\n    return\n  }\n  const isAnt = process.env.USER_TYPE === 'ant'\n  const cachedEnabled = getGlobalConfig().penguinModeOrgEnabled === true\n  orgStatus =\n    isAnt || cachedEnabled\n      ? { status: 'enabled' }\n      : { status: 'disabled', reason: 'unknown' }\n}\n\nexport async function prefetchFastModeStatus(): Promise<void> {\n  // Skip network requests if nonessential traffic is disabled\n  if (isEssentialTrafficOnly()) {\n    return\n  }\n\n  if (!isFastModeEnabled()) {\n    return\n  }\n\n  if (inflightPrefetch) {\n    logForDebugging(\n      'Fast mode prefetch in progress, returning in-flight promise',\n    )\n    return inflightPrefetch\n  }\n\n  // Service key OAuth sessions lack user:profile scope \u2192 endpoint 403s.\n  // Resolve orgStatus from cache and bail before burning the throttle window.\n  // API key auth is unaffected.\n  const apiKey = getAnthropicApiKey()\n  const hasUsableOAuth =\n    getClaudeAIOAuthTokens()?.accessToken && hasProfileScope()\n  if (!hasUsableOAuth && !apiKey) {\n    const isAnt = process.env.USER_TYPE === 'ant'\n    const cachedEnabled = getGlobalConfig().penguinModeOrgEnabled === true\n    orgStatus =\n      isAnt || cachedEnabled\n        ? { status: 'enabled' }\n        : { status: 'disabled', reason: 'preference' }\n    return\n  }\n\n  const now = Date.now()\n  if (now - lastPrefetchAt < PREFETCH_MIN_INTERVAL_MS) {\n    logForDebugging('Skipping fast mode prefetch, fetched recently')\n    return\n  }\n  lastPrefetchAt = now\n\n  const fetchWithCurrentAuth = async (): Promise<FastModeResponse> => {\n    const currentTokens = getClaudeAIOAuthTokens()\n    const auth =\n      currentTokens?.accessToken && hasProfileScope()\n        ? { accessToken: currentTokens.accessToken }\n        : apiKey\n          ? { apiKey }\n          : null\n    if (!auth) {\n      throw new Error('No auth available')\n    }\n    return fetchFastModeStatus(auth)\n  }\n\n  async function doFetch(): Promise<void> {\n    try {\n      let status: FastModeResponse\n      try {\n        status = await fetchWithCurrentAuth()\n      } catch (err) {\n        const isAuthError =\n          axios.isAxiosError(err) &&\n          (err.response?.status === 401 ||\n            (err.response?.status === 403 &&\n              typeof err.response?.data === 'string' &&\n              err.response.data.includes('OAuth token has been revoked')))\n        if (isAuthError) {\n          const failedAccessToken = getClaudeAIOAuthTokens()?.accessToken\n          if (failedAccessToken) {\n            await handleOAuth401Error(failedAccessToken)\n            status = await fetchWithCurrentAuth()\n          } else {\n            throw err\n          }\n        } else {\n          throw err\n        }\n      }\n\n      const previousEnabled =\n        orgStatus.status !== 'pending'\n          ? orgStatus.status === 'enabled'\n          : getGlobalConfig().penguinModeOrgEnabled\n      orgStatus = status.enabled\n        ? { status: 'enabled' }\n        : {\n            status: 'disabled',\n            reason: status.disabled_reason ?? 'preference',\n          }\n      if (previousEnabled !== status.enabled) {\n        // When org disables fast mode, permanently turn off the user's fast mode setting\n        if (!status.enabled) {\n          updateSettingsForSource('userSettings', { fastMode: undefined })\n        }\n        saveGlobalConfig(current => ({\n          ...current,\n          penguinModeOrgEnabled: status.enabled,\n        }))\n        orgFastModeChange.emit(status.enabled)\n      }\n      logForDebugging(\n        `Org fast mode: ${status.enabled ? 'enabled' : `disabled (${status.disabled_reason ?? 'preference'})`}`,\n      )\n    } catch (err) {\n      // On failure: ants default to enabled (don't block internal users).\n      // External users: fall back to the cached penguinModeOrgEnabled value;\n      // if no positive cache, disable with network_error reason.\n      const isAnt = process.env.USER_TYPE === 'ant'\n      const cachedEnabled = getGlobalConfig().penguinModeOrgEnabled === true\n      orgStatus =\n        isAnt || cachedEnabled\n          ? { status: 'enabled' }\n          : { status: 'disabled', reason: 'network_error' }\n      logForDebugging(\n        `Failed to fetch org fast mode status, defaulting to ${orgStatus.status === 'enabled' ? 'enabled (cached)' : 'disabled (network_error)'}: ${err}`,\n        { level: 'error' },\n      )\n      logEvent('tengu_org_penguin_mode_fetch_failed', {})\n    } finally {\n      inflightPrefetch = null\n    }\n  }\n\n  inflightPrefetch = doFetch()\n  return inflightPrefetch\n}\n", "import type { BetaUsage as Usage } from '@anthropic-ai/sdk/resources/beta/messages/messages.mjs'\r\nimport type { AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS } from 'src/services/analytics/index.js'\r\nimport { logEvent } from 'src/services/analytics/index.js'\r\nimport { setHasUnknownModelCost } from '../bootstrap/state.js'\r\nimport { isFastModeEnabled } from './fastMode.js'\r\nimport {\r\n  CLAUDE_3_5_HAIKU_CONFIG,\r\n  CLAUDE_3_5_V2_SONNET_CONFIG,\r\n  CLAUDE_3_7_SONNET_CONFIG,\r\n  CLAUDE_HAIKU_4_5_CONFIG,\r\n  CLAUDE_OPUS_4_1_CONFIG,\r\n  CLAUDE_OPUS_4_5_CONFIG,\r\n  CLAUDE_OPUS_4_6_CONFIG,\r\n  CLAUDE_OPUS_4_7_CONFIG,\r\n  CLAUDE_OPUS_4_8_CONFIG,\r\n  CLAUDE_OPUS_4_CONFIG,\r\n  CLAUDE_SONNET_4_5_CONFIG,\r\n  CLAUDE_SONNET_4_6_CONFIG,\r\n  CLAUDE_SONNET_4_CONFIG,\r\n} from './model/configs.js'\r\nimport {\r\n  firstPartyNameToCanonical,\r\n  getCanonicalName,\r\n  getDefaultMainLoopModelSetting,\r\n  type ModelShortName,\r\n} from './model/model.js'\r\nimport { getAPIProvider } from './model/providers.js'\r\nimport { getProviderModelSet } from './model/configs.js'\r\n\r\n// @see https://platform.claude.com/docs/en/about-claude/pricing\r\nexport type ModelCosts = {\r\n  inputTokens: number\r\n  outputTokens: number\r\n  promptCacheWriteTokens: number\r\n  promptCacheReadTokens: number\r\n  webSearchRequests: number\r\n}\r\n\r\n// Standard pricing tier for Sonnet models: $3 input / $15 output per Mtok\r\nexport const COST_TIER_3_15 = {\r\n  inputTokens: 3,\r\n  outputTokens: 15,\r\n  promptCacheWriteTokens: 3.75,\r\n  promptCacheReadTokens: 0.3,\r\n  webSearchRequests: 0.01,\r\n} as const satisfies ModelCosts\r\n\r\n// Pricing tier for Opus 4/4.1: $15 input / $75 output per Mtok\r\nexport const COST_TIER_15_75 = {\r\n  inputTokens: 15,\r\n  outputTokens: 75,\r\n  promptCacheWriteTokens: 18.75,\r\n  promptCacheReadTokens: 1.5,\r\n  webSearchRequests: 0.01,\r\n} as const satisfies ModelCosts\r\n\r\n// Pricing tier for Opus 4.5: $5 input / $25 output per Mtok\r\nexport const COST_TIER_5_25 = {\r\n  inputTokens: 5,\r\n  outputTokens: 25,\r\n  promptCacheWriteTokens: 6.25,\r\n  promptCacheReadTokens: 0.5,\r\n  webSearchRequests: 0.01,\r\n} as const satisfies ModelCosts\r\n\r\n// Fast mode pricing for Opus 4.6: $30 input / $150 output per Mtok\r\nexport const COST_TIER_30_150 = {\r\n  inputTokens: 30,\r\n  outputTokens: 150,\r\n  promptCacheWriteTokens: 37.5,\r\n  promptCacheReadTokens: 3,\r\n  webSearchRequests: 0.01,\r\n} as const satisfies ModelCosts\r\n\r\n// Pricing for Haiku 3.5: $0.80 input / $4 output per Mtok\r\nexport const COST_HAIKU_35 = {\r\n  inputTokens: 0.8,\r\n  outputTokens: 4,\r\n  promptCacheWriteTokens: 1,\r\n  promptCacheReadTokens: 0.08,\r\n  webSearchRequests: 0.01,\r\n} as const satisfies ModelCosts\r\n\r\n// Pricing for Haiku 4.5: $1 input / $5 output per Mtok\r\nexport const COST_HAIKU_45 = {\r\n  inputTokens: 1,\r\n  outputTokens: 5,\r\n  promptCacheWriteTokens: 1.25,\r\n  promptCacheReadTokens: 0.1,\r\n  webSearchRequests: 0.01,\r\n} as const satisfies ModelCosts\r\n\r\nconst DEFAULT_UNKNOWN_MODEL_COST = COST_TIER_5_25\r\n\r\n// \u2500\u2500\u2500 Gemini cost tiers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n// Google Gemini pricing (per Mtok). Cache reads are 25% of input cost,\r\n// cache writes are the same as input cost. Web search not applicable.\r\n\r\n/** Gemini 2.5 Flash / 3.x Flash: cheapest tier. */\r\nconst COST_GEMINI_FLASH: ModelCosts = {\r\n  inputTokens: 0.15,\r\n  outputTokens: 0.6,\r\n  promptCacheWriteTokens: 0.15,\r\n  promptCacheReadTokens: 0.0375,\r\n  webSearchRequests: 0,\r\n}\r\n\r\n/** Gemini 2.5 Flash Lite / 3.x Flash Lite: ultra-cheap. */\r\nconst COST_GEMINI_FLASH_LITE: ModelCosts = {\r\n  inputTokens: 0.075,\r\n  outputTokens: 0.3,\r\n  promptCacheWriteTokens: 0.075,\r\n  promptCacheReadTokens: 0.01875,\r\n  webSearchRequests: 0,\r\n}\r\n\r\n/** Gemini 2.5 Pro / 3.x Pro: premium tier. */\r\nconst COST_GEMINI_PRO: ModelCosts = {\r\n  inputTokens: 1.25,\r\n  outputTokens: 10,\r\n  promptCacheWriteTokens: 1.25,\r\n  promptCacheReadTokens: 0.3125,\r\n  webSearchRequests: 0,\r\n}\r\n\r\n/** Free OAuth tier \u2014 cost is zero (quota-limited instead). */\r\nconst COST_GEMINI_FREE: ModelCosts = {\r\n  inputTokens: 0,\r\n  outputTokens: 0,\r\n  promptCacheWriteTokens: 0,\r\n  promptCacheReadTokens: 0,\r\n  webSearchRequests: 0,\r\n}\r\n\r\n/**\r\n * Resolve Gemini model cost by prefix matching. Handles two cases:\r\n *   1. Model is already a Gemini name (e.g. \"gemini-2.5-flash\")\r\n *   2. Model is a Claude name (e.g. \"claude-opus-4-6\") but the active\r\n *      provider is Gemini \u2014 resolve to the mapped Gemini model first\r\n *\r\n * Returns null if neither case applies.\r\n */\r\nfunction getGeminiModelCosts(model: string): ModelCosts | null {\r\n  let m = model.toLowerCase()\r\n\r\n  // If the model is a Claude name but we're using Gemini provider,\r\n  // resolve it to the actual Gemini model name for cost lookup.\r\n  if (!m.startsWith('gemini-')) {\r\n    try {\r\n      const provider = getAPIProvider()\r\n      if (provider !== 'gemini') return null\r\n      const models = getProviderModelSet('gemini')\r\n      if (m.includes('opus'))       m = models.opus.toLowerCase()\r\n      else if (m.includes('haiku')) m = models.haiku.toLowerCase()\r\n      else                          m = models.sonnet.toLowerCase()\r\n    } catch {\r\n      return null\r\n    }\r\n  }\r\n\r\n  if (!m.startsWith('gemini-')) return null\r\n\r\n  // Flash Lite variants (cheapest)\r\n  if (m.includes('flash-lite') || m.includes('flash_lite')) {\r\n    return COST_GEMINI_FLASH_LITE\r\n  }\r\n  // Flash variants\r\n  if (m.includes('flash')) {\r\n    return COST_GEMINI_FLASH\r\n  }\r\n  // Pro variants\r\n  if (m.includes('pro')) {\r\n    return COST_GEMINI_PRO\r\n  }\r\n  // Fallback for unrecognized Gemini models \u2192 flash pricing (conservative)\r\n  return COST_GEMINI_FLASH\r\n}\r\n\r\n/**\r\n * Get the cost tier for Opus 4.6 based on fast mode.\r\n */\r\nexport function getOpus46CostTier(fastMode: boolean): ModelCosts {\r\n  if (isFastModeEnabled() && fastMode) {\r\n    return COST_TIER_30_150\r\n  }\r\n  return COST_TIER_5_25\r\n}\r\n\r\n// @[MODEL LAUNCH]: Add a pricing entry for the new model below.\r\n// Costs from https://platform.claude.com/docs/en/about-claude/pricing\r\n// Web search cost: $10 per 1000 requests = $0.01 per request\r\nexport const MODEL_COSTS: Record<ModelShortName, ModelCosts> = {\r\n  [firstPartyNameToCanonical(CLAUDE_3_5_HAIKU_CONFIG.firstParty)]:\r\n    COST_HAIKU_35,\r\n  [firstPartyNameToCanonical(CLAUDE_HAIKU_4_5_CONFIG.firstParty)]:\r\n    COST_HAIKU_45,\r\n  [firstPartyNameToCanonical(CLAUDE_3_5_V2_SONNET_CONFIG.firstParty)]:\r\n    COST_TIER_3_15,\r\n  [firstPartyNameToCanonical(CLAUDE_3_7_SONNET_CONFIG.firstParty)]:\r\n    COST_TIER_3_15,\r\n  [firstPartyNameToCanonical(CLAUDE_SONNET_4_CONFIG.firstParty)]:\r\n    COST_TIER_3_15,\r\n  [firstPartyNameToCanonical(CLAUDE_SONNET_4_5_CONFIG.firstParty)]:\r\n    COST_TIER_3_15,\r\n  [firstPartyNameToCanonical(CLAUDE_SONNET_4_6_CONFIG.firstParty)]:\r\n    COST_TIER_3_15,\r\n  [firstPartyNameToCanonical(CLAUDE_OPUS_4_CONFIG.firstParty)]: COST_TIER_15_75,\r\n  [firstPartyNameToCanonical(CLAUDE_OPUS_4_1_CONFIG.firstParty)]:\r\n    COST_TIER_15_75,\r\n  [firstPartyNameToCanonical(CLAUDE_OPUS_4_5_CONFIG.firstParty)]:\r\n    COST_TIER_5_25,\r\n  [firstPartyNameToCanonical(CLAUDE_OPUS_4_6_CONFIG.firstParty)]:\r\n    COST_TIER_5_25,\r\n  [firstPartyNameToCanonical(CLAUDE_OPUS_4_7_CONFIG.firstParty)]:\r\n    COST_TIER_5_25,\r\n  [firstPartyNameToCanonical(CLAUDE_OPUS_4_8_CONFIG.firstParty)]:\r\n    COST_TIER_5_25,\r\n}\r\n\r\n/**\r\n * Calculates the USD cost based on token usage and model cost configuration\r\n */\r\nfunction tokensToUSDCost(modelCosts: ModelCosts, usage: Usage): number {\r\n  return (\r\n    (usage.input_tokens / 1_000_000) * modelCosts.inputTokens +\r\n    (usage.output_tokens / 1_000_000) * modelCosts.outputTokens +\r\n    ((usage.cache_read_input_tokens ?? 0) / 1_000_000) *\r\n      modelCosts.promptCacheReadTokens +\r\n    ((usage.cache_creation_input_tokens ?? 0) / 1_000_000) *\r\n      modelCosts.promptCacheWriteTokens +\r\n    (usage.server_tool_use?.web_search_requests ?? 0) *\r\n      modelCosts.webSearchRequests\r\n  )\r\n}\r\n\r\nexport function getModelCosts(model: string, usage: Usage): ModelCosts {\r\n  // Check Gemini models first \u2014 they use prefix matching, not canonical names.\r\n  const geminiCosts = getGeminiModelCosts(model)\r\n  if (geminiCosts) return geminiCosts\r\n\r\n  const shortName = getCanonicalName(model)\r\n\r\n  // Check if this is a current Opus model with fast mode active.\r\n  if (\r\n    shortName === firstPartyNameToCanonical(CLAUDE_OPUS_4_8_CONFIG.firstParty)\r\n    || shortName === firstPartyNameToCanonical(CLAUDE_OPUS_4_7_CONFIG.firstParty)\r\n    || shortName === firstPartyNameToCanonical(CLAUDE_OPUS_4_6_CONFIG.firstParty)\r\n  ) {\r\n    const isFastMode = usage.speed === 'fast'\r\n    return getOpus46CostTier(isFastMode)\r\n  }\r\n\r\n  const costs = MODEL_COSTS[shortName]\r\n  if (!costs) {\r\n    trackUnknownModelCost(model, shortName)\r\n    return (\r\n      MODEL_COSTS[getCanonicalName(getDefaultMainLoopModelSetting())] ??\r\n      DEFAULT_UNKNOWN_MODEL_COST\r\n    )\r\n  }\r\n  return costs\r\n}\r\n\r\nfunction trackUnknownModelCost(model: string, shortName: ModelShortName): void {\r\n  logEvent('tengu_unknown_model_cost', {\r\n    model: model as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,\r\n    shortName:\r\n      shortName as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,\r\n  })\r\n  setHasUnknownModelCost()\r\n}\r\n\r\n// Calculate the cost of a query in US dollars.\r\n// If the model's costs are not found, use the default model's costs.\r\nexport function calculateUSDCost(resolvedModel: string, usage: Usage): number {\r\n  const modelCosts = getModelCosts(resolvedModel, usage)\r\n  return tokensToUSDCost(modelCosts, usage)\r\n}\r\n\r\n/**\r\n * Calculate cost from raw token counts without requiring a full BetaUsage object.\r\n * Useful for side queries (e.g. classifier) that track token counts independently.\r\n */\r\nexport function calculateCostFromTokens(\r\n  model: string,\r\n  tokens: {\r\n    inputTokens: number\r\n    outputTokens: number\r\n    cacheReadInputTokens: number\r\n    cacheCreationInputTokens: number\r\n  },\r\n): number {\r\n  const usage: Usage = {\r\n    input_tokens: tokens.inputTokens,\r\n    output_tokens: tokens.outputTokens,\r\n    cache_read_input_tokens: tokens.cacheReadInputTokens,\r\n    cache_creation_input_tokens: tokens.cacheCreationInputTokens,\r\n  } as Usage\r\n  return calculateUSDCost(model, usage)\r\n}\r\n\r\nfunction formatPrice(price: number): string {\r\n  // Format price: integers without decimals, others with 2 decimal places\r\n  // e.g., 3 -> \"$3\", 0.8 -> \"$0.80\", 22.5 -> \"$22.50\"\r\n  if (Number.isInteger(price)) {\r\n    return `$${price}`\r\n  }\r\n  return `$${price.toFixed(2)}`\r\n}\r\n\r\n/**\r\n * Format model costs as a pricing string for display\r\n * e.g., \"$3/$15 per Mtok\"\r\n */\r\nexport function formatModelPricing(costs: ModelCosts): string {\r\n  return `${formatPrice(costs.inputTokens)}/${formatPrice(costs.outputTokens)} per Mtok`\r\n}\r\n\r\n/**\r\n * Get formatted pricing string for a model\r\n * Accepts either a short name or full model name\r\n * Returns undefined if model is not found\r\n */\r\nexport function getModelPricingString(model: string): string | undefined {\r\n  const shortName = getCanonicalName(model)\r\n  const costs = MODEL_COSTS[shortName]\r\n  if (!costs) return undefined\r\n  return formatModelPricing(costs)\r\n}\r\n", "export const MODEL_ALIASES = [\n  'sonnet',\n  'opus',\n  'haiku',\n  'best',\n  'sonnet[1m]',\n  'opus[1m]',\n  'opusplan',\n] as const\nexport type ModelAlias = (typeof MODEL_ALIASES)[number]\n\nexport function isModelAlias(modelInput: string): modelInput is ModelAlias {\n  return MODEL_ALIASES.includes(modelInput as ModelAlias)\n}\n\n/**\n * Bare model family aliases that act as wildcards in the availableModels allowlist.\n * When \"opus\" is in the allowlist, ANY opus model is allowed (opus 4.5, 4.6, etc.).\n * When a specific model ID is in the allowlist, only that exact version is allowed.\n */\nexport const MODEL_FAMILY_ALIASES = ['sonnet', 'opus', 'haiku'] as const\n\nexport function isModelFamilyAlias(model: string): boolean {\n  return (MODEL_FAMILY_ALIASES as readonly string[]).includes(model)\n}\n", "import { getSettings_DEPRECATED } from '../settings/settings.js'\nimport { isModelAlias, isModelFamilyAlias } from './aliases.js'\nimport { parseUserSpecifiedModel } from './model.js'\nimport { resolveOverriddenModel } from './modelStrings.js'\n\n/**\n * Check if a model belongs to a given family by checking if its name\n * (or resolved name) contains the family identifier.\n */\nfunction modelBelongsToFamily(model: string, family: string): boolean {\n  if (model.includes(family)) {\n    return true\n  }\n  // Resolve aliases like \"best\" \u2192 \"claude-opus-4-6\" to check family membership\n  if (isModelAlias(model)) {\n    const resolved = parseUserSpecifiedModel(model).toLowerCase()\n    return resolved.includes(family)\n  }\n  return false\n}\n\n/**\n * Check if a model name starts with a prefix at a segment boundary.\n * The prefix must match up to the end of the name or a \"-\" separator.\n * e.g. \"claude-opus-4-5\" matches \"claude-opus-4-5-20251101\" but not \"claude-opus-4-50\".\n */\nfunction prefixMatchesModel(modelName: string, prefix: string): boolean {\n  if (!modelName.startsWith(prefix)) {\n    return false\n  }\n  return modelName.length === prefix.length || modelName[prefix.length] === '-'\n}\n\n/**\n * Check if a model matches a version-prefix entry in the allowlist.\n * Supports shorthand like \"opus-4-5\" (mapped to \"claude-opus-4-5\") and\n * full prefixes like \"claude-opus-4-5\". Resolves input aliases before matching.\n */\nfunction modelMatchesVersionPrefix(model: string, entry: string): boolean {\n  // Resolve the input model to a full name if it's an alias\n  const resolvedModel = isModelAlias(model)\n    ? parseUserSpecifiedModel(model).toLowerCase()\n    : model\n\n  // Try the entry as-is (e.g. \"claude-opus-4-5\")\n  if (prefixMatchesModel(resolvedModel, entry)) {\n    return true\n  }\n  // Try with \"claude-\" prefix (e.g. \"opus-4-5\" \u2192 \"claude-opus-4-5\")\n  if (\n    !entry.startsWith('claude-') &&\n    prefixMatchesModel(resolvedModel, `claude-${entry}`)\n  ) {\n    return true\n  }\n  return false\n}\n\n/**\n * Check if a family alias is narrowed by more specific entries in the allowlist.\n * When the allowlist contains both \"opus\" and \"opus-4-5\", the specific entry\n * takes precedence \u2014 \"opus\" alone would be a wildcard, but \"opus-4-5\" narrows\n * it to only that version.\n */\nfunction familyHasSpecificEntries(\n  family: string,\n  allowlist: string[],\n): boolean {\n  for (const entry of allowlist) {\n    if (isModelFamilyAlias(entry)) {\n      continue\n    }\n    // Check if entry is a version-qualified variant of this family\n    // e.g., \"opus-4-5\" or \"claude-opus-4-5-20251101\" for the \"opus\" family\n    // Must match at a segment boundary (followed by '-' or end) to avoid\n    // false positives like \"opusplan\" matching \"opus\"\n    const idx = entry.indexOf(family)\n    if (idx === -1) {\n      continue\n    }\n    const afterFamily = idx + family.length\n    if (afterFamily === entry.length || entry[afterFamily] === '-') {\n      return true\n    }\n  }\n  return false\n}\n\n/**\n * Check if a model is allowed by the availableModels allowlist in settings.\n * If availableModels is not set, all models are allowed.\n *\n * Matching tiers:\n * 1. Family aliases (\"opus\", \"sonnet\", \"haiku\") \u2014 wildcard for the entire family,\n *    UNLESS more specific entries for that family also exist (e.g., \"opus-4-5\").\n *    In that case, the family wildcard is ignored and only the specific entries apply.\n * 2. Version prefixes (\"opus-4-5\", \"claude-opus-4-5\") \u2014 any build of that version\n * 3. Full model IDs (\"claude-opus-4-5-20251101\") \u2014 exact match only\n */\nexport function isModelAllowed(model: string): boolean {\n  const settings = getSettings_DEPRECATED() || {}\n  const { availableModels } = settings\n  if (!availableModels) {\n    return true // No restrictions\n  }\n  if (availableModels.length === 0) {\n    return false // Empty allowlist blocks all user-specified models\n  }\n\n  const resolvedModel = resolveOverriddenModel(model)\n  const normalizedModel = resolvedModel.trim().toLowerCase()\n  const normalizedAllowlist = availableModels.map(m => m.trim().toLowerCase())\n\n  // Direct match (alias-to-alias or full-name-to-full-name)\n  // Skip family aliases that have been narrowed by specific entries \u2014\n  // e.g., \"opus\" in [\"opus\", \"opus-4-5\"] should NOT directly match,\n  // because the admin intends to restrict to opus 4.5 only.\n  if (normalizedAllowlist.includes(normalizedModel)) {\n    if (\n      !isModelFamilyAlias(normalizedModel) ||\n      !familyHasSpecificEntries(normalizedModel, normalizedAllowlist)\n    ) {\n      return true\n    }\n  }\n\n  // Family-level aliases in the allowlist match any model in that family,\n  // but only if no more specific entries exist for that family.\n  // e.g., [\"opus\"] allows all opus, but [\"opus\", \"opus-4-5\"] only allows opus 4.5.\n  for (const entry of normalizedAllowlist) {\n    if (\n      isModelFamilyAlias(entry) &&\n      !familyHasSpecificEntries(entry, normalizedAllowlist) &&\n      modelBelongsToFamily(normalizedModel, entry)\n    ) {\n      return true\n    }\n  }\n\n  // For non-family entries, do bidirectional alias resolution\n  // If model is an alias, resolve it and check if the resolved name is in the list\n  if (isModelAlias(normalizedModel)) {\n    const resolved = parseUserSpecifiedModel(normalizedModel).toLowerCase()\n    if (normalizedAllowlist.includes(resolved)) {\n      return true\n    }\n  }\n\n  // If any non-family alias in the allowlist resolves to the input model\n  for (const entry of normalizedAllowlist) {\n    if (!isModelFamilyAlias(entry) && isModelAlias(entry)) {\n      const resolved = parseUserSpecifiedModel(entry).toLowerCase()\n      if (resolved === normalizedModel) {\n        return true\n      }\n    }\n  }\n\n  // Version-prefix matching: \"opus-4-5\" or \"claude-opus-4-5\" matches\n  // \"claude-opus-4-5-20251101\" at a segment boundary\n  for (const entry of normalizedAllowlist) {\n    if (!isModelFamilyAlias(entry) && !isModelAlias(entry)) {\n      if (modelMatchesVersionPrefix(normalizedModel, entry)) {\n        return true\n      }\n    }\n  }\n\n  return false\n}\n", "// biome-ignore-all assist/source/organizeImports: ANT-ONLY import markers must not be reordered\r\n/**\r\n * Ensure that any model codenames introduced here are also added to\r\n * scripts/excluded-strings.txt to avoid leaking them. Wrap any codename string\r\n * literals with process.env.USER_TYPE === 'ant' for Bun to remove the codenames\r\n * during dead code elimination\r\n */\r\nimport { getMainLoopModelOverride } from '../../bootstrap/state.js'\r\nimport {\r\n  getSubscriptionType,\r\n  isClaudeAISubscriber,\r\n  isMaxSubscriber,\r\n  isProSubscriber,\r\n  isTeamPremiumSubscriber,\r\n} from '../auth.js'\r\nimport {\r\n  has1mContext,\r\n  is1mContextDisabled,\r\n  modelSupports1M,\r\n} from '../context.js'\r\nimport { isEnvTruthy } from '../envUtils.js'\r\nimport { getModelStrings, resolveOverriddenModel } from './modelStrings.js'\r\nimport { formatModelPricing, getOpus46CostTier } from '../modelCost.js'\r\nimport { getSettings_DEPRECATED } from '../settings/settings.js'\r\nimport type { PermissionMode } from '../permissions/PermissionMode.js'\r\nimport { getAPIProvider, isThirdPartyProvider } from './providers.js'\r\nimport { getForcedProvider } from '../forcedProvider.js'\r\nimport { getProviderModelSet, isAgentRouterModelId } from './configs.js'\r\nimport { LIGHTNING_BOLT } from '../../constants/figures.js'\r\nimport { isModelAllowed } from './modelAllowlist.js'\r\nimport { type ModelAlias, isModelAlias } from './aliases.js'\r\nimport { capitalize } from '../stringUtils.js'\r\n\r\nexport type ModelShortName = string\r\nexport type ModelName = string\r\nexport type ModelSetting = ModelName | ModelAlias | null\r\n\r\nexport function getSmallFastModel(): ModelName {\r\n  if (process.env.ANTHROPIC_SMALL_FAST_MODEL) {\r\n    return process.env.ANTHROPIC_SMALL_FAST_MODEL\r\n  }\r\n  const provider = getAPIProvider()\r\n  if (isThirdPartyProvider(provider)) {\r\n    return getProviderModelSet(provider).haiku\r\n  }\r\n  return getDefaultHaikuModel()\r\n}\r\n\r\nexport function isNonCustomOpusModel(model: ModelName): boolean {\r\n  return (\r\n    model === getModelStrings().opus40 ||\r\n    model === getModelStrings().opus41 ||\r\n    model === getModelStrings().opus45 ||\r\n    model === getModelStrings().opus46 ||\r\n    model === getModelStrings().opus47\r\n  )\r\n}\r\n\r\n/**\r\n * Helper to get the model from /model (including via /config), the --model flag, environment variable,\r\n * or the saved settings. The returned value can be a model alias if that's what the user specified.\r\n * Undefined if the user didn't configure anything, in which case we fall back to\r\n * the default (null).\r\n *\r\n * Priority order within this function:\r\n * 1. Model override during session (from /model command) - highest priority\r\n * 2. Model override at startup (from --model flag)\r\n * 3. ANTHROPIC_MODEL environment variable\r\n * 4. Settings (from user's saved settings)\r\n */\r\nexport function getUserSpecifiedModelSetting(): ModelSetting | undefined {\r\n  let specifiedModel: ModelSetting | undefined\r\n\r\n  const modelOverride = getMainLoopModelOverride()\r\n  if (modelOverride !== undefined) {\r\n    specifiedModel = modelOverride\r\n  } else {\r\n    const settings = getSettings_DEPRECATED() || {}\r\n    specifiedModel = process.env.ANTHROPIC_MODEL || settings.model || undefined\r\n  }\r\n\r\n  // Ignore the user-specified model if it's not in the availableModels allowlist.\r\n  if (specifiedModel && !isModelAllowed(specifiedModel)) {\r\n    return undefined\r\n  }\r\n\r\n  return specifiedModel\r\n}\r\n\r\n/**\r\n * Get the main loop model to use for the current session.\r\n *\r\n * Model Selection Priority Order:\r\n * 1. Model override during session (from /model command) - highest priority\r\n * 2. Model override at startup (from --model flag)\r\n * 3. ANTHROPIC_MODEL environment variable\r\n * 4. Settings (from user's saved settings)\r\n * 5. Built-in default\r\n *\r\n * @returns The resolved model name to use\r\n */\r\nexport function getMainLoopModel(): ModelName {\r\n  // /team-mode orchestrator binding. When team mode is ON and an orchestrator\r\n  // role is configured, the main session model IS the orchestrator's pinned\r\n  // model \u2014 overriding the user's session /model selection. This is the\r\n  // same contract as getAPIProvider: configuring `Orchestrator \u2192 Anthropic /\r\n  // Sonnet 4.6` should make the orchestrator actually run on Sonnet 4.6.\r\n  // Subagents pass model via the runAgent call chain (NOT via getMainLoopModel)\r\n  // and pin their own provider via runWithForcedProvider, so they bypass this.\r\n  if (getForcedProvider() === undefined) {\r\n    // Lazy require to break circular dep (state.ts \u2192 providers.ts \u2192 model.ts).\r\n    // eslint-disable-next-line @typescript-eslint/no-require-imports\r\n    const teamMode = require('../teamMode/state.js') as typeof import('../teamMode/state.js')\r\n    const orchestratorBinding = teamMode.getTeamModeOrchestratorBinding()\r\n    if (orchestratorBinding) {\r\n      return parseUserSpecifiedModel(orchestratorBinding.model)\r\n    }\r\n  }\r\n\r\n  const model = getUserSpecifiedModelSetting()\r\n  if (model !== undefined && model !== null) {\r\n    const resolved = parseUserSpecifiedModel(model)\r\n    if (getAPIProvider() === 'agentrouter' && !isAgentRouterModelId(resolved)) {\r\n      return getDefaultMainLoopModel()\r\n    }\r\n    return resolved\r\n  }\r\n  return getDefaultMainLoopModel()\r\n}\r\n\r\nexport function getBestModel(): ModelName {\r\n  return getDefaultOpusModel()\r\n}\r\n\r\n// @[MODEL LAUNCH]: Update the default Opus model (3P providers may lag so keep defaults unchanged).\r\nexport function getDefaultOpusModel(): ModelName {\r\n  if (process.env.ANTHROPIC_DEFAULT_OPUS_MODEL) {\r\n    return process.env.ANTHROPIC_DEFAULT_OPUS_MODEL\r\n  }\r\n  const provider = getAPIProvider()\r\n  // Third-party non-Anthropic providers use their own model mappings\r\n  if (isThirdPartyProvider(provider)) {\r\n    return getProviderModelSet(provider).opus\r\n  }\r\n  // Anthropic-native providers (Bedrock, Vertex, Foundry) \u2014 kept as a\r\n  // separate branch even when values match, since 3P availability lags\r\n  // firstParty and these will diverge again at the next model launch.\r\n  if (provider !== 'firstParty') {\r\n    return getModelStrings().opus46\r\n  }\r\n  return getModelStrings().opus48\r\n}\r\n\r\n// @[MODEL LAUNCH]: Update the default Sonnet model (3P providers may lag so keep defaults unchanged).\r\nexport function getDefaultSonnetModel(): ModelName {\r\n  if (process.env.ANTHROPIC_DEFAULT_SONNET_MODEL) {\r\n    return process.env.ANTHROPIC_DEFAULT_SONNET_MODEL\r\n  }\r\n  const provider = getAPIProvider()\r\n  // Third-party non-Anthropic providers use their own model mappings\r\n  if (isThirdPartyProvider(provider)) {\r\n    return getProviderModelSet(provider).sonnet\r\n  }\r\n  // Default to Sonnet 4.5 for Anthropic cloud partners since they may not have 4.6 yet\r\n  if (provider !== 'firstParty') {\r\n    return getModelStrings().sonnet45\r\n  }\r\n  return getModelStrings().sonnet46\r\n}\r\n\r\n// @[MODEL LAUNCH]: Update the default Haiku model (3P providers may lag so keep defaults unchanged).\r\nexport function getDefaultHaikuModel(): ModelName {\r\n  if (process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL) {\r\n    return process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL\r\n  }\r\n  const provider = getAPIProvider()\r\n  // Third-party non-Anthropic providers use their own model mappings\r\n  if (isThirdPartyProvider(provider)) {\r\n    return getProviderModelSet(provider).haiku\r\n  }\r\n  // Haiku 4.5 is available on all Anthropic platforms (first-party, Foundry, Bedrock, Vertex)\r\n  return getModelStrings().haiku45\r\n}\r\n\r\n/**\r\n * Get the model to use for runtime, depending on the runtime context.\r\n * @param params Subset of the runtime context to determine the model to use.\r\n * @returns The model to use\r\n */\r\nexport function getRuntimeMainLoopModel(params: {\r\n  permissionMode: PermissionMode\r\n  mainLoopModel: string\r\n  exceeds200kTokens?: boolean\r\n}): ModelName {\r\n  const { permissionMode, mainLoopModel, exceeds200kTokens = false } = params\r\n\r\n  // When a caller pinned a provider for this run (team-mode role binding,\r\n  // per-agent provider override), the mainLoopModel passed in IS the model\r\n  // the user picked for that pinned provider. The opusplan/haiku\u2192plan-mode\r\n  // swaps below read the session-global `model` setting and would replace\r\n  // the worker's model with a default Anthropic id, which the worker's\r\n  // pinned 3P provider does not serve. Honor the explicit pairing.\r\n  if (getForcedProvider() !== undefined) {\r\n    return mainLoopModel\r\n  }\r\n\r\n  // opusplan uses Opus in plan mode without [1m] suffix.\r\n  if (\r\n    getUserSpecifiedModelSetting() === 'opusplan' &&\r\n    permissionMode === 'plan' &&\r\n    !exceeds200kTokens\r\n  ) {\r\n    return getDefaultOpusModel()\r\n  }\r\n\r\n  // sonnetplan by default\r\n  if (getUserSpecifiedModelSetting() === 'haiku' && permissionMode === 'plan') {\r\n    return getDefaultSonnetModel()\r\n  }\r\n\r\n  return mainLoopModel\r\n}\r\n\r\n/**\r\n * Get the default main loop model setting.\r\n *\r\n * This handles the built-in default:\r\n * - Opus for Max and Team Premium users\r\n * - Sonnet 4.6 for all other users (including Team Standard, Pro, Enterprise)\r\n *\r\n * @returns The default model setting to use\r\n */\r\nexport function getDefaultMainLoopModelSetting(): ModelName | ModelAlias {\r\n  // Ants default to defaultModel from flag config, or Opus 1M if not configured\r\n  if (process.env.USER_TYPE === 'ant') {\r\n    return (\r\n      getAntModelOverrideConfig()?.defaultModel ??\r\n      getDefaultOpusModel() + '[1m]'\r\n    )\r\n  }\r\n\r\n  // Max users get Opus as default\r\n  if (isMaxSubscriber()) {\r\n    return getDefaultOpusModel() + (isOpus1mMergeEnabled() ? '[1m]' : '')\r\n  }\r\n\r\n  // Team Premium gets Opus (same as Max)\r\n  if (isTeamPremiumSubscriber()) {\r\n    return getDefaultOpusModel() + (isOpus1mMergeEnabled() ? '[1m]' : '')\r\n  }\r\n\r\n  // PAYG (1P and 3P), Enterprise, Team Standard, and Pro get Sonnet as default\r\n  // Note that PAYG (3P) may default to an older Sonnet model\r\n  return getDefaultSonnetModel()\r\n}\r\n\r\n/**\r\n * Synchronous operation to get the default main loop model to use\r\n * (bypassing any user-specified values).\r\n */\r\nexport function getDefaultMainLoopModel(): ModelName {\r\n  return parseUserSpecifiedModel(getDefaultMainLoopModelSetting())\r\n}\r\n\r\n// @[MODEL LAUNCH]: Add a canonical name mapping for the new model below.\r\n/**\r\n * Pure string-match that strips date/provider suffixes from a first-party model\r\n * name. Input must already be a 1P-format ID (e.g. 'claude-3-7-sonnet-20250219',\r\n * 'us.anthropic.claude-opus-4-6-v1:0'). Does not touch settings, so safe at\r\n * module top-level (see MODEL_COSTS in modelCost.ts).\r\n */\r\nexport function firstPartyNameToCanonical(name: ModelName): ModelShortName {\r\n  name = name.toLowerCase()\r\n  // Special cases for Claude 4+ models to differentiate versions\r\n  // Order matters: check more specific versions first (4-5 before 4)\r\n  if (name.includes('claude-opus-4-8')) {\r\n    return 'claude-opus-4-8'\r\n  }\r\n  if (name.includes('claude-opus-4-7')) {\r\n    return 'claude-opus-4-7'\r\n  }\r\n  if (name.includes('claude-opus-4-6')) {\r\n    return 'claude-opus-4-6'\r\n  }\r\n  if (name.includes('claude-opus-4-5')) {\r\n    return 'claude-opus-4-5'\r\n  }\r\n  if (name.includes('claude-opus-4-1')) {\r\n    return 'claude-opus-4-1'\r\n  }\r\n  if (name.includes('claude-opus-4')) {\r\n    return 'claude-opus-4'\r\n  }\r\n  if (name.includes('claude-sonnet-4-6')) {\r\n    return 'claude-sonnet-4-6'\r\n  }\r\n  if (name.includes('claude-sonnet-4-5')) {\r\n    return 'claude-sonnet-4-5'\r\n  }\r\n  if (name.includes('claude-sonnet-4')) {\r\n    return 'claude-sonnet-4'\r\n  }\r\n  if (name.includes('claude-haiku-4-5')) {\r\n    return 'claude-haiku-4-5'\r\n  }\r\n  // Claude 3.x models use a different naming scheme (claude-3-{family})\r\n  if (name.includes('claude-3-7-sonnet')) {\r\n    return 'claude-3-7-sonnet'\r\n  }\r\n  if (name.includes('claude-3-5-sonnet')) {\r\n    return 'claude-3-5-sonnet'\r\n  }\r\n  if (name.includes('claude-3-5-haiku')) {\r\n    return 'claude-3-5-haiku'\r\n  }\r\n  if (name.includes('claude-3-opus')) {\r\n    return 'claude-3-opus'\r\n  }\r\n  if (name.includes('claude-3-sonnet')) {\r\n    return 'claude-3-sonnet'\r\n  }\r\n  if (name.includes('claude-3-haiku')) {\r\n    return 'claude-3-haiku'\r\n  }\r\n  const match = name.match(/(claude-(\\d+-\\d+-)?\\w+)/)\r\n  if (match && match[1]) {\r\n    return match[1]\r\n  }\r\n  // Fall back to the original name if no pattern matches\r\n  return name\r\n}\r\n\r\n/**\r\n * Maps a full model string to a shorter canonical version that's unified across 1P and 3P providers.\r\n * For example, 'claude-3-5-haiku-20241022' and 'us.anthropic.claude-3-5-haiku-20241022-v1:0'\r\n * would both be mapped to 'claude-3-5-haiku'.\r\n * @param fullModelName The full model name (e.g., 'claude-3-5-haiku-20241022')\r\n * @returns The short name (e.g., 'claude-3-5-haiku') if found, or the original name if no mapping exists\r\n */\r\nexport function getCanonicalName(fullModelName: ModelName): ModelShortName {\r\n  // Resolve overridden model IDs (e.g. Bedrock ARNs) back to canonical names.\r\n  // resolved is always a 1P-format ID, so firstPartyNameToCanonical can handle it.\r\n  return firstPartyNameToCanonical(resolveOverriddenModel(fullModelName))\r\n}\r\n\r\n// @[MODEL LAUNCH]: Update the default model description strings shown to users.\r\nexport function getClaudeAiUserDefaultModelDescription(\r\n  fastMode = false,\r\n): string {\r\n  if (isMaxSubscriber() || isTeamPremiumSubscriber()) {\r\n    if (isOpus1mMergeEnabled()) {\r\n      return `Opus 4.8 with 1M context \u00B7 Most capable for complex work${fastMode ? getOpus46PricingSuffix(true) : ''}`\r\n    }\r\n    return `Opus 4.8 \u00B7 Most capable for complex work${fastMode ? getOpus46PricingSuffix(true) : ''}`\r\n  }\r\n  return 'Sonnet 4.6 \u00B7 Best for everyday tasks'\r\n}\r\n\r\nexport function renderDefaultModelSetting(\r\n  setting: ModelName | ModelAlias,\r\n): string {\r\n  if (setting === 'opusplan') {\r\n    return 'Opus 4.8 in plan mode, else Sonnet 4.6'\r\n  }\r\n  return renderModelName(parseUserSpecifiedModel(setting))\r\n}\r\n\r\nexport function getOpus46PricingSuffix(fastMode: boolean): string {\r\n  if (getAPIProvider() !== 'firstParty') return ''\r\n  const pricing = formatModelPricing(getOpus46CostTier(fastMode))\r\n  const fastModeIndicator = fastMode ? ` (${LIGHTNING_BOLT})` : ''\r\n  return ` \u00B7${fastModeIndicator} ${pricing}`\r\n}\r\n\r\nexport function isOpus1mMergeEnabled(): boolean {\r\n  if (\r\n    is1mContextDisabled() ||\r\n    isProSubscriber() ||\r\n    getAPIProvider() !== 'firstParty'\r\n  ) {\r\n    return false\r\n  }\r\n  // Fail closed when a subscriber's subscription type is unknown. The VS Code\r\n  // config-loading subprocess can have OAuth tokens with valid scopes but no\r\n  // subscriptionType field (stale or partial refresh). Without this guard,\r\n  // isProSubscriber() returns false for such users and the merge leaks\r\n  // opus[1m] into the model dropdown \u2014 the API then rejects it with a\r\n  // misleading \"rate limit reached\" error.\r\n  if (isClaudeAISubscriber() && getSubscriptionType() === null) {\r\n    return false\r\n  }\r\n  return true\r\n}\r\n\r\nexport function renderModelSetting(setting: ModelName | ModelAlias): string {\r\n  if (setting === 'opusplan') {\r\n    return 'Opus Plan'\r\n  }\r\n  if (isModelAlias(setting)) {\r\n    return capitalize(setting)\r\n  }\r\n  return renderModelName(setting)\r\n}\r\n\r\n// @[MODEL LAUNCH]: Add display name cases for the new model (base + [1m] variant if applicable).\r\n/**\r\n * Returns a human-readable display name for known public models, or null\r\n * if the model is not recognized as a public model.\r\n */\r\nexport function getPublicModelDisplayName(model: ModelName): string | null {\r\n  switch (model) {\r\n    case getModelStrings().opus48:\r\n      return 'Opus 4.8'\r\n    case getModelStrings().opus48 + '[1m]':\r\n      return 'Opus 4.8 (1M context)'\r\n    case getModelStrings().opus47:\r\n      return 'Opus 4.7'\r\n    case getModelStrings().opus47 + '[1m]':\r\n      return 'Opus 4.7 (1M context)'\r\n    case getModelStrings().opus46:\r\n      return 'Opus 4.6'\r\n    case getModelStrings().opus46 + '[1m]':\r\n      return 'Opus 4.6 (1M context)'\r\n    case getModelStrings().opus45:\r\n      return 'Opus 4.5'\r\n    case getModelStrings().opus41:\r\n      return 'Opus 4.1'\r\n    case getModelStrings().opus40:\r\n      return 'Opus 4'\r\n    case getModelStrings().sonnet46 + '[1m]':\r\n      return 'Sonnet 4.6 (1M context)'\r\n    case getModelStrings().sonnet46:\r\n      return 'Sonnet 4.6'\r\n    case getModelStrings().sonnet45 + '[1m]':\r\n      return 'Sonnet 4.5 (1M context)'\r\n    case getModelStrings().sonnet45:\r\n      return 'Sonnet 4.5'\r\n    case getModelStrings().sonnet40:\r\n      return 'Sonnet 4'\r\n    case getModelStrings().sonnet40 + '[1m]':\r\n      return 'Sonnet 4 (1M context)'\r\n    case getModelStrings().sonnet37:\r\n      return 'Sonnet 3.7'\r\n    case getModelStrings().sonnet35:\r\n      return 'Sonnet 3.5'\r\n    case getModelStrings().haiku45:\r\n      return 'Haiku 4.5'\r\n    case getModelStrings().haiku35:\r\n      return 'Haiku 3.5'\r\n    default:\r\n      return null\r\n  }\r\n}\r\n\r\nfunction maskModelCodename(baseName: string): string {\r\n  // Mask only the first dash-separated segment (the codename), preserve the rest\r\n  // e.g. capybara-v2-fast \u2192 cap*****-v2-fast\r\n  const [codename = '', ...rest] = baseName.split('-')\r\n  const masked =\r\n    codename.slice(0, 3) + '*'.repeat(Math.max(0, codename.length - 3))\r\n  return [masked, ...rest].join('-')\r\n}\r\n\r\nexport function renderModelName(model: ModelName): string {\r\n  const publicName = getPublicModelDisplayName(model)\r\n  if (publicName) {\r\n    return publicName\r\n  }\r\n  if (process.env.USER_TYPE === 'ant') {\r\n    const resolved = parseUserSpecifiedModel(model)\r\n    const antModel = resolveAntModel(model)\r\n    if (antModel) {\r\n      const baseName = antModel.model.replace(/\\[1m\\]$/i, '')\r\n      const masked = maskModelCodename(baseName)\r\n      const suffix = has1mContext(resolved) ? '[1m]' : ''\r\n      return masked + suffix\r\n    }\r\n    if (resolved !== model) {\r\n      return `${model} (${resolved})`\r\n    }\r\n    return resolved\r\n  }\r\n  return model\r\n}\r\n\r\n/**\r\n * Returns a safe author name for public display (e.g., in git commit trailers).\r\n * Returns \"Claude {ModelName}\" for publicly known models, or \"Claude ({model})\"\r\n * for unknown/internal models so the exact model name is preserved.\r\n *\r\n * @param model The full model name\r\n * @returns \"Claude {ModelName}\" for public models, or \"Claude ({model})\" for non-public models\r\n */\r\nexport function getPublicModelName(model: ModelName): string {\r\n  const publicName = getPublicModelDisplayName(model)\r\n  if (publicName) {\r\n    return `Claude ${publicName}`\r\n  }\r\n  return `Claude (${model})`\r\n}\r\n\r\n/**\r\n * Returns a full model name for use in this session, possibly after resolving\r\n * a model alias.\r\n *\r\n * This function intentionally does not support version numbers to align with\r\n * the model switcher.\r\n *\r\n * Supports [1m] suffix on any model alias (e.g., haiku[1m], sonnet[1m]) to enable\r\n * 1M context window without requiring each variant to be in MODEL_ALIASES.\r\n *\r\n * @param modelInput The model alias or name provided by the user.\r\n */\r\nexport function parseUserSpecifiedModel(\r\n  modelInput: ModelName | ModelAlias,\r\n): ModelName {\r\n  const modelInputTrimmed = modelInput.trim()\r\n  const normalizedModel = modelInputTrimmed.toLowerCase()\r\n\r\n  const has1mTag = has1mContext(normalizedModel)\r\n  const modelString = has1mTag\r\n    ? normalizedModel.replace(/\\[1m]$/i, '').trim()\r\n    : normalizedModel\r\n\r\n  if (isModelAlias(modelString)) {\r\n    switch (modelString) {\r\n      case 'opusplan':\r\n        return getDefaultSonnetModel() + (has1mTag ? '[1m]' : '') // Sonnet is default, Opus in plan mode\r\n      case 'sonnet':\r\n        return getDefaultSonnetModel() + (has1mTag ? '[1m]' : '')\r\n      case 'haiku':\r\n        return getDefaultHaikuModel() + (has1mTag ? '[1m]' : '')\r\n      case 'opus':\r\n        return getDefaultOpusModel() + (has1mTag ? '[1m]' : '')\r\n      case 'best':\r\n        return getBestModel()\r\n      default:\r\n    }\r\n  }\r\n\r\n  // Opus 4/4.1 are no longer available on the first-party API (same as\r\n  // Claude.ai) \u2014 silently remap to the current Opus default. The 'opus'\r\n  // alias already resolves to 4.6, so the only users on these explicit\r\n  // strings pinned them in settings/env/--model/SDK before 4.5 launched.\r\n  // 3P providers may not yet have 4.6 capacity, so pass through unchanged.\r\n  if (\r\n    getAPIProvider() === 'firstParty' &&\r\n    isLegacyOpusFirstParty(modelString) &&\r\n    isLegacyModelRemapEnabled()\r\n  ) {\r\n    return getDefaultOpusModel() + (has1mTag ? '[1m]' : '')\r\n  }\r\n\r\n  if (process.env.USER_TYPE === 'ant') {\r\n    const has1mAntTag = has1mContext(normalizedModel)\r\n    const baseAntModel = normalizedModel.replace(/\\[1m]$/i, '').trim()\r\n\r\n    const antModel = resolveAntModel(baseAntModel)\r\n    if (antModel) {\r\n      const suffix = has1mAntTag ? '[1m]' : ''\r\n      return antModel.model + suffix\r\n    }\r\n\r\n    // Fall through to the alias string if we cannot load the config. The API calls\r\n    // will fail with this string, but we should hear about it through feedback and\r\n    // can tell the user to restart/wait for flag cache refresh to get the latest values.\r\n  }\r\n\r\n  // Preserve original case for custom model names (e.g., Azure Foundry deployment IDs)\r\n  // Only strip [1m] suffix if present, maintaining case of the base model\r\n  if (has1mTag) {\r\n    return modelInputTrimmed.replace(/\\[1m\\]$/i, '').trim() + '[1m]'\r\n  }\r\n  return modelInputTrimmed\r\n}\r\n\r\n/**\r\n * Resolves a skill's `model:` frontmatter against the current model, carrying\r\n * the `[1m]` suffix over when the target family supports it.\r\n *\r\n * A skill author writing `model: opus` means \"use opus-class reasoning\" \u2014 not\r\n * \"downgrade to 200K\". If the user is on opus[1m] at 230K tokens and invokes a\r\n * skill with `model: opus`, passing the bare alias through drops the effective\r\n * context window from 1M to 200K, which trips autocompact at 23% apparent usage\r\n * and surfaces \"Context limit reached\" even though nothing overflowed.\r\n *\r\n * We only carry [1m] when the target actually supports it (sonnet/opus). A skill\r\n * with `model: haiku` on a 1M session still downgrades \u2014 haiku has no 1M variant,\r\n * so the autocompact that follows is correct. Skills that already specify [1m]\r\n * are left untouched.\r\n */\r\nexport function resolveSkillModelOverride(\r\n  skillModel: string,\r\n  currentModel: string,\r\n): string {\r\n  if (has1mContext(skillModel) || !has1mContext(currentModel)) {\r\n    return skillModel\r\n  }\r\n  // modelSupports1M matches on canonical IDs ('claude-opus-4-7', 'claude-sonnet-4');\r\n  // a bare 'opus' alias falls through getCanonicalName unmatched. Resolve first.\r\n  if (modelSupports1M(parseUserSpecifiedModel(skillModel))) {\r\n    return skillModel + '[1m]'\r\n  }\r\n  return skillModel\r\n}\r\n\r\nconst LEGACY_OPUS_FIRSTPARTY = [\r\n  'claude-opus-4-20250514',\r\n  'claude-opus-4-1-20250805',\r\n  'claude-opus-4-0',\r\n  'claude-opus-4-1',\r\n]\r\n\r\nfunction isLegacyOpusFirstParty(model: string): boolean {\r\n  return LEGACY_OPUS_FIRSTPARTY.includes(model)\r\n}\r\n\r\n/**\r\n * Opt-out for the legacy Opus 4.0/4.1 \u2192 current Opus remap.\r\n */\r\nexport function isLegacyModelRemapEnabled(): boolean {\r\n  return !isEnvTruthy(process.env.CLAUDE_CODE_DISABLE_LEGACY_MODEL_REMAP)\r\n}\r\n\r\nexport function modelDisplayString(model: ModelSetting): string {\r\n  if (model === null) {\r\n    if (process.env.USER_TYPE === 'ant') {\r\n      return `Default for Ants (${renderDefaultModelSetting(getDefaultMainLoopModelSetting())})`\r\n    } else if (isClaudeAISubscriber()) {\r\n      return `Default (${getClaudeAiUserDefaultModelDescription()})`\r\n    }\r\n    return `Default (${getDefaultMainLoopModel()})`\r\n  }\r\n  const resolvedModel = parseUserSpecifiedModel(model)\r\n  return model === resolvedModel ? resolvedModel : `${model} (${resolvedModel})`\r\n}\r\n\r\n// @[MODEL LAUNCH]: Add a marketing name mapping for the new model below.\r\nexport function getMarketingNameForModel(modelId: string): string | undefined {\r\n  if (getAPIProvider() === 'foundry') {\r\n    // deployment ID is user-defined in Foundry, so it may have no relation to the actual model\r\n    return undefined\r\n  }\r\n\r\n  const has1m = modelId.toLowerCase().includes('[1m]')\r\n  const canonical = getCanonicalName(modelId)\r\n\r\n  if (canonical.includes('claude-opus-4-8')) {\r\n    return has1m ? 'Opus 4.8 (with 1M context)' : 'Opus 4.8'\r\n  }\r\n  if (canonical.includes('claude-opus-4-7')) {\r\n    return has1m ? 'Opus 4.7 (with 1M context)' : 'Opus 4.7'\r\n  }\r\n  if (canonical.includes('claude-opus-4-6')) {\r\n    return has1m ? 'Opus 4.6 (with 1M context)' : 'Opus 4.6'\r\n  }\r\n  if (canonical.includes('claude-opus-4-5')) {\r\n    return 'Opus 4.5'\r\n  }\r\n  if (canonical.includes('claude-opus-4-1')) {\r\n    return 'Opus 4.1'\r\n  }\r\n  if (canonical.includes('claude-opus-4')) {\r\n    return 'Opus 4'\r\n  }\r\n  if (canonical.includes('claude-sonnet-4-6')) {\r\n    return has1m ? 'Sonnet 4.6 (with 1M context)' : 'Sonnet 4.6'\r\n  }\r\n  if (canonical.includes('claude-sonnet-4-5')) {\r\n    return has1m ? 'Sonnet 4.5 (with 1M context)' : 'Sonnet 4.5'\r\n  }\r\n  if (canonical.includes('claude-sonnet-4')) {\r\n    return has1m ? 'Sonnet 4 (with 1M context)' : 'Sonnet 4'\r\n  }\r\n  if (canonical.includes('claude-3-7-sonnet')) {\r\n    return 'Claude 3.7 Sonnet'\r\n  }\r\n  if (canonical.includes('claude-3-5-sonnet')) {\r\n    return 'Claude 3.5 Sonnet'\r\n  }\r\n  if (canonical.includes('claude-haiku-4-5')) {\r\n    return 'Haiku 4.5'\r\n  }\r\n  if (canonical.includes('claude-3-5-haiku')) {\r\n    return 'Claude 3.5 Haiku'\r\n  }\r\n\r\n  return undefined\r\n}\r\n\r\nexport function normalizeModelStringForAPI(model: string): string {\r\n  return model.replace(/\\[(1|2)m\\]/gi, '')\r\n}\r\n", "import { getCursorModelDisplayName } from '../../lanes/cursor/catalog.js'\nimport { getAntigravityModelDisplayName } from '../../services/api/providers/gemini_code_assist.js'\nimport { getCommandCodeModelDisplayName } from './commandCodeThinking.js'\nimport type { APIProvider } from './providers.js'\n\nexport function getProviderModelDisplayName(\n  provider: APIProvider,\n  modelId: string,\n): string | null {\n  switch (provider) {\n    case 'firstParty':\n      return getAnthropicModelDisplayName(modelId)\n    case 'cursor':\n      return getCursorModelDisplayName(modelId)\n    case 'antigravity':\n      return getAntigravityModelDisplayName(modelId)\n    case 'commandcode':\n      return getCommandCodeModelDisplayName(modelId)\n    default:\n      return null\n  }\n}\n\nfunction getAnthropicModelDisplayName(modelId: string): string | null {\n  const baseModelId = modelId.split('::effort=')[0]?.toLowerCase()\n  switch (baseModelId) {\n    case 'claude-opus-4-8':\n      return 'Claude Opus 4.8'\n    case 'claude-opus-4-7':\n      return 'Claude Opus 4.7'\n    case 'claude-opus-4-6':\n      return 'Claude Opus 4.6'\n    case 'claude-sonnet-4-6':\n      return 'Claude Sonnet 4.6'\n    case 'claude-haiku-4-5':\n    case 'claude-haiku-4-5-20251001':\n      return 'Claude Haiku 4.5'\n    default:\n      return null\n  }\n}\n", "import {\r\n  getDefaultMainLoopModelSetting,\r\n  modelDisplayString,\r\n  renderDefaultModelSetting,\r\n  type ModelSetting,\r\n} from './model.js'\r\nimport { getAPIProvider, type APIProvider } from './providers.js'\r\nimport { getProviderModelDisplayName } from './providerDisplayNames.js'\r\n\r\nexport { getProviderModelDisplayName } from './providerDisplayNames.js'\r\n\r\nexport function renderModelLabelForProvider(\r\n  model: string | null,\r\n  provider: APIProvider = getAPIProvider(),\r\n): string {\r\n  if (model !== null) {\r\n    const providerDisplay = getProviderModelDisplayName(provider, model)\r\n    if (providerDisplay) {\r\n      return providerDisplay\r\n    }\r\n  }\r\n\r\n  const rendered = renderDefaultModelSetting(\r\n    model ?? getDefaultMainLoopModelSetting(),\r\n  )\r\n  return model === null ? `${rendered} (default)` : rendered\r\n}\r\n\r\nexport function modelDisplayStringForProvider(\r\n  model: ModelSetting,\r\n  provider: APIProvider = getAPIProvider(),\r\n): string {\r\n  if (model !== null) {\r\n    const providerDisplay = getProviderModelDisplayName(provider, model)\r\n    if (providerDisplay) {\r\n      return providerDisplay\r\n    }\r\n  }\r\n\r\n  return modelDisplayString(model)\r\n}\r\n", "import { getGlobalConfig } from '../config.js'\nimport { getProviderModelDisplayName } from '../model/display.js'\nimport {\n  isAPIProvider,\n  PROVIDER_DISPLAY_NAMES,\n  type APIProvider,\n} from '../model/providers.js'\n\n// Fixed roster shape \u2014 the 8 roles available to /team-mode. Order matters: the\n// wizard walks them in this order, and `/team-mode status` lists them this way.\nexport const TEAM_MODE_ROLE_IDS = [\n  'orchestrator',\n  'architect',\n  'implementer',\n  'reviewer',\n  'verifier',\n  'devops',\n  'docs',\n  'dependency-manager',\n  'explorer',\n] as const\n\nexport type TeamModeRoleId = (typeof TEAM_MODE_ROLE_IDS)[number]\n\nexport type TeamModeRoleMeta = {\n  id: TeamModeRoleId\n  label: string\n  description: string\n}\n\n// Human-readable metadata. The orchestrator role is the planner that lives in\n// the main session; the others are the workers it can spawn.\n//\n// Descriptions are prescriptive (when to use, what to deliver) rather than\n// summary, because they're embedded verbatim into the orchestrator system\n// prompt \u2014 the LLM treats them as the role's job description.\nexport const TEAM_MODE_ROLE_META: Record<TeamModeRoleId, TeamModeRoleMeta> = {\n  orchestrator: {\n    id: 'orchestrator',\n    label: 'Orchestrator',\n    description:\n      'Coordinates the task end-to-end, decides which workers to spawn and in what order, and synthesizes their outputs into a single user-facing response. Does NOT write code, produce the specialist architecture plan, run verification commands, or absorb worker deliverables. Delegates ALL non-trivial work to the appropriate specialist. Lives in the main session.',\n  },\n  architect: {\n    id: 'architect',\n    label: 'Architect',\n    description:\n      'Owns solution design BEFORE any code is written. Required for any task touching more than one file, introducing new modules, changing an API, planning a feature, or making non-obvious trade-offs. Deliverable: a written plan listing exact files to change, the change in each, dependencies, risks, and acceptance criteria. Implementer reads this plan; Orchestrator must not write the full plan itself.',\n  },\n  implementer: {\n    id: 'implementer',\n    label: 'Implementer',\n    description:\n      'Writes and edits code according to the accepted plan. Must receive the Architect plan (when one was produced) as part of its prompt. Owns ALL file edits, but does not own broad design, review, verification, docs, dependency, or DevOps work. Deliverable: the actual diff plus a one-paragraph summary of what changed and why.',\n  },\n  reviewer: {\n    id: 'reviewer',\n    label: 'Reviewer',\n    description:\n      'Reads the diff produced by the Implementer for correctness bugs, security issues, dead code, and over-engineering. Required on every multi-file change before the work is reported as done. Deliverable: bullet list of findings \u2014 each one actionable, with file:line references. No diff = nothing to review; spawn after Implementer reports completion.',\n  },\n  verifier: {\n    id: 'verifier',\n    label: 'Verifier',\n    description:\n      'Confirms the change actually works by running tests, type-checks, lints, builds, or driving the app. Required whenever code execution behavior changes (logic, build, dependencies). Deliverable: exact commands run, their exit codes, and a verdict: passes / fails with output. Spawn after Implementer; runs in parallel with Reviewer.',\n  },\n  devops: {\n    id: 'devops',\n    label: 'DevOps',\n    description:\n      'Owns CI/CD, deploy configs, containerization, infra-as-code, secrets/env, and pipeline scripts. Spawn ONLY when the task changes one of those surfaces \u2014 skip for app-code-only changes. Deliverable: the edited config plus an explanation of pipeline impact.',\n  },\n  docs: {\n    id: 'docs',\n    label: 'Docs',\n    description:\n      'Updates README, CHANGELOG, code comments that document non-obvious WHY, and migration notes. Spawn when public API changes, behavior visibly changes, or the user explicitly asks for docs. Skip for internal-only refactors. Deliverable: edited docs file(s).',\n  },\n  'dependency-manager': {\n    id: 'dependency-manager',\n    label: 'Dependency Manager',\n    description:\n      'Adds, upgrades, removes, or audits npm/pip/cargo/etc. dependencies. Owns lockfile updates and license checks. Spawn ONLY when the task explicitly involves dependency changes; do NOT spawn for unrelated work that happens to touch a lockfile. Deliverable: edited manifest + lockfile + rationale per change.',\n  },\n  explorer: {\n    id: 'explorer',\n    label: 'Explorer',\n    description:\n      'Read-only codebase exploration: locates files, traces call graphs, summarizes how a subsystem works. Spawn at the very start of an unfamiliar task to gather context BEFORE Architect plans. Returns: findings as a structured report \u2014 do not have it edit files (it must be a read-only worker).',\n  },\n}\n\nexport type TeamModeRole = {\n  role: TeamModeRoleId\n  provider: APIProvider\n  model: string\n  effort?: string | number\n  active: boolean\n}\n\n// Team-mode activation is intentionally process-local. The roster is persisted,\n// but a fresh CLI session must always start with team mode off until the user\n// explicitly runs `/team-mode on`.\nlet sessionTeamModeEnabled = false\n\nexport function setTeamModeEnabledForSession(enabled: boolean): void {\n  sessionTeamModeEnabled = enabled\n}\n\nfunction isTeamModeRoleId(value: string): value is TeamModeRoleId {\n  return (TEAM_MODE_ROLE_IDS as readonly string[]).includes(value)\n}\n\n// Read the persisted roster. Returns one entry per known role, filling in\n// blanks for roles the user hasn't configured yet. Unknown role ids in the\n// stored config are dropped silently (forward/backward compat).\nexport function getTeamModeRoles(): TeamModeRole[] {\n  const raw = getGlobalConfig().teamModeRoles\n  const stored = new Map<TeamModeRoleId, TeamModeRole>()\n\n  if (Array.isArray(raw)) {\n    for (const entry of raw) {\n      if (\n        !entry ||\n        typeof entry.role !== 'string' ||\n        !isTeamModeRoleId(entry.role) ||\n        typeof entry.provider !== 'string' ||\n        !isAPIProvider(entry.provider) ||\n        typeof entry.model !== 'string' ||\n        !entry.model.trim()\n      ) {\n        continue\n      }\n      stored.set(entry.role, {\n        role: entry.role,\n        provider: entry.provider,\n        model: entry.model.trim(),\n        effort: entry.effort,\n        active: entry.active !== false,\n      })\n    }\n  }\n\n  return TEAM_MODE_ROLE_IDS.map(id => stored.get(id)).filter(\n    (entry): entry is TeamModeRole => entry !== undefined,\n  )\n}\n\n// All roles, including unconfigured ones (returned as null). Used by the\n// status renderer and the wizard so the user can see every slot at once.\nexport function getTeamModeRoleSlots(): Array<{\n  meta: TeamModeRoleMeta\n  binding: TeamModeRole | null\n}> {\n  const configured = new Map(getTeamModeRoles().map(r => [r.role, r]))\n  return TEAM_MODE_ROLE_IDS.map(id => ({\n    meta: TEAM_MODE_ROLE_META[id],\n    binding: configured.get(id) ?? null,\n  }))\n}\n\nexport function hasConfiguredTeamModeRoster(): boolean {\n  return getTeamModeRoles().length > 0\n}\n\nexport function isTeamModeEnabled(): boolean {\n  return sessionTeamModeEnabled\n}\n\n// Active = configured AND not skipped. The orchestrator only spawns these.\nexport function getActiveTeamModeRoles(): TeamModeRole[] {\n  return getTeamModeRoles().filter(role => role.active)\n}\n\n// Returns the orchestrator role's binding when team-mode is ON, the role is\n// configured, AND active. This is what the main session should run as \u2014 not\n// the user's globally-selected /provider+/model. When null, callers fall\n// through to their existing resolution (saved config, env vars, defaults).\n//\n// Why this exists: the orchestrator role in the roster is the *main session*\n// model+provider. Before this helper, /team-mode on only set the addendum\n// flag \u2014 the main session kept running on whatever /provider and /model the\n// user had selected before turning team-mode on. Users configured Orchestrator\n// as e.g. \"Anthropic / Sonnet 4.6\" and were surprised when the orchestrator\n// kept running on their previous \"OpenRouter / tencent/hy3-preview\".\nexport function getTeamModeOrchestratorBinding(): TeamModeRole | null {\n  if (!isTeamModeEnabled()) return null\n  const orchestrator = getActiveTeamModeRoles().find(\n    r => r.role === 'orchestrator',\n  )\n  return orchestrator ?? null\n}\n\nexport function formatTeamModeRole(role: TeamModeRole): string {\n  const provider = PROVIDER_DISPLAY_NAMES[role.provider]\n  const model =\n    getProviderModelDisplayName(role.provider, role.model) ?? role.model\n  const effort =\n    role.effort !== undefined ? `, effort=${String(role.effort)}` : ''\n  return `${provider} / ${model}${effort}`\n}\n\n// \u2500\u2500\u2500 Fallback worker \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// When a worker spawn fails with an eligible error and the fallback is\n// configured + enabled, AgentTool retries once on this provider+model.\n// The shape mirrors a TeamModeRole minus the role/active bookkeeping \u2014\n// the fallback isn't a named role, it's a catch-all for any failing role.\n\nexport type TeamModeFallbackWorker = {\n  provider: APIProvider\n  model: string\n  effort?: string | number\n}\n\nexport function getTeamModeFallbackWorker(): TeamModeFallbackWorker | null {\n  const raw = getGlobalConfig().teamModeFallbackWorker\n  if (\n    !raw ||\n    typeof raw.provider !== 'string' ||\n    !isAPIProvider(raw.provider) ||\n    typeof raw.model !== 'string' ||\n    !raw.model.trim()\n  ) {\n    return null\n  }\n  return {\n    provider: raw.provider,\n    model: raw.model.trim(),\n    effort: raw.effort,\n  }\n}\n\nexport function hasConfiguredTeamModeFallback(): boolean {\n  return getTeamModeFallbackWorker() !== null\n}\n\nexport function isTeamModeFallbackEnabled(): boolean {\n  return getGlobalConfig().teamModeFallbackEnabled === true\n}\n\nexport function formatTeamModeFallback(fb: TeamModeFallbackWorker): string {\n  const provider = PROVIDER_DISPLAY_NAMES[fb.provider]\n  const model =\n    getProviderModelDisplayName(fb.provider, fb.model) ?? fb.model\n  const effort =\n    fb.effort !== undefined ? `, effort=${String(fb.effort)}` : ''\n  return `${provider} / ${model}${effort}`\n}\n", "import type { AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS } from '../../services/analytics/index.js'\r\nimport { isEnvTruthy } from '../envUtils.js'\r\nimport { getGlobalConfig, saveGlobalConfig } from '../config.js'\r\nimport { getForcedProvider } from '../forcedProvider.js'\r\n\r\nexport type APIProvider =\r\n  | 'firstParty' | 'bedrock' | 'vertex' | 'foundry'\n  | 'openai' | 'gemini' | 'antigravity'\n  | 'openrouter' | 'agentrouter' | 'modelrouter' | 'vercel' | 'requesty' | 'opencode' | 'commandcode' | 'groq' | 'mistral' | 'nim' | 'deepseek' | 'glm' | 'moonshot' | 'minimax' | 'ollama' | 'lmstudio'\n  | 'cline' | 'copilot' | 'cursor' | 'iflow' | 'kilocode' | 'kiro'\n\r\nconst VALID_PROVIDERS: readonly APIProvider[] = [\r\n  'firstParty', 'bedrock', 'vertex', 'foundry',\n  'openai', 'gemini', 'antigravity',\n  'openrouter', 'agentrouter', 'modelrouter', 'vercel', 'requesty', 'opencode', 'commandcode', 'groq', 'mistral', 'nim', 'deepseek', 'glm', 'moonshot', 'minimax', 'ollama', 'lmstudio',\n  'cline', 'copilot', 'cursor', 'iflow', 'kilocode', 'kiro',\n]\n\r\nexport function isAPIProvider(value: string): value is APIProvider {\r\n  return VALID_PROVIDERS.includes(value as APIProvider)\r\n}\r\n\r\n// Session-local snapshot of the active provider.\r\n//\r\n// The previous implementation re-read activeProvider from the shared\r\n// global-config cache on every request. That cache is kept in sync with\r\n// ~/.claude.json by a 1-second fs.watchFile poller (see\r\n// startGlobalConfigFreshnessWatcher in utils/config.ts), so when one\r\n// session ran `/provider nim` the other session (running ollama) saw the\r\n// write within a second and started mis-routing requests \u2014 producing\r\n// cross-talk 404s like \"ollama API error 404: model 'nim/xxx' not found\"\r\n// and vice-versa.\r\n//\r\n// Fix: each process latches the provider it resolves on first call and\r\n// ignores later disk changes made by sibling sessions. Disk persistence\r\n// is preserved (for next-launch default), but in-memory routing for a\r\n// running session is frozen. `NODE_ENV=test` bypasses the cache so the\r\n// test suite can toggle providers freely.\r\nlet _sessionActiveProvider: APIProvider | null = null\r\n\r\nfunction _resolveAPIProvider(): APIProvider {\r\n  // 1. Check persistent config first (set by /provider command)\r\n  const configured = getGlobalConfig().activeProvider\r\n  if (configured && VALID_PROVIDERS.includes(configured as APIProvider)) {\r\n    return configured as APIProvider\r\n  }\r\n  // 2. Fall back to environment variables\r\n  if (isEnvTruthy(process.env.CLAUDE_CODE_USE_BEDROCK))    return 'bedrock'\r\n  if (isEnvTruthy(process.env.CLAUDE_CODE_USE_VERTEX))     return 'vertex'\r\n  if (isEnvTruthy(process.env.CLAUDE_CODE_USE_FOUNDRY))    return 'foundry'\r\n  if (isEnvTruthy(process.env.CLAUDE_CODE_USE_OPENAI))     return 'openai'\r\n  if (isEnvTruthy(process.env.CLAUDE_CODE_USE_GEMINI))     return 'gemini'\r\n  if (isEnvTruthy(process.env.CLAUDE_CODE_USE_OPENROUTER)) return 'openrouter'\r\n  if (isEnvTruthy(process.env.CLAUDE_CODE_USE_AGENTROUTER)) return 'agentrouter'\r\n  if (isEnvTruthy(process.env.CLAUDE_CODE_USE_MODELROUTER) || isEnvTruthy(process.env.CLAUDE_CODE_USE_MODEL_ROUTER) || isEnvTruthy(process.env.CLAUDE_CODE_USE_LXG2IT)) return 'modelrouter'\r\n  if (isEnvTruthy(process.env.CLAUDE_CODE_USE_VERCEL) || isEnvTruthy(process.env.CLAUDE_CODE_USE_VERCEL_AI_GATEWAY)) return 'vercel'\r\n  if (isEnvTruthy(process.env.CLAUDE_CODE_USE_REQUESTY))    return 'requesty'\n  if (isEnvTruthy(process.env.CLAUDE_CODE_USE_OPENCODE) || isEnvTruthy(process.env.CLAUDE_CODE_USE_OPENCODE_ZEN)) return 'opencode'\n  if (isEnvTruthy(process.env.CLAUDE_CODE_USE_COMMANDCODE) || isEnvTruthy(process.env.CLAUDE_CODE_USE_COMMAND_CODE)) return 'commandcode'\n  if (isEnvTruthy(process.env.CLAUDE_CODE_USE_GROQ))       return 'groq'\n  if (isEnvTruthy(process.env.CLAUDE_CODE_USE_MISTRAL))    return 'mistral'\r\n  if (isEnvTruthy(process.env.CLAUDE_CODE_USE_NIM))        return 'nim'\r\n  if (isEnvTruthy(process.env.CLAUDE_CODE_USE_DEEPSEEK))   return 'deepseek'\r\n  if (isEnvTruthy(process.env.CLAUDE_CODE_USE_GLM))        return 'glm'\r\n  if (isEnvTruthy(process.env.CLAUDE_CODE_USE_MOONSHOT))   return 'moonshot'\r\n  if (isEnvTruthy(process.env.CLAUDE_CODE_USE_MINIMAX))    return 'minimax'\r\n  if (isEnvTruthy(process.env.CLAUDE_CODE_USE_OLLAMA))    return 'ollama'\r\n  if (isEnvTruthy(process.env.CLAUDE_CODE_USE_LMSTUDIO))  return 'lmstudio'\r\n\r\n  // 3. Auto-detect OpenCode Zen from known free-tier models if the user passes\r\n  // them directly (e.g. `tau -m deepseek-v4-flash-free`) so they don't have to\r\n  // manually set CLAUDE_CODE_USE_OPENCODE=1.\r\n  const model = process.env.ANTHROPIC_MODEL || ''\r\n  if (\r\n    model.includes('deepseek-v4-flash-free') ||\r\n    model.includes('nemotron-3') ||\r\n    model.includes('qwen3.6-plus-free') ||\r\n    model.includes('minimax-m2.5-free') ||\r\n    model === 'big-pickle'\r\n  ) {\r\n    return 'opencode'\r\n  }\r\n\r\n  return 'firstParty'\r\n}\r\n\r\nexport function getAPIProvider(): APIProvider {\r\n  // /team-mode pins a per-agent provider via AsyncLocalStorage. It takes\r\n  // precedence over the session snapshot AND the test bypass so an agent\r\n  // spawned with provider='kiro' routes through Kiro regardless of what the\r\n  // user has globally selected via /provider.\r\n  const forced = getForcedProvider()\r\n  if (forced !== undefined) return forced\r\n\r\n  // /team-mode orchestrator binding. When team mode is ON and an\r\n  // orchestrator role is configured, the main session runs on the\r\n  // orchestrator's pinned provider \u2014 not whatever /provider the user had\r\n  // set before turning team-mode on. This is the contract users expect:\r\n  // configuring `Orchestrator \u2192 Anthropic / Sonnet 4.6` should make the\r\n  // orchestrator actually run on Anthropic. Subagents bypass this branch\r\n  // entirely (they set forced via runWithForcedProvider above).\r\n  //\r\n  // Imported lazily to avoid a circular dep between providers.ts and\r\n  // teamMode/state.ts (state.ts \u2192 model/providers.ts via isAPIProvider).\r\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\r\n  const teamMode = require('../teamMode/state.js') as typeof import('../teamMode/state.js')\r\n  const orchestratorBinding = teamMode.getTeamModeOrchestratorBinding()\r\n  if (orchestratorBinding) return orchestratorBinding.provider\r\n\r\n  if (process.env.NODE_ENV === 'test') return _resolveAPIProvider()\r\n  if (_sessionActiveProvider !== null) return _sessionActiveProvider\r\n  _sessionActiveProvider = _resolveAPIProvider()\r\n  return _sessionActiveProvider\r\n}\r\n\r\n/**\r\n * Persist the active provider selection to global config AND update this\r\n * session's snapshot. Disk write keeps the choice across restarts;\r\n * snapshot update makes the change visible on the next request in this\r\n * session without waiting on the config-freshness watcher.\r\n */\r\nexport function setActiveProvider(provider: APIProvider): void {\r\n  _sessionActiveProvider = provider\r\n  saveGlobalConfig(current => ({\r\n    ...current,\r\n    activeProvider: provider,\r\n  }))\r\n}\r\n\r\n/**\r\n * Clear the active provider from config AND from this session's snapshot.\r\n * Next getAPIProvider() call re-resolves from env vars.\r\n */\r\nexport function clearActiveProvider(): void {\r\n  _sessionActiveProvider = null\r\n  saveGlobalConfig(current => ({\r\n    ...current,\r\n    activeProvider: undefined,\r\n  }))\r\n}\r\n\r\n/** User-friendly display names for providers */\r\nexport const PROVIDER_DISPLAY_NAMES: Record<APIProvider, string> = {\r\n  firstParty: 'Anthropic',\r\n  bedrock: 'AWS Bedrock',\r\n  vertex: 'Google Vertex AI',\r\n  foundry: 'Azure Foundry',\r\n  openai: 'OpenAI',\r\n  gemini: 'Google Gemini',\r\n  antigravity: 'Antigravity',\r\n  openrouter: 'OpenRouter',\r\n  agentrouter: 'AgentRouter',\r\n  modelrouter: 'Model Router',\r\n  vercel: 'Vercel AI Gateway',\r\n  requesty: 'Requesty',\n  opencode: 'OpenCode Zen',\n  commandcode: 'Command Code',\n  groq: 'Groq',\n  mistral: 'Mistral',\r\n  nim: 'NVIDIA NIM',\r\n  deepseek: 'DeepSeek',\r\n  glm: 'GLM',\r\n  moonshot: 'Moonshot AI',\r\n  minimax: 'MiniMax AI',\r\n  ollama: 'Ollama',\r\n  lmstudio: 'LM Studio',\r\n  cline: 'Cline',\r\n  copilot: 'GitHub Copilot',\r\n  cursor: 'Cursor',\r\n  iflow: 'iFlow',\r\n  kilocode: 'KiloCode',\r\n  kiro: 'Kiro',\r\n}\r\n\r\n/** Providers available for user selection in /provider and /login */\r\n// `iflow` is hidden from the user-facing pickers after its CLI shutdown announcement.\r\n// `modelrouter` is also hidden from /login and /models; backend support stays\r\n// intact for compatibility and env-driven use.\r\n// APIProvider union, env detection, auth flow, transformer, and routing are\r\n// all kept intact for compatibility.\r\nexport const SELECTABLE_PROVIDERS: readonly APIProvider[] = [\n  'firstParty', 'openai', 'commandcode', 'gemini', 'antigravity', 'openrouter', 'agentrouter', 'vercel', 'requesty', 'opencode', 'mistral', 'nim', 'deepseek', 'glm', 'moonshot', 'minimax', 'ollama', 'lmstudio',\n  'cline', 'copilot', 'cursor', 'kilocode', 'kiro',\n]\n\r\n/** Providers that use OpenAI-compatible chat completions API */\r\nexport function isOpenAICompatibleProvider(p: APIProvider): boolean {\n  return ['openai', 'openrouter', 'agentrouter', 'modelrouter', 'vercel', 'requesty', 'opencode', 'groq', 'mistral', 'nim', 'deepseek', 'glm', 'moonshot', 'minimax', 'ollama', 'lmstudio',\n          'cline', 'copilot', 'iflow', 'kilocode'].includes(p)\n}\n\n/** All non-Anthropic third-party LLM providers */\nexport function isThirdPartyProvider(p: APIProvider): boolean {\n  return ['openai', 'gemini', 'antigravity', 'openrouter', 'agentrouter', 'modelrouter', 'vercel', 'requesty', 'opencode', 'commandcode', 'groq', 'mistral', 'nim', 'deepseek', 'glm', 'moonshot', 'minimax', 'ollama', 'lmstudio',\n          'cline', 'copilot', 'cursor', 'iflow', 'kilocode', 'kiro'].includes(p)\n}\n\r\n/** Original Anthropic-native providers (firstParty + cloud partners) */\r\nexport function isAnthropicNativeProvider(p: APIProvider): boolean {\r\n  return ['firstParty', 'bedrock', 'vertex', 'foundry'].includes(p)\r\n}\r\n\r\nexport function getAPIProviderForStatsig(): AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS {\r\n  return getAPIProvider() as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS\r\n}\r\n\r\n/**\r\n * Check if ANTHROPIC_BASE_URL is a first-party Anthropic API URL.\r\n * Returns true if not set (default API) or points to api.anthropic.com\r\n * (or api-staging.anthropic.com for ant users).\r\n */\r\nexport function isFirstPartyAnthropicBaseUrl(): boolean {\r\n  const baseUrl = process.env.ANTHROPIC_BASE_URL\r\n  if (!baseUrl) {\r\n    return true\r\n  }\r\n  try {\r\n    const host = new URL(baseUrl).host\r\n    const allowedHosts = ['api.anthropic.com']\r\n    if (process.env.USER_TYPE === 'ant') {\r\n      allowedHosts.push('api-staging.anthropic.com')\r\n    }\r\n    return allowedHosts.includes(host)\r\n  } catch {\r\n    return false\r\n  }\r\n}\r\n", "import {\n  getModelStrings as getModelStringsState,\n  setModelStrings as setModelStringsState,\n} from 'src/bootstrap/state.js'\nimport { logError } from '../log.js'\nimport { sequential } from '../sequential.js'\nimport { getInitialSettings } from '../settings/settings.js'\nimport { findFirstMatch, getBedrockInferenceProfiles } from './bedrock.js'\nimport {\n  ALL_MODEL_CONFIGS,\n  CANONICAL_ID_TO_KEY,\n  type CanonicalModelId,\n  type ModelKey,\n} from './configs.js'\nimport { type APIProvider, getAPIProvider, isThirdPartyProvider } from './providers.js'\nimport type { AnthropicProvider } from './configs.js'\n\n/**\n * Maps each model version to its provider-specific model ID string.\n * Derived from ALL_MODEL_CONFIGS \u2014 adding a model there extends this type.\n */\nexport type ModelStrings = Record<ModelKey, string>\n\nconst MODEL_KEYS = Object.keys(ALL_MODEL_CONFIGS) as ModelKey[]\n\nfunction getBuiltinModelStrings(provider: APIProvider): ModelStrings {\n  const out = {} as ModelStrings\n  // Third-party providers (openai, gemini, groq, etc.) don't have entries in\n  // ALL_MODEL_CONFIGS. Fall back to firstParty model strings \u2014 they're only\n  // used as canonical identifiers; actual model resolution for third-party\n  // providers happens in getProviderModelSet() / provider.resolveModel().\n  const configKey: AnthropicProvider = isThirdPartyProvider(provider)\n    ? 'firstParty'\n    : provider as AnthropicProvider\n  for (const key of MODEL_KEYS) {\n    out[key] = ALL_MODEL_CONFIGS[key][configKey]\n  }\n  return out\n}\n\nasync function getBedrockModelStrings(): Promise<ModelStrings> {\n  const fallback = getBuiltinModelStrings('bedrock')\n  let profiles: string[] | undefined\n  try {\n    profiles = await getBedrockInferenceProfiles()\n  } catch (error) {\n    logError(error as Error)\n    return fallback\n  }\n  if (!profiles?.length) {\n    return fallback\n  }\n  // Each config's firstParty ID is the canonical substring we search for in the\n  // user's inference profile list (e.g. \"claude-opus-4-6\" matches\n  // \"eu.anthropic.claude-opus-4-6-v1\"). Fall back to the hardcoded bedrock ID\n  // when no matching profile is found.\n  const out = {} as ModelStrings\n  for (const key of MODEL_KEYS) {\n    const needle = ALL_MODEL_CONFIGS[key].firstParty\n    out[key] = findFirstMatch(profiles, needle) || fallback[key]\n  }\n  return out\n}\n\n/**\n * Layer user-configured modelOverrides (from settings.json) on top of the\n * provider-derived model strings. Overrides are keyed by canonical first-party\n * model ID (e.g. \"claude-opus-4-6\") and map to arbitrary provider-specific\n * strings \u2014 typically Bedrock inference profile ARNs.\n */\nfunction applyModelOverrides(ms: ModelStrings): ModelStrings {\n  const overrides = getInitialSettings().modelOverrides\n  if (!overrides) {\n    return ms\n  }\n  const out = { ...ms }\n  for (const [canonicalId, override] of Object.entries(overrides)) {\n    const key = CANONICAL_ID_TO_KEY[canonicalId as CanonicalModelId]\n    if (key && override) {\n      out[key] = override\n    }\n  }\n  return out\n}\n\n/**\n * Resolve an overridden model ID (e.g. a Bedrock ARN) back to its canonical\n * first-party model ID. If the input doesn't match any current override value,\n * it is returned unchanged. Safe to call during module init (no-ops if settings\n * aren't loaded yet).\n */\nexport function resolveOverriddenModel(modelId: string): string {\n  let overrides: Record<string, string> | undefined\n  try {\n    overrides = getInitialSettings().modelOverrides\n  } catch {\n    return modelId\n  }\n  if (!overrides) {\n    return modelId\n  }\n  for (const [canonicalId, override] of Object.entries(overrides)) {\n    if (override === modelId) {\n      return canonicalId\n    }\n  }\n  return modelId\n}\n\nconst updateBedrockModelStrings = sequential(async () => {\n  if (getModelStringsState() !== null) {\n    // Already initialized. Doing the check here, combined with\n    // `sequential`, allows the test suite to reset the state\n    // between tests while still preventing multiple API calls\n    // in production.\n    return\n  }\n  try {\n    const ms = await getBedrockModelStrings()\n    setModelStringsState(ms)\n  } catch (error) {\n    logError(error as Error)\n  }\n})\n\nfunction initModelStrings(): void {\n  const ms = getModelStringsState()\n  if (ms !== null) {\n    // Already initialized\n    return\n  }\n  // Initial with default values for non-Bedrock providers\n  if (getAPIProvider() !== 'bedrock') {\n    setModelStringsState(getBuiltinModelStrings(getAPIProvider()))\n    return\n  }\n  // On Bedrock, update model strings in the background without blocking.\n  // Don't set the state in this case so that we can use `sequential` on\n  // `updateBedrockModelStrings` and check for existing state on multiple\n  // calls.\n  void updateBedrockModelStrings()\n}\n\nexport function getModelStrings(): ModelStrings {\n  const ms = getModelStringsState()\n  if (ms === null) {\n    initModelStrings()\n    // Bedrock path falls through here while the profile fetch runs in the\n    // background \u2014 still honor overrides on the interim defaults.\n    return applyModelOverrides(getBuiltinModelStrings(getAPIProvider()))\n  }\n  return applyModelOverrides(ms)\n}\n\n/**\n * Ensure model strings are fully initialized.\n * For Bedrock users, this waits for the profile fetch to complete.\n * Call this before generating model options to ensure correct region strings.\n */\nexport async function ensureModelStringsInitialized(): Promise<void> {\n  const ms = getModelStringsState()\n  if (ms !== null) {\n    return\n  }\n\n  // For non-Bedrock, initialize synchronously\n  if (getAPIProvider() !== 'bedrock') {\n    setModelStringsState(getBuiltinModelStrings(getAPIProvider()))\n    return\n  }\n\n  // For Bedrock, wait for the profile fetch\n  await updateBedrockModelStrings()\n}\n", "import {\n  getAnthropicApiKey,\n  getAuthTokenSource,\n  getSubscriptionType,\n  isClaudeAISubscriber,\n} from './auth.js'\nimport { getGlobalConfig } from './config.js'\nimport { isEnvTruthy } from './envUtils.js'\n\nexport function hasConsoleBillingAccess(): boolean {\n  // Check if cost reporting is disabled via environment variable\n  if (isEnvTruthy(process.env.DISABLE_COST_WARNINGS)) {\n    return false\n  }\n\n  const isSubscriber = isClaudeAISubscriber()\n\n  // This might be wrong if user is signed into Max but also using an API key, but\n  // we already show a warning on launch in that case\n  if (isSubscriber) return false\n\n  // Check if user has any form of authentication\n  const authSource = getAuthTokenSource()\n  const hasApiKey = getAnthropicApiKey() !== null\n\n  // If user has no authentication at all (logged out), don't show costs\n  if (!authSource.hasToken && !hasApiKey) {\n    return false\n  }\n\n  const config = getGlobalConfig()\n  const orgRole = config.oauthAccount?.organizationRole\n  const workspaceRole = config.oauthAccount?.workspaceRole\n\n  if (!orgRole || !workspaceRole) {\n    return false // hide cost for grandfathered users who have not re-authed since we've added roles\n  }\n\n  // Users have billing access if they are admins or billing roles at either workspace or organization level\n  return (\n    ['admin', 'billing'].includes(orgRole) ||\n    ['workspace_admin', 'workspace_billing'].includes(workspaceRole)\n  )\n}\n\n// Mock billing access for /mock-limits testing (set by mockRateLimits.ts)\nlet mockBillingAccessOverride: boolean | null = null\n\nexport function setMockBillingAccessOverride(value: boolean | null): void {\n  mockBillingAccessOverride = value\n}\n\nexport function hasClaudeAiBillingAccess(): boolean {\n  // Check for mock billing access first (for /mock-limits testing)\n  if (mockBillingAccessOverride !== null) {\n    return mockBillingAccessOverride\n  }\n\n  if (!isClaudeAISubscriber()) {\n    return false\n  }\n\n  const subscriptionType = getSubscriptionType()\n\n  // Consumer plans (Max/Pro) - individual users always have billing access\n  if (subscriptionType === 'max' || subscriptionType === 'pro') {\n    return true\n  }\n\n  // Team/Enterprise - check for admin or billing roles\n  const config = getGlobalConfig()\n  const orgRole = config.oauthAccount?.organizationRole\n\n  return (\n    !!orgRole &&\n    ['admin', 'billing', 'owner', 'primary_owner'].includes(orgRole)\n  )\n}\n", "// Mock rate limits for testing [ANT-ONLY]\n// This allows testing various rate limit scenarios without hitting actual limits\n//\n// \u26A0\uFE0F  WARNING: This is for internal testing/demo purposes only!\n// The mock headers may not exactly match the API specification or real-world behavior.\n// Always validate against actual API responses before relying on this for production features.\n\nimport type { SubscriptionType } from '../services/oauth/types.js'\nimport { setMockBillingAccessOverride } from '../utils/billing.js'\nimport type { OverageDisabledReason } from './claudeAiLimits.js'\n\ntype MockHeaders = {\n  'anthropic-ratelimit-unified-status'?:\n    | 'allowed'\n    | 'allowed_warning'\n    | 'rejected'\n  'anthropic-ratelimit-unified-reset'?: string\n  'anthropic-ratelimit-unified-representative-claim'?:\n    | 'five_hour'\n    | 'seven_day'\n    | 'seven_day_opus'\n    | 'seven_day_sonnet'\n  'anthropic-ratelimit-unified-overage-status'?:\n    | 'allowed'\n    | 'allowed_warning'\n    | 'rejected'\n  'anthropic-ratelimit-unified-overage-reset'?: string\n  'anthropic-ratelimit-unified-overage-disabled-reason'?: OverageDisabledReason\n  'anthropic-ratelimit-unified-fallback'?: 'available'\n  'anthropic-ratelimit-unified-fallback-percentage'?: string\n  'retry-after'?: string\n  // Early warning utilization headers\n  'anthropic-ratelimit-unified-5h-utilization'?: string\n  'anthropic-ratelimit-unified-5h-reset'?: string\n  'anthropic-ratelimit-unified-5h-surpassed-threshold'?: string\n  'anthropic-ratelimit-unified-7d-utilization'?: string\n  'anthropic-ratelimit-unified-7d-reset'?: string\n  'anthropic-ratelimit-unified-7d-surpassed-threshold'?: string\n  'anthropic-ratelimit-unified-overage-utilization'?: string\n  'anthropic-ratelimit-unified-overage-surpassed-threshold'?: string\n}\n\nexport type MockHeaderKey =\n  | 'status'\n  | 'reset'\n  | 'claim'\n  | 'overage-status'\n  | 'overage-reset'\n  | 'overage-disabled-reason'\n  | 'fallback'\n  | 'fallback-percentage'\n  | 'retry-after'\n  | '5h-utilization'\n  | '5h-reset'\n  | '5h-surpassed-threshold'\n  | '7d-utilization'\n  | '7d-reset'\n  | '7d-surpassed-threshold'\n\nexport type MockScenario =\n  | 'normal'\n  | 'session-limit-reached'\n  | 'approaching-weekly-limit'\n  | 'weekly-limit-reached'\n  | 'overage-active'\n  | 'overage-warning'\n  | 'overage-exhausted'\n  | 'out-of-credits'\n  | 'org-zero-credit-limit'\n  | 'org-spend-cap-hit'\n  | 'member-zero-credit-limit'\n  | 'seat-tier-zero-credit-limit'\n  | 'opus-limit'\n  | 'opus-warning'\n  | 'sonnet-limit'\n  | 'sonnet-warning'\n  | 'fast-mode-limit'\n  | 'fast-mode-short-limit'\n  | 'extra-usage-required'\n  | 'clear'\n\nlet mockHeaders: MockHeaders = {}\nlet mockEnabled = false\nlet mockHeaderless429Message: string | null = null\nlet mockSubscriptionType: SubscriptionType | null = null\nlet mockFastModeRateLimitDurationMs: number | null = null\nlet mockFastModeRateLimitExpiresAt: number | null = null\n// Default subscription type for mock testing\nconst DEFAULT_MOCK_SUBSCRIPTION: SubscriptionType = 'max'\n\n// Track individual exceeded limits with their reset times\ntype ExceededLimit = {\n  type: 'five_hour' | 'seven_day' | 'seven_day_opus' | 'seven_day_sonnet'\n  resetsAt: number // Unix timestamp\n}\n\nlet exceededLimits: ExceededLimit[] = []\n\n// New approach: Toggle individual headers\nexport function setMockHeader(\n  key: MockHeaderKey,\n  value: string | undefined,\n): void {\n  if (process.env.USER_TYPE !== 'ant') {\n    return\n  }\n\n  mockEnabled = true\n\n  // Special case for retry-after which doesn't have the prefix\n  const fullKey = (\n    key === 'retry-after' ? 'retry-after' : `anthropic-ratelimit-unified-${key}`\n  ) as keyof MockHeaders\n\n  if (value === undefined || value === 'clear') {\n    delete mockHeaders[fullKey]\n    if (key === 'claim') {\n      exceededLimits = []\n    }\n    // Update retry-after if status changed\n    if (key === 'status' || key === 'overage-status') {\n      updateRetryAfter()\n    }\n    return\n  } else {\n    // Handle special cases for reset times\n    if (key === 'reset' || key === 'overage-reset') {\n      // If user provides a number, treat it as hours from now\n      const hours = Number(value)\n      if (!isNaN(hours)) {\n        value = String(Math.floor(Date.now() / 1000) + hours * 3600)\n      }\n    }\n\n    // Handle claims - add to exceeded limits\n    if (key === 'claim') {\n      const validClaims = [\n        'five_hour',\n        'seven_day',\n        'seven_day_opus',\n        'seven_day_sonnet',\n      ]\n      if (validClaims.includes(value)) {\n        // Determine reset time based on claim type\n        let resetsAt: number\n        if (value === 'five_hour') {\n          resetsAt = Math.floor(Date.now() / 1000) + 5 * 3600\n        } else if (\n          value === 'seven_day' ||\n          value === 'seven_day_opus' ||\n          value === 'seven_day_sonnet'\n        ) {\n          resetsAt = Math.floor(Date.now() / 1000) + 7 * 24 * 3600\n        } else {\n          resetsAt = Math.floor(Date.now() / 1000) + 3600\n        }\n\n        // Add to exceeded limits (remove if already exists)\n        exceededLimits = exceededLimits.filter(l => l.type !== value)\n        exceededLimits.push({ type: value as ExceededLimit['type'], resetsAt })\n\n        // Set the representative claim (furthest reset time)\n        updateRepresentativeClaim()\n        return\n      }\n    }\n    // Widen to a string-valued record so dynamic key assignment is allowed.\n    // MockHeaders values are string-literal unions; assigning a raw user-input\n    // string requires widening, but this is mock/test code so it's acceptable.\n    const headers: Partial<Record<keyof MockHeaders, string>> = mockHeaders\n    headers[fullKey] = value\n\n    // Update retry-after if status changed\n    if (key === 'status' || key === 'overage-status') {\n      updateRetryAfter()\n    }\n  }\n\n  // If all headers are cleared, disable mocking\n  if (Object.keys(mockHeaders).length === 0) {\n    mockEnabled = false\n  }\n}\n\n// Helper to update retry-after based on current state\nfunction updateRetryAfter(): void {\n  const status = mockHeaders['anthropic-ratelimit-unified-status']\n  const overageStatus =\n    mockHeaders['anthropic-ratelimit-unified-overage-status']\n  const reset = mockHeaders['anthropic-ratelimit-unified-reset']\n\n  if (\n    status === 'rejected' &&\n    (!overageStatus || overageStatus === 'rejected') &&\n    reset\n  ) {\n    // Calculate seconds until reset\n    const resetTimestamp = Number(reset)\n    const secondsUntilReset = Math.max(\n      0,\n      resetTimestamp - Math.floor(Date.now() / 1000),\n    )\n    mockHeaders['retry-after'] = String(secondsUntilReset)\n  } else {\n    delete mockHeaders['retry-after']\n  }\n}\n\n// Update the representative claim based on exceeded limits\nfunction updateRepresentativeClaim(): void {\n  if (exceededLimits.length === 0) {\n    delete mockHeaders['anthropic-ratelimit-unified-representative-claim']\n    delete mockHeaders['anthropic-ratelimit-unified-reset']\n    delete mockHeaders['retry-after']\n    return\n  }\n\n  // Find the limit with the furthest reset time\n  const furthest = exceededLimits.reduce((prev, curr) =>\n    curr.resetsAt > prev.resetsAt ? curr : prev,\n  )\n\n  // Set the representative claim (appears for both warning and rejected)\n  mockHeaders['anthropic-ratelimit-unified-representative-claim'] =\n    furthest.type\n  mockHeaders['anthropic-ratelimit-unified-reset'] = String(furthest.resetsAt)\n\n  // Add retry-after if rejected and no overage available\n  if (mockHeaders['anthropic-ratelimit-unified-status'] === 'rejected') {\n    const overageStatus =\n      mockHeaders['anthropic-ratelimit-unified-overage-status']\n    if (!overageStatus || overageStatus === 'rejected') {\n      // Calculate seconds until reset\n      const secondsUntilReset = Math.max(\n        0,\n        furthest.resetsAt - Math.floor(Date.now() / 1000),\n      )\n      mockHeaders['retry-after'] = String(secondsUntilReset)\n    } else {\n      // Overage is available, no retry-after\n      delete mockHeaders['retry-after']\n    }\n  } else {\n    delete mockHeaders['retry-after']\n  }\n}\n\n// Add function to add exceeded limit with custom reset time\nexport function addExceededLimit(\n  type: 'five_hour' | 'seven_day' | 'seven_day_opus' | 'seven_day_sonnet',\n  hoursFromNow: number,\n): void {\n  if (process.env.USER_TYPE !== 'ant') {\n    return\n  }\n\n  mockEnabled = true\n  const resetsAt = Math.floor(Date.now() / 1000) + hoursFromNow * 3600\n\n  // Remove existing limit of same type\n  exceededLimits = exceededLimits.filter(l => l.type !== type)\n  exceededLimits.push({ type, resetsAt })\n\n  // Update status to rejected if we have exceeded limits\n  if (exceededLimits.length > 0) {\n    mockHeaders['anthropic-ratelimit-unified-status'] = 'rejected'\n  }\n\n  updateRepresentativeClaim()\n}\n\n// Set mock early warning utilization for time-relative thresholds\n// claimAbbrev: '5h' or '7d'\n// utilization: 0-1 (e.g., 0.92 for 92% used)\n// hoursFromNow: hours until reset (default: 4 for 5h, 120 for 7d)\nexport function setMockEarlyWarning(\n  claimAbbrev: '5h' | '7d' | 'overage',\n  utilization: number,\n  hoursFromNow?: number,\n): void {\n  if (process.env.USER_TYPE !== 'ant') {\n    return\n  }\n\n  mockEnabled = true\n\n  // Clear ALL early warning headers first (5h is checked before 7d, so we need\n  // to clear 5h headers when testing 7d to avoid 5h taking priority)\n  clearMockEarlyWarning()\n\n  // Default hours based on claim type (early in window to trigger warning)\n  const defaultHours = claimAbbrev === '5h' ? 4 : 5 * 24\n  const hours = hoursFromNow ?? defaultHours\n  const resetsAt = Math.floor(Date.now() / 1000) + hours * 3600\n\n  mockHeaders[`anthropic-ratelimit-unified-${claimAbbrev}-utilization`] =\n    String(utilization)\n  mockHeaders[`anthropic-ratelimit-unified-${claimAbbrev}-reset`] =\n    String(resetsAt)\n  // Set the surpassed-threshold header to trigger early warning\n  mockHeaders[\n    `anthropic-ratelimit-unified-${claimAbbrev}-surpassed-threshold`\n  ] = String(utilization)\n\n  // Set status to allowed so early warning logic can upgrade it\n  if (!mockHeaders['anthropic-ratelimit-unified-status']) {\n    mockHeaders['anthropic-ratelimit-unified-status'] = 'allowed'\n  }\n}\n\n// Clear mock early warning headers\nexport function clearMockEarlyWarning(): void {\n  delete mockHeaders['anthropic-ratelimit-unified-5h-utilization']\n  delete mockHeaders['anthropic-ratelimit-unified-5h-reset']\n  delete mockHeaders['anthropic-ratelimit-unified-5h-surpassed-threshold']\n  delete mockHeaders['anthropic-ratelimit-unified-7d-utilization']\n  delete mockHeaders['anthropic-ratelimit-unified-7d-reset']\n  delete mockHeaders['anthropic-ratelimit-unified-7d-surpassed-threshold']\n}\n\nexport function setMockRateLimitScenario(scenario: MockScenario): void {\n  if (process.env.USER_TYPE !== 'ant') {\n    return\n  }\n\n  if (scenario === 'clear') {\n    mockHeaders = {}\n    mockHeaderless429Message = null\n    mockEnabled = false\n    return\n  }\n\n  mockEnabled = true\n\n  // Set reset times for demos\n  const fiveHoursFromNow = Math.floor(Date.now() / 1000) + 5 * 3600\n  const sevenDaysFromNow = Math.floor(Date.now() / 1000) + 7 * 24 * 3600\n\n  // Clear existing headers\n  mockHeaders = {}\n  mockHeaderless429Message = null\n\n  // Only clear exceeded limits for scenarios that explicitly set them\n  // Overage scenarios should preserve existing exceeded limits\n  const preserveExceededLimits = [\n    'overage-active',\n    'overage-warning',\n    'overage-exhausted',\n  ].includes(scenario)\n  if (!preserveExceededLimits) {\n    exceededLimits = []\n  }\n\n  switch (scenario) {\n    case 'normal':\n      mockHeaders = {\n        'anthropic-ratelimit-unified-status': 'allowed',\n        'anthropic-ratelimit-unified-reset': String(fiveHoursFromNow),\n      }\n      break\n\n    case 'session-limit-reached':\n      exceededLimits = [{ type: 'five_hour', resetsAt: fiveHoursFromNow }]\n      updateRepresentativeClaim()\n      mockHeaders['anthropic-ratelimit-unified-status'] = 'rejected'\n      break\n\n    case 'approaching-weekly-limit':\n      mockHeaders = {\n        'anthropic-ratelimit-unified-status': 'allowed_warning',\n        'anthropic-ratelimit-unified-reset': String(sevenDaysFromNow),\n        'anthropic-ratelimit-unified-representative-claim': 'seven_day',\n      }\n      break\n\n    case 'weekly-limit-reached':\n      exceededLimits = [{ type: 'seven_day', resetsAt: sevenDaysFromNow }]\n      updateRepresentativeClaim()\n      mockHeaders['anthropic-ratelimit-unified-status'] = 'rejected'\n      break\n\n    case 'overage-active': {\n      // If no limits have been exceeded yet, default to 5-hour\n      if (exceededLimits.length === 0) {\n        exceededLimits = [{ type: 'five_hour', resetsAt: fiveHoursFromNow }]\n      }\n      updateRepresentativeClaim()\n      mockHeaders['anthropic-ratelimit-unified-status'] = 'rejected'\n      mockHeaders['anthropic-ratelimit-unified-overage-status'] = 'allowed'\n      // Set overage reset time (monthly)\n      const endOfMonthActive = new Date()\n      endOfMonthActive.setMonth(endOfMonthActive.getMonth() + 1, 1)\n      endOfMonthActive.setHours(0, 0, 0, 0)\n      mockHeaders['anthropic-ratelimit-unified-overage-reset'] = String(\n        Math.floor(endOfMonthActive.getTime() / 1000),\n      )\n      break\n    }\n\n    case 'overage-warning': {\n      // If no limits have been exceeded yet, default to 5-hour\n      if (exceededLimits.length === 0) {\n        exceededLimits = [{ type: 'five_hour', resetsAt: fiveHoursFromNow }]\n      }\n      updateRepresentativeClaim()\n      mockHeaders['anthropic-ratelimit-unified-status'] = 'rejected'\n      mockHeaders['anthropic-ratelimit-unified-overage-status'] =\n        'allowed_warning'\n      // Overage typically resets monthly, but for demo let's say end of month\n      const endOfMonth = new Date()\n      endOfMonth.setMonth(endOfMonth.getMonth() + 1, 1)\n      endOfMonth.setHours(0, 0, 0, 0)\n      mockHeaders['anthropic-ratelimit-unified-overage-reset'] = String(\n        Math.floor(endOfMonth.getTime() / 1000),\n      )\n      break\n    }\n\n    case 'overage-exhausted': {\n      // If no limits have been exceeded yet, default to 5-hour\n      if (exceededLimits.length === 0) {\n        exceededLimits = [{ type: 'five_hour', resetsAt: fiveHoursFromNow }]\n      }\n      updateRepresentativeClaim()\n      mockHeaders['anthropic-ratelimit-unified-status'] = 'rejected'\n      mockHeaders['anthropic-ratelimit-unified-overage-status'] = 'rejected'\n      // Both subscription and overage are exhausted\n      // Subscription resets based on the exceeded limit, overage resets monthly\n      const endOfMonthExhausted = new Date()\n      endOfMonthExhausted.setMonth(endOfMonthExhausted.getMonth() + 1, 1)\n      endOfMonthExhausted.setHours(0, 0, 0, 0)\n      mockHeaders['anthropic-ratelimit-unified-overage-reset'] = String(\n        Math.floor(endOfMonthExhausted.getTime() / 1000),\n      )\n      break\n    }\n\n    case 'out-of-credits': {\n      // Out of credits - subscription limit hit, overage rejected due to insufficient credits\n      // (wallet is empty)\n      if (exceededLimits.length === 0) {\n        exceededLimits = [{ type: 'five_hour', resetsAt: fiveHoursFromNow }]\n      }\n      updateRepresentativeClaim()\n      mockHeaders['anthropic-ratelimit-unified-status'] = 'rejected'\n      mockHeaders['anthropic-ratelimit-unified-overage-status'] = 'rejected'\n      mockHeaders['anthropic-ratelimit-unified-overage-disabled-reason'] =\n        'out_of_credits'\n      const endOfMonth = new Date()\n      endOfMonth.setMonth(endOfMonth.getMonth() + 1, 1)\n      endOfMonth.setHours(0, 0, 0, 0)\n      mockHeaders['anthropic-ratelimit-unified-overage-reset'] = String(\n        Math.floor(endOfMonth.getTime() / 1000),\n      )\n      break\n    }\n\n    case 'org-zero-credit-limit': {\n      // Org service has zero credit limit - admin set org-level spend cap to $0\n      // Non-admin Team/Enterprise users should not see \"Request extra usage\" option\n      if (exceededLimits.length === 0) {\n        exceededLimits = [{ type: 'five_hour', resetsAt: fiveHoursFromNow }]\n      }\n      updateRepresentativeClaim()\n      mockHeaders['anthropic-ratelimit-unified-status'] = 'rejected'\n      mockHeaders['anthropic-ratelimit-unified-overage-status'] = 'rejected'\n      mockHeaders['anthropic-ratelimit-unified-overage-disabled-reason'] =\n        'org_service_zero_credit_limit'\n      const endOfMonthZero = new Date()\n      endOfMonthZero.setMonth(endOfMonthZero.getMonth() + 1, 1)\n      endOfMonthZero.setHours(0, 0, 0, 0)\n      mockHeaders['anthropic-ratelimit-unified-overage-reset'] = String(\n        Math.floor(endOfMonthZero.getTime() / 1000),\n      )\n      break\n    }\n\n    case 'org-spend-cap-hit': {\n      // Org spend cap hit for the month - org overages temporarily disabled\n      // Non-admin Team/Enterprise users should not see \"Request extra usage\" option\n      if (exceededLimits.length === 0) {\n        exceededLimits = [{ type: 'five_hour', resetsAt: fiveHoursFromNow }]\n      }\n      updateRepresentativeClaim()\n      mockHeaders['anthropic-ratelimit-unified-status'] = 'rejected'\n      mockHeaders['anthropic-ratelimit-unified-overage-status'] = 'rejected'\n      mockHeaders['anthropic-ratelimit-unified-overage-disabled-reason'] =\n        'org_level_disabled_until'\n      const endOfMonthHit = new Date()\n      endOfMonthHit.setMonth(endOfMonthHit.getMonth() + 1, 1)\n      endOfMonthHit.setHours(0, 0, 0, 0)\n      mockHeaders['anthropic-ratelimit-unified-overage-reset'] = String(\n        Math.floor(endOfMonthHit.getTime() / 1000),\n      )\n      break\n    }\n\n    case 'member-zero-credit-limit': {\n      // Member has zero credit limit - admin set this user's individual limit to $0\n      // Non-admin Team/Enterprise users SHOULD see \"Request extra usage\" (admin can allocate more)\n      if (exceededLimits.length === 0) {\n        exceededLimits = [{ type: 'five_hour', resetsAt: fiveHoursFromNow }]\n      }\n      updateRepresentativeClaim()\n      mockHeaders['anthropic-ratelimit-unified-status'] = 'rejected'\n      mockHeaders['anthropic-ratelimit-unified-overage-status'] = 'rejected'\n      mockHeaders['anthropic-ratelimit-unified-overage-disabled-reason'] =\n        'member_zero_credit_limit'\n      const endOfMonthMember = new Date()\n      endOfMonthMember.setMonth(endOfMonthMember.getMonth() + 1, 1)\n      endOfMonthMember.setHours(0, 0, 0, 0)\n      mockHeaders['anthropic-ratelimit-unified-overage-reset'] = String(\n        Math.floor(endOfMonthMember.getTime() / 1000),\n      )\n      break\n    }\n\n    case 'seat-tier-zero-credit-limit': {\n      // Seat tier has zero credit limit - admin set this seat tier's limit to $0\n      // Non-admin Team/Enterprise users SHOULD see \"Request extra usage\" (admin can allocate more)\n      if (exceededLimits.length === 0) {\n        exceededLimits = [{ type: 'five_hour', resetsAt: fiveHoursFromNow }]\n      }\n      updateRepresentativeClaim()\n      mockHeaders['anthropic-ratelimit-unified-status'] = 'rejected'\n      mockHeaders['anthropic-ratelimit-unified-overage-status'] = 'rejected'\n      mockHeaders['anthropic-ratelimit-unified-overage-disabled-reason'] =\n        'seat_tier_zero_credit_limit'\n      const endOfMonthSeatTier = new Date()\n      endOfMonthSeatTier.setMonth(endOfMonthSeatTier.getMonth() + 1, 1)\n      endOfMonthSeatTier.setHours(0, 0, 0, 0)\n      mockHeaders['anthropic-ratelimit-unified-overage-reset'] = String(\n        Math.floor(endOfMonthSeatTier.getTime() / 1000),\n      )\n      break\n    }\n\n    case 'opus-limit': {\n      exceededLimits = [{ type: 'seven_day_opus', resetsAt: sevenDaysFromNow }]\n      updateRepresentativeClaim()\n      // Always send 429 rejected status - the error handler will decide whether\n      // to show an error or return NO_RESPONSE_REQUESTED based on fallback eligibility\n      mockHeaders['anthropic-ratelimit-unified-status'] = 'rejected'\n      break\n    }\n\n    case 'opus-warning': {\n      mockHeaders = {\n        'anthropic-ratelimit-unified-status': 'allowed_warning',\n        'anthropic-ratelimit-unified-reset': String(sevenDaysFromNow),\n        'anthropic-ratelimit-unified-representative-claim': 'seven_day_opus',\n      }\n      break\n    }\n\n    case 'sonnet-limit': {\n      exceededLimits = [\n        { type: 'seven_day_sonnet', resetsAt: sevenDaysFromNow },\n      ]\n      updateRepresentativeClaim()\n      mockHeaders['anthropic-ratelimit-unified-status'] = 'rejected'\n      break\n    }\n\n    case 'sonnet-warning': {\n      mockHeaders = {\n        'anthropic-ratelimit-unified-status': 'allowed_warning',\n        'anthropic-ratelimit-unified-reset': String(sevenDaysFromNow),\n        'anthropic-ratelimit-unified-representative-claim': 'seven_day_sonnet',\n      }\n      break\n    }\n\n    case 'fast-mode-limit': {\n      updateRepresentativeClaim()\n      mockHeaders['anthropic-ratelimit-unified-status'] = 'rejected'\n      // Duration in ms (> 20s threshold to trigger cooldown)\n      mockFastModeRateLimitDurationMs = 10 * 60 * 1000\n      break\n    }\n\n    case 'fast-mode-short-limit': {\n      updateRepresentativeClaim()\n      mockHeaders['anthropic-ratelimit-unified-status'] = 'rejected'\n      // Duration in ms (< 20s threshold, won't trigger cooldown)\n      mockFastModeRateLimitDurationMs = 10 * 1000\n      break\n    }\n\n    case 'extra-usage-required': {\n      // Headerless 429 \u2014 exercises the entitlement-rejection path in errors.ts\n      mockHeaderless429Message =\n        'Extra usage is required for long context requests.'\n      break\n    }\n\n    default:\n      break\n  }\n}\n\nexport function getMockHeaderless429Message(): string | null {\n  if (process.env.USER_TYPE !== 'ant') {\n    return null\n  }\n  // Env var path for -p / SDK testing where slash commands aren't available\n  if (process.env.CLAUDE_MOCK_HEADERLESS_429) {\n    return process.env.CLAUDE_MOCK_HEADERLESS_429\n  }\n  if (!mockEnabled) {\n    return null\n  }\n  return mockHeaderless429Message\n}\n\nexport function getMockHeaders(): MockHeaders | null {\n  if (\n    !mockEnabled ||\n    process.env.USER_TYPE !== 'ant' ||\n    Object.keys(mockHeaders).length === 0\n  ) {\n    return null\n  }\n  return mockHeaders\n}\n\nexport function getMockStatus(): string {\n  if (\n    !mockEnabled ||\n    (Object.keys(mockHeaders).length === 0 && !mockSubscriptionType)\n  ) {\n    return 'No mock headers active (using real limits)'\n  }\n\n  const lines: string[] = []\n  lines.push('Active mock headers:')\n\n  // Show subscription type - either explicitly set or default\n  const effectiveSubscription =\n    mockSubscriptionType || DEFAULT_MOCK_SUBSCRIPTION\n  if (mockSubscriptionType) {\n    lines.push(`  Subscription Type: ${mockSubscriptionType} (explicitly set)`)\n  } else {\n    lines.push(`  Subscription Type: ${effectiveSubscription} (default)`)\n  }\n\n  Object.entries(mockHeaders).forEach(([key, value]) => {\n    if (value !== undefined) {\n      // Format the header name nicely\n      const formattedKey = key\n        .replace('anthropic-ratelimit-unified-', '')\n        .replace(/-/g, ' ')\n        .replace(/\\b\\w/g, c => c.toUpperCase())\n\n      // Format timestamps as human-readable\n      if (key.includes('reset') && value) {\n        const timestamp = Number(value)\n        const date = new Date(timestamp * 1000)\n        lines.push(`  ${formattedKey}: ${value} (${date.toLocaleString()})`)\n      } else {\n        lines.push(`  ${formattedKey}: ${value}`)\n      }\n    }\n  })\n\n  // Show exceeded limits if any\n  if (exceededLimits.length > 0) {\n    lines.push('\\nExceeded limits (contributing to representative claim):')\n    exceededLimits.forEach(limit => {\n      const date = new Date(limit.resetsAt * 1000)\n      lines.push(`  ${limit.type}: resets at ${date.toLocaleString()}`)\n    })\n  }\n\n  return lines.join('\\n')\n}\n\nexport function clearMockHeaders(): void {\n  mockHeaders = {}\n  exceededLimits = []\n  mockSubscriptionType = null\n  mockFastModeRateLimitDurationMs = null\n  mockFastModeRateLimitExpiresAt = null\n  mockHeaderless429Message = null\n  setMockBillingAccessOverride(null)\n  mockEnabled = false\n}\n\nexport function applyMockHeaders(\n  headers: globalThis.Headers,\n): globalThis.Headers {\n  const mock = getMockHeaders()\n  if (!mock) {\n    return headers\n  }\n\n  // Create a new Headers object with original headers\n  // eslint-disable-next-line eslint-plugin-n/no-unsupported-features/node-builtins\n  const newHeaders = new globalThis.Headers(headers)\n\n  // Apply mock headers (overwriting originals)\n  Object.entries(mock).forEach(([key, value]) => {\n    if (value !== undefined) {\n      newHeaders.set(key, value)\n    }\n  })\n\n  return newHeaders\n}\n\n// Check if we should process rate limits even without subscription\n// This is for Ant employees testing with mocks\nexport function shouldProcessMockLimits(): boolean {\n  if (process.env.USER_TYPE !== 'ant') {\n    return false\n  }\n  return mockEnabled || Boolean(process.env.CLAUDE_MOCK_HEADERLESS_429)\n}\n\nexport function getCurrentMockScenario(): MockScenario | null {\n  if (!mockEnabled) {\n    return null\n  }\n\n  // Reverse lookup the scenario from current headers\n  if (!mockHeaders) return null\n\n  const status = mockHeaders['anthropic-ratelimit-unified-status']\n  const overage = mockHeaders['anthropic-ratelimit-unified-overage-status']\n  const claim = mockHeaders['anthropic-ratelimit-unified-representative-claim']\n\n  if (claim === 'seven_day_opus') {\n    return status === 'rejected' ? 'opus-limit' : 'opus-warning'\n  }\n\n  if (claim === 'seven_day_sonnet') {\n    return status === 'rejected' ? 'sonnet-limit' : 'sonnet-warning'\n  }\n\n  if (overage === 'rejected') return 'overage-exhausted'\n  if (overage === 'allowed_warning') return 'overage-warning'\n  if (overage === 'allowed') return 'overage-active'\n\n  if (status === 'rejected') {\n    if (claim === 'five_hour') return 'session-limit-reached'\n    if (claim === 'seven_day') return 'weekly-limit-reached'\n  }\n\n  if (status === 'allowed_warning') {\n    if (claim === 'seven_day') return 'approaching-weekly-limit'\n  }\n\n  if (status === 'allowed') return 'normal'\n\n  return null\n}\n\nexport function getScenarioDescription(scenario: MockScenario): string {\n  switch (scenario) {\n    case 'normal':\n      return 'Normal usage, no limits'\n    case 'session-limit-reached':\n      return 'Session rate limit exceeded'\n    case 'approaching-weekly-limit':\n      return 'Approaching weekly aggregate limit'\n    case 'weekly-limit-reached':\n      return 'Weekly aggregate limit exceeded'\n    case 'overage-active':\n      return 'Using extra usage (overage active)'\n    case 'overage-warning':\n      return 'Approaching extra usage limit'\n    case 'overage-exhausted':\n      return 'Both subscription and extra usage limits exhausted'\n    case 'out-of-credits':\n      return 'Out of extra usage credits (wallet empty)'\n    case 'org-zero-credit-limit':\n      return 'Org spend cap is zero (no extra usage budget)'\n    case 'org-spend-cap-hit':\n      return 'Org spend cap hit for the month'\n    case 'member-zero-credit-limit':\n      return 'Member limit is zero (admin can allocate more)'\n    case 'seat-tier-zero-credit-limit':\n      return 'Seat tier limit is zero (admin can allocate more)'\n    case 'opus-limit':\n      return 'Opus limit reached'\n    case 'opus-warning':\n      return 'Approaching Opus limit'\n    case 'sonnet-limit':\n      return 'Sonnet limit reached'\n    case 'sonnet-warning':\n      return 'Approaching Sonnet limit'\n    case 'fast-mode-limit':\n      return 'Fast mode rate limit'\n    case 'fast-mode-short-limit':\n      return 'Fast mode rate limit (short)'\n    case 'extra-usage-required':\n      return 'Headerless 429: Extra usage required for 1M context'\n    case 'clear':\n      return 'Clear mock headers (use real limits)'\n    default:\n      return 'Unknown scenario'\n  }\n}\n\n// Mock subscription type management\nexport function setMockSubscriptionType(\n  subscriptionType: SubscriptionType | null,\n): void {\n  if (process.env.USER_TYPE !== 'ant') {\n    return\n  }\n  mockEnabled = true\n  mockSubscriptionType = subscriptionType\n}\n\nexport function getMockSubscriptionType(): SubscriptionType | null {\n  if (!mockEnabled || process.env.USER_TYPE !== 'ant') {\n    return null\n  }\n  // Return the explicitly set subscription type, or default to 'max'\n  return mockSubscriptionType || DEFAULT_MOCK_SUBSCRIPTION\n}\n\n// Export a function that checks if we should use mock subscription\nexport function shouldUseMockSubscription(): boolean {\n  return (\n    mockEnabled &&\n    mockSubscriptionType !== null &&\n    process.env.USER_TYPE === 'ant'\n  )\n}\n\n// Mock billing access (admin vs non-admin)\nexport function setMockBillingAccess(hasAccess: boolean | null): void {\n  if (process.env.USER_TYPE !== 'ant') {\n    return\n  }\n  mockEnabled = true\n  setMockBillingAccessOverride(hasAccess)\n}\n\n// Mock fast mode rate limit handling\nexport function isMockFastModeRateLimitScenario(): boolean {\n  return mockFastModeRateLimitDurationMs !== null\n}\n\nexport function checkMockFastModeRateLimit(\n  isFastModeActive?: boolean,\n): MockHeaders | null {\n  if (mockFastModeRateLimitDurationMs === null) {\n    return null\n  }\n\n  // Only throw when fast mode is active\n  if (!isFastModeActive) {\n    return null\n  }\n\n  // Check if the rate limit has expired\n  if (\n    mockFastModeRateLimitExpiresAt !== null &&\n    Date.now() >= mockFastModeRateLimitExpiresAt\n  ) {\n    clearMockHeaders()\n    return null\n  }\n\n  // Set expiry on first error (not when scenario is configured)\n  if (mockFastModeRateLimitExpiresAt === null) {\n    mockFastModeRateLimitExpiresAt =\n      Date.now() + mockFastModeRateLimitDurationMs\n  }\n\n  // Compute dynamic retry-after based on remaining time\n  const remainingMs = mockFastModeRateLimitExpiresAt - Date.now()\n  const headersToSend = { ...mockHeaders }\n  headersToSend['retry-after'] = String(\n    Math.max(1, Math.ceil(remainingMs / 1000)),\n  )\n\n  return headersToSend\n}\n", "import axios from 'axios'\nimport { getOauthConfig, OAUTH_BETA_HEADER } from 'src/constants/oauth.js'\nimport type { OAuthProfileResponse } from 'src/services/oauth/types.js'\nimport { getAnthropicApiKey } from 'src/utils/auth.js'\nimport { getGlobalConfig } from 'src/utils/config.js'\nimport { logError } from 'src/utils/log.js'\nexport async function getOauthProfileFromApiKey(): Promise<\n  OAuthProfileResponse | undefined\n> {\n  // Assumes interactive session\n  const config = getGlobalConfig()\n  const accountUuid = config.oauthAccount?.accountUuid\n  const apiKey = getAnthropicApiKey()\n\n  // Need both account UUID and API key to check\n  if (!accountUuid || !apiKey) {\n    return\n  }\n  const endpoint = `${getOauthConfig().BASE_API_URL}/api/claude_cli_profile`\n  try {\n    const response = await axios.get<OAuthProfileResponse>(endpoint, {\n      headers: {\n        'x-api-key': apiKey,\n        'anthropic-beta': OAUTH_BETA_HEADER,\n      },\n      params: {\n        account_uuid: accountUuid,\n      },\n      timeout: 10000,\n    })\n    return response.data\n  } catch (error) {\n    logError(error as Error)\n  }\n}\n\nexport async function getOauthProfileFromOauthToken(\n  accessToken: string,\n): Promise<OAuthProfileResponse | undefined> {\n  const endpoint = `${getOauthConfig().BASE_API_URL}/api/oauth/profile`\n  try {\n    const response = await axios.get<OAuthProfileResponse>(endpoint, {\n      headers: {\n        Authorization: `Bearer ${accessToken}`,\n        'Content-Type': 'application/json',\n      },\n      timeout: 10000,\n    })\n    return response.data\n  } catch (error) {\n    logError(error as Error)\n  }\n}\n", "// OAuth client for handling authentication flows with Claude services\nimport axios from 'axios'\nimport {\n  type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,\n  logEvent,\n} from 'src/services/analytics/index.js'\nimport {\n  ALL_OAUTH_SCOPES,\n  CLAUDE_AI_INFERENCE_SCOPE,\n  CLAUDE_AI_OAUTH_SCOPES,\n  getOauthConfig,\n} from '../../constants/oauth.js'\nimport {\n  checkAndRefreshOAuthTokenIfNeeded,\n  getClaudeAIOAuthTokens,\n  hasProfileScope,\n  isClaudeAISubscriber,\n  saveApiKey,\n} from '../../utils/auth.js'\nimport type { AccountInfo } from '../../utils/config.js'\nimport { getGlobalConfig, saveGlobalConfig } from '../../utils/config.js'\nimport { logForDebugging } from '../../utils/debug.js'\nimport { getOauthProfileFromOauthToken } from './getOauthProfile.js'\nimport type {\n  BillingType,\n  OAuthProfileResponse,\n  OAuthTokenExchangeResponse,\n  OAuthTokens,\n  RateLimitTier,\n  SubscriptionType,\n  UserRolesResponse,\n} from './types.js'\n\n/**\n * Check if the user has Claude.ai authentication scope\n * @private Only call this if you're OAuth / auth related code!\n */\nexport function shouldUseClaudeAIAuth(scopes: string[] | undefined): boolean {\n  return Boolean(scopes?.includes(CLAUDE_AI_INFERENCE_SCOPE))\n}\n\nexport function parseScopes(scopeString?: string): string[] {\n  return scopeString?.split(' ').filter(Boolean) ?? []\n}\n\nexport function buildAuthUrl({\n  codeChallenge,\n  state,\n  port,\n  isManual,\n  loginWithClaudeAi,\n  inferenceOnly,\n  orgUUID,\n  loginHint,\n  loginMethod,\n}: {\n  codeChallenge: string\n  state: string\n  port: number\n  isManual: boolean\n  loginWithClaudeAi?: boolean\n  inferenceOnly?: boolean\n  orgUUID?: string\n  loginHint?: string\n  loginMethod?: string\n}): string {\n  const authUrlBase = loginWithClaudeAi\n    ? getOauthConfig().CLAUDE_AI_AUTHORIZE_URL\n    : getOauthConfig().CONSOLE_AUTHORIZE_URL\n\n  const authUrl = new URL(authUrlBase)\n  authUrl.searchParams.append('code', 'true') // this tells the login page to show Claude Max upsell\n  authUrl.searchParams.append('client_id', getOauthConfig().CLIENT_ID)\n  authUrl.searchParams.append('response_type', 'code')\n  authUrl.searchParams.append(\n    'redirect_uri',\n    isManual\n      ? getOauthConfig().MANUAL_REDIRECT_URL\n      : `http://localhost:${port}/callback`,\n  )\n  const scopesToUse = inferenceOnly\n    ? [CLAUDE_AI_INFERENCE_SCOPE] // Long-lived inference-only tokens\n    : ALL_OAUTH_SCOPES\n  authUrl.searchParams.append('scope', scopesToUse.join(' '))\n  authUrl.searchParams.append('code_challenge', codeChallenge)\n  authUrl.searchParams.append('code_challenge_method', 'S256')\n  authUrl.searchParams.append('state', state)\n\n  // Add orgUUID as URL param if provided\n  if (orgUUID) {\n    authUrl.searchParams.append('orgUUID', orgUUID)\n  }\n\n  // Pre-populate email on the login form (standard OIDC parameter)\n  if (loginHint) {\n    authUrl.searchParams.append('login_hint', loginHint)\n  }\n\n  // Request a specific login method (e.g. 'sso', 'magic_link', 'google')\n  if (loginMethod) {\n    authUrl.searchParams.append('login_method', loginMethod)\n  }\n\n  return authUrl.toString()\n}\n\nexport async function exchangeCodeForTokens(\n  authorizationCode: string,\n  state: string,\n  codeVerifier: string,\n  port: number,\n  useManualRedirect: boolean = false,\n  expiresIn?: number,\n): Promise<OAuthTokenExchangeResponse> {\n  const requestBody: Record<string, string | number> = {\n    grant_type: 'authorization_code',\n    code: authorizationCode,\n    redirect_uri: useManualRedirect\n      ? getOauthConfig().MANUAL_REDIRECT_URL\n      : `http://localhost:${port}/callback`,\n    client_id: getOauthConfig().CLIENT_ID,\n    code_verifier: codeVerifier,\n    state,\n  }\n\n  if (expiresIn !== undefined) {\n    requestBody.expires_in = expiresIn\n  }\n\n  const response = await axios.post(getOauthConfig().TOKEN_URL, requestBody, {\n    headers: { 'Content-Type': 'application/json' },\n    timeout: 15000,\n  })\n\n  if (response.status !== 200) {\n    throw new Error(\n      response.status === 401\n        ? 'Authentication failed: Invalid authorization code'\n        : `Token exchange failed (${response.status}): ${response.statusText}`,\n    )\n  }\n  logEvent('tengu_oauth_token_exchange_success', {})\n  return response.data\n}\n\nexport async function refreshOAuthToken(\n  refreshToken: string,\n  { scopes: requestedScopes }: { scopes?: string[] } = {},\n): Promise<OAuthTokens> {\n  const requestBody = {\n    grant_type: 'refresh_token',\n    refresh_token: refreshToken,\n    client_id: getOauthConfig().CLIENT_ID,\n    // Request specific scopes, defaulting to the full Claude AI set. The\n    // backend's refresh-token grant allows scope expansion beyond what the\n    // initial authorize granted (see ALLOWED_SCOPE_EXPANSIONS), so this is\n    // safe even for tokens issued before scopes were added to the app's\n    // registered oauth_scope.\n    scope: (requestedScopes?.length\n      ? requestedScopes\n      : CLAUDE_AI_OAUTH_SCOPES\n    ).join(' '),\n  }\n\n  try {\n    const response = await axios.post(getOauthConfig().TOKEN_URL, requestBody, {\n      headers: { 'Content-Type': 'application/json' },\n      timeout: 15000,\n    })\n\n    if (response.status !== 200) {\n      throw new Error(`Token refresh failed: ${response.statusText}`)\n    }\n\n    const data = response.data as OAuthTokenExchangeResponse\n    const {\n      access_token: accessToken,\n      refresh_token: newRefreshToken = refreshToken,\n      expires_in: expiresIn,\n    } = data\n\n    const expiresAt = Date.now() + expiresIn * 1000\n    const scopes = parseScopes(data.scope)\n\n    logEvent('tengu_oauth_token_refresh_success', {})\n\n    // Skip the extra /api/oauth/profile round-trip when we already have both\n    // the global-config profile fields AND the secure-storage subscription data.\n    // Routine refreshes satisfy both, so we cut ~7M req/day fleet-wide.\n    //\n    // Checking secure storage (not just config) matters for the\n    // CLAUDE_CODE_OAUTH_REFRESH_TOKEN re-login path: installOAuthTokens runs\n    // performLogout() AFTER we return, wiping secure storage. If we returned\n    // null for subscriptionType here, saveOAuthTokensIfNeeded would persist\n    // null ?? (wiped) ?? null = null, and every future refresh would see the\n    // config guard fields satisfied and skip again, permanently losing the\n    // subscription type for paying users. By passing through existing values,\n    // the re-login path writes cached ?? wiped ?? null = cached; and if secure\n    // storage was already empty we fall through to the fetch.\n    const config = getGlobalConfig()\n    const existing = getClaudeAIOAuthTokens()\n    const haveProfileAlready =\n      config.oauthAccount?.billingType !== undefined &&\n      config.oauthAccount?.accountCreatedAt !== undefined &&\n      config.oauthAccount?.subscriptionCreatedAt !== undefined &&\n      existing?.subscriptionType != null &&\n      existing?.rateLimitTier != null\n\n    const profileInfo = haveProfileAlready\n      ? null\n      : await fetchProfileInfo(accessToken)\n\n    // Update the stored properties if they have changed\n    if (profileInfo && config.oauthAccount) {\n      const updates: Partial<AccountInfo> = {}\n      if (profileInfo.displayName !== undefined) {\n        updates.displayName = profileInfo.displayName\n      }\n      if (typeof profileInfo.hasExtraUsageEnabled === 'boolean') {\n        updates.hasExtraUsageEnabled = profileInfo.hasExtraUsageEnabled\n      }\n      if (profileInfo.billingType !== null) {\n        updates.billingType = profileInfo.billingType\n      }\n      if (profileInfo.accountCreatedAt !== undefined) {\n        updates.accountCreatedAt = profileInfo.accountCreatedAt\n      }\n      if (profileInfo.subscriptionCreatedAt !== undefined) {\n        updates.subscriptionCreatedAt = profileInfo.subscriptionCreatedAt\n      }\n      if (Object.keys(updates).length > 0) {\n        saveGlobalConfig(current => ({\n          ...current,\n          oauthAccount: current.oauthAccount\n            ? { ...current.oauthAccount, ...updates }\n            : current.oauthAccount,\n        }))\n      }\n    }\n\n    return {\n      accessToken,\n      refreshToken: newRefreshToken,\n      expiresAt,\n      scopes,\n      subscriptionType:\n        profileInfo?.subscriptionType ?? existing?.subscriptionType ?? null,\n      rateLimitTier:\n        profileInfo?.rateLimitTier ?? existing?.rateLimitTier ?? null,\n      profile: profileInfo?.rawProfile,\n      tokenAccount: data.account\n        ? {\n            uuid: data.account.uuid,\n            emailAddress: data.account.email_address,\n            organizationUuid: data.organization?.uuid,\n          }\n        : undefined,\n    }\n  } catch (error) {\n    const responseBody =\n      axios.isAxiosError(error) && error.response?.data\n        ? JSON.stringify(error.response.data)\n        : undefined\n    logEvent('tengu_oauth_token_refresh_failure', {\n      error: (error as Error)\n        .message as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,\n      ...(responseBody && {\n        responseBody:\n          responseBody as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,\n      }),\n    })\n    throw error\n  }\n}\n\nexport async function fetchAndStoreUserRoles(\n  accessToken: string,\n): Promise<void> {\n  const response = await axios.get(getOauthConfig().ROLES_URL, {\n    headers: { Authorization: `Bearer ${accessToken}` },\n  })\n\n  if (response.status !== 200) {\n    throw new Error(`Failed to fetch user roles: ${response.statusText}`)\n  }\n  const data = response.data as UserRolesResponse\n  const config = getGlobalConfig()\n\n  if (!config.oauthAccount) {\n    throw new Error('OAuth account information not found in config')\n  }\n\n  saveGlobalConfig(current => ({\n    ...current,\n    oauthAccount: current.oauthAccount\n      ? {\n          ...current.oauthAccount,\n          organizationRole: data.organization_role,\n          workspaceRole: data.workspace_role,\n          organizationName: data.organization_name,\n        }\n      : current.oauthAccount,\n  }))\n\n  logEvent('tengu_oauth_roles_stored', {\n    org_role:\n      data.organization_role as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,\n  })\n}\n\nexport async function createAndStoreApiKey(\n  accessToken: string,\n): Promise<string | null> {\n  try {\n    const response = await axios.post(getOauthConfig().API_KEY_URL, null, {\n      headers: { Authorization: `Bearer ${accessToken}` },\n    })\n\n    const apiKey = response.data?.raw_key\n    if (apiKey) {\n      await saveApiKey(apiKey)\n      logEvent('tengu_oauth_api_key', {\n        status:\n          'success' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,\n        statusCode: response.status,\n      })\n      return apiKey\n    }\n    return null\n  } catch (error) {\n    logEvent('tengu_oauth_api_key', {\n      status:\n        'failure' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,\n      error: (error instanceof Error\n        ? error.message\n        : String(\n            error,\n          )) as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,\n    })\n    throw error\n  }\n}\n\nexport function isOAuthTokenExpired(expiresAt: number | null): boolean {\n  if (expiresAt === null) {\n    return false\n  }\n\n  const bufferTime = 5 * 60 * 1000\n  const now = Date.now()\n  const expiresWithBuffer = now + bufferTime\n  return expiresWithBuffer >= expiresAt\n}\n\nexport async function fetchProfileInfo(accessToken: string): Promise<{\n  subscriptionType: SubscriptionType | null\n  displayName?: string\n  rateLimitTier: RateLimitTier | null\n  hasExtraUsageEnabled: boolean | null\n  billingType: BillingType | null\n  accountCreatedAt?: string\n  subscriptionCreatedAt?: string\n  rawProfile?: OAuthProfileResponse\n}> {\n  const profile = await getOauthProfileFromOauthToken(accessToken)\n  const orgType = profile?.organization?.organization_type\n\n  // Reuse the logic from fetchSubscriptionType\n  let subscriptionType: SubscriptionType | null = null\n  switch (orgType) {\n    case 'claude_max':\n      subscriptionType = 'max'\n      break\n    case 'claude_pro':\n      subscriptionType = 'pro'\n      break\n    case 'claude_enterprise':\n      subscriptionType = 'enterprise'\n      break\n    case 'claude_team':\n      subscriptionType = 'team'\n      break\n    default:\n      // Return null for unknown organization types\n      subscriptionType = null\n      break\n  }\n\n  const result: {\n    subscriptionType: SubscriptionType | null\n    displayName?: string\n    rateLimitTier: RateLimitTier | null\n    hasExtraUsageEnabled: boolean | null\n    billingType: BillingType | null\n    accountCreatedAt?: string\n    subscriptionCreatedAt?: string\n  } = {\n    subscriptionType,\n    rateLimitTier: profile?.organization?.rate_limit_tier ?? null,\n    hasExtraUsageEnabled:\n      profile?.organization?.has_extra_usage_enabled ?? null,\n    billingType: profile?.organization?.billing_type ?? null,\n  }\n\n  if (profile?.account?.display_name) {\n    result.displayName = profile.account.display_name\n  }\n\n  if (profile?.account?.created_at) {\n    result.accountCreatedAt = profile.account.created_at\n  }\n\n  if (profile?.organization?.subscription_created_at) {\n    result.subscriptionCreatedAt = profile.organization.subscription_created_at\n  }\n\n  logEvent('tengu_oauth_profile_fetch_success', {})\n\n  return { ...result, rawProfile: profile }\n}\n\n/**\n * Gets the organization UUID from the OAuth access token\n * @returns The organization UUID or null if not authenticated\n */\nexport async function getOrganizationUUID(): Promise<string | null> {\n  // Check global config first to avoid unnecessary API call\n  const globalConfig = getGlobalConfig()\n  const orgUUID = globalConfig.oauthAccount?.organizationUuid\n  if (orgUUID) {\n    return orgUUID\n  }\n\n  // Fall back to fetching from profile (requires user:profile scope)\n  const accessToken = getClaudeAIOAuthTokens()?.accessToken\n  if (accessToken === undefined || !hasProfileScope()) {\n    return null\n  }\n  const profile = await getOauthProfileFromOauthToken(accessToken)\n  const profileOrgUUID = profile?.organization?.uuid\n  if (!profileOrgUUID) {\n    return null\n  }\n  return profileOrgUUID\n}\n\n/**\n * Populate the OAuth account info if it has not already been cached in config.\n * @returns Whether or not the oauth account info was populated.\n */\nexport async function populateOAuthAccountInfoIfNeeded(): Promise<boolean> {\n  // Check env vars first (synchronous, no network call needed).\n  // SDK callers like Cowork can provide account info directly, which also\n  // eliminates the race condition where early telemetry events lack account info.\n  // NB: If/when adding additional SDK-relevant functionality requiring _other_ OAuth account properties,\n  // please reach out to #proj-cowork so the team can add additional env var fallbacks.\n  const envAccountUuid = process.env.CLAUDE_CODE_ACCOUNT_UUID\n  const envUserEmail = process.env.CLAUDE_CODE_USER_EMAIL\n  const envOrganizationUuid = process.env.CLAUDE_CODE_ORGANIZATION_UUID\n  const hasEnvVars = Boolean(\n    envAccountUuid && envUserEmail && envOrganizationUuid,\n  )\n  if (envAccountUuid && envUserEmail && envOrganizationUuid) {\n    if (!getGlobalConfig().oauthAccount) {\n      storeOAuthAccountInfo({\n        accountUuid: envAccountUuid,\n        emailAddress: envUserEmail,\n        organizationUuid: envOrganizationUuid,\n      })\n    }\n  }\n\n  // Wait for any in-flight token refresh to complete first, since\n  // refreshOAuthToken already fetches and stores profile info\n  await checkAndRefreshOAuthTokenIfNeeded()\n\n  const config = getGlobalConfig()\n  if (\n    (config.oauthAccount &&\n      config.oauthAccount.billingType !== undefined &&\n      config.oauthAccount.accountCreatedAt !== undefined &&\n      config.oauthAccount.subscriptionCreatedAt !== undefined) ||\n    !isClaudeAISubscriber() ||\n    !hasProfileScope()\n  ) {\n    return false\n  }\n\n  const tokens = getClaudeAIOAuthTokens()\n  if (tokens?.accessToken) {\n    const profile = await getOauthProfileFromOauthToken(tokens.accessToken)\n    if (profile) {\n      if (hasEnvVars) {\n        logForDebugging(\n          'OAuth profile fetch succeeded, overriding env var account info',\n          { level: 'info' },\n        )\n      }\n      storeOAuthAccountInfo({\n        accountUuid: profile.account.uuid,\n        emailAddress: profile.account.email,\n        organizationUuid: profile.organization.uuid,\n        displayName: profile.account.display_name || undefined,\n        hasExtraUsageEnabled:\n          profile.organization.has_extra_usage_enabled ?? false,\n        billingType: profile.organization.billing_type ?? undefined,\n        accountCreatedAt: profile.account.created_at,\n        subscriptionCreatedAt:\n          profile.organization.subscription_created_at ?? undefined,\n      })\n      return true\n    }\n  }\n  return false\n}\n\nexport function storeOAuthAccountInfo({\n  accountUuid,\n  emailAddress,\n  organizationUuid,\n  displayName,\n  hasExtraUsageEnabled,\n  billingType,\n  accountCreatedAt,\n  subscriptionCreatedAt,\n}: {\n  accountUuid: string\n  emailAddress: string\n  organizationUuid: string | undefined\n  displayName?: string\n  hasExtraUsageEnabled?: boolean\n  billingType?: BillingType\n  accountCreatedAt?: string\n  subscriptionCreatedAt?: string\n}): void {\n  const accountInfo: AccountInfo = {\n    accountUuid,\n    emailAddress,\n    organizationUuid,\n    hasExtraUsageEnabled,\n    billingType,\n    accountCreatedAt,\n    subscriptionCreatedAt,\n  }\n  if (displayName) {\n    accountInfo.displayName = displayName\n  }\n  saveGlobalConfig(current => {\n    // For oauthAccount we need to compare content since it's an object\n    if (\n      current.oauthAccount?.accountUuid === accountInfo.accountUuid &&\n      current.oauthAccount?.emailAddress === accountInfo.emailAddress &&\n      current.oauthAccount?.organizationUuid === accountInfo.organizationUuid &&\n      current.oauthAccount?.displayName === accountInfo.displayName &&\n      current.oauthAccount?.hasExtraUsageEnabled ===\n        accountInfo.hasExtraUsageEnabled &&\n      current.oauthAccount?.billingType === accountInfo.billingType &&\n      current.oauthAccount?.accountCreatedAt === accountInfo.accountCreatedAt &&\n      current.oauthAccount?.subscriptionCreatedAt ===\n        accountInfo.subscriptionCreatedAt\n    ) {\n      return current\n    }\n    return { ...current, oauthAccount: accountInfo }\n  })\n}\n", "import { mkdirSync, writeFileSync } from 'fs'\nimport {\n  getApiKeyFromFd,\n  getOauthTokenFromFd,\n  setApiKeyFromFd,\n  setOauthTokenFromFd,\n} from '../bootstrap/state.js'\nimport { logForDebugging } from './debug.js'\nimport { isEnvTruthy } from './envUtils.js'\nimport { errorMessage, isENOENT } from './errors.js'\nimport { getFsImplementation } from './fsOperations.js'\n\n/**\n * Well-known token file locations in CCR. The Go environment-manager creates\n * /home/claude/.claude/remote/ and will (eventually) write these files too.\n * Until then, this module writes them on successful FD read so subprocesses\n * spawned inside the CCR container can find the token without inheriting\n * the FD \u2014 which they can't: pipe FDs don't cross tmux/shell boundaries.\n */\nconst CCR_TOKEN_DIR = '/home/claude/.claude/remote'\nexport const CCR_OAUTH_TOKEN_PATH = `${CCR_TOKEN_DIR}/.oauth_token`\nexport const CCR_API_KEY_PATH = `${CCR_TOKEN_DIR}/.api_key`\nexport const CCR_SESSION_INGRESS_TOKEN_PATH = `${CCR_TOKEN_DIR}/.session_ingress_token`\n\n/**\n * Best-effort write of the token to a well-known location for subprocess\n * access. CCR-gated: outside CCR there's no /home/claude/ and no reason to\n * put a token on disk that the FD was meant to keep off disk.\n */\nexport function maybePersistTokenForSubprocesses(\n  path: string,\n  token: string,\n  tokenName: string,\n): void {\n  if (!isEnvTruthy(process.env.CLAUDE_CODE_REMOTE)) {\n    return\n  }\n  try {\n    // eslint-disable-next-line custom-rules/no-sync-fs -- one-shot startup write in CCR, caller is sync\n    mkdirSync(CCR_TOKEN_DIR, { recursive: true, mode: 0o700 })\n    // eslint-disable-next-line custom-rules/no-sync-fs -- one-shot startup write in CCR, caller is sync\n    writeFileSync(path, token, { encoding: 'utf8', mode: 0o600 })\n    logForDebugging(`Persisted ${tokenName} to ${path} for subprocess access`)\n  } catch (error) {\n    logForDebugging(\n      `Failed to persist ${tokenName} to disk (non-fatal): ${errorMessage(error)}`,\n      { level: 'error' },\n    )\n  }\n}\n\n/**\n * Fallback read from a well-known file. The path only exists in CCR (env-manager\n * creates the directory), so file-not-found is the expected outcome everywhere\n * else \u2014 treated as \"no fallback\", not an error.\n */\nexport function readTokenFromWellKnownFile(\n  path: string,\n  tokenName: string,\n): string | null {\n  try {\n    const fsOps = getFsImplementation()\n    // eslint-disable-next-line custom-rules/no-sync-fs -- fallback read for CCR subprocess path, one-shot at startup, caller is sync\n    const token = fsOps.readFileSync(path, { encoding: 'utf8' }).trim()\n    if (!token) {\n      return null\n    }\n    logForDebugging(`Read ${tokenName} from well-known file ${path}`)\n    return token\n  } catch (error) {\n    // ENOENT is the expected outcome outside CCR \u2014 stay silent. Anything\n    // else (EACCES from perm misconfig, etc.) is worth surfacing in the\n    // debug log so subprocess auth failures aren't mysterious.\n    if (!isENOENT(error)) {\n      logForDebugging(\n        `Failed to read ${tokenName} from ${path}: ${errorMessage(error)}`,\n        { level: 'debug' },\n      )\n    }\n    return null\n  }\n}\n\n/**\n * Shared FD-or-well-known-file credential reader.\n *\n * Priority order:\n *  1. File descriptor (legacy path) \u2014 env var points at a pipe FD passed by\n *     the Go env-manager via cmd.ExtraFiles. Pipe is drained on first read\n *     and doesn't cross exec/tmux boundaries.\n *  2. Well-known file \u2014 written by this function on successful FD read (and\n *     eventually by the env-manager directly). Covers subprocesses that can't\n *     inherit the FD.\n *\n * Returns null if neither source has a credential. Cached in global state.\n */\nfunction getCredentialFromFd({\n  envVar,\n  wellKnownPath,\n  label,\n  getCached,\n  setCached,\n}: {\n  envVar: string\n  wellKnownPath: string\n  label: string\n  getCached: () => string | null | undefined\n  setCached: (value: string | null) => void\n}): string | null {\n  const cached = getCached()\n  if (cached !== undefined) {\n    return cached\n  }\n\n  const fdEnv = process.env[envVar]\n  if (!fdEnv) {\n    // No FD env var \u2014 either we're not in CCR, or we're a subprocess whose\n    // parent stripped the (useless) FD env var. Try the well-known file.\n    const fromFile = readTokenFromWellKnownFile(wellKnownPath, label)\n    setCached(fromFile)\n    return fromFile\n  }\n\n  const fd = parseInt(fdEnv, 10)\n  if (Number.isNaN(fd)) {\n    logForDebugging(\n      `${envVar} must be a valid file descriptor number, got: ${fdEnv}`,\n      { level: 'error' },\n    )\n    setCached(null)\n    return null\n  }\n\n  try {\n    // Use /dev/fd on macOS/BSD, /proc/self/fd on Linux\n    const fsOps = getFsImplementation()\n    const fdPath =\n      process.platform === 'darwin' || process.platform === 'freebsd'\n        ? `/dev/fd/${fd}`\n        : `/proc/self/fd/${fd}`\n\n    // eslint-disable-next-line custom-rules/no-sync-fs -- legacy FD path, read once at startup, caller is sync\n    const token = fsOps.readFileSync(fdPath, { encoding: 'utf8' }).trim()\n    if (!token) {\n      logForDebugging(`File descriptor contained empty ${label}`, {\n        level: 'error',\n      })\n      setCached(null)\n      return null\n    }\n    logForDebugging(`Successfully read ${label} from file descriptor ${fd}`)\n    setCached(token)\n    maybePersistTokenForSubprocesses(wellKnownPath, token, label)\n    return token\n  } catch (error) {\n    logForDebugging(\n      `Failed to read ${label} from file descriptor ${fd}: ${errorMessage(error)}`,\n      { level: 'error' },\n    )\n    // FD env var was set but read failed \u2014 typically a subprocess that\n    // inherited the env var but not the FD (ENXIO). Try the well-known file.\n    const fromFile = readTokenFromWellKnownFile(wellKnownPath, label)\n    setCached(fromFile)\n    return fromFile\n  }\n}\n\n/**\n * Get the CCR-injected OAuth token. See getCredentialFromFd for FD-vs-disk\n * rationale. Env var: CLAUDE_CODE_OAUTH_TOKEN_FILE_DESCRIPTOR.\n * Well-known file: /home/claude/.claude/remote/.oauth_token.\n */\nexport function getOAuthTokenFromFileDescriptor(): string | null {\n  return getCredentialFromFd({\n    envVar: 'CLAUDE_CODE_OAUTH_TOKEN_FILE_DESCRIPTOR',\n    wellKnownPath: CCR_OAUTH_TOKEN_PATH,\n    label: 'OAuth token',\n    getCached: getOauthTokenFromFd,\n    setCached: setOauthTokenFromFd,\n  })\n}\n\n/**\n * Get the CCR-injected API key. See getCredentialFromFd for FD-vs-disk\n * rationale. Env var: CLAUDE_CODE_API_KEY_FILE_DESCRIPTOR.\n * Well-known file: /home/claude/.claude/remote/.api_key.\n */\nexport function getApiKeyFromFileDescriptor(): string | null {\n  return getCredentialFromFd({\n    envVar: 'CLAUDE_CODE_API_KEY_FILE_DESCRIPTOR',\n    wellKnownPath: CCR_API_KEY_PATH,\n    label: 'API key',\n    getCached: getApiKeyFromFd,\n    setCached: setApiKeyFromFd,\n  })\n}\n", "/**\n * Lightweight helpers shared between keychainPrefetch.ts and\n * macOsKeychainStorage.ts.\n *\n * This module MUST NOT import execa, execFileNoThrow, or\n * execFileNoThrowPortable. keychainPrefetch.ts fires at the very top of\n * main.tsx (before the ~65ms of module evaluation it parallelizes), and Bun's\n * __esm wrapper evaluates the ENTIRE module when any symbol is accessed \u2014\n * so a heavy transitive import here defeats the prefetch. The execa \u2192\n * human-signals \u2192 cross-spawn chain alone is ~58ms of synchronous init.\n *\n * The imports below (envUtils, oauth constants, crypto, os) are already\n * evaluated by startupProfiler.ts at main.tsx:5, so they add no module-init\n * cost when keychainPrefetch.ts pulls this file in.\n */\n\nimport { createHash } from 'crypto'\nimport { userInfo } from 'os'\nimport { getOauthConfig } from 'src/constants/oauth.js'\nimport { getClaudeConfigHomeDir } from '../envUtils.js'\nimport type { SecureStorageData } from './types.js'\n\n// Suffix distinguishing the OAuth credentials keychain entry from the legacy\n// API key entry (which uses no suffix). Both share the service name base.\n// DO NOT change this value \u2014 it's part of the keychain lookup key and would\n// orphan existing stored credentials.\nexport const CREDENTIALS_SERVICE_SUFFIX = '-credentials'\n\nexport function getMacOsKeychainStorageServiceName(\n  serviceSuffix: string = '',\n): string {\n  const configDir = getClaudeConfigHomeDir()\n  const isDefaultDir = !process.env.CLAUDE_CONFIG_DIR\n\n  // Use a hash of the config dir path to create a unique but stable suffix\n  // Only add suffix for non-default directories to maintain backwards compatibility\n  const dirHash = isDefaultDir\n    ? ''\n    : `-${createHash('sha256').update(configDir).digest('hex').substring(0, 8)}`\n  return `Tau${getOauthConfig().OAUTH_FILE_SUFFIX}${serviceSuffix}${dirHash}`\n}\n\nexport function getUsername(): string {\n  try {\n    return process.env.USER || userInfo().username\n  } catch {\n    return 'claude-code-user'\n  }\n}\n\n// --\n\n// Cache for keychain reads to avoid repeated expensive security CLI calls.\n// TTL bounds staleness for cross-process scenarios (another CC instance\n// refreshing/invalidating tokens) without forcing a blocking spawnSync on\n// every read. In-process writes invalidate via clearKeychainCache() directly.\n//\n// The sync read() path takes ~500ms per `security` spawn. With 50+ claude.ai\n// MCP connectors authenticating at startup, a short TTL expires mid-storm and\n// triggers repeat sync reads \u2014 observed as a 5.5s event-loop stall\n// (go/ccshare/adamj-20260326-212235). 30s of cross-process staleness is fine:\n// OAuth tokens expire in hours, and the only cross-process writer is another\n// CC instance's /login or refresh.\n//\n// Lives here (not in macOsKeychainStorage.ts) so keychainPrefetch.ts can\n// prime it without pulling in execa. Wrapped in an object because ES module\n// `let` bindings aren't writable across module boundaries \u2014 both this file\n// and macOsKeychainStorage.ts need to mutate all three fields.\nexport const KEYCHAIN_CACHE_TTL_MS = 30_000\n\nexport const keychainCacheState: {\n  cache: { data: SecureStorageData | null; cachedAt: number } // cachedAt 0 = invalid\n  // Incremented on every cache invalidation. readAsync() captures this before\n  // spawning and skips its cache write if a newer generation exists, preventing\n  // a stale subprocess result from overwriting fresh data written by update().\n  generation: number\n  // Deduplicates concurrent readAsync() calls so TTL expiry under load spawns\n  // one subprocess, not N. Cleared on invalidation so fresh reads don't join\n  // a stale in-flight promise.\n  readInFlight: Promise<SecureStorageData | null> | null\n} = {\n  cache: { data: null, cachedAt: 0 },\n  generation: 0,\n  readInFlight: null,\n}\n\nexport function clearKeychainCache(): void {\n  keychainCacheState.cache = { data: null, cachedAt: 0 }\n  keychainCacheState.generation++\n  keychainCacheState.readInFlight = null\n}\n\n/**\n * Prime the keychain cache from a prefetch result (keychainPrefetch.ts).\n * Only writes if the cache hasn't been touched yet \u2014 if sync read() or\n * update() already ran, their result is authoritative and we discard this.\n */\nexport function primeKeychainCacheFromPrefetch(stdout: string | null): void {\n  if (keychainCacheState.cache.cachedAt !== 0) return\n  let data: SecureStorageData | null = null\n  if (stdout) {\n    try {\n      // eslint-disable-next-line custom-rules/no-direct-json-operations -- jsonParse() pulls slowOperations (lodash-es/cloneDeep) into the early-startup import chain; see file header\n      data = JSON.parse(stdout)\n    } catch {\n      // malformed prefetch result \u2014 let sync read() re-fetch\n      return\n    }\n  }\n  keychainCacheState.cache = { data, cachedAt: Date.now() }\n}\n", "import { execa } from 'execa'\nimport { getMacOsKeychainStorageServiceName } from 'src/utils/secureStorage/macOsKeychainHelpers.js'\n\nexport async function maybeRemoveApiKeyFromMacOSKeychainThrows(): Promise<void> {\n  if (process.platform === 'darwin') {\n    const storageServiceName = getMacOsKeychainStorageServiceName()\n    const result = await execa(\n      `security delete-generic-password -a $USER -s \"${storageServiceName}\"`,\n      { shell: true, reject: false },\n    )\n    if (result.exitCode !== 0) {\n      throw new Error('Failed to delete keychain entry')\n    }\n  }\n}\n\nexport function normalizeApiKeyForConfig(apiKey: string): string {\n  return apiKey.slice(-20)\n}\n", "import { logForDebugging } from './debug.js'\n\n/** AWS short-term credentials format. */\nexport type AwsCredentials = {\n  AccessKeyId: string\n  SecretAccessKey: string\n  SessionToken: string\n  Expiration?: string\n}\n\n/** Output from `aws sts get-session-token` or `aws sts assume-role`. */\nexport type AwsStsOutput = {\n  Credentials: AwsCredentials\n}\n\ntype AwsError = {\n  name: string\n}\n\nexport function isAwsCredentialsProviderError(err: unknown) {\n  return (err as AwsError | undefined)?.name === 'CredentialsProviderError'\n}\n\n/** Typeguard to validate AWS STS assume-role output */\nexport function isValidAwsStsOutput(obj: unknown): obj is AwsStsOutput {\n  if (!obj || typeof obj !== 'object') {\n    return false\n  }\n\n  const output = obj as Record<string, unknown>\n\n  // Check if Credentials exists and has required fields\n  if (!output.Credentials || typeof output.Credentials !== 'object') {\n    return false\n  }\n\n  const credentials = output.Credentials as Record<string, unknown>\n\n  return (\n    typeof credentials.AccessKeyId === 'string' &&\n    typeof credentials.SecretAccessKey === 'string' &&\n    typeof credentials.SessionToken === 'string' &&\n    credentials.AccessKeyId.length > 0 &&\n    credentials.SecretAccessKey.length > 0 &&\n    credentials.SessionToken.length > 0\n  )\n}\n\n/** Throws if STS caller identity cannot be retrieved. */\nexport async function checkStsCallerIdentity(): Promise<void> {\n  const { STSClient, GetCallerIdentityCommand } = await import(\n    '@aws-sdk/client-sts'\n  )\n  await new STSClient().send(new GetCallerIdentityCommand({}))\n}\n\n/**\n * Clear AWS credential provider cache by forcing a refresh\n * This ensures that any changes to ~/.aws/credentials are picked up immediately\n */\nexport async function clearAwsIniCache(): Promise<void> {\n  try {\n    logForDebugging('Clearing AWS credential provider cache')\n    const { fromIni } = await import('@aws-sdk/credential-providers')\n    const iniProvider = fromIni({ ignoreCache: true })\n    await iniProvider() // This updates the global file cache\n    logForDebugging('AWS credential provider cache refreshed')\n  } catch (_error) {\n    // Ignore errors - we're just clearing the cache\n    logForDebugging(\n      'Failed to clear AWS credential cache (this is expected if no credentials are configured)',\n    )\n  }\n}\n", "/**\n * Singleton manager for cloud-provider authentication status (AWS Bedrock,\n * GCP Vertex). Communicates auth refresh state between auth utilities and\n * React components / SDK output. The SDK 'auth_status' message shape is\n * provider-agnostic, so a single manager serves all providers.\n *\n * Legacy name: originally AWS-only; now used by all cloud auth refresh flows.\n */\n\nimport { createSignal } from './signal.js'\n\nexport type AwsAuthStatus = {\n  isAuthenticating: boolean\n  output: string[]\n  error?: string\n}\n\nexport class AwsAuthStatusManager {\n  private static instance: AwsAuthStatusManager | null = null\n  private status: AwsAuthStatus = {\n    isAuthenticating: false,\n    output: [],\n  }\n  private changed = createSignal<[status: AwsAuthStatus]>()\n\n  static getInstance(): AwsAuthStatusManager {\n    if (!AwsAuthStatusManager.instance) {\n      AwsAuthStatusManager.instance = new AwsAuthStatusManager()\n    }\n    return AwsAuthStatusManager.instance\n  }\n\n  getStatus(): AwsAuthStatus {\n    return {\n      ...this.status,\n      output: [...this.status.output],\n    }\n  }\n\n  startAuthentication(): void {\n    this.status = {\n      isAuthenticating: true,\n      output: [],\n    }\n    this.changed.emit(this.getStatus())\n  }\n\n  addOutput(line: string): void {\n    this.status.output.push(line)\n    this.changed.emit(this.getStatus())\n  }\n\n  setError(error: string): void {\n    this.status.error = error\n    this.changed.emit(this.getStatus())\n  }\n\n  endAuthentication(success: boolean): void {\n    if (success) {\n      // Clear the status completely on success\n      this.status = {\n        isAuthenticating: false,\n        output: [],\n      }\n    } else {\n      // Keep the output visible on failure\n      this.status.isAuthenticating = false\n    }\n    this.changed.emit(this.getStatus())\n  }\n\n  subscribe = this.changed.subscribe\n\n  // Clean up for testing\n  static reset(): void {\n    if (AwsAuthStatusManager.instance) {\n      AwsAuthStatusManager.instance.changed.clear()\n      AwsAuthStatusManager.instance = null\n    }\n  }\n}\n", "import memoize from 'lodash-es/memoize.js'\nimport { getAPIProvider } from './providers.js'\n\nexport type ModelCapabilityOverride =\n  | 'effort'\n  | 'max_effort'\n  | 'thinking'\n  | 'adaptive_thinking'\n  | 'interleaved_thinking'\n\nconst TIERS = [\n  {\n    modelEnvVar: 'ANTHROPIC_DEFAULT_OPUS_MODEL',\n    capabilitiesEnvVar: 'ANTHROPIC_DEFAULT_OPUS_MODEL_SUPPORTED_CAPABILITIES',\n  },\n  {\n    modelEnvVar: 'ANTHROPIC_DEFAULT_SONNET_MODEL',\n    capabilitiesEnvVar: 'ANTHROPIC_DEFAULT_SONNET_MODEL_SUPPORTED_CAPABILITIES',\n  },\n  {\n    modelEnvVar: 'ANTHROPIC_DEFAULT_HAIKU_MODEL',\n    capabilitiesEnvVar: 'ANTHROPIC_DEFAULT_HAIKU_MODEL_SUPPORTED_CAPABILITIES',\n  },\n] as const\n\n/**\n * Check whether a 3p model capability override is set for a model that matches one of\n * the pinned ANTHROPIC_DEFAULT_*_MODEL env vars.\n */\nexport const get3PModelCapabilityOverride = memoize(\n  (model: string, capability: ModelCapabilityOverride): boolean | undefined => {\n    if (getAPIProvider() === 'firstParty') {\n      return undefined\n    }\n    const m = model.toLowerCase()\n    for (const tier of TIERS) {\n      const pinned = process.env[tier.modelEnvVar]\n      const capabilities = process.env[tier.capabilitiesEnvVar]\n      if (!pinned || capabilities === undefined) continue\n      if (m !== pinned.toLowerCase()) continue\n      return capabilities\n        .toLowerCase()\n        .split(',')\n        .map(s => s.trim())\n        .includes(capability)\n    }\n    return undefined\n  },\n  (model, capability) => `${model.toLowerCase()}:${capability}`,\n)\n", "import { feature } from 'bun:bundle'\nimport memoize from 'lodash-es/memoize.js'\nimport {\n  checkStatsigFeatureGate_CACHED_MAY_BE_STALE,\n  getFeatureValue_CACHED_MAY_BE_STALE,\n} from 'src/services/analytics/growthbook.js'\nimport { getIsNonInteractiveSession, getSdkBetas } from '../bootstrap/state.js'\nimport {\n  BEDROCK_EXTRA_PARAMS_HEADERS,\n  CLAUDE_CODE_20250219_BETA_HEADER,\n  CLI_INTERNAL_BETA_HEADER,\n  CONTEXT_1M_BETA_HEADER,\n  CONTEXT_MANAGEMENT_BETA_HEADER,\n  INTERLEAVED_THINKING_BETA_HEADER,\n  PROMPT_CACHING_SCOPE_BETA_HEADER,\n  REDACT_THINKING_BETA_HEADER,\n  STRUCTURED_OUTPUTS_BETA_HEADER,\n  SUMMARIZE_CONNECTOR_TEXT_BETA_HEADER,\n  TOKEN_EFFICIENT_TOOLS_BETA_HEADER,\n  TOOL_SEARCH_BETA_HEADER_1P,\n  TOOL_SEARCH_BETA_HEADER_3P,\n  WEB_SEARCH_BETA_HEADER,\n} from '../constants/betas.js'\nimport { OAUTH_BETA_HEADER } from '../constants/oauth.js'\nimport { isClaudeAISubscriber } from './auth.js'\nimport { has1mContext } from './context.js'\nimport { isEnvDefinedFalsy, isEnvTruthy } from './envUtils.js'\nimport { getCanonicalName } from './model/model.js'\nimport { get3PModelCapabilityOverride } from './model/modelSupportOverrides.js'\nimport { getAPIProvider } from './model/providers.js'\nimport { getInitialSettings } from './settings/settings.js'\n\n/**\n * SDK-provided betas that are allowed for API key users.\n * Only betas in this list can be passed via SDK options.\n */\nconst ALLOWED_SDK_BETAS = [CONTEXT_1M_BETA_HEADER]\n\n/**\n * Filter betas to only include those in the allowlist.\n * Returns allowed and disallowed betas separately.\n */\nfunction partitionBetasByAllowlist(betas: string[]): {\n  allowed: string[]\n  disallowed: string[]\n} {\n  const allowed: string[] = []\n  const disallowed: string[] = []\n  for (const beta of betas) {\n    if (ALLOWED_SDK_BETAS.includes(beta)) {\n      allowed.push(beta)\n    } else {\n      disallowed.push(beta)\n    }\n  }\n  return { allowed, disallowed }\n}\n\n/**\n * Filter SDK betas to only include allowed ones.\n * Warns about disallowed betas and subscriber restrictions.\n * Returns undefined if no valid betas remain or if user is a subscriber.\n */\nexport function filterAllowedSdkBetas(\n  sdkBetas: string[] | undefined,\n): string[] | undefined {\n  if (!sdkBetas || sdkBetas.length === 0) {\n    return undefined\n  }\n\n  if (isClaudeAISubscriber()) {\n    // biome-ignore lint/suspicious/noConsole: intentional warning\n    console.warn(\n      'Warning: Custom betas are only available for API key users. Ignoring provided betas.',\n    )\n    return undefined\n  }\n\n  const { allowed, disallowed } = partitionBetasByAllowlist(sdkBetas)\n  for (const beta of disallowed) {\n    // biome-ignore lint/suspicious/noConsole: intentional warning\n    console.warn(\n      `Warning: Beta header '${beta}' is not allowed. Only the following betas are supported: ${ALLOWED_SDK_BETAS.join(', ')}`,\n    )\n  }\n  return allowed.length > 0 ? allowed : undefined\n}\n\n// Generally, foundry supports all 1P features;\n// however out of an abundance of caution, we do not enable any which are behind an experiment\n\nexport function modelSupportsISP(model: string): boolean {\n  const supported3P = get3PModelCapabilityOverride(\n    model,\n    'interleaved_thinking',\n  )\n  if (supported3P !== undefined) {\n    return supported3P\n  }\n  const canonical = getCanonicalName(model)\n  const provider = getAPIProvider()\n  // Foundry supports interleaved thinking for all models\n  if (provider === 'foundry') {\n    return true\n  }\n  if (provider === 'firstParty') {\n    return !canonical.includes('claude-3-')\n  }\n  return (\n    canonical.includes('claude-opus-4') || canonical.includes('claude-sonnet-4')\n  )\n}\n\nfunction vertexModelSupportsWebSearch(model: string): boolean {\n  const canonical = getCanonicalName(model)\n  // Web search only supported on Claude 4.0+ models on Vertex\n  return (\n    canonical.includes('claude-opus-4') ||\n    canonical.includes('claude-sonnet-4') ||\n    canonical.includes('claude-haiku-4')\n  )\n}\n\n// Context management is supported on Claude 4+ models\nexport function modelSupportsContextManagement(model: string): boolean {\n  const canonical = getCanonicalName(model)\n  const provider = getAPIProvider()\n  if (provider === 'foundry') {\n    return true\n  }\n  if (provider === 'firstParty') {\n    return !canonical.includes('claude-3-')\n  }\n  return (\n    canonical.includes('claude-opus-4') ||\n    canonical.includes('claude-sonnet-4') ||\n    canonical.includes('claude-haiku-4')\n  )\n}\n\n// @[MODEL LAUNCH]: Add the new model ID to this list if it supports structured outputs.\nexport function modelSupportsStructuredOutputs(model: string): boolean {\n  const canonical = getCanonicalName(model)\n  const provider = getAPIProvider()\n  // Structured outputs only supported on firstParty and Foundry (not Bedrock/Vertex yet)\n  if (provider !== 'firstParty' && provider !== 'foundry') {\n    return false\n  }\n  return (\n    canonical.includes('claude-sonnet-4-6') ||\n    canonical.includes('claude-sonnet-4-5') ||\n    canonical.includes('claude-opus-4-1') ||\n    canonical.includes('claude-opus-4-5') ||\n    canonical.includes('claude-opus-4-8') ||\n    canonical.includes('claude-opus-4-7') ||\n    canonical.includes('claude-opus-4-6') ||\n    canonical.includes('claude-haiku-4-5')\n  )\n}\n\n// @[MODEL LAUNCH]: Add the new model if it supports auto mode (specifically PI probes) \u2014 ask in #proj-claude-code-safety-research.\nexport function modelSupportsAutoMode(model: string): boolean {\n  if (feature('TRANSCRIPT_CLASSIFIER')) {\n    const m = getCanonicalName(model)\n    // External: firstParty-only at launch (PI probes not wired for\n    // Bedrock/Vertex/Foundry yet). Checked before allowModels so the GB\n    // override can't enable auto mode on unsupported providers.\n    if (process.env.USER_TYPE !== 'ant' && getAPIProvider() !== 'firstParty') {\n      return false\n    }\n    // GrowthBook override: tengu_auto_mode_config.allowModels force-enables\n    // auto mode for listed models, bypassing the denylist/allowlist below.\n    // Exact model IDs (e.g. \"claude-strudel-v6-p\") match only that model;\n    // canonical names (e.g. \"claude-strudel\") match the whole family.\n    const config = getFeatureValue_CACHED_MAY_BE_STALE<{\n      allowModels?: string[]\n    }>('tengu_auto_mode_config', {})\n    const rawLower = model.toLowerCase()\n    if (\n      config?.allowModels?.some(\n        am => am.toLowerCase() === rawLower || am.toLowerCase() === m,\n      )\n    ) {\n      return true\n    }\n    if (process.env.USER_TYPE === 'ant') {\n      // Denylist: block known-unsupported claude models, allow everything else (ant-internal models etc.)\n      if (m.includes('claude-3-')) return false\n      // claude-*-4 not followed by -[6-9]: blocks bare -4, -4-YYYYMMDD, -4@, -4-0 thru -4-5\n      if (/claude-(opus|sonnet|haiku)-4(?!-[6-9])/.test(m)) return false\n      return true\n    }\n    // External allowlist (firstParty already checked above).\n    return /^claude-(opus|sonnet)-4-6/.test(m)\n  }\n  return false\n}\n\n/**\n * Get the correct tool search beta header for the current API provider.\n * - Claude API / Foundry: advanced-tool-use-2025-11-20\n * - Vertex AI / Bedrock: tool-search-tool-2025-10-19\n */\nexport function getToolSearchBetaHeader(): string {\n  const provider = getAPIProvider()\n  if (provider === 'vertex' || provider === 'bedrock') {\n    return TOOL_SEARCH_BETA_HEADER_3P\n  }\n  return TOOL_SEARCH_BETA_HEADER_1P\n}\n\n/**\n * Check if experimental betas should be included.\n * These are betas that are only available on firstParty provider\n * and may not be supported by proxies or other providers.\n */\nexport function shouldIncludeFirstPartyOnlyBetas(): boolean {\n  return (\n    (getAPIProvider() === 'firstParty' || getAPIProvider() === 'foundry') &&\n    !isEnvTruthy(process.env.CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS)\n  )\n}\n\n/**\n * Global-scope prompt caching is firstParty only. Foundry is excluded because\n * GrowthBook never bucketed Foundry users into the rollout experiment \u2014 the\n * treatment data is firstParty-only.\n */\nexport function shouldUseGlobalCacheScope(): boolean {\n  return (\n    getAPIProvider() === 'firstParty' &&\n    !isEnvTruthy(process.env.CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS)\n  )\n}\n\nexport const getAllModelBetas = memoize((model: string): string[] => {\n  const betaHeaders = []\n  const isHaiku = getCanonicalName(model).includes('haiku')\n  const provider = getAPIProvider()\n  const includeFirstPartyOnlyBetas = shouldIncludeFirstPartyOnlyBetas()\n\n  if (!isHaiku) {\n    betaHeaders.push(CLAUDE_CODE_20250219_BETA_HEADER)\n    if (\n      process.env.USER_TYPE === 'ant' &&\n      process.env.CLAUDE_CODE_ENTRYPOINT === 'cli'\n    ) {\n      if (CLI_INTERNAL_BETA_HEADER) {\n        betaHeaders.push(CLI_INTERNAL_BETA_HEADER)\n      }\n    }\n  }\n  if (isClaudeAISubscriber()) {\n    betaHeaders.push(OAUTH_BETA_HEADER)\n  }\n  if (has1mContext(model)) {\n    betaHeaders.push(CONTEXT_1M_BETA_HEADER)\n  }\n  if (\n    !isEnvTruthy(process.env.DISABLE_INTERLEAVED_THINKING) &&\n    modelSupportsISP(model)\n  ) {\n    betaHeaders.push(INTERLEAVED_THINKING_BETA_HEADER)\n  }\n\n  // Skip the API-side Haiku thinking summarizer \u2014 the summary is only used\n  // for ctrl+o display, which interactive users rarely open. The API returns\n  // redacted_thinking blocks instead; AssistantRedactedThinkingMessage already\n  // renders those as a stub. SDK / print-mode keep summaries because callers\n  // may iterate over thinking content. Users can opt back in via settings.json\n  // showThinkingSummaries.\n  if (\n    includeFirstPartyOnlyBetas &&\n    modelSupportsISP(model) &&\n    !getIsNonInteractiveSession() &&\n    getInitialSettings().showThinkingSummaries !== true\n  ) {\n    betaHeaders.push(REDACT_THINKING_BETA_HEADER)\n  }\n\n  // POC: server-side connector-text summarization (anti-distillation). The\n  // API buffers assistant text between tool calls, summarizes it, and returns\n  // the summary with a signature so the original can be restored on subsequent\n  // turns \u2014 same mechanism as thinking blocks. Ant-only while we measure\n  // TTFT/TTLT/capacity; betas already flow to tengu_api_success for splitting.\n  // Backend independently requires Capability.ANTHROPIC_INTERNAL_RESEARCH.\n  //\n  // USE_CONNECTOR_TEXT_SUMMARIZATION is tri-state: =1 forces on (opt-in even\n  // if GB is off), =0 forces off (opt-out of a GB rollout you were bucketed\n  // into), unset defers to GB.\n  if (\n    SUMMARIZE_CONNECTOR_TEXT_BETA_HEADER &&\n    process.env.USER_TYPE === 'ant' &&\n    includeFirstPartyOnlyBetas &&\n    !isEnvDefinedFalsy(process.env.USE_CONNECTOR_TEXT_SUMMARIZATION) &&\n    (isEnvTruthy(process.env.USE_CONNECTOR_TEXT_SUMMARIZATION) ||\n      getFeatureValue_CACHED_MAY_BE_STALE('tengu_slate_prism', false))\n  ) {\n    betaHeaders.push(SUMMARIZE_CONNECTOR_TEXT_BETA_HEADER)\n  }\n\n  // Add context management beta for tool clearing (ant opt-in) or thinking preservation\n  const antOptedIntoToolClearing =\n    isEnvTruthy(process.env.USE_API_CONTEXT_MANAGEMENT) &&\n    process.env.USER_TYPE === 'ant'\n\n  const thinkingPreservationEnabled = modelSupportsContextManagement(model)\n\n  if (\n    shouldIncludeFirstPartyOnlyBetas() &&\n    (antOptedIntoToolClearing || thinkingPreservationEnabled)\n  ) {\n    betaHeaders.push(CONTEXT_MANAGEMENT_BETA_HEADER)\n  }\n  // Add strict tool use beta if experiment is enabled.\n  // Gate on includeFirstPartyOnlyBetas: CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS\n  // already strips schema.strict from tool bodies at api.ts's choke point, but\n  // this header was escaping that kill switch. Proxy gateways that look like\n  // firstParty but forward to Vertex reject this header with 400.\n  // github.com/deshaw/anthropic-issues/issues/5\n  const strictToolsEnabled =\n    checkStatsigFeatureGate_CACHED_MAY_BE_STALE('tengu_tool_pear')\n  // 3P default: false. API rejects strict + token-efficient-tools together\n  // (tool_use.py:139), so these are mutually exclusive \u2014 strict wins.\n  const tokenEfficientToolsEnabled =\n    !strictToolsEnabled &&\n    getFeatureValue_CACHED_MAY_BE_STALE('tengu_amber_json_tools', false)\n  if (\n    includeFirstPartyOnlyBetas &&\n    modelSupportsStructuredOutputs(model) &&\n    strictToolsEnabled\n  ) {\n    betaHeaders.push(STRUCTURED_OUTPUTS_BETA_HEADER)\n  }\n  // JSON tool_use format (FC v3) \u2014 ~4.5% output token reduction vs ANTML.\n  // Sends the v2 header (2026-03-28) added in anthropics/anthropic#337072 to\n  // isolate the CC A/B cohort from ~9.2M/week existing v1 senders. Ant-only\n  // while the restored JsonToolUseOutputParser soaks.\n  if (\n    process.env.USER_TYPE === 'ant' &&\n    includeFirstPartyOnlyBetas &&\n    tokenEfficientToolsEnabled\n  ) {\n    betaHeaders.push(TOKEN_EFFICIENT_TOOLS_BETA_HEADER)\n  }\n\n  // Add web search beta for Vertex Claude 4.0+ models only\n  if (provider === 'vertex' && vertexModelSupportsWebSearch(model)) {\n    betaHeaders.push(WEB_SEARCH_BETA_HEADER)\n  }\n  // Foundry only ships models that already support Web Search\n  if (provider === 'foundry') {\n    betaHeaders.push(WEB_SEARCH_BETA_HEADER)\n  }\n\n  // Always send the beta header for 1P. The header is a no-op without a scope field.\n  if (includeFirstPartyOnlyBetas) {\n    betaHeaders.push(PROMPT_CACHING_SCOPE_BETA_HEADER)\n  }\n\n  // If ANTHROPIC_BETAS is set, split it by commas and add to betaHeaders.\n  // This is an explicit user opt-in, so honor it regardless of model.\n  if (process.env.ANTHROPIC_BETAS) {\n    betaHeaders.push(\n      ...process.env.ANTHROPIC_BETAS.split(',')\n        .map(_ => _.trim())\n        .filter(Boolean),\n    )\n  }\n  return betaHeaders\n})\n\nexport const getModelBetas = memoize((model: string): string[] => {\n  const modelBetas = getAllModelBetas(model)\n  if (getAPIProvider() === 'bedrock') {\n    return modelBetas.filter(b => !BEDROCK_EXTRA_PARAMS_HEADERS.has(b))\n  }\n  return modelBetas\n})\n\nexport const getBedrockExtraBodyParamsBetas = memoize(\n  (model: string): string[] => {\n    const modelBetas = getAllModelBetas(model)\n    return modelBetas.filter(b => BEDROCK_EXTRA_PARAMS_HEADERS.has(b))\n  },\n)\n\n/**\n * Merge SDK-provided betas with auto-detected model betas.\n * SDK betas are read from global state (set via setSdkBetas in main.tsx).\n * The betas are pre-filtered by filterAllowedSdkBetas which handles\n * subscriber checks and allowlist validation with warnings.\n *\n * @param options.isAgenticQuery - When true, ensures the beta headers needed\n *   for agentic queries are present. For non-Haiku models these are already\n *   included by getAllModelBetas(); for Haiku they're excluded since\n *   non-agentic calls (compaction, classifiers, token estimation) don't need them.\n */\nexport function getMergedBetas(\n  model: string,\n  options?: { isAgenticQuery?: boolean },\n): string[] {\n  const baseBetas = [...getModelBetas(model)]\n\n  // Agentic queries always need claude-code and cli-internal beta headers.\n  // For non-Haiku models these are already in baseBetas; for Haiku they're\n  // excluded by getAllModelBetas() since non-agentic Haiku calls don't need them.\n  if (options?.isAgenticQuery) {\n    if (!baseBetas.includes(CLAUDE_CODE_20250219_BETA_HEADER)) {\n      baseBetas.push(CLAUDE_CODE_20250219_BETA_HEADER)\n    }\n    if (\n      process.env.USER_TYPE === 'ant' &&\n      process.env.CLAUDE_CODE_ENTRYPOINT === 'cli' &&\n      CLI_INTERNAL_BETA_HEADER &&\n      !baseBetas.includes(CLI_INTERNAL_BETA_HEADER)\n    ) {\n      baseBetas.push(CLI_INTERNAL_BETA_HEADER)\n    }\n  }\n\n  const sdkBetas = getSdkBetas()\n\n  if (!sdkBetas || sdkBetas.length === 0) {\n    return baseBetas\n  }\n\n  // Merge SDK betas without duplicates (already filtered by filterAllowedSdkBetas)\n  return [...baseBetas, ...sdkBetas.filter(b => !baseBetas.includes(b))]\n}\n\nexport function clearBetasCaches(): void {\n  getAllModelBetas.cache?.clear?.()\n  getModelBetas.cache?.clear?.()\n  getBedrockExtraBodyParamsBetas.cache?.clear?.()\n}\n", "/**\n * Lazy accessor for proper-lockfile.\n *\n * proper-lockfile depends on graceful-fs, which monkey-patches every fs\n * method on first require (~8ms). Static imports of proper-lockfile pull this\n * cost into the startup path even when no locking happens (e.g. `--help`).\n *\n * Import this module instead of `proper-lockfile` directly. The underlying\n * package is only loaded the first time a lock function is actually called.\n */\n\nimport type { CheckOptions, LockOptions, UnlockOptions } from 'proper-lockfile'\n\ntype Lockfile = typeof import('proper-lockfile')\n\nlet _lockfile: Lockfile | undefined\n\nfunction getLockfile(): Lockfile {\n  if (!_lockfile) {\n    // eslint-disable-next-line @typescript-eslint/no-require-imports\n    _lockfile = require('proper-lockfile') as Lockfile\n  }\n  return _lockfile\n}\n\nexport function lock(\n  file: string,\n  options?: LockOptions,\n): Promise<() => Promise<void>> {\n  return getLockfile().lock(file, options)\n}\n\nexport function lockSync(file: string, options?: LockOptions): () => void {\n  return getLockfile().lockSync(file, options)\n}\n\nexport function unlock(file: string, options?: UnlockOptions): Promise<void> {\n  return getLockfile().unlock(file, options)\n}\n\nexport function check(file: string, options?: CheckOptions): Promise<boolean> {\n  return getLockfile().check(file, options)\n}\n", "import type { SecureStorage, SecureStorageData } from './types.js'\n\n/**\n * Creates a fallback storage that tries to use the primary storage first,\n * and if that fails, falls back to the secondary storage\n */\nexport function createFallbackStorage(\n  primary: SecureStorage,\n  secondary: SecureStorage,\n): SecureStorage {\n  return {\n    name: `${primary.name}-with-${secondary.name}-fallback`,\n    read(): SecureStorageData {\n      const result = primary.read()\n      if (result !== null && result !== undefined) {\n        return result\n      }\n      return secondary.read() || {}\n    },\n    async readAsync(): Promise<SecureStorageData | null> {\n      const result = await primary.readAsync()\n      if (result !== null && result !== undefined) {\n        return result\n      }\n      return (await secondary.readAsync()) || {}\n    },\n    update(data: SecureStorageData): { success: boolean; warning?: string } {\n      // Capture state before update\n      const primaryDataBefore = primary.read()\n\n      const result = primary.update(data)\n\n      if (result.success) {\n        // Delete secondary when migrating to primary for the first time\n        // This preserves credentials when sharing .claude between host and containers\n        // See: https://github.com/anthropics/claude-code/issues/1414\n        if (primaryDataBefore === null) {\n          secondary.delete()\n        }\n        return result\n      }\n\n      const fallbackResult = secondary.update(data)\n\n      if (fallbackResult.success) {\n        // Primary write failed but primary may still hold an *older* valid\n        // entry. read() prefers primary whenever it returns non-null, so that\n        // stale entry would shadow the fresh data we just wrote to secondary \u2014\n        // e.g. a refresh token the server has already rotated away, causing a\n        // /login loop (#30337). Best-effort delete; if this also fails the\n        // user's keychain is in a bad state we can't fix from here.\n        if (primaryDataBefore !== null) {\n          primary.delete()\n        }\n        return {\n          success: true,\n          warning: fallbackResult.warning,\n        }\n      }\n\n      return { success: false }\n    },\n    delete(): boolean {\n      const primarySuccess = primary.delete()\n      const secondarySuccess = secondary.delete()\n\n      return primarySuccess || secondarySuccess\n    },\n  }\n}\n", "import { execaSync } from 'execa'\nimport { logForDebugging } from '../debug.js'\nimport { execFileNoThrow } from '../execFileNoThrow.js'\nimport { execSyncWithDefaults_DEPRECATED } from '../execFileNoThrowPortable.js'\nimport { jsonParse, jsonStringify } from '../slowOperations.js'\nimport {\n  CREDENTIALS_SERVICE_SUFFIX,\n  clearKeychainCache,\n  getMacOsKeychainStorageServiceName,\n  getUsername,\n  KEYCHAIN_CACHE_TTL_MS,\n  keychainCacheState,\n} from './macOsKeychainHelpers.js'\nimport type { SecureStorage, SecureStorageData } from './types.js'\n\n// `security -i` reads stdin with a 4096-byte fgets() buffer (BUFSIZ on darwin).\n// A command line longer than this is truncated mid-argument: the first 4096\n// bytes are consumed as one command (unterminated quote \u2192 fails), the overflow\n// is interpreted as a second unknown command. Net: non-zero exit with NO data\n// written, but the *previous* keychain entry is left intact \u2014 which fallback\n// storage then reads as stale. See #30337.\n// Headroom of 64B below the limit guards against edge-case line-terminator\n// accounting differences.\nconst SECURITY_STDIN_LINE_LIMIT = 4096 - 64\n\nexport const macOsKeychainStorage = {\n  name: 'keychain',\n  read(): SecureStorageData | null {\n    const prev = keychainCacheState.cache\n    if (Date.now() - prev.cachedAt < KEYCHAIN_CACHE_TTL_MS) {\n      return prev.data\n    }\n\n    try {\n      const storageServiceName = getMacOsKeychainStorageServiceName(\n        CREDENTIALS_SERVICE_SUFFIX,\n      )\n      const username = getUsername()\n      const result = execSyncWithDefaults_DEPRECATED(\n        `security find-generic-password -a \"${username}\" -w -s \"${storageServiceName}\"`,\n      )\n      if (result) {\n        const data = jsonParse(result)\n        keychainCacheState.cache = { data, cachedAt: Date.now() }\n        return data\n      }\n    } catch (_e) {\n      // fall through\n    }\n    // Stale-while-error: if we had a value before and the refresh failed,\n    // keep serving the stale value rather than caching null. Since #23192\n    // clears the upstream memoize on every API request (macOS path), a\n    // single transient `security` spawn failure would otherwise poison the\n    // cache and surface as \"Not logged in\" across all subsystems until the\n    // next user interaction. clearKeychainCache() sets data=null, so\n    // explicit invalidation (logout, delete) still reads through.\n    if (prev.data !== null) {\n      logForDebugging('[keychain] read failed; serving stale cache', {\n        level: 'warn',\n      })\n      keychainCacheState.cache = { data: prev.data, cachedAt: Date.now() }\n      return prev.data\n    }\n    keychainCacheState.cache = { data: null, cachedAt: Date.now() }\n    return null\n  },\n  async readAsync(): Promise<SecureStorageData | null> {\n    const prev = keychainCacheState.cache\n    if (Date.now() - prev.cachedAt < KEYCHAIN_CACHE_TTL_MS) {\n      return prev.data\n    }\n    if (keychainCacheState.readInFlight) {\n      return keychainCacheState.readInFlight\n    }\n\n    const gen = keychainCacheState.generation\n    const promise = doReadAsync().then(data => {\n      // If the cache was invalidated or updated while we were reading,\n      // our subprocess result is stale \u2014 don't overwrite the newer entry.\n      if (gen === keychainCacheState.generation) {\n        // Stale-while-error \u2014 mirror read() above.\n        if (data === null && prev.data !== null) {\n          logForDebugging('[keychain] readAsync failed; serving stale cache', {\n            level: 'warn',\n          })\n        }\n        const next = data ?? prev.data\n        keychainCacheState.cache = { data: next, cachedAt: Date.now() }\n        keychainCacheState.readInFlight = null\n        return next\n      }\n      return data\n    })\n    keychainCacheState.readInFlight = promise\n    return promise\n  },\n  update(data: SecureStorageData): { success: boolean; warning?: string } {\n    // Invalidate cache before update\n    clearKeychainCache()\n\n    try {\n      const storageServiceName = getMacOsKeychainStorageServiceName(\n        CREDENTIALS_SERVICE_SUFFIX,\n      )\n      const username = getUsername()\n      const jsonString = jsonStringify(data)\n\n      // Convert to hexadecimal to avoid any escaping issues\n      const hexValue = Buffer.from(jsonString, 'utf-8').toString('hex')\n\n      // Prefer stdin (`security -i`) so process monitors (CrowdStrike et al.)\n      // see only \"security -i\", not the payload (INC-3028).\n      // When the payload would overflow the stdin line buffer, fall back to\n      // argv. Hex in argv is recoverable by a determined observer but defeats\n      // naive plaintext-grep rules, and the alternative \u2014 silent credential\n      // corruption \u2014 is strictly worse. ARG_MAX on darwin is 1MB so argv has\n      // effectively no size limit for our purposes.\n      const command = `add-generic-password -U -a \"${username}\" -s \"${storageServiceName}\" -X \"${hexValue}\"\\n`\n\n      let result\n      if (command.length <= SECURITY_STDIN_LINE_LIMIT) {\n        result = execaSync('security', ['-i'], {\n          input: command,\n          stdio: ['pipe', 'pipe', 'pipe'],\n          reject: false,\n        })\n      } else {\n        logForDebugging(\n          `Keychain payload (${jsonString.length}B JSON) exceeds security -i stdin limit; using argv`,\n          { level: 'warn' },\n        )\n        result = execaSync(\n          'security',\n          [\n            'add-generic-password',\n            '-U',\n            '-a',\n            username,\n            '-s',\n            storageServiceName,\n            '-X',\n            hexValue,\n          ],\n          { stdio: ['ignore', 'pipe', 'pipe'], reject: false },\n        )\n      }\n\n      if (result.exitCode !== 0) {\n        return { success: false }\n      }\n\n      // Update cache with new data on success\n      keychainCacheState.cache = { data, cachedAt: Date.now() }\n      return { success: true }\n    } catch (_e) {\n      return { success: false }\n    }\n  },\n  delete(): boolean {\n    // Invalidate cache before delete\n    clearKeychainCache()\n\n    try {\n      const storageServiceName = getMacOsKeychainStorageServiceName(\n        CREDENTIALS_SERVICE_SUFFIX,\n      )\n      const username = getUsername()\n      execSyncWithDefaults_DEPRECATED(\n        `security delete-generic-password -a \"${username}\" -s \"${storageServiceName}\"`,\n      )\n      return true\n    } catch (_e) {\n      return false\n    }\n  },\n} satisfies SecureStorage\n\nasync function doReadAsync(): Promise<SecureStorageData | null> {\n  try {\n    const storageServiceName = getMacOsKeychainStorageServiceName(\n      CREDENTIALS_SERVICE_SUFFIX,\n    )\n    const username = getUsername()\n    const { stdout, code } = await execFileNoThrow(\n      'security',\n      ['find-generic-password', '-a', username, '-w', '-s', storageServiceName],\n      { useCwd: false, preserveOutputOnError: false },\n    )\n    if (code === 0 && stdout) {\n      return jsonParse(stdout.trim())\n    }\n  } catch (_e) {\n    // fall through\n  }\n  return null\n}\n\nlet keychainLockedCache: boolean | undefined\n\n/**\n * Checks if the macOS keychain is locked.\n * Returns true if on macOS and keychain is locked (exit code 36 from security show-keychain-info).\n * This commonly happens in SSH sessions where the keychain isn't automatically unlocked.\n *\n * Cached for process lifetime \u2014 execaSync('security', ...) is a ~27ms sync\n * subprocess spawn, and this is called from render (AssistantTextMessage).\n * During virtual-scroll remounts on sessions with \"Not logged in\" messages,\n * each remount re-spawned security(1), adding 27ms/message to the commit.\n * Keychain lock state doesn't change during a CLI session.\n */\nexport function isMacOsKeychainLocked(): boolean {\n  if (keychainLockedCache !== undefined) return keychainLockedCache\n  // Only check on macOS\n  if (process.platform !== 'darwin') {\n    keychainLockedCache = false\n    return false\n  }\n\n  try {\n    const result = execaSync('security', ['show-keychain-info'], {\n      reject: false,\n      stdio: ['ignore', 'pipe', 'pipe'],\n    })\n    // Exit code 36 indicates the keychain is locked\n    keychainLockedCache = result.exitCode === 36\n  } catch {\n    // If the command fails for any reason, assume keychain is not locked\n    keychainLockedCache = false\n  }\n  return keychainLockedCache\n}\n", "import { chmodSync } from 'fs'\nimport { join } from 'path'\nimport { getClaudeConfigHomeDir } from '../envUtils.js'\nimport { getErrnoCode } from '../errors.js'\nimport { getFsImplementation } from '../fsOperations.js'\nimport {\n  jsonParse,\n  jsonStringify,\n  writeFileSync_DEPRECATED,\n} from '../slowOperations.js'\nimport type { SecureStorage, SecureStorageData } from './types.js'\n\nfunction getStoragePath(): { storageDir: string; storagePath: string } {\n  const storageDir = getClaudeConfigHomeDir()\n  const storageFileName = '.credentials.json'\n  return { storageDir, storagePath: join(storageDir, storageFileName) }\n}\n\nexport const plainTextStorage = {\n  name: 'plaintext',\n  read(): SecureStorageData | null {\n    // sync IO: called from sync context (SecureStorage interface)\n    const { storagePath } = getStoragePath()\n    try {\n      const data = getFsImplementation().readFileSync(storagePath, {\n        encoding: 'utf8',\n      })\n      return jsonParse(data)\n    } catch {\n      return null\n    }\n  },\n  async readAsync(): Promise<SecureStorageData | null> {\n    const { storagePath } = getStoragePath()\n    try {\n      const data = await getFsImplementation().readFile(storagePath, {\n        encoding: 'utf8',\n      })\n      return jsonParse(data)\n    } catch {\n      return null\n    }\n  },\n  update(data: SecureStorageData): { success: boolean; warning?: string } {\n    // sync IO: called from sync context (SecureStorage interface)\n    try {\n      const { storageDir, storagePath } = getStoragePath()\n      try {\n        getFsImplementation().mkdirSync(storageDir)\n      } catch (e: unknown) {\n        const code = getErrnoCode(e)\n        if (code !== 'EEXIST') {\n          throw e\n        }\n      }\n\n      writeFileSync_DEPRECATED(storagePath, jsonStringify(data), {\n        encoding: 'utf8',\n        flush: false,\n      })\n      chmodSync(storagePath, 0o600)\n      return {\n        success: true,\n        warning: 'Warning: Storing credentials in plaintext.',\n      }\n    } catch {\n      return { success: false }\n    }\n  },\n  delete(): boolean {\n    // sync IO: called from sync context (SecureStorage interface)\n    const { storagePath } = getStoragePath()\n    try {\n      getFsImplementation().unlinkSync(storagePath)\n      return true\n    } catch (e: unknown) {\n      const code = getErrnoCode(e)\n      if (code === 'ENOENT') {\n        return true\n      }\n      return false\n    }\n  },\n} satisfies SecureStorage\n", "import { createFallbackStorage } from './fallbackStorage.js'\nimport { macOsKeychainStorage } from './macOsKeychainStorage.js'\nimport { plainTextStorage } from './plainTextStorage.js'\nimport type { SecureStorage } from './types.js'\n\n/**\n * Get the appropriate secure storage implementation for the current platform\n */\nexport function getSecureStorage(): SecureStorage {\n  if (process.platform === 'darwin') {\n    return createFallbackStorage(macOsKeychainStorage, plainTextStorage)\n  }\n\n  // TODO: add libsecret support for Linux\n\n  return plainTextStorage\n}\n", "/**\n * Minimal module for firing macOS keychain reads in parallel with main.tsx\n * module evaluation, same pattern as startMdmRawRead() in settings/mdm/rawRead.ts.\n *\n * isRemoteManagedSettingsEligible() reads two separate keychain entries\n * SEQUENTIALLY via sync execSync during applySafeConfigEnvironmentVariables():\n *   1. \"Tau-credentials\" (OAuth tokens)  \u2014 ~32ms\n *   2. \"Tau\" (legacy API key)            \u2014 ~33ms\n * Sequential cost: ~65ms on every macOS startup.\n *\n * Firing both here lets the subprocesses run in parallel with the ~65ms of\n * main.tsx imports. ensureKeychainPrefetchCompleted() is awaited alongside\n * ensureMdmSettingsLoaded() in main.tsx preAction \u2014 nearly free since the\n * subprocesses finish during import evaluation. Sync read() and\n * getApiKeyFromConfigOrMacOSKeychain() then hit their caches.\n *\n * Imports stay minimal: child_process + macOsKeychainHelpers.ts (NOT\n * macOsKeychainStorage.ts \u2014 that pulls in execa \u2192 human-signals \u2192\n * cross-spawn, ~58ms of synchronous module init). The helpers file's own\n * import chain (envUtils, oauth constants, crypto) is already evaluated by\n * startupProfiler.ts at main.tsx:5, so no new module-init cost lands here.\n */\n\nimport { execFile } from 'child_process'\nimport { isBareMode } from '../envUtils.js'\nimport {\n  CREDENTIALS_SERVICE_SUFFIX,\n  getMacOsKeychainStorageServiceName,\n  getUsername,\n  primeKeychainCacheFromPrefetch,\n} from './macOsKeychainHelpers.js'\n\nconst KEYCHAIN_PREFETCH_TIMEOUT_MS = 10_000\n\n// Shared with auth.ts getApiKeyFromConfigOrMacOSKeychain() so it can skip its\n// sync spawn when the prefetch already landed. Distinguishing \"not started\" (null)\n// from \"completed with no key\" ({ stdout: null }) lets the sync reader only\n// trust a completed prefetch.\nlet legacyApiKeyPrefetch: { stdout: string | null } | null = null\n\nlet prefetchPromise: Promise<void> | null = null\n\ntype SpawnResult = { stdout: string | null; timedOut: boolean }\n\nfunction spawnSecurity(serviceName: string): Promise<SpawnResult> {\n  return new Promise(resolve => {\n    execFile(\n      'security',\n      ['find-generic-password', '-a', getUsername(), '-w', '-s', serviceName],\n      { encoding: 'utf-8', timeout: KEYCHAIN_PREFETCH_TIMEOUT_MS },\n      (err, stdout) => {\n        // Exit 44 (entry not found) is a valid \"no key\" result and safe to\n        // prime as null. But timeout (err.killed) means the keychain MAY have\n        // a key we couldn't fetch \u2014 don't prime, let sync spawn retry.\n        // biome-ignore lint/nursery/noFloatingPromises: resolve() is not a floating promise\n        resolve({\n          stdout: err ? null : stdout?.trim() || null,\n          timedOut: Boolean(err && 'killed' in err && err.killed),\n        })\n      },\n    )\n  })\n}\n\n/**\n * Fire both keychain reads in parallel. Called at main.tsx top-level\n * immediately after startMdmRawRead(). Non-darwin is a no-op.\n */\nexport function startKeychainPrefetch(): void {\n  if (process.platform !== 'darwin' || prefetchPromise || isBareMode()) return\n\n  // Fire both subprocesses immediately (non-blocking). They run in parallel\n  // with each other AND with main.tsx imports. The await in Promise.all\n  // happens later via ensureKeychainPrefetchCompleted().\n  const oauthSpawn = spawnSecurity(\n    getMacOsKeychainStorageServiceName(CREDENTIALS_SERVICE_SUFFIX),\n  )\n  const legacySpawn = spawnSecurity(getMacOsKeychainStorageServiceName())\n\n  prefetchPromise = Promise.all([oauthSpawn, legacySpawn]).then(\n    ([oauth, legacy]) => {\n      // Timed-out prefetch: don't prime. Sync read/spawn will retry with its\n      // own (longer) timeout. Priming null here would shadow a key that the\n      // sync path might successfully fetch.\n      if (!oauth.timedOut) primeKeychainCacheFromPrefetch(oauth.stdout)\n      if (!legacy.timedOut) legacyApiKeyPrefetch = { stdout: legacy.stdout }\n    },\n  )\n}\n\n/**\n * Await prefetch completion. Called in main.tsx preAction alongside\n * ensureMdmSettingsLoaded() \u2014 nearly free since subprocesses finish during\n * the ~65ms of main.tsx imports. Resolves immediately on non-darwin.\n */\nexport async function ensureKeychainPrefetchCompleted(): Promise<void> {\n  if (prefetchPromise) await prefetchPromise\n}\n\n/**\n * Consumed by getApiKeyFromConfigOrMacOSKeychain() in auth.ts before it\n * falls through to sync execSync. Returns null if prefetch hasn't completed.\n */\nexport function getLegacyApiKeyPrefetchResult(): {\n  stdout: string | null\n} | null {\n  return legacyApiKeyPrefetch\n}\n\n/**\n * Clear prefetch result. Called alongside getApiKeyFromConfigOrMacOSKeychain\n * cache invalidation so a stale prefetch doesn't shadow a fresh write.\n */\nexport function clearLegacyApiKeyPrefetch(): void {\n  legacyApiKeyPrefetch = null\n}\n", "/**\n * Abort-responsive sleep. Resolves after `ms` milliseconds, or immediately\n * when `signal` aborts (so backoff loops don't block shutdown).\n *\n * By default, abort resolves silently; the caller should check\n * `signal.aborted` after the await. Pass `throwOnAbort: true` to have\n * abort reject \u2014 useful when the sleep is deep inside a retry loop\n * and you want the rejection to bubble up and cancel the whole operation.\n *\n * Pass `abortError` to customize the rejection error (implies\n * `throwOnAbort: true`). Useful for retry loops that catch a specific\n * error class (e.g. `APIUserAbortError`).\n */\nexport function sleep(\n  ms: number,\n  signal?: AbortSignal,\n  opts?: { throwOnAbort?: boolean; abortError?: () => Error; unref?: boolean },\n): Promise<void> {\n  return new Promise((resolve, reject) => {\n    // Check aborted state BEFORE setting up the timer. If we defined\n    // onAbort first and called it synchronously here, it would reference\n    // `timer` while still in the Temporal Dead Zone.\n    if (signal?.aborted) {\n      if (opts?.throwOnAbort || opts?.abortError) {\n        void reject(opts.abortError?.() ?? new Error('aborted'))\n      } else {\n        void resolve()\n      }\n      return\n    }\n    const timer = setTimeout(\n      (signal, onAbort, resolve) => {\n        signal?.removeEventListener('abort', onAbort)\n        void resolve()\n      },\n      ms,\n      signal,\n      onAbort,\n      resolve,\n    )\n    function onAbort(): void {\n      clearTimeout(timer)\n      if (opts?.throwOnAbort || opts?.abortError) {\n        void reject(opts.abortError?.() ?? new Error('aborted'))\n      } else {\n        void resolve()\n      }\n    }\n    signal?.addEventListener('abort', onAbort, { once: true })\n    if (opts?.unref) {\n      timer.unref()\n    }\n  })\n}\n\nfunction rejectWithTimeout(reject: (e: Error) => void, message: string): void {\n  reject(new Error(message))\n}\n\n/**\n * Race a promise against a timeout. Rejects with `Error(message)` if the\n * promise doesn't settle within `ms`. The timeout timer is cleared when\n * the promise settles (no dangling timer) and unref'd so it doesn't\n * block process exit.\n *\n * Note: this doesn't cancel the underlying work \u2014 if the promise is\n * backed by a runaway async operation, that keeps running. This just\n * returns control to the caller.\n */\nexport function withTimeout<T>(\n  promise: Promise<T>,\n  ms: number,\n  message: string,\n): Promise<T> {\n  let timer: ReturnType<typeof setTimeout> | undefined\n  const timeoutPromise = new Promise<never>((_, reject) => {\n    // eslint-disable-next-line no-restricted-syntax -- not a sleep: REJECTS after ms (timeout guard)\n    timer = setTimeout(rejectWithTimeout, ms, reject, message)\n    if (typeof timer === 'object') timer.unref?.()\n  })\n  return Promise.race([promise, timeoutPromise]).finally(() => {\n    if (timer !== undefined) clearTimeout(timer)\n  })\n}\n", "import type { BetaTool } from '@anthropic-ai/sdk/resources/beta/messages/messages.mjs'\n\n// Session-scoped cache of rendered tool schemas. Tool schemas render at server\n// position 2 (before system prompt), so any byte-level change busts the entire\n// ~11K-token tool block AND everything downstream. GrowthBook gate flips\n// (tengu_tool_pear, tengu_fgts), MCP reconnects, or dynamic content in\n// tool.prompt() all cause this churn. Memoizing per-session locks the schema\n// bytes at first render \u2014 mid-session GB refreshes no longer bust the cache.\n//\n// Lives in a leaf module so auth.ts can clear it without importing api.ts\n// (which would create a cycle via plans\u2192settings\u2192file\u2192growthbook\u2192config\u2192\n// bridgeEnabled\u2192auth).\ntype CachedSchema = BetaTool & {\n  strict?: boolean\n  eager_input_streaming?: boolean\n}\n\nconst TOOL_SCHEMA_CACHE = new Map<string, CachedSchema>()\n\nexport function getToolSchemaCache(): Map<string, CachedSchema> {\n  return TOOL_SCHEMA_CACHE\n}\n\nexport function clearToolSchemaCache(): void {\n  TOOL_SCHEMA_CACHE.clear()\n}\n", "'use strict';\n\nvar hasOwn = Object.prototype.hasOwnProperty;\nvar toStr = Object.prototype.toString;\nvar defineProperty = Object.defineProperty;\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nvar isArray = function isArray(arr) {\n\tif (typeof Array.isArray === 'function') {\n\t\treturn Array.isArray(arr);\n\t}\n\n\treturn toStr.call(arr) === '[object Array]';\n};\n\nvar isPlainObject = function isPlainObject(obj) {\n\tif (!obj || toStr.call(obj) !== '[object Object]') {\n\t\treturn false;\n\t}\n\n\tvar hasOwnConstructor = hasOwn.call(obj, 'constructor');\n\tvar hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, 'isPrototypeOf');\n\t// Not own constructor property must be Object\n\tif (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {\n\t\treturn false;\n\t}\n\n\t// Own properties are enumerated firstly, so to speed up,\n\t// if last one is own, then all properties are own.\n\tvar key;\n\tfor (key in obj) { /**/ }\n\n\treturn typeof key === 'undefined' || hasOwn.call(obj, key);\n};\n\n// If name is '__proto__', and Object.defineProperty is available, define __proto__ as an own property on target\nvar setProperty = function setProperty(target, options) {\n\tif (defineProperty && options.name === '__proto__') {\n\t\tdefineProperty(target, options.name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t\tvalue: options.newValue,\n\t\t\twritable: true\n\t\t});\n\t} else {\n\t\ttarget[options.name] = options.newValue;\n\t}\n};\n\n// Return undefined instead of __proto__ if '__proto__' is not an own property\nvar getProperty = function getProperty(obj, name) {\n\tif (name === '__proto__') {\n\t\tif (!hasOwn.call(obj, name)) {\n\t\t\treturn void 0;\n\t\t} else if (gOPD) {\n\t\t\t// In early versions of node, obj['__proto__'] is buggy when obj has\n\t\t\t// __proto__ as an own property. Object.getOwnPropertyDescriptor() works.\n\t\t\treturn gOPD(obj, name).value;\n\t\t}\n\t}\n\n\treturn obj[name];\n};\n\nmodule.exports = function extend() {\n\tvar options, name, src, copy, copyIsArray, clone;\n\tvar target = arguments[0];\n\tvar i = 1;\n\tvar length = arguments.length;\n\tvar deep = false;\n\n\t// Handle a deep copy situation\n\tif (typeof target === 'boolean') {\n\t\tdeep = target;\n\t\ttarget = arguments[1] || {};\n\t\t// skip the boolean and the target\n\t\ti = 2;\n\t}\n\tif (target == null || (typeof target !== 'object' && typeof target !== 'function')) {\n\t\ttarget = {};\n\t}\n\n\tfor (; i < length; ++i) {\n\t\toptions = arguments[i];\n\t\t// Only deal with non-null/undefined values\n\t\tif (options != null) {\n\t\t\t// Extend the base object\n\t\t\tfor (name in options) {\n\t\t\t\tsrc = getProperty(target, name);\n\t\t\t\tcopy = getProperty(options, name);\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif (target !== copy) {\n\t\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\t\tif (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) {\n\t\t\t\t\t\tif (copyIsArray) {\n\t\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\t\tclone = src && isArray(src) ? src : [];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tclone = src && isPlainObject(src) ? src : {};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\t\tsetProperty(target, { name: name, newValue: extend(deep, clone, copy) });\n\n\t\t\t\t\t// Don't bring in undefined values\n\t\t\t\t\t} else if (typeof copy !== 'undefined') {\n\t\t\t\t\t\tsetProperty(target, { name: name, newValue: copy });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n", "\"use strict\";\n\nvar conversions = {};\nmodule.exports = conversions;\n\nfunction sign(x) {\n    return x < 0 ? -1 : 1;\n}\n\nfunction evenRound(x) {\n    // Round x to the nearest integer, choosing the even integer if it lies halfway between two.\n    if ((x % 1) === 0.5 && (x & 1) === 0) { // [even number].5; round down (i.e. floor)\n        return Math.floor(x);\n    } else {\n        return Math.round(x);\n    }\n}\n\nfunction createNumberConversion(bitLength, typeOpts) {\n    if (!typeOpts.unsigned) {\n        --bitLength;\n    }\n    const lowerBound = typeOpts.unsigned ? 0 : -Math.pow(2, bitLength);\n    const upperBound = Math.pow(2, bitLength) - 1;\n\n    const moduloVal = typeOpts.moduloBitLength ? Math.pow(2, typeOpts.moduloBitLength) : Math.pow(2, bitLength);\n    const moduloBound = typeOpts.moduloBitLength ? Math.pow(2, typeOpts.moduloBitLength - 1) : Math.pow(2, bitLength - 1);\n\n    return function(V, opts) {\n        if (!opts) opts = {};\n\n        let x = +V;\n\n        if (opts.enforceRange) {\n            if (!Number.isFinite(x)) {\n                throw new TypeError(\"Argument is not a finite number\");\n            }\n\n            x = sign(x) * Math.floor(Math.abs(x));\n            if (x < lowerBound || x > upperBound) {\n                throw new TypeError(\"Argument is not in byte range\");\n            }\n\n            return x;\n        }\n\n        if (!isNaN(x) && opts.clamp) {\n            x = evenRound(x);\n\n            if (x < lowerBound) x = lowerBound;\n            if (x > upperBound) x = upperBound;\n            return x;\n        }\n\n        if (!Number.isFinite(x) || x === 0) {\n            return 0;\n        }\n\n        x = sign(x) * Math.floor(Math.abs(x));\n        x = x % moduloVal;\n\n        if (!typeOpts.unsigned && x >= moduloBound) {\n            return x - moduloVal;\n        } else if (typeOpts.unsigned) {\n            if (x < 0) {\n              x += moduloVal;\n            } else if (x === -0) { // don't return negative zero\n              return 0;\n            }\n        }\n\n        return x;\n    }\n}\n\nconversions[\"void\"] = function () {\n    return undefined;\n};\n\nconversions[\"boolean\"] = function (val) {\n    return !!val;\n};\n\nconversions[\"byte\"] = createNumberConversion(8, { unsigned: false });\nconversions[\"octet\"] = createNumberConversion(8, { unsigned: true });\n\nconversions[\"short\"] = createNumberConversion(16, { unsigned: false });\nconversions[\"unsigned short\"] = createNumberConversion(16, { unsigned: true });\n\nconversions[\"long\"] = createNumberConversion(32, { unsigned: false });\nconversions[\"unsigned long\"] = createNumberConversion(32, { unsigned: true });\n\nconversions[\"long long\"] = createNumberConversion(32, { unsigned: false, moduloBitLength: 64 });\nconversions[\"unsigned long long\"] = createNumberConversion(32, { unsigned: true, moduloBitLength: 64 });\n\nconversions[\"double\"] = function (V) {\n    const x = +V;\n\n    if (!Number.isFinite(x)) {\n        throw new TypeError(\"Argument is not a finite floating-point value\");\n    }\n\n    return x;\n};\n\nconversions[\"unrestricted double\"] = function (V) {\n    const x = +V;\n\n    if (isNaN(x)) {\n        throw new TypeError(\"Argument is NaN\");\n    }\n\n    return x;\n};\n\n// not quite valid, but good enough for JS\nconversions[\"float\"] = conversions[\"double\"];\nconversions[\"unrestricted float\"] = conversions[\"unrestricted double\"];\n\nconversions[\"DOMString\"] = function (V, opts) {\n    if (!opts) opts = {};\n\n    if (opts.treatNullAsEmptyString && V === null) {\n        return \"\";\n    }\n\n    return String(V);\n};\n\nconversions[\"ByteString\"] = function (V, opts) {\n    const x = String(V);\n    let c = undefined;\n    for (let i = 0; (c = x.codePointAt(i)) !== undefined; ++i) {\n        if (c > 255) {\n            throw new TypeError(\"Argument is not a valid bytestring\");\n        }\n    }\n\n    return x;\n};\n\nconversions[\"USVString\"] = function (V) {\n    const S = String(V);\n    const n = S.length;\n    const U = [];\n    for (let i = 0; i < n; ++i) {\n        const c = S.charCodeAt(i);\n        if (c < 0xD800 || c > 0xDFFF) {\n            U.push(String.fromCodePoint(c));\n        } else if (0xDC00 <= c && c <= 0xDFFF) {\n            U.push(String.fromCodePoint(0xFFFD));\n        } else {\n            if (i === n - 1) {\n                U.push(String.fromCodePoint(0xFFFD));\n            } else {\n                const d = S.charCodeAt(i + 1);\n                if (0xDC00 <= d && d <= 0xDFFF) {\n                    const a = c & 0x3FF;\n                    const b = d & 0x3FF;\n                    U.push(String.fromCodePoint((2 << 15) + (2 << 9) * a + b));\n                    ++i;\n                } else {\n                    U.push(String.fromCodePoint(0xFFFD));\n                }\n            }\n        }\n    }\n\n    return U.join('');\n};\n\nconversions[\"Date\"] = function (V, opts) {\n    if (!(V instanceof Date)) {\n        throw new TypeError(\"Argument is not a Date object\");\n    }\n    if (isNaN(V)) {\n        return undefined;\n    }\n\n    return V;\n};\n\nconversions[\"RegExp\"] = function (V, opts) {\n    if (!(V instanceof RegExp)) {\n        V = new RegExp(V);\n    }\n\n    return V;\n};\n", "\"use strict\";\n\nmodule.exports.mixin = function mixin(target, source) {\n  const keys = Object.getOwnPropertyNames(source);\n  for (let i = 0; i < keys.length; ++i) {\n    Object.defineProperty(target, keys[i], Object.getOwnPropertyDescriptor(source, keys[i]));\n  }\n};\n\nmodule.exports.wrapperSymbol = Symbol(\"wrapper\");\nmodule.exports.implSymbol = Symbol(\"impl\");\n\nmodule.exports.wrapperForImpl = function (impl) {\n  return impl[module.exports.wrapperSymbol];\n};\n\nmodule.exports.implForWrapper = function (wrapper) {\n  return wrapper[module.exports.implSymbol];\n};\n\n", "[[[0,44],\"disallowed_STD3_valid\"],[[45,46],\"valid\"],[[47,47],\"disallowed_STD3_valid\"],[[48,57],\"valid\"],[[58,64],\"disallowed_STD3_valid\"],[[65,65],\"mapped\",[97]],[[66,66],\"mapped\",[98]],[[67,67],\"mapped\",[99]],[[68,68],\"mapped\",[100]],[[69,69],\"mapped\",[101]],[[70,70],\"mapped\",[102]],[[71,71],\"mapped\",[103]],[[72,72],\"mapped\",[104]],[[73,73],\"mapped\",[105]],[[74,74],\"mapped\",[106]],[[75,75],\"mapped\",[107]],[[76,76],\"mapped\",[108]],[[77,77],\"mapped\",[109]],[[78,78],\"mapped\",[110]],[[79,79],\"mapped\",[111]],[[80,80],\"mapped\",[112]],[[81,81],\"mapped\",[113]],[[82,82],\"mapped\",[114]],[[83,83],\"mapped\",[115]],[[84,84],\"mapped\",[116]],[[85,85],\"mapped\",[117]],[[86,86],\"mapped\",[118]],[[87,87],\"mapped\",[119]],[[88,88],\"mapped\",[120]],[[89,89],\"mapped\",[121]],[[90,90],\"mapped\",[122]],[[91,96],\"disallowed_STD3_valid\"],[[97,122],\"valid\"],[[123,127],\"disallowed_STD3_valid\"],[[128,159],\"disallowed\"],[[160,160],\"disallowed_STD3_mapped\",[32]],[[161,167],\"valid\",[],\"NV8\"],[[168,168],\"disallowed_STD3_mapped\",[32,776]],[[169,169],\"valid\",[],\"NV8\"],[[170,170],\"mapped\",[97]],[[171,172],\"valid\",[],\"NV8\"],[[173,173],\"ignored\"],[[174,174],\"valid\",[],\"NV8\"],[[175,175],\"disallowed_STD3_mapped\",[32,772]],[[176,177],\"valid\",[],\"NV8\"],[[178,178],\"mapped\",[50]],[[179,179],\"mapped\",[51]],[[180,180],\"disallowed_STD3_mapped\",[32,769]],[[181,181],\"mapped\",[956]],[[182,182],\"valid\",[],\"NV8\"],[[183,183],\"valid\"],[[184,184],\"disallowed_STD3_mapped\",[32,807]],[[185,185],\"mapped\",[49]],[[186,186],\"mapped\",[111]],[[187,187],\"valid\",[],\"NV8\"],[[188,188],\"mapped\",[49,8260,52]],[[189,189],\"mapped\",[49,8260,50]],[[190,190],\"mapped\",[51,8260,52]],[[191,191],\"valid\",[],\"NV8\"],[[192,192],\"mapped\",[224]],[[193,193],\"mapped\",[225]],[[194,194],\"mapped\",[226]],[[195,195],\"mapped\",[227]],[[196,196],\"mapped\",[228]],[[197,197],\"mapped\",[229]],[[198,198],\"mapped\",[230]],[[199,199],\"mapped\",[231]],[[200,200],\"mapped\",[232]],[[201,201],\"mapped\",[233]],[[202,202],\"mapped\",[234]],[[203,203],\"mapped\",[235]],[[204,204],\"mapped\",[236]],[[205,205],\"mapped\",[237]],[[206,206],\"mapped\",[238]],[[207,207],\"mapped\",[239]],[[208,208],\"mapped\",[240]],[[209,209],\"mapped\",[241]],[[210,210],\"mapped\",[242]],[[211,211],\"mapped\",[243]],[[212,212],\"mapped\",[244]],[[213,213],\"mapped\",[245]],[[214,214],\"mapped\",[246]],[[215,215],\"valid\",[],\"NV8\"],[[216,216],\"mapped\",[248]],[[217,217],\"mapped\",[249]],[[218,218],\"mapped\",[250]],[[219,219],\"mapped\",[251]],[[220,220],\"mapped\",[252]],[[221,221],\"mapped\",[253]],[[222,222],\"mapped\",[254]],[[223,223],\"deviation\",[115,115]],[[224,246],\"valid\"],[[247,247],\"valid\",[],\"NV8\"],[[248,255],\"valid\"],[[256,256],\"mapped\",[257]],[[257,257],\"valid\"],[[258,258],\"mapped\",[259]],[[259,259],\"valid\"],[[260,260],\"mapped\",[261]],[[261,261],\"valid\"],[[262,262],\"mapped\",[263]],[[263,263],\"valid\"],[[264,264],\"mapped\",[265]],[[265,265],\"valid\"],[[266,266],\"mapped\",[267]],[[267,267],\"valid\"],[[268,268],\"mapped\",[269]],[[269,269],\"valid\"],[[270,270],\"mapped\",[271]],[[271,271],\"valid\"],[[272,272],\"mapped\",[273]],[[273,273],\"valid\"],[[274,274],\"mapped\",[275]],[[275,275],\"valid\"],[[276,276],\"mapped\",[277]],[[277,277],\"valid\"],[[278,278],\"mapped\",[279]],[[279,279],\"valid\"],[[280,280],\"mapped\",[281]],[[281,281],\"valid\"],[[282,282],\"mapped\",[283]],[[283,283],\"valid\"],[[284,284],\"mapped\",[285]],[[285,285],\"valid\"],[[286,286],\"mapped\",[287]],[[287,287],\"valid\"],[[288,288],\"mapped\",[289]],[[289,289],\"valid\"],[[290,290],\"mapped\",[291]],[[291,291],\"valid\"],[[292,292],\"mapped\",[293]],[[293,293],\"valid\"],[[294,294],\"mapped\",[295]],[[295,295],\"valid\"],[[296,296],\"mapped\",[297]],[[297,297],\"valid\"],[[298,298],\"mapped\",[299]],[[299,299],\"valid\"],[[300,300],\"mapped\",[301]],[[301,301],\"valid\"],[[302,302],\"mapped\",[303]],[[303,303],\"valid\"],[[304,304],\"mapped\",[105,775]],[[305,305],\"valid\"],[[306,307],\"mapped\",[105,106]],[[308,308],\"mapped\",[309]],[[309,309],\"valid\"],[[310,310],\"mapped\",[311]],[[311,312],\"valid\"],[[313,313],\"mapped\",[314]],[[314,314],\"valid\"],[[315,315],\"mapped\",[316]],[[316,316],\"valid\"],[[317,317],\"mapped\",[318]],[[318,318],\"valid\"],[[319,320],\"mapped\",[108,183]],[[321,321],\"mapped\",[322]],[[322,322],\"valid\"],[[323,323],\"mapped\",[324]],[[324,324],\"valid\"],[[325,325],\"mapped\",[326]],[[326,326],\"valid\"],[[327,327],\"mapped\",[328]],[[328,328],\"valid\"],[[329,329],\"mapped\",[700,110]],[[330,330],\"mapped\",[331]],[[331,331],\"valid\"],[[332,332],\"mapped\",[333]],[[333,333],\"valid\"],[[334,334],\"mapped\",[335]],[[335,335],\"valid\"],[[336,336],\"mapped\",[337]],[[337,337],\"valid\"],[[338,338],\"mapped\",[339]],[[339,339],\"valid\"],[[340,340],\"mapped\",[341]],[[341,341],\"valid\"],[[342,342],\"mapped\",[343]],[[343,343],\"valid\"],[[344,344],\"mapped\",[345]],[[345,345],\"valid\"],[[346,346],\"mapped\",[347]],[[347,347],\"valid\"],[[348,348],\"mapped\",[349]],[[349,349],\"valid\"],[[350,350],\"mapped\",[351]],[[351,351],\"valid\"],[[352,352],\"mapped\",[353]],[[353,353],\"valid\"],[[354,354],\"mapped\",[355]],[[355,355],\"valid\"],[[356,356],\"mapped\",[357]],[[357,357],\"valid\"],[[358,358],\"mapped\",[359]],[[359,359],\"valid\"],[[360,360],\"mapped\",[361]],[[361,361],\"valid\"],[[362,362],\"mapped\",[363]],[[363,363],\"valid\"],[[364,364],\"mapped\",[365]],[[365,365],\"valid\"],[[366,366],\"mapped\",[367]],[[367,367],\"valid\"],[[368,368],\"mapped\",[369]],[[369,369],\"valid\"],[[370,370],\"mapped\",[371]],[[371,371],\"valid\"],[[372,372],\"mapped\",[373]],[[373,373],\"valid\"],[[374,374],\"mapped\",[375]],[[375,375],\"valid\"],[[376,376],\"mapped\",[255]],[[377,377],\"mapped\",[378]],[[378,378],\"valid\"],[[379,379],\"mapped\",[380]],[[380,380],\"valid\"],[[381,381],\"mapped\",[382]],[[382,382],\"valid\"],[[383,383],\"mapped\",[115]],[[384,384],\"valid\"],[[385,385],\"mapped\",[595]],[[386,386],\"mapped\",[387]],[[387,387],\"valid\"],[[388,388],\"mapped\",[389]],[[389,389],\"valid\"],[[390,390],\"mapped\",[596]],[[391,391],\"mapped\",[392]],[[392,392],\"valid\"],[[393,393],\"mapped\",[598]],[[394,394],\"mapped\",[599]],[[395,395],\"mapped\",[396]],[[396,397],\"valid\"],[[398,398],\"mapped\",[477]],[[399,399],\"mapped\",[601]],[[400,400],\"mapped\",[603]],[[401,401],\"mapped\",[402]],[[402,402],\"valid\"],[[403,403],\"mapped\",[608]],[[404,404],\"mapped\",[611]],[[405,405],\"valid\"],[[406,406],\"mapped\",[617]],[[407,407],\"mapped\",[616]],[[408,408],\"mapped\",[409]],[[409,411],\"valid\"],[[412,412],\"mapped\",[623]],[[413,413],\"mapped\",[626]],[[414,414],\"valid\"],[[415,415],\"mapped\",[629]],[[416,416],\"mapped\",[417]],[[417,417],\"valid\"],[[418,418],\"mapped\",[419]],[[419,419],\"valid\"],[[420,420],\"mapped\",[421]],[[421,421],\"valid\"],[[422,422],\"mapped\",[640]],[[423,423],\"mapped\",[424]],[[424,424],\"valid\"],[[425,425],\"mapped\",[643]],[[426,427],\"valid\"],[[428,428],\"mapped\",[429]],[[429,429],\"valid\"],[[430,430],\"mapped\",[648]],[[431,431],\"mapped\",[432]],[[432,432],\"valid\"],[[433,433],\"mapped\",[650]],[[434,434],\"mapped\",[651]],[[435,435],\"mapped\",[436]],[[436,436],\"valid\"],[[437,437],\"mapped\",[438]],[[438,438],\"valid\"],[[439,439],\"mapped\",[658]],[[440,440],\"mapped\",[441]],[[441,443],\"valid\"],[[444,444],\"mapped\",[445]],[[445,451],\"valid\"],[[452,454],\"mapped\",[100,382]],[[455,457],\"mapped\",[108,106]],[[458,460],\"mapped\",[110,106]],[[461,461],\"mapped\",[462]],[[462,462],\"valid\"],[[463,463],\"mapped\",[464]],[[464,464],\"valid\"],[[465,465],\"mapped\",[466]],[[466,466],\"valid\"],[[467,467],\"mapped\",[468]],[[468,468],\"valid\"],[[469,469],\"mapped\",[470]],[[470,470],\"valid\"],[[471,471],\"mapped\",[472]],[[472,472],\"valid\"],[[473,473],\"mapped\",[474]],[[474,474],\"valid\"],[[475,475],\"mapped\",[476]],[[476,477],\"valid\"],[[478,478],\"mapped\",[479]],[[479,479],\"valid\"],[[480,480],\"mapped\",[481]],[[481,481],\"valid\"],[[482,482],\"mapped\",[483]],[[483,483],\"valid\"],[[484,484],\"mapped\",[485]],[[485,485],\"valid\"],[[486,486],\"mapped\",[487]],[[487,487],\"valid\"],[[488,488],\"mapped\",[489]],[[489,489],\"valid\"],[[490,490],\"mapped\",[491]],[[491,491],\"valid\"],[[492,492],\"mapped\",[493]],[[493,493],\"valid\"],[[494,494],\"mapped\",[495]],[[495,496],\"valid\"],[[497,499],\"mapped\",[100,122]],[[500,500],\"mapped\",[501]],[[501,501],\"valid\"],[[502,502],\"mapped\",[405]],[[503,503],\"mapped\",[447]],[[504,504],\"mapped\",[505]],[[505,505],\"valid\"],[[506,506],\"mapped\",[507]],[[507,507],\"valid\"],[[508,508],\"mapped\",[509]],[[509,509],\"valid\"],[[510,510],\"mapped\",[511]],[[511,511],\"valid\"],[[512,512],\"mapped\",[513]],[[513,513],\"valid\"],[[514,514],\"mapped\",[515]],[[515,515],\"valid\"],[[516,516],\"mapped\",[517]],[[517,517],\"valid\"],[[518,518],\"mapped\",[519]],[[519,519],\"valid\"],[[520,520],\"mapped\",[521]],[[521,521],\"valid\"],[[522,522],\"mapped\",[523]],[[523,523],\"valid\"],[[524,524],\"mapped\",[525]],[[525,525],\"valid\"],[[526,526],\"mapped\",[527]],[[527,527],\"valid\"],[[528,528],\"mapped\",[529]],[[529,529],\"valid\"],[[530,530],\"mapped\",[531]],[[531,531],\"valid\"],[[532,532],\"mapped\",[533]],[[533,533],\"valid\"],[[534,534],\"mapped\",[535]],[[535,535],\"valid\"],[[536,536],\"mapped\",[537]],[[537,537],\"valid\"],[[538,538],\"mapped\",[539]],[[539,539],\"valid\"],[[540,540],\"mapped\",[541]],[[541,541],\"valid\"],[[542,542],\"mapped\",[543]],[[543,543],\"valid\"],[[544,544],\"mapped\",[414]],[[545,545],\"valid\"],[[546,546],\"mapped\",[547]],[[547,547],\"valid\"],[[548,548],\"mapped\",[549]],[[549,549],\"valid\"],[[550,550],\"mapped\",[551]],[[551,551],\"valid\"],[[552,552],\"mapped\",[553]],[[553,553],\"valid\"],[[554,554],\"mapped\",[555]],[[555,555],\"valid\"],[[556,556],\"mapped\",[557]],[[557,557],\"valid\"],[[558,558],\"mapped\",[559]],[[559,559],\"valid\"],[[560,560],\"mapped\",[561]],[[561,561],\"valid\"],[[562,562],\"mapped\",[563]],[[563,563],\"valid\"],[[564,566],\"valid\"],[[567,569],\"valid\"],[[570,570],\"mapped\",[11365]],[[571,571],\"mapped\",[572]],[[572,572],\"valid\"],[[573,573],\"mapped\",[410]],[[574,574],\"mapped\",[11366]],[[575,576],\"valid\"],[[577,577],\"mapped\",[578]],[[578,578],\"valid\"],[[579,579],\"mapped\",[384]],[[580,580],\"mapped\",[649]],[[581,581],\"mapped\",[652]],[[582,582],\"mapped\",[583]],[[583,583],\"valid\"],[[584,584],\"mapped\",[585]],[[585,585],\"valid\"],[[586,586],\"mapped\",[587]],[[587,587],\"valid\"],[[588,588],\"mapped\",[589]],[[589,589],\"valid\"],[[590,590],\"mapped\",[591]],[[591,591],\"valid\"],[[592,680],\"valid\"],[[681,685],\"valid\"],[[686,687],\"valid\"],[[688,688],\"mapped\",[104]],[[689,689],\"mapped\",[614]],[[690,690],\"mapped\",[106]],[[691,691],\"mapped\",[114]],[[692,692],\"mapped\",[633]],[[693,693],\"mapped\",[635]],[[694,694],\"mapped\",[641]],[[695,695],\"mapped\",[119]],[[696,696],\"mapped\",[121]],[[697,705],\"valid\"],[[706,709],\"valid\",[],\"NV8\"],[[710,721],\"valid\"],[[722,727],\"valid\",[],\"NV8\"],[[728,728],\"disallowed_STD3_mapped\",[32,774]],[[729,729],\"disallowed_STD3_mapped\",[32,775]],[[730,730],\"disallowed_STD3_mapped\",[32,778]],[[731,731],\"disallowed_STD3_mapped\",[32,808]],[[732,732],\"disallowed_STD3_mapped\",[32,771]],[[733,733],\"disallowed_STD3_mapped\",[32,779]],[[734,734],\"valid\",[],\"NV8\"],[[735,735],\"valid\",[],\"NV8\"],[[736,736],\"mapped\",[611]],[[737,737],\"mapped\",[108]],[[738,738],\"mapped\",[115]],[[739,739],\"mapped\",[120]],[[740,740],\"mapped\",[661]],[[741,745],\"valid\",[],\"NV8\"],[[746,747],\"valid\",[],\"NV8\"],[[748,748],\"valid\"],[[749,749],\"valid\",[],\"NV8\"],[[750,750],\"valid\"],[[751,767],\"valid\",[],\"NV8\"],[[768,831],\"valid\"],[[832,832],\"mapped\",[768]],[[833,833],\"mapped\",[769]],[[834,834],\"valid\"],[[835,835],\"mapped\",[787]],[[836,836],\"mapped\",[776,769]],[[837,837],\"mapped\",[953]],[[838,846],\"valid\"],[[847,847],\"ignored\"],[[848,855],\"valid\"],[[856,860],\"valid\"],[[861,863],\"valid\"],[[864,865],\"valid\"],[[866,866],\"valid\"],[[867,879],\"valid\"],[[880,880],\"mapped\",[881]],[[881,881],\"valid\"],[[882,882],\"mapped\",[883]],[[883,883],\"valid\"],[[884,884],\"mapped\",[697]],[[885,885],\"valid\"],[[886,886],\"mapped\",[887]],[[887,887],\"valid\"],[[888,889],\"disallowed\"],[[890,890],\"disallowed_STD3_mapped\",[32,953]],[[891,893],\"valid\"],[[894,894],\"disallowed_STD3_mapped\",[59]],[[895,895],\"mapped\",[1011]],[[896,899],\"disallowed\"],[[900,900],\"disallowed_STD3_mapped\",[32,769]],[[901,901],\"disallowed_STD3_mapped\",[32,776,769]],[[902,902],\"mapped\",[940]],[[903,903],\"mapped\",[183]],[[904,904],\"mapped\",[941]],[[905,905],\"mapped\",[942]],[[906,906],\"mapped\",[943]],[[907,907],\"disallowed\"],[[908,908],\"mapped\",[972]],[[909,909],\"disallowed\"],[[910,910],\"mapped\",[973]],[[911,911],\"mapped\",[974]],[[912,912],\"valid\"],[[913,913],\"mapped\",[945]],[[914,914],\"mapped\",[946]],[[915,915],\"mapped\",[947]],[[916,916],\"mapped\",[948]],[[917,917],\"mapped\",[949]],[[918,918],\"mapped\",[950]],[[919,919],\"mapped\",[951]],[[920,920],\"mapped\",[952]],[[921,921],\"mapped\",[953]],[[922,922],\"mapped\",[954]],[[923,923],\"mapped\",[955]],[[924,924],\"mapped\",[956]],[[925,925],\"mapped\",[957]],[[926,926],\"mapped\",[958]],[[927,927],\"mapped\",[959]],[[928,928],\"mapped\",[960]],[[929,929],\"mapped\",[961]],[[930,930],\"disallowed\"],[[931,931],\"mapped\",[963]],[[932,932],\"mapped\",[964]],[[933,933],\"mapped\",[965]],[[934,934],\"mapped\",[966]],[[935,935],\"mapped\",[967]],[[936,936],\"mapped\",[968]],[[937,937],\"mapped\",[969]],[[938,938],\"mapped\",[970]],[[939,939],\"mapped\",[971]],[[940,961],\"valid\"],[[962,962],\"deviation\",[963]],[[963,974],\"valid\"],[[975,975],\"mapped\",[983]],[[976,976],\"mapped\",[946]],[[977,977],\"mapped\",[952]],[[978,978],\"mapped\",[965]],[[979,979],\"mapped\",[973]],[[980,980],\"mapped\",[971]],[[981,981],\"mapped\",[966]],[[982,982],\"mapped\",[960]],[[983,983],\"valid\"],[[984,984],\"mapped\",[985]],[[985,985],\"valid\"],[[986,986],\"mapped\",[987]],[[987,987],\"valid\"],[[988,988],\"mapped\",[989]],[[989,989],\"valid\"],[[990,990],\"mapped\",[991]],[[991,991],\"valid\"],[[992,992],\"mapped\",[993]],[[993,993],\"valid\"],[[994,994],\"mapped\",[995]],[[995,995],\"valid\"],[[996,996],\"mapped\",[997]],[[997,997],\"valid\"],[[998,998],\"mapped\",[999]],[[999,999],\"valid\"],[[1000,1000],\"mapped\",[1001]],[[1001,1001],\"valid\"],[[1002,1002],\"mapped\",[1003]],[[1003,1003],\"valid\"],[[1004,1004],\"mapped\",[1005]],[[1005,1005],\"valid\"],[[1006,1006],\"mapped\",[1007]],[[1007,1007],\"valid\"],[[1008,1008],\"mapped\",[954]],[[1009,1009],\"mapped\",[961]],[[1010,1010],\"mapped\",[963]],[[1011,1011],\"valid\"],[[1012,1012],\"mapped\",[952]],[[1013,1013],\"mapped\",[949]],[[1014,1014],\"valid\",[],\"NV8\"],[[1015,1015],\"mapped\",[1016]],[[1016,1016],\"valid\"],[[1017,1017],\"mapped\",[963]],[[1018,1018],\"mapped\",[1019]],[[1019,1019],\"valid\"],[[1020,1020],\"valid\"],[[1021,1021],\"mapped\",[891]],[[1022,1022],\"mapped\",[892]],[[1023,1023],\"mapped\",[893]],[[1024,1024],\"mapped\",[1104]],[[1025,1025],\"mapped\",[1105]],[[1026,1026],\"mapped\",[1106]],[[1027,1027],\"mapped\",[1107]],[[1028,1028],\"mapped\",[1108]],[[1029,1029],\"mapped\",[1109]],[[1030,1030],\"mapped\",[1110]],[[1031,1031],\"mapped\",[1111]],[[1032,1032],\"mapped\",[1112]],[[1033,1033],\"mapped\",[1113]],[[1034,1034],\"mapped\",[1114]],[[1035,1035],\"mapped\",[1115]],[[1036,1036],\"mapped\",[1116]],[[1037,1037],\"mapped\",[1117]],[[1038,1038],\"mapped\",[1118]],[[1039,1039],\"mapped\",[1119]],[[1040,1040],\"mapped\",[1072]],[[1041,1041],\"mapped\",[1073]],[[1042,1042],\"mapped\",[1074]],[[1043,1043],\"mapped\",[1075]],[[1044,1044],\"mapped\",[1076]],[[1045,1045],\"mapped\",[1077]],[[1046,1046],\"mapped\",[1078]],[[1047,1047],\"mapped\",[1079]],[[1048,1048],\"mapped\",[1080]],[[1049,1049],\"mapped\",[1081]],[[1050,1050],\"mapped\",[1082]],[[1051,1051],\"mapped\",[1083]],[[1052,1052],\"mapped\",[1084]],[[1053,1053],\"mapped\",[1085]],[[1054,1054],\"mapped\",[1086]],[[1055,1055],\"mapped\",[1087]],[[1056,1056],\"mapped\",[1088]],[[1057,1057],\"mapped\",[1089]],[[1058,1058],\"mapped\",[1090]],[[1059,1059],\"mapped\",[1091]],[[1060,1060],\"mapped\",[1092]],[[1061,1061],\"mapped\",[1093]],[[1062,1062],\"mapped\",[1094]],[[1063,1063],\"mapped\",[1095]],[[1064,1064],\"mapped\",[1096]],[[1065,1065],\"mapped\",[1097]],[[1066,1066],\"mapped\",[1098]],[[1067,1067],\"mapped\",[1099]],[[1068,1068],\"mapped\",[1100]],[[1069,1069],\"mapped\",[1101]],[[1070,1070],\"mapped\",[1102]],[[1071,1071],\"mapped\",[1103]],[[1072,1103],\"valid\"],[[1104,1104],\"valid\"],[[1105,1116],\"valid\"],[[1117,1117],\"valid\"],[[1118,1119],\"valid\"],[[1120,1120],\"mapped\",[1121]],[[1121,1121],\"valid\"],[[1122,1122],\"mapped\",[1123]],[[1123,1123],\"valid\"],[[1124,1124],\"mapped\",[1125]],[[1125,1125],\"valid\"],[[1126,1126],\"mapped\",[1127]],[[1127,1127],\"valid\"],[[1128,1128],\"mapped\",[1129]],[[1129,1129],\"valid\"],[[1130,1130],\"mapped\",[1131]],[[1131,1131],\"valid\"],[[1132,1132],\"mapped\",[1133]],[[1133,1133],\"valid\"],[[1134,1134],\"mapped\",[1135]],[[1135,1135],\"valid\"],[[1136,1136],\"mapped\",[1137]],[[1137,1137],\"valid\"],[[1138,1138],\"mapped\",[1139]],[[1139,1139],\"valid\"],[[1140,1140],\"mapped\",[1141]],[[1141,1141],\"valid\"],[[1142,1142],\"mapped\",[1143]],[[1143,1143],\"valid\"],[[1144,1144],\"mapped\",[1145]],[[1145,1145],\"valid\"],[[1146,1146],\"mapped\",[1147]],[[1147,1147],\"valid\"],[[1148,1148],\"mapped\",[1149]],[[1149,1149],\"valid\"],[[1150,1150],\"mapped\",[1151]],[[1151,1151],\"valid\"],[[1152,1152],\"mapped\",[1153]],[[1153,1153],\"valid\"],[[1154,1154],\"valid\",[],\"NV8\"],[[1155,1158],\"valid\"],[[1159,1159],\"valid\"],[[1160,1161],\"valid\",[],\"NV8\"],[[1162,1162],\"mapped\",[1163]],[[1163,1163],\"valid\"],[[1164,1164],\"mapped\",[1165]],[[1165,1165],\"valid\"],[[1166,1166],\"mapped\",[1167]],[[1167,1167],\"valid\"],[[1168,1168],\"mapped\",[1169]],[[1169,1169],\"valid\"],[[1170,1170],\"mapped\",[1171]],[[1171,1171],\"valid\"],[[1172,1172],\"mapped\",[1173]],[[1173,1173],\"valid\"],[[1174,1174],\"mapped\",[1175]],[[1175,1175],\"valid\"],[[1176,1176],\"mapped\",[1177]],[[1177,1177],\"valid\"],[[1178,1178],\"mapped\",[1179]],[[1179,1179],\"valid\"],[[1180,1180],\"mapped\",[1181]],[[1181,1181],\"valid\"],[[1182,1182],\"mapped\",[1183]],[[1183,1183],\"valid\"],[[1184,1184],\"mapped\",[1185]],[[1185,1185],\"valid\"],[[1186,1186],\"mapped\",[1187]],[[1187,1187],\"valid\"],[[1188,1188],\"mapped\",[1189]],[[1189,1189],\"valid\"],[[1190,1190],\"mapped\",[1191]],[[1191,1191],\"valid\"],[[1192,1192],\"mapped\",[1193]],[[1193,1193],\"valid\"],[[1194,1194],\"mapped\",[1195]],[[1195,1195],\"valid\"],[[1196,1196],\"mapped\",[1197]],[[1197,1197],\"valid\"],[[1198,1198],\"mapped\",[1199]],[[1199,1199],\"valid\"],[[1200,1200],\"mapped\",[1201]],[[1201,1201],\"valid\"],[[1202,1202],\"mapped\",[1203]],[[1203,1203],\"valid\"],[[1204,1204],\"mapped\",[1205]],[[1205,1205],\"valid\"],[[1206,1206],\"mapped\",[1207]],[[1207,1207],\"valid\"],[[1208,1208],\"mapped\",[1209]],[[1209,1209],\"valid\"],[[1210,1210],\"mapped\",[1211]],[[1211,1211],\"valid\"],[[1212,1212],\"mapped\",[1213]],[[1213,1213],\"valid\"],[[1214,1214],\"mapped\",[1215]],[[1215,1215],\"valid\"],[[1216,1216],\"disallowed\"],[[1217,1217],\"mapped\",[1218]],[[1218,1218],\"valid\"],[[1219,1219],\"mapped\",[1220]],[[1220,1220],\"valid\"],[[1221,1221],\"mapped\",[1222]],[[1222,1222],\"valid\"],[[1223,1223],\"mapped\",[1224]],[[1224,1224],\"valid\"],[[1225,1225],\"mapped\",[1226]],[[1226,1226],\"valid\"],[[1227,1227],\"mapped\",[1228]],[[1228,1228],\"valid\"],[[1229,1229],\"mapped\",[1230]],[[1230,1230],\"valid\"],[[1231,1231],\"valid\"],[[1232,1232],\"mapped\",[1233]],[[1233,1233],\"valid\"],[[1234,1234],\"mapped\",[1235]],[[1235,1235],\"valid\"],[[1236,1236],\"mapped\",[1237]],[[1237,1237],\"valid\"],[[1238,1238],\"mapped\",[1239]],[[1239,1239],\"valid\"],[[1240,1240],\"mapped\",[1241]],[[1241,1241],\"valid\"],[[1242,1242],\"mapped\",[1243]],[[1243,1243],\"valid\"],[[1244,1244],\"mapped\",[1245]],[[1245,1245],\"valid\"],[[1246,1246],\"mapped\",[1247]],[[1247,1247],\"valid\"],[[1248,1248],\"mapped\",[1249]],[[1249,1249],\"valid\"],[[1250,1250],\"mapped\",[1251]],[[1251,1251],\"valid\"],[[1252,1252],\"mapped\",[1253]],[[1253,1253],\"valid\"],[[1254,1254],\"mapped\",[1255]],[[1255,1255],\"valid\"],[[1256,1256],\"mapped\",[1257]],[[1257,1257],\"valid\"],[[1258,1258],\"mapped\",[1259]],[[1259,1259],\"valid\"],[[1260,1260],\"mapped\",[1261]],[[1261,1261],\"valid\"],[[1262,1262],\"mapped\",[1263]],[[1263,1263],\"valid\"],[[1264,1264],\"mapped\",[1265]],[[1265,1265],\"valid\"],[[1266,1266],\"mapped\",[1267]],[[1267,1267],\"valid\"],[[1268,1268],\"mapped\",[1269]],[[1269,1269],\"valid\"],[[1270,1270],\"mapped\",[1271]],[[1271,1271],\"valid\"],[[1272,1272],\"mapped\",[1273]],[[1273,1273],\"valid\"],[[1274,1274],\"mapped\",[1275]],[[1275,1275],\"valid\"],[[1276,1276],\"mapped\",[1277]],[[1277,1277],\"valid\"],[[1278,1278],\"mapped\",[1279]],[[1279,1279],\"valid\"],[[1280,1280],\"mapped\",[1281]],[[1281,1281],\"valid\"],[[1282,1282],\"mapped\",[1283]],[[1283,1283],\"valid\"],[[1284,1284],\"mapped\",[1285]],[[1285,1285],\"valid\"],[[1286,1286],\"mapped\",[1287]],[[1287,1287],\"valid\"],[[1288,1288],\"mapped\",[1289]],[[1289,1289],\"valid\"],[[1290,1290],\"mapped\",[1291]],[[1291,1291],\"valid\"],[[1292,1292],\"mapped\",[1293]],[[1293,1293],\"valid\"],[[1294,1294],\"mapped\",[1295]],[[1295,1295],\"valid\"],[[1296,1296],\"mapped\",[1297]],[[1297,1297],\"valid\"],[[1298,1298],\"mapped\",[1299]],[[1299,1299],\"valid\"],[[1300,1300],\"mapped\",[1301]],[[1301,1301],\"valid\"],[[1302,1302],\"mapped\",[1303]],[[1303,1303],\"valid\"],[[1304,1304],\"mapped\",[1305]],[[1305,1305],\"valid\"],[[1306,1306],\"mapped\",[1307]],[[1307,1307],\"valid\"],[[1308,1308],\"mapped\",[1309]],[[1309,1309],\"valid\"],[[1310,1310],\"mapped\",[1311]],[[1311,1311],\"valid\"],[[1312,1312],\"mapped\",[1313]],[[1313,1313],\"valid\"],[[1314,1314],\"mapped\",[1315]],[[1315,1315],\"valid\"],[[1316,1316],\"mapped\",[1317]],[[1317,1317],\"valid\"],[[1318,1318],\"mapped\",[1319]],[[1319,1319],\"valid\"],[[1320,1320],\"mapped\",[1321]],[[1321,1321],\"valid\"],[[1322,1322],\"mapped\",[1323]],[[1323,1323],\"valid\"],[[1324,1324],\"mapped\",[1325]],[[1325,1325],\"valid\"],[[1326,1326],\"mapped\",[1327]],[[1327,1327],\"valid\"],[[1328,1328],\"disallowed\"],[[1329,1329],\"mapped\",[1377]],[[1330,1330],\"mapped\",[1378]],[[1331,1331],\"mapped\",[1379]],[[1332,1332],\"mapped\",[1380]],[[1333,1333],\"mapped\",[1381]],[[1334,1334],\"mapped\",[1382]],[[1335,1335],\"mapped\",[1383]],[[1336,1336],\"mapped\",[1384]],[[1337,1337],\"mapped\",[1385]],[[1338,1338],\"mapped\",[1386]],[[1339,1339],\"mapped\",[1387]],[[1340,1340],\"mapped\",[1388]],[[1341,1341],\"mapped\",[1389]],[[1342,1342],\"mapped\",[1390]],[[1343,1343],\"mapped\",[1391]],[[1344,1344],\"mapped\",[1392]],[[1345,1345],\"mapped\",[1393]],[[1346,1346],\"mapped\",[1394]],[[1347,1347],\"mapped\",[1395]],[[1348,1348],\"mapped\",[1396]],[[1349,1349],\"mapped\",[1397]],[[1350,1350],\"mapped\",[1398]],[[1351,1351],\"mapped\",[1399]],[[1352,1352],\"mapped\",[1400]],[[1353,1353],\"mapped\",[1401]],[[1354,1354],\"mapped\",[1402]],[[1355,1355],\"mapped\",[1403]],[[1356,1356],\"mapped\",[1404]],[[1357,1357],\"mapped\",[1405]],[[1358,1358],\"mapped\",[1406]],[[1359,1359],\"mapped\",[1407]],[[1360,1360],\"mapped\",[1408]],[[1361,1361],\"mapped\",[1409]],[[1362,1362],\"mapped\",[1410]],[[1363,1363],\"mapped\",[1411]],[[1364,1364],\"mapped\",[1412]],[[1365,1365],\"mapped\",[1413]],[[1366,1366],\"mapped\",[1414]],[[1367,1368],\"disallowed\"],[[1369,1369],\"valid\"],[[1370,1375],\"valid\",[],\"NV8\"],[[1376,1376],\"disallowed\"],[[1377,1414],\"valid\"],[[1415,1415],\"mapped\",[1381,1410]],[[1416,1416],\"disallowed\"],[[1417,1417],\"valid\",[],\"NV8\"],[[1418,1418],\"valid\",[],\"NV8\"],[[1419,1420],\"disallowed\"],[[1421,1422],\"valid\",[],\"NV8\"],[[1423,1423],\"valid\",[],\"NV8\"],[[1424,1424],\"disallowed\"],[[1425,1441],\"valid\"],[[1442,1442],\"valid\"],[[1443,1455],\"valid\"],[[1456,1465],\"valid\"],[[1466,1466],\"valid\"],[[1467,1469],\"valid\"],[[1470,1470],\"valid\",[],\"NV8\"],[[1471,1471],\"valid\"],[[1472,1472],\"valid\",[],\"NV8\"],[[1473,1474],\"valid\"],[[1475,1475],\"valid\",[],\"NV8\"],[[1476,1476],\"valid\"],[[1477,1477],\"valid\"],[[1478,1478],\"valid\",[],\"NV8\"],[[1479,1479],\"valid\"],[[1480,1487],\"disallowed\"],[[1488,1514],\"valid\"],[[1515,1519],\"disallowed\"],[[1520,1524],\"valid\"],[[1525,1535],\"disallowed\"],[[1536,1539],\"disallowed\"],[[1540,1540],\"disallowed\"],[[1541,1541],\"disallowed\"],[[1542,1546],\"valid\",[],\"NV8\"],[[1547,1547],\"valid\",[],\"NV8\"],[[1548,1548],\"valid\",[],\"NV8\"],[[1549,1551],\"valid\",[],\"NV8\"],[[1552,1557],\"valid\"],[[1558,1562],\"valid\"],[[1563,1563],\"valid\",[],\"NV8\"],[[1564,1564],\"disallowed\"],[[1565,1565],\"disallowed\"],[[1566,1566],\"valid\",[],\"NV8\"],[[1567,1567],\"valid\",[],\"NV8\"],[[1568,1568],\"valid\"],[[1569,1594],\"valid\"],[[1595,1599],\"valid\"],[[1600,1600],\"valid\",[],\"NV8\"],[[1601,1618],\"valid\"],[[1619,1621],\"valid\"],[[1622,1624],\"valid\"],[[1625,1630],\"valid\"],[[1631,1631],\"valid\"],[[1632,1641],\"valid\"],[[1642,1645],\"valid\",[],\"NV8\"],[[1646,1647],\"valid\"],[[1648,1652],\"valid\"],[[1653,1653],\"mapped\",[1575,1652]],[[1654,1654],\"mapped\",[1608,1652]],[[1655,1655],\"mapped\",[1735,1652]],[[1656,1656],\"mapped\",[1610,1652]],[[1657,1719],\"valid\"],[[1720,1721],\"valid\"],[[1722,1726],\"valid\"],[[1727,1727],\"valid\"],[[1728,1742],\"valid\"],[[1743,1743],\"valid\"],[[1744,1747],\"valid\"],[[1748,1748],\"valid\",[],\"NV8\"],[[1749,1756],\"valid\"],[[1757,1757],\"disallowed\"],[[1758,1758],\"valid\",[],\"NV8\"],[[1759,1768],\"valid\"],[[1769,1769],\"valid\",[],\"NV8\"],[[1770,1773],\"valid\"],[[1774,1775],\"valid\"],[[1776,1785],\"valid\"],[[1786,1790],\"valid\"],[[1791,1791],\"valid\"],[[1792,1805],\"valid\",[],\"NV8\"],[[1806,1806],\"disallowed\"],[[1807,1807],\"disallowed\"],[[1808,1836],\"valid\"],[[1837,1839],\"valid\"],[[1840,1866],\"valid\"],[[1867,1868],\"disallowed\"],[[1869,1871],\"valid\"],[[1872,1901],\"valid\"],[[1902,1919],\"valid\"],[[1920,1968],\"valid\"],[[1969,1969],\"valid\"],[[1970,1983],\"disallowed\"],[[1984,2037],\"valid\"],[[2038,2042],\"valid\",[],\"NV8\"],[[2043,2047],\"disallowed\"],[[2048,2093],\"valid\"],[[2094,2095],\"disallowed\"],[[2096,2110],\"valid\",[],\"NV8\"],[[2111,2111],\"disallowed\"],[[2112,2139],\"valid\"],[[2140,2141],\"disallowed\"],[[2142,2142],\"valid\",[],\"NV8\"],[[2143,2207],\"disallowed\"],[[2208,2208],\"valid\"],[[2209,2209],\"valid\"],[[2210,2220],\"valid\"],[[2221,2226],\"valid\"],[[2227,2228],\"valid\"],[[2229,2274],\"disallowed\"],[[2275,2275],\"valid\"],[[2276,2302],\"valid\"],[[2303,2303],\"valid\"],[[2304,2304],\"valid\"],[[2305,2307],\"valid\"],[[2308,2308],\"valid\"],[[2309,2361],\"valid\"],[[2362,2363],\"valid\"],[[2364,2381],\"valid\"],[[2382,2382],\"valid\"],[[2383,2383],\"valid\"],[[2384,2388],\"valid\"],[[2389,2389],\"valid\"],[[2390,2391],\"valid\"],[[2392,2392],\"mapped\",[2325,2364]],[[2393,2393],\"mapped\",[2326,2364]],[[2394,2394],\"mapped\",[2327,2364]],[[2395,2395],\"mapped\",[2332,2364]],[[2396,2396],\"mapped\",[2337,2364]],[[2397,2397],\"mapped\",[2338,2364]],[[2398,2398],\"mapped\",[2347,2364]],[[2399,2399],\"mapped\",[2351,2364]],[[2400,2403],\"valid\"],[[2404,2405],\"valid\",[],\"NV8\"],[[2406,2415],\"valid\"],[[2416,2416],\"valid\",[],\"NV8\"],[[2417,2418],\"valid\"],[[2419,2423],\"valid\"],[[2424,2424],\"valid\"],[[2425,2426],\"valid\"],[[2427,2428],\"valid\"],[[2429,2429],\"valid\"],[[2430,2431],\"valid\"],[[2432,2432],\"valid\"],[[2433,2435],\"valid\"],[[2436,2436],\"disallowed\"],[[2437,2444],\"valid\"],[[2445,2446],\"disallowed\"],[[2447,2448],\"valid\"],[[2449,2450],\"disallowed\"],[[2451,2472],\"valid\"],[[2473,2473],\"disallowed\"],[[2474,2480],\"valid\"],[[2481,2481],\"disallowed\"],[[2482,2482],\"valid\"],[[2483,2485],\"disallowed\"],[[2486,2489],\"valid\"],[[2490,2491],\"disallowed\"],[[2492,2492],\"valid\"],[[2493,2493],\"valid\"],[[2494,2500],\"valid\"],[[2501,2502],\"disallowed\"],[[2503,2504],\"valid\"],[[2505,2506],\"disallowed\"],[[2507,2509],\"valid\"],[[2510,2510],\"valid\"],[[2511,2518],\"disallowed\"],[[2519,2519],\"valid\"],[[2520,2523],\"disallowed\"],[[2524,2524],\"mapped\",[2465,2492]],[[2525,2525],\"mapped\",[2466,2492]],[[2526,2526],\"disallowed\"],[[2527,2527],\"mapped\",[2479,2492]],[[2528,2531],\"valid\"],[[2532,2533],\"disallowed\"],[[2534,2545],\"valid\"],[[2546,2554],\"valid\",[],\"NV8\"],[[2555,2555],\"valid\",[],\"NV8\"],[[2556,2560],\"disallowed\"],[[2561,2561],\"valid\"],[[2562,2562],\"valid\"],[[2563,2563],\"valid\"],[[2564,2564],\"disallowed\"],[[2565,2570],\"valid\"],[[2571,2574],\"disallowed\"],[[2575,2576],\"valid\"],[[2577,2578],\"disallowed\"],[[2579,2600],\"valid\"],[[2601,2601],\"disallowed\"],[[2602,2608],\"valid\"],[[2609,2609],\"disallowed\"],[[2610,2610],\"valid\"],[[2611,2611],\"mapped\",[2610,2620]],[[2612,2612],\"disallowed\"],[[2613,2613],\"valid\"],[[2614,2614],\"mapped\",[2616,2620]],[[2615,2615],\"disallowed\"],[[2616,2617],\"valid\"],[[2618,2619],\"disallowed\"],[[2620,2620],\"valid\"],[[2621,2621],\"disallowed\"],[[2622,2626],\"valid\"],[[2627,2630],\"disallowed\"],[[2631,2632],\"valid\"],[[2633,2634],\"disallowed\"],[[2635,2637],\"valid\"],[[2638,2640],\"disallowed\"],[[2641,2641],\"valid\"],[[2642,2648],\"disallowed\"],[[2649,2649],\"mapped\",[2582,2620]],[[2650,2650],\"mapped\",[2583,2620]],[[2651,2651],\"mapped\",[2588,2620]],[[2652,2652],\"valid\"],[[2653,2653],\"disallowed\"],[[2654,2654],\"mapped\",[2603,2620]],[[2655,2661],\"disallowed\"],[[2662,2676],\"valid\"],[[2677,2677],\"valid\"],[[2678,2688],\"disallowed\"],[[2689,2691],\"valid\"],[[2692,2692],\"disallowed\"],[[2693,2699],\"valid\"],[[2700,2700],\"valid\"],[[2701,2701],\"valid\"],[[2702,2702],\"disallowed\"],[[2703,2705],\"valid\"],[[2706,2706],\"disallowed\"],[[2707,2728],\"valid\"],[[2729,2729],\"disallowed\"],[[2730,2736],\"valid\"],[[2737,2737],\"disallowed\"],[[2738,2739],\"valid\"],[[2740,2740],\"disallowed\"],[[2741,2745],\"valid\"],[[2746,2747],\"disallowed\"],[[2748,2757],\"valid\"],[[2758,2758],\"disallowed\"],[[2759,2761],\"valid\"],[[2762,2762],\"disallowed\"],[[2763,2765],\"valid\"],[[2766,2767],\"disallowed\"],[[2768,2768],\"valid\"],[[2769,2783],\"disallowed\"],[[2784,2784],\"valid\"],[[2785,2787],\"valid\"],[[2788,2789],\"disallowed\"],[[2790,2799],\"valid\"],[[2800,2800],\"valid\",[],\"NV8\"],[[2801,2801],\"valid\",[],\"NV8\"],[[2802,2808],\"disallowed\"],[[2809,2809],\"valid\"],[[2810,2816],\"disallowed\"],[[2817,2819],\"valid\"],[[2820,2820],\"disallowed\"],[[2821,2828],\"valid\"],[[2829,2830],\"disallowed\"],[[2831,2832],\"valid\"],[[2833,2834],\"disallowed\"],[[2835,2856],\"valid\"],[[2857,2857],\"disallowed\"],[[2858,2864],\"valid\"],[[2865,2865],\"disallowed\"],[[2866,2867],\"valid\"],[[2868,2868],\"disallowed\"],[[2869,2869],\"valid\"],[[2870,2873],\"valid\"],[[2874,2875],\"disallowed\"],[[2876,2883],\"valid\"],[[2884,2884],\"valid\"],[[2885,2886],\"disallowed\"],[[2887,2888],\"valid\"],[[2889,2890],\"disallowed\"],[[2891,2893],\"valid\"],[[2894,2901],\"disallowed\"],[[2902,2903],\"valid\"],[[2904,2907],\"disallowed\"],[[2908,2908],\"mapped\",[2849,2876]],[[2909,2909],\"mapped\",[2850,2876]],[[2910,2910],\"disallowed\"],[[2911,2913],\"valid\"],[[2914,2915],\"valid\"],[[2916,2917],\"disallowed\"],[[2918,2927],\"valid\"],[[2928,2928],\"valid\",[],\"NV8\"],[[2929,2929],\"valid\"],[[2930,2935],\"valid\",[],\"NV8\"],[[2936,2945],\"disallowed\"],[[2946,2947],\"valid\"],[[2948,2948],\"disallowed\"],[[2949,2954],\"valid\"],[[2955,2957],\"disallowed\"],[[2958,2960],\"valid\"],[[2961,2961],\"disallowed\"],[[2962,2965],\"valid\"],[[2966,2968],\"disallowed\"],[[2969,2970],\"valid\"],[[2971,2971],\"disallowed\"],[[2972,2972],\"valid\"],[[2973,2973],\"disallowed\"],[[2974,2975],\"valid\"],[[2976,2978],\"disallowed\"],[[2979,2980],\"valid\"],[[2981,2983],\"disallowed\"],[[2984,2986],\"valid\"],[[2987,2989],\"disallowed\"],[[2990,2997],\"valid\"],[[2998,2998],\"valid\"],[[2999,3001],\"valid\"],[[3002,3005],\"disallowed\"],[[3006,3010],\"valid\"],[[3011,3013],\"disallowed\"],[[3014,3016],\"valid\"],[[3017,3017],\"disallowed\"],[[3018,3021],\"valid\"],[[3022,3023],\"disallowed\"],[[3024,3024],\"valid\"],[[3025,3030],\"disallowed\"],[[3031,3031],\"valid\"],[[3032,3045],\"disallowed\"],[[3046,3046],\"valid\"],[[3047,3055],\"valid\"],[[3056,3058],\"valid\",[],\"NV8\"],[[3059,3066],\"valid\",[],\"NV8\"],[[3067,3071],\"disallowed\"],[[3072,3072],\"valid\"],[[3073,3075],\"valid\"],[[3076,3076],\"disallowed\"],[[3077,3084],\"valid\"],[[3085,3085],\"disallowed\"],[[3086,3088],\"valid\"],[[3089,3089],\"disallowed\"],[[3090,3112],\"valid\"],[[3113,3113],\"disallowed\"],[[3114,3123],\"valid\"],[[3124,3124],\"valid\"],[[3125,3129],\"valid\"],[[3130,3132],\"disallowed\"],[[3133,3133],\"valid\"],[[3134,3140],\"valid\"],[[3141,3141],\"disallowed\"],[[3142,3144],\"valid\"],[[3145,3145],\"disallowed\"],[[3146,3149],\"valid\"],[[3150,3156],\"disallowed\"],[[3157,3158],\"valid\"],[[3159,3159],\"disallowed\"],[[3160,3161],\"valid\"],[[3162,3162],\"valid\"],[[3163,3167],\"disallowed\"],[[3168,3169],\"valid\"],[[3170,3171],\"valid\"],[[3172,3173],\"disallowed\"],[[3174,3183],\"valid\"],[[3184,3191],\"disallowed\"],[[3192,3199],\"valid\",[],\"NV8\"],[[3200,3200],\"disallowed\"],[[3201,3201],\"valid\"],[[3202,3203],\"valid\"],[[3204,3204],\"disallowed\"],[[3205,3212],\"valid\"],[[3213,3213],\"disallowed\"],[[3214,3216],\"valid\"],[[3217,3217],\"disallowed\"],[[3218,3240],\"valid\"],[[3241,3241],\"disallowed\"],[[3242,3251],\"valid\"],[[3252,3252],\"disallowed\"],[[3253,3257],\"valid\"],[[3258,3259],\"disallowed\"],[[3260,3261],\"valid\"],[[3262,3268],\"valid\"],[[3269,3269],\"disallowed\"],[[3270,3272],\"valid\"],[[3273,3273],\"disallowed\"],[[3274,3277],\"valid\"],[[3278,3284],\"disallowed\"],[[3285,3286],\"valid\"],[[3287,3293],\"disallowed\"],[[3294,3294],\"valid\"],[[3295,3295],\"disallowed\"],[[3296,3297],\"valid\"],[[3298,3299],\"valid\"],[[3300,3301],\"disallowed\"],[[3302,3311],\"valid\"],[[3312,3312],\"disallowed\"],[[3313,3314],\"valid\"],[[3315,3328],\"disallowed\"],[[3329,3329],\"valid\"],[[3330,3331],\"valid\"],[[3332,3332],\"disallowed\"],[[3333,3340],\"valid\"],[[3341,3341],\"disallowed\"],[[3342,3344],\"valid\"],[[3345,3345],\"disallowed\"],[[3346,3368],\"valid\"],[[3369,3369],\"valid\"],[[3370,3385],\"valid\"],[[3386,3386],\"valid\"],[[3387,3388],\"disallowed\"],[[3389,3389],\"valid\"],[[3390,3395],\"valid\"],[[3396,3396],\"valid\"],[[3397,3397],\"disallowed\"],[[3398,3400],\"valid\"],[[3401,3401],\"disallowed\"],[[3402,3405],\"valid\"],[[3406,3406],\"valid\"],[[3407,3414],\"disallowed\"],[[3415,3415],\"valid\"],[[3416,3422],\"disallowed\"],[[3423,3423],\"valid\"],[[3424,3425],\"valid\"],[[3426,3427],\"valid\"],[[3428,3429],\"disallowed\"],[[3430,3439],\"valid\"],[[3440,3445],\"valid\",[],\"NV8\"],[[3446,3448],\"disallowed\"],[[3449,3449],\"valid\",[],\"NV8\"],[[3450,3455],\"valid\"],[[3456,3457],\"disallowed\"],[[3458,3459],\"valid\"],[[3460,3460],\"disallowed\"],[[3461,3478],\"valid\"],[[3479,3481],\"disallowed\"],[[3482,3505],\"valid\"],[[3506,3506],\"disallowed\"],[[3507,3515],\"valid\"],[[3516,3516],\"disallowed\"],[[3517,3517],\"valid\"],[[3518,3519],\"disallowed\"],[[3520,3526],\"valid\"],[[3527,3529],\"disallowed\"],[[3530,3530],\"valid\"],[[3531,3534],\"disallowed\"],[[3535,3540],\"valid\"],[[3541,3541],\"disallowed\"],[[3542,3542],\"valid\"],[[3543,3543],\"disallowed\"],[[3544,3551],\"valid\"],[[3552,3557],\"disallowed\"],[[3558,3567],\"valid\"],[[3568,3569],\"disallowed\"],[[3570,3571],\"valid\"],[[3572,3572],\"valid\",[],\"NV8\"],[[3573,3584],\"disallowed\"],[[3585,3634],\"valid\"],[[3635,3635],\"mapped\",[3661,3634]],[[3636,3642],\"valid\"],[[3643,3646],\"disallowed\"],[[3647,3647],\"valid\",[],\"NV8\"],[[3648,3662],\"valid\"],[[3663,3663],\"valid\",[],\"NV8\"],[[3664,3673],\"valid\"],[[3674,3675],\"valid\",[],\"NV8\"],[[3676,3712],\"disallowed\"],[[3713,3714],\"valid\"],[[3715,3715],\"disallowed\"],[[3716,3716],\"valid\"],[[3717,3718],\"disallowed\"],[[3719,3720],\"valid\"],[[3721,3721],\"disallowed\"],[[3722,3722],\"valid\"],[[3723,3724],\"disallowed\"],[[3725,3725],\"valid\"],[[3726,3731],\"disallowed\"],[[3732,3735],\"valid\"],[[3736,3736],\"disallowed\"],[[3737,3743],\"valid\"],[[3744,3744],\"disallowed\"],[[3745,3747],\"valid\"],[[3748,3748],\"disallowed\"],[[3749,3749],\"valid\"],[[3750,3750],\"disallowed\"],[[3751,3751],\"valid\"],[[3752,3753],\"disallowed\"],[[3754,3755],\"valid\"],[[3756,3756],\"disallowed\"],[[3757,3762],\"valid\"],[[3763,3763],\"mapped\",[3789,3762]],[[3764,3769],\"valid\"],[[3770,3770],\"disallowed\"],[[3771,3773],\"valid\"],[[3774,3775],\"disallowed\"],[[3776,3780],\"valid\"],[[3781,3781],\"disallowed\"],[[3782,3782],\"valid\"],[[3783,3783],\"disallowed\"],[[3784,3789],\"valid\"],[[3790,3791],\"disallowed\"],[[3792,3801],\"valid\"],[[3802,3803],\"disallowed\"],[[3804,3804],\"mapped\",[3755,3737]],[[3805,3805],\"mapped\",[3755,3745]],[[3806,3807],\"valid\"],[[3808,3839],\"disallowed\"],[[3840,3840],\"valid\"],[[3841,3850],\"valid\",[],\"NV8\"],[[3851,3851],\"valid\"],[[3852,3852],\"mapped\",[3851]],[[3853,3863],\"valid\",[],\"NV8\"],[[3864,3865],\"valid\"],[[3866,3871],\"valid\",[],\"NV8\"],[[3872,3881],\"valid\"],[[3882,3892],\"valid\",[],\"NV8\"],[[3893,3893],\"valid\"],[[3894,3894],\"valid\",[],\"NV8\"],[[3895,3895],\"valid\"],[[3896,3896],\"valid\",[],\"NV8\"],[[3897,3897],\"valid\"],[[3898,3901],\"valid\",[],\"NV8\"],[[3902,3906],\"valid\"],[[3907,3907],\"mapped\",[3906,4023]],[[3908,3911],\"valid\"],[[3912,3912],\"disallowed\"],[[3913,3916],\"valid\"],[[3917,3917],\"mapped\",[3916,4023]],[[3918,3921],\"valid\"],[[3922,3922],\"mapped\",[3921,4023]],[[3923,3926],\"valid\"],[[3927,3927],\"mapped\",[3926,4023]],[[3928,3931],\"valid\"],[[3932,3932],\"mapped\",[3931,4023]],[[3933,3944],\"valid\"],[[3945,3945],\"mapped\",[3904,4021]],[[3946,3946],\"valid\"],[[3947,3948],\"valid\"],[[3949,3952],\"disallowed\"],[[3953,3954],\"valid\"],[[3955,3955],\"mapped\",[3953,3954]],[[3956,3956],\"valid\"],[[3957,3957],\"mapped\",[3953,3956]],[[3958,3958],\"mapped\",[4018,3968]],[[3959,3959],\"mapped\",[4018,3953,3968]],[[3960,3960],\"mapped\",[4019,3968]],[[3961,3961],\"mapped\",[4019,3953,3968]],[[3962,3968],\"valid\"],[[3969,3969],\"mapped\",[3953,3968]],[[3970,3972],\"valid\"],[[3973,3973],\"valid\",[],\"NV8\"],[[3974,3979],\"valid\"],[[3980,3983],\"valid\"],[[3984,3986],\"valid\"],[[3987,3987],\"mapped\",[3986,4023]],[[3988,3989],\"valid\"],[[3990,3990],\"valid\"],[[3991,3991],\"valid\"],[[3992,3992],\"disallowed\"],[[3993,3996],\"valid\"],[[3997,3997],\"mapped\",[3996,4023]],[[3998,4001],\"valid\"],[[4002,4002],\"mapped\",[4001,4023]],[[4003,4006],\"valid\"],[[4007,4007],\"mapped\",[4006,4023]],[[4008,4011],\"valid\"],[[4012,4012],\"mapped\",[4011,4023]],[[4013,4013],\"valid\"],[[4014,4016],\"valid\"],[[4017,4023],\"valid\"],[[4024,4024],\"valid\"],[[4025,4025],\"mapped\",[3984,4021]],[[4026,4028],\"valid\"],[[4029,4029],\"disallowed\"],[[4030,4037],\"valid\",[],\"NV8\"],[[4038,4038],\"valid\"],[[4039,4044],\"valid\",[],\"NV8\"],[[4045,4045],\"disallowed\"],[[4046,4046],\"valid\",[],\"NV8\"],[[4047,4047],\"valid\",[],\"NV8\"],[[4048,4049],\"valid\",[],\"NV8\"],[[4050,4052],\"valid\",[],\"NV8\"],[[4053,4056],\"valid\",[],\"NV8\"],[[4057,4058],\"valid\",[],\"NV8\"],[[4059,4095],\"disallowed\"],[[4096,4129],\"valid\"],[[4130,4130],\"valid\"],[[4131,4135],\"valid\"],[[4136,4136],\"valid\"],[[4137,4138],\"valid\"],[[4139,4139],\"valid\"],[[4140,4146],\"valid\"],[[4147,4149],\"valid\"],[[4150,4153],\"valid\"],[[4154,4159],\"valid\"],[[4160,4169],\"valid\"],[[4170,4175],\"valid\",[],\"NV8\"],[[4176,4185],\"valid\"],[[4186,4249],\"valid\"],[[4250,4253],\"valid\"],[[4254,4255],\"valid\",[],\"NV8\"],[[4256,4293],\"disallowed\"],[[4294,4294],\"disallowed\"],[[4295,4295],\"mapped\",[11559]],[[4296,4300],\"disallowed\"],[[4301,4301],\"mapped\",[11565]],[[4302,4303],\"disallowed\"],[[4304,4342],\"valid\"],[[4343,4344],\"valid\"],[[4345,4346],\"valid\"],[[4347,4347],\"valid\",[],\"NV8\"],[[4348,4348],\"mapped\",[4316]],[[4349,4351],\"valid\"],[[4352,4441],\"valid\",[],\"NV8\"],[[4442,4446],\"valid\",[],\"NV8\"],[[4447,4448],\"disallowed\"],[[4449,4514],\"valid\",[],\"NV8\"],[[4515,4519],\"valid\",[],\"NV8\"],[[4520,4601],\"valid\",[],\"NV8\"],[[4602,4607],\"valid\",[],\"NV8\"],[[4608,4614],\"valid\"],[[4615,4615],\"valid\"],[[4616,4678],\"valid\"],[[4679,4679],\"valid\"],[[4680,4680],\"valid\"],[[4681,4681],\"disallowed\"],[[4682,4685],\"valid\"],[[4686,4687],\"disallowed\"],[[4688,4694],\"valid\"],[[4695,4695],\"disallowed\"],[[4696,4696],\"valid\"],[[4697,4697],\"disallowed\"],[[4698,4701],\"valid\"],[[4702,4703],\"disallowed\"],[[4704,4742],\"valid\"],[[4743,4743],\"valid\"],[[4744,4744],\"valid\"],[[4745,4745],\"disallowed\"],[[4746,4749],\"valid\"],[[4750,4751],\"disallowed\"],[[4752,4782],\"valid\"],[[4783,4783],\"valid\"],[[4784,4784],\"valid\"],[[4785,4785],\"disallowed\"],[[4786,4789],\"valid\"],[[4790,4791],\"disallowed\"],[[4792,4798],\"valid\"],[[4799,4799],\"disallowed\"],[[4800,4800],\"valid\"],[[4801,4801],\"disallowed\"],[[4802,4805],\"valid\"],[[4806,4807],\"disallowed\"],[[4808,4814],\"valid\"],[[4815,4815],\"valid\"],[[4816,4822],\"valid\"],[[4823,4823],\"disallowed\"],[[4824,4846],\"valid\"],[[4847,4847],\"valid\"],[[4848,4878],\"valid\"],[[4879,4879],\"valid\"],[[4880,4880],\"valid\"],[[4881,4881],\"disallowed\"],[[4882,4885],\"valid\"],[[4886,4887],\"disallowed\"],[[4888,4894],\"valid\"],[[4895,4895],\"valid\"],[[4896,4934],\"valid\"],[[4935,4935],\"valid\"],[[4936,4954],\"valid\"],[[4955,4956],\"disallowed\"],[[4957,4958],\"valid\"],[[4959,4959],\"valid\"],[[4960,4960],\"valid\",[],\"NV8\"],[[4961,4988],\"valid\",[],\"NV8\"],[[4989,4991],\"disallowed\"],[[4992,5007],\"valid\"],[[5008,5017],\"valid\",[],\"NV8\"],[[5018,5023],\"disallowed\"],[[5024,5108],\"valid\"],[[5109,5109],\"valid\"],[[5110,5111],\"disallowed\"],[[5112,5112],\"mapped\",[5104]],[[5113,5113],\"mapped\",[5105]],[[5114,5114],\"mapped\",[5106]],[[5115,5115],\"mapped\",[5107]],[[5116,5116],\"mapped\",[5108]],[[5117,5117],\"mapped\",[5109]],[[5118,5119],\"disallowed\"],[[5120,5120],\"valid\",[],\"NV8\"],[[5121,5740],\"valid\"],[[5741,5742],\"valid\",[],\"NV8\"],[[5743,5750],\"valid\"],[[5751,5759],\"valid\"],[[5760,5760],\"disallowed\"],[[5761,5786],\"valid\"],[[5787,5788],\"valid\",[],\"NV8\"],[[5789,5791],\"disallowed\"],[[5792,5866],\"valid\"],[[5867,5872],\"valid\",[],\"NV8\"],[[5873,5880],\"valid\"],[[5881,5887],\"disallowed\"],[[5888,5900],\"valid\"],[[5901,5901],\"disallowed\"],[[5902,5908],\"valid\"],[[5909,5919],\"disallowed\"],[[5920,5940],\"valid\"],[[5941,5942],\"valid\",[],\"NV8\"],[[5943,5951],\"disallowed\"],[[5952,5971],\"valid\"],[[5972,5983],\"disallowed\"],[[5984,5996],\"valid\"],[[5997,5997],\"disallowed\"],[[5998,6000],\"valid\"],[[6001,6001],\"disallowed\"],[[6002,6003],\"valid\"],[[6004,6015],\"disallowed\"],[[6016,6067],\"valid\"],[[6068,6069],\"disallowed\"],[[6070,6099],\"valid\"],[[6100,6102],\"valid\",[],\"NV8\"],[[6103,6103],\"valid\"],[[6104,6107],\"valid\",[],\"NV8\"],[[6108,6108],\"valid\"],[[6109,6109],\"valid\"],[[6110,6111],\"disallowed\"],[[6112,6121],\"valid\"],[[6122,6127],\"disallowed\"],[[6128,6137],\"valid\",[],\"NV8\"],[[6138,6143],\"disallowed\"],[[6144,6149],\"valid\",[],\"NV8\"],[[6150,6150],\"disallowed\"],[[6151,6154],\"valid\",[],\"NV8\"],[[6155,6157],\"ignored\"],[[6158,6158],\"disallowed\"],[[6159,6159],\"disallowed\"],[[6160,6169],\"valid\"],[[6170,6175],\"disallowed\"],[[6176,6263],\"valid\"],[[6264,6271],\"disallowed\"],[[6272,6313],\"valid\"],[[6314,6314],\"valid\"],[[6315,6319],\"disallowed\"],[[6320,6389],\"valid\"],[[6390,6399],\"disallowed\"],[[6400,6428],\"valid\"],[[6429,6430],\"valid\"],[[6431,6431],\"disallowed\"],[[6432,6443],\"valid\"],[[6444,6447],\"disallowed\"],[[6448,6459],\"valid\"],[[6460,6463],\"disallowed\"],[[6464,6464],\"valid\",[],\"NV8\"],[[6465,6467],\"disallowed\"],[[6468,6469],\"valid\",[],\"NV8\"],[[6470,6509],\"valid\"],[[6510,6511],\"disallowed\"],[[6512,6516],\"valid\"],[[6517,6527],\"disallowed\"],[[6528,6569],\"valid\"],[[6570,6571],\"valid\"],[[6572,6575],\"disallowed\"],[[6576,6601],\"valid\"],[[6602,6607],\"disallowed\"],[[6608,6617],\"valid\"],[[6618,6618],\"valid\",[],\"XV8\"],[[6619,6621],\"disallowed\"],[[6622,6623],\"valid\",[],\"NV8\"],[[6624,6655],\"valid\",[],\"NV8\"],[[6656,6683],\"valid\"],[[6684,6685],\"disallowed\"],[[6686,6687],\"valid\",[],\"NV8\"],[[6688,6750],\"valid\"],[[6751,6751],\"disallowed\"],[[6752,6780],\"valid\"],[[6781,6782],\"disallowed\"],[[6783,6793],\"valid\"],[[6794,6799],\"disallowed\"],[[6800,6809],\"valid\"],[[6810,6815],\"disallowed\"],[[6816,6822],\"valid\",[],\"NV8\"],[[6823,6823],\"valid\"],[[6824,6829],\"valid\",[],\"NV8\"],[[6830,6831],\"disallowed\"],[[6832,6845],\"valid\"],[[6846,6846],\"valid\",[],\"NV8\"],[[6847,6911],\"disallowed\"],[[6912,6987],\"valid\"],[[6988,6991],\"disallowed\"],[[6992,7001],\"valid\"],[[7002,7018],\"valid\",[],\"NV8\"],[[7019,7027],\"valid\"],[[7028,7036],\"valid\",[],\"NV8\"],[[7037,7039],\"disallowed\"],[[7040,7082],\"valid\"],[[7083,7085],\"valid\"],[[7086,7097],\"valid\"],[[7098,7103],\"valid\"],[[7104,7155],\"valid\"],[[7156,7163],\"disallowed\"],[[7164,7167],\"valid\",[],\"NV8\"],[[7168,7223],\"valid\"],[[7224,7226],\"disallowed\"],[[7227,7231],\"valid\",[],\"NV8\"],[[7232,7241],\"valid\"],[[7242,7244],\"disallowed\"],[[7245,7293],\"valid\"],[[7294,7295],\"valid\",[],\"NV8\"],[[7296,7359],\"disallowed\"],[[7360,7367],\"valid\",[],\"NV8\"],[[7368,7375],\"disallowed\"],[[7376,7378],\"valid\"],[[7379,7379],\"valid\",[],\"NV8\"],[[7380,7410],\"valid\"],[[7411,7414],\"valid\"],[[7415,7415],\"disallowed\"],[[7416,7417],\"valid\"],[[7418,7423],\"disallowed\"],[[7424,7467],\"valid\"],[[7468,7468],\"mapped\",[97]],[[7469,7469],\"mapped\",[230]],[[7470,7470],\"mapped\",[98]],[[7471,7471],\"valid\"],[[7472,7472],\"mapped\",[100]],[[7473,7473],\"mapped\",[101]],[[7474,7474],\"mapped\",[477]],[[7475,7475],\"mapped\",[103]],[[7476,7476],\"mapped\",[104]],[[7477,7477],\"mapped\",[105]],[[7478,7478],\"mapped\",[106]],[[7479,7479],\"mapped\",[107]],[[7480,7480],\"mapped\",[108]],[[7481,7481],\"mapped\",[109]],[[7482,7482],\"mapped\",[110]],[[7483,7483],\"valid\"],[[7484,7484],\"mapped\",[111]],[[7485,7485],\"mapped\",[547]],[[7486,7486],\"mapped\",[112]],[[7487,7487],\"mapped\",[114]],[[7488,7488],\"mapped\",[116]],[[7489,7489],\"mapped\",[117]],[[7490,7490],\"mapped\",[119]],[[7491,7491],\"mapped\",[97]],[[7492,7492],\"mapped\",[592]],[[7493,7493],\"mapped\",[593]],[[7494,7494],\"mapped\",[7426]],[[7495,7495],\"mapped\",[98]],[[7496,7496],\"mapped\",[100]],[[7497,7497],\"mapped\",[101]],[[7498,7498],\"mapped\",[601]],[[7499,7499],\"mapped\",[603]],[[7500,7500],\"mapped\",[604]],[[7501,7501],\"mapped\",[103]],[[7502,7502],\"valid\"],[[7503,7503],\"mapped\",[107]],[[7504,7504],\"mapped\",[109]],[[7505,7505],\"mapped\",[331]],[[7506,7506],\"mapped\",[111]],[[7507,7507],\"mapped\",[596]],[[7508,7508],\"mapped\",[7446]],[[7509,7509],\"mapped\",[7447]],[[7510,7510],\"mapped\",[112]],[[7511,7511],\"mapped\",[116]],[[7512,7512],\"mapped\",[117]],[[7513,7513],\"mapped\",[7453]],[[7514,7514],\"mapped\",[623]],[[7515,7515],\"mapped\",[118]],[[7516,7516],\"mapped\",[7461]],[[7517,7517],\"mapped\",[946]],[[7518,7518],\"mapped\",[947]],[[7519,7519],\"mapped\",[948]],[[7520,7520],\"mapped\",[966]],[[7521,7521],\"mapped\",[967]],[[7522,7522],\"mapped\",[105]],[[7523,7523],\"mapped\",[114]],[[7524,7524],\"mapped\",[117]],[[7525,7525],\"mapped\",[118]],[[7526,7526],\"mapped\",[946]],[[7527,7527],\"mapped\",[947]],[[7528,7528],\"mapped\",[961]],[[7529,7529],\"mapped\",[966]],[[7530,7530],\"mapped\",[967]],[[7531,7531],\"valid\"],[[7532,7543],\"valid\"],[[7544,7544],\"mapped\",[1085]],[[7545,7578],\"valid\"],[[7579,7579],\"mapped\",[594]],[[7580,7580],\"mapped\",[99]],[[7581,7581],\"mapped\",[597]],[[7582,7582],\"mapped\",[240]],[[7583,7583],\"mapped\",[604]],[[7584,7584],\"mapped\",[102]],[[7585,7585],\"mapped\",[607]],[[7586,7586],\"mapped\",[609]],[[7587,7587],\"mapped\",[613]],[[7588,7588],\"mapped\",[616]],[[7589,7589],\"mapped\",[617]],[[7590,7590],\"mapped\",[618]],[[7591,7591],\"mapped\",[7547]],[[7592,7592],\"mapped\",[669]],[[7593,7593],\"mapped\",[621]],[[7594,7594],\"mapped\",[7557]],[[7595,7595],\"mapped\",[671]],[[7596,7596],\"mapped\",[625]],[[7597,7597],\"mapped\",[624]],[[7598,7598],\"mapped\",[626]],[[7599,7599],\"mapped\",[627]],[[7600,7600],\"mapped\",[628]],[[7601,7601],\"mapped\",[629]],[[7602,7602],\"mapped\",[632]],[[7603,7603],\"mapped\",[642]],[[7604,7604],\"mapped\",[643]],[[7605,7605],\"mapped\",[427]],[[7606,7606],\"mapped\",[649]],[[7607,7607],\"mapped\",[650]],[[7608,7608],\"mapped\",[7452]],[[7609,7609],\"mapped\",[651]],[[7610,7610],\"mapped\",[652]],[[7611,7611],\"mapped\",[122]],[[7612,7612],\"mapped\",[656]],[[7613,7613],\"mapped\",[657]],[[7614,7614],\"mapped\",[658]],[[7615,7615],\"mapped\",[952]],[[7616,7619],\"valid\"],[[7620,7626],\"valid\"],[[7627,7654],\"valid\"],[[7655,7669],\"valid\"],[[7670,7675],\"disallowed\"],[[7676,7676],\"valid\"],[[7677,7677],\"valid\"],[[7678,7679],\"valid\"],[[7680,7680],\"mapped\",[7681]],[[7681,7681],\"valid\"],[[7682,7682],\"mapped\",[7683]],[[7683,7683],\"valid\"],[[7684,7684],\"mapped\",[7685]],[[7685,7685],\"valid\"],[[7686,7686],\"mapped\",[7687]],[[7687,7687],\"valid\"],[[7688,7688],\"mapped\",[7689]],[[7689,7689],\"valid\"],[[7690,7690],\"mapped\",[7691]],[[7691,7691],\"valid\"],[[7692,7692],\"mapped\",[7693]],[[7693,7693],\"valid\"],[[7694,7694],\"mapped\",[7695]],[[7695,7695],\"valid\"],[[7696,7696],\"mapped\",[7697]],[[7697,7697],\"valid\"],[[7698,7698],\"mapped\",[7699]],[[7699,7699],\"valid\"],[[7700,7700],\"mapped\",[7701]],[[7701,7701],\"valid\"],[[7702,7702],\"mapped\",[7703]],[[7703,7703],\"valid\"],[[7704,7704],\"mapped\",[7705]],[[7705,7705],\"valid\"],[[7706,7706],\"mapped\",[7707]],[[7707,7707],\"valid\"],[[7708,7708],\"mapped\",[7709]],[[7709,7709],\"valid\"],[[7710,7710],\"mapped\",[7711]],[[7711,7711],\"valid\"],[[7712,7712],\"mapped\",[7713]],[[7713,7713],\"valid\"],[[7714,7714],\"mapped\",[7715]],[[7715,7715],\"valid\"],[[7716,7716],\"mapped\",[7717]],[[7717,7717],\"valid\"],[[7718,7718],\"mapped\",[7719]],[[7719,7719],\"valid\"],[[7720,7720],\"mapped\",[7721]],[[7721,7721],\"valid\"],[[7722,7722],\"mapped\",[7723]],[[7723,7723],\"valid\"],[[7724,7724],\"mapped\",[7725]],[[7725,7725],\"valid\"],[[7726,7726],\"mapped\",[7727]],[[7727,7727],\"valid\"],[[7728,7728],\"mapped\",[7729]],[[7729,7729],\"valid\"],[[7730,7730],\"mapped\",[7731]],[[7731,7731],\"valid\"],[[7732,7732],\"mapped\",[7733]],[[7733,7733],\"valid\"],[[7734,7734],\"mapped\",[7735]],[[7735,7735],\"valid\"],[[7736,7736],\"mapped\",[7737]],[[7737,7737],\"valid\"],[[7738,7738],\"mapped\",[7739]],[[7739,7739],\"valid\"],[[7740,7740],\"mapped\",[7741]],[[7741,7741],\"valid\"],[[7742,7742],\"mapped\",[7743]],[[7743,7743],\"valid\"],[[7744,7744],\"mapped\",[7745]],[[7745,7745],\"valid\"],[[7746,7746],\"mapped\",[7747]],[[7747,7747],\"valid\"],[[7748,7748],\"mapped\",[7749]],[[7749,7749],\"valid\"],[[7750,7750],\"mapped\",[7751]],[[7751,7751],\"valid\"],[[7752,7752],\"mapped\",[7753]],[[7753,7753],\"valid\"],[[7754,7754],\"mapped\",[7755]],[[7755,7755],\"valid\"],[[7756,7756],\"mapped\",[7757]],[[7757,7757],\"valid\"],[[7758,7758],\"mapped\",[7759]],[[7759,7759],\"valid\"],[[7760,7760],\"mapped\",[7761]],[[7761,7761],\"valid\"],[[7762,7762],\"mapped\",[7763]],[[7763,7763],\"valid\"],[[7764,7764],\"mapped\",[7765]],[[7765,7765],\"valid\"],[[7766,7766],\"mapped\",[7767]],[[7767,7767],\"valid\"],[[7768,7768],\"mapped\",[7769]],[[7769,7769],\"valid\"],[[7770,7770],\"mapped\",[7771]],[[7771,7771],\"valid\"],[[7772,7772],\"mapped\",[7773]],[[7773,7773],\"valid\"],[[7774,7774],\"mapped\",[7775]],[[7775,7775],\"valid\"],[[7776,7776],\"mapped\",[7777]],[[7777,7777],\"valid\"],[[7778,7778],\"mapped\",[7779]],[[7779,7779],\"valid\"],[[7780,7780],\"mapped\",[7781]],[[7781,7781],\"valid\"],[[7782,7782],\"mapped\",[7783]],[[7783,7783],\"valid\"],[[7784,7784],\"mapped\",[7785]],[[7785,7785],\"valid\"],[[7786,7786],\"mapped\",[7787]],[[7787,7787],\"valid\"],[[7788,7788],\"mapped\",[7789]],[[7789,7789],\"valid\"],[[7790,7790],\"mapped\",[7791]],[[7791,7791],\"valid\"],[[7792,7792],\"mapped\",[7793]],[[7793,7793],\"valid\"],[[7794,7794],\"mapped\",[7795]],[[7795,7795],\"valid\"],[[7796,7796],\"mapped\",[7797]],[[7797,7797],\"valid\"],[[7798,7798],\"mapped\",[7799]],[[7799,7799],\"valid\"],[[7800,7800],\"mapped\",[7801]],[[7801,7801],\"valid\"],[[7802,7802],\"mapped\",[7803]],[[7803,7803],\"valid\"],[[7804,7804],\"mapped\",[7805]],[[7805,7805],\"valid\"],[[7806,7806],\"mapped\",[7807]],[[7807,7807],\"valid\"],[[7808,7808],\"mapped\",[7809]],[[7809,7809],\"valid\"],[[7810,7810],\"mapped\",[7811]],[[7811,7811],\"valid\"],[[7812,7812],\"mapped\",[7813]],[[7813,7813],\"valid\"],[[7814,7814],\"mapped\",[7815]],[[7815,7815],\"valid\"],[[7816,7816],\"mapped\",[7817]],[[7817,7817],\"valid\"],[[7818,7818],\"mapped\",[7819]],[[7819,7819],\"valid\"],[[7820,7820],\"mapped\",[7821]],[[7821,7821],\"valid\"],[[7822,7822],\"mapped\",[7823]],[[7823,7823],\"valid\"],[[7824,7824],\"mapped\",[7825]],[[7825,7825],\"valid\"],[[7826,7826],\"mapped\",[7827]],[[7827,7827],\"valid\"],[[7828,7828],\"mapped\",[7829]],[[7829,7833],\"valid\"],[[7834,7834],\"mapped\",[97,702]],[[7835,7835],\"mapped\",[7777]],[[7836,7837],\"valid\"],[[7838,7838],\"mapped\",[115,115]],[[7839,7839],\"valid\"],[[7840,7840],\"mapped\",[7841]],[[7841,7841],\"valid\"],[[7842,7842],\"mapped\",[7843]],[[7843,7843],\"valid\"],[[7844,7844],\"mapped\",[7845]],[[7845,7845],\"valid\"],[[7846,7846],\"mapped\",[7847]],[[7847,7847],\"valid\"],[[7848,7848],\"mapped\",[7849]],[[7849,7849],\"valid\"],[[7850,7850],\"mapped\",[7851]],[[7851,7851],\"valid\"],[[7852,7852],\"mapped\",[7853]],[[7853,7853],\"valid\"],[[7854,7854],\"mapped\",[7855]],[[7855,7855],\"valid\"],[[7856,7856],\"mapped\",[7857]],[[7857,7857],\"valid\"],[[7858,7858],\"mapped\",[7859]],[[7859,7859],\"valid\"],[[7860,7860],\"mapped\",[7861]],[[7861,7861],\"valid\"],[[7862,7862],\"mapped\",[7863]],[[7863,7863],\"valid\"],[[7864,7864],\"mapped\",[7865]],[[7865,7865],\"valid\"],[[7866,7866],\"mapped\",[7867]],[[7867,7867],\"valid\"],[[7868,7868],\"mapped\",[7869]],[[7869,7869],\"valid\"],[[7870,7870],\"mapped\",[7871]],[[7871,7871],\"valid\"],[[7872,7872],\"mapped\",[7873]],[[7873,7873],\"valid\"],[[7874,7874],\"mapped\",[7875]],[[7875,7875],\"valid\"],[[7876,7876],\"mapped\",[7877]],[[7877,7877],\"valid\"],[[7878,7878],\"mapped\",[7879]],[[7879,7879],\"valid\"],[[7880,7880],\"mapped\",[7881]],[[7881,7881],\"valid\"],[[7882,7882],\"mapped\",[7883]],[[7883,7883],\"valid\"],[[7884,7884],\"mapped\",[7885]],[[7885,7885],\"valid\"],[[7886,7886],\"mapped\",[7887]],[[7887,7887],\"valid\"],[[7888,7888],\"mapped\",[7889]],[[7889,7889],\"valid\"],[[7890,7890],\"mapped\",[7891]],[[7891,7891],\"valid\"],[[7892,7892],\"mapped\",[7893]],[[7893,7893],\"valid\"],[[7894,7894],\"mapped\",[7895]],[[7895,7895],\"valid\"],[[7896,7896],\"mapped\",[7897]],[[7897,7897],\"valid\"],[[7898,7898],\"mapped\",[7899]],[[7899,7899],\"valid\"],[[7900,7900],\"mapped\",[7901]],[[7901,7901],\"valid\"],[[7902,7902],\"mapped\",[7903]],[[7903,7903],\"valid\"],[[7904,7904],\"mapped\",[7905]],[[7905,7905],\"valid\"],[[7906,7906],\"mapped\",[7907]],[[7907,7907],\"valid\"],[[7908,7908],\"mapped\",[7909]],[[7909,7909],\"valid\"],[[7910,7910],\"mapped\",[7911]],[[7911,7911],\"valid\"],[[7912,7912],\"mapped\",[7913]],[[7913,7913],\"valid\"],[[7914,7914],\"mapped\",[7915]],[[7915,7915],\"valid\"],[[7916,7916],\"mapped\",[7917]],[[7917,7917],\"valid\"],[[7918,7918],\"mapped\",[7919]],[[7919,7919],\"valid\"],[[7920,7920],\"mapped\",[7921]],[[7921,7921],\"valid\"],[[7922,7922],\"mapped\",[7923]],[[7923,7923],\"valid\"],[[7924,7924],\"mapped\",[7925]],[[7925,7925],\"valid\"],[[7926,7926],\"mapped\",[7927]],[[7927,7927],\"valid\"],[[7928,7928],\"mapped\",[7929]],[[7929,7929],\"valid\"],[[7930,7930],\"mapped\",[7931]],[[7931,7931],\"valid\"],[[7932,7932],\"mapped\",[7933]],[[7933,7933],\"valid\"],[[7934,7934],\"mapped\",[7935]],[[7935,7935],\"valid\"],[[7936,7943],\"valid\"],[[7944,7944],\"mapped\",[7936]],[[7945,7945],\"mapped\",[7937]],[[7946,7946],\"mapped\",[7938]],[[7947,7947],\"mapped\",[7939]],[[7948,7948],\"mapped\",[7940]],[[7949,7949],\"mapped\",[7941]],[[7950,7950],\"mapped\",[7942]],[[7951,7951],\"mapped\",[7943]],[[7952,7957],\"valid\"],[[7958,7959],\"disallowed\"],[[7960,7960],\"mapped\",[7952]],[[7961,7961],\"mapped\",[7953]],[[7962,7962],\"mapped\",[7954]],[[7963,7963],\"mapped\",[7955]],[[7964,7964],\"mapped\",[7956]],[[7965,7965],\"mapped\",[7957]],[[7966,7967],\"disallowed\"],[[7968,7975],\"valid\"],[[7976,7976],\"mapped\",[7968]],[[7977,7977],\"mapped\",[7969]],[[7978,7978],\"mapped\",[7970]],[[7979,7979],\"mapped\",[7971]],[[7980,7980],\"mapped\",[7972]],[[7981,7981],\"mapped\",[7973]],[[7982,7982],\"mapped\",[7974]],[[7983,7983],\"mapped\",[7975]],[[7984,7991],\"valid\"],[[7992,7992],\"mapped\",[7984]],[[7993,7993],\"mapped\",[7985]],[[7994,7994],\"mapped\",[7986]],[[7995,7995],\"mapped\",[7987]],[[7996,7996],\"mapped\",[7988]],[[7997,7997],\"mapped\",[7989]],[[7998,7998],\"mapped\",[7990]],[[7999,7999],\"mapped\",[7991]],[[8000,8005],\"valid\"],[[8006,8007],\"disallowed\"],[[8008,8008],\"mapped\",[8000]],[[8009,8009],\"mapped\",[8001]],[[8010,8010],\"mapped\",[8002]],[[8011,8011],\"mapped\",[8003]],[[8012,8012],\"mapped\",[8004]],[[8013,8013],\"mapped\",[8005]],[[8014,8015],\"disallowed\"],[[8016,8023],\"valid\"],[[8024,8024],\"disallowed\"],[[8025,8025],\"mapped\",[8017]],[[8026,8026],\"disallowed\"],[[8027,8027],\"mapped\",[8019]],[[8028,8028],\"disallowed\"],[[8029,8029],\"mapped\",[8021]],[[8030,8030],\"disallowed\"],[[8031,8031],\"mapped\",[8023]],[[8032,8039],\"valid\"],[[8040,8040],\"mapped\",[8032]],[[8041,8041],\"mapped\",[8033]],[[8042,8042],\"mapped\",[8034]],[[8043,8043],\"mapped\",[8035]],[[8044,8044],\"mapped\",[8036]],[[8045,8045],\"mapped\",[8037]],[[8046,8046],\"mapped\",[8038]],[[8047,8047],\"mapped\",[8039]],[[8048,8048],\"valid\"],[[8049,8049],\"mapped\",[940]],[[8050,8050],\"valid\"],[[8051,8051],\"mapped\",[941]],[[8052,8052],\"valid\"],[[8053,8053],\"mapped\",[942]],[[8054,8054],\"valid\"],[[8055,8055],\"mapped\",[943]],[[8056,8056],\"valid\"],[[8057,8057],\"mapped\",[972]],[[8058,8058],\"valid\"],[[8059,8059],\"mapped\",[973]],[[8060,8060],\"valid\"],[[8061,8061],\"mapped\",[974]],[[8062,8063],\"disallowed\"],[[8064,8064],\"mapped\",[7936,953]],[[8065,8065],\"mapped\",[7937,953]],[[8066,8066],\"mapped\",[7938,953]],[[8067,8067],\"mapped\",[7939,953]],[[8068,8068],\"mapped\",[7940,953]],[[8069,8069],\"mapped\",[7941,953]],[[8070,8070],\"mapped\",[7942,953]],[[8071,8071],\"mapped\",[7943,953]],[[8072,8072],\"mapped\",[7936,953]],[[8073,8073],\"mapped\",[7937,953]],[[8074,8074],\"mapped\",[7938,953]],[[8075,8075],\"mapped\",[7939,953]],[[8076,8076],\"mapped\",[7940,953]],[[8077,8077],\"mapped\",[7941,953]],[[8078,8078],\"mapped\",[7942,953]],[[8079,8079],\"mapped\",[7943,953]],[[8080,8080],\"mapped\",[7968,953]],[[8081,8081],\"mapped\",[7969,953]],[[8082,8082],\"mapped\",[7970,953]],[[8083,8083],\"mapped\",[7971,953]],[[8084,8084],\"mapped\",[7972,953]],[[8085,8085],\"mapped\",[7973,953]],[[8086,8086],\"mapped\",[7974,953]],[[8087,8087],\"mapped\",[7975,953]],[[8088,8088],\"mapped\",[7968,953]],[[8089,8089],\"mapped\",[7969,953]],[[8090,8090],\"mapped\",[7970,953]],[[8091,8091],\"mapped\",[7971,953]],[[8092,8092],\"mapped\",[7972,953]],[[8093,8093],\"mapped\",[7973,953]],[[8094,8094],\"mapped\",[7974,953]],[[8095,8095],\"mapped\",[7975,953]],[[8096,8096],\"mapped\",[8032,953]],[[8097,8097],\"mapped\",[8033,953]],[[8098,8098],\"mapped\",[8034,953]],[[8099,8099],\"mapped\",[8035,953]],[[8100,8100],\"mapped\",[8036,953]],[[8101,8101],\"mapped\",[8037,953]],[[8102,8102],\"mapped\",[8038,953]],[[8103,8103],\"mapped\",[8039,953]],[[8104,8104],\"mapped\",[8032,953]],[[8105,8105],\"mapped\",[8033,953]],[[8106,8106],\"mapped\",[8034,953]],[[8107,8107],\"mapped\",[8035,953]],[[8108,8108],\"mapped\",[8036,953]],[[8109,8109],\"mapped\",[8037,953]],[[8110,8110],\"mapped\",[8038,953]],[[8111,8111],\"mapped\",[8039,953]],[[8112,8113],\"valid\"],[[8114,8114],\"mapped\",[8048,953]],[[8115,8115],\"mapped\",[945,953]],[[8116,8116],\"mapped\",[940,953]],[[8117,8117],\"disallowed\"],[[8118,8118],\"valid\"],[[8119,8119],\"mapped\",[8118,953]],[[8120,8120],\"mapped\",[8112]],[[8121,8121],\"mapped\",[8113]],[[8122,8122],\"mapped\",[8048]],[[8123,8123],\"mapped\",[940]],[[8124,8124],\"mapped\",[945,953]],[[8125,8125],\"disallowed_STD3_mapped\",[32,787]],[[8126,8126],\"mapped\",[953]],[[8127,8127],\"disallowed_STD3_mapped\",[32,787]],[[8128,8128],\"disallowed_STD3_mapped\",[32,834]],[[8129,8129],\"disallowed_STD3_mapped\",[32,776,834]],[[8130,8130],\"mapped\",[8052,953]],[[8131,8131],\"mapped\",[951,953]],[[8132,8132],\"mapped\",[942,953]],[[8133,8133],\"disallowed\"],[[8134,8134],\"valid\"],[[8135,8135],\"mapped\",[8134,953]],[[8136,8136],\"mapped\",[8050]],[[8137,8137],\"mapped\",[941]],[[8138,8138],\"mapped\",[8052]],[[8139,8139],\"mapped\",[942]],[[8140,8140],\"mapped\",[951,953]],[[8141,8141],\"disallowed_STD3_mapped\",[32,787,768]],[[8142,8142],\"disallowed_STD3_mapped\",[32,787,769]],[[8143,8143],\"disallowed_STD3_mapped\",[32,787,834]],[[8144,8146],\"valid\"],[[8147,8147],\"mapped\",[912]],[[8148,8149],\"disallowed\"],[[8150,8151],\"valid\"],[[8152,8152],\"mapped\",[8144]],[[8153,8153],\"mapped\",[8145]],[[8154,8154],\"mapped\",[8054]],[[8155,8155],\"mapped\",[943]],[[8156,8156],\"disallowed\"],[[8157,8157],\"disallowed_STD3_mapped\",[32,788,768]],[[8158,8158],\"disallowed_STD3_mapped\",[32,788,769]],[[8159,8159],\"disallowed_STD3_mapped\",[32,788,834]],[[8160,8162],\"valid\"],[[8163,8163],\"mapped\",[944]],[[8164,8167],\"valid\"],[[8168,8168],\"mapped\",[8160]],[[8169,8169],\"mapped\",[8161]],[[8170,8170],\"mapped\",[8058]],[[8171,8171],\"mapped\",[973]],[[8172,8172],\"mapped\",[8165]],[[8173,8173],\"disallowed_STD3_mapped\",[32,776,768]],[[8174,8174],\"disallowed_STD3_mapped\",[32,776,769]],[[8175,8175],\"disallowed_STD3_mapped\",[96]],[[8176,8177],\"disallowed\"],[[8178,8178],\"mapped\",[8060,953]],[[8179,8179],\"mapped\",[969,953]],[[8180,8180],\"mapped\",[974,953]],[[8181,8181],\"disallowed\"],[[8182,8182],\"valid\"],[[8183,8183],\"mapped\",[8182,953]],[[8184,8184],\"mapped\",[8056]],[[8185,8185],\"mapped\",[972]],[[8186,8186],\"mapped\",[8060]],[[8187,8187],\"mapped\",[974]],[[8188,8188],\"mapped\",[969,953]],[[8189,8189],\"disallowed_STD3_mapped\",[32,769]],[[8190,8190],\"disallowed_STD3_mapped\",[32,788]],[[8191,8191],\"disallowed\"],[[8192,8202],\"disallowed_STD3_mapped\",[32]],[[8203,8203],\"ignored\"],[[8204,8205],\"deviation\",[]],[[8206,8207],\"disallowed\"],[[8208,8208],\"valid\",[],\"NV8\"],[[8209,8209],\"mapped\",[8208]],[[8210,8214],\"valid\",[],\"NV8\"],[[8215,8215],\"disallowed_STD3_mapped\",[32,819]],[[8216,8227],\"valid\",[],\"NV8\"],[[8228,8230],\"disallowed\"],[[8231,8231],\"valid\",[],\"NV8\"],[[8232,8238],\"disallowed\"],[[8239,8239],\"disallowed_STD3_mapped\",[32]],[[8240,8242],\"valid\",[],\"NV8\"],[[8243,8243],\"mapped\",[8242,8242]],[[8244,8244],\"mapped\",[8242,8242,8242]],[[8245,8245],\"valid\",[],\"NV8\"],[[8246,8246],\"mapped\",[8245,8245]],[[8247,8247],\"mapped\",[8245,8245,8245]],[[8248,8251],\"valid\",[],\"NV8\"],[[8252,8252],\"disallowed_STD3_mapped\",[33,33]],[[8253,8253],\"valid\",[],\"NV8\"],[[8254,8254],\"disallowed_STD3_mapped\",[32,773]],[[8255,8262],\"valid\",[],\"NV8\"],[[8263,8263],\"disallowed_STD3_mapped\",[63,63]],[[8264,8264],\"disallowed_STD3_mapped\",[63,33]],[[8265,8265],\"disallowed_STD3_mapped\",[33,63]],[[8266,8269],\"valid\",[],\"NV8\"],[[8270,8274],\"valid\",[],\"NV8\"],[[8275,8276],\"valid\",[],\"NV8\"],[[8277,8278],\"valid\",[],\"NV8\"],[[8279,8279],\"mapped\",[8242,8242,8242,8242]],[[8280,8286],\"valid\",[],\"NV8\"],[[8287,8287],\"disallowed_STD3_mapped\",[32]],[[8288,8288],\"ignored\"],[[8289,8291],\"disallowed\"],[[8292,8292],\"ignored\"],[[8293,8293],\"disallowed\"],[[8294,8297],\"disallowed\"],[[8298,8303],\"disallowed\"],[[8304,8304],\"mapped\",[48]],[[8305,8305],\"mapped\",[105]],[[8306,8307],\"disallowed\"],[[8308,8308],\"mapped\",[52]],[[8309,8309],\"mapped\",[53]],[[8310,8310],\"mapped\",[54]],[[8311,8311],\"mapped\",[55]],[[8312,8312],\"mapped\",[56]],[[8313,8313],\"mapped\",[57]],[[8314,8314],\"disallowed_STD3_mapped\",[43]],[[8315,8315],\"mapped\",[8722]],[[8316,8316],\"disallowed_STD3_mapped\",[61]],[[8317,8317],\"disallowed_STD3_mapped\",[40]],[[8318,8318],\"disallowed_STD3_mapped\",[41]],[[8319,8319],\"mapped\",[110]],[[8320,8320],\"mapped\",[48]],[[8321,8321],\"mapped\",[49]],[[8322,8322],\"mapped\",[50]],[[8323,8323],\"mapped\",[51]],[[8324,8324],\"mapped\",[52]],[[8325,8325],\"mapped\",[53]],[[8326,8326],\"mapped\",[54]],[[8327,8327],\"mapped\",[55]],[[8328,8328],\"mapped\",[56]],[[8329,8329],\"mapped\",[57]],[[8330,8330],\"disallowed_STD3_mapped\",[43]],[[8331,8331],\"mapped\",[8722]],[[8332,8332],\"disallowed_STD3_mapped\",[61]],[[8333,8333],\"disallowed_STD3_mapped\",[40]],[[8334,8334],\"disallowed_STD3_mapped\",[41]],[[8335,8335],\"disallowed\"],[[8336,8336],\"mapped\",[97]],[[8337,8337],\"mapped\",[101]],[[8338,8338],\"mapped\",[111]],[[8339,8339],\"mapped\",[120]],[[8340,8340],\"mapped\",[601]],[[8341,8341],\"mapped\",[104]],[[8342,8342],\"mapped\",[107]],[[8343,8343],\"mapped\",[108]],[[8344,8344],\"mapped\",[109]],[[8345,8345],\"mapped\",[110]],[[8346,8346],\"mapped\",[112]],[[8347,8347],\"mapped\",[115]],[[8348,8348],\"mapped\",[116]],[[8349,8351],\"disallowed\"],[[8352,8359],\"valid\",[],\"NV8\"],[[8360,8360],\"mapped\",[114,115]],[[8361,8362],\"valid\",[],\"NV8\"],[[8363,8363],\"valid\",[],\"NV8\"],[[8364,8364],\"valid\",[],\"NV8\"],[[8365,8367],\"valid\",[],\"NV8\"],[[8368,8369],\"valid\",[],\"NV8\"],[[8370,8373],\"valid\",[],\"NV8\"],[[8374,8376],\"valid\",[],\"NV8\"],[[8377,8377],\"valid\",[],\"NV8\"],[[8378,8378],\"valid\",[],\"NV8\"],[[8379,8381],\"valid\",[],\"NV8\"],[[8382,8382],\"valid\",[],\"NV8\"],[[8383,8399],\"disallowed\"],[[8400,8417],\"valid\",[],\"NV8\"],[[8418,8419],\"valid\",[],\"NV8\"],[[8420,8426],\"valid\",[],\"NV8\"],[[8427,8427],\"valid\",[],\"NV8\"],[[8428,8431],\"valid\",[],\"NV8\"],[[8432,8432],\"valid\",[],\"NV8\"],[[8433,8447],\"disallowed\"],[[8448,8448],\"disallowed_STD3_mapped\",[97,47,99]],[[8449,8449],\"disallowed_STD3_mapped\",[97,47,115]],[[8450,8450],\"mapped\",[99]],[[8451,8451],\"mapped\",[176,99]],[[8452,8452],\"valid\",[],\"NV8\"],[[8453,8453],\"disallowed_STD3_mapped\",[99,47,111]],[[8454,8454],\"disallowed_STD3_mapped\",[99,47,117]],[[8455,8455],\"mapped\",[603]],[[8456,8456],\"valid\",[],\"NV8\"],[[8457,8457],\"mapped\",[176,102]],[[8458,8458],\"mapped\",[103]],[[8459,8462],\"mapped\",[104]],[[8463,8463],\"mapped\",[295]],[[8464,8465],\"mapped\",[105]],[[8466,8467],\"mapped\",[108]],[[8468,8468],\"valid\",[],\"NV8\"],[[8469,8469],\"mapped\",[110]],[[8470,8470],\"mapped\",[110,111]],[[8471,8472],\"valid\",[],\"NV8\"],[[8473,8473],\"mapped\",[112]],[[8474,8474],\"mapped\",[113]],[[8475,8477],\"mapped\",[114]],[[8478,8479],\"valid\",[],\"NV8\"],[[8480,8480],\"mapped\",[115,109]],[[8481,8481],\"mapped\",[116,101,108]],[[8482,8482],\"mapped\",[116,109]],[[8483,8483],\"valid\",[],\"NV8\"],[[8484,8484],\"mapped\",[122]],[[8485,8485],\"valid\",[],\"NV8\"],[[8486,8486],\"mapped\",[969]],[[8487,8487],\"valid\",[],\"NV8\"],[[8488,8488],\"mapped\",[122]],[[8489,8489],\"valid\",[],\"NV8\"],[[8490,8490],\"mapped\",[107]],[[8491,8491],\"mapped\",[229]],[[8492,8492],\"mapped\",[98]],[[8493,8493],\"mapped\",[99]],[[8494,8494],\"valid\",[],\"NV8\"],[[8495,8496],\"mapped\",[101]],[[8497,8497],\"mapped\",[102]],[[8498,8498],\"disallowed\"],[[8499,8499],\"mapped\",[109]],[[8500,8500],\"mapped\",[111]],[[8501,8501],\"mapped\",[1488]],[[8502,8502],\"mapped\",[1489]],[[8503,8503],\"mapped\",[1490]],[[8504,8504],\"mapped\",[1491]],[[8505,8505],\"mapped\",[105]],[[8506,8506],\"valid\",[],\"NV8\"],[[8507,8507],\"mapped\",[102,97,120]],[[8508,8508],\"mapped\",[960]],[[8509,8510],\"mapped\",[947]],[[8511,8511],\"mapped\",[960]],[[8512,8512],\"mapped\",[8721]],[[8513,8516],\"valid\",[],\"NV8\"],[[8517,8518],\"mapped\",[100]],[[8519,8519],\"mapped\",[101]],[[8520,8520],\"mapped\",[105]],[[8521,8521],\"mapped\",[106]],[[8522,8523],\"valid\",[],\"NV8\"],[[8524,8524],\"valid\",[],\"NV8\"],[[8525,8525],\"valid\",[],\"NV8\"],[[8526,8526],\"valid\"],[[8527,8527],\"valid\",[],\"NV8\"],[[8528,8528],\"mapped\",[49,8260,55]],[[8529,8529],\"mapped\",[49,8260,57]],[[8530,8530],\"mapped\",[49,8260,49,48]],[[8531,8531],\"mapped\",[49,8260,51]],[[8532,8532],\"mapped\",[50,8260,51]],[[8533,8533],\"mapped\",[49,8260,53]],[[8534,8534],\"mapped\",[50,8260,53]],[[8535,8535],\"mapped\",[51,8260,53]],[[8536,8536],\"mapped\",[52,8260,53]],[[8537,8537],\"mapped\",[49,8260,54]],[[8538,8538],\"mapped\",[53,8260,54]],[[8539,8539],\"mapped\",[49,8260,56]],[[8540,8540],\"mapped\",[51,8260,56]],[[8541,8541],\"mapped\",[53,8260,56]],[[8542,8542],\"mapped\",[55,8260,56]],[[8543,8543],\"mapped\",[49,8260]],[[8544,8544],\"mapped\",[105]],[[8545,8545],\"mapped\",[105,105]],[[8546,8546],\"mapped\",[105,105,105]],[[8547,8547],\"mapped\",[105,118]],[[8548,8548],\"mapped\",[118]],[[8549,8549],\"mapped\",[118,105]],[[8550,8550],\"mapped\",[118,105,105]],[[8551,8551],\"mapped\",[118,105,105,105]],[[8552,8552],\"mapped\",[105,120]],[[8553,8553],\"mapped\",[120]],[[8554,8554],\"mapped\",[120,105]],[[8555,8555],\"mapped\",[120,105,105]],[[8556,8556],\"mapped\",[108]],[[8557,8557],\"mapped\",[99]],[[8558,8558],\"mapped\",[100]],[[8559,8559],\"mapped\",[109]],[[8560,8560],\"mapped\",[105]],[[8561,8561],\"mapped\",[105,105]],[[8562,8562],\"mapped\",[105,105,105]],[[8563,8563],\"mapped\",[105,118]],[[8564,8564],\"mapped\",[118]],[[8565,8565],\"mapped\",[118,105]],[[8566,8566],\"mapped\",[118,105,105]],[[8567,8567],\"mapped\",[118,105,105,105]],[[8568,8568],\"mapped\",[105,120]],[[8569,8569],\"mapped\",[120]],[[8570,8570],\"mapped\",[120,105]],[[8571,8571],\"mapped\",[120,105,105]],[[8572,8572],\"mapped\",[108]],[[8573,8573],\"mapped\",[99]],[[8574,8574],\"mapped\",[100]],[[8575,8575],\"mapped\",[109]],[[8576,8578],\"valid\",[],\"NV8\"],[[8579,8579],\"disallowed\"],[[8580,8580],\"valid\"],[[8581,8584],\"valid\",[],\"NV8\"],[[8585,8585],\"mapped\",[48,8260,51]],[[8586,8587],\"valid\",[],\"NV8\"],[[8588,8591],\"disallowed\"],[[8592,8682],\"valid\",[],\"NV8\"],[[8683,8691],\"valid\",[],\"NV8\"],[[8692,8703],\"valid\",[],\"NV8\"],[[8704,8747],\"valid\",[],\"NV8\"],[[8748,8748],\"mapped\",[8747,8747]],[[8749,8749],\"mapped\",[8747,8747,8747]],[[8750,8750],\"valid\",[],\"NV8\"],[[8751,8751],\"mapped\",[8750,8750]],[[8752,8752],\"mapped\",[8750,8750,8750]],[[8753,8799],\"valid\",[],\"NV8\"],[[8800,8800],\"disallowed_STD3_valid\"],[[8801,8813],\"valid\",[],\"NV8\"],[[8814,8815],\"disallowed_STD3_valid\"],[[8816,8945],\"valid\",[],\"NV8\"],[[8946,8959],\"valid\",[],\"NV8\"],[[8960,8960],\"valid\",[],\"NV8\"],[[8961,8961],\"valid\",[],\"NV8\"],[[8962,9000],\"valid\",[],\"NV8\"],[[9001,9001],\"mapped\",[12296]],[[9002,9002],\"mapped\",[12297]],[[9003,9082],\"valid\",[],\"NV8\"],[[9083,9083],\"valid\",[],\"NV8\"],[[9084,9084],\"valid\",[],\"NV8\"],[[9085,9114],\"valid\",[],\"NV8\"],[[9115,9166],\"valid\",[],\"NV8\"],[[9167,9168],\"valid\",[],\"NV8\"],[[9169,9179],\"valid\",[],\"NV8\"],[[9180,9191],\"valid\",[],\"NV8\"],[[9192,9192],\"valid\",[],\"NV8\"],[[9193,9203],\"valid\",[],\"NV8\"],[[9204,9210],\"valid\",[],\"NV8\"],[[9211,9215],\"disallowed\"],[[9216,9252],\"valid\",[],\"NV8\"],[[9253,9254],\"valid\",[],\"NV8\"],[[9255,9279],\"disallowed\"],[[9280,9290],\"valid\",[],\"NV8\"],[[9291,9311],\"disallowed\"],[[9312,9312],\"mapped\",[49]],[[9313,9313],\"mapped\",[50]],[[9314,9314],\"mapped\",[51]],[[9315,9315],\"mapped\",[52]],[[9316,9316],\"mapped\",[53]],[[9317,9317],\"mapped\",[54]],[[9318,9318],\"mapped\",[55]],[[9319,9319],\"mapped\",[56]],[[9320,9320],\"mapped\",[57]],[[9321,9321],\"mapped\",[49,48]],[[9322,9322],\"mapped\",[49,49]],[[9323,9323],\"mapped\",[49,50]],[[9324,9324],\"mapped\",[49,51]],[[9325,9325],\"mapped\",[49,52]],[[9326,9326],\"mapped\",[49,53]],[[9327,9327],\"mapped\",[49,54]],[[9328,9328],\"mapped\",[49,55]],[[9329,9329],\"mapped\",[49,56]],[[9330,9330],\"mapped\",[49,57]],[[9331,9331],\"mapped\",[50,48]],[[9332,9332],\"disallowed_STD3_mapped\",[40,49,41]],[[9333,9333],\"disallowed_STD3_mapped\",[40,50,41]],[[9334,9334],\"disallowed_STD3_mapped\",[40,51,41]],[[9335,9335],\"disallowed_STD3_mapped\",[40,52,41]],[[9336,9336],\"disallowed_STD3_mapped\",[40,53,41]],[[9337,9337],\"disallowed_STD3_mapped\",[40,54,41]],[[9338,9338],\"disallowed_STD3_mapped\",[40,55,41]],[[9339,9339],\"disallowed_STD3_mapped\",[40,56,41]],[[9340,9340],\"disallowed_STD3_mapped\",[40,57,41]],[[9341,9341],\"disallowed_STD3_mapped\",[40,49,48,41]],[[9342,9342],\"disallowed_STD3_mapped\",[40,49,49,41]],[[9343,9343],\"disallowed_STD3_mapped\",[40,49,50,41]],[[9344,9344],\"disallowed_STD3_mapped\",[40,49,51,41]],[[9345,9345],\"disallowed_STD3_mapped\",[40,49,52,41]],[[9346,9346],\"disallowed_STD3_mapped\",[40,49,53,41]],[[9347,9347],\"disallowed_STD3_mapped\",[40,49,54,41]],[[9348,9348],\"disallowed_STD3_mapped\",[40,49,55,41]],[[9349,9349],\"disallowed_STD3_mapped\",[40,49,56,41]],[[9350,9350],\"disallowed_STD3_mapped\",[40,49,57,41]],[[9351,9351],\"disallowed_STD3_mapped\",[40,50,48,41]],[[9352,9371],\"disallowed\"],[[9372,9372],\"disallowed_STD3_mapped\",[40,97,41]],[[9373,9373],\"disallowed_STD3_mapped\",[40,98,41]],[[9374,9374],\"disallowed_STD3_mapped\",[40,99,41]],[[9375,9375],\"disallowed_STD3_mapped\",[40,100,41]],[[9376,9376],\"disallowed_STD3_mapped\",[40,101,41]],[[9377,9377],\"disallowed_STD3_mapped\",[40,102,41]],[[9378,9378],\"disallowed_STD3_mapped\",[40,103,41]],[[9379,9379],\"disallowed_STD3_mapped\",[40,104,41]],[[9380,9380],\"disallowed_STD3_mapped\",[40,105,41]],[[9381,9381],\"disallowed_STD3_mapped\",[40,106,41]],[[9382,9382],\"disallowed_STD3_mapped\",[40,107,41]],[[9383,9383],\"disallowed_STD3_mapped\",[40,108,41]],[[9384,9384],\"disallowed_STD3_mapped\",[40,109,41]],[[9385,9385],\"disallowed_STD3_mapped\",[40,110,41]],[[9386,9386],\"disallowed_STD3_mapped\",[40,111,41]],[[9387,9387],\"disallowed_STD3_mapped\",[40,112,41]],[[9388,9388],\"disallowed_STD3_mapped\",[40,113,41]],[[9389,9389],\"disallowed_STD3_mapped\",[40,114,41]],[[9390,9390],\"disallowed_STD3_mapped\",[40,115,41]],[[9391,9391],\"disallowed_STD3_mapped\",[40,116,41]],[[9392,9392],\"disallowed_STD3_mapped\",[40,117,41]],[[9393,9393],\"disallowed_STD3_mapped\",[40,118,41]],[[9394,9394],\"disallowed_STD3_mapped\",[40,119,41]],[[9395,9395],\"disallowed_STD3_mapped\",[40,120,41]],[[9396,9396],\"disallowed_STD3_mapped\",[40,121,41]],[[9397,9397],\"disallowed_STD3_mapped\",[40,122,41]],[[9398,9398],\"mapped\",[97]],[[9399,9399],\"mapped\",[98]],[[9400,9400],\"mapped\",[99]],[[9401,9401],\"mapped\",[100]],[[9402,9402],\"mapped\",[101]],[[9403,9403],\"mapped\",[102]],[[9404,9404],\"mapped\",[103]],[[9405,9405],\"mapped\",[104]],[[9406,9406],\"mapped\",[105]],[[9407,9407],\"mapped\",[106]],[[9408,9408],\"mapped\",[107]],[[9409,9409],\"mapped\",[108]],[[9410,9410],\"mapped\",[109]],[[9411,9411],\"mapped\",[110]],[[9412,9412],\"mapped\",[111]],[[9413,9413],\"mapped\",[112]],[[9414,9414],\"mapped\",[113]],[[9415,9415],\"mapped\",[114]],[[9416,9416],\"mapped\",[115]],[[9417,9417],\"mapped\",[116]],[[9418,9418],\"mapped\",[117]],[[9419,9419],\"mapped\",[118]],[[9420,9420],\"mapped\",[119]],[[9421,9421],\"mapped\",[120]],[[9422,9422],\"mapped\",[121]],[[9423,9423],\"mapped\",[122]],[[9424,9424],\"mapped\",[97]],[[9425,9425],\"mapped\",[98]],[[9426,9426],\"mapped\",[99]],[[9427,9427],\"mapped\",[100]],[[9428,9428],\"mapped\",[101]],[[9429,9429],\"mapped\",[102]],[[9430,9430],\"mapped\",[103]],[[9431,9431],\"mapped\",[104]],[[9432,9432],\"mapped\",[105]],[[9433,9433],\"mapped\",[106]],[[9434,9434],\"mapped\",[107]],[[9435,9435],\"mapped\",[108]],[[9436,9436],\"mapped\",[109]],[[9437,9437],\"mapped\",[110]],[[9438,9438],\"mapped\",[111]],[[9439,9439],\"mapped\",[112]],[[9440,9440],\"mapped\",[113]],[[9441,9441],\"mapped\",[114]],[[9442,9442],\"mapped\",[115]],[[9443,9443],\"mapped\",[116]],[[9444,9444],\"mapped\",[117]],[[9445,9445],\"mapped\",[118]],[[9446,9446],\"mapped\",[119]],[[9447,9447],\"mapped\",[120]],[[9448,9448],\"mapped\",[121]],[[9449,9449],\"mapped\",[122]],[[9450,9450],\"mapped\",[48]],[[9451,9470],\"valid\",[],\"NV8\"],[[9471,9471],\"valid\",[],\"NV8\"],[[9472,9621],\"valid\",[],\"NV8\"],[[9622,9631],\"valid\",[],\"NV8\"],[[9632,9711],\"valid\",[],\"NV8\"],[[9712,9719],\"valid\",[],\"NV8\"],[[9720,9727],\"valid\",[],\"NV8\"],[[9728,9747],\"valid\",[],\"NV8\"],[[9748,9749],\"valid\",[],\"NV8\"],[[9750,9751],\"valid\",[],\"NV8\"],[[9752,9752],\"valid\",[],\"NV8\"],[[9753,9753],\"valid\",[],\"NV8\"],[[9754,9839],\"valid\",[],\"NV8\"],[[9840,9841],\"valid\",[],\"NV8\"],[[9842,9853],\"valid\",[],\"NV8\"],[[9854,9855],\"valid\",[],\"NV8\"],[[9856,9865],\"valid\",[],\"NV8\"],[[9866,9873],\"valid\",[],\"NV8\"],[[9874,9884],\"valid\",[],\"NV8\"],[[9885,9885],\"valid\",[],\"NV8\"],[[9886,9887],\"valid\",[],\"NV8\"],[[9888,9889],\"valid\",[],\"NV8\"],[[9890,9905],\"valid\",[],\"NV8\"],[[9906,9906],\"valid\",[],\"NV8\"],[[9907,9916],\"valid\",[],\"NV8\"],[[9917,9919],\"valid\",[],\"NV8\"],[[9920,9923],\"valid\",[],\"NV8\"],[[9924,9933],\"valid\",[],\"NV8\"],[[9934,9934],\"valid\",[],\"NV8\"],[[9935,9953],\"valid\",[],\"NV8\"],[[9954,9954],\"valid\",[],\"NV8\"],[[9955,9955],\"valid\",[],\"NV8\"],[[9956,9959],\"valid\",[],\"NV8\"],[[9960,9983],\"valid\",[],\"NV8\"],[[9984,9984],\"valid\",[],\"NV8\"],[[9985,9988],\"valid\",[],\"NV8\"],[[9989,9989],\"valid\",[],\"NV8\"],[[9990,9993],\"valid\",[],\"NV8\"],[[9994,9995],\"valid\",[],\"NV8\"],[[9996,10023],\"valid\",[],\"NV8\"],[[10024,10024],\"valid\",[],\"NV8\"],[[10025,10059],\"valid\",[],\"NV8\"],[[10060,10060],\"valid\",[],\"NV8\"],[[10061,10061],\"valid\",[],\"NV8\"],[[10062,10062],\"valid\",[],\"NV8\"],[[10063,10066],\"valid\",[],\"NV8\"],[[10067,10069],\"valid\",[],\"NV8\"],[[10070,10070],\"valid\",[],\"NV8\"],[[10071,10071],\"valid\",[],\"NV8\"],[[10072,10078],\"valid\",[],\"NV8\"],[[10079,10080],\"valid\",[],\"NV8\"],[[10081,10087],\"valid\",[],\"NV8\"],[[10088,10101],\"valid\",[],\"NV8\"],[[10102,10132],\"valid\",[],\"NV8\"],[[10133,10135],\"valid\",[],\"NV8\"],[[10136,10159],\"valid\",[],\"NV8\"],[[10160,10160],\"valid\",[],\"NV8\"],[[10161,10174],\"valid\",[],\"NV8\"],[[10175,10175],\"valid\",[],\"NV8\"],[[10176,10182],\"valid\",[],\"NV8\"],[[10183,10186],\"valid\",[],\"NV8\"],[[10187,10187],\"valid\",[],\"NV8\"],[[10188,10188],\"valid\",[],\"NV8\"],[[10189,10189],\"valid\",[],\"NV8\"],[[10190,10191],\"valid\",[],\"NV8\"],[[10192,10219],\"valid\",[],\"NV8\"],[[10220,10223],\"valid\",[],\"NV8\"],[[10224,10239],\"valid\",[],\"NV8\"],[[10240,10495],\"valid\",[],\"NV8\"],[[10496,10763],\"valid\",[],\"NV8\"],[[10764,10764],\"mapped\",[8747,8747,8747,8747]],[[10765,10867],\"valid\",[],\"NV8\"],[[10868,10868],\"disallowed_STD3_mapped\",[58,58,61]],[[10869,10869],\"disallowed_STD3_mapped\",[61,61]],[[10870,10870],\"disallowed_STD3_mapped\",[61,61,61]],[[10871,10971],\"valid\",[],\"NV8\"],[[10972,10972],\"mapped\",[10973,824]],[[10973,11007],\"valid\",[],\"NV8\"],[[11008,11021],\"valid\",[],\"NV8\"],[[11022,11027],\"valid\",[],\"NV8\"],[[11028,11034],\"valid\",[],\"NV8\"],[[11035,11039],\"valid\",[],\"NV8\"],[[11040,11043],\"valid\",[],\"NV8\"],[[11044,11084],\"valid\",[],\"NV8\"],[[11085,11087],\"valid\",[],\"NV8\"],[[11088,11092],\"valid\",[],\"NV8\"],[[11093,11097],\"valid\",[],\"NV8\"],[[11098,11123],\"valid\",[],\"NV8\"],[[11124,11125],\"disallowed\"],[[11126,11157],\"valid\",[],\"NV8\"],[[11158,11159],\"disallowed\"],[[11160,11193],\"valid\",[],\"NV8\"],[[11194,11196],\"disallowed\"],[[11197,11208],\"valid\",[],\"NV8\"],[[11209,11209],\"disallowed\"],[[11210,11217],\"valid\",[],\"NV8\"],[[11218,11243],\"disallowed\"],[[11244,11247],\"valid\",[],\"NV8\"],[[11248,11263],\"disallowed\"],[[11264,11264],\"mapped\",[11312]],[[11265,11265],\"mapped\",[11313]],[[11266,11266],\"mapped\",[11314]],[[11267,11267],\"mapped\",[11315]],[[11268,11268],\"mapped\",[11316]],[[11269,11269],\"mapped\",[11317]],[[11270,11270],\"mapped\",[11318]],[[11271,11271],\"mapped\",[11319]],[[11272,11272],\"mapped\",[11320]],[[11273,11273],\"mapped\",[11321]],[[11274,11274],\"mapped\",[11322]],[[11275,11275],\"mapped\",[11323]],[[11276,11276],\"mapped\",[11324]],[[11277,11277],\"mapped\",[11325]],[[11278,11278],\"mapped\",[11326]],[[11279,11279],\"mapped\",[11327]],[[11280,11280],\"mapped\",[11328]],[[11281,11281],\"mapped\",[11329]],[[11282,11282],\"mapped\",[11330]],[[11283,11283],\"mapped\",[11331]],[[11284,11284],\"mapped\",[11332]],[[11285,11285],\"mapped\",[11333]],[[11286,11286],\"mapped\",[11334]],[[11287,11287],\"mapped\",[11335]],[[11288,11288],\"mapped\",[11336]],[[11289,11289],\"mapped\",[11337]],[[11290,11290],\"mapped\",[11338]],[[11291,11291],\"mapped\",[11339]],[[11292,11292],\"mapped\",[11340]],[[11293,11293],\"mapped\",[11341]],[[11294,11294],\"mapped\",[11342]],[[11295,11295],\"mapped\",[11343]],[[11296,11296],\"mapped\",[11344]],[[11297,11297],\"mapped\",[11345]],[[11298,11298],\"mapped\",[11346]],[[11299,11299],\"mapped\",[11347]],[[11300,11300],\"mapped\",[11348]],[[11301,11301],\"mapped\",[11349]],[[11302,11302],\"mapped\",[11350]],[[11303,11303],\"mapped\",[11351]],[[11304,11304],\"mapped\",[11352]],[[11305,11305],\"mapped\",[11353]],[[11306,11306],\"mapped\",[11354]],[[11307,11307],\"mapped\",[11355]],[[11308,11308],\"mapped\",[11356]],[[11309,11309],\"mapped\",[11357]],[[11310,11310],\"mapped\",[11358]],[[11311,11311],\"disallowed\"],[[11312,11358],\"valid\"],[[11359,11359],\"disallowed\"],[[11360,11360],\"mapped\",[11361]],[[11361,11361],\"valid\"],[[11362,11362],\"mapped\",[619]],[[11363,11363],\"mapped\",[7549]],[[11364,11364],\"mapped\",[637]],[[11365,11366],\"valid\"],[[11367,11367],\"mapped\",[11368]],[[11368,11368],\"valid\"],[[11369,11369],\"mapped\",[11370]],[[11370,11370],\"valid\"],[[11371,11371],\"mapped\",[11372]],[[11372,11372],\"valid\"],[[11373,11373],\"mapped\",[593]],[[11374,11374],\"mapped\",[625]],[[11375,11375],\"mapped\",[592]],[[11376,11376],\"mapped\",[594]],[[11377,11377],\"valid\"],[[11378,11378],\"mapped\",[11379]],[[11379,11379],\"valid\"],[[11380,11380],\"valid\"],[[11381,11381],\"mapped\",[11382]],[[11382,11383],\"valid\"],[[11384,11387],\"valid\"],[[11388,11388],\"mapped\",[106]],[[11389,11389],\"mapped\",[118]],[[11390,11390],\"mapped\",[575]],[[11391,11391],\"mapped\",[576]],[[11392,11392],\"mapped\",[11393]],[[11393,11393],\"valid\"],[[11394,11394],\"mapped\",[11395]],[[11395,11395],\"valid\"],[[11396,11396],\"mapped\",[11397]],[[11397,11397],\"valid\"],[[11398,11398],\"mapped\",[11399]],[[11399,11399],\"valid\"],[[11400,11400],\"mapped\",[11401]],[[11401,11401],\"valid\"],[[11402,11402],\"mapped\",[11403]],[[11403,11403],\"valid\"],[[11404,11404],\"mapped\",[11405]],[[11405,11405],\"valid\"],[[11406,11406],\"mapped\",[11407]],[[11407,11407],\"valid\"],[[11408,11408],\"mapped\",[11409]],[[11409,11409],\"valid\"],[[11410,11410],\"mapped\",[11411]],[[11411,11411],\"valid\"],[[11412,11412],\"mapped\",[11413]],[[11413,11413],\"valid\"],[[11414,11414],\"mapped\",[11415]],[[11415,11415],\"valid\"],[[11416,11416],\"mapped\",[11417]],[[11417,11417],\"valid\"],[[11418,11418],\"mapped\",[11419]],[[11419,11419],\"valid\"],[[11420,11420],\"mapped\",[11421]],[[11421,11421],\"valid\"],[[11422,11422],\"mapped\",[11423]],[[11423,11423],\"valid\"],[[11424,11424],\"mapped\",[11425]],[[11425,11425],\"valid\"],[[11426,11426],\"mapped\",[11427]],[[11427,11427],\"valid\"],[[11428,11428],\"mapped\",[11429]],[[11429,11429],\"valid\"],[[11430,11430],\"mapped\",[11431]],[[11431,11431],\"valid\"],[[11432,11432],\"mapped\",[11433]],[[11433,11433],\"valid\"],[[11434,11434],\"mapped\",[11435]],[[11435,11435],\"valid\"],[[11436,11436],\"mapped\",[11437]],[[11437,11437],\"valid\"],[[11438,11438],\"mapped\",[11439]],[[11439,11439],\"valid\"],[[11440,11440],\"mapped\",[11441]],[[11441,11441],\"valid\"],[[11442,11442],\"mapped\",[11443]],[[11443,11443],\"valid\"],[[11444,11444],\"mapped\",[11445]],[[11445,11445],\"valid\"],[[11446,11446],\"mapped\",[11447]],[[11447,11447],\"valid\"],[[11448,11448],\"mapped\",[11449]],[[11449,11449],\"valid\"],[[11450,11450],\"mapped\",[11451]],[[11451,11451],\"valid\"],[[11452,11452],\"mapped\",[11453]],[[11453,11453],\"valid\"],[[11454,11454],\"mapped\",[11455]],[[11455,11455],\"valid\"],[[11456,11456],\"mapped\",[11457]],[[11457,11457],\"valid\"],[[11458,11458],\"mapped\",[11459]],[[11459,11459],\"valid\"],[[11460,11460],\"mapped\",[11461]],[[11461,11461],\"valid\"],[[11462,11462],\"mapped\",[11463]],[[11463,11463],\"valid\"],[[11464,11464],\"mapped\",[11465]],[[11465,11465],\"valid\"],[[11466,11466],\"mapped\",[11467]],[[11467,11467],\"valid\"],[[11468,11468],\"mapped\",[11469]],[[11469,11469],\"valid\"],[[11470,11470],\"mapped\",[11471]],[[11471,11471],\"valid\"],[[11472,11472],\"mapped\",[11473]],[[11473,11473],\"valid\"],[[11474,11474],\"mapped\",[11475]],[[11475,11475],\"valid\"],[[11476,11476],\"mapped\",[11477]],[[11477,11477],\"valid\"],[[11478,11478],\"mapped\",[11479]],[[11479,11479],\"valid\"],[[11480,11480],\"mapped\",[11481]],[[11481,11481],\"valid\"],[[11482,11482],\"mapped\",[11483]],[[11483,11483],\"valid\"],[[11484,11484],\"mapped\",[11485]],[[11485,11485],\"valid\"],[[11486,11486],\"mapped\",[11487]],[[11487,11487],\"valid\"],[[11488,11488],\"mapped\",[11489]],[[11489,11489],\"valid\"],[[11490,11490],\"mapped\",[11491]],[[11491,11492],\"valid\"],[[11493,11498],\"valid\",[],\"NV8\"],[[11499,11499],\"mapped\",[11500]],[[11500,11500],\"valid\"],[[11501,11501],\"mapped\",[11502]],[[11502,11505],\"valid\"],[[11506,11506],\"mapped\",[11507]],[[11507,11507],\"valid\"],[[11508,11512],\"disallowed\"],[[11513,11519],\"valid\",[],\"NV8\"],[[11520,11557],\"valid\"],[[11558,11558],\"disallowed\"],[[11559,11559],\"valid\"],[[11560,11564],\"disallowed\"],[[11565,11565],\"valid\"],[[11566,11567],\"disallowed\"],[[11568,11621],\"valid\"],[[11622,11623],\"valid\"],[[11624,11630],\"disallowed\"],[[11631,11631],\"mapped\",[11617]],[[11632,11632],\"valid\",[],\"NV8\"],[[11633,11646],\"disallowed\"],[[11647,11647],\"valid\"],[[11648,11670],\"valid\"],[[11671,11679],\"disallowed\"],[[11680,11686],\"valid\"],[[11687,11687],\"disallowed\"],[[11688,11694],\"valid\"],[[11695,11695],\"disallowed\"],[[11696,11702],\"valid\"],[[11703,11703],\"disallowed\"],[[11704,11710],\"valid\"],[[11711,11711],\"disallowed\"],[[11712,11718],\"valid\"],[[11719,11719],\"disallowed\"],[[11720,11726],\"valid\"],[[11727,11727],\"disallowed\"],[[11728,11734],\"valid\"],[[11735,11735],\"disallowed\"],[[11736,11742],\"valid\"],[[11743,11743],\"disallowed\"],[[11744,11775],\"valid\"],[[11776,11799],\"valid\",[],\"NV8\"],[[11800,11803],\"valid\",[],\"NV8\"],[[11804,11805],\"valid\",[],\"NV8\"],[[11806,11822],\"valid\",[],\"NV8\"],[[11823,11823],\"valid\"],[[11824,11824],\"valid\",[],\"NV8\"],[[11825,11825],\"valid\",[],\"NV8\"],[[11826,11835],\"valid\",[],\"NV8\"],[[11836,11842],\"valid\",[],\"NV8\"],[[11843,11903],\"disallowed\"],[[11904,11929],\"valid\",[],\"NV8\"],[[11930,11930],\"disallowed\"],[[11931,11934],\"valid\",[],\"NV8\"],[[11935,11935],\"mapped\",[27597]],[[11936,12018],\"valid\",[],\"NV8\"],[[12019,12019],\"mapped\",[40863]],[[12020,12031],\"disallowed\"],[[12032,12032],\"mapped\",[19968]],[[12033,12033],\"mapped\",[20008]],[[12034,12034],\"mapped\",[20022]],[[12035,12035],\"mapped\",[20031]],[[12036,12036],\"mapped\",[20057]],[[12037,12037],\"mapped\",[20101]],[[12038,12038],\"mapped\",[20108]],[[12039,12039],\"mapped\",[20128]],[[12040,12040],\"mapped\",[20154]],[[12041,12041],\"mapped\",[20799]],[[12042,12042],\"mapped\",[20837]],[[12043,12043],\"mapped\",[20843]],[[12044,12044],\"mapped\",[20866]],[[12045,12045],\"mapped\",[20886]],[[12046,12046],\"mapped\",[20907]],[[12047,12047],\"mapped\",[20960]],[[12048,12048],\"mapped\",[20981]],[[12049,12049],\"mapped\",[20992]],[[12050,12050],\"mapped\",[21147]],[[12051,12051],\"mapped\",[21241]],[[12052,12052],\"mapped\",[21269]],[[12053,12053],\"mapped\",[21274]],[[12054,12054],\"mapped\",[21304]],[[12055,12055],\"mapped\",[21313]],[[12056,12056],\"mapped\",[21340]],[[12057,12057],\"mapped\",[21353]],[[12058,12058],\"mapped\",[21378]],[[12059,12059],\"mapped\",[21430]],[[12060,12060],\"mapped\",[21448]],[[12061,12061],\"mapped\",[21475]],[[12062,12062],\"mapped\",[22231]],[[12063,12063],\"mapped\",[22303]],[[12064,12064],\"mapped\",[22763]],[[12065,12065],\"mapped\",[22786]],[[12066,12066],\"mapped\",[22794]],[[12067,12067],\"mapped\",[22805]],[[12068,12068],\"mapped\",[22823]],[[12069,12069],\"mapped\",[22899]],[[12070,12070],\"mapped\",[23376]],[[12071,12071],\"mapped\",[23424]],[[12072,12072],\"mapped\",[23544]],[[12073,12073],\"mapped\",[23567]],[[12074,12074],\"mapped\",[23586]],[[12075,12075],\"mapped\",[23608]],[[12076,12076],\"mapped\",[23662]],[[12077,12077],\"mapped\",[23665]],[[12078,12078],\"mapped\",[24027]],[[12079,12079],\"mapped\",[24037]],[[12080,12080],\"mapped\",[24049]],[[12081,12081],\"mapped\",[24062]],[[12082,12082],\"mapped\",[24178]],[[12083,12083],\"mapped\",[24186]],[[12084,12084],\"mapped\",[24191]],[[12085,12085],\"mapped\",[24308]],[[12086,12086],\"mapped\",[24318]],[[12087,12087],\"mapped\",[24331]],[[12088,12088],\"mapped\",[24339]],[[12089,12089],\"mapped\",[24400]],[[12090,12090],\"mapped\",[24417]],[[12091,12091],\"mapped\",[24435]],[[12092,12092],\"mapped\",[24515]],[[12093,12093],\"mapped\",[25096]],[[12094,12094],\"mapped\",[25142]],[[12095,12095],\"mapped\",[25163]],[[12096,12096],\"mapped\",[25903]],[[12097,12097],\"mapped\",[25908]],[[12098,12098],\"mapped\",[25991]],[[12099,12099],\"mapped\",[26007]],[[12100,12100],\"mapped\",[26020]],[[12101,12101],\"mapped\",[26041]],[[12102,12102],\"mapped\",[26080]],[[12103,12103],\"mapped\",[26085]],[[12104,12104],\"mapped\",[26352]],[[12105,12105],\"mapped\",[26376]],[[12106,12106],\"mapped\",[26408]],[[12107,12107],\"mapped\",[27424]],[[12108,12108],\"mapped\",[27490]],[[12109,12109],\"mapped\",[27513]],[[12110,12110],\"mapped\",[27571]],[[12111,12111],\"mapped\",[27595]],[[12112,12112],\"mapped\",[27604]],[[12113,12113],\"mapped\",[27611]],[[12114,12114],\"mapped\",[27663]],[[12115,12115],\"mapped\",[27668]],[[12116,12116],\"mapped\",[27700]],[[12117,12117],\"mapped\",[28779]],[[12118,12118],\"mapped\",[29226]],[[12119,12119],\"mapped\",[29238]],[[12120,12120],\"mapped\",[29243]],[[12121,12121],\"mapped\",[29247]],[[12122,12122],\"mapped\",[29255]],[[12123,12123],\"mapped\",[29273]],[[12124,12124],\"mapped\",[29275]],[[12125,12125],\"mapped\",[29356]],[[12126,12126],\"mapped\",[29572]],[[12127,12127],\"mapped\",[29577]],[[12128,12128],\"mapped\",[29916]],[[12129,12129],\"mapped\",[29926]],[[12130,12130],\"mapped\",[29976]],[[12131,12131],\"mapped\",[29983]],[[12132,12132],\"mapped\",[29992]],[[12133,12133],\"mapped\",[30000]],[[12134,12134],\"mapped\",[30091]],[[12135,12135],\"mapped\",[30098]],[[12136,12136],\"mapped\",[30326]],[[12137,12137],\"mapped\",[30333]],[[12138,12138],\"mapped\",[30382]],[[12139,12139],\"mapped\",[30399]],[[12140,12140],\"mapped\",[30446]],[[12141,12141],\"mapped\",[30683]],[[12142,12142],\"mapped\",[30690]],[[12143,12143],\"mapped\",[30707]],[[12144,12144],\"mapped\",[31034]],[[12145,12145],\"mapped\",[31160]],[[12146,12146],\"mapped\",[31166]],[[12147,12147],\"mapped\",[31348]],[[12148,12148],\"mapped\",[31435]],[[12149,12149],\"mapped\",[31481]],[[12150,12150],\"mapped\",[31859]],[[12151,12151],\"mapped\",[31992]],[[12152,12152],\"mapped\",[32566]],[[12153,12153],\"mapped\",[32593]],[[12154,12154],\"mapped\",[32650]],[[12155,12155],\"mapped\",[32701]],[[12156,12156],\"mapped\",[32769]],[[12157,12157],\"mapped\",[32780]],[[12158,12158],\"mapped\",[32786]],[[12159,12159],\"mapped\",[32819]],[[12160,12160],\"mapped\",[32895]],[[12161,12161],\"mapped\",[32905]],[[12162,12162],\"mapped\",[33251]],[[12163,12163],\"mapped\",[33258]],[[12164,12164],\"mapped\",[33267]],[[12165,12165],\"mapped\",[33276]],[[12166,12166],\"mapped\",[33292]],[[12167,12167],\"mapped\",[33307]],[[12168,12168],\"mapped\",[33311]],[[12169,12169],\"mapped\",[33390]],[[12170,12170],\"mapped\",[33394]],[[12171,12171],\"mapped\",[33400]],[[12172,12172],\"mapped\",[34381]],[[12173,12173],\"mapped\",[34411]],[[12174,12174],\"mapped\",[34880]],[[12175,12175],\"mapped\",[34892]],[[12176,12176],\"mapped\",[34915]],[[12177,12177],\"mapped\",[35198]],[[12178,12178],\"mapped\",[35211]],[[12179,12179],\"mapped\",[35282]],[[12180,12180],\"mapped\",[35328]],[[12181,12181],\"mapped\",[35895]],[[12182,12182],\"mapped\",[35910]],[[12183,12183],\"mapped\",[35925]],[[12184,12184],\"mapped\",[35960]],[[12185,12185],\"mapped\",[35997]],[[12186,12186],\"mapped\",[36196]],[[12187,12187],\"mapped\",[36208]],[[12188,12188],\"mapped\",[36275]],[[12189,12189],\"mapped\",[36523]],[[12190,12190],\"mapped\",[36554]],[[12191,12191],\"mapped\",[36763]],[[12192,12192],\"mapped\",[36784]],[[12193,12193],\"mapped\",[36789]],[[12194,12194],\"mapped\",[37009]],[[12195,12195],\"mapped\",[37193]],[[12196,12196],\"mapped\",[37318]],[[12197,12197],\"mapped\",[37324]],[[12198,12198],\"mapped\",[37329]],[[12199,12199],\"mapped\",[38263]],[[12200,12200],\"mapped\",[38272]],[[12201,12201],\"mapped\",[38428]],[[12202,12202],\"mapped\",[38582]],[[12203,12203],\"mapped\",[38585]],[[12204,12204],\"mapped\",[38632]],[[12205,12205],\"mapped\",[38737]],[[12206,12206],\"mapped\",[38750]],[[12207,12207],\"mapped\",[38754]],[[12208,12208],\"mapped\",[38761]],[[12209,12209],\"mapped\",[38859]],[[12210,12210],\"mapped\",[38893]],[[12211,12211],\"mapped\",[38899]],[[12212,12212],\"mapped\",[38913]],[[12213,12213],\"mapped\",[39080]],[[12214,12214],\"mapped\",[39131]],[[12215,12215],\"mapped\",[39135]],[[12216,12216],\"mapped\",[39318]],[[12217,12217],\"mapped\",[39321]],[[12218,12218],\"mapped\",[39340]],[[12219,12219],\"mapped\",[39592]],[[12220,12220],\"mapped\",[39640]],[[12221,12221],\"mapped\",[39647]],[[12222,12222],\"mapped\",[39717]],[[12223,12223],\"mapped\",[39727]],[[12224,12224],\"mapped\",[39730]],[[12225,12225],\"mapped\",[39740]],[[12226,12226],\"mapped\",[39770]],[[12227,12227],\"mapped\",[40165]],[[12228,12228],\"mapped\",[40565]],[[12229,12229],\"mapped\",[40575]],[[12230,12230],\"mapped\",[40613]],[[12231,12231],\"mapped\",[40635]],[[12232,12232],\"mapped\",[40643]],[[12233,12233],\"mapped\",[40653]],[[12234,12234],\"mapped\",[40657]],[[12235,12235],\"mapped\",[40697]],[[12236,12236],\"mapped\",[40701]],[[12237,12237],\"mapped\",[40718]],[[12238,12238],\"mapped\",[40723]],[[12239,12239],\"mapped\",[40736]],[[12240,12240],\"mapped\",[40763]],[[12241,12241],\"mapped\",[40778]],[[12242,12242],\"mapped\",[40786]],[[12243,12243],\"mapped\",[40845]],[[12244,12244],\"mapped\",[40860]],[[12245,12245],\"mapped\",[40864]],[[12246,12271],\"disallowed\"],[[12272,12283],\"disallowed\"],[[12284,12287],\"disallowed\"],[[12288,12288],\"disallowed_STD3_mapped\",[32]],[[12289,12289],\"valid\",[],\"NV8\"],[[12290,12290],\"mapped\",[46]],[[12291,12292],\"valid\",[],\"NV8\"],[[12293,12295],\"valid\"],[[12296,12329],\"valid\",[],\"NV8\"],[[12330,12333],\"valid\"],[[12334,12341],\"valid\",[],\"NV8\"],[[12342,12342],\"mapped\",[12306]],[[12343,12343],\"valid\",[],\"NV8\"],[[12344,12344],\"mapped\",[21313]],[[12345,12345],\"mapped\",[21316]],[[12346,12346],\"mapped\",[21317]],[[12347,12347],\"valid\",[],\"NV8\"],[[12348,12348],\"valid\"],[[12349,12349],\"valid\",[],\"NV8\"],[[12350,12350],\"valid\",[],\"NV8\"],[[12351,12351],\"valid\",[],\"NV8\"],[[12352,12352],\"disallowed\"],[[12353,12436],\"valid\"],[[12437,12438],\"valid\"],[[12439,12440],\"disallowed\"],[[12441,12442],\"valid\"],[[12443,12443],\"disallowed_STD3_mapped\",[32,12441]],[[12444,12444],\"disallowed_STD3_mapped\",[32,12442]],[[12445,12446],\"valid\"],[[12447,12447],\"mapped\",[12424,12426]],[[12448,12448],\"valid\",[],\"NV8\"],[[12449,12542],\"valid\"],[[12543,12543],\"mapped\",[12467,12488]],[[12544,12548],\"disallowed\"],[[12549,12588],\"valid\"],[[12589,12589],\"valid\"],[[12590,12592],\"disallowed\"],[[12593,12593],\"mapped\",[4352]],[[12594,12594],\"mapped\",[4353]],[[12595,12595],\"mapped\",[4522]],[[12596,12596],\"mapped\",[4354]],[[12597,12597],\"mapped\",[4524]],[[12598,12598],\"mapped\",[4525]],[[12599,12599],\"mapped\",[4355]],[[12600,12600],\"mapped\",[4356]],[[12601,12601],\"mapped\",[4357]],[[12602,12602],\"mapped\",[4528]],[[12603,12603],\"mapped\",[4529]],[[12604,12604],\"mapped\",[4530]],[[12605,12605],\"mapped\",[4531]],[[12606,12606],\"mapped\",[4532]],[[12607,12607],\"mapped\",[4533]],[[12608,12608],\"mapped\",[4378]],[[12609,12609],\"mapped\",[4358]],[[12610,12610],\"mapped\",[4359]],[[12611,12611],\"mapped\",[4360]],[[12612,12612],\"mapped\",[4385]],[[12613,12613],\"mapped\",[4361]],[[12614,12614],\"mapped\",[4362]],[[12615,12615],\"mapped\",[4363]],[[12616,12616],\"mapped\",[4364]],[[12617,12617],\"mapped\",[4365]],[[12618,12618],\"mapped\",[4366]],[[12619,12619],\"mapped\",[4367]],[[12620,12620],\"mapped\",[4368]],[[12621,12621],\"mapped\",[4369]],[[12622,12622],\"mapped\",[4370]],[[12623,12623],\"mapped\",[4449]],[[12624,12624],\"mapped\",[4450]],[[12625,12625],\"mapped\",[4451]],[[12626,12626],\"mapped\",[4452]],[[12627,12627],\"mapped\",[4453]],[[12628,12628],\"mapped\",[4454]],[[12629,12629],\"mapped\",[4455]],[[12630,12630],\"mapped\",[4456]],[[12631,12631],\"mapped\",[4457]],[[12632,12632],\"mapped\",[4458]],[[12633,12633],\"mapped\",[4459]],[[12634,12634],\"mapped\",[4460]],[[12635,12635],\"mapped\",[4461]],[[12636,12636],\"mapped\",[4462]],[[12637,12637],\"mapped\",[4463]],[[12638,12638],\"mapped\",[4464]],[[12639,12639],\"mapped\",[4465]],[[12640,12640],\"mapped\",[4466]],[[12641,12641],\"mapped\",[4467]],[[12642,12642],\"mapped\",[4468]],[[12643,12643],\"mapped\",[4469]],[[12644,12644],\"disallowed\"],[[12645,12645],\"mapped\",[4372]],[[12646,12646],\"mapped\",[4373]],[[12647,12647],\"mapped\",[4551]],[[12648,12648],\"mapped\",[4552]],[[12649,12649],\"mapped\",[4556]],[[12650,12650],\"mapped\",[4558]],[[12651,12651],\"mapped\",[4563]],[[12652,12652],\"mapped\",[4567]],[[12653,12653],\"mapped\",[4569]],[[12654,12654],\"mapped\",[4380]],[[12655,12655],\"mapped\",[4573]],[[12656,12656],\"mapped\",[4575]],[[12657,12657],\"mapped\",[4381]],[[12658,12658],\"mapped\",[4382]],[[12659,12659],\"mapped\",[4384]],[[12660,12660],\"mapped\",[4386]],[[12661,12661],\"mapped\",[4387]],[[12662,12662],\"mapped\",[4391]],[[12663,12663],\"mapped\",[4393]],[[12664,12664],\"mapped\",[4395]],[[12665,12665],\"mapped\",[4396]],[[12666,12666],\"mapped\",[4397]],[[12667,12667],\"mapped\",[4398]],[[12668,12668],\"mapped\",[4399]],[[12669,12669],\"mapped\",[4402]],[[12670,12670],\"mapped\",[4406]],[[12671,12671],\"mapped\",[4416]],[[12672,12672],\"mapped\",[4423]],[[12673,12673],\"mapped\",[4428]],[[12674,12674],\"mapped\",[4593]],[[12675,12675],\"mapped\",[4594]],[[12676,12676],\"mapped\",[4439]],[[12677,12677],\"mapped\",[4440]],[[12678,12678],\"mapped\",[4441]],[[12679,12679],\"mapped\",[4484]],[[12680,12680],\"mapped\",[4485]],[[12681,12681],\"mapped\",[4488]],[[12682,12682],\"mapped\",[4497]],[[12683,12683],\"mapped\",[4498]],[[12684,12684],\"mapped\",[4500]],[[12685,12685],\"mapped\",[4510]],[[12686,12686],\"mapped\",[4513]],[[12687,12687],\"disallowed\"],[[12688,12689],\"valid\",[],\"NV8\"],[[12690,12690],\"mapped\",[19968]],[[12691,12691],\"mapped\",[20108]],[[12692,12692],\"mapped\",[19977]],[[12693,12693],\"mapped\",[22235]],[[12694,12694],\"mapped\",[19978]],[[12695,12695],\"mapped\",[20013]],[[12696,12696],\"mapped\",[19979]],[[12697,12697],\"mapped\",[30002]],[[12698,12698],\"mapped\",[20057]],[[12699,12699],\"mapped\",[19993]],[[12700,12700],\"mapped\",[19969]],[[12701,12701],\"mapped\",[22825]],[[12702,12702],\"mapped\",[22320]],[[12703,12703],\"mapped\",[20154]],[[12704,12727],\"valid\"],[[12728,12730],\"valid\"],[[12731,12735],\"disallowed\"],[[12736,12751],\"valid\",[],\"NV8\"],[[12752,12771],\"valid\",[],\"NV8\"],[[12772,12783],\"disallowed\"],[[12784,12799],\"valid\"],[[12800,12800],\"disallowed_STD3_mapped\",[40,4352,41]],[[12801,12801],\"disallowed_STD3_mapped\",[40,4354,41]],[[12802,12802],\"disallowed_STD3_mapped\",[40,4355,41]],[[12803,12803],\"disallowed_STD3_mapped\",[40,4357,41]],[[12804,12804],\"disallowed_STD3_mapped\",[40,4358,41]],[[12805,12805],\"disallowed_STD3_mapped\",[40,4359,41]],[[12806,12806],\"disallowed_STD3_mapped\",[40,4361,41]],[[12807,12807],\"disallowed_STD3_mapped\",[40,4363,41]],[[12808,12808],\"disallowed_STD3_mapped\",[40,4364,41]],[[12809,12809],\"disallowed_STD3_mapped\",[40,4366,41]],[[12810,12810],\"disallowed_STD3_mapped\",[40,4367,41]],[[12811,12811],\"disallowed_STD3_mapped\",[40,4368,41]],[[12812,12812],\"disallowed_STD3_mapped\",[40,4369,41]],[[12813,12813],\"disallowed_STD3_mapped\",[40,4370,41]],[[12814,12814],\"disallowed_STD3_mapped\",[40,44032,41]],[[12815,12815],\"disallowed_STD3_mapped\",[40,45208,41]],[[12816,12816],\"disallowed_STD3_mapped\",[40,45796,41]],[[12817,12817],\"disallowed_STD3_mapped\",[40,46972,41]],[[12818,12818],\"disallowed_STD3_mapped\",[40,47560,41]],[[12819,12819],\"disallowed_STD3_mapped\",[40,48148,41]],[[12820,12820],\"disallowed_STD3_mapped\",[40,49324,41]],[[12821,12821],\"disallowed_STD3_mapped\",[40,50500,41]],[[12822,12822],\"disallowed_STD3_mapped\",[40,51088,41]],[[12823,12823],\"disallowed_STD3_mapped\",[40,52264,41]],[[12824,12824],\"disallowed_STD3_mapped\",[40,52852,41]],[[12825,12825],\"disallowed_STD3_mapped\",[40,53440,41]],[[12826,12826],\"disallowed_STD3_mapped\",[40,54028,41]],[[12827,12827],\"disallowed_STD3_mapped\",[40,54616,41]],[[12828,12828],\"disallowed_STD3_mapped\",[40,51452,41]],[[12829,12829],\"disallowed_STD3_mapped\",[40,50724,51204,41]],[[12830,12830],\"disallowed_STD3_mapped\",[40,50724,54980,41]],[[12831,12831],\"disallowed\"],[[12832,12832],\"disallowed_STD3_mapped\",[40,19968,41]],[[12833,12833],\"disallowed_STD3_mapped\",[40,20108,41]],[[12834,12834],\"disallowed_STD3_mapped\",[40,19977,41]],[[12835,12835],\"disallowed_STD3_mapped\",[40,22235,41]],[[12836,12836],\"disallowed_STD3_mapped\",[40,20116,41]],[[12837,12837],\"disallowed_STD3_mapped\",[40,20845,41]],[[12838,12838],\"disallowed_STD3_mapped\",[40,19971,41]],[[12839,12839],\"disallowed_STD3_mapped\",[40,20843,41]],[[12840,12840],\"disallowed_STD3_mapped\",[40,20061,41]],[[12841,12841],\"disallowed_STD3_mapped\",[40,21313,41]],[[12842,12842],\"disallowed_STD3_mapped\",[40,26376,41]],[[12843,12843],\"disallowed_STD3_mapped\",[40,28779,41]],[[12844,12844],\"disallowed_STD3_mapped\",[40,27700,41]],[[12845,12845],\"disallowed_STD3_mapped\",[40,26408,41]],[[12846,12846],\"disallowed_STD3_mapped\",[40,37329,41]],[[12847,12847],\"disallowed_STD3_mapped\",[40,22303,41]],[[12848,12848],\"disallowed_STD3_mapped\",[40,26085,41]],[[12849,12849],\"disallowed_STD3_mapped\",[40,26666,41]],[[12850,12850],\"disallowed_STD3_mapped\",[40,26377,41]],[[12851,12851],\"disallowed_STD3_mapped\",[40,31038,41]],[[12852,12852],\"disallowed_STD3_mapped\",[40,21517,41]],[[12853,12853],\"disallowed_STD3_mapped\",[40,29305,41]],[[12854,12854],\"disallowed_STD3_mapped\",[40,36001,41]],[[12855,12855],\"disallowed_STD3_mapped\",[40,31069,41]],[[12856,12856],\"disallowed_STD3_mapped\",[40,21172,41]],[[12857,12857],\"disallowed_STD3_mapped\",[40,20195,41]],[[12858,12858],\"disallowed_STD3_mapped\",[40,21628,41]],[[12859,12859],\"disallowed_STD3_mapped\",[40,23398,41]],[[12860,12860],\"disallowed_STD3_mapped\",[40,30435,41]],[[12861,12861],\"disallowed_STD3_mapped\",[40,20225,41]],[[12862,12862],\"disallowed_STD3_mapped\",[40,36039,41]],[[12863,12863],\"disallowed_STD3_mapped\",[40,21332,41]],[[12864,12864],\"disallowed_STD3_mapped\",[40,31085,41]],[[12865,12865],\"disallowed_STD3_mapped\",[40,20241,41]],[[12866,12866],\"disallowed_STD3_mapped\",[40,33258,41]],[[12867,12867],\"disallowed_STD3_mapped\",[40,33267,41]],[[12868,12868],\"mapped\",[21839]],[[12869,12869],\"mapped\",[24188]],[[12870,12870],\"mapped\",[25991]],[[12871,12871],\"mapped\",[31631]],[[12872,12879],\"valid\",[],\"NV8\"],[[12880,12880],\"mapped\",[112,116,101]],[[12881,12881],\"mapped\",[50,49]],[[12882,12882],\"mapped\",[50,50]],[[12883,12883],\"mapped\",[50,51]],[[12884,12884],\"mapped\",[50,52]],[[12885,12885],\"mapped\",[50,53]],[[12886,12886],\"mapped\",[50,54]],[[12887,12887],\"mapped\",[50,55]],[[12888,12888],\"mapped\",[50,56]],[[12889,12889],\"mapped\",[50,57]],[[12890,12890],\"mapped\",[51,48]],[[12891,12891],\"mapped\",[51,49]],[[12892,12892],\"mapped\",[51,50]],[[12893,12893],\"mapped\",[51,51]],[[12894,12894],\"mapped\",[51,52]],[[12895,12895],\"mapped\",[51,53]],[[12896,12896],\"mapped\",[4352]],[[12897,12897],\"mapped\",[4354]],[[12898,12898],\"mapped\",[4355]],[[12899,12899],\"mapped\",[4357]],[[12900,12900],\"mapped\",[4358]],[[12901,12901],\"mapped\",[4359]],[[12902,12902],\"mapped\",[4361]],[[12903,12903],\"mapped\",[4363]],[[12904,12904],\"mapped\",[4364]],[[12905,12905],\"mapped\",[4366]],[[12906,12906],\"mapped\",[4367]],[[12907,12907],\"mapped\",[4368]],[[12908,12908],\"mapped\",[4369]],[[12909,12909],\"mapped\",[4370]],[[12910,12910],\"mapped\",[44032]],[[12911,12911],\"mapped\",[45208]],[[12912,12912],\"mapped\",[45796]],[[12913,12913],\"mapped\",[46972]],[[12914,12914],\"mapped\",[47560]],[[12915,12915],\"mapped\",[48148]],[[12916,12916],\"mapped\",[49324]],[[12917,12917],\"mapped\",[50500]],[[12918,12918],\"mapped\",[51088]],[[12919,12919],\"mapped\",[52264]],[[12920,12920],\"mapped\",[52852]],[[12921,12921],\"mapped\",[53440]],[[12922,12922],\"mapped\",[54028]],[[12923,12923],\"mapped\",[54616]],[[12924,12924],\"mapped\",[52280,44256]],[[12925,12925],\"mapped\",[51452,51032]],[[12926,12926],\"mapped\",[50864]],[[12927,12927],\"valid\",[],\"NV8\"],[[12928,12928],\"mapped\",[19968]],[[12929,12929],\"mapped\",[20108]],[[12930,12930],\"mapped\",[19977]],[[12931,12931],\"mapped\",[22235]],[[12932,12932],\"mapped\",[20116]],[[12933,12933],\"mapped\",[20845]],[[12934,12934],\"mapped\",[19971]],[[12935,12935],\"mapped\",[20843]],[[12936,12936],\"mapped\",[20061]],[[12937,12937],\"mapped\",[21313]],[[12938,12938],\"mapped\",[26376]],[[12939,12939],\"mapped\",[28779]],[[12940,12940],\"mapped\",[27700]],[[12941,12941],\"mapped\",[26408]],[[12942,12942],\"mapped\",[37329]],[[12943,12943],\"mapped\",[22303]],[[12944,12944],\"mapped\",[26085]],[[12945,12945],\"mapped\",[26666]],[[12946,12946],\"mapped\",[26377]],[[12947,12947],\"mapped\",[31038]],[[12948,12948],\"mapped\",[21517]],[[12949,12949],\"mapped\",[29305]],[[12950,12950],\"mapped\",[36001]],[[12951,12951],\"mapped\",[31069]],[[12952,12952],\"mapped\",[21172]],[[12953,12953],\"mapped\",[31192]],[[12954,12954],\"mapped\",[30007]],[[12955,12955],\"mapped\",[22899]],[[12956,12956],\"mapped\",[36969]],[[12957,12957],\"mapped\",[20778]],[[12958,12958],\"mapped\",[21360]],[[12959,12959],\"mapped\",[27880]],[[12960,12960],\"mapped\",[38917]],[[12961,12961],\"mapped\",[20241]],[[12962,12962],\"mapped\",[20889]],[[12963,12963],\"mapped\",[27491]],[[12964,12964],\"mapped\",[19978]],[[12965,12965],\"mapped\",[20013]],[[12966,12966],\"mapped\",[19979]],[[12967,12967],\"mapped\",[24038]],[[12968,12968],\"mapped\",[21491]],[[12969,12969],\"mapped\",[21307]],[[12970,12970],\"mapped\",[23447]],[[12971,12971],\"mapped\",[23398]],[[12972,12972],\"mapped\",[30435]],[[12973,12973],\"mapped\",[20225]],[[12974,12974],\"mapped\",[36039]],[[12975,12975],\"mapped\",[21332]],[[12976,12976],\"mapped\",[22812]],[[12977,12977],\"mapped\",[51,54]],[[12978,12978],\"mapped\",[51,55]],[[12979,12979],\"mapped\",[51,56]],[[12980,12980],\"mapped\",[51,57]],[[12981,12981],\"mapped\",[52,48]],[[12982,12982],\"mapped\",[52,49]],[[12983,12983],\"mapped\",[52,50]],[[12984,12984],\"mapped\",[52,51]],[[12985,12985],\"mapped\",[52,52]],[[12986,12986],\"mapped\",[52,53]],[[12987,12987],\"mapped\",[52,54]],[[12988,12988],\"mapped\",[52,55]],[[12989,12989],\"mapped\",[52,56]],[[12990,12990],\"mapped\",[52,57]],[[12991,12991],\"mapped\",[53,48]],[[12992,12992],\"mapped\",[49,26376]],[[12993,12993],\"mapped\",[50,26376]],[[12994,12994],\"mapped\",[51,26376]],[[12995,12995],\"mapped\",[52,26376]],[[12996,12996],\"mapped\",[53,26376]],[[12997,12997],\"mapped\",[54,26376]],[[12998,12998],\"mapped\",[55,26376]],[[12999,12999],\"mapped\",[56,26376]],[[13000,13000],\"mapped\",[57,26376]],[[13001,13001],\"mapped\",[49,48,26376]],[[13002,13002],\"mapped\",[49,49,26376]],[[13003,13003],\"mapped\",[49,50,26376]],[[13004,13004],\"mapped\",[104,103]],[[13005,13005],\"mapped\",[101,114,103]],[[13006,13006],\"mapped\",[101,118]],[[13007,13007],\"mapped\",[108,116,100]],[[13008,13008],\"mapped\",[12450]],[[13009,13009],\"mapped\",[12452]],[[13010,13010],\"mapped\",[12454]],[[13011,13011],\"mapped\",[12456]],[[13012,13012],\"mapped\",[12458]],[[13013,13013],\"mapped\",[12459]],[[13014,13014],\"mapped\",[12461]],[[13015,13015],\"mapped\",[12463]],[[13016,13016],\"mapped\",[12465]],[[13017,13017],\"mapped\",[12467]],[[13018,13018],\"mapped\",[12469]],[[13019,13019],\"mapped\",[12471]],[[13020,13020],\"mapped\",[12473]],[[13021,13021],\"mapped\",[12475]],[[13022,13022],\"mapped\",[12477]],[[13023,13023],\"mapped\",[12479]],[[13024,13024],\"mapped\",[12481]],[[13025,13025],\"mapped\",[12484]],[[13026,13026],\"mapped\",[12486]],[[13027,13027],\"mapped\",[12488]],[[13028,13028],\"mapped\",[12490]],[[13029,13029],\"mapped\",[12491]],[[13030,13030],\"mapped\",[12492]],[[13031,13031],\"mapped\",[12493]],[[13032,13032],\"mapped\",[12494]],[[13033,13033],\"mapped\",[12495]],[[13034,13034],\"mapped\",[12498]],[[13035,13035],\"mapped\",[12501]],[[13036,13036],\"mapped\",[12504]],[[13037,13037],\"mapped\",[12507]],[[13038,13038],\"mapped\",[12510]],[[13039,13039],\"mapped\",[12511]],[[13040,13040],\"mapped\",[12512]],[[13041,13041],\"mapped\",[12513]],[[13042,13042],\"mapped\",[12514]],[[13043,13043],\"mapped\",[12516]],[[13044,13044],\"mapped\",[12518]],[[13045,13045],\"mapped\",[12520]],[[13046,13046],\"mapped\",[12521]],[[13047,13047],\"mapped\",[12522]],[[13048,13048],\"mapped\",[12523]],[[13049,13049],\"mapped\",[12524]],[[13050,13050],\"mapped\",[12525]],[[13051,13051],\"mapped\",[12527]],[[13052,13052],\"mapped\",[12528]],[[13053,13053],\"mapped\",[12529]],[[13054,13054],\"mapped\",[12530]],[[13055,13055],\"disallowed\"],[[13056,13056],\"mapped\",[12450,12497,12540,12488]],[[13057,13057],\"mapped\",[12450,12523,12501,12449]],[[13058,13058],\"mapped\",[12450,12531,12506,12450]],[[13059,13059],\"mapped\",[12450,12540,12523]],[[13060,13060],\"mapped\",[12452,12491,12531,12464]],[[13061,13061],\"mapped\",[12452,12531,12481]],[[13062,13062],\"mapped\",[12454,12457,12531]],[[13063,13063],\"mapped\",[12456,12473,12463,12540,12489]],[[13064,13064],\"mapped\",[12456,12540,12459,12540]],[[13065,13065],\"mapped\",[12458,12531,12473]],[[13066,13066],\"mapped\",[12458,12540,12512]],[[13067,13067],\"mapped\",[12459,12452,12522]],[[13068,13068],\"mapped\",[12459,12521,12483,12488]],[[13069,13069],\"mapped\",[12459,12525,12522,12540]],[[13070,13070],\"mapped\",[12460,12525,12531]],[[13071,13071],\"mapped\",[12460,12531,12510]],[[13072,13072],\"mapped\",[12462,12460]],[[13073,13073],\"mapped\",[12462,12491,12540]],[[13074,13074],\"mapped\",[12461,12517,12522,12540]],[[13075,13075],\"mapped\",[12462,12523,12480,12540]],[[13076,13076],\"mapped\",[12461,12525]],[[13077,13077],\"mapped\",[12461,12525,12464,12521,12512]],[[13078,13078],\"mapped\",[12461,12525,12513,12540,12488,12523]],[[13079,13079],\"mapped\",[12461,12525,12527,12483,12488]],[[13080,13080],\"mapped\",[12464,12521,12512]],[[13081,13081],\"mapped\",[12464,12521,12512,12488,12531]],[[13082,13082],\"mapped\",[12463,12523,12476,12452,12525]],[[13083,13083],\"mapped\",[12463,12525,12540,12493]],[[13084,13084],\"mapped\",[12465,12540,12473]],[[13085,13085],\"mapped\",[12467,12523,12490]],[[13086,13086],\"mapped\",[12467,12540,12509]],[[13087,13087],\"mapped\",[12469,12452,12463,12523]],[[13088,13088],\"mapped\",[12469,12531,12481,12540,12512]],[[13089,13089],\"mapped\",[12471,12522,12531,12464]],[[13090,13090],\"mapped\",[12475,12531,12481]],[[13091,13091],\"mapped\",[12475,12531,12488]],[[13092,13092],\"mapped\",[12480,12540,12473]],[[13093,13093],\"mapped\",[12487,12471]],[[13094,13094],\"mapped\",[12489,12523]],[[13095,13095],\"mapped\",[12488,12531]],[[13096,13096],\"mapped\",[12490,12494]],[[13097,13097],\"mapped\",[12494,12483,12488]],[[13098,13098],\"mapped\",[12495,12452,12484]],[[13099,13099],\"mapped\",[12497,12540,12475,12531,12488]],[[13100,13100],\"mapped\",[12497,12540,12484]],[[13101,13101],\"mapped\",[12496,12540,12524,12523]],[[13102,13102],\"mapped\",[12500,12450,12473,12488,12523]],[[13103,13103],\"mapped\",[12500,12463,12523]],[[13104,13104],\"mapped\",[12500,12467]],[[13105,13105],\"mapped\",[12499,12523]],[[13106,13106],\"mapped\",[12501,12449,12521,12483,12489]],[[13107,13107],\"mapped\",[12501,12451,12540,12488]],[[13108,13108],\"mapped\",[12502,12483,12471,12455,12523]],[[13109,13109],\"mapped\",[12501,12521,12531]],[[13110,13110],\"mapped\",[12504,12463,12479,12540,12523]],[[13111,13111],\"mapped\",[12506,12477]],[[13112,13112],\"mapped\",[12506,12491,12498]],[[13113,13113],\"mapped\",[12504,12523,12484]],[[13114,13114],\"mapped\",[12506,12531,12473]],[[13115,13115],\"mapped\",[12506,12540,12472]],[[13116,13116],\"mapped\",[12505,12540,12479]],[[13117,13117],\"mapped\",[12509,12452,12531,12488]],[[13118,13118],\"mapped\",[12508,12523,12488]],[[13119,13119],\"mapped\",[12507,12531]],[[13120,13120],\"mapped\",[12509,12531,12489]],[[13121,13121],\"mapped\",[12507,12540,12523]],[[13122,13122],\"mapped\",[12507,12540,12531]],[[13123,13123],\"mapped\",[12510,12452,12463,12525]],[[13124,13124],\"mapped\",[12510,12452,12523]],[[13125,13125],\"mapped\",[12510,12483,12495]],[[13126,13126],\"mapped\",[12510,12523,12463]],[[13127,13127],\"mapped\",[12510,12531,12471,12519,12531]],[[13128,13128],\"mapped\",[12511,12463,12525,12531]],[[13129,13129],\"mapped\",[12511,12522]],[[13130,13130],\"mapped\",[12511,12522,12496,12540,12523]],[[13131,13131],\"mapped\",[12513,12460]],[[13132,13132],\"mapped\",[12513,12460,12488,12531]],[[13133,13133],\"mapped\",[12513,12540,12488,12523]],[[13134,13134],\"mapped\",[12516,12540,12489]],[[13135,13135],\"mapped\",[12516,12540,12523]],[[13136,13136],\"mapped\",[12518,12450,12531]],[[13137,13137],\"mapped\",[12522,12483,12488,12523]],[[13138,13138],\"mapped\",[12522,12521]],[[13139,13139],\"mapped\",[12523,12500,12540]],[[13140,13140],\"mapped\",[12523,12540,12502,12523]],[[13141,13141],\"mapped\",[12524,12512]],[[13142,13142],\"mapped\",[12524,12531,12488,12466,12531]],[[13143,13143],\"mapped\",[12527,12483,12488]],[[13144,13144],\"mapped\",[48,28857]],[[13145,13145],\"mapped\",[49,28857]],[[13146,13146],\"mapped\",[50,28857]],[[13147,13147],\"mapped\",[51,28857]],[[13148,13148],\"mapped\",[52,28857]],[[13149,13149],\"mapped\",[53,28857]],[[13150,13150],\"mapped\",[54,28857]],[[13151,13151],\"mapped\",[55,28857]],[[13152,13152],\"mapped\",[56,28857]],[[13153,13153],\"mapped\",[57,28857]],[[13154,13154],\"mapped\",[49,48,28857]],[[13155,13155],\"mapped\",[49,49,28857]],[[13156,13156],\"mapped\",[49,50,28857]],[[13157,13157],\"mapped\",[49,51,28857]],[[13158,13158],\"mapped\",[49,52,28857]],[[13159,13159],\"mapped\",[49,53,28857]],[[13160,13160],\"mapped\",[49,54,28857]],[[13161,13161],\"mapped\",[49,55,28857]],[[13162,13162],\"mapped\",[49,56,28857]],[[13163,13163],\"mapped\",[49,57,28857]],[[13164,13164],\"mapped\",[50,48,28857]],[[13165,13165],\"mapped\",[50,49,28857]],[[13166,13166],\"mapped\",[50,50,28857]],[[13167,13167],\"mapped\",[50,51,28857]],[[13168,13168],\"mapped\",[50,52,28857]],[[13169,13169],\"mapped\",[104,112,97]],[[13170,13170],\"mapped\",[100,97]],[[13171,13171],\"mapped\",[97,117]],[[13172,13172],\"mapped\",[98,97,114]],[[13173,13173],\"mapped\",[111,118]],[[13174,13174],\"mapped\",[112,99]],[[13175,13175],\"mapped\",[100,109]],[[13176,13176],\"mapped\",[100,109,50]],[[13177,13177],\"mapped\",[100,109,51]],[[13178,13178],\"mapped\",[105,117]],[[13179,13179],\"mapped\",[24179,25104]],[[13180,13180],\"mapped\",[26157,21644]],[[13181,13181],\"mapped\",[22823,27491]],[[13182,13182],\"mapped\",[26126,27835]],[[13183,13183],\"mapped\",[26666,24335,20250,31038]],[[13184,13184],\"mapped\",[112,97]],[[13185,13185],\"mapped\",[110,97]],[[13186,13186],\"mapped\",[956,97]],[[13187,13187],\"mapped\",[109,97]],[[13188,13188],\"mapped\",[107,97]],[[13189,13189],\"mapped\",[107,98]],[[13190,13190],\"mapped\",[109,98]],[[13191,13191],\"mapped\",[103,98]],[[13192,13192],\"mapped\",[99,97,108]],[[13193,13193],\"mapped\",[107,99,97,108]],[[13194,13194],\"mapped\",[112,102]],[[13195,13195],\"mapped\",[110,102]],[[13196,13196],\"mapped\",[956,102]],[[13197,13197],\"mapped\",[956,103]],[[13198,13198],\"mapped\",[109,103]],[[13199,13199],\"mapped\",[107,103]],[[13200,13200],\"mapped\",[104,122]],[[13201,13201],\"mapped\",[107,104,122]],[[13202,13202],\"mapped\",[109,104,122]],[[13203,13203],\"mapped\",[103,104,122]],[[13204,13204],\"mapped\",[116,104,122]],[[13205,13205],\"mapped\",[956,108]],[[13206,13206],\"mapped\",[109,108]],[[13207,13207],\"mapped\",[100,108]],[[13208,13208],\"mapped\",[107,108]],[[13209,13209],\"mapped\",[102,109]],[[13210,13210],\"mapped\",[110,109]],[[13211,13211],\"mapped\",[956,109]],[[13212,13212],\"mapped\",[109,109]],[[13213,13213],\"mapped\",[99,109]],[[13214,13214],\"mapped\",[107,109]],[[13215,13215],\"mapped\",[109,109,50]],[[13216,13216],\"mapped\",[99,109,50]],[[13217,13217],\"mapped\",[109,50]],[[13218,13218],\"mapped\",[107,109,50]],[[13219,13219],\"mapped\",[109,109,51]],[[13220,13220],\"mapped\",[99,109,51]],[[13221,13221],\"mapped\",[109,51]],[[13222,13222],\"mapped\",[107,109,51]],[[13223,13223],\"mapped\",[109,8725,115]],[[13224,13224],\"mapped\",[109,8725,115,50]],[[13225,13225],\"mapped\",[112,97]],[[13226,13226],\"mapped\",[107,112,97]],[[13227,13227],\"mapped\",[109,112,97]],[[13228,13228],\"mapped\",[103,112,97]],[[13229,13229],\"mapped\",[114,97,100]],[[13230,13230],\"mapped\",[114,97,100,8725,115]],[[13231,13231],\"mapped\",[114,97,100,8725,115,50]],[[13232,13232],\"mapped\",[112,115]],[[13233,13233],\"mapped\",[110,115]],[[13234,13234],\"mapped\",[956,115]],[[13235,13235],\"mapped\",[109,115]],[[13236,13236],\"mapped\",[112,118]],[[13237,13237],\"mapped\",[110,118]],[[13238,13238],\"mapped\",[956,118]],[[13239,13239],\"mapped\",[109,118]],[[13240,13240],\"mapped\",[107,118]],[[13241,13241],\"mapped\",[109,118]],[[13242,13242],\"mapped\",[112,119]],[[13243,13243],\"mapped\",[110,119]],[[13244,13244],\"mapped\",[956,119]],[[13245,13245],\"mapped\",[109,119]],[[13246,13246],\"mapped\",[107,119]],[[13247,13247],\"mapped\",[109,119]],[[13248,13248],\"mapped\",[107,969]],[[13249,13249],\"mapped\",[109,969]],[[13250,13250],\"disallowed\"],[[13251,13251],\"mapped\",[98,113]],[[13252,13252],\"mapped\",[99,99]],[[13253,13253],\"mapped\",[99,100]],[[13254,13254],\"mapped\",[99,8725,107,103]],[[13255,13255],\"disallowed\"],[[13256,13256],\"mapped\",[100,98]],[[13257,13257],\"mapped\",[103,121]],[[13258,13258],\"mapped\",[104,97]],[[13259,13259],\"mapped\",[104,112]],[[13260,13260],\"mapped\",[105,110]],[[13261,13261],\"mapped\",[107,107]],[[13262,13262],\"mapped\",[107,109]],[[13263,13263],\"mapped\",[107,116]],[[13264,13264],\"mapped\",[108,109]],[[13265,13265],\"mapped\",[108,110]],[[13266,13266],\"mapped\",[108,111,103]],[[13267,13267],\"mapped\",[108,120]],[[13268,13268],\"mapped\",[109,98]],[[13269,13269],\"mapped\",[109,105,108]],[[13270,13270],\"mapped\",[109,111,108]],[[13271,13271],\"mapped\",[112,104]],[[13272,13272],\"disallowed\"],[[13273,13273],\"mapped\",[112,112,109]],[[13274,13274],\"mapped\",[112,114]],[[13275,13275],\"mapped\",[115,114]],[[13276,13276],\"mapped\",[115,118]],[[13277,13277],\"mapped\",[119,98]],[[13278,13278],\"mapped\",[118,8725,109]],[[13279,13279],\"mapped\",[97,8725,109]],[[13280,13280],\"mapped\",[49,26085]],[[13281,13281],\"mapped\",[50,26085]],[[13282,13282],\"mapped\",[51,26085]],[[13283,13283],\"mapped\",[52,26085]],[[13284,13284],\"mapped\",[53,26085]],[[13285,13285],\"mapped\",[54,26085]],[[13286,13286],\"mapped\",[55,26085]],[[13287,13287],\"mapped\",[56,26085]],[[13288,13288],\"mapped\",[57,26085]],[[13289,13289],\"mapped\",[49,48,26085]],[[13290,13290],\"mapped\",[49,49,26085]],[[13291,13291],\"mapped\",[49,50,26085]],[[13292,13292],\"mapped\",[49,51,26085]],[[13293,13293],\"mapped\",[49,52,26085]],[[13294,13294],\"mapped\",[49,53,26085]],[[13295,13295],\"mapped\",[49,54,26085]],[[13296,13296],\"mapped\",[49,55,26085]],[[13297,13297],\"mapped\",[49,56,26085]],[[13298,13298],\"mapped\",[49,57,26085]],[[13299,13299],\"mapped\",[50,48,26085]],[[13300,13300],\"mapped\",[50,49,26085]],[[13301,13301],\"mapped\",[50,50,26085]],[[13302,13302],\"mapped\",[50,51,26085]],[[13303,13303],\"mapped\",[50,52,26085]],[[13304,13304],\"mapped\",[50,53,26085]],[[13305,13305],\"mapped\",[50,54,26085]],[[13306,13306],\"mapped\",[50,55,26085]],[[13307,13307],\"mapped\",[50,56,26085]],[[13308,13308],\"mapped\",[50,57,26085]],[[13309,13309],\"mapped\",[51,48,26085]],[[13310,13310],\"mapped\",[51,49,26085]],[[13311,13311],\"mapped\",[103,97,108]],[[13312,19893],\"valid\"],[[19894,19903],\"disallowed\"],[[19904,19967],\"valid\",[],\"NV8\"],[[19968,40869],\"valid\"],[[40870,40891],\"valid\"],[[40892,40899],\"valid\"],[[40900,40907],\"valid\"],[[40908,40908],\"valid\"],[[40909,40917],\"valid\"],[[40918,40959],\"disallowed\"],[[40960,42124],\"valid\"],[[42125,42127],\"disallowed\"],[[42128,42145],\"valid\",[],\"NV8\"],[[42146,42147],\"valid\",[],\"NV8\"],[[42148,42163],\"valid\",[],\"NV8\"],[[42164,42164],\"valid\",[],\"NV8\"],[[42165,42176],\"valid\",[],\"NV8\"],[[42177,42177],\"valid\",[],\"NV8\"],[[42178,42180],\"valid\",[],\"NV8\"],[[42181,42181],\"valid\",[],\"NV8\"],[[42182,42182],\"valid\",[],\"NV8\"],[[42183,42191],\"disallowed\"],[[42192,42237],\"valid\"],[[42238,42239],\"valid\",[],\"NV8\"],[[42240,42508],\"valid\"],[[42509,42511],\"valid\",[],\"NV8\"],[[42512,42539],\"valid\"],[[42540,42559],\"disallowed\"],[[42560,42560],\"mapped\",[42561]],[[42561,42561],\"valid\"],[[42562,42562],\"mapped\",[42563]],[[42563,42563],\"valid\"],[[42564,42564],\"mapped\",[42565]],[[42565,42565],\"valid\"],[[42566,42566],\"mapped\",[42567]],[[42567,42567],\"valid\"],[[42568,42568],\"mapped\",[42569]],[[42569,42569],\"valid\"],[[42570,42570],\"mapped\",[42571]],[[42571,42571],\"valid\"],[[42572,42572],\"mapped\",[42573]],[[42573,42573],\"valid\"],[[42574,42574],\"mapped\",[42575]],[[42575,42575],\"valid\"],[[42576,42576],\"mapped\",[42577]],[[42577,42577],\"valid\"],[[42578,42578],\"mapped\",[42579]],[[42579,42579],\"valid\"],[[42580,42580],\"mapped\",[42581]],[[42581,42581],\"valid\"],[[42582,42582],\"mapped\",[42583]],[[42583,42583],\"valid\"],[[42584,42584],\"mapped\",[42585]],[[42585,42585],\"valid\"],[[42586,42586],\"mapped\",[42587]],[[42587,42587],\"valid\"],[[42588,42588],\"mapped\",[42589]],[[42589,42589],\"valid\"],[[42590,42590],\"mapped\",[42591]],[[42591,42591],\"valid\"],[[42592,42592],\"mapped\",[42593]],[[42593,42593],\"valid\"],[[42594,42594],\"mapped\",[42595]],[[42595,42595],\"valid\"],[[42596,42596],\"mapped\",[42597]],[[42597,42597],\"valid\"],[[42598,42598],\"mapped\",[42599]],[[42599,42599],\"valid\"],[[42600,42600],\"mapped\",[42601]],[[42601,42601],\"valid\"],[[42602,42602],\"mapped\",[42603]],[[42603,42603],\"valid\"],[[42604,42604],\"mapped\",[42605]],[[42605,42607],\"valid\"],[[42608,42611],\"valid\",[],\"NV8\"],[[42612,42619],\"valid\"],[[42620,42621],\"valid\"],[[42622,42622],\"valid\",[],\"NV8\"],[[42623,42623],\"valid\"],[[42624,42624],\"mapped\",[42625]],[[42625,42625],\"valid\"],[[42626,42626],\"mapped\",[42627]],[[42627,42627],\"valid\"],[[42628,42628],\"mapped\",[42629]],[[42629,42629],\"valid\"],[[42630,42630],\"mapped\",[42631]],[[42631,42631],\"valid\"],[[42632,42632],\"mapped\",[42633]],[[42633,42633],\"valid\"],[[42634,42634],\"mapped\",[42635]],[[42635,42635],\"valid\"],[[42636,42636],\"mapped\",[42637]],[[42637,42637],\"valid\"],[[42638,42638],\"mapped\",[42639]],[[42639,42639],\"valid\"],[[42640,42640],\"mapped\",[42641]],[[42641,42641],\"valid\"],[[42642,42642],\"mapped\",[42643]],[[42643,42643],\"valid\"],[[42644,42644],\"mapped\",[42645]],[[42645,42645],\"valid\"],[[42646,42646],\"mapped\",[42647]],[[42647,42647],\"valid\"],[[42648,42648],\"mapped\",[42649]],[[42649,42649],\"valid\"],[[42650,42650],\"mapped\",[42651]],[[42651,42651],\"valid\"],[[42652,42652],\"mapped\",[1098]],[[42653,42653],\"mapped\",[1100]],[[42654,42654],\"valid\"],[[42655,42655],\"valid\"],[[42656,42725],\"valid\"],[[42726,42735],\"valid\",[],\"NV8\"],[[42736,42737],\"valid\"],[[42738,42743],\"valid\",[],\"NV8\"],[[42744,42751],\"disallowed\"],[[42752,42774],\"valid\",[],\"NV8\"],[[42775,42778],\"valid\"],[[42779,42783],\"valid\"],[[42784,42785],\"valid\",[],\"NV8\"],[[42786,42786],\"mapped\",[42787]],[[42787,42787],\"valid\"],[[42788,42788],\"mapped\",[42789]],[[42789,42789],\"valid\"],[[42790,42790],\"mapped\",[42791]],[[42791,42791],\"valid\"],[[42792,42792],\"mapped\",[42793]],[[42793,42793],\"valid\"],[[42794,42794],\"mapped\",[42795]],[[42795,42795],\"valid\"],[[42796,42796],\"mapped\",[42797]],[[42797,42797],\"valid\"],[[42798,42798],\"mapped\",[42799]],[[42799,42801],\"valid\"],[[42802,42802],\"mapped\",[42803]],[[42803,42803],\"valid\"],[[42804,42804],\"mapped\",[42805]],[[42805,42805],\"valid\"],[[42806,42806],\"mapped\",[42807]],[[42807,42807],\"valid\"],[[42808,42808],\"mapped\",[42809]],[[42809,42809],\"valid\"],[[42810,42810],\"mapped\",[42811]],[[42811,42811],\"valid\"],[[42812,42812],\"mapped\",[42813]],[[42813,42813],\"valid\"],[[42814,42814],\"mapped\",[42815]],[[42815,42815],\"valid\"],[[42816,42816],\"mapped\",[42817]],[[42817,42817],\"valid\"],[[42818,42818],\"mapped\",[42819]],[[42819,42819],\"valid\"],[[42820,42820],\"mapped\",[42821]],[[42821,42821],\"valid\"],[[42822,42822],\"mapped\",[42823]],[[42823,42823],\"valid\"],[[42824,42824],\"mapped\",[42825]],[[42825,42825],\"valid\"],[[42826,42826],\"mapped\",[42827]],[[42827,42827],\"valid\"],[[42828,42828],\"mapped\",[42829]],[[42829,42829],\"valid\"],[[42830,42830],\"mapped\",[42831]],[[42831,42831],\"valid\"],[[42832,42832],\"mapped\",[42833]],[[42833,42833],\"valid\"],[[42834,42834],\"mapped\",[42835]],[[42835,42835],\"valid\"],[[42836,42836],\"mapped\",[42837]],[[42837,42837],\"valid\"],[[42838,42838],\"mapped\",[42839]],[[42839,42839],\"valid\"],[[42840,42840],\"mapped\",[42841]],[[42841,42841],\"valid\"],[[42842,42842],\"mapped\",[42843]],[[42843,42843],\"valid\"],[[42844,42844],\"mapped\",[42845]],[[42845,42845],\"valid\"],[[42846,42846],\"mapped\",[42847]],[[42847,42847],\"valid\"],[[42848,42848],\"mapped\",[42849]],[[42849,42849],\"valid\"],[[42850,42850],\"mapped\",[42851]],[[42851,42851],\"valid\"],[[42852,42852],\"mapped\",[42853]],[[42853,42853],\"valid\"],[[42854,42854],\"mapped\",[42855]],[[42855,42855],\"valid\"],[[42856,42856],\"mapped\",[42857]],[[42857,42857],\"valid\"],[[42858,42858],\"mapped\",[42859]],[[42859,42859],\"valid\"],[[42860,42860],\"mapped\",[42861]],[[42861,42861],\"valid\"],[[42862,42862],\"mapped\",[42863]],[[42863,42863],\"valid\"],[[42864,42864],\"mapped\",[42863]],[[42865,42872],\"valid\"],[[42873,42873],\"mapped\",[42874]],[[42874,42874],\"valid\"],[[42875,42875],\"mapped\",[42876]],[[42876,42876],\"valid\"],[[42877,42877],\"mapped\",[7545]],[[42878,42878],\"mapped\",[42879]],[[42879,42879],\"valid\"],[[42880,42880],\"mapped\",[42881]],[[42881,42881],\"valid\"],[[42882,42882],\"mapped\",[42883]],[[42883,42883],\"valid\"],[[42884,42884],\"mapped\",[42885]],[[42885,42885],\"valid\"],[[42886,42886],\"mapped\",[42887]],[[42887,42888],\"valid\"],[[42889,42890],\"valid\",[],\"NV8\"],[[42891,42891],\"mapped\",[42892]],[[42892,42892],\"valid\"],[[42893,42893],\"mapped\",[613]],[[42894,42894],\"valid\"],[[42895,42895],\"valid\"],[[42896,42896],\"mapped\",[42897]],[[42897,42897],\"valid\"],[[42898,42898],\"mapped\",[42899]],[[42899,42899],\"valid\"],[[42900,42901],\"valid\"],[[42902,42902],\"mapped\",[42903]],[[42903,42903],\"valid\"],[[42904,42904],\"mapped\",[42905]],[[42905,42905],\"valid\"],[[42906,42906],\"mapped\",[42907]],[[42907,42907],\"valid\"],[[42908,42908],\"mapped\",[42909]],[[42909,42909],\"valid\"],[[42910,42910],\"mapped\",[42911]],[[42911,42911],\"valid\"],[[42912,42912],\"mapped\",[42913]],[[42913,42913],\"valid\"],[[42914,42914],\"mapped\",[42915]],[[42915,42915],\"valid\"],[[42916,42916],\"mapped\",[42917]],[[42917,42917],\"valid\"],[[42918,42918],\"mapped\",[42919]],[[42919,42919],\"valid\"],[[42920,42920],\"mapped\",[42921]],[[42921,42921],\"valid\"],[[42922,42922],\"mapped\",[614]],[[42923,42923],\"mapped\",[604]],[[42924,42924],\"mapped\",[609]],[[42925,42925],\"mapped\",[620]],[[42926,42927],\"disallowed\"],[[42928,42928],\"mapped\",[670]],[[42929,42929],\"mapped\",[647]],[[42930,42930],\"mapped\",[669]],[[42931,42931],\"mapped\",[43859]],[[42932,42932],\"mapped\",[42933]],[[42933,42933],\"valid\"],[[42934,42934],\"mapped\",[42935]],[[42935,42935],\"valid\"],[[42936,42998],\"disallowed\"],[[42999,42999],\"valid\"],[[43000,43000],\"mapped\",[295]],[[43001,43001],\"mapped\",[339]],[[43002,43002],\"valid\"],[[43003,43007],\"valid\"],[[43008,43047],\"valid\"],[[43048,43051],\"valid\",[],\"NV8\"],[[43052,43055],\"disallowed\"],[[43056,43065],\"valid\",[],\"NV8\"],[[43066,43071],\"disallowed\"],[[43072,43123],\"valid\"],[[43124,43127],\"valid\",[],\"NV8\"],[[43128,43135],\"disallowed\"],[[43136,43204],\"valid\"],[[43205,43213],\"disallowed\"],[[43214,43215],\"valid\",[],\"NV8\"],[[43216,43225],\"valid\"],[[43226,43231],\"disallowed\"],[[43232,43255],\"valid\"],[[43256,43258],\"valid\",[],\"NV8\"],[[43259,43259],\"valid\"],[[43260,43260],\"valid\",[],\"NV8\"],[[43261,43261],\"valid\"],[[43262,43263],\"disallowed\"],[[43264,43309],\"valid\"],[[43310,43311],\"valid\",[],\"NV8\"],[[43312,43347],\"valid\"],[[43348,43358],\"disallowed\"],[[43359,43359],\"valid\",[],\"NV8\"],[[43360,43388],\"valid\",[],\"NV8\"],[[43389,43391],\"disallowed\"],[[43392,43456],\"valid\"],[[43457,43469],\"valid\",[],\"NV8\"],[[43470,43470],\"disallowed\"],[[43471,43481],\"valid\"],[[43482,43485],\"disallowed\"],[[43486,43487],\"valid\",[],\"NV8\"],[[43488,43518],\"valid\"],[[43519,43519],\"disallowed\"],[[43520,43574],\"valid\"],[[43575,43583],\"disallowed\"],[[43584,43597],\"valid\"],[[43598,43599],\"disallowed\"],[[43600,43609],\"valid\"],[[43610,43611],\"disallowed\"],[[43612,43615],\"valid\",[],\"NV8\"],[[43616,43638],\"valid\"],[[43639,43641],\"valid\",[],\"NV8\"],[[43642,43643],\"valid\"],[[43644,43647],\"valid\"],[[43648,43714],\"valid\"],[[43715,43738],\"disallowed\"],[[43739,43741],\"valid\"],[[43742,43743],\"valid\",[],\"NV8\"],[[43744,43759],\"valid\"],[[43760,43761],\"valid\",[],\"NV8\"],[[43762,43766],\"valid\"],[[43767,43776],\"disallowed\"],[[43777,43782],\"valid\"],[[43783,43784],\"disallowed\"],[[43785,43790],\"valid\"],[[43791,43792],\"disallowed\"],[[43793,43798],\"valid\"],[[43799,43807],\"disallowed\"],[[43808,43814],\"valid\"],[[43815,43815],\"disallowed\"],[[43816,43822],\"valid\"],[[43823,43823],\"disallowed\"],[[43824,43866],\"valid\"],[[43867,43867],\"valid\",[],\"NV8\"],[[43868,43868],\"mapped\",[42791]],[[43869,43869],\"mapped\",[43831]],[[43870,43870],\"mapped\",[619]],[[43871,43871],\"mapped\",[43858]],[[43872,43875],\"valid\"],[[43876,43877],\"valid\"],[[43878,43887],\"disallowed\"],[[43888,43888],\"mapped\",[5024]],[[43889,43889],\"mapped\",[5025]],[[43890,43890],\"mapped\",[5026]],[[43891,43891],\"mapped\",[5027]],[[43892,43892],\"mapped\",[5028]],[[43893,43893],\"mapped\",[5029]],[[43894,43894],\"mapped\",[5030]],[[43895,43895],\"mapped\",[5031]],[[43896,43896],\"mapped\",[5032]],[[43897,43897],\"mapped\",[5033]],[[43898,43898],\"mapped\",[5034]],[[43899,43899],\"mapped\",[5035]],[[43900,43900],\"mapped\",[5036]],[[43901,43901],\"mapped\",[5037]],[[43902,43902],\"mapped\",[5038]],[[43903,43903],\"mapped\",[5039]],[[43904,43904],\"mapped\",[5040]],[[43905,43905],\"mapped\",[5041]],[[43906,43906],\"mapped\",[5042]],[[43907,43907],\"mapped\",[5043]],[[43908,43908],\"mapped\",[5044]],[[43909,43909],\"mapped\",[5045]],[[43910,43910],\"mapped\",[5046]],[[43911,43911],\"mapped\",[5047]],[[43912,43912],\"mapped\",[5048]],[[43913,43913],\"mapped\",[5049]],[[43914,43914],\"mapped\",[5050]],[[43915,43915],\"mapped\",[5051]],[[43916,43916],\"mapped\",[5052]],[[43917,43917],\"mapped\",[5053]],[[43918,43918],\"mapped\",[5054]],[[43919,43919],\"mapped\",[5055]],[[43920,43920],\"mapped\",[5056]],[[43921,43921],\"mapped\",[5057]],[[43922,43922],\"mapped\",[5058]],[[43923,43923],\"mapped\",[5059]],[[43924,43924],\"mapped\",[5060]],[[43925,43925],\"mapped\",[5061]],[[43926,43926],\"mapped\",[5062]],[[43927,43927],\"mapped\",[5063]],[[43928,43928],\"mapped\",[5064]],[[43929,43929],\"mapped\",[5065]],[[43930,43930],\"mapped\",[5066]],[[43931,43931],\"mapped\",[5067]],[[43932,43932],\"mapped\",[5068]],[[43933,43933],\"mapped\",[5069]],[[43934,43934],\"mapped\",[5070]],[[43935,43935],\"mapped\",[5071]],[[43936,43936],\"mapped\",[5072]],[[43937,43937],\"mapped\",[5073]],[[43938,43938],\"mapped\",[5074]],[[43939,43939],\"mapped\",[5075]],[[43940,43940],\"mapped\",[5076]],[[43941,43941],\"mapped\",[5077]],[[43942,43942],\"mapped\",[5078]],[[43943,43943],\"mapped\",[5079]],[[43944,43944],\"mapped\",[5080]],[[43945,43945],\"mapped\",[5081]],[[43946,43946],\"mapped\",[5082]],[[43947,43947],\"mapped\",[5083]],[[43948,43948],\"mapped\",[5084]],[[43949,43949],\"mapped\",[5085]],[[43950,43950],\"mapped\",[5086]],[[43951,43951],\"mapped\",[5087]],[[43952,43952],\"mapped\",[5088]],[[43953,43953],\"mapped\",[5089]],[[43954,43954],\"mapped\",[5090]],[[43955,43955],\"mapped\",[5091]],[[43956,43956],\"mapped\",[5092]],[[43957,43957],\"mapped\",[5093]],[[43958,43958],\"mapped\",[5094]],[[43959,43959],\"mapped\",[5095]],[[43960,43960],\"mapped\",[5096]],[[43961,43961],\"mapped\",[5097]],[[43962,43962],\"mapped\",[5098]],[[43963,43963],\"mapped\",[5099]],[[43964,43964],\"mapped\",[5100]],[[43965,43965],\"mapped\",[5101]],[[43966,43966],\"mapped\",[5102]],[[43967,43967],\"mapped\",[5103]],[[43968,44010],\"valid\"],[[44011,44011],\"valid\",[],\"NV8\"],[[44012,44013],\"valid\"],[[44014,44015],\"disallowed\"],[[44016,44025],\"valid\"],[[44026,44031],\"disallowed\"],[[44032,55203],\"valid\"],[[55204,55215],\"disallowed\"],[[55216,55238],\"valid\",[],\"NV8\"],[[55239,55242],\"disallowed\"],[[55243,55291],\"valid\",[],\"NV8\"],[[55292,55295],\"disallowed\"],[[55296,57343],\"disallowed\"],[[57344,63743],\"disallowed\"],[[63744,63744],\"mapped\",[35912]],[[63745,63745],\"mapped\",[26356]],[[63746,63746],\"mapped\",[36554]],[[63747,63747],\"mapped\",[36040]],[[63748,63748],\"mapped\",[28369]],[[63749,63749],\"mapped\",[20018]],[[63750,63750],\"mapped\",[21477]],[[63751,63752],\"mapped\",[40860]],[[63753,63753],\"mapped\",[22865]],[[63754,63754],\"mapped\",[37329]],[[63755,63755],\"mapped\",[21895]],[[63756,63756],\"mapped\",[22856]],[[63757,63757],\"mapped\",[25078]],[[63758,63758],\"mapped\",[30313]],[[63759,63759],\"mapped\",[32645]],[[63760,63760],\"mapped\",[34367]],[[63761,63761],\"mapped\",[34746]],[[63762,63762],\"mapped\",[35064]],[[63763,63763],\"mapped\",[37007]],[[63764,63764],\"mapped\",[27138]],[[63765,63765],\"mapped\",[27931]],[[63766,63766],\"mapped\",[28889]],[[63767,63767],\"mapped\",[29662]],[[63768,63768],\"mapped\",[33853]],[[63769,63769],\"mapped\",[37226]],[[63770,63770],\"mapped\",[39409]],[[63771,63771],\"mapped\",[20098]],[[63772,63772],\"mapped\",[21365]],[[63773,63773],\"mapped\",[27396]],[[63774,63774],\"mapped\",[29211]],[[63775,63775],\"mapped\",[34349]],[[63776,63776],\"mapped\",[40478]],[[63777,63777],\"mapped\",[23888]],[[63778,63778],\"mapped\",[28651]],[[63779,63779],\"mapped\",[34253]],[[63780,63780],\"mapped\",[35172]],[[63781,63781],\"mapped\",[25289]],[[63782,63782],\"mapped\",[33240]],[[63783,63783],\"mapped\",[34847]],[[63784,63784],\"mapped\",[24266]],[[63785,63785],\"mapped\",[26391]],[[63786,63786],\"mapped\",[28010]],[[63787,63787],\"mapped\",[29436]],[[63788,63788],\"mapped\",[37070]],[[63789,63789],\"mapped\",[20358]],[[63790,63790],\"mapped\",[20919]],[[63791,63791],\"mapped\",[21214]],[[63792,63792],\"mapped\",[25796]],[[63793,63793],\"mapped\",[27347]],[[63794,63794],\"mapped\",[29200]],[[63795,63795],\"mapped\",[30439]],[[63796,63796],\"mapped\",[32769]],[[63797,63797],\"mapped\",[34310]],[[63798,63798],\"mapped\",[34396]],[[63799,63799],\"mapped\",[36335]],[[63800,63800],\"mapped\",[38706]],[[63801,63801],\"mapped\",[39791]],[[63802,63802],\"mapped\",[40442]],[[63803,63803],\"mapped\",[30860]],[[63804,63804],\"mapped\",[31103]],[[63805,63805],\"mapped\",[32160]],[[63806,63806],\"mapped\",[33737]],[[63807,63807],\"mapped\",[37636]],[[63808,63808],\"mapped\",[40575]],[[63809,63809],\"mapped\",[35542]],[[63810,63810],\"mapped\",[22751]],[[63811,63811],\"mapped\",[24324]],[[63812,63812],\"mapped\",[31840]],[[63813,63813],\"mapped\",[32894]],[[63814,63814],\"mapped\",[29282]],[[63815,63815],\"mapped\",[30922]],[[63816,63816],\"mapped\",[36034]],[[63817,63817],\"mapped\",[38647]],[[63818,63818],\"mapped\",[22744]],[[63819,63819],\"mapped\",[23650]],[[63820,63820],\"mapped\",[27155]],[[63821,63821],\"mapped\",[28122]],[[63822,63822],\"mapped\",[28431]],[[63823,63823],\"mapped\",[32047]],[[63824,63824],\"mapped\",[32311]],[[63825,63825],\"mapped\",[38475]],[[63826,63826],\"mapped\",[21202]],[[63827,63827],\"mapped\",[32907]],[[63828,63828],\"mapped\",[20956]],[[63829,63829],\"mapped\",[20940]],[[63830,63830],\"mapped\",[31260]],[[63831,63831],\"mapped\",[32190]],[[63832,63832],\"mapped\",[33777]],[[63833,63833],\"mapped\",[38517]],[[63834,63834],\"mapped\",[35712]],[[63835,63835],\"mapped\",[25295]],[[63836,63836],\"mapped\",[27138]],[[63837,63837],\"mapped\",[35582]],[[63838,63838],\"mapped\",[20025]],[[63839,63839],\"mapped\",[23527]],[[63840,63840],\"mapped\",[24594]],[[63841,63841],\"mapped\",[29575]],[[63842,63842],\"mapped\",[30064]],[[63843,63843],\"mapped\",[21271]],[[63844,63844],\"mapped\",[30971]],[[63845,63845],\"mapped\",[20415]],[[63846,63846],\"mapped\",[24489]],[[63847,63847],\"mapped\",[19981]],[[63848,63848],\"mapped\",[27852]],[[63849,63849],\"mapped\",[25976]],[[63850,63850],\"mapped\",[32034]],[[63851,63851],\"mapped\",[21443]],[[63852,63852],\"mapped\",[22622]],[[63853,63853],\"mapped\",[30465]],[[63854,63854],\"mapped\",[33865]],[[63855,63855],\"mapped\",[35498]],[[63856,63856],\"mapped\",[27578]],[[63857,63857],\"mapped\",[36784]],[[63858,63858],\"mapped\",[27784]],[[63859,63859],\"mapped\",[25342]],[[63860,63860],\"mapped\",[33509]],[[63861,63861],\"mapped\",[25504]],[[63862,63862],\"mapped\",[30053]],[[63863,63863],\"mapped\",[20142]],[[63864,63864],\"mapped\",[20841]],[[63865,63865],\"mapped\",[20937]],[[63866,63866],\"mapped\",[26753]],[[63867,63867],\"mapped\",[31975]],[[63868,63868],\"mapped\",[33391]],[[63869,63869],\"mapped\",[35538]],[[63870,63870],\"mapped\",[37327]],[[63871,63871],\"mapped\",[21237]],[[63872,63872],\"mapped\",[21570]],[[63873,63873],\"mapped\",[22899]],[[63874,63874],\"mapped\",[24300]],[[63875,63875],\"mapped\",[26053]],[[63876,63876],\"mapped\",[28670]],[[63877,63877],\"mapped\",[31018]],[[63878,63878],\"mapped\",[38317]],[[63879,63879],\"mapped\",[39530]],[[63880,63880],\"mapped\",[40599]],[[63881,63881],\"mapped\",[40654]],[[63882,63882],\"mapped\",[21147]],[[63883,63883],\"mapped\",[26310]],[[63884,63884],\"mapped\",[27511]],[[63885,63885],\"mapped\",[36706]],[[63886,63886],\"mapped\",[24180]],[[63887,63887],\"mapped\",[24976]],[[63888,63888],\"mapped\",[25088]],[[63889,63889],\"mapped\",[25754]],[[63890,63890],\"mapped\",[28451]],[[63891,63891],\"mapped\",[29001]],[[63892,63892],\"mapped\",[29833]],[[63893,63893],\"mapped\",[31178]],[[63894,63894],\"mapped\",[32244]],[[63895,63895],\"mapped\",[32879]],[[63896,63896],\"mapped\",[36646]],[[63897,63897],\"mapped\",[34030]],[[63898,63898],\"mapped\",[36899]],[[63899,63899],\"mapped\",[37706]],[[63900,63900],\"mapped\",[21015]],[[63901,63901],\"mapped\",[21155]],[[63902,63902],\"mapped\",[21693]],[[63903,63903],\"mapped\",[28872]],[[63904,63904],\"mapped\",[35010]],[[63905,63905],\"mapped\",[35498]],[[63906,63906],\"mapped\",[24265]],[[63907,63907],\"mapped\",[24565]],[[63908,63908],\"mapped\",[25467]],[[63909,63909],\"mapped\",[27566]],[[63910,63910],\"mapped\",[31806]],[[63911,63911],\"mapped\",[29557]],[[63912,63912],\"mapped\",[20196]],[[63913,63913],\"mapped\",[22265]],[[63914,63914],\"mapped\",[23527]],[[63915,63915],\"mapped\",[23994]],[[63916,63916],\"mapped\",[24604]],[[63917,63917],\"mapped\",[29618]],[[63918,63918],\"mapped\",[29801]],[[63919,63919],\"mapped\",[32666]],[[63920,63920],\"mapped\",[32838]],[[63921,63921],\"mapped\",[37428]],[[63922,63922],\"mapped\",[38646]],[[63923,63923],\"mapped\",[38728]],[[63924,63924],\"mapped\",[38936]],[[63925,63925],\"mapped\",[20363]],[[63926,63926],\"mapped\",[31150]],[[63927,63927],\"mapped\",[37300]],[[63928,63928],\"mapped\",[38584]],[[63929,63929],\"mapped\",[24801]],[[63930,63930],\"mapped\",[20102]],[[63931,63931],\"mapped\",[20698]],[[63932,63932],\"mapped\",[23534]],[[63933,63933],\"mapped\",[23615]],[[63934,63934],\"mapped\",[26009]],[[63935,63935],\"mapped\",[27138]],[[63936,63936],\"mapped\",[29134]],[[63937,63937],\"mapped\",[30274]],[[63938,63938],\"mapped\",[34044]],[[63939,63939],\"mapped\",[36988]],[[63940,63940],\"mapped\",[40845]],[[63941,63941],\"mapped\",[26248]],[[63942,63942],\"mapped\",[38446]],[[63943,63943],\"mapped\",[21129]],[[63944,63944],\"mapped\",[26491]],[[63945,63945],\"mapped\",[26611]],[[63946,63946],\"mapped\",[27969]],[[63947,63947],\"mapped\",[28316]],[[63948,63948],\"mapped\",[29705]],[[63949,63949],\"mapped\",[30041]],[[63950,63950],\"mapped\",[30827]],[[63951,63951],\"mapped\",[32016]],[[63952,63952],\"mapped\",[39006]],[[63953,63953],\"mapped\",[20845]],[[63954,63954],\"mapped\",[25134]],[[63955,63955],\"mapped\",[38520]],[[63956,63956],\"mapped\",[20523]],[[63957,63957],\"mapped\",[23833]],[[63958,63958],\"mapped\",[28138]],[[63959,63959],\"mapped\",[36650]],[[63960,63960],\"mapped\",[24459]],[[63961,63961],\"mapped\",[24900]],[[63962,63962],\"mapped\",[26647]],[[63963,63963],\"mapped\",[29575]],[[63964,63964],\"mapped\",[38534]],[[63965,63965],\"mapped\",[21033]],[[63966,63966],\"mapped\",[21519]],[[63967,63967],\"mapped\",[23653]],[[63968,63968],\"mapped\",[26131]],[[63969,63969],\"mapped\",[26446]],[[63970,63970],\"mapped\",[26792]],[[63971,63971],\"mapped\",[27877]],[[63972,63972],\"mapped\",[29702]],[[63973,63973],\"mapped\",[30178]],[[63974,63974],\"mapped\",[32633]],[[63975,63975],\"mapped\",[35023]],[[63976,63976],\"mapped\",[35041]],[[63977,63977],\"mapped\",[37324]],[[63978,63978],\"mapped\",[38626]],[[63979,63979],\"mapped\",[21311]],[[63980,63980],\"mapped\",[28346]],[[63981,63981],\"mapped\",[21533]],[[63982,63982],\"mapped\",[29136]],[[63983,63983],\"mapped\",[29848]],[[63984,63984],\"mapped\",[34298]],[[63985,63985],\"mapped\",[38563]],[[63986,63986],\"mapped\",[40023]],[[63987,63987],\"mapped\",[40607]],[[63988,63988],\"mapped\",[26519]],[[63989,63989],\"mapped\",[28107]],[[63990,63990],\"mapped\",[33256]],[[63991,63991],\"mapped\",[31435]],[[63992,63992],\"mapped\",[31520]],[[63993,63993],\"mapped\",[31890]],[[63994,63994],\"mapped\",[29376]],[[63995,63995],\"mapped\",[28825]],[[63996,63996],\"mapped\",[35672]],[[63997,63997],\"mapped\",[20160]],[[63998,63998],\"mapped\",[33590]],[[63999,63999],\"mapped\",[21050]],[[64000,64000],\"mapped\",[20999]],[[64001,64001],\"mapped\",[24230]],[[64002,64002],\"mapped\",[25299]],[[64003,64003],\"mapped\",[31958]],[[64004,64004],\"mapped\",[23429]],[[64005,64005],\"mapped\",[27934]],[[64006,64006],\"mapped\",[26292]],[[64007,64007],\"mapped\",[36667]],[[64008,64008],\"mapped\",[34892]],[[64009,64009],\"mapped\",[38477]],[[64010,64010],\"mapped\",[35211]],[[64011,64011],\"mapped\",[24275]],[[64012,64012],\"mapped\",[20800]],[[64013,64013],\"mapped\",[21952]],[[64014,64015],\"valid\"],[[64016,64016],\"mapped\",[22618]],[[64017,64017],\"valid\"],[[64018,64018],\"mapped\",[26228]],[[64019,64020],\"valid\"],[[64021,64021],\"mapped\",[20958]],[[64022,64022],\"mapped\",[29482]],[[64023,64023],\"mapped\",[30410]],[[64024,64024],\"mapped\",[31036]],[[64025,64025],\"mapped\",[31070]],[[64026,64026],\"mapped\",[31077]],[[64027,64027],\"mapped\",[31119]],[[64028,64028],\"mapped\",[38742]],[[64029,64029],\"mapped\",[31934]],[[64030,64030],\"mapped\",[32701]],[[64031,64031],\"valid\"],[[64032,64032],\"mapped\",[34322]],[[64033,64033],\"valid\"],[[64034,64034],\"mapped\",[35576]],[[64035,64036],\"valid\"],[[64037,64037],\"mapped\",[36920]],[[64038,64038],\"mapped\",[37117]],[[64039,64041],\"valid\"],[[64042,64042],\"mapped\",[39151]],[[64043,64043],\"mapped\",[39164]],[[64044,64044],\"mapped\",[39208]],[[64045,64045],\"mapped\",[40372]],[[64046,64046],\"mapped\",[37086]],[[64047,64047],\"mapped\",[38583]],[[64048,64048],\"mapped\",[20398]],[[64049,64049],\"mapped\",[20711]],[[64050,64050],\"mapped\",[20813]],[[64051,64051],\"mapped\",[21193]],[[64052,64052],\"mapped\",[21220]],[[64053,64053],\"mapped\",[21329]],[[64054,64054],\"mapped\",[21917]],[[64055,64055],\"mapped\",[22022]],[[64056,64056],\"mapped\",[22120]],[[64057,64057],\"mapped\",[22592]],[[64058,64058],\"mapped\",[22696]],[[64059,64059],\"mapped\",[23652]],[[64060,64060],\"mapped\",[23662]],[[64061,64061],\"mapped\",[24724]],[[64062,64062],\"mapped\",[24936]],[[64063,64063],\"mapped\",[24974]],[[64064,64064],\"mapped\",[25074]],[[64065,64065],\"mapped\",[25935]],[[64066,64066],\"mapped\",[26082]],[[64067,64067],\"mapped\",[26257]],[[64068,64068],\"mapped\",[26757]],[[64069,64069],\"mapped\",[28023]],[[64070,64070],\"mapped\",[28186]],[[64071,64071],\"mapped\",[28450]],[[64072,64072],\"mapped\",[29038]],[[64073,64073],\"mapped\",[29227]],[[64074,64074],\"mapped\",[29730]],[[64075,64075],\"mapped\",[30865]],[[64076,64076],\"mapped\",[31038]],[[64077,64077],\"mapped\",[31049]],[[64078,64078],\"mapped\",[31048]],[[64079,64079],\"mapped\",[31056]],[[64080,64080],\"mapped\",[31062]],[[64081,64081],\"mapped\",[31069]],[[64082,64082],\"mapped\",[31117]],[[64083,64083],\"mapped\",[31118]],[[64084,64084],\"mapped\",[31296]],[[64085,64085],\"mapped\",[31361]],[[64086,64086],\"mapped\",[31680]],[[64087,64087],\"mapped\",[32244]],[[64088,64088],\"mapped\",[32265]],[[64089,64089],\"mapped\",[32321]],[[64090,64090],\"mapped\",[32626]],[[64091,64091],\"mapped\",[32773]],[[64092,64092],\"mapped\",[33261]],[[64093,64094],\"mapped\",[33401]],[[64095,64095],\"mapped\",[33879]],[[64096,64096],\"mapped\",[35088]],[[64097,64097],\"mapped\",[35222]],[[64098,64098],\"mapped\",[35585]],[[64099,64099],\"mapped\",[35641]],[[64100,64100],\"mapped\",[36051]],[[64101,64101],\"mapped\",[36104]],[[64102,64102],\"mapped\",[36790]],[[64103,64103],\"mapped\",[36920]],[[64104,64104],\"mapped\",[38627]],[[64105,64105],\"mapped\",[38911]],[[64106,64106],\"mapped\",[38971]],[[64107,64107],\"mapped\",[24693]],[[64108,64108],\"mapped\",[148206]],[[64109,64109],\"mapped\",[33304]],[[64110,64111],\"disallowed\"],[[64112,64112],\"mapped\",[20006]],[[64113,64113],\"mapped\",[20917]],[[64114,64114],\"mapped\",[20840]],[[64115,64115],\"mapped\",[20352]],[[64116,64116],\"mapped\",[20805]],[[64117,64117],\"mapped\",[20864]],[[64118,64118],\"mapped\",[21191]],[[64119,64119],\"mapped\",[21242]],[[64120,64120],\"mapped\",[21917]],[[64121,64121],\"mapped\",[21845]],[[64122,64122],\"mapped\",[21913]],[[64123,64123],\"mapped\",[21986]],[[64124,64124],\"mapped\",[22618]],[[64125,64125],\"mapped\",[22707]],[[64126,64126],\"mapped\",[22852]],[[64127,64127],\"mapped\",[22868]],[[64128,64128],\"mapped\",[23138]],[[64129,64129],\"mapped\",[23336]],[[64130,64130],\"mapped\",[24274]],[[64131,64131],\"mapped\",[24281]],[[64132,64132],\"mapped\",[24425]],[[64133,64133],\"mapped\",[24493]],[[64134,64134],\"mapped\",[24792]],[[64135,64135],\"mapped\",[24910]],[[64136,64136],\"mapped\",[24840]],[[64137,64137],\"mapped\",[24974]],[[64138,64138],\"mapped\",[24928]],[[64139,64139],\"mapped\",[25074]],[[64140,64140],\"mapped\",[25140]],[[64141,64141],\"mapped\",[25540]],[[64142,64142],\"mapped\",[25628]],[[64143,64143],\"mapped\",[25682]],[[64144,64144],\"mapped\",[25942]],[[64145,64145],\"mapped\",[26228]],[[64146,64146],\"mapped\",[26391]],[[64147,64147],\"mapped\",[26395]],[[64148,64148],\"mapped\",[26454]],[[64149,64149],\"mapped\",[27513]],[[64150,64150],\"mapped\",[27578]],[[64151,64151],\"mapped\",[27969]],[[64152,64152],\"mapped\",[28379]],[[64153,64153],\"mapped\",[28363]],[[64154,64154],\"mapped\",[28450]],[[64155,64155],\"mapped\",[28702]],[[64156,64156],\"mapped\",[29038]],[[64157,64157],\"mapped\",[30631]],[[64158,64158],\"mapped\",[29237]],[[64159,64159],\"mapped\",[29359]],[[64160,64160],\"mapped\",[29482]],[[64161,64161],\"mapped\",[29809]],[[64162,64162],\"mapped\",[29958]],[[64163,64163],\"mapped\",[30011]],[[64164,64164],\"mapped\",[30237]],[[64165,64165],\"mapped\",[30239]],[[64166,64166],\"mapped\",[30410]],[[64167,64167],\"mapped\",[30427]],[[64168,64168],\"mapped\",[30452]],[[64169,64169],\"mapped\",[30538]],[[64170,64170],\"mapped\",[30528]],[[64171,64171],\"mapped\",[30924]],[[64172,64172],\"mapped\",[31409]],[[64173,64173],\"mapped\",[31680]],[[64174,64174],\"mapped\",[31867]],[[64175,64175],\"mapped\",[32091]],[[64176,64176],\"mapped\",[32244]],[[64177,64177],\"mapped\",[32574]],[[64178,64178],\"mapped\",[32773]],[[64179,64179],\"mapped\",[33618]],[[64180,64180],\"mapped\",[33775]],[[64181,64181],\"mapped\",[34681]],[[64182,64182],\"mapped\",[35137]],[[64183,64183],\"mapped\",[35206]],[[64184,64184],\"mapped\",[35222]],[[64185,64185],\"mapped\",[35519]],[[64186,64186],\"mapped\",[35576]],[[64187,64187],\"mapped\",[35531]],[[64188,64188],\"mapped\",[35585]],[[64189,64189],\"mapped\",[35582]],[[64190,64190],\"mapped\",[35565]],[[64191,64191],\"mapped\",[35641]],[[64192,64192],\"mapped\",[35722]],[[64193,64193],\"mapped\",[36104]],[[64194,64194],\"mapped\",[36664]],[[64195,64195],\"mapped\",[36978]],[[64196,64196],\"mapped\",[37273]],[[64197,64197],\"mapped\",[37494]],[[64198,64198],\"mapped\",[38524]],[[64199,64199],\"mapped\",[38627]],[[64200,64200],\"mapped\",[38742]],[[64201,64201],\"mapped\",[38875]],[[64202,64202],\"mapped\",[38911]],[[64203,64203],\"mapped\",[38923]],[[64204,64204],\"mapped\",[38971]],[[64205,64205],\"mapped\",[39698]],[[64206,64206],\"mapped\",[40860]],[[64207,64207],\"mapped\",[141386]],[[64208,64208],\"mapped\",[141380]],[[64209,64209],\"mapped\",[144341]],[[64210,64210],\"mapped\",[15261]],[[64211,64211],\"mapped\",[16408]],[[64212,64212],\"mapped\",[16441]],[[64213,64213],\"mapped\",[152137]],[[64214,64214],\"mapped\",[154832]],[[64215,64215],\"mapped\",[163539]],[[64216,64216],\"mapped\",[40771]],[[64217,64217],\"mapped\",[40846]],[[64218,64255],\"disallowed\"],[[64256,64256],\"mapped\",[102,102]],[[64257,64257],\"mapped\",[102,105]],[[64258,64258],\"mapped\",[102,108]],[[64259,64259],\"mapped\",[102,102,105]],[[64260,64260],\"mapped\",[102,102,108]],[[64261,64262],\"mapped\",[115,116]],[[64263,64274],\"disallowed\"],[[64275,64275],\"mapped\",[1396,1398]],[[64276,64276],\"mapped\",[1396,1381]],[[64277,64277],\"mapped\",[1396,1387]],[[64278,64278],\"mapped\",[1406,1398]],[[64279,64279],\"mapped\",[1396,1389]],[[64280,64284],\"disallowed\"],[[64285,64285],\"mapped\",[1497,1460]],[[64286,64286],\"valid\"],[[64287,64287],\"mapped\",[1522,1463]],[[64288,64288],\"mapped\",[1506]],[[64289,64289],\"mapped\",[1488]],[[64290,64290],\"mapped\",[1491]],[[64291,64291],\"mapped\",[1492]],[[64292,64292],\"mapped\",[1499]],[[64293,64293],\"mapped\",[1500]],[[64294,64294],\"mapped\",[1501]],[[64295,64295],\"mapped\",[1512]],[[64296,64296],\"mapped\",[1514]],[[64297,64297],\"disallowed_STD3_mapped\",[43]],[[64298,64298],\"mapped\",[1513,1473]],[[64299,64299],\"mapped\",[1513,1474]],[[64300,64300],\"mapped\",[1513,1468,1473]],[[64301,64301],\"mapped\",[1513,1468,1474]],[[64302,64302],\"mapped\",[1488,1463]],[[64303,64303],\"mapped\",[1488,1464]],[[64304,64304],\"mapped\",[1488,1468]],[[64305,64305],\"mapped\",[1489,1468]],[[64306,64306],\"mapped\",[1490,1468]],[[64307,64307],\"mapped\",[1491,1468]],[[64308,64308],\"mapped\",[1492,1468]],[[64309,64309],\"mapped\",[1493,1468]],[[64310,64310],\"mapped\",[1494,1468]],[[64311,64311],\"disallowed\"],[[64312,64312],\"mapped\",[1496,1468]],[[64313,64313],\"mapped\",[1497,1468]],[[64314,64314],\"mapped\",[1498,1468]],[[64315,64315],\"mapped\",[1499,1468]],[[64316,64316],\"mapped\",[1500,1468]],[[64317,64317],\"disallowed\"],[[64318,64318],\"mapped\",[1502,1468]],[[64319,64319],\"disallowed\"],[[64320,64320],\"mapped\",[1504,1468]],[[64321,64321],\"mapped\",[1505,1468]],[[64322,64322],\"disallowed\"],[[64323,64323],\"mapped\",[1507,1468]],[[64324,64324],\"mapped\",[1508,1468]],[[64325,64325],\"disallowed\"],[[64326,64326],\"mapped\",[1510,1468]],[[64327,64327],\"mapped\",[1511,1468]],[[64328,64328],\"mapped\",[1512,1468]],[[64329,64329],\"mapped\",[1513,1468]],[[64330,64330],\"mapped\",[1514,1468]],[[64331,64331],\"mapped\",[1493,1465]],[[64332,64332],\"mapped\",[1489,1471]],[[64333,64333],\"mapped\",[1499,1471]],[[64334,64334],\"mapped\",[1508,1471]],[[64335,64335],\"mapped\",[1488,1500]],[[64336,64337],\"mapped\",[1649]],[[64338,64341],\"mapped\",[1659]],[[64342,64345],\"mapped\",[1662]],[[64346,64349],\"mapped\",[1664]],[[64350,64353],\"mapped\",[1658]],[[64354,64357],\"mapped\",[1663]],[[64358,64361],\"mapped\",[1657]],[[64362,64365],\"mapped\",[1700]],[[64366,64369],\"mapped\",[1702]],[[64370,64373],\"mapped\",[1668]],[[64374,64377],\"mapped\",[1667]],[[64378,64381],\"mapped\",[1670]],[[64382,64385],\"mapped\",[1671]],[[64386,64387],\"mapped\",[1677]],[[64388,64389],\"mapped\",[1676]],[[64390,64391],\"mapped\",[1678]],[[64392,64393],\"mapped\",[1672]],[[64394,64395],\"mapped\",[1688]],[[64396,64397],\"mapped\",[1681]],[[64398,64401],\"mapped\",[1705]],[[64402,64405],\"mapped\",[1711]],[[64406,64409],\"mapped\",[1715]],[[64410,64413],\"mapped\",[1713]],[[64414,64415],\"mapped\",[1722]],[[64416,64419],\"mapped\",[1723]],[[64420,64421],\"mapped\",[1728]],[[64422,64425],\"mapped\",[1729]],[[64426,64429],\"mapped\",[1726]],[[64430,64431],\"mapped\",[1746]],[[64432,64433],\"mapped\",[1747]],[[64434,64449],\"valid\",[],\"NV8\"],[[64450,64466],\"disallowed\"],[[64467,64470],\"mapped\",[1709]],[[64471,64472],\"mapped\",[1735]],[[64473,64474],\"mapped\",[1734]],[[64475,64476],\"mapped\",[1736]],[[64477,64477],\"mapped\",[1735,1652]],[[64478,64479],\"mapped\",[1739]],[[64480,64481],\"mapped\",[1733]],[[64482,64483],\"mapped\",[1737]],[[64484,64487],\"mapped\",[1744]],[[64488,64489],\"mapped\",[1609]],[[64490,64491],\"mapped\",[1574,1575]],[[64492,64493],\"mapped\",[1574,1749]],[[64494,64495],\"mapped\",[1574,1608]],[[64496,64497],\"mapped\",[1574,1735]],[[64498,64499],\"mapped\",[1574,1734]],[[64500,64501],\"mapped\",[1574,1736]],[[64502,64504],\"mapped\",[1574,1744]],[[64505,64507],\"mapped\",[1574,1609]],[[64508,64511],\"mapped\",[1740]],[[64512,64512],\"mapped\",[1574,1580]],[[64513,64513],\"mapped\",[1574,1581]],[[64514,64514],\"mapped\",[1574,1605]],[[64515,64515],\"mapped\",[1574,1609]],[[64516,64516],\"mapped\",[1574,1610]],[[64517,64517],\"mapped\",[1576,1580]],[[64518,64518],\"mapped\",[1576,1581]],[[64519,64519],\"mapped\",[1576,1582]],[[64520,64520],\"mapped\",[1576,1605]],[[64521,64521],\"mapped\",[1576,1609]],[[64522,64522],\"mapped\",[1576,1610]],[[64523,64523],\"mapped\",[1578,1580]],[[64524,64524],\"mapped\",[1578,1581]],[[64525,64525],\"mapped\",[1578,1582]],[[64526,64526],\"mapped\",[1578,1605]],[[64527,64527],\"mapped\",[1578,1609]],[[64528,64528],\"mapped\",[1578,1610]],[[64529,64529],\"mapped\",[1579,1580]],[[64530,64530],\"mapped\",[1579,1605]],[[64531,64531],\"mapped\",[1579,1609]],[[64532,64532],\"mapped\",[1579,1610]],[[64533,64533],\"mapped\",[1580,1581]],[[64534,64534],\"mapped\",[1580,1605]],[[64535,64535],\"mapped\",[1581,1580]],[[64536,64536],\"mapped\",[1581,1605]],[[64537,64537],\"mapped\",[1582,1580]],[[64538,64538],\"mapped\",[1582,1581]],[[64539,64539],\"mapped\",[1582,1605]],[[64540,64540],\"mapped\",[1587,1580]],[[64541,64541],\"mapped\",[1587,1581]],[[64542,64542],\"mapped\",[1587,1582]],[[64543,64543],\"mapped\",[1587,1605]],[[64544,64544],\"mapped\",[1589,1581]],[[64545,64545],\"mapped\",[1589,1605]],[[64546,64546],\"mapped\",[1590,1580]],[[64547,64547],\"mapped\",[1590,1581]],[[64548,64548],\"mapped\",[1590,1582]],[[64549,64549],\"mapped\",[1590,1605]],[[64550,64550],\"mapped\",[1591,1581]],[[64551,64551],\"mapped\",[1591,1605]],[[64552,64552],\"mapped\",[1592,1605]],[[64553,64553],\"mapped\",[1593,1580]],[[64554,64554],\"mapped\",[1593,1605]],[[64555,64555],\"mapped\",[1594,1580]],[[64556,64556],\"mapped\",[1594,1605]],[[64557,64557],\"mapped\",[1601,1580]],[[64558,64558],\"mapped\",[1601,1581]],[[64559,64559],\"mapped\",[1601,1582]],[[64560,64560],\"mapped\",[1601,1605]],[[64561,64561],\"mapped\",[1601,1609]],[[64562,64562],\"mapped\",[1601,1610]],[[64563,64563],\"mapped\",[1602,1581]],[[64564,64564],\"mapped\",[1602,1605]],[[64565,64565],\"mapped\",[1602,1609]],[[64566,64566],\"mapped\",[1602,1610]],[[64567,64567],\"mapped\",[1603,1575]],[[64568,64568],\"mapped\",[1603,1580]],[[64569,64569],\"mapped\",[1603,1581]],[[64570,64570],\"mapped\",[1603,1582]],[[64571,64571],\"mapped\",[1603,1604]],[[64572,64572],\"mapped\",[1603,1605]],[[64573,64573],\"mapped\",[1603,1609]],[[64574,64574],\"mapped\",[1603,1610]],[[64575,64575],\"mapped\",[1604,1580]],[[64576,64576],\"mapped\",[1604,1581]],[[64577,64577],\"mapped\",[1604,1582]],[[64578,64578],\"mapped\",[1604,1605]],[[64579,64579],\"mapped\",[1604,1609]],[[64580,64580],\"mapped\",[1604,1610]],[[64581,64581],\"mapped\",[1605,1580]],[[64582,64582],\"mapped\",[1605,1581]],[[64583,64583],\"mapped\",[1605,1582]],[[64584,64584],\"mapped\",[1605,1605]],[[64585,64585],\"mapped\",[1605,1609]],[[64586,64586],\"mapped\",[1605,1610]],[[64587,64587],\"mapped\",[1606,1580]],[[64588,64588],\"mapped\",[1606,1581]],[[64589,64589],\"mapped\",[1606,1582]],[[64590,64590],\"mapped\",[1606,1605]],[[64591,64591],\"mapped\",[1606,1609]],[[64592,64592],\"mapped\",[1606,1610]],[[64593,64593],\"mapped\",[1607,1580]],[[64594,64594],\"mapped\",[1607,1605]],[[64595,64595],\"mapped\",[1607,1609]],[[64596,64596],\"mapped\",[1607,1610]],[[64597,64597],\"mapped\",[1610,1580]],[[64598,64598],\"mapped\",[1610,1581]],[[64599,64599],\"mapped\",[1610,1582]],[[64600,64600],\"mapped\",[1610,1605]],[[64601,64601],\"mapped\",[1610,1609]],[[64602,64602],\"mapped\",[1610,1610]],[[64603,64603],\"mapped\",[1584,1648]],[[64604,64604],\"mapped\",[1585,1648]],[[64605,64605],\"mapped\",[1609,1648]],[[64606,64606],\"disallowed_STD3_mapped\",[32,1612,1617]],[[64607,64607],\"disallowed_STD3_mapped\",[32,1613,1617]],[[64608,64608],\"disallowed_STD3_mapped\",[32,1614,1617]],[[64609,64609],\"disallowed_STD3_mapped\",[32,1615,1617]],[[64610,64610],\"disallowed_STD3_mapped\",[32,1616,1617]],[[64611,64611],\"disallowed_STD3_mapped\",[32,1617,1648]],[[64612,64612],\"mapped\",[1574,1585]],[[64613,64613],\"mapped\",[1574,1586]],[[64614,64614],\"mapped\",[1574,1605]],[[64615,64615],\"mapped\",[1574,1606]],[[64616,64616],\"mapped\",[1574,1609]],[[64617,64617],\"mapped\",[1574,1610]],[[64618,64618],\"mapped\",[1576,1585]],[[64619,64619],\"mapped\",[1576,1586]],[[64620,64620],\"mapped\",[1576,1605]],[[64621,64621],\"mapped\",[1576,1606]],[[64622,64622],\"mapped\",[1576,1609]],[[64623,64623],\"mapped\",[1576,1610]],[[64624,64624],\"mapped\",[1578,1585]],[[64625,64625],\"mapped\",[1578,1586]],[[64626,64626],\"mapped\",[1578,1605]],[[64627,64627],\"mapped\",[1578,1606]],[[64628,64628],\"mapped\",[1578,1609]],[[64629,64629],\"mapped\",[1578,1610]],[[64630,64630],\"mapped\",[1579,1585]],[[64631,64631],\"mapped\",[1579,1586]],[[64632,64632],\"mapped\",[1579,1605]],[[64633,64633],\"mapped\",[1579,1606]],[[64634,64634],\"mapped\",[1579,1609]],[[64635,64635],\"mapped\",[1579,1610]],[[64636,64636],\"mapped\",[1601,1609]],[[64637,64637],\"mapped\",[1601,1610]],[[64638,64638],\"mapped\",[1602,1609]],[[64639,64639],\"mapped\",[1602,1610]],[[64640,64640],\"mapped\",[1603,1575]],[[64641,64641],\"mapped\",[1603,1604]],[[64642,64642],\"mapped\",[1603,1605]],[[64643,64643],\"mapped\",[1603,1609]],[[64644,64644],\"mapped\",[1603,1610]],[[64645,64645],\"mapped\",[1604,1605]],[[64646,64646],\"mapped\",[1604,1609]],[[64647,64647],\"mapped\",[1604,1610]],[[64648,64648],\"mapped\",[1605,1575]],[[64649,64649],\"mapped\",[1605,1605]],[[64650,64650],\"mapped\",[1606,1585]],[[64651,64651],\"mapped\",[1606,1586]],[[64652,64652],\"mapped\",[1606,1605]],[[64653,64653],\"mapped\",[1606,1606]],[[64654,64654],\"mapped\",[1606,1609]],[[64655,64655],\"mapped\",[1606,1610]],[[64656,64656],\"mapped\",[1609,1648]],[[64657,64657],\"mapped\",[1610,1585]],[[64658,64658],\"mapped\",[1610,1586]],[[64659,64659],\"mapped\",[1610,1605]],[[64660,64660],\"mapped\",[1610,1606]],[[64661,64661],\"mapped\",[1610,1609]],[[64662,64662],\"mapped\",[1610,1610]],[[64663,64663],\"mapped\",[1574,1580]],[[64664,64664],\"mapped\",[1574,1581]],[[64665,64665],\"mapped\",[1574,1582]],[[64666,64666],\"mapped\",[1574,1605]],[[64667,64667],\"mapped\",[1574,1607]],[[64668,64668],\"mapped\",[1576,1580]],[[64669,64669],\"mapped\",[1576,1581]],[[64670,64670],\"mapped\",[1576,1582]],[[64671,64671],\"mapped\",[1576,1605]],[[64672,64672],\"mapped\",[1576,1607]],[[64673,64673],\"mapped\",[1578,1580]],[[64674,64674],\"mapped\",[1578,1581]],[[64675,64675],\"mapped\",[1578,1582]],[[64676,64676],\"mapped\",[1578,1605]],[[64677,64677],\"mapped\",[1578,1607]],[[64678,64678],\"mapped\",[1579,1605]],[[64679,64679],\"mapped\",[1580,1581]],[[64680,64680],\"mapped\",[1580,1605]],[[64681,64681],\"mapped\",[1581,1580]],[[64682,64682],\"mapped\",[1581,1605]],[[64683,64683],\"mapped\",[1582,1580]],[[64684,64684],\"mapped\",[1582,1605]],[[64685,64685],\"mapped\",[1587,1580]],[[64686,64686],\"mapped\",[1587,1581]],[[64687,64687],\"mapped\",[1587,1582]],[[64688,64688],\"mapped\",[1587,1605]],[[64689,64689],\"mapped\",[1589,1581]],[[64690,64690],\"mapped\",[1589,1582]],[[64691,64691],\"mapped\",[1589,1605]],[[64692,64692],\"mapped\",[1590,1580]],[[64693,64693],\"mapped\",[1590,1581]],[[64694,64694],\"mapped\",[1590,1582]],[[64695,64695],\"mapped\",[1590,1605]],[[64696,64696],\"mapped\",[1591,1581]],[[64697,64697],\"mapped\",[1592,1605]],[[64698,64698],\"mapped\",[1593,1580]],[[64699,64699],\"mapped\",[1593,1605]],[[64700,64700],\"mapped\",[1594,1580]],[[64701,64701],\"mapped\",[1594,1605]],[[64702,64702],\"mapped\",[1601,1580]],[[64703,64703],\"mapped\",[1601,1581]],[[64704,64704],\"mapped\",[1601,1582]],[[64705,64705],\"mapped\",[1601,1605]],[[64706,64706],\"mapped\",[1602,1581]],[[64707,64707],\"mapped\",[1602,1605]],[[64708,64708],\"mapped\",[1603,1580]],[[64709,64709],\"mapped\",[1603,1581]],[[64710,64710],\"mapped\",[1603,1582]],[[64711,64711],\"mapped\",[1603,1604]],[[64712,64712],\"mapped\",[1603,1605]],[[64713,64713],\"mapped\",[1604,1580]],[[64714,64714],\"mapped\",[1604,1581]],[[64715,64715],\"mapped\",[1604,1582]],[[64716,64716],\"mapped\",[1604,1605]],[[64717,64717],\"mapped\",[1604,1607]],[[64718,64718],\"mapped\",[1605,1580]],[[64719,64719],\"mapped\",[1605,1581]],[[64720,64720],\"mapped\",[1605,1582]],[[64721,64721],\"mapped\",[1605,1605]],[[64722,64722],\"mapped\",[1606,1580]],[[64723,64723],\"mapped\",[1606,1581]],[[64724,64724],\"mapped\",[1606,1582]],[[64725,64725],\"mapped\",[1606,1605]],[[64726,64726],\"mapped\",[1606,1607]],[[64727,64727],\"mapped\",[1607,1580]],[[64728,64728],\"mapped\",[1607,1605]],[[64729,64729],\"mapped\",[1607,1648]],[[64730,64730],\"mapped\",[1610,1580]],[[64731,64731],\"mapped\",[1610,1581]],[[64732,64732],\"mapped\",[1610,1582]],[[64733,64733],\"mapped\",[1610,1605]],[[64734,64734],\"mapped\",[1610,1607]],[[64735,64735],\"mapped\",[1574,1605]],[[64736,64736],\"mapped\",[1574,1607]],[[64737,64737],\"mapped\",[1576,1605]],[[64738,64738],\"mapped\",[1576,1607]],[[64739,64739],\"mapped\",[1578,1605]],[[64740,64740],\"mapped\",[1578,1607]],[[64741,64741],\"mapped\",[1579,1605]],[[64742,64742],\"mapped\",[1579,1607]],[[64743,64743],\"mapped\",[1587,1605]],[[64744,64744],\"mapped\",[1587,1607]],[[64745,64745],\"mapped\",[1588,1605]],[[64746,64746],\"mapped\",[1588,1607]],[[64747,64747],\"mapped\",[1603,1604]],[[64748,64748],\"mapped\",[1603,1605]],[[64749,64749],\"mapped\",[1604,1605]],[[64750,64750],\"mapped\",[1606,1605]],[[64751,64751],\"mapped\",[1606,1607]],[[64752,64752],\"mapped\",[1610,1605]],[[64753,64753],\"mapped\",[1610,1607]],[[64754,64754],\"mapped\",[1600,1614,1617]],[[64755,64755],\"mapped\",[1600,1615,1617]],[[64756,64756],\"mapped\",[1600,1616,1617]],[[64757,64757],\"mapped\",[1591,1609]],[[64758,64758],\"mapped\",[1591,1610]],[[64759,64759],\"mapped\",[1593,1609]],[[64760,64760],\"mapped\",[1593,1610]],[[64761,64761],\"mapped\",[1594,1609]],[[64762,64762],\"mapped\",[1594,1610]],[[64763,64763],\"mapped\",[1587,1609]],[[64764,64764],\"mapped\",[1587,1610]],[[64765,64765],\"mapped\",[1588,1609]],[[64766,64766],\"mapped\",[1588,1610]],[[64767,64767],\"mapped\",[1581,1609]],[[64768,64768],\"mapped\",[1581,1610]],[[64769,64769],\"mapped\",[1580,1609]],[[64770,64770],\"mapped\",[1580,1610]],[[64771,64771],\"mapped\",[1582,1609]],[[64772,64772],\"mapped\",[1582,1610]],[[64773,64773],\"mapped\",[1589,1609]],[[64774,64774],\"mapped\",[1589,1610]],[[64775,64775],\"mapped\",[1590,1609]],[[64776,64776],\"mapped\",[1590,1610]],[[64777,64777],\"mapped\",[1588,1580]],[[64778,64778],\"mapped\",[1588,1581]],[[64779,64779],\"mapped\",[1588,1582]],[[64780,64780],\"mapped\",[1588,1605]],[[64781,64781],\"mapped\",[1588,1585]],[[64782,64782],\"mapped\",[1587,1585]],[[64783,64783],\"mapped\",[1589,1585]],[[64784,64784],\"mapped\",[1590,1585]],[[64785,64785],\"mapped\",[1591,1609]],[[64786,64786],\"mapped\",[1591,1610]],[[64787,64787],\"mapped\",[1593,1609]],[[64788,64788],\"mapped\",[1593,1610]],[[64789,64789],\"mapped\",[1594,1609]],[[64790,64790],\"mapped\",[1594,1610]],[[64791,64791],\"mapped\",[1587,1609]],[[64792,64792],\"mapped\",[1587,1610]],[[64793,64793],\"mapped\",[1588,1609]],[[64794,64794],\"mapped\",[1588,1610]],[[64795,64795],\"mapped\",[1581,1609]],[[64796,64796],\"mapped\",[1581,1610]],[[64797,64797],\"mapped\",[1580,1609]],[[64798,64798],\"mapped\",[1580,1610]],[[64799,64799],\"mapped\",[1582,1609]],[[64800,64800],\"mapped\",[1582,1610]],[[64801,64801],\"mapped\",[1589,1609]],[[64802,64802],\"mapped\",[1589,1610]],[[64803,64803],\"mapped\",[1590,1609]],[[64804,64804],\"mapped\",[1590,1610]],[[64805,64805],\"mapped\",[1588,1580]],[[64806,64806],\"mapped\",[1588,1581]],[[64807,64807],\"mapped\",[1588,1582]],[[64808,64808],\"mapped\",[1588,1605]],[[64809,64809],\"mapped\",[1588,1585]],[[64810,64810],\"mapped\",[1587,1585]],[[64811,64811],\"mapped\",[1589,1585]],[[64812,64812],\"mapped\",[1590,1585]],[[64813,64813],\"mapped\",[1588,1580]],[[64814,64814],\"mapped\",[1588,1581]],[[64815,64815],\"mapped\",[1588,1582]],[[64816,64816],\"mapped\",[1588,1605]],[[64817,64817],\"mapped\",[1587,1607]],[[64818,64818],\"mapped\",[1588,1607]],[[64819,64819],\"mapped\",[1591,1605]],[[64820,64820],\"mapped\",[1587,1580]],[[64821,64821],\"mapped\",[1587,1581]],[[64822,64822],\"mapped\",[1587,1582]],[[64823,64823],\"mapped\",[1588,1580]],[[64824,64824],\"mapped\",[1588,1581]],[[64825,64825],\"mapped\",[1588,1582]],[[64826,64826],\"mapped\",[1591,1605]],[[64827,64827],\"mapped\",[1592,1605]],[[64828,64829],\"mapped\",[1575,1611]],[[64830,64831],\"valid\",[],\"NV8\"],[[64832,64847],\"disallowed\"],[[64848,64848],\"mapped\",[1578,1580,1605]],[[64849,64850],\"mapped\",[1578,1581,1580]],[[64851,64851],\"mapped\",[1578,1581,1605]],[[64852,64852],\"mapped\",[1578,1582,1605]],[[64853,64853],\"mapped\",[1578,1605,1580]],[[64854,64854],\"mapped\",[1578,1605,1581]],[[64855,64855],\"mapped\",[1578,1605,1582]],[[64856,64857],\"mapped\",[1580,1605,1581]],[[64858,64858],\"mapped\",[1581,1605,1610]],[[64859,64859],\"mapped\",[1581,1605,1609]],[[64860,64860],\"mapped\",[1587,1581,1580]],[[64861,64861],\"mapped\",[1587,1580,1581]],[[64862,64862],\"mapped\",[1587,1580,1609]],[[64863,64864],\"mapped\",[1587,1605,1581]],[[64865,64865],\"mapped\",[1587,1605,1580]],[[64866,64867],\"mapped\",[1587,1605,1605]],[[64868,64869],\"mapped\",[1589,1581,1581]],[[64870,64870],\"mapped\",[1589,1605,1605]],[[64871,64872],\"mapped\",[1588,1581,1605]],[[64873,64873],\"mapped\",[1588,1580,1610]],[[64874,64875],\"mapped\",[1588,1605,1582]],[[64876,64877],\"mapped\",[1588,1605,1605]],[[64878,64878],\"mapped\",[1590,1581,1609]],[[64879,64880],\"mapped\",[1590,1582,1605]],[[64881,64882],\"mapped\",[1591,1605,1581]],[[64883,64883],\"mapped\",[1591,1605,1605]],[[64884,64884],\"mapped\",[1591,1605,1610]],[[64885,64885],\"mapped\",[1593,1580,1605]],[[64886,64887],\"mapped\",[1593,1605,1605]],[[64888,64888],\"mapped\",[1593,1605,1609]],[[64889,64889],\"mapped\",[1594,1605,1605]],[[64890,64890],\"mapped\",[1594,1605,1610]],[[64891,64891],\"mapped\",[1594,1605,1609]],[[64892,64893],\"mapped\",[1601,1582,1605]],[[64894,64894],\"mapped\",[1602,1605,1581]],[[64895,64895],\"mapped\",[1602,1605,1605]],[[64896,64896],\"mapped\",[1604,1581,1605]],[[64897,64897],\"mapped\",[1604,1581,1610]],[[64898,64898],\"mapped\",[1604,1581,1609]],[[64899,64900],\"mapped\",[1604,1580,1580]],[[64901,64902],\"mapped\",[1604,1582,1605]],[[64903,64904],\"mapped\",[1604,1605,1581]],[[64905,64905],\"mapped\",[1605,1581,1580]],[[64906,64906],\"mapped\",[1605,1581,1605]],[[64907,64907],\"mapped\",[1605,1581,1610]],[[64908,64908],\"mapped\",[1605,1580,1581]],[[64909,64909],\"mapped\",[1605,1580,1605]],[[64910,64910],\"mapped\",[1605,1582,1580]],[[64911,64911],\"mapped\",[1605,1582,1605]],[[64912,64913],\"disallowed\"],[[64914,64914],\"mapped\",[1605,1580,1582]],[[64915,64915],\"mapped\",[1607,1605,1580]],[[64916,64916],\"mapped\",[1607,1605,1605]],[[64917,64917],\"mapped\",[1606,1581,1605]],[[64918,64918],\"mapped\",[1606,1581,1609]],[[64919,64920],\"mapped\",[1606,1580,1605]],[[64921,64921],\"mapped\",[1606,1580,1609]],[[64922,64922],\"mapped\",[1606,1605,1610]],[[64923,64923],\"mapped\",[1606,1605,1609]],[[64924,64925],\"mapped\",[1610,1605,1605]],[[64926,64926],\"mapped\",[1576,1582,1610]],[[64927,64927],\"mapped\",[1578,1580,1610]],[[64928,64928],\"mapped\",[1578,1580,1609]],[[64929,64929],\"mapped\",[1578,1582,1610]],[[64930,64930],\"mapped\",[1578,1582,1609]],[[64931,64931],\"mapped\",[1578,1605,1610]],[[64932,64932],\"mapped\",[1578,1605,1609]],[[64933,64933],\"mapped\",[1580,1605,1610]],[[64934,64934],\"mapped\",[1580,1581,1609]],[[64935,64935],\"mapped\",[1580,1605,1609]],[[64936,64936],\"mapped\",[1587,1582,1609]],[[64937,64937],\"mapped\",[1589,1581,1610]],[[64938,64938],\"mapped\",[1588,1581,1610]],[[64939,64939],\"mapped\",[1590,1581,1610]],[[64940,64940],\"mapped\",[1604,1580,1610]],[[64941,64941],\"mapped\",[1604,1605,1610]],[[64942,64942],\"mapped\",[1610,1581,1610]],[[64943,64943],\"mapped\",[1610,1580,1610]],[[64944,64944],\"mapped\",[1610,1605,1610]],[[64945,64945],\"mapped\",[1605,1605,1610]],[[64946,64946],\"mapped\",[1602,1605,1610]],[[64947,64947],\"mapped\",[1606,1581,1610]],[[64948,64948],\"mapped\",[1602,1605,1581]],[[64949,64949],\"mapped\",[1604,1581,1605]],[[64950,64950],\"mapped\",[1593,1605,1610]],[[64951,64951],\"mapped\",[1603,1605,1610]],[[64952,64952],\"mapped\",[1606,1580,1581]],[[64953,64953],\"mapped\",[1605,1582,1610]],[[64954,64954],\"mapped\",[1604,1580,1605]],[[64955,64955],\"mapped\",[1603,1605,1605]],[[64956,64956],\"mapped\",[1604,1580,1605]],[[64957,64957],\"mapped\",[1606,1580,1581]],[[64958,64958],\"mapped\",[1580,1581,1610]],[[64959,64959],\"mapped\",[1581,1580,1610]],[[64960,64960],\"mapped\",[1605,1580,1610]],[[64961,64961],\"mapped\",[1601,1605,1610]],[[64962,64962],\"mapped\",[1576,1581,1610]],[[64963,64963],\"mapped\",[1603,1605,1605]],[[64964,64964],\"mapped\",[1593,1580,1605]],[[64965,64965],\"mapped\",[1589,1605,1605]],[[64966,64966],\"mapped\",[1587,1582,1610]],[[64967,64967],\"mapped\",[1606,1580,1610]],[[64968,64975],\"disallowed\"],[[64976,65007],\"disallowed\"],[[65008,65008],\"mapped\",[1589,1604,1746]],[[65009,65009],\"mapped\",[1602,1604,1746]],[[65010,65010],\"mapped\",[1575,1604,1604,1607]],[[65011,65011],\"mapped\",[1575,1603,1576,1585]],[[65012,65012],\"mapped\",[1605,1581,1605,1583]],[[65013,65013],\"mapped\",[1589,1604,1593,1605]],[[65014,65014],\"mapped\",[1585,1587,1608,1604]],[[65015,65015],\"mapped\",[1593,1604,1610,1607]],[[65016,65016],\"mapped\",[1608,1587,1604,1605]],[[65017,65017],\"mapped\",[1589,1604,1609]],[[65018,65018],\"disallowed_STD3_mapped\",[1589,1604,1609,32,1575,1604,1604,1607,32,1593,1604,1610,1607,32,1608,1587,1604,1605]],[[65019,65019],\"disallowed_STD3_mapped\",[1580,1604,32,1580,1604,1575,1604,1607]],[[65020,65020],\"mapped\",[1585,1740,1575,1604]],[[65021,65021],\"valid\",[],\"NV8\"],[[65022,65023],\"disallowed\"],[[65024,65039],\"ignored\"],[[65040,65040],\"disallowed_STD3_mapped\",[44]],[[65041,65041],\"mapped\",[12289]],[[65042,65042],\"disallowed\"],[[65043,65043],\"disallowed_STD3_mapped\",[58]],[[65044,65044],\"disallowed_STD3_mapped\",[59]],[[65045,65045],\"disallowed_STD3_mapped\",[33]],[[65046,65046],\"disallowed_STD3_mapped\",[63]],[[65047,65047],\"mapped\",[12310]],[[65048,65048],\"mapped\",[12311]],[[65049,65049],\"disallowed\"],[[65050,65055],\"disallowed\"],[[65056,65059],\"valid\"],[[65060,65062],\"valid\"],[[65063,65069],\"valid\"],[[65070,65071],\"valid\"],[[65072,65072],\"disallowed\"],[[65073,65073],\"mapped\",[8212]],[[65074,65074],\"mapped\",[8211]],[[65075,65076],\"disallowed_STD3_mapped\",[95]],[[65077,65077],\"disallowed_STD3_mapped\",[40]],[[65078,65078],\"disallowed_STD3_mapped\",[41]],[[65079,65079],\"disallowed_STD3_mapped\",[123]],[[65080,65080],\"disallowed_STD3_mapped\",[125]],[[65081,65081],\"mapped\",[12308]],[[65082,65082],\"mapped\",[12309]],[[65083,65083],\"mapped\",[12304]],[[65084,65084],\"mapped\",[12305]],[[65085,65085],\"mapped\",[12298]],[[65086,65086],\"mapped\",[12299]],[[65087,65087],\"mapped\",[12296]],[[65088,65088],\"mapped\",[12297]],[[65089,65089],\"mapped\",[12300]],[[65090,65090],\"mapped\",[12301]],[[65091,65091],\"mapped\",[12302]],[[65092,65092],\"mapped\",[12303]],[[65093,65094],\"valid\",[],\"NV8\"],[[65095,65095],\"disallowed_STD3_mapped\",[91]],[[65096,65096],\"disallowed_STD3_mapped\",[93]],[[65097,65100],\"disallowed_STD3_mapped\",[32,773]],[[65101,65103],\"disallowed_STD3_mapped\",[95]],[[65104,65104],\"disallowed_STD3_mapped\",[44]],[[65105,65105],\"mapped\",[12289]],[[65106,65106],\"disallowed\"],[[65107,65107],\"disallowed\"],[[65108,65108],\"disallowed_STD3_mapped\",[59]],[[65109,65109],\"disallowed_STD3_mapped\",[58]],[[65110,65110],\"disallowed_STD3_mapped\",[63]],[[65111,65111],\"disallowed_STD3_mapped\",[33]],[[65112,65112],\"mapped\",[8212]],[[65113,65113],\"disallowed_STD3_mapped\",[40]],[[65114,65114],\"disallowed_STD3_mapped\",[41]],[[65115,65115],\"disallowed_STD3_mapped\",[123]],[[65116,65116],\"disallowed_STD3_mapped\",[125]],[[65117,65117],\"mapped\",[12308]],[[65118,65118],\"mapped\",[12309]],[[65119,65119],\"disallowed_STD3_mapped\",[35]],[[65120,65120],\"disallowed_STD3_mapped\",[38]],[[65121,65121],\"disallowed_STD3_mapped\",[42]],[[65122,65122],\"disallowed_STD3_mapped\",[43]],[[65123,65123],\"mapped\",[45]],[[65124,65124],\"disallowed_STD3_mapped\",[60]],[[65125,65125],\"disallowed_STD3_mapped\",[62]],[[65126,65126],\"disallowed_STD3_mapped\",[61]],[[65127,65127],\"disallowed\"],[[65128,65128],\"disallowed_STD3_mapped\",[92]],[[65129,65129],\"disallowed_STD3_mapped\",[36]],[[65130,65130],\"disallowed_STD3_mapped\",[37]],[[65131,65131],\"disallowed_STD3_mapped\",[64]],[[65132,65135],\"disallowed\"],[[65136,65136],\"disallowed_STD3_mapped\",[32,1611]],[[65137,65137],\"mapped\",[1600,1611]],[[65138,65138],\"disallowed_STD3_mapped\",[32,1612]],[[65139,65139],\"valid\"],[[65140,65140],\"disallowed_STD3_mapped\",[32,1613]],[[65141,65141],\"disallowed\"],[[65142,65142],\"disallowed_STD3_mapped\",[32,1614]],[[65143,65143],\"mapped\",[1600,1614]],[[65144,65144],\"disallowed_STD3_mapped\",[32,1615]],[[65145,65145],\"mapped\",[1600,1615]],[[65146,65146],\"disallowed_STD3_mapped\",[32,1616]],[[65147,65147],\"mapped\",[1600,1616]],[[65148,65148],\"disallowed_STD3_mapped\",[32,1617]],[[65149,65149],\"mapped\",[1600,1617]],[[65150,65150],\"disallowed_STD3_mapped\",[32,1618]],[[65151,65151],\"mapped\",[1600,1618]],[[65152,65152],\"mapped\",[1569]],[[65153,65154],\"mapped\",[1570]],[[65155,65156],\"mapped\",[1571]],[[65157,65158],\"mapped\",[1572]],[[65159,65160],\"mapped\",[1573]],[[65161,65164],\"mapped\",[1574]],[[65165,65166],\"mapped\",[1575]],[[65167,65170],\"mapped\",[1576]],[[65171,65172],\"mapped\",[1577]],[[65173,65176],\"mapped\",[1578]],[[65177,65180],\"mapped\",[1579]],[[65181,65184],\"mapped\",[1580]],[[65185,65188],\"mapped\",[1581]],[[65189,65192],\"mapped\",[1582]],[[65193,65194],\"mapped\",[1583]],[[65195,65196],\"mapped\",[1584]],[[65197,65198],\"mapped\",[1585]],[[65199,65200],\"mapped\",[1586]],[[65201,65204],\"mapped\",[1587]],[[65205,65208],\"mapped\",[1588]],[[65209,65212],\"mapped\",[1589]],[[65213,65216],\"mapped\",[1590]],[[65217,65220],\"mapped\",[1591]],[[65221,65224],\"mapped\",[1592]],[[65225,65228],\"mapped\",[1593]],[[65229,65232],\"mapped\",[1594]],[[65233,65236],\"mapped\",[1601]],[[65237,65240],\"mapped\",[1602]],[[65241,65244],\"mapped\",[1603]],[[65245,65248],\"mapped\",[1604]],[[65249,65252],\"mapped\",[1605]],[[65253,65256],\"mapped\",[1606]],[[65257,65260],\"mapped\",[1607]],[[65261,65262],\"mapped\",[1608]],[[65263,65264],\"mapped\",[1609]],[[65265,65268],\"mapped\",[1610]],[[65269,65270],\"mapped\",[1604,1570]],[[65271,65272],\"mapped\",[1604,1571]],[[65273,65274],\"mapped\",[1604,1573]],[[65275,65276],\"mapped\",[1604,1575]],[[65277,65278],\"disallowed\"],[[65279,65279],\"ignored\"],[[65280,65280],\"disallowed\"],[[65281,65281],\"disallowed_STD3_mapped\",[33]],[[65282,65282],\"disallowed_STD3_mapped\",[34]],[[65283,65283],\"disallowed_STD3_mapped\",[35]],[[65284,65284],\"disallowed_STD3_mapped\",[36]],[[65285,65285],\"disallowed_STD3_mapped\",[37]],[[65286,65286],\"disallowed_STD3_mapped\",[38]],[[65287,65287],\"disallowed_STD3_mapped\",[39]],[[65288,65288],\"disallowed_STD3_mapped\",[40]],[[65289,65289],\"disallowed_STD3_mapped\",[41]],[[65290,65290],\"disallowed_STD3_mapped\",[42]],[[65291,65291],\"disallowed_STD3_mapped\",[43]],[[65292,65292],\"disallowed_STD3_mapped\",[44]],[[65293,65293],\"mapped\",[45]],[[65294,65294],\"mapped\",[46]],[[65295,65295],\"disallowed_STD3_mapped\",[47]],[[65296,65296],\"mapped\",[48]],[[65297,65297],\"mapped\",[49]],[[65298,65298],\"mapped\",[50]],[[65299,65299],\"mapped\",[51]],[[65300,65300],\"mapped\",[52]],[[65301,65301],\"mapped\",[53]],[[65302,65302],\"mapped\",[54]],[[65303,65303],\"mapped\",[55]],[[65304,65304],\"mapped\",[56]],[[65305,65305],\"mapped\",[57]],[[65306,65306],\"disallowed_STD3_mapped\",[58]],[[65307,65307],\"disallowed_STD3_mapped\",[59]],[[65308,65308],\"disallowed_STD3_mapped\",[60]],[[65309,65309],\"disallowed_STD3_mapped\",[61]],[[65310,65310],\"disallowed_STD3_mapped\",[62]],[[65311,65311],\"disallowed_STD3_mapped\",[63]],[[65312,65312],\"disallowed_STD3_mapped\",[64]],[[65313,65313],\"mapped\",[97]],[[65314,65314],\"mapped\",[98]],[[65315,65315],\"mapped\",[99]],[[65316,65316],\"mapped\",[100]],[[65317,65317],\"mapped\",[101]],[[65318,65318],\"mapped\",[102]],[[65319,65319],\"mapped\",[103]],[[65320,65320],\"mapped\",[104]],[[65321,65321],\"mapped\",[105]],[[65322,65322],\"mapped\",[106]],[[65323,65323],\"mapped\",[107]],[[65324,65324],\"mapped\",[108]],[[65325,65325],\"mapped\",[109]],[[65326,65326],\"mapped\",[110]],[[65327,65327],\"mapped\",[111]],[[65328,65328],\"mapped\",[112]],[[65329,65329],\"mapped\",[113]],[[65330,65330],\"mapped\",[114]],[[65331,65331],\"mapped\",[115]],[[65332,65332],\"mapped\",[116]],[[65333,65333],\"mapped\",[117]],[[65334,65334],\"mapped\",[118]],[[65335,65335],\"mapped\",[119]],[[65336,65336],\"mapped\",[120]],[[65337,65337],\"mapped\",[121]],[[65338,65338],\"mapped\",[122]],[[65339,65339],\"disallowed_STD3_mapped\",[91]],[[65340,65340],\"disallowed_STD3_mapped\",[92]],[[65341,65341],\"disallowed_STD3_mapped\",[93]],[[65342,65342],\"disallowed_STD3_mapped\",[94]],[[65343,65343],\"disallowed_STD3_mapped\",[95]],[[65344,65344],\"disallowed_STD3_mapped\",[96]],[[65345,65345],\"mapped\",[97]],[[65346,65346],\"mapped\",[98]],[[65347,65347],\"mapped\",[99]],[[65348,65348],\"mapped\",[100]],[[65349,65349],\"mapped\",[101]],[[65350,65350],\"mapped\",[102]],[[65351,65351],\"mapped\",[103]],[[65352,65352],\"mapped\",[104]],[[65353,65353],\"mapped\",[105]],[[65354,65354],\"mapped\",[106]],[[65355,65355],\"mapped\",[107]],[[65356,65356],\"mapped\",[108]],[[65357,65357],\"mapped\",[109]],[[65358,65358],\"mapped\",[110]],[[65359,65359],\"mapped\",[111]],[[65360,65360],\"mapped\",[112]],[[65361,65361],\"mapped\",[113]],[[65362,65362],\"mapped\",[114]],[[65363,65363],\"mapped\",[115]],[[65364,65364],\"mapped\",[116]],[[65365,65365],\"mapped\",[117]],[[65366,65366],\"mapped\",[118]],[[65367,65367],\"mapped\",[119]],[[65368,65368],\"mapped\",[120]],[[65369,65369],\"mapped\",[121]],[[65370,65370],\"mapped\",[122]],[[65371,65371],\"disallowed_STD3_mapped\",[123]],[[65372,65372],\"disallowed_STD3_mapped\",[124]],[[65373,65373],\"disallowed_STD3_mapped\",[125]],[[65374,65374],\"disallowed_STD3_mapped\",[126]],[[65375,65375],\"mapped\",[10629]],[[65376,65376],\"mapped\",[10630]],[[65377,65377],\"mapped\",[46]],[[65378,65378],\"mapped\",[12300]],[[65379,65379],\"mapped\",[12301]],[[65380,65380],\"mapped\",[12289]],[[65381,65381],\"mapped\",[12539]],[[65382,65382],\"mapped\",[12530]],[[65383,65383],\"mapped\",[12449]],[[65384,65384],\"mapped\",[12451]],[[65385,65385],\"mapped\",[12453]],[[65386,65386],\"mapped\",[12455]],[[65387,65387],\"mapped\",[12457]],[[65388,65388],\"mapped\",[12515]],[[65389,65389],\"mapped\",[12517]],[[65390,65390],\"mapped\",[12519]],[[65391,65391],\"mapped\",[12483]],[[65392,65392],\"mapped\",[12540]],[[65393,65393],\"mapped\",[12450]],[[65394,65394],\"mapped\",[12452]],[[65395,65395],\"mapped\",[12454]],[[65396,65396],\"mapped\",[12456]],[[65397,65397],\"mapped\",[12458]],[[65398,65398],\"mapped\",[12459]],[[65399,65399],\"mapped\",[12461]],[[65400,65400],\"mapped\",[12463]],[[65401,65401],\"mapped\",[12465]],[[65402,65402],\"mapped\",[12467]],[[65403,65403],\"mapped\",[12469]],[[65404,65404],\"mapped\",[12471]],[[65405,65405],\"mapped\",[12473]],[[65406,65406],\"mapped\",[12475]],[[65407,65407],\"mapped\",[12477]],[[65408,65408],\"mapped\",[12479]],[[65409,65409],\"mapped\",[12481]],[[65410,65410],\"mapped\",[12484]],[[65411,65411],\"mapped\",[12486]],[[65412,65412],\"mapped\",[12488]],[[65413,65413],\"mapped\",[12490]],[[65414,65414],\"mapped\",[12491]],[[65415,65415],\"mapped\",[12492]],[[65416,65416],\"mapped\",[12493]],[[65417,65417],\"mapped\",[12494]],[[65418,65418],\"mapped\",[12495]],[[65419,65419],\"mapped\",[12498]],[[65420,65420],\"mapped\",[12501]],[[65421,65421],\"mapped\",[12504]],[[65422,65422],\"mapped\",[12507]],[[65423,65423],\"mapped\",[12510]],[[65424,65424],\"mapped\",[12511]],[[65425,65425],\"mapped\",[12512]],[[65426,65426],\"mapped\",[12513]],[[65427,65427],\"mapped\",[12514]],[[65428,65428],\"mapped\",[12516]],[[65429,65429],\"mapped\",[12518]],[[65430,65430],\"mapped\",[12520]],[[65431,65431],\"mapped\",[12521]],[[65432,65432],\"mapped\",[12522]],[[65433,65433],\"mapped\",[12523]],[[65434,65434],\"mapped\",[12524]],[[65435,65435],\"mapped\",[12525]],[[65436,65436],\"mapped\",[12527]],[[65437,65437],\"mapped\",[12531]],[[65438,65438],\"mapped\",[12441]],[[65439,65439],\"mapped\",[12442]],[[65440,65440],\"disallowed\"],[[65441,65441],\"mapped\",[4352]],[[65442,65442],\"mapped\",[4353]],[[65443,65443],\"mapped\",[4522]],[[65444,65444],\"mapped\",[4354]],[[65445,65445],\"mapped\",[4524]],[[65446,65446],\"mapped\",[4525]],[[65447,65447],\"mapped\",[4355]],[[65448,65448],\"mapped\",[4356]],[[65449,65449],\"mapped\",[4357]],[[65450,65450],\"mapped\",[4528]],[[65451,65451],\"mapped\",[4529]],[[65452,65452],\"mapped\",[4530]],[[65453,65453],\"mapped\",[4531]],[[65454,65454],\"mapped\",[4532]],[[65455,65455],\"mapped\",[4533]],[[65456,65456],\"mapped\",[4378]],[[65457,65457],\"mapped\",[4358]],[[65458,65458],\"mapped\",[4359]],[[65459,65459],\"mapped\",[4360]],[[65460,65460],\"mapped\",[4385]],[[65461,65461],\"mapped\",[4361]],[[65462,65462],\"mapped\",[4362]],[[65463,65463],\"mapped\",[4363]],[[65464,65464],\"mapped\",[4364]],[[65465,65465],\"mapped\",[4365]],[[65466,65466],\"mapped\",[4366]],[[65467,65467],\"mapped\",[4367]],[[65468,65468],\"mapped\",[4368]],[[65469,65469],\"mapped\",[4369]],[[65470,65470],\"mapped\",[4370]],[[65471,65473],\"disallowed\"],[[65474,65474],\"mapped\",[4449]],[[65475,65475],\"mapped\",[4450]],[[65476,65476],\"mapped\",[4451]],[[65477,65477],\"mapped\",[4452]],[[65478,65478],\"mapped\",[4453]],[[65479,65479],\"mapped\",[4454]],[[65480,65481],\"disallowed\"],[[65482,65482],\"mapped\",[4455]],[[65483,65483],\"mapped\",[4456]],[[65484,65484],\"mapped\",[4457]],[[65485,65485],\"mapped\",[4458]],[[65486,65486],\"mapped\",[4459]],[[65487,65487],\"mapped\",[4460]],[[65488,65489],\"disallowed\"],[[65490,65490],\"mapped\",[4461]],[[65491,65491],\"mapped\",[4462]],[[65492,65492],\"mapped\",[4463]],[[65493,65493],\"mapped\",[4464]],[[65494,65494],\"mapped\",[4465]],[[65495,65495],\"mapped\",[4466]],[[65496,65497],\"disallowed\"],[[65498,65498],\"mapped\",[4467]],[[65499,65499],\"mapped\",[4468]],[[65500,65500],\"mapped\",[4469]],[[65501,65503],\"disallowed\"],[[65504,65504],\"mapped\",[162]],[[65505,65505],\"mapped\",[163]],[[65506,65506],\"mapped\",[172]],[[65507,65507],\"disallowed_STD3_mapped\",[32,772]],[[65508,65508],\"mapped\",[166]],[[65509,65509],\"mapped\",[165]],[[65510,65510],\"mapped\",[8361]],[[65511,65511],\"disallowed\"],[[65512,65512],\"mapped\",[9474]],[[65513,65513],\"mapped\",[8592]],[[65514,65514],\"mapped\",[8593]],[[65515,65515],\"mapped\",[8594]],[[65516,65516],\"mapped\",[8595]],[[65517,65517],\"mapped\",[9632]],[[65518,65518],\"mapped\",[9675]],[[65519,65528],\"disallowed\"],[[65529,65531],\"disallowed\"],[[65532,65532],\"disallowed\"],[[65533,65533],\"disallowed\"],[[65534,65535],\"disallowed\"],[[65536,65547],\"valid\"],[[65548,65548],\"disallowed\"],[[65549,65574],\"valid\"],[[65575,65575],\"disallowed\"],[[65576,65594],\"valid\"],[[65595,65595],\"disallowed\"],[[65596,65597],\"valid\"],[[65598,65598],\"disallowed\"],[[65599,65613],\"valid\"],[[65614,65615],\"disallowed\"],[[65616,65629],\"valid\"],[[65630,65663],\"disallowed\"],[[65664,65786],\"valid\"],[[65787,65791],\"disallowed\"],[[65792,65794],\"valid\",[],\"NV8\"],[[65795,65798],\"disallowed\"],[[65799,65843],\"valid\",[],\"NV8\"],[[65844,65846],\"disallowed\"],[[65847,65855],\"valid\",[],\"NV8\"],[[65856,65930],\"valid\",[],\"NV8\"],[[65931,65932],\"valid\",[],\"NV8\"],[[65933,65935],\"disallowed\"],[[65936,65947],\"valid\",[],\"NV8\"],[[65948,65951],\"disallowed\"],[[65952,65952],\"valid\",[],\"NV8\"],[[65953,65999],\"disallowed\"],[[66000,66044],\"valid\",[],\"NV8\"],[[66045,66045],\"valid\"],[[66046,66175],\"disallowed\"],[[66176,66204],\"valid\"],[[66205,66207],\"disallowed\"],[[66208,66256],\"valid\"],[[66257,66271],\"disallowed\"],[[66272,66272],\"valid\"],[[66273,66299],\"valid\",[],\"NV8\"],[[66300,66303],\"disallowed\"],[[66304,66334],\"valid\"],[[66335,66335],\"valid\"],[[66336,66339],\"valid\",[],\"NV8\"],[[66340,66351],\"disallowed\"],[[66352,66368],\"valid\"],[[66369,66369],\"valid\",[],\"NV8\"],[[66370,66377],\"valid\"],[[66378,66378],\"valid\",[],\"NV8\"],[[66379,66383],\"disallowed\"],[[66384,66426],\"valid\"],[[66427,66431],\"disallowed\"],[[66432,66461],\"valid\"],[[66462,66462],\"disallowed\"],[[66463,66463],\"valid\",[],\"NV8\"],[[66464,66499],\"valid\"],[[66500,66503],\"disallowed\"],[[66504,66511],\"valid\"],[[66512,66517],\"valid\",[],\"NV8\"],[[66518,66559],\"disallowed\"],[[66560,66560],\"mapped\",[66600]],[[66561,66561],\"mapped\",[66601]],[[66562,66562],\"mapped\",[66602]],[[66563,66563],\"mapped\",[66603]],[[66564,66564],\"mapped\",[66604]],[[66565,66565],\"mapped\",[66605]],[[66566,66566],\"mapped\",[66606]],[[66567,66567],\"mapped\",[66607]],[[66568,66568],\"mapped\",[66608]],[[66569,66569],\"mapped\",[66609]],[[66570,66570],\"mapped\",[66610]],[[66571,66571],\"mapped\",[66611]],[[66572,66572],\"mapped\",[66612]],[[66573,66573],\"mapped\",[66613]],[[66574,66574],\"mapped\",[66614]],[[66575,66575],\"mapped\",[66615]],[[66576,66576],\"mapped\",[66616]],[[66577,66577],\"mapped\",[66617]],[[66578,66578],\"mapped\",[66618]],[[66579,66579],\"mapped\",[66619]],[[66580,66580],\"mapped\",[66620]],[[66581,66581],\"mapped\",[66621]],[[66582,66582],\"mapped\",[66622]],[[66583,66583],\"mapped\",[66623]],[[66584,66584],\"mapped\",[66624]],[[66585,66585],\"mapped\",[66625]],[[66586,66586],\"mapped\",[66626]],[[66587,66587],\"mapped\",[66627]],[[66588,66588],\"mapped\",[66628]],[[66589,66589],\"mapped\",[66629]],[[66590,66590],\"mapped\",[66630]],[[66591,66591],\"mapped\",[66631]],[[66592,66592],\"mapped\",[66632]],[[66593,66593],\"mapped\",[66633]],[[66594,66594],\"mapped\",[66634]],[[66595,66595],\"mapped\",[66635]],[[66596,66596],\"mapped\",[66636]],[[66597,66597],\"mapped\",[66637]],[[66598,66598],\"mapped\",[66638]],[[66599,66599],\"mapped\",[66639]],[[66600,66637],\"valid\"],[[66638,66717],\"valid\"],[[66718,66719],\"disallowed\"],[[66720,66729],\"valid\"],[[66730,66815],\"disallowed\"],[[66816,66855],\"valid\"],[[66856,66863],\"disallowed\"],[[66864,66915],\"valid\"],[[66916,66926],\"disallowed\"],[[66927,66927],\"valid\",[],\"NV8\"],[[66928,67071],\"disallowed\"],[[67072,67382],\"valid\"],[[67383,67391],\"disallowed\"],[[67392,67413],\"valid\"],[[67414,67423],\"disallowed\"],[[67424,67431],\"valid\"],[[67432,67583],\"disallowed\"],[[67584,67589],\"valid\"],[[67590,67591],\"disallowed\"],[[67592,67592],\"valid\"],[[67593,67593],\"disallowed\"],[[67594,67637],\"valid\"],[[67638,67638],\"disallowed\"],[[67639,67640],\"valid\"],[[67641,67643],\"disallowed\"],[[67644,67644],\"valid\"],[[67645,67646],\"disallowed\"],[[67647,67647],\"valid\"],[[67648,67669],\"valid\"],[[67670,67670],\"disallowed\"],[[67671,67679],\"valid\",[],\"NV8\"],[[67680,67702],\"valid\"],[[67703,67711],\"valid\",[],\"NV8\"],[[67712,67742],\"valid\"],[[67743,67750],\"disallowed\"],[[67751,67759],\"valid\",[],\"NV8\"],[[67760,67807],\"disallowed\"],[[67808,67826],\"valid\"],[[67827,67827],\"disallowed\"],[[67828,67829],\"valid\"],[[67830,67834],\"disallowed\"],[[67835,67839],\"valid\",[],\"NV8\"],[[67840,67861],\"valid\"],[[67862,67865],\"valid\",[],\"NV8\"],[[67866,67867],\"valid\",[],\"NV8\"],[[67868,67870],\"disallowed\"],[[67871,67871],\"valid\",[],\"NV8\"],[[67872,67897],\"valid\"],[[67898,67902],\"disallowed\"],[[67903,67903],\"valid\",[],\"NV8\"],[[67904,67967],\"disallowed\"],[[67968,68023],\"valid\"],[[68024,68027],\"disallowed\"],[[68028,68029],\"valid\",[],\"NV8\"],[[68030,68031],\"valid\"],[[68032,68047],\"valid\",[],\"NV8\"],[[68048,68049],\"disallowed\"],[[68050,68095],\"valid\",[],\"NV8\"],[[68096,68099],\"valid\"],[[68100,68100],\"disallowed\"],[[68101,68102],\"valid\"],[[68103,68107],\"disallowed\"],[[68108,68115],\"valid\"],[[68116,68116],\"disallowed\"],[[68117,68119],\"valid\"],[[68120,68120],\"disallowed\"],[[68121,68147],\"valid\"],[[68148,68151],\"disallowed\"],[[68152,68154],\"valid\"],[[68155,68158],\"disallowed\"],[[68159,68159],\"valid\"],[[68160,68167],\"valid\",[],\"NV8\"],[[68168,68175],\"disallowed\"],[[68176,68184],\"valid\",[],\"NV8\"],[[68185,68191],\"disallowed\"],[[68192,68220],\"valid\"],[[68221,68223],\"valid\",[],\"NV8\"],[[68224,68252],\"valid\"],[[68253,68255],\"valid\",[],\"NV8\"],[[68256,68287],\"disallowed\"],[[68288,68295],\"valid\"],[[68296,68296],\"valid\",[],\"NV8\"],[[68297,68326],\"valid\"],[[68327,68330],\"disallowed\"],[[68331,68342],\"valid\",[],\"NV8\"],[[68343,68351],\"disallowed\"],[[68352,68405],\"valid\"],[[68406,68408],\"disallowed\"],[[68409,68415],\"valid\",[],\"NV8\"],[[68416,68437],\"valid\"],[[68438,68439],\"disallowed\"],[[68440,68447],\"valid\",[],\"NV8\"],[[68448,68466],\"valid\"],[[68467,68471],\"disallowed\"],[[68472,68479],\"valid\",[],\"NV8\"],[[68480,68497],\"valid\"],[[68498,68504],\"disallowed\"],[[68505,68508],\"valid\",[],\"NV8\"],[[68509,68520],\"disallowed\"],[[68521,68527],\"valid\",[],\"NV8\"],[[68528,68607],\"disallowed\"],[[68608,68680],\"valid\"],[[68681,68735],\"disallowed\"],[[68736,68736],\"mapped\",[68800]],[[68737,68737],\"mapped\",[68801]],[[68738,68738],\"mapped\",[68802]],[[68739,68739],\"mapped\",[68803]],[[68740,68740],\"mapped\",[68804]],[[68741,68741],\"mapped\",[68805]],[[68742,68742],\"mapped\",[68806]],[[68743,68743],\"mapped\",[68807]],[[68744,68744],\"mapped\",[68808]],[[68745,68745],\"mapped\",[68809]],[[68746,68746],\"mapped\",[68810]],[[68747,68747],\"mapped\",[68811]],[[68748,68748],\"mapped\",[68812]],[[68749,68749],\"mapped\",[68813]],[[68750,68750],\"mapped\",[68814]],[[68751,68751],\"mapped\",[68815]],[[68752,68752],\"mapped\",[68816]],[[68753,68753],\"mapped\",[68817]],[[68754,68754],\"mapped\",[68818]],[[68755,68755],\"mapped\",[68819]],[[68756,68756],\"mapped\",[68820]],[[68757,68757],\"mapped\",[68821]],[[68758,68758],\"mapped\",[68822]],[[68759,68759],\"mapped\",[68823]],[[68760,68760],\"mapped\",[68824]],[[68761,68761],\"mapped\",[68825]],[[68762,68762],\"mapped\",[68826]],[[68763,68763],\"mapped\",[68827]],[[68764,68764],\"mapped\",[68828]],[[68765,68765],\"mapped\",[68829]],[[68766,68766],\"mapped\",[68830]],[[68767,68767],\"mapped\",[68831]],[[68768,68768],\"mapped\",[68832]],[[68769,68769],\"mapped\",[68833]],[[68770,68770],\"mapped\",[68834]],[[68771,68771],\"mapped\",[68835]],[[68772,68772],\"mapped\",[68836]],[[68773,68773],\"mapped\",[68837]],[[68774,68774],\"mapped\",[68838]],[[68775,68775],\"mapped\",[68839]],[[68776,68776],\"mapped\",[68840]],[[68777,68777],\"mapped\",[68841]],[[68778,68778],\"mapped\",[68842]],[[68779,68779],\"mapped\",[68843]],[[68780,68780],\"mapped\",[68844]],[[68781,68781],\"mapped\",[68845]],[[68782,68782],\"mapped\",[68846]],[[68783,68783],\"mapped\",[68847]],[[68784,68784],\"mapped\",[68848]],[[68785,68785],\"mapped\",[68849]],[[68786,68786],\"mapped\",[68850]],[[68787,68799],\"disallowed\"],[[68800,68850],\"valid\"],[[68851,68857],\"disallowed\"],[[68858,68863],\"valid\",[],\"NV8\"],[[68864,69215],\"disallowed\"],[[69216,69246],\"valid\",[],\"NV8\"],[[69247,69631],\"disallowed\"],[[69632,69702],\"valid\"],[[69703,69709],\"valid\",[],\"NV8\"],[[69710,69713],\"disallowed\"],[[69714,69733],\"valid\",[],\"NV8\"],[[69734,69743],\"valid\"],[[69744,69758],\"disallowed\"],[[69759,69759],\"valid\"],[[69760,69818],\"valid\"],[[69819,69820],\"valid\",[],\"NV8\"],[[69821,69821],\"disallowed\"],[[69822,69825],\"valid\",[],\"NV8\"],[[69826,69839],\"disallowed\"],[[69840,69864],\"valid\"],[[69865,69871],\"disallowed\"],[[69872,69881],\"valid\"],[[69882,69887],\"disallowed\"],[[69888,69940],\"valid\"],[[69941,69941],\"disallowed\"],[[69942,69951],\"valid\"],[[69952,69955],\"valid\",[],\"NV8\"],[[69956,69967],\"disallowed\"],[[69968,70003],\"valid\"],[[70004,70005],\"valid\",[],\"NV8\"],[[70006,70006],\"valid\"],[[70007,70015],\"disallowed\"],[[70016,70084],\"valid\"],[[70085,70088],\"valid\",[],\"NV8\"],[[70089,70089],\"valid\",[],\"NV8\"],[[70090,70092],\"valid\"],[[70093,70093],\"valid\",[],\"NV8\"],[[70094,70095],\"disallowed\"],[[70096,70105],\"valid\"],[[70106,70106],\"valid\"],[[70107,70107],\"valid\",[],\"NV8\"],[[70108,70108],\"valid\"],[[70109,70111],\"valid\",[],\"NV8\"],[[70112,70112],\"disallowed\"],[[70113,70132],\"valid\",[],\"NV8\"],[[70133,70143],\"disallowed\"],[[70144,70161],\"valid\"],[[70162,70162],\"disallowed\"],[[70163,70199],\"valid\"],[[70200,70205],\"valid\",[],\"NV8\"],[[70206,70271],\"disallowed\"],[[70272,70278],\"valid\"],[[70279,70279],\"disallowed\"],[[70280,70280],\"valid\"],[[70281,70281],\"disallowed\"],[[70282,70285],\"valid\"],[[70286,70286],\"disallowed\"],[[70287,70301],\"valid\"],[[70302,70302],\"disallowed\"],[[70303,70312],\"valid\"],[[70313,70313],\"valid\",[],\"NV8\"],[[70314,70319],\"disallowed\"],[[70320,70378],\"valid\"],[[70379,70383],\"disallowed\"],[[70384,70393],\"valid\"],[[70394,70399],\"disallowed\"],[[70400,70400],\"valid\"],[[70401,70403],\"valid\"],[[70404,70404],\"disallowed\"],[[70405,70412],\"valid\"],[[70413,70414],\"disallowed\"],[[70415,70416],\"valid\"],[[70417,70418],\"disallowed\"],[[70419,70440],\"valid\"],[[70441,70441],\"disallowed\"],[[70442,70448],\"valid\"],[[70449,70449],\"disallowed\"],[[70450,70451],\"valid\"],[[70452,70452],\"disallowed\"],[[70453,70457],\"valid\"],[[70458,70459],\"disallowed\"],[[70460,70468],\"valid\"],[[70469,70470],\"disallowed\"],[[70471,70472],\"valid\"],[[70473,70474],\"disallowed\"],[[70475,70477],\"valid\"],[[70478,70479],\"disallowed\"],[[70480,70480],\"valid\"],[[70481,70486],\"disallowed\"],[[70487,70487],\"valid\"],[[70488,70492],\"disallowed\"],[[70493,70499],\"valid\"],[[70500,70501],\"disallowed\"],[[70502,70508],\"valid\"],[[70509,70511],\"disallowed\"],[[70512,70516],\"valid\"],[[70517,70783],\"disallowed\"],[[70784,70853],\"valid\"],[[70854,70854],\"valid\",[],\"NV8\"],[[70855,70855],\"valid\"],[[70856,70863],\"disallowed\"],[[70864,70873],\"valid\"],[[70874,71039],\"disallowed\"],[[71040,71093],\"valid\"],[[71094,71095],\"disallowed\"],[[71096,71104],\"valid\"],[[71105,71113],\"valid\",[],\"NV8\"],[[71114,71127],\"valid\",[],\"NV8\"],[[71128,71133],\"valid\"],[[71134,71167],\"disallowed\"],[[71168,71232],\"valid\"],[[71233,71235],\"valid\",[],\"NV8\"],[[71236,71236],\"valid\"],[[71237,71247],\"disallowed\"],[[71248,71257],\"valid\"],[[71258,71295],\"disallowed\"],[[71296,71351],\"valid\"],[[71352,71359],\"disallowed\"],[[71360,71369],\"valid\"],[[71370,71423],\"disallowed\"],[[71424,71449],\"valid\"],[[71450,71452],\"disallowed\"],[[71453,71467],\"valid\"],[[71468,71471],\"disallowed\"],[[71472,71481],\"valid\"],[[71482,71487],\"valid\",[],\"NV8\"],[[71488,71839],\"disallowed\"],[[71840,71840],\"mapped\",[71872]],[[71841,71841],\"mapped\",[71873]],[[71842,71842],\"mapped\",[71874]],[[71843,71843],\"mapped\",[71875]],[[71844,71844],\"mapped\",[71876]],[[71845,71845],\"mapped\",[71877]],[[71846,71846],\"mapped\",[71878]],[[71847,71847],\"mapped\",[71879]],[[71848,71848],\"mapped\",[71880]],[[71849,71849],\"mapped\",[71881]],[[71850,71850],\"mapped\",[71882]],[[71851,71851],\"mapped\",[71883]],[[71852,71852],\"mapped\",[71884]],[[71853,71853],\"mapped\",[71885]],[[71854,71854],\"mapped\",[71886]],[[71855,71855],\"mapped\",[71887]],[[71856,71856],\"mapped\",[71888]],[[71857,71857],\"mapped\",[71889]],[[71858,71858],\"mapped\",[71890]],[[71859,71859],\"mapped\",[71891]],[[71860,71860],\"mapped\",[71892]],[[71861,71861],\"mapped\",[71893]],[[71862,71862],\"mapped\",[71894]],[[71863,71863],\"mapped\",[71895]],[[71864,71864],\"mapped\",[71896]],[[71865,71865],\"mapped\",[71897]],[[71866,71866],\"mapped\",[71898]],[[71867,71867],\"mapped\",[71899]],[[71868,71868],\"mapped\",[71900]],[[71869,71869],\"mapped\",[71901]],[[71870,71870],\"mapped\",[71902]],[[71871,71871],\"mapped\",[71903]],[[71872,71913],\"valid\"],[[71914,71922],\"valid\",[],\"NV8\"],[[71923,71934],\"disallowed\"],[[71935,71935],\"valid\"],[[71936,72383],\"disallowed\"],[[72384,72440],\"valid\"],[[72441,73727],\"disallowed\"],[[73728,74606],\"valid\"],[[74607,74648],\"valid\"],[[74649,74649],\"valid\"],[[74650,74751],\"disallowed\"],[[74752,74850],\"valid\",[],\"NV8\"],[[74851,74862],\"valid\",[],\"NV8\"],[[74863,74863],\"disallowed\"],[[74864,74867],\"valid\",[],\"NV8\"],[[74868,74868],\"valid\",[],\"NV8\"],[[74869,74879],\"disallowed\"],[[74880,75075],\"valid\"],[[75076,77823],\"disallowed\"],[[77824,78894],\"valid\"],[[78895,82943],\"disallowed\"],[[82944,83526],\"valid\"],[[83527,92159],\"disallowed\"],[[92160,92728],\"valid\"],[[92729,92735],\"disallowed\"],[[92736,92766],\"valid\"],[[92767,92767],\"disallowed\"],[[92768,92777],\"valid\"],[[92778,92781],\"disallowed\"],[[92782,92783],\"valid\",[],\"NV8\"],[[92784,92879],\"disallowed\"],[[92880,92909],\"valid\"],[[92910,92911],\"disallowed\"],[[92912,92916],\"valid\"],[[92917,92917],\"valid\",[],\"NV8\"],[[92918,92927],\"disallowed\"],[[92928,92982],\"valid\"],[[92983,92991],\"valid\",[],\"NV8\"],[[92992,92995],\"valid\"],[[92996,92997],\"valid\",[],\"NV8\"],[[92998,93007],\"disallowed\"],[[93008,93017],\"valid\"],[[93018,93018],\"disallowed\"],[[93019,93025],\"valid\",[],\"NV8\"],[[93026,93026],\"disallowed\"],[[93027,93047],\"valid\"],[[93048,93052],\"disallowed\"],[[93053,93071],\"valid\"],[[93072,93951],\"disallowed\"],[[93952,94020],\"valid\"],[[94021,94031],\"disallowed\"],[[94032,94078],\"valid\"],[[94079,94094],\"disallowed\"],[[94095,94111],\"valid\"],[[94112,110591],\"disallowed\"],[[110592,110593],\"valid\"],[[110594,113663],\"disallowed\"],[[113664,113770],\"valid\"],[[113771,113775],\"disallowed\"],[[113776,113788],\"valid\"],[[113789,113791],\"disallowed\"],[[113792,113800],\"valid\"],[[113801,113807],\"disallowed\"],[[113808,113817],\"valid\"],[[113818,113819],\"disallowed\"],[[113820,113820],\"valid\",[],\"NV8\"],[[113821,113822],\"valid\"],[[113823,113823],\"valid\",[],\"NV8\"],[[113824,113827],\"ignored\"],[[113828,118783],\"disallowed\"],[[118784,119029],\"valid\",[],\"NV8\"],[[119030,119039],\"disallowed\"],[[119040,119078],\"valid\",[],\"NV8\"],[[119079,119080],\"disallowed\"],[[119081,119081],\"valid\",[],\"NV8\"],[[119082,119133],\"valid\",[],\"NV8\"],[[119134,119134],\"mapped\",[119127,119141]],[[119135,119135],\"mapped\",[119128,119141]],[[119136,119136],\"mapped\",[119128,119141,119150]],[[119137,119137],\"mapped\",[119128,119141,119151]],[[119138,119138],\"mapped\",[119128,119141,119152]],[[119139,119139],\"mapped\",[119128,119141,119153]],[[119140,119140],\"mapped\",[119128,119141,119154]],[[119141,119154],\"valid\",[],\"NV8\"],[[119155,119162],\"disallowed\"],[[119163,119226],\"valid\",[],\"NV8\"],[[119227,119227],\"mapped\",[119225,119141]],[[119228,119228],\"mapped\",[119226,119141]],[[119229,119229],\"mapped\",[119225,119141,119150]],[[119230,119230],\"mapped\",[119226,119141,119150]],[[119231,119231],\"mapped\",[119225,119141,119151]],[[119232,119232],\"mapped\",[119226,119141,119151]],[[119233,119261],\"valid\",[],\"NV8\"],[[119262,119272],\"valid\",[],\"NV8\"],[[119273,119295],\"disallowed\"],[[119296,119365],\"valid\",[],\"NV8\"],[[119366,119551],\"disallowed\"],[[119552,119638],\"valid\",[],\"NV8\"],[[119639,119647],\"disallowed\"],[[119648,119665],\"valid\",[],\"NV8\"],[[119666,119807],\"disallowed\"],[[119808,119808],\"mapped\",[97]],[[119809,119809],\"mapped\",[98]],[[119810,119810],\"mapped\",[99]],[[119811,119811],\"mapped\",[100]],[[119812,119812],\"mapped\",[101]],[[119813,119813],\"mapped\",[102]],[[119814,119814],\"mapped\",[103]],[[119815,119815],\"mapped\",[104]],[[119816,119816],\"mapped\",[105]],[[119817,119817],\"mapped\",[106]],[[119818,119818],\"mapped\",[107]],[[119819,119819],\"mapped\",[108]],[[119820,119820],\"mapped\",[109]],[[119821,119821],\"mapped\",[110]],[[119822,119822],\"mapped\",[111]],[[119823,119823],\"mapped\",[112]],[[119824,119824],\"mapped\",[113]],[[119825,119825],\"mapped\",[114]],[[119826,119826],\"mapped\",[115]],[[119827,119827],\"mapped\",[116]],[[119828,119828],\"mapped\",[117]],[[119829,119829],\"mapped\",[118]],[[119830,119830],\"mapped\",[119]],[[119831,119831],\"mapped\",[120]],[[119832,119832],\"mapped\",[121]],[[119833,119833],\"mapped\",[122]],[[119834,119834],\"mapped\",[97]],[[119835,119835],\"mapped\",[98]],[[119836,119836],\"mapped\",[99]],[[119837,119837],\"mapped\",[100]],[[119838,119838],\"mapped\",[101]],[[119839,119839],\"mapped\",[102]],[[119840,119840],\"mapped\",[103]],[[119841,119841],\"mapped\",[104]],[[119842,119842],\"mapped\",[105]],[[119843,119843],\"mapped\",[106]],[[119844,119844],\"mapped\",[107]],[[119845,119845],\"mapped\",[108]],[[119846,119846],\"mapped\",[109]],[[119847,119847],\"mapped\",[110]],[[119848,119848],\"mapped\",[111]],[[119849,119849],\"mapped\",[112]],[[119850,119850],\"mapped\",[113]],[[119851,119851],\"mapped\",[114]],[[119852,119852],\"mapped\",[115]],[[119853,119853],\"mapped\",[116]],[[119854,119854],\"mapped\",[117]],[[119855,119855],\"mapped\",[118]],[[119856,119856],\"mapped\",[119]],[[119857,119857],\"mapped\",[120]],[[119858,119858],\"mapped\",[121]],[[119859,119859],\"mapped\",[122]],[[119860,119860],\"mapped\",[97]],[[119861,119861],\"mapped\",[98]],[[119862,119862],\"mapped\",[99]],[[119863,119863],\"mapped\",[100]],[[119864,119864],\"mapped\",[101]],[[119865,119865],\"mapped\",[102]],[[119866,119866],\"mapped\",[103]],[[119867,119867],\"mapped\",[104]],[[119868,119868],\"mapped\",[105]],[[119869,119869],\"mapped\",[106]],[[119870,119870],\"mapped\",[107]],[[119871,119871],\"mapped\",[108]],[[119872,119872],\"mapped\",[109]],[[119873,119873],\"mapped\",[110]],[[119874,119874],\"mapped\",[111]],[[119875,119875],\"mapped\",[112]],[[119876,119876],\"mapped\",[113]],[[119877,119877],\"mapped\",[114]],[[119878,119878],\"mapped\",[115]],[[119879,119879],\"mapped\",[116]],[[119880,119880],\"mapped\",[117]],[[119881,119881],\"mapped\",[118]],[[119882,119882],\"mapped\",[119]],[[119883,119883],\"mapped\",[120]],[[119884,119884],\"mapped\",[121]],[[119885,119885],\"mapped\",[122]],[[119886,119886],\"mapped\",[97]],[[119887,119887],\"mapped\",[98]],[[119888,119888],\"mapped\",[99]],[[119889,119889],\"mapped\",[100]],[[119890,119890],\"mapped\",[101]],[[119891,119891],\"mapped\",[102]],[[119892,119892],\"mapped\",[103]],[[119893,119893],\"disallowed\"],[[119894,119894],\"mapped\",[105]],[[119895,119895],\"mapped\",[106]],[[119896,119896],\"mapped\",[107]],[[119897,119897],\"mapped\",[108]],[[119898,119898],\"mapped\",[109]],[[119899,119899],\"mapped\",[110]],[[119900,119900],\"mapped\",[111]],[[119901,119901],\"mapped\",[112]],[[119902,119902],\"mapped\",[113]],[[119903,119903],\"mapped\",[114]],[[119904,119904],\"mapped\",[115]],[[119905,119905],\"mapped\",[116]],[[119906,119906],\"mapped\",[117]],[[119907,119907],\"mapped\",[118]],[[119908,119908],\"mapped\",[119]],[[119909,119909],\"mapped\",[120]],[[119910,119910],\"mapped\",[121]],[[119911,119911],\"mapped\",[122]],[[119912,119912],\"mapped\",[97]],[[119913,119913],\"mapped\",[98]],[[119914,119914],\"mapped\",[99]],[[119915,119915],\"mapped\",[100]],[[119916,119916],\"mapped\",[101]],[[119917,119917],\"mapped\",[102]],[[119918,119918],\"mapped\",[103]],[[119919,119919],\"mapped\",[104]],[[119920,119920],\"mapped\",[105]],[[119921,119921],\"mapped\",[106]],[[119922,119922],\"mapped\",[107]],[[119923,119923],\"mapped\",[108]],[[119924,119924],\"mapped\",[109]],[[119925,119925],\"mapped\",[110]],[[119926,119926],\"mapped\",[111]],[[119927,119927],\"mapped\",[112]],[[119928,119928],\"mapped\",[113]],[[119929,119929],\"mapped\",[114]],[[119930,119930],\"mapped\",[115]],[[119931,119931],\"mapped\",[116]],[[119932,119932],\"mapped\",[117]],[[119933,119933],\"mapped\",[118]],[[119934,119934],\"mapped\",[119]],[[119935,119935],\"mapped\",[120]],[[119936,119936],\"mapped\",[121]],[[119937,119937],\"mapped\",[122]],[[119938,119938],\"mapped\",[97]],[[119939,119939],\"mapped\",[98]],[[119940,119940],\"mapped\",[99]],[[119941,119941],\"mapped\",[100]],[[119942,119942],\"mapped\",[101]],[[119943,119943],\"mapped\",[102]],[[119944,119944],\"mapped\",[103]],[[119945,119945],\"mapped\",[104]],[[119946,119946],\"mapped\",[105]],[[119947,119947],\"mapped\",[106]],[[119948,119948],\"mapped\",[107]],[[119949,119949],\"mapped\",[108]],[[119950,119950],\"mapped\",[109]],[[119951,119951],\"mapped\",[110]],[[119952,119952],\"mapped\",[111]],[[119953,119953],\"mapped\",[112]],[[119954,119954],\"mapped\",[113]],[[119955,119955],\"mapped\",[114]],[[119956,119956],\"mapped\",[115]],[[119957,119957],\"mapped\",[116]],[[119958,119958],\"mapped\",[117]],[[119959,119959],\"mapped\",[118]],[[119960,119960],\"mapped\",[119]],[[119961,119961],\"mapped\",[120]],[[119962,119962],\"mapped\",[121]],[[119963,119963],\"mapped\",[122]],[[119964,119964],\"mapped\",[97]],[[119965,119965],\"disallowed\"],[[119966,119966],\"mapped\",[99]],[[119967,119967],\"mapped\",[100]],[[119968,119969],\"disallowed\"],[[119970,119970],\"mapped\",[103]],[[119971,119972],\"disallowed\"],[[119973,119973],\"mapped\",[106]],[[119974,119974],\"mapped\",[107]],[[119975,119976],\"disallowed\"],[[119977,119977],\"mapped\",[110]],[[119978,119978],\"mapped\",[111]],[[119979,119979],\"mapped\",[112]],[[119980,119980],\"mapped\",[113]],[[119981,119981],\"disallowed\"],[[119982,119982],\"mapped\",[115]],[[119983,119983],\"mapped\",[116]],[[119984,119984],\"mapped\",[117]],[[119985,119985],\"mapped\",[118]],[[119986,119986],\"mapped\",[119]],[[119987,119987],\"mapped\",[120]],[[119988,119988],\"mapped\",[121]],[[119989,119989],\"mapped\",[122]],[[119990,119990],\"mapped\",[97]],[[119991,119991],\"mapped\",[98]],[[119992,119992],\"mapped\",[99]],[[119993,119993],\"mapped\",[100]],[[119994,119994],\"disallowed\"],[[119995,119995],\"mapped\",[102]],[[119996,119996],\"disallowed\"],[[119997,119997],\"mapped\",[104]],[[119998,119998],\"mapped\",[105]],[[119999,119999],\"mapped\",[106]],[[120000,120000],\"mapped\",[107]],[[120001,120001],\"mapped\",[108]],[[120002,120002],\"mapped\",[109]],[[120003,120003],\"mapped\",[110]],[[120004,120004],\"disallowed\"],[[120005,120005],\"mapped\",[112]],[[120006,120006],\"mapped\",[113]],[[120007,120007],\"mapped\",[114]],[[120008,120008],\"mapped\",[115]],[[120009,120009],\"mapped\",[116]],[[120010,120010],\"mapped\",[117]],[[120011,120011],\"mapped\",[118]],[[120012,120012],\"mapped\",[119]],[[120013,120013],\"mapped\",[120]],[[120014,120014],\"mapped\",[121]],[[120015,120015],\"mapped\",[122]],[[120016,120016],\"mapped\",[97]],[[120017,120017],\"mapped\",[98]],[[120018,120018],\"mapped\",[99]],[[120019,120019],\"mapped\",[100]],[[120020,120020],\"mapped\",[101]],[[120021,120021],\"mapped\",[102]],[[120022,120022],\"mapped\",[103]],[[120023,120023],\"mapped\",[104]],[[120024,120024],\"mapped\",[105]],[[120025,120025],\"mapped\",[106]],[[120026,120026],\"mapped\",[107]],[[120027,120027],\"mapped\",[108]],[[120028,120028],\"mapped\",[109]],[[120029,120029],\"mapped\",[110]],[[120030,120030],\"mapped\",[111]],[[120031,120031],\"mapped\",[112]],[[120032,120032],\"mapped\",[113]],[[120033,120033],\"mapped\",[114]],[[120034,120034],\"mapped\",[115]],[[120035,120035],\"mapped\",[116]],[[120036,120036],\"mapped\",[117]],[[120037,120037],\"mapped\",[118]],[[120038,120038],\"mapped\",[119]],[[120039,120039],\"mapped\",[120]],[[120040,120040],\"mapped\",[121]],[[120041,120041],\"mapped\",[122]],[[120042,120042],\"mapped\",[97]],[[120043,120043],\"mapped\",[98]],[[120044,120044],\"mapped\",[99]],[[120045,120045],\"mapped\",[100]],[[120046,120046],\"mapped\",[101]],[[120047,120047],\"mapped\",[102]],[[120048,120048],\"mapped\",[103]],[[120049,120049],\"mapped\",[104]],[[120050,120050],\"mapped\",[105]],[[120051,120051],\"mapped\",[106]],[[120052,120052],\"mapped\",[107]],[[120053,120053],\"mapped\",[108]],[[120054,120054],\"mapped\",[109]],[[120055,120055],\"mapped\",[110]],[[120056,120056],\"mapped\",[111]],[[120057,120057],\"mapped\",[112]],[[120058,120058],\"mapped\",[113]],[[120059,120059],\"mapped\",[114]],[[120060,120060],\"mapped\",[115]],[[120061,120061],\"mapped\",[116]],[[120062,120062],\"mapped\",[117]],[[120063,120063],\"mapped\",[118]],[[120064,120064],\"mapped\",[119]],[[120065,120065],\"mapped\",[120]],[[120066,120066],\"mapped\",[121]],[[120067,120067],\"mapped\",[122]],[[120068,120068],\"mapped\",[97]],[[120069,120069],\"mapped\",[98]],[[120070,120070],\"disallowed\"],[[120071,120071],\"mapped\",[100]],[[120072,120072],\"mapped\",[101]],[[120073,120073],\"mapped\",[102]],[[120074,120074],\"mapped\",[103]],[[120075,120076],\"disallowed\"],[[120077,120077],\"mapped\",[106]],[[120078,120078],\"mapped\",[107]],[[120079,120079],\"mapped\",[108]],[[120080,120080],\"mapped\",[109]],[[120081,120081],\"mapped\",[110]],[[120082,120082],\"mapped\",[111]],[[120083,120083],\"mapped\",[112]],[[120084,120084],\"mapped\",[113]],[[120085,120085],\"disallowed\"],[[120086,120086],\"mapped\",[115]],[[120087,120087],\"mapped\",[116]],[[120088,120088],\"mapped\",[117]],[[120089,120089],\"mapped\",[118]],[[120090,120090],\"mapped\",[119]],[[120091,120091],\"mapped\",[120]],[[120092,120092],\"mapped\",[121]],[[120093,120093],\"disallowed\"],[[120094,120094],\"mapped\",[97]],[[120095,120095],\"mapped\",[98]],[[120096,120096],\"mapped\",[99]],[[120097,120097],\"mapped\",[100]],[[120098,120098],\"mapped\",[101]],[[120099,120099],\"mapped\",[102]],[[120100,120100],\"mapped\",[103]],[[120101,120101],\"mapped\",[104]],[[120102,120102],\"mapped\",[105]],[[120103,120103],\"mapped\",[106]],[[120104,120104],\"mapped\",[107]],[[120105,120105],\"mapped\",[108]],[[120106,120106],\"mapped\",[109]],[[120107,120107],\"mapped\",[110]],[[120108,120108],\"mapped\",[111]],[[120109,120109],\"mapped\",[112]],[[120110,120110],\"mapped\",[113]],[[120111,120111],\"mapped\",[114]],[[120112,120112],\"mapped\",[115]],[[120113,120113],\"mapped\",[116]],[[120114,120114],\"mapped\",[117]],[[120115,120115],\"mapped\",[118]],[[120116,120116],\"mapped\",[119]],[[120117,120117],\"mapped\",[120]],[[120118,120118],\"mapped\",[121]],[[120119,120119],\"mapped\",[122]],[[120120,120120],\"mapped\",[97]],[[120121,120121],\"mapped\",[98]],[[120122,120122],\"disallowed\"],[[120123,120123],\"mapped\",[100]],[[120124,120124],\"mapped\",[101]],[[120125,120125],\"mapped\",[102]],[[120126,120126],\"mapped\",[103]],[[120127,120127],\"disallowed\"],[[120128,120128],\"mapped\",[105]],[[120129,120129],\"mapped\",[106]],[[120130,120130],\"mapped\",[107]],[[120131,120131],\"mapped\",[108]],[[120132,120132],\"mapped\",[109]],[[120133,120133],\"disallowed\"],[[120134,120134],\"mapped\",[111]],[[120135,120137],\"disallowed\"],[[120138,120138],\"mapped\",[115]],[[120139,120139],\"mapped\",[116]],[[120140,120140],\"mapped\",[117]],[[120141,120141],\"mapped\",[118]],[[120142,120142],\"mapped\",[119]],[[120143,120143],\"mapped\",[120]],[[120144,120144],\"mapped\",[121]],[[120145,120145],\"disallowed\"],[[120146,120146],\"mapped\",[97]],[[120147,120147],\"mapped\",[98]],[[120148,120148],\"mapped\",[99]],[[120149,120149],\"mapped\",[100]],[[120150,120150],\"mapped\",[101]],[[120151,120151],\"mapped\",[102]],[[120152,120152],\"mapped\",[103]],[[120153,120153],\"mapped\",[104]],[[120154,120154],\"mapped\",[105]],[[120155,120155],\"mapped\",[106]],[[120156,120156],\"mapped\",[107]],[[120157,120157],\"mapped\",[108]],[[120158,120158],\"mapped\",[109]],[[120159,120159],\"mapped\",[110]],[[120160,120160],\"mapped\",[111]],[[120161,120161],\"mapped\",[112]],[[120162,120162],\"mapped\",[113]],[[120163,120163],\"mapped\",[114]],[[120164,120164],\"mapped\",[115]],[[120165,120165],\"mapped\",[116]],[[120166,120166],\"mapped\",[117]],[[120167,120167],\"mapped\",[118]],[[120168,120168],\"mapped\",[119]],[[120169,120169],\"mapped\",[120]],[[120170,120170],\"mapped\",[121]],[[120171,120171],\"mapped\",[122]],[[120172,120172],\"mapped\",[97]],[[120173,120173],\"mapped\",[98]],[[120174,120174],\"mapped\",[99]],[[120175,120175],\"mapped\",[100]],[[120176,120176],\"mapped\",[101]],[[120177,120177],\"mapped\",[102]],[[120178,120178],\"mapped\",[103]],[[120179,120179],\"mapped\",[104]],[[120180,120180],\"mapped\",[105]],[[120181,120181],\"mapped\",[106]],[[120182,120182],\"mapped\",[107]],[[120183,120183],\"mapped\",[108]],[[120184,120184],\"mapped\",[109]],[[120185,120185],\"mapped\",[110]],[[120186,120186],\"mapped\",[111]],[[120187,120187],\"mapped\",[112]],[[120188,120188],\"mapped\",[113]],[[120189,120189],\"mapped\",[114]],[[120190,120190],\"mapped\",[115]],[[120191,120191],\"mapped\",[116]],[[120192,120192],\"mapped\",[117]],[[120193,120193],\"mapped\",[118]],[[120194,120194],\"mapped\",[119]],[[120195,120195],\"mapped\",[120]],[[120196,120196],\"mapped\",[121]],[[120197,120197],\"mapped\",[122]],[[120198,120198],\"mapped\",[97]],[[120199,120199],\"mapped\",[98]],[[120200,120200],\"mapped\",[99]],[[120201,120201],\"mapped\",[100]],[[120202,120202],\"mapped\",[101]],[[120203,120203],\"mapped\",[102]],[[120204,120204],\"mapped\",[103]],[[120205,120205],\"mapped\",[104]],[[120206,120206],\"mapped\",[105]],[[120207,120207],\"mapped\",[106]],[[120208,120208],\"mapped\",[107]],[[120209,120209],\"mapped\",[108]],[[120210,120210],\"mapped\",[109]],[[120211,120211],\"mapped\",[110]],[[120212,120212],\"mapped\",[111]],[[120213,120213],\"mapped\",[112]],[[120214,120214],\"mapped\",[113]],[[120215,120215],\"mapped\",[114]],[[120216,120216],\"mapped\",[115]],[[120217,120217],\"mapped\",[116]],[[120218,120218],\"mapped\",[117]],[[120219,120219],\"mapped\",[118]],[[120220,120220],\"mapped\",[119]],[[120221,120221],\"mapped\",[120]],[[120222,120222],\"mapped\",[121]],[[120223,120223],\"mapped\",[122]],[[120224,120224],\"mapped\",[97]],[[120225,120225],\"mapped\",[98]],[[120226,120226],\"mapped\",[99]],[[120227,120227],\"mapped\",[100]],[[120228,120228],\"mapped\",[101]],[[120229,120229],\"mapped\",[102]],[[120230,120230],\"mapped\",[103]],[[120231,120231],\"mapped\",[104]],[[120232,120232],\"mapped\",[105]],[[120233,120233],\"mapped\",[106]],[[120234,120234],\"mapped\",[107]],[[120235,120235],\"mapped\",[108]],[[120236,120236],\"mapped\",[109]],[[120237,120237],\"mapped\",[110]],[[120238,120238],\"mapped\",[111]],[[120239,120239],\"mapped\",[112]],[[120240,120240],\"mapped\",[113]],[[120241,120241],\"mapped\",[114]],[[120242,120242],\"mapped\",[115]],[[120243,120243],\"mapped\",[116]],[[120244,120244],\"mapped\",[117]],[[120245,120245],\"mapped\",[118]],[[120246,120246],\"mapped\",[119]],[[120247,120247],\"mapped\",[120]],[[120248,120248],\"mapped\",[121]],[[120249,120249],\"mapped\",[122]],[[120250,120250],\"mapped\",[97]],[[120251,120251],\"mapped\",[98]],[[120252,120252],\"mapped\",[99]],[[120253,120253],\"mapped\",[100]],[[120254,120254],\"mapped\",[101]],[[120255,120255],\"mapped\",[102]],[[120256,120256],\"mapped\",[103]],[[120257,120257],\"mapped\",[104]],[[120258,120258],\"mapped\",[105]],[[120259,120259],\"mapped\",[106]],[[120260,120260],\"mapped\",[107]],[[120261,120261],\"mapped\",[108]],[[120262,120262],\"mapped\",[109]],[[120263,120263],\"mapped\",[110]],[[120264,120264],\"mapped\",[111]],[[120265,120265],\"mapped\",[112]],[[120266,120266],\"mapped\",[113]],[[120267,120267],\"mapped\",[114]],[[120268,120268],\"mapped\",[115]],[[120269,120269],\"mapped\",[116]],[[120270,120270],\"mapped\",[117]],[[120271,120271],\"mapped\",[118]],[[120272,120272],\"mapped\",[119]],[[120273,120273],\"mapped\",[120]],[[120274,120274],\"mapped\",[121]],[[120275,120275],\"mapped\",[122]],[[120276,120276],\"mapped\",[97]],[[120277,120277],\"mapped\",[98]],[[120278,120278],\"mapped\",[99]],[[120279,120279],\"mapped\",[100]],[[120280,120280],\"mapped\",[101]],[[120281,120281],\"mapped\",[102]],[[120282,120282],\"mapped\",[103]],[[120283,120283],\"mapped\",[104]],[[120284,120284],\"mapped\",[105]],[[120285,120285],\"mapped\",[106]],[[120286,120286],\"mapped\",[107]],[[120287,120287],\"mapped\",[108]],[[120288,120288],\"mapped\",[109]],[[120289,120289],\"mapped\",[110]],[[120290,120290],\"mapped\",[111]],[[120291,120291],\"mapped\",[112]],[[120292,120292],\"mapped\",[113]],[[120293,120293],\"mapped\",[114]],[[120294,120294],\"mapped\",[115]],[[120295,120295],\"mapped\",[116]],[[120296,120296],\"mapped\",[117]],[[120297,120297],\"mapped\",[118]],[[120298,120298],\"mapped\",[119]],[[120299,120299],\"mapped\",[120]],[[120300,120300],\"mapped\",[121]],[[120301,120301],\"mapped\",[122]],[[120302,120302],\"mapped\",[97]],[[120303,120303],\"mapped\",[98]],[[120304,120304],\"mapped\",[99]],[[120305,120305],\"mapped\",[100]],[[120306,120306],\"mapped\",[101]],[[120307,120307],\"mapped\",[102]],[[120308,120308],\"mapped\",[103]],[[120309,120309],\"mapped\",[104]],[[120310,120310],\"mapped\",[105]],[[120311,120311],\"mapped\",[106]],[[120312,120312],\"mapped\",[107]],[[120313,120313],\"mapped\",[108]],[[120314,120314],\"mapped\",[109]],[[120315,120315],\"mapped\",[110]],[[120316,120316],\"mapped\",[111]],[[120317,120317],\"mapped\",[112]],[[120318,120318],\"mapped\",[113]],[[120319,120319],\"mapped\",[114]],[[120320,120320],\"mapped\",[115]],[[120321,120321],\"mapped\",[116]],[[120322,120322],\"mapped\",[117]],[[120323,120323],\"mapped\",[118]],[[120324,120324],\"mapped\",[119]],[[120325,120325],\"mapped\",[120]],[[120326,120326],\"mapped\",[121]],[[120327,120327],\"mapped\",[122]],[[120328,120328],\"mapped\",[97]],[[120329,120329],\"mapped\",[98]],[[120330,120330],\"mapped\",[99]],[[120331,120331],\"mapped\",[100]],[[120332,120332],\"mapped\",[101]],[[120333,120333],\"mapped\",[102]],[[120334,120334],\"mapped\",[103]],[[120335,120335],\"mapped\",[104]],[[120336,120336],\"mapped\",[105]],[[120337,120337],\"mapped\",[106]],[[120338,120338],\"mapped\",[107]],[[120339,120339],\"mapped\",[108]],[[120340,120340],\"mapped\",[109]],[[120341,120341],\"mapped\",[110]],[[120342,120342],\"mapped\",[111]],[[120343,120343],\"mapped\",[112]],[[120344,120344],\"mapped\",[113]],[[120345,120345],\"mapped\",[114]],[[120346,120346],\"mapped\",[115]],[[120347,120347],\"mapped\",[116]],[[120348,120348],\"mapped\",[117]],[[120349,120349],\"mapped\",[118]],[[120350,120350],\"mapped\",[119]],[[120351,120351],\"mapped\",[120]],[[120352,120352],\"mapped\",[121]],[[120353,120353],\"mapped\",[122]],[[120354,120354],\"mapped\",[97]],[[120355,120355],\"mapped\",[98]],[[120356,120356],\"mapped\",[99]],[[120357,120357],\"mapped\",[100]],[[120358,120358],\"mapped\",[101]],[[120359,120359],\"mapped\",[102]],[[120360,120360],\"mapped\",[103]],[[120361,120361],\"mapped\",[104]],[[120362,120362],\"mapped\",[105]],[[120363,120363],\"mapped\",[106]],[[120364,120364],\"mapped\",[107]],[[120365,120365],\"mapped\",[108]],[[120366,120366],\"mapped\",[109]],[[120367,120367],\"mapped\",[110]],[[120368,120368],\"mapped\",[111]],[[120369,120369],\"mapped\",[112]],[[120370,120370],\"mapped\",[113]],[[120371,120371],\"mapped\",[114]],[[120372,120372],\"mapped\",[115]],[[120373,120373],\"mapped\",[116]],[[120374,120374],\"mapped\",[117]],[[120375,120375],\"mapped\",[118]],[[120376,120376],\"mapped\",[119]],[[120377,120377],\"mapped\",[120]],[[120378,120378],\"mapped\",[121]],[[120379,120379],\"mapped\",[122]],[[120380,120380],\"mapped\",[97]],[[120381,120381],\"mapped\",[98]],[[120382,120382],\"mapped\",[99]],[[120383,120383],\"mapped\",[100]],[[120384,120384],\"mapped\",[101]],[[120385,120385],\"mapped\",[102]],[[120386,120386],\"mapped\",[103]],[[120387,120387],\"mapped\",[104]],[[120388,120388],\"mapped\",[105]],[[120389,120389],\"mapped\",[106]],[[120390,120390],\"mapped\",[107]],[[120391,120391],\"mapped\",[108]],[[120392,120392],\"mapped\",[109]],[[120393,120393],\"mapped\",[110]],[[120394,120394],\"mapped\",[111]],[[120395,120395],\"mapped\",[112]],[[120396,120396],\"mapped\",[113]],[[120397,120397],\"mapped\",[114]],[[120398,120398],\"mapped\",[115]],[[120399,120399],\"mapped\",[116]],[[120400,120400],\"mapped\",[117]],[[120401,120401],\"mapped\",[118]],[[120402,120402],\"mapped\",[119]],[[120403,120403],\"mapped\",[120]],[[120404,120404],\"mapped\",[121]],[[120405,120405],\"mapped\",[122]],[[120406,120406],\"mapped\",[97]],[[120407,120407],\"mapped\",[98]],[[120408,120408],\"mapped\",[99]],[[120409,120409],\"mapped\",[100]],[[120410,120410],\"mapped\",[101]],[[120411,120411],\"mapped\",[102]],[[120412,120412],\"mapped\",[103]],[[120413,120413],\"mapped\",[104]],[[120414,120414],\"mapped\",[105]],[[120415,120415],\"mapped\",[106]],[[120416,120416],\"mapped\",[107]],[[120417,120417],\"mapped\",[108]],[[120418,120418],\"mapped\",[109]],[[120419,120419],\"mapped\",[110]],[[120420,120420],\"mapped\",[111]],[[120421,120421],\"mapped\",[112]],[[120422,120422],\"mapped\",[113]],[[120423,120423],\"mapped\",[114]],[[120424,120424],\"mapped\",[115]],[[120425,120425],\"mapped\",[116]],[[120426,120426],\"mapped\",[117]],[[120427,120427],\"mapped\",[118]],[[120428,120428],\"mapped\",[119]],[[120429,120429],\"mapped\",[120]],[[120430,120430],\"mapped\",[121]],[[120431,120431],\"mapped\",[122]],[[120432,120432],\"mapped\",[97]],[[120433,120433],\"mapped\",[98]],[[120434,120434],\"mapped\",[99]],[[120435,120435],\"mapped\",[100]],[[120436,120436],\"mapped\",[101]],[[120437,120437],\"mapped\",[102]],[[120438,120438],\"mapped\",[103]],[[120439,120439],\"mapped\",[104]],[[120440,120440],\"mapped\",[105]],[[120441,120441],\"mapped\",[106]],[[120442,120442],\"mapped\",[107]],[[120443,120443],\"mapped\",[108]],[[120444,120444],\"mapped\",[109]],[[120445,120445],\"mapped\",[110]],[[120446,120446],\"mapped\",[111]],[[120447,120447],\"mapped\",[112]],[[120448,120448],\"mapped\",[113]],[[120449,120449],\"mapped\",[114]],[[120450,120450],\"mapped\",[115]],[[120451,120451],\"mapped\",[116]],[[120452,120452],\"mapped\",[117]],[[120453,120453],\"mapped\",[118]],[[120454,120454],\"mapped\",[119]],[[120455,120455],\"mapped\",[120]],[[120456,120456],\"mapped\",[121]],[[120457,120457],\"mapped\",[122]],[[120458,120458],\"mapped\",[97]],[[120459,120459],\"mapped\",[98]],[[120460,120460],\"mapped\",[99]],[[120461,120461],\"mapped\",[100]],[[120462,120462],\"mapped\",[101]],[[120463,120463],\"mapped\",[102]],[[120464,120464],\"mapped\",[103]],[[120465,120465],\"mapped\",[104]],[[120466,120466],\"mapped\",[105]],[[120467,120467],\"mapped\",[106]],[[120468,120468],\"mapped\",[107]],[[120469,120469],\"mapped\",[108]],[[120470,120470],\"mapped\",[109]],[[120471,120471],\"mapped\",[110]],[[120472,120472],\"mapped\",[111]],[[120473,120473],\"mapped\",[112]],[[120474,120474],\"mapped\",[113]],[[120475,120475],\"mapped\",[114]],[[120476,120476],\"mapped\",[115]],[[120477,120477],\"mapped\",[116]],[[120478,120478],\"mapped\",[117]],[[120479,120479],\"mapped\",[118]],[[120480,120480],\"mapped\",[119]],[[120481,120481],\"mapped\",[120]],[[120482,120482],\"mapped\",[121]],[[120483,120483],\"mapped\",[122]],[[120484,120484],\"mapped\",[305]],[[120485,120485],\"mapped\",[567]],[[120486,120487],\"disallowed\"],[[120488,120488],\"mapped\",[945]],[[120489,120489],\"mapped\",[946]],[[120490,120490],\"mapped\",[947]],[[120491,120491],\"mapped\",[948]],[[120492,120492],\"mapped\",[949]],[[120493,120493],\"mapped\",[950]],[[120494,120494],\"mapped\",[951]],[[120495,120495],\"mapped\",[952]],[[120496,120496],\"mapped\",[953]],[[120497,120497],\"mapped\",[954]],[[120498,120498],\"mapped\",[955]],[[120499,120499],\"mapped\",[956]],[[120500,120500],\"mapped\",[957]],[[120501,120501],\"mapped\",[958]],[[120502,120502],\"mapped\",[959]],[[120503,120503],\"mapped\",[960]],[[120504,120504],\"mapped\",[961]],[[120505,120505],\"mapped\",[952]],[[120506,120506],\"mapped\",[963]],[[120507,120507],\"mapped\",[964]],[[120508,120508],\"mapped\",[965]],[[120509,120509],\"mapped\",[966]],[[120510,120510],\"mapped\",[967]],[[120511,120511],\"mapped\",[968]],[[120512,120512],\"mapped\",[969]],[[120513,120513],\"mapped\",[8711]],[[120514,120514],\"mapped\",[945]],[[120515,120515],\"mapped\",[946]],[[120516,120516],\"mapped\",[947]],[[120517,120517],\"mapped\",[948]],[[120518,120518],\"mapped\",[949]],[[120519,120519],\"mapped\",[950]],[[120520,120520],\"mapped\",[951]],[[120521,120521],\"mapped\",[952]],[[120522,120522],\"mapped\",[953]],[[120523,120523],\"mapped\",[954]],[[120524,120524],\"mapped\",[955]],[[120525,120525],\"mapped\",[956]],[[120526,120526],\"mapped\",[957]],[[120527,120527],\"mapped\",[958]],[[120528,120528],\"mapped\",[959]],[[120529,120529],\"mapped\",[960]],[[120530,120530],\"mapped\",[961]],[[120531,120532],\"mapped\",[963]],[[120533,120533],\"mapped\",[964]],[[120534,120534],\"mapped\",[965]],[[120535,120535],\"mapped\",[966]],[[120536,120536],\"mapped\",[967]],[[120537,120537],\"mapped\",[968]],[[120538,120538],\"mapped\",[969]],[[120539,120539],\"mapped\",[8706]],[[120540,120540],\"mapped\",[949]],[[120541,120541],\"mapped\",[952]],[[120542,120542],\"mapped\",[954]],[[120543,120543],\"mapped\",[966]],[[120544,120544],\"mapped\",[961]],[[120545,120545],\"mapped\",[960]],[[120546,120546],\"mapped\",[945]],[[120547,120547],\"mapped\",[946]],[[120548,120548],\"mapped\",[947]],[[120549,120549],\"mapped\",[948]],[[120550,120550],\"mapped\",[949]],[[120551,120551],\"mapped\",[950]],[[120552,120552],\"mapped\",[951]],[[120553,120553],\"mapped\",[952]],[[120554,120554],\"mapped\",[953]],[[120555,120555],\"mapped\",[954]],[[120556,120556],\"mapped\",[955]],[[120557,120557],\"mapped\",[956]],[[120558,120558],\"mapped\",[957]],[[120559,120559],\"mapped\",[958]],[[120560,120560],\"mapped\",[959]],[[120561,120561],\"mapped\",[960]],[[120562,120562],\"mapped\",[961]],[[120563,120563],\"mapped\",[952]],[[120564,120564],\"mapped\",[963]],[[120565,120565],\"mapped\",[964]],[[120566,120566],\"mapped\",[965]],[[120567,120567],\"mapped\",[966]],[[120568,120568],\"mapped\",[967]],[[120569,120569],\"mapped\",[968]],[[120570,120570],\"mapped\",[969]],[[120571,120571],\"mapped\",[8711]],[[120572,120572],\"mapped\",[945]],[[120573,120573],\"mapped\",[946]],[[120574,120574],\"mapped\",[947]],[[120575,120575],\"mapped\",[948]],[[120576,120576],\"mapped\",[949]],[[120577,120577],\"mapped\",[950]],[[120578,120578],\"mapped\",[951]],[[120579,120579],\"mapped\",[952]],[[120580,120580],\"mapped\",[953]],[[120581,120581],\"mapped\",[954]],[[120582,120582],\"mapped\",[955]],[[120583,120583],\"mapped\",[956]],[[120584,120584],\"mapped\",[957]],[[120585,120585],\"mapped\",[958]],[[120586,120586],\"mapped\",[959]],[[120587,120587],\"mapped\",[960]],[[120588,120588],\"mapped\",[961]],[[120589,120590],\"mapped\",[963]],[[120591,120591],\"mapped\",[964]],[[120592,120592],\"mapped\",[965]],[[120593,120593],\"mapped\",[966]],[[120594,120594],\"mapped\",[967]],[[120595,120595],\"mapped\",[968]],[[120596,120596],\"mapped\",[969]],[[120597,120597],\"mapped\",[8706]],[[120598,120598],\"mapped\",[949]],[[120599,120599],\"mapped\",[952]],[[120600,120600],\"mapped\",[954]],[[120601,120601],\"mapped\",[966]],[[120602,120602],\"mapped\",[961]],[[120603,120603],\"mapped\",[960]],[[120604,120604],\"mapped\",[945]],[[120605,120605],\"mapped\",[946]],[[120606,120606],\"mapped\",[947]],[[120607,120607],\"mapped\",[948]],[[120608,120608],\"mapped\",[949]],[[120609,120609],\"mapped\",[950]],[[120610,120610],\"mapped\",[951]],[[120611,120611],\"mapped\",[952]],[[120612,120612],\"mapped\",[953]],[[120613,120613],\"mapped\",[954]],[[120614,120614],\"mapped\",[955]],[[120615,120615],\"mapped\",[956]],[[120616,120616],\"mapped\",[957]],[[120617,120617],\"mapped\",[958]],[[120618,120618],\"mapped\",[959]],[[120619,120619],\"mapped\",[960]],[[120620,120620],\"mapped\",[961]],[[120621,120621],\"mapped\",[952]],[[120622,120622],\"mapped\",[963]],[[120623,120623],\"mapped\",[964]],[[120624,120624],\"mapped\",[965]],[[120625,120625],\"mapped\",[966]],[[120626,120626],\"mapped\",[967]],[[120627,120627],\"mapped\",[968]],[[120628,120628],\"mapped\",[969]],[[120629,120629],\"mapped\",[8711]],[[120630,120630],\"mapped\",[945]],[[120631,120631],\"mapped\",[946]],[[120632,120632],\"mapped\",[947]],[[120633,120633],\"mapped\",[948]],[[120634,120634],\"mapped\",[949]],[[120635,120635],\"mapped\",[950]],[[120636,120636],\"mapped\",[951]],[[120637,120637],\"mapped\",[952]],[[120638,120638],\"mapped\",[953]],[[120639,120639],\"mapped\",[954]],[[120640,120640],\"mapped\",[955]],[[120641,120641],\"mapped\",[956]],[[120642,120642],\"mapped\",[957]],[[120643,120643],\"mapped\",[958]],[[120644,120644],\"mapped\",[959]],[[120645,120645],\"mapped\",[960]],[[120646,120646],\"mapped\",[961]],[[120647,120648],\"mapped\",[963]],[[120649,120649],\"mapped\",[964]],[[120650,120650],\"mapped\",[965]],[[120651,120651],\"mapped\",[966]],[[120652,120652],\"mapped\",[967]],[[120653,120653],\"mapped\",[968]],[[120654,120654],\"mapped\",[969]],[[120655,120655],\"mapped\",[8706]],[[120656,120656],\"mapped\",[949]],[[120657,120657],\"mapped\",[952]],[[120658,120658],\"mapped\",[954]],[[120659,120659],\"mapped\",[966]],[[120660,120660],\"mapped\",[961]],[[120661,120661],\"mapped\",[960]],[[120662,120662],\"mapped\",[945]],[[120663,120663],\"mapped\",[946]],[[120664,120664],\"mapped\",[947]],[[120665,120665],\"mapped\",[948]],[[120666,120666],\"mapped\",[949]],[[120667,120667],\"mapped\",[950]],[[120668,120668],\"mapped\",[951]],[[120669,120669],\"mapped\",[952]],[[120670,120670],\"mapped\",[953]],[[120671,120671],\"mapped\",[954]],[[120672,120672],\"mapped\",[955]],[[120673,120673],\"mapped\",[956]],[[120674,120674],\"mapped\",[957]],[[120675,120675],\"mapped\",[958]],[[120676,120676],\"mapped\",[959]],[[120677,120677],\"mapped\",[960]],[[120678,120678],\"mapped\",[961]],[[120679,120679],\"mapped\",[952]],[[120680,120680],\"mapped\",[963]],[[120681,120681],\"mapped\",[964]],[[120682,120682],\"mapped\",[965]],[[120683,120683],\"mapped\",[966]],[[120684,120684],\"mapped\",[967]],[[120685,120685],\"mapped\",[968]],[[120686,120686],\"mapped\",[969]],[[120687,120687],\"mapped\",[8711]],[[120688,120688],\"mapped\",[945]],[[120689,120689],\"mapped\",[946]],[[120690,120690],\"mapped\",[947]],[[120691,120691],\"mapped\",[948]],[[120692,120692],\"mapped\",[949]],[[120693,120693],\"mapped\",[950]],[[120694,120694],\"mapped\",[951]],[[120695,120695],\"mapped\",[952]],[[120696,120696],\"mapped\",[953]],[[120697,120697],\"mapped\",[954]],[[120698,120698],\"mapped\",[955]],[[120699,120699],\"mapped\",[956]],[[120700,120700],\"mapped\",[957]],[[120701,120701],\"mapped\",[958]],[[120702,120702],\"mapped\",[959]],[[120703,120703],\"mapped\",[960]],[[120704,120704],\"mapped\",[961]],[[120705,120706],\"mapped\",[963]],[[120707,120707],\"mapped\",[964]],[[120708,120708],\"mapped\",[965]],[[120709,120709],\"mapped\",[966]],[[120710,120710],\"mapped\",[967]],[[120711,120711],\"mapped\",[968]],[[120712,120712],\"mapped\",[969]],[[120713,120713],\"mapped\",[8706]],[[120714,120714],\"mapped\",[949]],[[120715,120715],\"mapped\",[952]],[[120716,120716],\"mapped\",[954]],[[120717,120717],\"mapped\",[966]],[[120718,120718],\"mapped\",[961]],[[120719,120719],\"mapped\",[960]],[[120720,120720],\"mapped\",[945]],[[120721,120721],\"mapped\",[946]],[[120722,120722],\"mapped\",[947]],[[120723,120723],\"mapped\",[948]],[[120724,120724],\"mapped\",[949]],[[120725,120725],\"mapped\",[950]],[[120726,120726],\"mapped\",[951]],[[120727,120727],\"mapped\",[952]],[[120728,120728],\"mapped\",[953]],[[120729,120729],\"mapped\",[954]],[[120730,120730],\"mapped\",[955]],[[120731,120731],\"mapped\",[956]],[[120732,120732],\"mapped\",[957]],[[120733,120733],\"mapped\",[958]],[[120734,120734],\"mapped\",[959]],[[120735,120735],\"mapped\",[960]],[[120736,120736],\"mapped\",[961]],[[120737,120737],\"mapped\",[952]],[[120738,120738],\"mapped\",[963]],[[120739,120739],\"mapped\",[964]],[[120740,120740],\"mapped\",[965]],[[120741,120741],\"mapped\",[966]],[[120742,120742],\"mapped\",[967]],[[120743,120743],\"mapped\",[968]],[[120744,120744],\"mapped\",[969]],[[120745,120745],\"mapped\",[8711]],[[120746,120746],\"mapped\",[945]],[[120747,120747],\"mapped\",[946]],[[120748,120748],\"mapped\",[947]],[[120749,120749],\"mapped\",[948]],[[120750,120750],\"mapped\",[949]],[[120751,120751],\"mapped\",[950]],[[120752,120752],\"mapped\",[951]],[[120753,120753],\"mapped\",[952]],[[120754,120754],\"mapped\",[953]],[[120755,120755],\"mapped\",[954]],[[120756,120756],\"mapped\",[955]],[[120757,120757],\"mapped\",[956]],[[120758,120758],\"mapped\",[957]],[[120759,120759],\"mapped\",[958]],[[120760,120760],\"mapped\",[959]],[[120761,120761],\"mapped\",[960]],[[120762,120762],\"mapped\",[961]],[[120763,120764],\"mapped\",[963]],[[120765,120765],\"mapped\",[964]],[[120766,120766],\"mapped\",[965]],[[120767,120767],\"mapped\",[966]],[[120768,120768],\"mapped\",[967]],[[120769,120769],\"mapped\",[968]],[[120770,120770],\"mapped\",[969]],[[120771,120771],\"mapped\",[8706]],[[120772,120772],\"mapped\",[949]],[[120773,120773],\"mapped\",[952]],[[120774,120774],\"mapped\",[954]],[[120775,120775],\"mapped\",[966]],[[120776,120776],\"mapped\",[961]],[[120777,120777],\"mapped\",[960]],[[120778,120779],\"mapped\",[989]],[[120780,120781],\"disallowed\"],[[120782,120782],\"mapped\",[48]],[[120783,120783],\"mapped\",[49]],[[120784,120784],\"mapped\",[50]],[[120785,120785],\"mapped\",[51]],[[120786,120786],\"mapped\",[52]],[[120787,120787],\"mapped\",[53]],[[120788,120788],\"mapped\",[54]],[[120789,120789],\"mapped\",[55]],[[120790,120790],\"mapped\",[56]],[[120791,120791],\"mapped\",[57]],[[120792,120792],\"mapped\",[48]],[[120793,120793],\"mapped\",[49]],[[120794,120794],\"mapped\",[50]],[[120795,120795],\"mapped\",[51]],[[120796,120796],\"mapped\",[52]],[[120797,120797],\"mapped\",[53]],[[120798,120798],\"mapped\",[54]],[[120799,120799],\"mapped\",[55]],[[120800,120800],\"mapped\",[56]],[[120801,120801],\"mapped\",[57]],[[120802,120802],\"mapped\",[48]],[[120803,120803],\"mapped\",[49]],[[120804,120804],\"mapped\",[50]],[[120805,120805],\"mapped\",[51]],[[120806,120806],\"mapped\",[52]],[[120807,120807],\"mapped\",[53]],[[120808,120808],\"mapped\",[54]],[[120809,120809],\"mapped\",[55]],[[120810,120810],\"mapped\",[56]],[[120811,120811],\"mapped\",[57]],[[120812,120812],\"mapped\",[48]],[[120813,120813],\"mapped\",[49]],[[120814,120814],\"mapped\",[50]],[[120815,120815],\"mapped\",[51]],[[120816,120816],\"mapped\",[52]],[[120817,120817],\"mapped\",[53]],[[120818,120818],\"mapped\",[54]],[[120819,120819],\"mapped\",[55]],[[120820,120820],\"mapped\",[56]],[[120821,120821],\"mapped\",[57]],[[120822,120822],\"mapped\",[48]],[[120823,120823],\"mapped\",[49]],[[120824,120824],\"mapped\",[50]],[[120825,120825],\"mapped\",[51]],[[120826,120826],\"mapped\",[52]],[[120827,120827],\"mapped\",[53]],[[120828,120828],\"mapped\",[54]],[[120829,120829],\"mapped\",[55]],[[120830,120830],\"mapped\",[56]],[[120831,120831],\"mapped\",[57]],[[120832,121343],\"valid\",[],\"NV8\"],[[121344,121398],\"valid\"],[[121399,121402],\"valid\",[],\"NV8\"],[[121403,121452],\"valid\"],[[121453,121460],\"valid\",[],\"NV8\"],[[121461,121461],\"valid\"],[[121462,121475],\"valid\",[],\"NV8\"],[[121476,121476],\"valid\"],[[121477,121483],\"valid\",[],\"NV8\"],[[121484,121498],\"disallowed\"],[[121499,121503],\"valid\"],[[121504,121504],\"disallowed\"],[[121505,121519],\"valid\"],[[121520,124927],\"disallowed\"],[[124928,125124],\"valid\"],[[125125,125126],\"disallowed\"],[[125127,125135],\"valid\",[],\"NV8\"],[[125136,125142],\"valid\"],[[125143,126463],\"disallowed\"],[[126464,126464],\"mapped\",[1575]],[[126465,126465],\"mapped\",[1576]],[[126466,126466],\"mapped\",[1580]],[[126467,126467],\"mapped\",[1583]],[[126468,126468],\"disallowed\"],[[126469,126469],\"mapped\",[1608]],[[126470,126470],\"mapped\",[1586]],[[126471,126471],\"mapped\",[1581]],[[126472,126472],\"mapped\",[1591]],[[126473,126473],\"mapped\",[1610]],[[126474,126474],\"mapped\",[1603]],[[126475,126475],\"mapped\",[1604]],[[126476,126476],\"mapped\",[1605]],[[126477,126477],\"mapped\",[1606]],[[126478,126478],\"mapped\",[1587]],[[126479,126479],\"mapped\",[1593]],[[126480,126480],\"mapped\",[1601]],[[126481,126481],\"mapped\",[1589]],[[126482,126482],\"mapped\",[1602]],[[126483,126483],\"mapped\",[1585]],[[126484,126484],\"mapped\",[1588]],[[126485,126485],\"mapped\",[1578]],[[126486,126486],\"mapped\",[1579]],[[126487,126487],\"mapped\",[1582]],[[126488,126488],\"mapped\",[1584]],[[126489,126489],\"mapped\",[1590]],[[126490,126490],\"mapped\",[1592]],[[126491,126491],\"mapped\",[1594]],[[126492,126492],\"mapped\",[1646]],[[126493,126493],\"mapped\",[1722]],[[126494,126494],\"mapped\",[1697]],[[126495,126495],\"mapped\",[1647]],[[126496,126496],\"disallowed\"],[[126497,126497],\"mapped\",[1576]],[[126498,126498],\"mapped\",[1580]],[[126499,126499],\"disallowed\"],[[126500,126500],\"mapped\",[1607]],[[126501,126502],\"disallowed\"],[[126503,126503],\"mapped\",[1581]],[[126504,126504],\"disallowed\"],[[126505,126505],\"mapped\",[1610]],[[126506,126506],\"mapped\",[1603]],[[126507,126507],\"mapped\",[1604]],[[126508,126508],\"mapped\",[1605]],[[126509,126509],\"mapped\",[1606]],[[126510,126510],\"mapped\",[1587]],[[126511,126511],\"mapped\",[1593]],[[126512,126512],\"mapped\",[1601]],[[126513,126513],\"mapped\",[1589]],[[126514,126514],\"mapped\",[1602]],[[126515,126515],\"disallowed\"],[[126516,126516],\"mapped\",[1588]],[[126517,126517],\"mapped\",[1578]],[[126518,126518],\"mapped\",[1579]],[[126519,126519],\"mapped\",[1582]],[[126520,126520],\"disallowed\"],[[126521,126521],\"mapped\",[1590]],[[126522,126522],\"disallowed\"],[[126523,126523],\"mapped\",[1594]],[[126524,126529],\"disallowed\"],[[126530,126530],\"mapped\",[1580]],[[126531,126534],\"disallowed\"],[[126535,126535],\"mapped\",[1581]],[[126536,126536],\"disallowed\"],[[126537,126537],\"mapped\",[1610]],[[126538,126538],\"disallowed\"],[[126539,126539],\"mapped\",[1604]],[[126540,126540],\"disallowed\"],[[126541,126541],\"mapped\",[1606]],[[126542,126542],\"mapped\",[1587]],[[126543,126543],\"mapped\",[1593]],[[126544,126544],\"disallowed\"],[[126545,126545],\"mapped\",[1589]],[[126546,126546],\"mapped\",[1602]],[[126547,126547],\"disallowed\"],[[126548,126548],\"mapped\",[1588]],[[126549,126550],\"disallowed\"],[[126551,126551],\"mapped\",[1582]],[[126552,126552],\"disallowed\"],[[126553,126553],\"mapped\",[1590]],[[126554,126554],\"disallowed\"],[[126555,126555],\"mapped\",[1594]],[[126556,126556],\"disallowed\"],[[126557,126557],\"mapped\",[1722]],[[126558,126558],\"disallowed\"],[[126559,126559],\"mapped\",[1647]],[[126560,126560],\"disallowed\"],[[126561,126561],\"mapped\",[1576]],[[126562,126562],\"mapped\",[1580]],[[126563,126563],\"disallowed\"],[[126564,126564],\"mapped\",[1607]],[[126565,126566],\"disallowed\"],[[126567,126567],\"mapped\",[1581]],[[126568,126568],\"mapped\",[1591]],[[126569,126569],\"mapped\",[1610]],[[126570,126570],\"mapped\",[1603]],[[126571,126571],\"disallowed\"],[[126572,126572],\"mapped\",[1605]],[[126573,126573],\"mapped\",[1606]],[[126574,126574],\"mapped\",[1587]],[[126575,126575],\"mapped\",[1593]],[[126576,126576],\"mapped\",[1601]],[[126577,126577],\"mapped\",[1589]],[[126578,126578],\"mapped\",[1602]],[[126579,126579],\"disallowed\"],[[126580,126580],\"mapped\",[1588]],[[126581,126581],\"mapped\",[1578]],[[126582,126582],\"mapped\",[1579]],[[126583,126583],\"mapped\",[1582]],[[126584,126584],\"disallowed\"],[[126585,126585],\"mapped\",[1590]],[[126586,126586],\"mapped\",[1592]],[[126587,126587],\"mapped\",[1594]],[[126588,126588],\"mapped\",[1646]],[[126589,126589],\"disallowed\"],[[126590,126590],\"mapped\",[1697]],[[126591,126591],\"disallowed\"],[[126592,126592],\"mapped\",[1575]],[[126593,126593],\"mapped\",[1576]],[[126594,126594],\"mapped\",[1580]],[[126595,126595],\"mapped\",[1583]],[[126596,126596],\"mapped\",[1607]],[[126597,126597],\"mapped\",[1608]],[[126598,126598],\"mapped\",[1586]],[[126599,126599],\"mapped\",[1581]],[[126600,126600],\"mapped\",[1591]],[[126601,126601],\"mapped\",[1610]],[[126602,126602],\"disallowed\"],[[126603,126603],\"mapped\",[1604]],[[126604,126604],\"mapped\",[1605]],[[126605,126605],\"mapped\",[1606]],[[126606,126606],\"mapped\",[1587]],[[126607,126607],\"mapped\",[1593]],[[126608,126608],\"mapped\",[1601]],[[126609,126609],\"mapped\",[1589]],[[126610,126610],\"mapped\",[1602]],[[126611,126611],\"mapped\",[1585]],[[126612,126612],\"mapped\",[1588]],[[126613,126613],\"mapped\",[1578]],[[126614,126614],\"mapped\",[1579]],[[126615,126615],\"mapped\",[1582]],[[126616,126616],\"mapped\",[1584]],[[126617,126617],\"mapped\",[1590]],[[126618,126618],\"mapped\",[1592]],[[126619,126619],\"mapped\",[1594]],[[126620,126624],\"disallowed\"],[[126625,126625],\"mapped\",[1576]],[[126626,126626],\"mapped\",[1580]],[[126627,126627],\"mapped\",[1583]],[[126628,126628],\"disallowed\"],[[126629,126629],\"mapped\",[1608]],[[126630,126630],\"mapped\",[1586]],[[126631,126631],\"mapped\",[1581]],[[126632,126632],\"mapped\",[1591]],[[126633,126633],\"mapped\",[1610]],[[126634,126634],\"disallowed\"],[[126635,126635],\"mapped\",[1604]],[[126636,126636],\"mapped\",[1605]],[[126637,126637],\"mapped\",[1606]],[[126638,126638],\"mapped\",[1587]],[[126639,126639],\"mapped\",[1593]],[[126640,126640],\"mapped\",[1601]],[[126641,126641],\"mapped\",[1589]],[[126642,126642],\"mapped\",[1602]],[[126643,126643],\"mapped\",[1585]],[[126644,126644],\"mapped\",[1588]],[[126645,126645],\"mapped\",[1578]],[[126646,126646],\"mapped\",[1579]],[[126647,126647],\"mapped\",[1582]],[[126648,126648],\"mapped\",[1584]],[[126649,126649],\"mapped\",[1590]],[[126650,126650],\"mapped\",[1592]],[[126651,126651],\"mapped\",[1594]],[[126652,126703],\"disallowed\"],[[126704,126705],\"valid\",[],\"NV8\"],[[126706,126975],\"disallowed\"],[[126976,127019],\"valid\",[],\"NV8\"],[[127020,127023],\"disallowed\"],[[127024,127123],\"valid\",[],\"NV8\"],[[127124,127135],\"disallowed\"],[[127136,127150],\"valid\",[],\"NV8\"],[[127151,127152],\"disallowed\"],[[127153,127166],\"valid\",[],\"NV8\"],[[127167,127167],\"valid\",[],\"NV8\"],[[127168,127168],\"disallowed\"],[[127169,127183],\"valid\",[],\"NV8\"],[[127184,127184],\"disallowed\"],[[127185,127199],\"valid\",[],\"NV8\"],[[127200,127221],\"valid\",[],\"NV8\"],[[127222,127231],\"disallowed\"],[[127232,127232],\"disallowed\"],[[127233,127233],\"disallowed_STD3_mapped\",[48,44]],[[127234,127234],\"disallowed_STD3_mapped\",[49,44]],[[127235,127235],\"disallowed_STD3_mapped\",[50,44]],[[127236,127236],\"disallowed_STD3_mapped\",[51,44]],[[127237,127237],\"disallowed_STD3_mapped\",[52,44]],[[127238,127238],\"disallowed_STD3_mapped\",[53,44]],[[127239,127239],\"disallowed_STD3_mapped\",[54,44]],[[127240,127240],\"disallowed_STD3_mapped\",[55,44]],[[127241,127241],\"disallowed_STD3_mapped\",[56,44]],[[127242,127242],\"disallowed_STD3_mapped\",[57,44]],[[127243,127244],\"valid\",[],\"NV8\"],[[127245,127247],\"disallowed\"],[[127248,127248],\"disallowed_STD3_mapped\",[40,97,41]],[[127249,127249],\"disallowed_STD3_mapped\",[40,98,41]],[[127250,127250],\"disallowed_STD3_mapped\",[40,99,41]],[[127251,127251],\"disallowed_STD3_mapped\",[40,100,41]],[[127252,127252],\"disallowed_STD3_mapped\",[40,101,41]],[[127253,127253],\"disallowed_STD3_mapped\",[40,102,41]],[[127254,127254],\"disallowed_STD3_mapped\",[40,103,41]],[[127255,127255],\"disallowed_STD3_mapped\",[40,104,41]],[[127256,127256],\"disallowed_STD3_mapped\",[40,105,41]],[[127257,127257],\"disallowed_STD3_mapped\",[40,106,41]],[[127258,127258],\"disallowed_STD3_mapped\",[40,107,41]],[[127259,127259],\"disallowed_STD3_mapped\",[40,108,41]],[[127260,127260],\"disallowed_STD3_mapped\",[40,109,41]],[[127261,127261],\"disallowed_STD3_mapped\",[40,110,41]],[[127262,127262],\"disallowed_STD3_mapped\",[40,111,41]],[[127263,127263],\"disallowed_STD3_mapped\",[40,112,41]],[[127264,127264],\"disallowed_STD3_mapped\",[40,113,41]],[[127265,127265],\"disallowed_STD3_mapped\",[40,114,41]],[[127266,127266],\"disallowed_STD3_mapped\",[40,115,41]],[[127267,127267],\"disallowed_STD3_mapped\",[40,116,41]],[[127268,127268],\"disallowed_STD3_mapped\",[40,117,41]],[[127269,127269],\"disallowed_STD3_mapped\",[40,118,41]],[[127270,127270],\"disallowed_STD3_mapped\",[40,119,41]],[[127271,127271],\"disallowed_STD3_mapped\",[40,120,41]],[[127272,127272],\"disallowed_STD3_mapped\",[40,121,41]],[[127273,127273],\"disallowed_STD3_mapped\",[40,122,41]],[[127274,127274],\"mapped\",[12308,115,12309]],[[127275,127275],\"mapped\",[99]],[[127276,127276],\"mapped\",[114]],[[127277,127277],\"mapped\",[99,100]],[[127278,127278],\"mapped\",[119,122]],[[127279,127279],\"disallowed\"],[[127280,127280],\"mapped\",[97]],[[127281,127281],\"mapped\",[98]],[[127282,127282],\"mapped\",[99]],[[127283,127283],\"mapped\",[100]],[[127284,127284],\"mapped\",[101]],[[127285,127285],\"mapped\",[102]],[[127286,127286],\"mapped\",[103]],[[127287,127287],\"mapped\",[104]],[[127288,127288],\"mapped\",[105]],[[127289,127289],\"mapped\",[106]],[[127290,127290],\"mapped\",[107]],[[127291,127291],\"mapped\",[108]],[[127292,127292],\"mapped\",[109]],[[127293,127293],\"mapped\",[110]],[[127294,127294],\"mapped\",[111]],[[127295,127295],\"mapped\",[112]],[[127296,127296],\"mapped\",[113]],[[127297,127297],\"mapped\",[114]],[[127298,127298],\"mapped\",[115]],[[127299,127299],\"mapped\",[116]],[[127300,127300],\"mapped\",[117]],[[127301,127301],\"mapped\",[118]],[[127302,127302],\"mapped\",[119]],[[127303,127303],\"mapped\",[120]],[[127304,127304],\"mapped\",[121]],[[127305,127305],\"mapped\",[122]],[[127306,127306],\"mapped\",[104,118]],[[127307,127307],\"mapped\",[109,118]],[[127308,127308],\"mapped\",[115,100]],[[127309,127309],\"mapped\",[115,115]],[[127310,127310],\"mapped\",[112,112,118]],[[127311,127311],\"mapped\",[119,99]],[[127312,127318],\"valid\",[],\"NV8\"],[[127319,127319],\"valid\",[],\"NV8\"],[[127320,127326],\"valid\",[],\"NV8\"],[[127327,127327],\"valid\",[],\"NV8\"],[[127328,127337],\"valid\",[],\"NV8\"],[[127338,127338],\"mapped\",[109,99]],[[127339,127339],\"mapped\",[109,100]],[[127340,127343],\"disallowed\"],[[127344,127352],\"valid\",[],\"NV8\"],[[127353,127353],\"valid\",[],\"NV8\"],[[127354,127354],\"valid\",[],\"NV8\"],[[127355,127356],\"valid\",[],\"NV8\"],[[127357,127358],\"valid\",[],\"NV8\"],[[127359,127359],\"valid\",[],\"NV8\"],[[127360,127369],\"valid\",[],\"NV8\"],[[127370,127373],\"valid\",[],\"NV8\"],[[127374,127375],\"valid\",[],\"NV8\"],[[127376,127376],\"mapped\",[100,106]],[[127377,127386],\"valid\",[],\"NV8\"],[[127387,127461],\"disallowed\"],[[127462,127487],\"valid\",[],\"NV8\"],[[127488,127488],\"mapped\",[12411,12363]],[[127489,127489],\"mapped\",[12467,12467]],[[127490,127490],\"mapped\",[12469]],[[127491,127503],\"disallowed\"],[[127504,127504],\"mapped\",[25163]],[[127505,127505],\"mapped\",[23383]],[[127506,127506],\"mapped\",[21452]],[[127507,127507],\"mapped\",[12487]],[[127508,127508],\"mapped\",[20108]],[[127509,127509],\"mapped\",[22810]],[[127510,127510],\"mapped\",[35299]],[[127511,127511],\"mapped\",[22825]],[[127512,127512],\"mapped\",[20132]],[[127513,127513],\"mapped\",[26144]],[[127514,127514],\"mapped\",[28961]],[[127515,127515],\"mapped\",[26009]],[[127516,127516],\"mapped\",[21069]],[[127517,127517],\"mapped\",[24460]],[[127518,127518],\"mapped\",[20877]],[[127519,127519],\"mapped\",[26032]],[[127520,127520],\"mapped\",[21021]],[[127521,127521],\"mapped\",[32066]],[[127522,127522],\"mapped\",[29983]],[[127523,127523],\"mapped\",[36009]],[[127524,127524],\"mapped\",[22768]],[[127525,127525],\"mapped\",[21561]],[[127526,127526],\"mapped\",[28436]],[[127527,127527],\"mapped\",[25237]],[[127528,127528],\"mapped\",[25429]],[[127529,127529],\"mapped\",[19968]],[[127530,127530],\"mapped\",[19977]],[[127531,127531],\"mapped\",[36938]],[[127532,127532],\"mapped\",[24038]],[[127533,127533],\"mapped\",[20013]],[[127534,127534],\"mapped\",[21491]],[[127535,127535],\"mapped\",[25351]],[[127536,127536],\"mapped\",[36208]],[[127537,127537],\"mapped\",[25171]],[[127538,127538],\"mapped\",[31105]],[[127539,127539],\"mapped\",[31354]],[[127540,127540],\"mapped\",[21512]],[[127541,127541],\"mapped\",[28288]],[[127542,127542],\"mapped\",[26377]],[[127543,127543],\"mapped\",[26376]],[[127544,127544],\"mapped\",[30003]],[[127545,127545],\"mapped\",[21106]],[[127546,127546],\"mapped\",[21942]],[[127547,127551],\"disallowed\"],[[127552,127552],\"mapped\",[12308,26412,12309]],[[127553,127553],\"mapped\",[12308,19977,12309]],[[127554,127554],\"mapped\",[12308,20108,12309]],[[127555,127555],\"mapped\",[12308,23433,12309]],[[127556,127556],\"mapped\",[12308,28857,12309]],[[127557,127557],\"mapped\",[12308,25171,12309]],[[127558,127558],\"mapped\",[12308,30423,12309]],[[127559,127559],\"mapped\",[12308,21213,12309]],[[127560,127560],\"mapped\",[12308,25943,12309]],[[127561,127567],\"disallowed\"],[[127568,127568],\"mapped\",[24471]],[[127569,127569],\"mapped\",[21487]],[[127570,127743],\"disallowed\"],[[127744,127776],\"valid\",[],\"NV8\"],[[127777,127788],\"valid\",[],\"NV8\"],[[127789,127791],\"valid\",[],\"NV8\"],[[127792,127797],\"valid\",[],\"NV8\"],[[127798,127798],\"valid\",[],\"NV8\"],[[127799,127868],\"valid\",[],\"NV8\"],[[127869,127869],\"valid\",[],\"NV8\"],[[127870,127871],\"valid\",[],\"NV8\"],[[127872,127891],\"valid\",[],\"NV8\"],[[127892,127903],\"valid\",[],\"NV8\"],[[127904,127940],\"valid\",[],\"NV8\"],[[127941,127941],\"valid\",[],\"NV8\"],[[127942,127946],\"valid\",[],\"NV8\"],[[127947,127950],\"valid\",[],\"NV8\"],[[127951,127955],\"valid\",[],\"NV8\"],[[127956,127967],\"valid\",[],\"NV8\"],[[127968,127984],\"valid\",[],\"NV8\"],[[127985,127991],\"valid\",[],\"NV8\"],[[127992,127999],\"valid\",[],\"NV8\"],[[128000,128062],\"valid\",[],\"NV8\"],[[128063,128063],\"valid\",[],\"NV8\"],[[128064,128064],\"valid\",[],\"NV8\"],[[128065,128065],\"valid\",[],\"NV8\"],[[128066,128247],\"valid\",[],\"NV8\"],[[128248,128248],\"valid\",[],\"NV8\"],[[128249,128252],\"valid\",[],\"NV8\"],[[128253,128254],\"valid\",[],\"NV8\"],[[128255,128255],\"valid\",[],\"NV8\"],[[128256,128317],\"valid\",[],\"NV8\"],[[128318,128319],\"valid\",[],\"NV8\"],[[128320,128323],\"valid\",[],\"NV8\"],[[128324,128330],\"valid\",[],\"NV8\"],[[128331,128335],\"valid\",[],\"NV8\"],[[128336,128359],\"valid\",[],\"NV8\"],[[128360,128377],\"valid\",[],\"NV8\"],[[128378,128378],\"disallowed\"],[[128379,128419],\"valid\",[],\"NV8\"],[[128420,128420],\"disallowed\"],[[128421,128506],\"valid\",[],\"NV8\"],[[128507,128511],\"valid\",[],\"NV8\"],[[128512,128512],\"valid\",[],\"NV8\"],[[128513,128528],\"valid\",[],\"NV8\"],[[128529,128529],\"valid\",[],\"NV8\"],[[128530,128532],\"valid\",[],\"NV8\"],[[128533,128533],\"valid\",[],\"NV8\"],[[128534,128534],\"valid\",[],\"NV8\"],[[128535,128535],\"valid\",[],\"NV8\"],[[128536,128536],\"valid\",[],\"NV8\"],[[128537,128537],\"valid\",[],\"NV8\"],[[128538,128538],\"valid\",[],\"NV8\"],[[128539,128539],\"valid\",[],\"NV8\"],[[128540,128542],\"valid\",[],\"NV8\"],[[128543,128543],\"valid\",[],\"NV8\"],[[128544,128549],\"valid\",[],\"NV8\"],[[128550,128551],\"valid\",[],\"NV8\"],[[128552,128555],\"valid\",[],\"NV8\"],[[128556,128556],\"valid\",[],\"NV8\"],[[128557,128557],\"valid\",[],\"NV8\"],[[128558,128559],\"valid\",[],\"NV8\"],[[128560,128563],\"valid\",[],\"NV8\"],[[128564,128564],\"valid\",[],\"NV8\"],[[128565,128576],\"valid\",[],\"NV8\"],[[128577,128578],\"valid\",[],\"NV8\"],[[128579,128580],\"valid\",[],\"NV8\"],[[128581,128591],\"valid\",[],\"NV8\"],[[128592,128639],\"valid\",[],\"NV8\"],[[128640,128709],\"valid\",[],\"NV8\"],[[128710,128719],\"valid\",[],\"NV8\"],[[128720,128720],\"valid\",[],\"NV8\"],[[128721,128735],\"disallowed\"],[[128736,128748],\"valid\",[],\"NV8\"],[[128749,128751],\"disallowed\"],[[128752,128755],\"valid\",[],\"NV8\"],[[128756,128767],\"disallowed\"],[[128768,128883],\"valid\",[],\"NV8\"],[[128884,128895],\"disallowed\"],[[128896,128980],\"valid\",[],\"NV8\"],[[128981,129023],\"disallowed\"],[[129024,129035],\"valid\",[],\"NV8\"],[[129036,129039],\"disallowed\"],[[129040,129095],\"valid\",[],\"NV8\"],[[129096,129103],\"disallowed\"],[[129104,129113],\"valid\",[],\"NV8\"],[[129114,129119],\"disallowed\"],[[129120,129159],\"valid\",[],\"NV8\"],[[129160,129167],\"disallowed\"],[[129168,129197],\"valid\",[],\"NV8\"],[[129198,129295],\"disallowed\"],[[129296,129304],\"valid\",[],\"NV8\"],[[129305,129407],\"disallowed\"],[[129408,129412],\"valid\",[],\"NV8\"],[[129413,129471],\"disallowed\"],[[129472,129472],\"valid\",[],\"NV8\"],[[129473,131069],\"disallowed\"],[[131070,131071],\"disallowed\"],[[131072,173782],\"valid\"],[[173783,173823],\"disallowed\"],[[173824,177972],\"valid\"],[[177973,177983],\"disallowed\"],[[177984,178205],\"valid\"],[[178206,178207],\"disallowed\"],[[178208,183969],\"valid\"],[[183970,194559],\"disallowed\"],[[194560,194560],\"mapped\",[20029]],[[194561,194561],\"mapped\",[20024]],[[194562,194562],\"mapped\",[20033]],[[194563,194563],\"mapped\",[131362]],[[194564,194564],\"mapped\",[20320]],[[194565,194565],\"mapped\",[20398]],[[194566,194566],\"mapped\",[20411]],[[194567,194567],\"mapped\",[20482]],[[194568,194568],\"mapped\",[20602]],[[194569,194569],\"mapped\",[20633]],[[194570,194570],\"mapped\",[20711]],[[194571,194571],\"mapped\",[20687]],[[194572,194572],\"mapped\",[13470]],[[194573,194573],\"mapped\",[132666]],[[194574,194574],\"mapped\",[20813]],[[194575,194575],\"mapped\",[20820]],[[194576,194576],\"mapped\",[20836]],[[194577,194577],\"mapped\",[20855]],[[194578,194578],\"mapped\",[132380]],[[194579,194579],\"mapped\",[13497]],[[194580,194580],\"mapped\",[20839]],[[194581,194581],\"mapped\",[20877]],[[194582,194582],\"mapped\",[132427]],[[194583,194583],\"mapped\",[20887]],[[194584,194584],\"mapped\",[20900]],[[194585,194585],\"mapped\",[20172]],[[194586,194586],\"mapped\",[20908]],[[194587,194587],\"mapped\",[20917]],[[194588,194588],\"mapped\",[168415]],[[194589,194589],\"mapped\",[20981]],[[194590,194590],\"mapped\",[20995]],[[194591,194591],\"mapped\",[13535]],[[194592,194592],\"mapped\",[21051]],[[194593,194593],\"mapped\",[21062]],[[194594,194594],\"mapped\",[21106]],[[194595,194595],\"mapped\",[21111]],[[194596,194596],\"mapped\",[13589]],[[194597,194597],\"mapped\",[21191]],[[194598,194598],\"mapped\",[21193]],[[194599,194599],\"mapped\",[21220]],[[194600,194600],\"mapped\",[21242]],[[194601,194601],\"mapped\",[21253]],[[194602,194602],\"mapped\",[21254]],[[194603,194603],\"mapped\",[21271]],[[194604,194604],\"mapped\",[21321]],[[194605,194605],\"mapped\",[21329]],[[194606,194606],\"mapped\",[21338]],[[194607,194607],\"mapped\",[21363]],[[194608,194608],\"mapped\",[21373]],[[194609,194611],\"mapped\",[21375]],[[194612,194612],\"mapped\",[133676]],[[194613,194613],\"mapped\",[28784]],[[194614,194614],\"mapped\",[21450]],[[194615,194615],\"mapped\",[21471]],[[194616,194616],\"mapped\",[133987]],[[194617,194617],\"mapped\",[21483]],[[194618,194618],\"mapped\",[21489]],[[194619,194619],\"mapped\",[21510]],[[194620,194620],\"mapped\",[21662]],[[194621,194621],\"mapped\",[21560]],[[194622,194622],\"mapped\",[21576]],[[194623,194623],\"mapped\",[21608]],[[194624,194624],\"mapped\",[21666]],[[194625,194625],\"mapped\",[21750]],[[194626,194626],\"mapped\",[21776]],[[194627,194627],\"mapped\",[21843]],[[194628,194628],\"mapped\",[21859]],[[194629,194630],\"mapped\",[21892]],[[194631,194631],\"mapped\",[21913]],[[194632,194632],\"mapped\",[21931]],[[194633,194633],\"mapped\",[21939]],[[194634,194634],\"mapped\",[21954]],[[194635,194635],\"mapped\",[22294]],[[194636,194636],\"mapped\",[22022]],[[194637,194637],\"mapped\",[22295]],[[194638,194638],\"mapped\",[22097]],[[194639,194639],\"mapped\",[22132]],[[194640,194640],\"mapped\",[20999]],[[194641,194641],\"mapped\",[22766]],[[194642,194642],\"mapped\",[22478]],[[194643,194643],\"mapped\",[22516]],[[194644,194644],\"mapped\",[22541]],[[194645,194645],\"mapped\",[22411]],[[194646,194646],\"mapped\",[22578]],[[194647,194647],\"mapped\",[22577]],[[194648,194648],\"mapped\",[22700]],[[194649,194649],\"mapped\",[136420]],[[194650,194650],\"mapped\",[22770]],[[194651,194651],\"mapped\",[22775]],[[194652,194652],\"mapped\",[22790]],[[194653,194653],\"mapped\",[22810]],[[194654,194654],\"mapped\",[22818]],[[194655,194655],\"mapped\",[22882]],[[194656,194656],\"mapped\",[136872]],[[194657,194657],\"mapped\",[136938]],[[194658,194658],\"mapped\",[23020]],[[194659,194659],\"mapped\",[23067]],[[194660,194660],\"mapped\",[23079]],[[194661,194661],\"mapped\",[23000]],[[194662,194662],\"mapped\",[23142]],[[194663,194663],\"mapped\",[14062]],[[194664,194664],\"disallowed\"],[[194665,194665],\"mapped\",[23304]],[[194666,194667],\"mapped\",[23358]],[[194668,194668],\"mapped\",[137672]],[[194669,194669],\"mapped\",[23491]],[[194670,194670],\"mapped\",[23512]],[[194671,194671],\"mapped\",[23527]],[[194672,194672],\"mapped\",[23539]],[[194673,194673],\"mapped\",[138008]],[[194674,194674],\"mapped\",[23551]],[[194675,194675],\"mapped\",[23558]],[[194676,194676],\"disallowed\"],[[194677,194677],\"mapped\",[23586]],[[194678,194678],\"mapped\",[14209]],[[194679,194679],\"mapped\",[23648]],[[194680,194680],\"mapped\",[23662]],[[194681,194681],\"mapped\",[23744]],[[194682,194682],\"mapped\",[23693]],[[194683,194683],\"mapped\",[138724]],[[194684,194684],\"mapped\",[23875]],[[194685,194685],\"mapped\",[138726]],[[194686,194686],\"mapped\",[23918]],[[194687,194687],\"mapped\",[23915]],[[194688,194688],\"mapped\",[23932]],[[194689,194689],\"mapped\",[24033]],[[194690,194690],\"mapped\",[24034]],[[194691,194691],\"mapped\",[14383]],[[194692,194692],\"mapped\",[24061]],[[194693,194693],\"mapped\",[24104]],[[194694,194694],\"mapped\",[24125]],[[194695,194695],\"mapped\",[24169]],[[194696,194696],\"mapped\",[14434]],[[194697,194697],\"mapped\",[139651]],[[194698,194698],\"mapped\",[14460]],[[194699,194699],\"mapped\",[24240]],[[194700,194700],\"mapped\",[24243]],[[194701,194701],\"mapped\",[24246]],[[194702,194702],\"mapped\",[24266]],[[194703,194703],\"mapped\",[172946]],[[194704,194704],\"mapped\",[24318]],[[194705,194706],\"mapped\",[140081]],[[194707,194707],\"mapped\",[33281]],[[194708,194709],\"mapped\",[24354]],[[194710,194710],\"mapped\",[14535]],[[194711,194711],\"mapped\",[144056]],[[194712,194712],\"mapped\",[156122]],[[194713,194713],\"mapped\",[24418]],[[194714,194714],\"mapped\",[24427]],[[194715,194715],\"mapped\",[14563]],[[194716,194716],\"mapped\",[24474]],[[194717,194717],\"mapped\",[24525]],[[194718,194718],\"mapped\",[24535]],[[194719,194719],\"mapped\",[24569]],[[194720,194720],\"mapped\",[24705]],[[194721,194721],\"mapped\",[14650]],[[194722,194722],\"mapped\",[14620]],[[194723,194723],\"mapped\",[24724]],[[194724,194724],\"mapped\",[141012]],[[194725,194725],\"mapped\",[24775]],[[194726,194726],\"mapped\",[24904]],[[194727,194727],\"mapped\",[24908]],[[194728,194728],\"mapped\",[24910]],[[194729,194729],\"mapped\",[24908]],[[194730,194730],\"mapped\",[24954]],[[194731,194731],\"mapped\",[24974]],[[194732,194732],\"mapped\",[25010]],[[194733,194733],\"mapped\",[24996]],[[194734,194734],\"mapped\",[25007]],[[194735,194735],\"mapped\",[25054]],[[194736,194736],\"mapped\",[25074]],[[194737,194737],\"mapped\",[25078]],[[194738,194738],\"mapped\",[25104]],[[194739,194739],\"mapped\",[25115]],[[194740,194740],\"mapped\",[25181]],[[194741,194741],\"mapped\",[25265]],[[194742,194742],\"mapped\",[25300]],[[194743,194743],\"mapped\",[25424]],[[194744,194744],\"mapped\",[142092]],[[194745,194745],\"mapped\",[25405]],[[194746,194746],\"mapped\",[25340]],[[194747,194747],\"mapped\",[25448]],[[194748,194748],\"mapped\",[25475]],[[194749,194749],\"mapped\",[25572]],[[194750,194750],\"mapped\",[142321]],[[194751,194751],\"mapped\",[25634]],[[194752,194752],\"mapped\",[25541]],[[194753,194753],\"mapped\",[25513]],[[194754,194754],\"mapped\",[14894]],[[194755,194755],\"mapped\",[25705]],[[194756,194756],\"mapped\",[25726]],[[194757,194757],\"mapped\",[25757]],[[194758,194758],\"mapped\",[25719]],[[194759,194759],\"mapped\",[14956]],[[194760,194760],\"mapped\",[25935]],[[194761,194761],\"mapped\",[25964]],[[194762,194762],\"mapped\",[143370]],[[194763,194763],\"mapped\",[26083]],[[194764,194764],\"mapped\",[26360]],[[194765,194765],\"mapped\",[26185]],[[194766,194766],\"mapped\",[15129]],[[194767,194767],\"mapped\",[26257]],[[194768,194768],\"mapped\",[15112]],[[194769,194769],\"mapped\",[15076]],[[194770,194770],\"mapped\",[20882]],[[194771,194771],\"mapped\",[20885]],[[194772,194772],\"mapped\",[26368]],[[194773,194773],\"mapped\",[26268]],[[194774,194774],\"mapped\",[32941]],[[194775,194775],\"mapped\",[17369]],[[194776,194776],\"mapped\",[26391]],[[194777,194777],\"mapped\",[26395]],[[194778,194778],\"mapped\",[26401]],[[194779,194779],\"mapped\",[26462]],[[194780,194780],\"mapped\",[26451]],[[194781,194781],\"mapped\",[144323]],[[194782,194782],\"mapped\",[15177]],[[194783,194783],\"mapped\",[26618]],[[194784,194784],\"mapped\",[26501]],[[194785,194785],\"mapped\",[26706]],[[194786,194786],\"mapped\",[26757]],[[194787,194787],\"mapped\",[144493]],[[194788,194788],\"mapped\",[26766]],[[194789,194789],\"mapped\",[26655]],[[194790,194790],\"mapped\",[26900]],[[194791,194791],\"mapped\",[15261]],[[194792,194792],\"mapped\",[26946]],[[194793,194793],\"mapped\",[27043]],[[194794,194794],\"mapped\",[27114]],[[194795,194795],\"mapped\",[27304]],[[194796,194796],\"mapped\",[145059]],[[194797,194797],\"mapped\",[27355]],[[194798,194798],\"mapped\",[15384]],[[194799,194799],\"mapped\",[27425]],[[194800,194800],\"mapped\",[145575]],[[194801,194801],\"mapped\",[27476]],[[194802,194802],\"mapped\",[15438]],[[194803,194803],\"mapped\",[27506]],[[194804,194804],\"mapped\",[27551]],[[194805,194805],\"mapped\",[27578]],[[194806,194806],\"mapped\",[27579]],[[194807,194807],\"mapped\",[146061]],[[194808,194808],\"mapped\",[138507]],[[194809,194809],\"mapped\",[146170]],[[194810,194810],\"mapped\",[27726]],[[194811,194811],\"mapped\",[146620]],[[194812,194812],\"mapped\",[27839]],[[194813,194813],\"mapped\",[27853]],[[194814,194814],\"mapped\",[27751]],[[194815,194815],\"mapped\",[27926]],[[194816,194816],\"mapped\",[27966]],[[194817,194817],\"mapped\",[28023]],[[194818,194818],\"mapped\",[27969]],[[194819,194819],\"mapped\",[28009]],[[194820,194820],\"mapped\",[28024]],[[194821,194821],\"mapped\",[28037]],[[194822,194822],\"mapped\",[146718]],[[194823,194823],\"mapped\",[27956]],[[194824,194824],\"mapped\",[28207]],[[194825,194825],\"mapped\",[28270]],[[194826,194826],\"mapped\",[15667]],[[194827,194827],\"mapped\",[28363]],[[194828,194828],\"mapped\",[28359]],[[194829,194829],\"mapped\",[147153]],[[194830,194830],\"mapped\",[28153]],[[194831,194831],\"mapped\",[28526]],[[194832,194832],\"mapped\",[147294]],[[194833,194833],\"mapped\",[147342]],[[194834,194834],\"mapped\",[28614]],[[194835,194835],\"mapped\",[28729]],[[194836,194836],\"mapped\",[28702]],[[194837,194837],\"mapped\",[28699]],[[194838,194838],\"mapped\",[15766]],[[194839,194839],\"mapped\",[28746]],[[194840,194840],\"mapped\",[28797]],[[194841,194841],\"mapped\",[28791]],[[194842,194842],\"mapped\",[28845]],[[194843,194843],\"mapped\",[132389]],[[194844,194844],\"mapped\",[28997]],[[194845,194845],\"mapped\",[148067]],[[194846,194846],\"mapped\",[29084]],[[194847,194847],\"disallowed\"],[[194848,194848],\"mapped\",[29224]],[[194849,194849],\"mapped\",[29237]],[[194850,194850],\"mapped\",[29264]],[[194851,194851],\"mapped\",[149000]],[[194852,194852],\"mapped\",[29312]],[[194853,194853],\"mapped\",[29333]],[[194854,194854],\"mapped\",[149301]],[[194855,194855],\"mapped\",[149524]],[[194856,194856],\"mapped\",[29562]],[[194857,194857],\"mapped\",[29579]],[[194858,194858],\"mapped\",[16044]],[[194859,194859],\"mapped\",[29605]],[[194860,194861],\"mapped\",[16056]],[[194862,194862],\"mapped\",[29767]],[[194863,194863],\"mapped\",[29788]],[[194864,194864],\"mapped\",[29809]],[[194865,194865],\"mapped\",[29829]],[[194866,194866],\"mapped\",[29898]],[[194867,194867],\"mapped\",[16155]],[[194868,194868],\"mapped\",[29988]],[[194869,194869],\"mapped\",[150582]],[[194870,194870],\"mapped\",[30014]],[[194871,194871],\"mapped\",[150674]],[[194872,194872],\"mapped\",[30064]],[[194873,194873],\"mapped\",[139679]],[[194874,194874],\"mapped\",[30224]],[[194875,194875],\"mapped\",[151457]],[[194876,194876],\"mapped\",[151480]],[[194877,194877],\"mapped\",[151620]],[[194878,194878],\"mapped\",[16380]],[[194879,194879],\"mapped\",[16392]],[[194880,194880],\"mapped\",[30452]],[[194881,194881],\"mapped\",[151795]],[[194882,194882],\"mapped\",[151794]],[[194883,194883],\"mapped\",[151833]],[[194884,194884],\"mapped\",[151859]],[[194885,194885],\"mapped\",[30494]],[[194886,194887],\"mapped\",[30495]],[[194888,194888],\"mapped\",[30538]],[[194889,194889],\"mapped\",[16441]],[[194890,194890],\"mapped\",[30603]],[[194891,194891],\"mapped\",[16454]],[[194892,194892],\"mapped\",[16534]],[[194893,194893],\"mapped\",[152605]],[[194894,194894],\"mapped\",[30798]],[[194895,194895],\"mapped\",[30860]],[[194896,194896],\"mapped\",[30924]],[[194897,194897],\"mapped\",[16611]],[[194898,194898],\"mapped\",[153126]],[[194899,194899],\"mapped\",[31062]],[[194900,194900],\"mapped\",[153242]],[[194901,194901],\"mapped\",[153285]],[[194902,194902],\"mapped\",[31119]],[[194903,194903],\"mapped\",[31211]],[[194904,194904],\"mapped\",[16687]],[[194905,194905],\"mapped\",[31296]],[[194906,194906],\"mapped\",[31306]],[[194907,194907],\"mapped\",[31311]],[[194908,194908],\"mapped\",[153980]],[[194909,194910],\"mapped\",[154279]],[[194911,194911],\"disallowed\"],[[194912,194912],\"mapped\",[16898]],[[194913,194913],\"mapped\",[154539]],[[194914,194914],\"mapped\",[31686]],[[194915,194915],\"mapped\",[31689]],[[194916,194916],\"mapped\",[16935]],[[194917,194917],\"mapped\",[154752]],[[194918,194918],\"mapped\",[31954]],[[194919,194919],\"mapped\",[17056]],[[194920,194920],\"mapped\",[31976]],[[194921,194921],\"mapped\",[31971]],[[194922,194922],\"mapped\",[32000]],[[194923,194923],\"mapped\",[155526]],[[194924,194924],\"mapped\",[32099]],[[194925,194925],\"mapped\",[17153]],[[194926,194926],\"mapped\",[32199]],[[194927,194927],\"mapped\",[32258]],[[194928,194928],\"mapped\",[32325]],[[194929,194929],\"mapped\",[17204]],[[194930,194930],\"mapped\",[156200]],[[194931,194931],\"mapped\",[156231]],[[194932,194932],\"mapped\",[17241]],[[194933,194933],\"mapped\",[156377]],[[194934,194934],\"mapped\",[32634]],[[194935,194935],\"mapped\",[156478]],[[194936,194936],\"mapped\",[32661]],[[194937,194937],\"mapped\",[32762]],[[194938,194938],\"mapped\",[32773]],[[194939,194939],\"mapped\",[156890]],[[194940,194940],\"mapped\",[156963]],[[194941,194941],\"mapped\",[32864]],[[194942,194942],\"mapped\",[157096]],[[194943,194943],\"mapped\",[32880]],[[194944,194944],\"mapped\",[144223]],[[194945,194945],\"mapped\",[17365]],[[194946,194946],\"mapped\",[32946]],[[194947,194947],\"mapped\",[33027]],[[194948,194948],\"mapped\",[17419]],[[194949,194949],\"mapped\",[33086]],[[194950,194950],\"mapped\",[23221]],[[194951,194951],\"mapped\",[157607]],[[194952,194952],\"mapped\",[157621]],[[194953,194953],\"mapped\",[144275]],[[194954,194954],\"mapped\",[144284]],[[194955,194955],\"mapped\",[33281]],[[194956,194956],\"mapped\",[33284]],[[194957,194957],\"mapped\",[36766]],[[194958,194958],\"mapped\",[17515]],[[194959,194959],\"mapped\",[33425]],[[194960,194960],\"mapped\",[33419]],[[194961,194961],\"mapped\",[33437]],[[194962,194962],\"mapped\",[21171]],[[194963,194963],\"mapped\",[33457]],[[194964,194964],\"mapped\",[33459]],[[194965,194965],\"mapped\",[33469]],[[194966,194966],\"mapped\",[33510]],[[194967,194967],\"mapped\",[158524]],[[194968,194968],\"mapped\",[33509]],[[194969,194969],\"mapped\",[33565]],[[194970,194970],\"mapped\",[33635]],[[194971,194971],\"mapped\",[33709]],[[194972,194972],\"mapped\",[33571]],[[194973,194973],\"mapped\",[33725]],[[194974,194974],\"mapped\",[33767]],[[194975,194975],\"mapped\",[33879]],[[194976,194976],\"mapped\",[33619]],[[194977,194977],\"mapped\",[33738]],[[194978,194978],\"mapped\",[33740]],[[194979,194979],\"mapped\",[33756]],[[194980,194980],\"mapped\",[158774]],[[194981,194981],\"mapped\",[159083]],[[194982,194982],\"mapped\",[158933]],[[194983,194983],\"mapped\",[17707]],[[194984,194984],\"mapped\",[34033]],[[194985,194985],\"mapped\",[34035]],[[194986,194986],\"mapped\",[34070]],[[194987,194987],\"mapped\",[160714]],[[194988,194988],\"mapped\",[34148]],[[194989,194989],\"mapped\",[159532]],[[194990,194990],\"mapped\",[17757]],[[194991,194991],\"mapped\",[17761]],[[194992,194992],\"mapped\",[159665]],[[194993,194993],\"mapped\",[159954]],[[194994,194994],\"mapped\",[17771]],[[194995,194995],\"mapped\",[34384]],[[194996,194996],\"mapped\",[34396]],[[194997,194997],\"mapped\",[34407]],[[194998,194998],\"mapped\",[34409]],[[194999,194999],\"mapped\",[34473]],[[195000,195000],\"mapped\",[34440]],[[195001,195001],\"mapped\",[34574]],[[195002,195002],\"mapped\",[34530]],[[195003,195003],\"mapped\",[34681]],[[195004,195004],\"mapped\",[34600]],[[195005,195005],\"mapped\",[34667]],[[195006,195006],\"mapped\",[34694]],[[195007,195007],\"disallowed\"],[[195008,195008],\"mapped\",[34785]],[[195009,195009],\"mapped\",[34817]],[[195010,195010],\"mapped\",[17913]],[[195011,195011],\"mapped\",[34912]],[[195012,195012],\"mapped\",[34915]],[[195013,195013],\"mapped\",[161383]],[[195014,195014],\"mapped\",[35031]],[[195015,195015],\"mapped\",[35038]],[[195016,195016],\"mapped\",[17973]],[[195017,195017],\"mapped\",[35066]],[[195018,195018],\"mapped\",[13499]],[[195019,195019],\"mapped\",[161966]],[[195020,195020],\"mapped\",[162150]],[[195021,195021],\"mapped\",[18110]],[[195022,195022],\"mapped\",[18119]],[[195023,195023],\"mapped\",[35488]],[[195024,195024],\"mapped\",[35565]],[[195025,195025],\"mapped\",[35722]],[[195026,195026],\"mapped\",[35925]],[[195027,195027],\"mapped\",[162984]],[[195028,195028],\"mapped\",[36011]],[[195029,195029],\"mapped\",[36033]],[[195030,195030],\"mapped\",[36123]],[[195031,195031],\"mapped\",[36215]],[[195032,195032],\"mapped\",[163631]],[[195033,195033],\"mapped\",[133124]],[[195034,195034],\"mapped\",[36299]],[[195035,195035],\"mapped\",[36284]],[[195036,195036],\"mapped\",[36336]],[[195037,195037],\"mapped\",[133342]],[[195038,195038],\"mapped\",[36564]],[[195039,195039],\"mapped\",[36664]],[[195040,195040],\"mapped\",[165330]],[[195041,195041],\"mapped\",[165357]],[[195042,195042],\"mapped\",[37012]],[[195043,195043],\"mapped\",[37105]],[[195044,195044],\"mapped\",[37137]],[[195045,195045],\"mapped\",[165678]],[[195046,195046],\"mapped\",[37147]],[[195047,195047],\"mapped\",[37432]],[[195048,195048],\"mapped\",[37591]],[[195049,195049],\"mapped\",[37592]],[[195050,195050],\"mapped\",[37500]],[[195051,195051],\"mapped\",[37881]],[[195052,195052],\"mapped\",[37909]],[[195053,195053],\"mapped\",[166906]],[[195054,195054],\"mapped\",[38283]],[[195055,195055],\"mapped\",[18837]],[[195056,195056],\"mapped\",[38327]],[[195057,195057],\"mapped\",[167287]],[[195058,195058],\"mapped\",[18918]],[[195059,195059],\"mapped\",[38595]],[[195060,195060],\"mapped\",[23986]],[[195061,195061],\"mapped\",[38691]],[[195062,195062],\"mapped\",[168261]],[[195063,195063],\"mapped\",[168474]],[[195064,195064],\"mapped\",[19054]],[[195065,195065],\"mapped\",[19062]],[[195066,195066],\"mapped\",[38880]],[[195067,195067],\"mapped\",[168970]],[[195068,195068],\"mapped\",[19122]],[[195069,195069],\"mapped\",[169110]],[[195070,195071],\"mapped\",[38923]],[[195072,195072],\"mapped\",[38953]],[[195073,195073],\"mapped\",[169398]],[[195074,195074],\"mapped\",[39138]],[[195075,195075],\"mapped\",[19251]],[[195076,195076],\"mapped\",[39209]],[[195077,195077],\"mapped\",[39335]],[[195078,195078],\"mapped\",[39362]],[[195079,195079],\"mapped\",[39422]],[[195080,195080],\"mapped\",[19406]],[[195081,195081],\"mapped\",[170800]],[[195082,195082],\"mapped\",[39698]],[[195083,195083],\"mapped\",[40000]],[[195084,195084],\"mapped\",[40189]],[[195085,195085],\"mapped\",[19662]],[[195086,195086],\"mapped\",[19693]],[[195087,195087],\"mapped\",[40295]],[[195088,195088],\"mapped\",[172238]],[[195089,195089],\"mapped\",[19704]],[[195090,195090],\"mapped\",[172293]],[[195091,195091],\"mapped\",[172558]],[[195092,195092],\"mapped\",[172689]],[[195093,195093],\"mapped\",[40635]],[[195094,195094],\"mapped\",[19798]],[[195095,195095],\"mapped\",[40697]],[[195096,195096],\"mapped\",[40702]],[[195097,195097],\"mapped\",[40709]],[[195098,195098],\"mapped\",[40719]],[[195099,195099],\"mapped\",[40726]],[[195100,195100],\"mapped\",[40763]],[[195101,195101],\"mapped\",[173568]],[[195102,196605],\"disallowed\"],[[196606,196607],\"disallowed\"],[[196608,262141],\"disallowed\"],[[262142,262143],\"disallowed\"],[[262144,327677],\"disallowed\"],[[327678,327679],\"disallowed\"],[[327680,393213],\"disallowed\"],[[393214,393215],\"disallowed\"],[[393216,458749],\"disallowed\"],[[458750,458751],\"disallowed\"],[[458752,524285],\"disallowed\"],[[524286,524287],\"disallowed\"],[[524288,589821],\"disallowed\"],[[589822,589823],\"disallowed\"],[[589824,655357],\"disallowed\"],[[655358,655359],\"disallowed\"],[[655360,720893],\"disallowed\"],[[720894,720895],\"disallowed\"],[[720896,786429],\"disallowed\"],[[786430,786431],\"disallowed\"],[[786432,851965],\"disallowed\"],[[851966,851967],\"disallowed\"],[[851968,917501],\"disallowed\"],[[917502,917503],\"disallowed\"],[[917504,917504],\"disallowed\"],[[917505,917505],\"disallowed\"],[[917506,917535],\"disallowed\"],[[917536,917631],\"disallowed\"],[[917632,917759],\"disallowed\"],[[917760,917999],\"ignored\"],[[918000,983037],\"disallowed\"],[[983038,983039],\"disallowed\"],[[983040,1048573],\"disallowed\"],[[1048574,1048575],\"disallowed\"],[[1048576,1114109],\"disallowed\"],[[1114110,1114111],\"disallowed\"]]", "\"use strict\";\n\nvar punycode = require(\"punycode\");\nvar mappingTable = require(\"./lib/mappingTable.json\");\n\nvar PROCESSING_OPTIONS = {\n  TRANSITIONAL: 0,\n  NONTRANSITIONAL: 1\n};\n\nfunction normalize(str) { // fix bug in v8\n  return str.split('\\u0000').map(function (s) { return s.normalize('NFC'); }).join('\\u0000');\n}\n\nfunction findStatus(val) {\n  var start = 0;\n  var end = mappingTable.length - 1;\n\n  while (start <= end) {\n    var mid = Math.floor((start + end) / 2);\n\n    var target = mappingTable[mid];\n    if (target[0][0] <= val && target[0][1] >= val) {\n      return target;\n    } else if (target[0][0] > val) {\n      end = mid - 1;\n    } else {\n      start = mid + 1;\n    }\n  }\n\n  return null;\n}\n\nvar regexAstralSymbols = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\n\nfunction countSymbols(string) {\n  return string\n    // replace every surrogate pair with a BMP symbol\n    .replace(regexAstralSymbols, '_')\n    // then get the length\n    .length;\n}\n\nfunction mapChars(domain_name, useSTD3, processing_option) {\n  var hasError = false;\n  var processed = \"\";\n\n  var len = countSymbols(domain_name);\n  for (var i = 0; i < len; ++i) {\n    var codePoint = domain_name.codePointAt(i);\n    var status = findStatus(codePoint);\n\n    switch (status[1]) {\n      case \"disallowed\":\n        hasError = true;\n        processed += String.fromCodePoint(codePoint);\n        break;\n      case \"ignored\":\n        break;\n      case \"mapped\":\n        processed += String.fromCodePoint.apply(String, status[2]);\n        break;\n      case \"deviation\":\n        if (processing_option === PROCESSING_OPTIONS.TRANSITIONAL) {\n          processed += String.fromCodePoint.apply(String, status[2]);\n        } else {\n          processed += String.fromCodePoint(codePoint);\n        }\n        break;\n      case \"valid\":\n        processed += String.fromCodePoint(codePoint);\n        break;\n      case \"disallowed_STD3_mapped\":\n        if (useSTD3) {\n          hasError = true;\n          processed += String.fromCodePoint(codePoint);\n        } else {\n          processed += String.fromCodePoint.apply(String, status[2]);\n        }\n        break;\n      case \"disallowed_STD3_valid\":\n        if (useSTD3) {\n          hasError = true;\n        }\n\n        processed += String.fromCodePoint(codePoint);\n        break;\n    }\n  }\n\n  return {\n    string: processed,\n    error: hasError\n  };\n}\n\nvar combiningMarksRegex = /[\\u0300-\\u036F\\u0483-\\u0489\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08E4-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u0A01-\\u0A03\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AE2\\u0AE3\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C00-\\u0C03\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81-\\u0C83\\u0CBC\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D01-\\u0D03\\u0D3E-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D82\\u0D83\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102B-\\u103E\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F\\u109A-\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4-\\u17D3\\u17DD\\u180B-\\u180D\\u18A9\\u1920-\\u192B\\u1930-\\u193B\\u19B0-\\u19C0\\u19C8\\u19C9\\u1A17-\\u1A1B\\u1A55-\\u1A5E\\u1A60-\\u1A7C\\u1A7F\\u1AB0-\\u1ABE\\u1B00-\\u1B04\\u1B34-\\u1B44\\u1B6B-\\u1B73\\u1B80-\\u1B82\\u1BA1-\\u1BAD\\u1BE6-\\u1BF3\\u1C24-\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE8\\u1CED\\u1CF2-\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF5\\u1DFC-\\u1DFF\\u20D0-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F-\\uA672\\uA674-\\uA67D\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA823-\\uA827\\uA880\\uA881\\uA8B4-\\uA8C4\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA953\\uA980-\\uA983\\uA9B3-\\uA9C0\\uA9E5\\uAA29-\\uAA36\\uAA43\\uAA4C\\uAA4D\\uAA7B-\\uAA7D\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEB-\\uAAEF\\uAAF5\\uAAF6\\uABE3-\\uABEA\\uABEC\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2D]|\\uD800[\\uDDFD\\uDEE0\\uDF76-\\uDF7A]|\\uD802[\\uDE01-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE0F\\uDE38-\\uDE3A\\uDE3F\\uDEE5\\uDEE6]|\\uD804[\\uDC00-\\uDC02\\uDC38-\\uDC46\\uDC7F-\\uDC82\\uDCB0-\\uDCBA\\uDD00-\\uDD02\\uDD27-\\uDD34\\uDD73\\uDD80-\\uDD82\\uDDB3-\\uDDC0\\uDE2C-\\uDE37\\uDEDF-\\uDEEA\\uDF01-\\uDF03\\uDF3C\\uDF3E-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF57\\uDF62\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDCB0-\\uDCC3\\uDDAF-\\uDDB5\\uDDB8-\\uDDC0\\uDE30-\\uDE40\\uDEAB-\\uDEB7]|\\uD81A[\\uDEF0-\\uDEF4\\uDF30-\\uDF36]|\\uD81B[\\uDF51-\\uDF7E\\uDF8F-\\uDF92]|\\uD82F[\\uDC9D\\uDC9E]|\\uD834[\\uDD65-\\uDD69\\uDD6D-\\uDD72\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD83A[\\uDCD0-\\uDCD6]|\\uDB40[\\uDD00-\\uDDEF]/;\n\nfunction validateLabel(label, processing_option) {\n  if (label.substr(0, 4) === \"xn--\") {\n    label = punycode.toUnicode(label);\n    processing_option = PROCESSING_OPTIONS.NONTRANSITIONAL;\n  }\n\n  var error = false;\n\n  if (normalize(label) !== label ||\n      (label[3] === \"-\" && label[4] === \"-\") ||\n      label[0] === \"-\" || label[label.length - 1] === \"-\" ||\n      label.indexOf(\".\") !== -1 ||\n      label.search(combiningMarksRegex) === 0) {\n    error = true;\n  }\n\n  var len = countSymbols(label);\n  for (var i = 0; i < len; ++i) {\n    var status = findStatus(label.codePointAt(i));\n    if ((processing === PROCESSING_OPTIONS.TRANSITIONAL && status[1] !== \"valid\") ||\n        (processing === PROCESSING_OPTIONS.NONTRANSITIONAL &&\n         status[1] !== \"valid\" && status[1] !== \"deviation\")) {\n      error = true;\n      break;\n    }\n  }\n\n  return {\n    label: label,\n    error: error\n  };\n}\n\nfunction processing(domain_name, useSTD3, processing_option) {\n  var result = mapChars(domain_name, useSTD3, processing_option);\n  result.string = normalize(result.string);\n\n  var labels = result.string.split(\".\");\n  for (var i = 0; i < labels.length; ++i) {\n    try {\n      var validation = validateLabel(labels[i]);\n      labels[i] = validation.label;\n      result.error = result.error || validation.error;\n    } catch(e) {\n      result.error = true;\n    }\n  }\n\n  return {\n    string: labels.join(\".\"),\n    error: result.error\n  };\n}\n\nmodule.exports.toASCII = function(domain_name, useSTD3, processing_option, verifyDnsLength) {\n  var result = processing(domain_name, useSTD3, processing_option);\n  var labels = result.string.split(\".\");\n  labels = labels.map(function(l) {\n    try {\n      return punycode.toASCII(l);\n    } catch(e) {\n      result.error = true;\n      return l;\n    }\n  });\n\n  if (verifyDnsLength) {\n    var total = labels.slice(0, labels.length - 1).join(\".\").length;\n    if (total.length > 253 || total.length === 0) {\n      result.error = true;\n    }\n\n    for (var i=0; i < labels.length; ++i) {\n      if (labels.length > 63 || labels.length === 0) {\n        result.error = true;\n        break;\n      }\n    }\n  }\n\n  if (result.error) return null;\n  return labels.join(\".\");\n};\n\nmodule.exports.toUnicode = function(domain_name, useSTD3) {\n  var result = processing(domain_name, useSTD3, PROCESSING_OPTIONS.NONTRANSITIONAL);\n\n  return {\n    domain: result.string,\n    error: result.error\n  };\n};\n\nmodule.exports.PROCESSING_OPTIONS = PROCESSING_OPTIONS;\n", "\"use strict\";\r\nconst punycode = require(\"punycode\");\r\nconst tr46 = require(\"tr46\");\r\n\r\nconst specialSchemes = {\r\n  ftp: 21,\r\n  file: null,\r\n  gopher: 70,\r\n  http: 80,\r\n  https: 443,\r\n  ws: 80,\r\n  wss: 443\r\n};\r\n\r\nconst failure = Symbol(\"failure\");\r\n\r\nfunction countSymbols(str) {\r\n  return punycode.ucs2.decode(str).length;\r\n}\r\n\r\nfunction at(input, idx) {\r\n  const c = input[idx];\r\n  return isNaN(c) ? undefined : String.fromCodePoint(c);\r\n}\r\n\r\nfunction isASCIIDigit(c) {\r\n  return c >= 0x30 && c <= 0x39;\r\n}\r\n\r\nfunction isASCIIAlpha(c) {\r\n  return (c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A);\r\n}\r\n\r\nfunction isASCIIAlphanumeric(c) {\r\n  return isASCIIAlpha(c) || isASCIIDigit(c);\r\n}\r\n\r\nfunction isASCIIHex(c) {\r\n  return isASCIIDigit(c) || (c >= 0x41 && c <= 0x46) || (c >= 0x61 && c <= 0x66);\r\n}\r\n\r\nfunction isSingleDot(buffer) {\r\n  return buffer === \".\" || buffer.toLowerCase() === \"%2e\";\r\n}\r\n\r\nfunction isDoubleDot(buffer) {\r\n  buffer = buffer.toLowerCase();\r\n  return buffer === \"..\" || buffer === \"%2e.\" || buffer === \".%2e\" || buffer === \"%2e%2e\";\r\n}\r\n\r\nfunction isWindowsDriveLetterCodePoints(cp1, cp2) {\r\n  return isASCIIAlpha(cp1) && (cp2 === 58 || cp2 === 124);\r\n}\r\n\r\nfunction isWindowsDriveLetterString(string) {\r\n  return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && (string[1] === \":\" || string[1] === \"|\");\r\n}\r\n\r\nfunction isNormalizedWindowsDriveLetterString(string) {\r\n  return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && string[1] === \":\";\r\n}\r\n\r\nfunction containsForbiddenHostCodePoint(string) {\r\n  return string.search(/\\u0000|\\u0009|\\u000A|\\u000D|\\u0020|#|%|\\/|:|\\?|@|\\[|\\\\|\\]/) !== -1;\r\n}\r\n\r\nfunction containsForbiddenHostCodePointExcludingPercent(string) {\r\n  return string.search(/\\u0000|\\u0009|\\u000A|\\u000D|\\u0020|#|\\/|:|\\?|@|\\[|\\\\|\\]/) !== -1;\r\n}\r\n\r\nfunction isSpecialScheme(scheme) {\r\n  return specialSchemes[scheme] !== undefined;\r\n}\r\n\r\nfunction isSpecial(url) {\r\n  return isSpecialScheme(url.scheme);\r\n}\r\n\r\nfunction defaultPort(scheme) {\r\n  return specialSchemes[scheme];\r\n}\r\n\r\nfunction percentEncode(c) {\r\n  let hex = c.toString(16).toUpperCase();\r\n  if (hex.length === 1) {\r\n    hex = \"0\" + hex;\r\n  }\r\n\r\n  return \"%\" + hex;\r\n}\r\n\r\nfunction utf8PercentEncode(c) {\r\n  const buf = new Buffer(c);\r\n\r\n  let str = \"\";\r\n\r\n  for (let i = 0; i < buf.length; ++i) {\r\n    str += percentEncode(buf[i]);\r\n  }\r\n\r\n  return str;\r\n}\r\n\r\nfunction utf8PercentDecode(str) {\r\n  const input = new Buffer(str);\r\n  const output = [];\r\n  for (let i = 0; i < input.length; ++i) {\r\n    if (input[i] !== 37) {\r\n      output.push(input[i]);\r\n    } else if (input[i] === 37 && isASCIIHex(input[i + 1]) && isASCIIHex(input[i + 2])) {\r\n      output.push(parseInt(input.slice(i + 1, i + 3).toString(), 16));\r\n      i += 2;\r\n    } else {\r\n      output.push(input[i]);\r\n    }\r\n  }\r\n  return new Buffer(output).toString();\r\n}\r\n\r\nfunction isC0ControlPercentEncode(c) {\r\n  return c <= 0x1F || c > 0x7E;\r\n}\r\n\r\nconst extraPathPercentEncodeSet = new Set([32, 34, 35, 60, 62, 63, 96, 123, 125]);\r\nfunction isPathPercentEncode(c) {\r\n  return isC0ControlPercentEncode(c) || extraPathPercentEncodeSet.has(c);\r\n}\r\n\r\nconst extraUserinfoPercentEncodeSet =\r\n  new Set([47, 58, 59, 61, 64, 91, 92, 93, 94, 124]);\r\nfunction isUserinfoPercentEncode(c) {\r\n  return isPathPercentEncode(c) || extraUserinfoPercentEncodeSet.has(c);\r\n}\r\n\r\nfunction percentEncodeChar(c, encodeSetPredicate) {\r\n  const cStr = String.fromCodePoint(c);\r\n\r\n  if (encodeSetPredicate(c)) {\r\n    return utf8PercentEncode(cStr);\r\n  }\r\n\r\n  return cStr;\r\n}\r\n\r\nfunction parseIPv4Number(input) {\r\n  let R = 10;\r\n\r\n  if (input.length >= 2 && input.charAt(0) === \"0\" && input.charAt(1).toLowerCase() === \"x\") {\r\n    input = input.substring(2);\r\n    R = 16;\r\n  } else if (input.length >= 2 && input.charAt(0) === \"0\") {\r\n    input = input.substring(1);\r\n    R = 8;\r\n  }\r\n\r\n  if (input === \"\") {\r\n    return 0;\r\n  }\r\n\r\n  const regex = R === 10 ? /[^0-9]/ : (R === 16 ? /[^0-9A-Fa-f]/ : /[^0-7]/);\r\n  if (regex.test(input)) {\r\n    return failure;\r\n  }\r\n\r\n  return parseInt(input, R);\r\n}\r\n\r\nfunction parseIPv4(input) {\r\n  const parts = input.split(\".\");\r\n  if (parts[parts.length - 1] === \"\") {\r\n    if (parts.length > 1) {\r\n      parts.pop();\r\n    }\r\n  }\r\n\r\n  if (parts.length > 4) {\r\n    return input;\r\n  }\r\n\r\n  const numbers = [];\r\n  for (const part of parts) {\r\n    if (part === \"\") {\r\n      return input;\r\n    }\r\n    const n = parseIPv4Number(part);\r\n    if (n === failure) {\r\n      return input;\r\n    }\r\n\r\n    numbers.push(n);\r\n  }\r\n\r\n  for (let i = 0; i < numbers.length - 1; ++i) {\r\n    if (numbers[i] > 255) {\r\n      return failure;\r\n    }\r\n  }\r\n  if (numbers[numbers.length - 1] >= Math.pow(256, 5 - numbers.length)) {\r\n    return failure;\r\n  }\r\n\r\n  let ipv4 = numbers.pop();\r\n  let counter = 0;\r\n\r\n  for (const n of numbers) {\r\n    ipv4 += n * Math.pow(256, 3 - counter);\r\n    ++counter;\r\n  }\r\n\r\n  return ipv4;\r\n}\r\n\r\nfunction serializeIPv4(address) {\r\n  let output = \"\";\r\n  let n = address;\r\n\r\n  for (let i = 1; i <= 4; ++i) {\r\n    output = String(n % 256) + output;\r\n    if (i !== 4) {\r\n      output = \".\" + output;\r\n    }\r\n    n = Math.floor(n / 256);\r\n  }\r\n\r\n  return output;\r\n}\r\n\r\nfunction parseIPv6(input) {\r\n  const address = [0, 0, 0, 0, 0, 0, 0, 0];\r\n  let pieceIndex = 0;\r\n  let compress = null;\r\n  let pointer = 0;\r\n\r\n  input = punycode.ucs2.decode(input);\r\n\r\n  if (input[pointer] === 58) {\r\n    if (input[pointer + 1] !== 58) {\r\n      return failure;\r\n    }\r\n\r\n    pointer += 2;\r\n    ++pieceIndex;\r\n    compress = pieceIndex;\r\n  }\r\n\r\n  while (pointer < input.length) {\r\n    if (pieceIndex === 8) {\r\n      return failure;\r\n    }\r\n\r\n    if (input[pointer] === 58) {\r\n      if (compress !== null) {\r\n        return failure;\r\n      }\r\n      ++pointer;\r\n      ++pieceIndex;\r\n      compress = pieceIndex;\r\n      continue;\r\n    }\r\n\r\n    let value = 0;\r\n    let length = 0;\r\n\r\n    while (length < 4 && isASCIIHex(input[pointer])) {\r\n      value = value * 0x10 + parseInt(at(input, pointer), 16);\r\n      ++pointer;\r\n      ++length;\r\n    }\r\n\r\n    if (input[pointer] === 46) {\r\n      if (length === 0) {\r\n        return failure;\r\n      }\r\n\r\n      pointer -= length;\r\n\r\n      if (pieceIndex > 6) {\r\n        return failure;\r\n      }\r\n\r\n      let numbersSeen = 0;\r\n\r\n      while (input[pointer] !== undefined) {\r\n        let ipv4Piece = null;\r\n\r\n        if (numbersSeen > 0) {\r\n          if (input[pointer] === 46 && numbersSeen < 4) {\r\n            ++pointer;\r\n          } else {\r\n            return failure;\r\n          }\r\n        }\r\n\r\n        if (!isASCIIDigit(input[pointer])) {\r\n          return failure;\r\n        }\r\n\r\n        while (isASCIIDigit(input[pointer])) {\r\n          const number = parseInt(at(input, pointer));\r\n          if (ipv4Piece === null) {\r\n            ipv4Piece = number;\r\n          } else if (ipv4Piece === 0) {\r\n            return failure;\r\n          } else {\r\n            ipv4Piece = ipv4Piece * 10 + number;\r\n          }\r\n          if (ipv4Piece > 255) {\r\n            return failure;\r\n          }\r\n          ++pointer;\r\n        }\r\n\r\n        address[pieceIndex] = address[pieceIndex] * 0x100 + ipv4Piece;\r\n\r\n        ++numbersSeen;\r\n\r\n        if (numbersSeen === 2 || numbersSeen === 4) {\r\n          ++pieceIndex;\r\n        }\r\n      }\r\n\r\n      if (numbersSeen !== 4) {\r\n        return failure;\r\n      }\r\n\r\n      break;\r\n    } else if (input[pointer] === 58) {\r\n      ++pointer;\r\n      if (input[pointer] === undefined) {\r\n        return failure;\r\n      }\r\n    } else if (input[pointer] !== undefined) {\r\n      return failure;\r\n    }\r\n\r\n    address[pieceIndex] = value;\r\n    ++pieceIndex;\r\n  }\r\n\r\n  if (compress !== null) {\r\n    let swaps = pieceIndex - compress;\r\n    pieceIndex = 7;\r\n    while (pieceIndex !== 0 && swaps > 0) {\r\n      const temp = address[compress + swaps - 1];\r\n      address[compress + swaps - 1] = address[pieceIndex];\r\n      address[pieceIndex] = temp;\r\n      --pieceIndex;\r\n      --swaps;\r\n    }\r\n  } else if (compress === null && pieceIndex !== 8) {\r\n    return failure;\r\n  }\r\n\r\n  return address;\r\n}\r\n\r\nfunction serializeIPv6(address) {\r\n  let output = \"\";\r\n  const seqResult = findLongestZeroSequence(address);\r\n  const compress = seqResult.idx;\r\n  let ignore0 = false;\r\n\r\n  for (let pieceIndex = 0; pieceIndex <= 7; ++pieceIndex) {\r\n    if (ignore0 && address[pieceIndex] === 0) {\r\n      continue;\r\n    } else if (ignore0) {\r\n      ignore0 = false;\r\n    }\r\n\r\n    if (compress === pieceIndex) {\r\n      const separator = pieceIndex === 0 ? \"::\" : \":\";\r\n      output += separator;\r\n      ignore0 = true;\r\n      continue;\r\n    }\r\n\r\n    output += address[pieceIndex].toString(16);\r\n\r\n    if (pieceIndex !== 7) {\r\n      output += \":\";\r\n    }\r\n  }\r\n\r\n  return output;\r\n}\r\n\r\nfunction parseHost(input, isSpecialArg) {\r\n  if (input[0] === \"[\") {\r\n    if (input[input.length - 1] !== \"]\") {\r\n      return failure;\r\n    }\r\n\r\n    return parseIPv6(input.substring(1, input.length - 1));\r\n  }\r\n\r\n  if (!isSpecialArg) {\r\n    return parseOpaqueHost(input);\r\n  }\r\n\r\n  const domain = utf8PercentDecode(input);\r\n  const asciiDomain = tr46.toASCII(domain, false, tr46.PROCESSING_OPTIONS.NONTRANSITIONAL, false);\r\n  if (asciiDomain === null) {\r\n    return failure;\r\n  }\r\n\r\n  if (containsForbiddenHostCodePoint(asciiDomain)) {\r\n    return failure;\r\n  }\r\n\r\n  const ipv4Host = parseIPv4(asciiDomain);\r\n  if (typeof ipv4Host === \"number\" || ipv4Host === failure) {\r\n    return ipv4Host;\r\n  }\r\n\r\n  return asciiDomain;\r\n}\r\n\r\nfunction parseOpaqueHost(input) {\r\n  if (containsForbiddenHostCodePointExcludingPercent(input)) {\r\n    return failure;\r\n  }\r\n\r\n  let output = \"\";\r\n  const decoded = punycode.ucs2.decode(input);\r\n  for (let i = 0; i < decoded.length; ++i) {\r\n    output += percentEncodeChar(decoded[i], isC0ControlPercentEncode);\r\n  }\r\n  return output;\r\n}\r\n\r\nfunction findLongestZeroSequence(arr) {\r\n  let maxIdx = null;\r\n  let maxLen = 1; // only find elements > 1\r\n  let currStart = null;\r\n  let currLen = 0;\r\n\r\n  for (let i = 0; i < arr.length; ++i) {\r\n    if (arr[i] !== 0) {\r\n      if (currLen > maxLen) {\r\n        maxIdx = currStart;\r\n        maxLen = currLen;\r\n      }\r\n\r\n      currStart = null;\r\n      currLen = 0;\r\n    } else {\r\n      if (currStart === null) {\r\n        currStart = i;\r\n      }\r\n      ++currLen;\r\n    }\r\n  }\r\n\r\n  // if trailing zeros\r\n  if (currLen > maxLen) {\r\n    maxIdx = currStart;\r\n    maxLen = currLen;\r\n  }\r\n\r\n  return {\r\n    idx: maxIdx,\r\n    len: maxLen\r\n  };\r\n}\r\n\r\nfunction serializeHost(host) {\r\n  if (typeof host === \"number\") {\r\n    return serializeIPv4(host);\r\n  }\r\n\r\n  // IPv6 serializer\r\n  if (host instanceof Array) {\r\n    return \"[\" + serializeIPv6(host) + \"]\";\r\n  }\r\n\r\n  return host;\r\n}\r\n\r\nfunction trimControlChars(url) {\r\n  return url.replace(/^[\\u0000-\\u001F\\u0020]+|[\\u0000-\\u001F\\u0020]+$/g, \"\");\r\n}\r\n\r\nfunction trimTabAndNewline(url) {\r\n  return url.replace(/\\u0009|\\u000A|\\u000D/g, \"\");\r\n}\r\n\r\nfunction shortenPath(url) {\r\n  const path = url.path;\r\n  if (path.length === 0) {\r\n    return;\r\n  }\r\n  if (url.scheme === \"file\" && path.length === 1 && isNormalizedWindowsDriveLetter(path[0])) {\r\n    return;\r\n  }\r\n\r\n  path.pop();\r\n}\r\n\r\nfunction includesCredentials(url) {\r\n  return url.username !== \"\" || url.password !== \"\";\r\n}\r\n\r\nfunction cannotHaveAUsernamePasswordPort(url) {\r\n  return url.host === null || url.host === \"\" || url.cannotBeABaseURL || url.scheme === \"file\";\r\n}\r\n\r\nfunction isNormalizedWindowsDriveLetter(string) {\r\n  return /^[A-Za-z]:$/.test(string);\r\n}\r\n\r\nfunction URLStateMachine(input, base, encodingOverride, url, stateOverride) {\r\n  this.pointer = 0;\r\n  this.input = input;\r\n  this.base = base || null;\r\n  this.encodingOverride = encodingOverride || \"utf-8\";\r\n  this.stateOverride = stateOverride;\r\n  this.url = url;\r\n  this.failure = false;\r\n  this.parseError = false;\r\n\r\n  if (!this.url) {\r\n    this.url = {\r\n      scheme: \"\",\r\n      username: \"\",\r\n      password: \"\",\r\n      host: null,\r\n      port: null,\r\n      path: [],\r\n      query: null,\r\n      fragment: null,\r\n\r\n      cannotBeABaseURL: false\r\n    };\r\n\r\n    const res = trimControlChars(this.input);\r\n    if (res !== this.input) {\r\n      this.parseError = true;\r\n    }\r\n    this.input = res;\r\n  }\r\n\r\n  const res = trimTabAndNewline(this.input);\r\n  if (res !== this.input) {\r\n    this.parseError = true;\r\n  }\r\n  this.input = res;\r\n\r\n  this.state = stateOverride || \"scheme start\";\r\n\r\n  this.buffer = \"\";\r\n  this.atFlag = false;\r\n  this.arrFlag = false;\r\n  this.passwordTokenSeenFlag = false;\r\n\r\n  this.input = punycode.ucs2.decode(this.input);\r\n\r\n  for (; this.pointer <= this.input.length; ++this.pointer) {\r\n    const c = this.input[this.pointer];\r\n    const cStr = isNaN(c) ? undefined : String.fromCodePoint(c);\r\n\r\n    // exec state machine\r\n    const ret = this[\"parse \" + this.state](c, cStr);\r\n    if (!ret) {\r\n      break; // terminate algorithm\r\n    } else if (ret === failure) {\r\n      this.failure = true;\r\n      break;\r\n    }\r\n  }\r\n}\r\n\r\nURLStateMachine.prototype[\"parse scheme start\"] = function parseSchemeStart(c, cStr) {\r\n  if (isASCIIAlpha(c)) {\r\n    this.buffer += cStr.toLowerCase();\r\n    this.state = \"scheme\";\r\n  } else if (!this.stateOverride) {\r\n    this.state = \"no scheme\";\r\n    --this.pointer;\r\n  } else {\r\n    this.parseError = true;\r\n    return failure;\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse scheme\"] = function parseScheme(c, cStr) {\r\n  if (isASCIIAlphanumeric(c) || c === 43 || c === 45 || c === 46) {\r\n    this.buffer += cStr.toLowerCase();\r\n  } else if (c === 58) {\r\n    if (this.stateOverride) {\r\n      if (isSpecial(this.url) && !isSpecialScheme(this.buffer)) {\r\n        return false;\r\n      }\r\n\r\n      if (!isSpecial(this.url) && isSpecialScheme(this.buffer)) {\r\n        return false;\r\n      }\r\n\r\n      if ((includesCredentials(this.url) || this.url.port !== null) && this.buffer === \"file\") {\r\n        return false;\r\n      }\r\n\r\n      if (this.url.scheme === \"file\" && (this.url.host === \"\" || this.url.host === null)) {\r\n        return false;\r\n      }\r\n    }\r\n    this.url.scheme = this.buffer;\r\n    this.buffer = \"\";\r\n    if (this.stateOverride) {\r\n      return false;\r\n    }\r\n    if (this.url.scheme === \"file\") {\r\n      if (this.input[this.pointer + 1] !== 47 || this.input[this.pointer + 2] !== 47) {\r\n        this.parseError = true;\r\n      }\r\n      this.state = \"file\";\r\n    } else if (isSpecial(this.url) && this.base !== null && this.base.scheme === this.url.scheme) {\r\n      this.state = \"special relative or authority\";\r\n    } else if (isSpecial(this.url)) {\r\n      this.state = \"special authority slashes\";\r\n    } else if (this.input[this.pointer + 1] === 47) {\r\n      this.state = \"path or authority\";\r\n      ++this.pointer;\r\n    } else {\r\n      this.url.cannotBeABaseURL = true;\r\n      this.url.path.push(\"\");\r\n      this.state = \"cannot-be-a-base-URL path\";\r\n    }\r\n  } else if (!this.stateOverride) {\r\n    this.buffer = \"\";\r\n    this.state = \"no scheme\";\r\n    this.pointer = -1;\r\n  } else {\r\n    this.parseError = true;\r\n    return failure;\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse no scheme\"] = function parseNoScheme(c) {\r\n  if (this.base === null || (this.base.cannotBeABaseURL && c !== 35)) {\r\n    return failure;\r\n  } else if (this.base.cannotBeABaseURL && c === 35) {\r\n    this.url.scheme = this.base.scheme;\r\n    this.url.path = this.base.path.slice();\r\n    this.url.query = this.base.query;\r\n    this.url.fragment = \"\";\r\n    this.url.cannotBeABaseURL = true;\r\n    this.state = \"fragment\";\r\n  } else if (this.base.scheme === \"file\") {\r\n    this.state = \"file\";\r\n    --this.pointer;\r\n  } else {\r\n    this.state = \"relative\";\r\n    --this.pointer;\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse special relative or authority\"] = function parseSpecialRelativeOrAuthority(c) {\r\n  if (c === 47 && this.input[this.pointer + 1] === 47) {\r\n    this.state = \"special authority ignore slashes\";\r\n    ++this.pointer;\r\n  } else {\r\n    this.parseError = true;\r\n    this.state = \"relative\";\r\n    --this.pointer;\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse path or authority\"] = function parsePathOrAuthority(c) {\r\n  if (c === 47) {\r\n    this.state = \"authority\";\r\n  } else {\r\n    this.state = \"path\";\r\n    --this.pointer;\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse relative\"] = function parseRelative(c) {\r\n  this.url.scheme = this.base.scheme;\r\n  if (isNaN(c)) {\r\n    this.url.username = this.base.username;\r\n    this.url.password = this.base.password;\r\n    this.url.host = this.base.host;\r\n    this.url.port = this.base.port;\r\n    this.url.path = this.base.path.slice();\r\n    this.url.query = this.base.query;\r\n  } else if (c === 47) {\r\n    this.state = \"relative slash\";\r\n  } else if (c === 63) {\r\n    this.url.username = this.base.username;\r\n    this.url.password = this.base.password;\r\n    this.url.host = this.base.host;\r\n    this.url.port = this.base.port;\r\n    this.url.path = this.base.path.slice();\r\n    this.url.query = \"\";\r\n    this.state = \"query\";\r\n  } else if (c === 35) {\r\n    this.url.username = this.base.username;\r\n    this.url.password = this.base.password;\r\n    this.url.host = this.base.host;\r\n    this.url.port = this.base.port;\r\n    this.url.path = this.base.path.slice();\r\n    this.url.query = this.base.query;\r\n    this.url.fragment = \"\";\r\n    this.state = \"fragment\";\r\n  } else if (isSpecial(this.url) && c === 92) {\r\n    this.parseError = true;\r\n    this.state = \"relative slash\";\r\n  } else {\r\n    this.url.username = this.base.username;\r\n    this.url.password = this.base.password;\r\n    this.url.host = this.base.host;\r\n    this.url.port = this.base.port;\r\n    this.url.path = this.base.path.slice(0, this.base.path.length - 1);\r\n\r\n    this.state = \"path\";\r\n    --this.pointer;\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse relative slash\"] = function parseRelativeSlash(c) {\r\n  if (isSpecial(this.url) && (c === 47 || c === 92)) {\r\n    if (c === 92) {\r\n      this.parseError = true;\r\n    }\r\n    this.state = \"special authority ignore slashes\";\r\n  } else if (c === 47) {\r\n    this.state = \"authority\";\r\n  } else {\r\n    this.url.username = this.base.username;\r\n    this.url.password = this.base.password;\r\n    this.url.host = this.base.host;\r\n    this.url.port = this.base.port;\r\n    this.state = \"path\";\r\n    --this.pointer;\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse special authority slashes\"] = function parseSpecialAuthoritySlashes(c) {\r\n  if (c === 47 && this.input[this.pointer + 1] === 47) {\r\n    this.state = \"special authority ignore slashes\";\r\n    ++this.pointer;\r\n  } else {\r\n    this.parseError = true;\r\n    this.state = \"special authority ignore slashes\";\r\n    --this.pointer;\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse special authority ignore slashes\"] = function parseSpecialAuthorityIgnoreSlashes(c) {\r\n  if (c !== 47 && c !== 92) {\r\n    this.state = \"authority\";\r\n    --this.pointer;\r\n  } else {\r\n    this.parseError = true;\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse authority\"] = function parseAuthority(c, cStr) {\r\n  if (c === 64) {\r\n    this.parseError = true;\r\n    if (this.atFlag) {\r\n      this.buffer = \"%40\" + this.buffer;\r\n    }\r\n    this.atFlag = true;\r\n\r\n    // careful, this is based on buffer and has its own pointer (this.pointer != pointer) and inner chars\r\n    const len = countSymbols(this.buffer);\r\n    for (let pointer = 0; pointer < len; ++pointer) {\r\n      const codePoint = this.buffer.codePointAt(pointer);\r\n\r\n      if (codePoint === 58 && !this.passwordTokenSeenFlag) {\r\n        this.passwordTokenSeenFlag = true;\r\n        continue;\r\n      }\r\n      const encodedCodePoints = percentEncodeChar(codePoint, isUserinfoPercentEncode);\r\n      if (this.passwordTokenSeenFlag) {\r\n        this.url.password += encodedCodePoints;\r\n      } else {\r\n        this.url.username += encodedCodePoints;\r\n      }\r\n    }\r\n    this.buffer = \"\";\r\n  } else if (isNaN(c) || c === 47 || c === 63 || c === 35 ||\r\n             (isSpecial(this.url) && c === 92)) {\r\n    if (this.atFlag && this.buffer === \"\") {\r\n      this.parseError = true;\r\n      return failure;\r\n    }\r\n    this.pointer -= countSymbols(this.buffer) + 1;\r\n    this.buffer = \"\";\r\n    this.state = \"host\";\r\n  } else {\r\n    this.buffer += cStr;\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse hostname\"] =\r\nURLStateMachine.prototype[\"parse host\"] = function parseHostName(c, cStr) {\r\n  if (this.stateOverride && this.url.scheme === \"file\") {\r\n    --this.pointer;\r\n    this.state = \"file host\";\r\n  } else if (c === 58 && !this.arrFlag) {\r\n    if (this.buffer === \"\") {\r\n      this.parseError = true;\r\n      return failure;\r\n    }\r\n\r\n    const host = parseHost(this.buffer, isSpecial(this.url));\r\n    if (host === failure) {\r\n      return failure;\r\n    }\r\n\r\n    this.url.host = host;\r\n    this.buffer = \"\";\r\n    this.state = \"port\";\r\n    if (this.stateOverride === \"hostname\") {\r\n      return false;\r\n    }\r\n  } else if (isNaN(c) || c === 47 || c === 63 || c === 35 ||\r\n             (isSpecial(this.url) && c === 92)) {\r\n    --this.pointer;\r\n    if (isSpecial(this.url) && this.buffer === \"\") {\r\n      this.parseError = true;\r\n      return failure;\r\n    } else if (this.stateOverride && this.buffer === \"\" &&\r\n               (includesCredentials(this.url) || this.url.port !== null)) {\r\n      this.parseError = true;\r\n      return false;\r\n    }\r\n\r\n    const host = parseHost(this.buffer, isSpecial(this.url));\r\n    if (host === failure) {\r\n      return failure;\r\n    }\r\n\r\n    this.url.host = host;\r\n    this.buffer = \"\";\r\n    this.state = \"path start\";\r\n    if (this.stateOverride) {\r\n      return false;\r\n    }\r\n  } else {\r\n    if (c === 91) {\r\n      this.arrFlag = true;\r\n    } else if (c === 93) {\r\n      this.arrFlag = false;\r\n    }\r\n    this.buffer += cStr;\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse port\"] = function parsePort(c, cStr) {\r\n  if (isASCIIDigit(c)) {\r\n    this.buffer += cStr;\r\n  } else if (isNaN(c) || c === 47 || c === 63 || c === 35 ||\r\n             (isSpecial(this.url) && c === 92) ||\r\n             this.stateOverride) {\r\n    if (this.buffer !== \"\") {\r\n      const port = parseInt(this.buffer);\r\n      if (port > Math.pow(2, 16) - 1) {\r\n        this.parseError = true;\r\n        return failure;\r\n      }\r\n      this.url.port = port === defaultPort(this.url.scheme) ? null : port;\r\n      this.buffer = \"\";\r\n    }\r\n    if (this.stateOverride) {\r\n      return false;\r\n    }\r\n    this.state = \"path start\";\r\n    --this.pointer;\r\n  } else {\r\n    this.parseError = true;\r\n    return failure;\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nconst fileOtherwiseCodePoints = new Set([47, 92, 63, 35]);\r\n\r\nURLStateMachine.prototype[\"parse file\"] = function parseFile(c) {\r\n  this.url.scheme = \"file\";\r\n\r\n  if (c === 47 || c === 92) {\r\n    if (c === 92) {\r\n      this.parseError = true;\r\n    }\r\n    this.state = \"file slash\";\r\n  } else if (this.base !== null && this.base.scheme === \"file\") {\r\n    if (isNaN(c)) {\r\n      this.url.host = this.base.host;\r\n      this.url.path = this.base.path.slice();\r\n      this.url.query = this.base.query;\r\n    } else if (c === 63) {\r\n      this.url.host = this.base.host;\r\n      this.url.path = this.base.path.slice();\r\n      this.url.query = \"\";\r\n      this.state = \"query\";\r\n    } else if (c === 35) {\r\n      this.url.host = this.base.host;\r\n      this.url.path = this.base.path.slice();\r\n      this.url.query = this.base.query;\r\n      this.url.fragment = \"\";\r\n      this.state = \"fragment\";\r\n    } else {\r\n      if (this.input.length - this.pointer - 1 === 0 || // remaining consists of 0 code points\r\n          !isWindowsDriveLetterCodePoints(c, this.input[this.pointer + 1]) ||\r\n          (this.input.length - this.pointer - 1 >= 2 && // remaining has at least 2 code points\r\n           !fileOtherwiseCodePoints.has(this.input[this.pointer + 2]))) {\r\n        this.url.host = this.base.host;\r\n        this.url.path = this.base.path.slice();\r\n        shortenPath(this.url);\r\n      } else {\r\n        this.parseError = true;\r\n      }\r\n\r\n      this.state = \"path\";\r\n      --this.pointer;\r\n    }\r\n  } else {\r\n    this.state = \"path\";\r\n    --this.pointer;\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse file slash\"] = function parseFileSlash(c) {\r\n  if (c === 47 || c === 92) {\r\n    if (c === 92) {\r\n      this.parseError = true;\r\n    }\r\n    this.state = \"file host\";\r\n  } else {\r\n    if (this.base !== null && this.base.scheme === \"file\") {\r\n      if (isNormalizedWindowsDriveLetterString(this.base.path[0])) {\r\n        this.url.path.push(this.base.path[0]);\r\n      } else {\r\n        this.url.host = this.base.host;\r\n      }\r\n    }\r\n    this.state = \"path\";\r\n    --this.pointer;\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse file host\"] = function parseFileHost(c, cStr) {\r\n  if (isNaN(c) || c === 47 || c === 92 || c === 63 || c === 35) {\r\n    --this.pointer;\r\n    if (!this.stateOverride && isWindowsDriveLetterString(this.buffer)) {\r\n      this.parseError = true;\r\n      this.state = \"path\";\r\n    } else if (this.buffer === \"\") {\r\n      this.url.host = \"\";\r\n      if (this.stateOverride) {\r\n        return false;\r\n      }\r\n      this.state = \"path start\";\r\n    } else {\r\n      let host = parseHost(this.buffer, isSpecial(this.url));\r\n      if (host === failure) {\r\n        return failure;\r\n      }\r\n      if (host === \"localhost\") {\r\n        host = \"\";\r\n      }\r\n      this.url.host = host;\r\n\r\n      if (this.stateOverride) {\r\n        return false;\r\n      }\r\n\r\n      this.buffer = \"\";\r\n      this.state = \"path start\";\r\n    }\r\n  } else {\r\n    this.buffer += cStr;\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse path start\"] = function parsePathStart(c) {\r\n  if (isSpecial(this.url)) {\r\n    if (c === 92) {\r\n      this.parseError = true;\r\n    }\r\n    this.state = \"path\";\r\n\r\n    if (c !== 47 && c !== 92) {\r\n      --this.pointer;\r\n    }\r\n  } else if (!this.stateOverride && c === 63) {\r\n    this.url.query = \"\";\r\n    this.state = \"query\";\r\n  } else if (!this.stateOverride && c === 35) {\r\n    this.url.fragment = \"\";\r\n    this.state = \"fragment\";\r\n  } else if (c !== undefined) {\r\n    this.state = \"path\";\r\n    if (c !== 47) {\r\n      --this.pointer;\r\n    }\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse path\"] = function parsePath(c) {\r\n  if (isNaN(c) || c === 47 || (isSpecial(this.url) && c === 92) ||\r\n      (!this.stateOverride && (c === 63 || c === 35))) {\r\n    if (isSpecial(this.url) && c === 92) {\r\n      this.parseError = true;\r\n    }\r\n\r\n    if (isDoubleDot(this.buffer)) {\r\n      shortenPath(this.url);\r\n      if (c !== 47 && !(isSpecial(this.url) && c === 92)) {\r\n        this.url.path.push(\"\");\r\n      }\r\n    } else if (isSingleDot(this.buffer) && c !== 47 &&\r\n               !(isSpecial(this.url) && c === 92)) {\r\n      this.url.path.push(\"\");\r\n    } else if (!isSingleDot(this.buffer)) {\r\n      if (this.url.scheme === \"file\" && this.url.path.length === 0 && isWindowsDriveLetterString(this.buffer)) {\r\n        if (this.url.host !== \"\" && this.url.host !== null) {\r\n          this.parseError = true;\r\n          this.url.host = \"\";\r\n        }\r\n        this.buffer = this.buffer[0] + \":\";\r\n      }\r\n      this.url.path.push(this.buffer);\r\n    }\r\n    this.buffer = \"\";\r\n    if (this.url.scheme === \"file\" && (c === undefined || c === 63 || c === 35)) {\r\n      while (this.url.path.length > 1 && this.url.path[0] === \"\") {\r\n        this.parseError = true;\r\n        this.url.path.shift();\r\n      }\r\n    }\r\n    if (c === 63) {\r\n      this.url.query = \"\";\r\n      this.state = \"query\";\r\n    }\r\n    if (c === 35) {\r\n      this.url.fragment = \"\";\r\n      this.state = \"fragment\";\r\n    }\r\n  } else {\r\n    // TODO: If c is not a URL code point and not \"%\", parse error.\r\n\r\n    if (c === 37 &&\r\n      (!isASCIIHex(this.input[this.pointer + 1]) ||\r\n        !isASCIIHex(this.input[this.pointer + 2]))) {\r\n      this.parseError = true;\r\n    }\r\n\r\n    this.buffer += percentEncodeChar(c, isPathPercentEncode);\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse cannot-be-a-base-URL path\"] = function parseCannotBeABaseURLPath(c) {\r\n  if (c === 63) {\r\n    this.url.query = \"\";\r\n    this.state = \"query\";\r\n  } else if (c === 35) {\r\n    this.url.fragment = \"\";\r\n    this.state = \"fragment\";\r\n  } else {\r\n    // TODO: Add: not a URL code point\r\n    if (!isNaN(c) && c !== 37) {\r\n      this.parseError = true;\r\n    }\r\n\r\n    if (c === 37 &&\r\n        (!isASCIIHex(this.input[this.pointer + 1]) ||\r\n         !isASCIIHex(this.input[this.pointer + 2]))) {\r\n      this.parseError = true;\r\n    }\r\n\r\n    if (!isNaN(c)) {\r\n      this.url.path[0] = this.url.path[0] + percentEncodeChar(c, isC0ControlPercentEncode);\r\n    }\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse query\"] = function parseQuery(c, cStr) {\r\n  if (isNaN(c) || (!this.stateOverride && c === 35)) {\r\n    if (!isSpecial(this.url) || this.url.scheme === \"ws\" || this.url.scheme === \"wss\") {\r\n      this.encodingOverride = \"utf-8\";\r\n    }\r\n\r\n    const buffer = new Buffer(this.buffer); // TODO: Use encoding override instead\r\n    for (let i = 0; i < buffer.length; ++i) {\r\n      if (buffer[i] < 0x21 || buffer[i] > 0x7E || buffer[i] === 0x22 || buffer[i] === 0x23 ||\r\n          buffer[i] === 0x3C || buffer[i] === 0x3E) {\r\n        this.url.query += percentEncode(buffer[i]);\r\n      } else {\r\n        this.url.query += String.fromCodePoint(buffer[i]);\r\n      }\r\n    }\r\n\r\n    this.buffer = \"\";\r\n    if (c === 35) {\r\n      this.url.fragment = \"\";\r\n      this.state = \"fragment\";\r\n    }\r\n  } else {\r\n    // TODO: If c is not a URL code point and not \"%\", parse error.\r\n    if (c === 37 &&\r\n      (!isASCIIHex(this.input[this.pointer + 1]) ||\r\n        !isASCIIHex(this.input[this.pointer + 2]))) {\r\n      this.parseError = true;\r\n    }\r\n\r\n    this.buffer += cStr;\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse fragment\"] = function parseFragment(c) {\r\n  if (isNaN(c)) { // do nothing\r\n  } else if (c === 0x0) {\r\n    this.parseError = true;\r\n  } else {\r\n    // TODO: If c is not a URL code point and not \"%\", parse error.\r\n    if (c === 37 &&\r\n      (!isASCIIHex(this.input[this.pointer + 1]) ||\r\n        !isASCIIHex(this.input[this.pointer + 2]))) {\r\n      this.parseError = true;\r\n    }\r\n\r\n    this.url.fragment += percentEncodeChar(c, isC0ControlPercentEncode);\r\n  }\r\n\r\n  return true;\r\n};\r\n\r\nfunction serializeURL(url, excludeFragment) {\r\n  let output = url.scheme + \":\";\r\n  if (url.host !== null) {\r\n    output += \"//\";\r\n\r\n    if (url.username !== \"\" || url.password !== \"\") {\r\n      output += url.username;\r\n      if (url.password !== \"\") {\r\n        output += \":\" + url.password;\r\n      }\r\n      output += \"@\";\r\n    }\r\n\r\n    output += serializeHost(url.host);\r\n\r\n    if (url.port !== null) {\r\n      output += \":\" + url.port;\r\n    }\r\n  } else if (url.host === null && url.scheme === \"file\") {\r\n    output += \"//\";\r\n  }\r\n\r\n  if (url.cannotBeABaseURL) {\r\n    output += url.path[0];\r\n  } else {\r\n    for (const string of url.path) {\r\n      output += \"/\" + string;\r\n    }\r\n  }\r\n\r\n  if (url.query !== null) {\r\n    output += \"?\" + url.query;\r\n  }\r\n\r\n  if (!excludeFragment && url.fragment !== null) {\r\n    output += \"#\" + url.fragment;\r\n  }\r\n\r\n  return output;\r\n}\r\n\r\nfunction serializeOrigin(tuple) {\r\n  let result = tuple.scheme + \"://\";\r\n  result += serializeHost(tuple.host);\r\n\r\n  if (tuple.port !== null) {\r\n    result += \":\" + tuple.port;\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\nmodule.exports.serializeURL = serializeURL;\r\n\r\nmodule.exports.serializeURLOrigin = function (url) {\r\n  // https://url.spec.whatwg.org/#concept-url-origin\r\n  switch (url.scheme) {\r\n    case \"blob\":\r\n      try {\r\n        return module.exports.serializeURLOrigin(module.exports.parseURL(url.path[0]));\r\n      } catch (e) {\r\n        // serializing an opaque origin returns \"null\"\r\n        return \"null\";\r\n      }\r\n    case \"ftp\":\r\n    case \"gopher\":\r\n    case \"http\":\r\n    case \"https\":\r\n    case \"ws\":\r\n    case \"wss\":\r\n      return serializeOrigin({\r\n        scheme: url.scheme,\r\n        host: url.host,\r\n        port: url.port\r\n      });\r\n    case \"file\":\r\n      // spec says \"exercise to the reader\", chrome says \"file://\"\r\n      return \"file://\";\r\n    default:\r\n      // serializing an opaque origin returns \"null\"\r\n      return \"null\";\r\n  }\r\n};\r\n\r\nmodule.exports.basicURLParse = function (input, options) {\r\n  if (options === undefined) {\r\n    options = {};\r\n  }\r\n\r\n  const usm = new URLStateMachine(input, options.baseURL, options.encodingOverride, options.url, options.stateOverride);\r\n  if (usm.failure) {\r\n    return \"failure\";\r\n  }\r\n\r\n  return usm.url;\r\n};\r\n\r\nmodule.exports.setTheUsername = function (url, username) {\r\n  url.username = \"\";\r\n  const decoded = punycode.ucs2.decode(username);\r\n  for (let i = 0; i < decoded.length; ++i) {\r\n    url.username += percentEncodeChar(decoded[i], isUserinfoPercentEncode);\r\n  }\r\n};\r\n\r\nmodule.exports.setThePassword = function (url, password) {\r\n  url.password = \"\";\r\n  const decoded = punycode.ucs2.decode(password);\r\n  for (let i = 0; i < decoded.length; ++i) {\r\n    url.password += percentEncodeChar(decoded[i], isUserinfoPercentEncode);\r\n  }\r\n};\r\n\r\nmodule.exports.serializeHost = serializeHost;\r\n\r\nmodule.exports.cannotHaveAUsernamePasswordPort = cannotHaveAUsernamePasswordPort;\r\n\r\nmodule.exports.serializeInteger = function (integer) {\r\n  return String(integer);\r\n};\r\n\r\nmodule.exports.parseURL = function (input, options) {\r\n  if (options === undefined) {\r\n    options = {};\r\n  }\r\n\r\n  // We don't handle blobs, so this just delegates:\r\n  return module.exports.basicURLParse(input, { baseURL: options.baseURL, encodingOverride: options.encodingOverride });\r\n};\r\n", "\"use strict\";\nconst usm = require(\"./url-state-machine\");\n\nexports.implementation = class URLImpl {\n  constructor(constructorArgs) {\n    const url = constructorArgs[0];\n    const base = constructorArgs[1];\n\n    let parsedBase = null;\n    if (base !== undefined) {\n      parsedBase = usm.basicURLParse(base);\n      if (parsedBase === \"failure\") {\n        throw new TypeError(\"Invalid base URL\");\n      }\n    }\n\n    const parsedURL = usm.basicURLParse(url, { baseURL: parsedBase });\n    if (parsedURL === \"failure\") {\n      throw new TypeError(\"Invalid URL\");\n    }\n\n    this._url = parsedURL;\n\n    // TODO: query stuff\n  }\n\n  get href() {\n    return usm.serializeURL(this._url);\n  }\n\n  set href(v) {\n    const parsedURL = usm.basicURLParse(v);\n    if (parsedURL === \"failure\") {\n      throw new TypeError(\"Invalid URL\");\n    }\n\n    this._url = parsedURL;\n  }\n\n  get origin() {\n    return usm.serializeURLOrigin(this._url);\n  }\n\n  get protocol() {\n    return this._url.scheme + \":\";\n  }\n\n  set protocol(v) {\n    usm.basicURLParse(v + \":\", { url: this._url, stateOverride: \"scheme start\" });\n  }\n\n  get username() {\n    return this._url.username;\n  }\n\n  set username(v) {\n    if (usm.cannotHaveAUsernamePasswordPort(this._url)) {\n      return;\n    }\n\n    usm.setTheUsername(this._url, v);\n  }\n\n  get password() {\n    return this._url.password;\n  }\n\n  set password(v) {\n    if (usm.cannotHaveAUsernamePasswordPort(this._url)) {\n      return;\n    }\n\n    usm.setThePassword(this._url, v);\n  }\n\n  get host() {\n    const url = this._url;\n\n    if (url.host === null) {\n      return \"\";\n    }\n\n    if (url.port === null) {\n      return usm.serializeHost(url.host);\n    }\n\n    return usm.serializeHost(url.host) + \":\" + usm.serializeInteger(url.port);\n  }\n\n  set host(v) {\n    if (this._url.cannotBeABaseURL) {\n      return;\n    }\n\n    usm.basicURLParse(v, { url: this._url, stateOverride: \"host\" });\n  }\n\n  get hostname() {\n    if (this._url.host === null) {\n      return \"\";\n    }\n\n    return usm.serializeHost(this._url.host);\n  }\n\n  set hostname(v) {\n    if (this._url.cannotBeABaseURL) {\n      return;\n    }\n\n    usm.basicURLParse(v, { url: this._url, stateOverride: \"hostname\" });\n  }\n\n  get port() {\n    if (this._url.port === null) {\n      return \"\";\n    }\n\n    return usm.serializeInteger(this._url.port);\n  }\n\n  set port(v) {\n    if (usm.cannotHaveAUsernamePasswordPort(this._url)) {\n      return;\n    }\n\n    if (v === \"\") {\n      this._url.port = null;\n    } else {\n      usm.basicURLParse(v, { url: this._url, stateOverride: \"port\" });\n    }\n  }\n\n  get pathname() {\n    if (this._url.cannotBeABaseURL) {\n      return this._url.path[0];\n    }\n\n    if (this._url.path.length === 0) {\n      return \"\";\n    }\n\n    return \"/\" + this._url.path.join(\"/\");\n  }\n\n  set pathname(v) {\n    if (this._url.cannotBeABaseURL) {\n      return;\n    }\n\n    this._url.path = [];\n    usm.basicURLParse(v, { url: this._url, stateOverride: \"path start\" });\n  }\n\n  get search() {\n    if (this._url.query === null || this._url.query === \"\") {\n      return \"\";\n    }\n\n    return \"?\" + this._url.query;\n  }\n\n  set search(v) {\n    // TODO: query stuff\n\n    const url = this._url;\n\n    if (v === \"\") {\n      url.query = null;\n      return;\n    }\n\n    const input = v[0] === \"?\" ? v.substring(1) : v;\n    url.query = \"\";\n    usm.basicURLParse(input, { url, stateOverride: \"query\" });\n  }\n\n  get hash() {\n    if (this._url.fragment === null || this._url.fragment === \"\") {\n      return \"\";\n    }\n\n    return \"#\" + this._url.fragment;\n  }\n\n  set hash(v) {\n    if (v === \"\") {\n      this._url.fragment = null;\n      return;\n    }\n\n    const input = v[0] === \"#\" ? v.substring(1) : v;\n    this._url.fragment = \"\";\n    usm.basicURLParse(input, { url: this._url, stateOverride: \"fragment\" });\n  }\n\n  toJSON() {\n    return this.href;\n  }\n};\n", "\"use strict\";\n\nconst conversions = require(\"webidl-conversions\");\nconst utils = require(\"./utils.js\");\nconst Impl = require(\".//URL-impl.js\");\n\nconst impl = utils.implSymbol;\n\nfunction URL(url) {\n  if (!this || this[impl] || !(this instanceof URL)) {\n    throw new TypeError(\"Failed to construct 'URL': Please use the 'new' operator, this DOM object constructor cannot be called as a function.\");\n  }\n  if (arguments.length < 1) {\n    throw new TypeError(\"Failed to construct 'URL': 1 argument required, but only \" + arguments.length + \" present.\");\n  }\n  const args = [];\n  for (let i = 0; i < arguments.length && i < 2; ++i) {\n    args[i] = arguments[i];\n  }\n  args[0] = conversions[\"USVString\"](args[0]);\n  if (args[1] !== undefined) {\n  args[1] = conversions[\"USVString\"](args[1]);\n  }\n\n  module.exports.setup(this, args);\n}\n\nURL.prototype.toJSON = function toJSON() {\n  if (!this || !module.exports.is(this)) {\n    throw new TypeError(\"Illegal invocation\");\n  }\n  const args = [];\n  for (let i = 0; i < arguments.length && i < 0; ++i) {\n    args[i] = arguments[i];\n  }\n  return this[impl].toJSON.apply(this[impl], args);\n};\nObject.defineProperty(URL.prototype, \"href\", {\n  get() {\n    return this[impl].href;\n  },\n  set(V) {\n    V = conversions[\"USVString\"](V);\n    this[impl].href = V;\n  },\n  enumerable: true,\n  configurable: true\n});\n\nURL.prototype.toString = function () {\n  if (!this || !module.exports.is(this)) {\n    throw new TypeError(\"Illegal invocation\");\n  }\n  return this.href;\n};\n\nObject.defineProperty(URL.prototype, \"origin\", {\n  get() {\n    return this[impl].origin;\n  },\n  enumerable: true,\n  configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"protocol\", {\n  get() {\n    return this[impl].protocol;\n  },\n  set(V) {\n    V = conversions[\"USVString\"](V);\n    this[impl].protocol = V;\n  },\n  enumerable: true,\n  configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"username\", {\n  get() {\n    return this[impl].username;\n  },\n  set(V) {\n    V = conversions[\"USVString\"](V);\n    this[impl].username = V;\n  },\n  enumerable: true,\n  configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"password\", {\n  get() {\n    return this[impl].password;\n  },\n  set(V) {\n    V = conversions[\"USVString\"](V);\n    this[impl].password = V;\n  },\n  enumerable: true,\n  configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"host\", {\n  get() {\n    return this[impl].host;\n  },\n  set(V) {\n    V = conversions[\"USVString\"](V);\n    this[impl].host = V;\n  },\n  enumerable: true,\n  configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"hostname\", {\n  get() {\n    return this[impl].hostname;\n  },\n  set(V) {\n    V = conversions[\"USVString\"](V);\n    this[impl].hostname = V;\n  },\n  enumerable: true,\n  configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"port\", {\n  get() {\n    return this[impl].port;\n  },\n  set(V) {\n    V = conversions[\"USVString\"](V);\n    this[impl].port = V;\n  },\n  enumerable: true,\n  configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"pathname\", {\n  get() {\n    return this[impl].pathname;\n  },\n  set(V) {\n    V = conversions[\"USVString\"](V);\n    this[impl].pathname = V;\n  },\n  enumerable: true,\n  configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"search\", {\n  get() {\n    return this[impl].search;\n  },\n  set(V) {\n    V = conversions[\"USVString\"](V);\n    this[impl].search = V;\n  },\n  enumerable: true,\n  configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"hash\", {\n  get() {\n    return this[impl].hash;\n  },\n  set(V) {\n    V = conversions[\"USVString\"](V);\n    this[impl].hash = V;\n  },\n  enumerable: true,\n  configurable: true\n});\n\n\nmodule.exports = {\n  is(obj) {\n    return !!obj && obj[impl] instanceof Impl.implementation;\n  },\n  create(constructorArgs, privateData) {\n    let obj = Object.create(URL.prototype);\n    this.setup(obj, constructorArgs, privateData);\n    return obj;\n  },\n  setup(obj, constructorArgs, privateData) {\n    if (!privateData) privateData = {};\n    privateData.wrapper = obj;\n\n    obj[impl] = new Impl.implementation(constructorArgs, privateData);\n    obj[impl][utils.wrapperSymbol] = obj;\n  },\n  interface: URL,\n  expose: {\n    Window: { URL: URL },\n    Worker: { URL: URL }\n  }\n};\n\n", "\"use strict\";\n\nexports.URL = require(\"./URL\").interface;\nexports.serializeURL = require(\"./url-state-machine\").serializeURL;\nexports.serializeURLOrigin = require(\"./url-state-machine\").serializeURLOrigin;\nexports.basicURLParse = require(\"./url-state-machine\").basicURLParse;\nexports.setTheUsername = require(\"./url-state-machine\").setTheUsername;\nexports.setThePassword = require(\"./url-state-machine\").setThePassword;\nexports.serializeHost = require(\"./url-state-machine\").serializeHost;\nexports.serializeInteger = require(\"./url-state-machine\").serializeInteger;\nexports.parseURL = require(\"./url-state-machine\").parseURL;\n", "'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nfunction _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }\n\nvar Stream = _interopDefault(require('stream'));\nvar http = _interopDefault(require('http'));\nvar Url = _interopDefault(require('url'));\nvar whatwgUrl = _interopDefault(require('whatwg-url'));\nvar https = _interopDefault(require('https'));\nvar zlib = _interopDefault(require('zlib'));\n\n// Based on https://github.com/tmpvar/jsdom/blob/aa85b2abf07766ff7bf5c1f6daafb3726f2f2db5/lib/jsdom/living/blob.js\n\n// fix for \"Readable\" isn't a named export issue\nconst Readable = Stream.Readable;\n\nconst BUFFER = Symbol('buffer');\nconst TYPE = Symbol('type');\n\nclass Blob {\n\tconstructor() {\n\t\tthis[TYPE] = '';\n\n\t\tconst blobParts = arguments[0];\n\t\tconst options = arguments[1];\n\n\t\tconst buffers = [];\n\t\tlet size = 0;\n\n\t\tif (blobParts) {\n\t\t\tconst a = blobParts;\n\t\t\tconst length = Number(a.length);\n\t\t\tfor (let i = 0; i < length; i++) {\n\t\t\t\tconst element = a[i];\n\t\t\t\tlet buffer;\n\t\t\t\tif (element instanceof Buffer) {\n\t\t\t\t\tbuffer = element;\n\t\t\t\t} else if (ArrayBuffer.isView(element)) {\n\t\t\t\t\tbuffer = Buffer.from(element.buffer, element.byteOffset, element.byteLength);\n\t\t\t\t} else if (element instanceof ArrayBuffer) {\n\t\t\t\t\tbuffer = Buffer.from(element);\n\t\t\t\t} else if (element instanceof Blob) {\n\t\t\t\t\tbuffer = element[BUFFER];\n\t\t\t\t} else {\n\t\t\t\t\tbuffer = Buffer.from(typeof element === 'string' ? element : String(element));\n\t\t\t\t}\n\t\t\t\tsize += buffer.length;\n\t\t\t\tbuffers.push(buffer);\n\t\t\t}\n\t\t}\n\n\t\tthis[BUFFER] = Buffer.concat(buffers);\n\n\t\tlet type = options && options.type !== undefined && String(options.type).toLowerCase();\n\t\tif (type && !/[^\\u0020-\\u007E]/.test(type)) {\n\t\t\tthis[TYPE] = type;\n\t\t}\n\t}\n\tget size() {\n\t\treturn this[BUFFER].length;\n\t}\n\tget type() {\n\t\treturn this[TYPE];\n\t}\n\ttext() {\n\t\treturn Promise.resolve(this[BUFFER].toString());\n\t}\n\tarrayBuffer() {\n\t\tconst buf = this[BUFFER];\n\t\tconst ab = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);\n\t\treturn Promise.resolve(ab);\n\t}\n\tstream() {\n\t\tconst readable = new Readable();\n\t\treadable._read = function () {};\n\t\treadable.push(this[BUFFER]);\n\t\treadable.push(null);\n\t\treturn readable;\n\t}\n\ttoString() {\n\t\treturn '[object Blob]';\n\t}\n\tslice() {\n\t\tconst size = this.size;\n\n\t\tconst start = arguments[0];\n\t\tconst end = arguments[1];\n\t\tlet relativeStart, relativeEnd;\n\t\tif (start === undefined) {\n\t\t\trelativeStart = 0;\n\t\t} else if (start < 0) {\n\t\t\trelativeStart = Math.max(size + start, 0);\n\t\t} else {\n\t\t\trelativeStart = Math.min(start, size);\n\t\t}\n\t\tif (end === undefined) {\n\t\t\trelativeEnd = size;\n\t\t} else if (end < 0) {\n\t\t\trelativeEnd = Math.max(size + end, 0);\n\t\t} else {\n\t\t\trelativeEnd = Math.min(end, size);\n\t\t}\n\t\tconst span = Math.max(relativeEnd - relativeStart, 0);\n\n\t\tconst buffer = this[BUFFER];\n\t\tconst slicedBuffer = buffer.slice(relativeStart, relativeStart + span);\n\t\tconst blob = new Blob([], { type: arguments[2] });\n\t\tblob[BUFFER] = slicedBuffer;\n\t\treturn blob;\n\t}\n}\n\nObject.defineProperties(Blob.prototype, {\n\tsize: { enumerable: true },\n\ttype: { enumerable: true },\n\tslice: { enumerable: true }\n});\n\nObject.defineProperty(Blob.prototype, Symbol.toStringTag, {\n\tvalue: 'Blob',\n\twritable: false,\n\tenumerable: false,\n\tconfigurable: true\n});\n\n/**\n * fetch-error.js\n *\n * FetchError interface for operational errors\n */\n\n/**\n * Create FetchError instance\n *\n * @param   String      message      Error message for human\n * @param   String      type         Error type for machine\n * @param   String      systemError  For Node.js system error\n * @return  FetchError\n */\nfunction FetchError(message, type, systemError) {\n  Error.call(this, message);\n\n  this.message = message;\n  this.type = type;\n\n  // when err.type is `system`, err.code contains system error code\n  if (systemError) {\n    this.code = this.errno = systemError.code;\n  }\n\n  // hide custom error implementation details from end-users\n  Error.captureStackTrace(this, this.constructor);\n}\n\nFetchError.prototype = Object.create(Error.prototype);\nFetchError.prototype.constructor = FetchError;\nFetchError.prototype.name = 'FetchError';\n\nlet convert;\ntry {\n\tconvert = require('encoding').convert;\n} catch (e) {}\n\nconst INTERNALS = Symbol('Body internals');\n\n// fix an issue where \"PassThrough\" isn't a named export for node <10\nconst PassThrough = Stream.PassThrough;\n\n/**\n * Body mixin\n *\n * Ref: https://fetch.spec.whatwg.org/#body\n *\n * @param   Stream  body  Readable stream\n * @param   Object  opts  Response options\n * @return  Void\n */\nfunction Body(body) {\n\tvar _this = this;\n\n\tvar _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n\t    _ref$size = _ref.size;\n\n\tlet size = _ref$size === undefined ? 0 : _ref$size;\n\tvar _ref$timeout = _ref.timeout;\n\tlet timeout = _ref$timeout === undefined ? 0 : _ref$timeout;\n\n\tif (body == null) {\n\t\t// body is undefined or null\n\t\tbody = null;\n\t} else if (isURLSearchParams(body)) {\n\t\t// body is a URLSearchParams\n\t\tbody = Buffer.from(body.toString());\n\t} else if (isBlob(body)) ; else if (Buffer.isBuffer(body)) ; else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') {\n\t\t// body is ArrayBuffer\n\t\tbody = Buffer.from(body);\n\t} else if (ArrayBuffer.isView(body)) {\n\t\t// body is ArrayBufferView\n\t\tbody = Buffer.from(body.buffer, body.byteOffset, body.byteLength);\n\t} else if (body instanceof Stream) ; else {\n\t\t// none of the above\n\t\t// coerce to string then buffer\n\t\tbody = Buffer.from(String(body));\n\t}\n\tthis[INTERNALS] = {\n\t\tbody,\n\t\tdisturbed: false,\n\t\terror: null\n\t};\n\tthis.size = size;\n\tthis.timeout = timeout;\n\n\tif (body instanceof Stream) {\n\t\tbody.on('error', function (err) {\n\t\t\tconst error = err.name === 'AbortError' ? err : new FetchError(`Invalid response body while trying to fetch ${_this.url}: ${err.message}`, 'system', err);\n\t\t\t_this[INTERNALS].error = error;\n\t\t});\n\t}\n}\n\nBody.prototype = {\n\tget body() {\n\t\treturn this[INTERNALS].body;\n\t},\n\n\tget bodyUsed() {\n\t\treturn this[INTERNALS].disturbed;\n\t},\n\n\t/**\n  * Decode response as ArrayBuffer\n  *\n  * @return  Promise\n  */\n\tarrayBuffer() {\n\t\treturn consumeBody.call(this).then(function (buf) {\n\t\t\treturn buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);\n\t\t});\n\t},\n\n\t/**\n  * Return raw response as Blob\n  *\n  * @return Promise\n  */\n\tblob() {\n\t\tlet ct = this.headers && this.headers.get('content-type') || '';\n\t\treturn consumeBody.call(this).then(function (buf) {\n\t\t\treturn Object.assign(\n\t\t\t// Prevent copying\n\t\t\tnew Blob([], {\n\t\t\t\ttype: ct.toLowerCase()\n\t\t\t}), {\n\t\t\t\t[BUFFER]: buf\n\t\t\t});\n\t\t});\n\t},\n\n\t/**\n  * Decode response as json\n  *\n  * @return  Promise\n  */\n\tjson() {\n\t\tvar _this2 = this;\n\n\t\treturn consumeBody.call(this).then(function (buffer) {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(buffer.toString());\n\t\t\t} catch (err) {\n\t\t\t\treturn Body.Promise.reject(new FetchError(`invalid json response body at ${_this2.url} reason: ${err.message}`, 'invalid-json'));\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n  * Decode response as text\n  *\n  * @return  Promise\n  */\n\ttext() {\n\t\treturn consumeBody.call(this).then(function (buffer) {\n\t\t\treturn buffer.toString();\n\t\t});\n\t},\n\n\t/**\n  * Decode response as buffer (non-spec api)\n  *\n  * @return  Promise\n  */\n\tbuffer() {\n\t\treturn consumeBody.call(this);\n\t},\n\n\t/**\n  * Decode response as text, while automatically detecting the encoding and\n  * trying to decode to UTF-8 (non-spec api)\n  *\n  * @return  Promise\n  */\n\ttextConverted() {\n\t\tvar _this3 = this;\n\n\t\treturn consumeBody.call(this).then(function (buffer) {\n\t\t\treturn convertBody(buffer, _this3.headers);\n\t\t});\n\t}\n};\n\n// In browsers, all properties are enumerable.\nObject.defineProperties(Body.prototype, {\n\tbody: { enumerable: true },\n\tbodyUsed: { enumerable: true },\n\tarrayBuffer: { enumerable: true },\n\tblob: { enumerable: true },\n\tjson: { enumerable: true },\n\ttext: { enumerable: true }\n});\n\nBody.mixIn = function (proto) {\n\tfor (const name of Object.getOwnPropertyNames(Body.prototype)) {\n\t\t// istanbul ignore else: future proof\n\t\tif (!(name in proto)) {\n\t\t\tconst desc = Object.getOwnPropertyDescriptor(Body.prototype, name);\n\t\t\tObject.defineProperty(proto, name, desc);\n\t\t}\n\t}\n};\n\n/**\n * Consume and convert an entire Body to a Buffer.\n *\n * Ref: https://fetch.spec.whatwg.org/#concept-body-consume-body\n *\n * @return  Promise\n */\nfunction consumeBody() {\n\tvar _this4 = this;\n\n\tif (this[INTERNALS].disturbed) {\n\t\treturn Body.Promise.reject(new TypeError(`body used already for: ${this.url}`));\n\t}\n\n\tthis[INTERNALS].disturbed = true;\n\n\tif (this[INTERNALS].error) {\n\t\treturn Body.Promise.reject(this[INTERNALS].error);\n\t}\n\n\tlet body = this.body;\n\n\t// body is null\n\tif (body === null) {\n\t\treturn Body.Promise.resolve(Buffer.alloc(0));\n\t}\n\n\t// body is blob\n\tif (isBlob(body)) {\n\t\tbody = body.stream();\n\t}\n\n\t// body is buffer\n\tif (Buffer.isBuffer(body)) {\n\t\treturn Body.Promise.resolve(body);\n\t}\n\n\t// istanbul ignore if: should never happen\n\tif (!(body instanceof Stream)) {\n\t\treturn Body.Promise.resolve(Buffer.alloc(0));\n\t}\n\n\t// body is stream\n\t// get ready to actually consume the body\n\tlet accum = [];\n\tlet accumBytes = 0;\n\tlet abort = false;\n\n\treturn new Body.Promise(function (resolve, reject) {\n\t\tlet resTimeout;\n\n\t\t// allow timeout on slow response body\n\t\tif (_this4.timeout) {\n\t\t\tresTimeout = setTimeout(function () {\n\t\t\t\tabort = true;\n\t\t\t\treject(new FetchError(`Response timeout while trying to fetch ${_this4.url} (over ${_this4.timeout}ms)`, 'body-timeout'));\n\t\t\t}, _this4.timeout);\n\t\t}\n\n\t\t// handle stream errors\n\t\tbody.on('error', function (err) {\n\t\t\tif (err.name === 'AbortError') {\n\t\t\t\t// if the request was aborted, reject with this Error\n\t\t\t\tabort = true;\n\t\t\t\treject(err);\n\t\t\t} else {\n\t\t\t\t// other errors, such as incorrect content-encoding\n\t\t\t\treject(new FetchError(`Invalid response body while trying to fetch ${_this4.url}: ${err.message}`, 'system', err));\n\t\t\t}\n\t\t});\n\n\t\tbody.on('data', function (chunk) {\n\t\t\tif (abort || chunk === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (_this4.size && accumBytes + chunk.length > _this4.size) {\n\t\t\t\tabort = true;\n\t\t\t\treject(new FetchError(`content size at ${_this4.url} over limit: ${_this4.size}`, 'max-size'));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\taccumBytes += chunk.length;\n\t\t\taccum.push(chunk);\n\t\t});\n\n\t\tbody.on('end', function () {\n\t\t\tif (abort) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tclearTimeout(resTimeout);\n\n\t\t\ttry {\n\t\t\t\tresolve(Buffer.concat(accum, accumBytes));\n\t\t\t} catch (err) {\n\t\t\t\t// handle streams that have accumulated too much data (issue #414)\n\t\t\t\treject(new FetchError(`Could not create Buffer from response body for ${_this4.url}: ${err.message}`, 'system', err));\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Detect buffer encoding and convert to target encoding\n * ref: http://www.w3.org/TR/2011/WD-html5-20110113/parsing.html#determining-the-character-encoding\n *\n * @param   Buffer  buffer    Incoming buffer\n * @param   String  encoding  Target encoding\n * @return  String\n */\nfunction convertBody(buffer, headers) {\n\tif (typeof convert !== 'function') {\n\t\tthrow new Error('The package `encoding` must be installed to use the textConverted() function');\n\t}\n\n\tconst ct = headers.get('content-type');\n\tlet charset = 'utf-8';\n\tlet res, str;\n\n\t// header\n\tif (ct) {\n\t\tres = /charset=([^;]*)/i.exec(ct);\n\t}\n\n\t// no charset in content type, peek at response body for at most 1024 bytes\n\tstr = buffer.slice(0, 1024).toString();\n\n\t// html5\n\tif (!res && str) {\n\t\tres = /<meta.+?charset=(['\"])(.+?)\\1/i.exec(str);\n\t}\n\n\t// html4\n\tif (!res && str) {\n\t\tres = /<meta[\\s]+?http-equiv=(['\"])content-type\\1[\\s]+?content=(['\"])(.+?)\\2/i.exec(str);\n\t\tif (!res) {\n\t\t\tres = /<meta[\\s]+?content=(['\"])(.+?)\\1[\\s]+?http-equiv=(['\"])content-type\\3/i.exec(str);\n\t\t\tif (res) {\n\t\t\t\tres.pop(); // drop last quote\n\t\t\t}\n\t\t}\n\n\t\tif (res) {\n\t\t\tres = /charset=(.*)/i.exec(res.pop());\n\t\t}\n\t}\n\n\t// xml\n\tif (!res && str) {\n\t\tres = /<\\?xml.+?encoding=(['\"])(.+?)\\1/i.exec(str);\n\t}\n\n\t// found charset\n\tif (res) {\n\t\tcharset = res.pop();\n\n\t\t// prevent decode issues when sites use incorrect encoding\n\t\t// ref: https://hsivonen.fi/encoding-menu/\n\t\tif (charset === 'gb2312' || charset === 'gbk') {\n\t\t\tcharset = 'gb18030';\n\t\t}\n\t}\n\n\t// turn raw buffers into a single utf-8 buffer\n\treturn convert(buffer, 'UTF-8', charset).toString();\n}\n\n/**\n * Detect a URLSearchParams object\n * ref: https://github.com/bitinn/node-fetch/issues/296#issuecomment-307598143\n *\n * @param   Object  obj     Object to detect by type or brand\n * @return  String\n */\nfunction isURLSearchParams(obj) {\n\t// Duck-typing as a necessary condition.\n\tif (typeof obj !== 'object' || typeof obj.append !== 'function' || typeof obj.delete !== 'function' || typeof obj.get !== 'function' || typeof obj.getAll !== 'function' || typeof obj.has !== 'function' || typeof obj.set !== 'function') {\n\t\treturn false;\n\t}\n\n\t// Brand-checking and more duck-typing as optional condition.\n\treturn obj.constructor.name === 'URLSearchParams' || Object.prototype.toString.call(obj) === '[object URLSearchParams]' || typeof obj.sort === 'function';\n}\n\n/**\n * Check if `obj` is a W3C `Blob` object (which `File` inherits from)\n * @param  {*} obj\n * @return {boolean}\n */\nfunction isBlob(obj) {\n\treturn typeof obj === 'object' && typeof obj.arrayBuffer === 'function' && typeof obj.type === 'string' && typeof obj.stream === 'function' && typeof obj.constructor === 'function' && typeof obj.constructor.name === 'string' && /^(Blob|File)$/.test(obj.constructor.name) && /^(Blob|File)$/.test(obj[Symbol.toStringTag]);\n}\n\n/**\n * Clone body given Res/Req instance\n *\n * @param   Mixed  instance  Response or Request instance\n * @return  Mixed\n */\nfunction clone(instance) {\n\tlet p1, p2;\n\tlet body = instance.body;\n\n\t// don't allow cloning a used body\n\tif (instance.bodyUsed) {\n\t\tthrow new Error('cannot clone body after it is used');\n\t}\n\n\t// check that body is a stream and not form-data object\n\t// note: we can't clone the form-data object without having it as a dependency\n\tif (body instanceof Stream && typeof body.getBoundary !== 'function') {\n\t\t// tee instance body\n\t\tp1 = new PassThrough();\n\t\tp2 = new PassThrough();\n\t\tbody.pipe(p1);\n\t\tbody.pipe(p2);\n\t\t// set instance body to teed body and return the other teed body\n\t\tinstance[INTERNALS].body = p1;\n\t\tbody = p2;\n\t}\n\n\treturn body;\n}\n\n/**\n * Performs the operation \"extract a `Content-Type` value from |object|\" as\n * specified in the specification:\n * https://fetch.spec.whatwg.org/#concept-bodyinit-extract\n *\n * This function assumes that instance.body is present.\n *\n * @param   Mixed  instance  Any options.body input\n */\nfunction extractContentType(body) {\n\tif (body === null) {\n\t\t// body is null\n\t\treturn null;\n\t} else if (typeof body === 'string') {\n\t\t// body is string\n\t\treturn 'text/plain;charset=UTF-8';\n\t} else if (isURLSearchParams(body)) {\n\t\t// body is a URLSearchParams\n\t\treturn 'application/x-www-form-urlencoded;charset=UTF-8';\n\t} else if (isBlob(body)) {\n\t\t// body is blob\n\t\treturn body.type || null;\n\t} else if (Buffer.isBuffer(body)) {\n\t\t// body is buffer\n\t\treturn null;\n\t} else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') {\n\t\t// body is ArrayBuffer\n\t\treturn null;\n\t} else if (ArrayBuffer.isView(body)) {\n\t\t// body is ArrayBufferView\n\t\treturn null;\n\t} else if (typeof body.getBoundary === 'function') {\n\t\t// detect form data input from form-data module\n\t\treturn `multipart/form-data;boundary=${body.getBoundary()}`;\n\t} else if (body instanceof Stream) {\n\t\t// body is stream\n\t\t// can't really do much about this\n\t\treturn null;\n\t} else {\n\t\t// Body constructor defaults other things to string\n\t\treturn 'text/plain;charset=UTF-8';\n\t}\n}\n\n/**\n * The Fetch Standard treats this as if \"total bytes\" is a property on the body.\n * For us, we have to explicitly get it with a function.\n *\n * ref: https://fetch.spec.whatwg.org/#concept-body-total-bytes\n *\n * @param   Body    instance   Instance of Body\n * @return  Number?            Number of bytes, or null if not possible\n */\nfunction getTotalBytes(instance) {\n\tconst body = instance.body;\n\n\n\tif (body === null) {\n\t\t// body is null\n\t\treturn 0;\n\t} else if (isBlob(body)) {\n\t\treturn body.size;\n\t} else if (Buffer.isBuffer(body)) {\n\t\t// body is buffer\n\t\treturn body.length;\n\t} else if (body && typeof body.getLengthSync === 'function') {\n\t\t// detect form data input from form-data module\n\t\tif (body._lengthRetrievers && body._lengthRetrievers.length == 0 || // 1.x\n\t\tbody.hasKnownLength && body.hasKnownLength()) {\n\t\t\t// 2.x\n\t\t\treturn body.getLengthSync();\n\t\t}\n\t\treturn null;\n\t} else {\n\t\t// body is stream\n\t\treturn null;\n\t}\n}\n\n/**\n * Write a Body to a Node.js WritableStream (e.g. http.Request) object.\n *\n * @param   Body    instance   Instance of Body\n * @return  Void\n */\nfunction writeToStream(dest, instance) {\n\tconst body = instance.body;\n\n\n\tif (body === null) {\n\t\t// body is null\n\t\tdest.end();\n\t} else if (isBlob(body)) {\n\t\tbody.stream().pipe(dest);\n\t} else if (Buffer.isBuffer(body)) {\n\t\t// body is buffer\n\t\tdest.write(body);\n\t\tdest.end();\n\t} else {\n\t\t// body is stream\n\t\tbody.pipe(dest);\n\t}\n}\n\n// expose Promise\nBody.Promise = global.Promise;\n\n/**\n * headers.js\n *\n * Headers class offers convenient helpers\n */\n\nconst invalidTokenRegex = /[^\\^_`a-zA-Z\\-0-9!#$%&'*+.|~]/;\nconst invalidHeaderCharRegex = /[^\\t\\x20-\\x7e\\x80-\\xff]/;\n\nfunction validateName(name) {\n\tname = `${name}`;\n\tif (invalidTokenRegex.test(name) || name === '') {\n\t\tthrow new TypeError(`${name} is not a legal HTTP header name`);\n\t}\n}\n\nfunction validateValue(value) {\n\tvalue = `${value}`;\n\tif (invalidHeaderCharRegex.test(value)) {\n\t\tthrow new TypeError(`${value} is not a legal HTTP header value`);\n\t}\n}\n\n/**\n * Find the key in the map object given a header name.\n *\n * Returns undefined if not found.\n *\n * @param   String  name  Header name\n * @return  String|Undefined\n */\nfunction find(map, name) {\n\tname = name.toLowerCase();\n\tfor (const key in map) {\n\t\tif (key.toLowerCase() === name) {\n\t\t\treturn key;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nconst MAP = Symbol('map');\nclass Headers {\n\t/**\n  * Headers class\n  *\n  * @param   Object  headers  Response headers\n  * @return  Void\n  */\n\tconstructor() {\n\t\tlet init = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined;\n\n\t\tthis[MAP] = Object.create(null);\n\n\t\tif (init instanceof Headers) {\n\t\t\tconst rawHeaders = init.raw();\n\t\t\tconst headerNames = Object.keys(rawHeaders);\n\n\t\t\tfor (const headerName of headerNames) {\n\t\t\t\tfor (const value of rawHeaders[headerName]) {\n\t\t\t\t\tthis.append(headerName, value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\t// We don't worry about converting prop to ByteString here as append()\n\t\t// will handle it.\n\t\tif (init == null) ; else if (typeof init === 'object') {\n\t\t\tconst method = init[Symbol.iterator];\n\t\t\tif (method != null) {\n\t\t\t\tif (typeof method !== 'function') {\n\t\t\t\t\tthrow new TypeError('Header pairs must be iterable');\n\t\t\t\t}\n\n\t\t\t\t// sequence<sequence<ByteString>>\n\t\t\t\t// Note: per spec we have to first exhaust the lists then process them\n\t\t\t\tconst pairs = [];\n\t\t\t\tfor (const pair of init) {\n\t\t\t\t\tif (typeof pair !== 'object' || typeof pair[Symbol.iterator] !== 'function') {\n\t\t\t\t\t\tthrow new TypeError('Each header pair must be iterable');\n\t\t\t\t\t}\n\t\t\t\t\tpairs.push(Array.from(pair));\n\t\t\t\t}\n\n\t\t\t\tfor (const pair of pairs) {\n\t\t\t\t\tif (pair.length !== 2) {\n\t\t\t\t\t\tthrow new TypeError('Each header pair must be a name/value tuple');\n\t\t\t\t\t}\n\t\t\t\t\tthis.append(pair[0], pair[1]);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// record<ByteString, ByteString>\n\t\t\t\tfor (const key of Object.keys(init)) {\n\t\t\t\t\tconst value = init[key];\n\t\t\t\t\tthis.append(key, value);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new TypeError('Provided initializer must be an object');\n\t\t}\n\t}\n\n\t/**\n  * Return combined header value given name\n  *\n  * @param   String  name  Header name\n  * @return  Mixed\n  */\n\tget(name) {\n\t\tname = `${name}`;\n\t\tvalidateName(name);\n\t\tconst key = find(this[MAP], name);\n\t\tif (key === undefined) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this[MAP][key].join(', ');\n\t}\n\n\t/**\n  * Iterate over all headers\n  *\n  * @param   Function  callback  Executed for each item with parameters (value, name, thisArg)\n  * @param   Boolean   thisArg   `this` context for callback function\n  * @return  Void\n  */\n\tforEach(callback) {\n\t\tlet thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;\n\n\t\tlet pairs = getHeaders(this);\n\t\tlet i = 0;\n\t\twhile (i < pairs.length) {\n\t\t\tvar _pairs$i = pairs[i];\n\t\t\tconst name = _pairs$i[0],\n\t\t\t      value = _pairs$i[1];\n\n\t\t\tcallback.call(thisArg, value, name, this);\n\t\t\tpairs = getHeaders(this);\n\t\t\ti++;\n\t\t}\n\t}\n\n\t/**\n  * Overwrite header values given name\n  *\n  * @param   String  name   Header name\n  * @param   String  value  Header value\n  * @return  Void\n  */\n\tset(name, value) {\n\t\tname = `${name}`;\n\t\tvalue = `${value}`;\n\t\tvalidateName(name);\n\t\tvalidateValue(value);\n\t\tconst key = find(this[MAP], name);\n\t\tthis[MAP][key !== undefined ? key : name] = [value];\n\t}\n\n\t/**\n  * Append a value onto existing header\n  *\n  * @param   String  name   Header name\n  * @param   String  value  Header value\n  * @return  Void\n  */\n\tappend(name, value) {\n\t\tname = `${name}`;\n\t\tvalue = `${value}`;\n\t\tvalidateName(name);\n\t\tvalidateValue(value);\n\t\tconst key = find(this[MAP], name);\n\t\tif (key !== undefined) {\n\t\t\tthis[MAP][key].push(value);\n\t\t} else {\n\t\t\tthis[MAP][name] = [value];\n\t\t}\n\t}\n\n\t/**\n  * Check for header name existence\n  *\n  * @param   String   name  Header name\n  * @return  Boolean\n  */\n\thas(name) {\n\t\tname = `${name}`;\n\t\tvalidateName(name);\n\t\treturn find(this[MAP], name) !== undefined;\n\t}\n\n\t/**\n  * Delete all header values given name\n  *\n  * @param   String  name  Header name\n  * @return  Void\n  */\n\tdelete(name) {\n\t\tname = `${name}`;\n\t\tvalidateName(name);\n\t\tconst key = find(this[MAP], name);\n\t\tif (key !== undefined) {\n\t\t\tdelete this[MAP][key];\n\t\t}\n\t}\n\n\t/**\n  * Return raw headers (non-spec api)\n  *\n  * @return  Object\n  */\n\traw() {\n\t\treturn this[MAP];\n\t}\n\n\t/**\n  * Get an iterator on keys.\n  *\n  * @return  Iterator\n  */\n\tkeys() {\n\t\treturn createHeadersIterator(this, 'key');\n\t}\n\n\t/**\n  * Get an iterator on values.\n  *\n  * @return  Iterator\n  */\n\tvalues() {\n\t\treturn createHeadersIterator(this, 'value');\n\t}\n\n\t/**\n  * Get an iterator on entries.\n  *\n  * This is the default iterator of the Headers object.\n  *\n  * @return  Iterator\n  */\n\t[Symbol.iterator]() {\n\t\treturn createHeadersIterator(this, 'key+value');\n\t}\n}\nHeaders.prototype.entries = Headers.prototype[Symbol.iterator];\n\nObject.defineProperty(Headers.prototype, Symbol.toStringTag, {\n\tvalue: 'Headers',\n\twritable: false,\n\tenumerable: false,\n\tconfigurable: true\n});\n\nObject.defineProperties(Headers.prototype, {\n\tget: { enumerable: true },\n\tforEach: { enumerable: true },\n\tset: { enumerable: true },\n\tappend: { enumerable: true },\n\thas: { enumerable: true },\n\tdelete: { enumerable: true },\n\tkeys: { enumerable: true },\n\tvalues: { enumerable: true },\n\tentries: { enumerable: true }\n});\n\nfunction getHeaders(headers) {\n\tlet kind = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'key+value';\n\n\tconst keys = Object.keys(headers[MAP]).sort();\n\treturn keys.map(kind === 'key' ? function (k) {\n\t\treturn k.toLowerCase();\n\t} : kind === 'value' ? function (k) {\n\t\treturn headers[MAP][k].join(', ');\n\t} : function (k) {\n\t\treturn [k.toLowerCase(), headers[MAP][k].join(', ')];\n\t});\n}\n\nconst INTERNAL = Symbol('internal');\n\nfunction createHeadersIterator(target, kind) {\n\tconst iterator = Object.create(HeadersIteratorPrototype);\n\titerator[INTERNAL] = {\n\t\ttarget,\n\t\tkind,\n\t\tindex: 0\n\t};\n\treturn iterator;\n}\n\nconst HeadersIteratorPrototype = Object.setPrototypeOf({\n\tnext() {\n\t\t// istanbul ignore if\n\t\tif (!this || Object.getPrototypeOf(this) !== HeadersIteratorPrototype) {\n\t\t\tthrow new TypeError('Value of `this` is not a HeadersIterator');\n\t\t}\n\n\t\tvar _INTERNAL = this[INTERNAL];\n\t\tconst target = _INTERNAL.target,\n\t\t      kind = _INTERNAL.kind,\n\t\t      index = _INTERNAL.index;\n\n\t\tconst values = getHeaders(target, kind);\n\t\tconst len = values.length;\n\t\tif (index >= len) {\n\t\t\treturn {\n\t\t\t\tvalue: undefined,\n\t\t\t\tdone: true\n\t\t\t};\n\t\t}\n\n\t\tthis[INTERNAL].index = index + 1;\n\n\t\treturn {\n\t\t\tvalue: values[index],\n\t\t\tdone: false\n\t\t};\n\t}\n}, Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())));\n\nObject.defineProperty(HeadersIteratorPrototype, Symbol.toStringTag, {\n\tvalue: 'HeadersIterator',\n\twritable: false,\n\tenumerable: false,\n\tconfigurable: true\n});\n\n/**\n * Export the Headers object in a form that Node.js can consume.\n *\n * @param   Headers  headers\n * @return  Object\n */\nfunction exportNodeCompatibleHeaders(headers) {\n\tconst obj = Object.assign({ __proto__: null }, headers[MAP]);\n\n\t// http.request() only supports string as Host header. This hack makes\n\t// specifying custom Host header possible.\n\tconst hostHeaderKey = find(headers[MAP], 'Host');\n\tif (hostHeaderKey !== undefined) {\n\t\tobj[hostHeaderKey] = obj[hostHeaderKey][0];\n\t}\n\n\treturn obj;\n}\n\n/**\n * Create a Headers object from an object of headers, ignoring those that do\n * not conform to HTTP grammar productions.\n *\n * @param   Object  obj  Object of headers\n * @return  Headers\n */\nfunction createHeadersLenient(obj) {\n\tconst headers = new Headers();\n\tfor (const name of Object.keys(obj)) {\n\t\tif (invalidTokenRegex.test(name)) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (Array.isArray(obj[name])) {\n\t\t\tfor (const val of obj[name]) {\n\t\t\t\tif (invalidHeaderCharRegex.test(val)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (headers[MAP][name] === undefined) {\n\t\t\t\t\theaders[MAP][name] = [val];\n\t\t\t\t} else {\n\t\t\t\t\theaders[MAP][name].push(val);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (!invalidHeaderCharRegex.test(obj[name])) {\n\t\t\theaders[MAP][name] = [obj[name]];\n\t\t}\n\t}\n\treturn headers;\n}\n\nconst INTERNALS$1 = Symbol('Response internals');\n\n// fix an issue where \"STATUS_CODES\" aren't a named export for node <10\nconst STATUS_CODES = http.STATUS_CODES;\n\n/**\n * Response class\n *\n * @param   Stream  body  Readable stream\n * @param   Object  opts  Response options\n * @return  Void\n */\nclass Response {\n\tconstructor() {\n\t\tlet body = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\t\tlet opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\tBody.call(this, body, opts);\n\n\t\tconst status = opts.status || 200;\n\t\tconst headers = new Headers(opts.headers);\n\n\t\tif (body != null && !headers.has('Content-Type')) {\n\t\t\tconst contentType = extractContentType(body);\n\t\t\tif (contentType) {\n\t\t\t\theaders.append('Content-Type', contentType);\n\t\t\t}\n\t\t}\n\n\t\tthis[INTERNALS$1] = {\n\t\t\turl: opts.url,\n\t\t\tstatus,\n\t\t\tstatusText: opts.statusText || STATUS_CODES[status],\n\t\t\theaders,\n\t\t\tcounter: opts.counter\n\t\t};\n\t}\n\n\tget url() {\n\t\treturn this[INTERNALS$1].url || '';\n\t}\n\n\tget status() {\n\t\treturn this[INTERNALS$1].status;\n\t}\n\n\t/**\n  * Convenience property representing if the request ended normally\n  */\n\tget ok() {\n\t\treturn this[INTERNALS$1].status >= 200 && this[INTERNALS$1].status < 300;\n\t}\n\n\tget redirected() {\n\t\treturn this[INTERNALS$1].counter > 0;\n\t}\n\n\tget statusText() {\n\t\treturn this[INTERNALS$1].statusText;\n\t}\n\n\tget headers() {\n\t\treturn this[INTERNALS$1].headers;\n\t}\n\n\t/**\n  * Clone this response\n  *\n  * @return  Response\n  */\n\tclone() {\n\t\treturn new Response(clone(this), {\n\t\t\turl: this.url,\n\t\t\tstatus: this.status,\n\t\t\tstatusText: this.statusText,\n\t\t\theaders: this.headers,\n\t\t\tok: this.ok,\n\t\t\tredirected: this.redirected\n\t\t});\n\t}\n}\n\nBody.mixIn(Response.prototype);\n\nObject.defineProperties(Response.prototype, {\n\turl: { enumerable: true },\n\tstatus: { enumerable: true },\n\tok: { enumerable: true },\n\tredirected: { enumerable: true },\n\tstatusText: { enumerable: true },\n\theaders: { enumerable: true },\n\tclone: { enumerable: true }\n});\n\nObject.defineProperty(Response.prototype, Symbol.toStringTag, {\n\tvalue: 'Response',\n\twritable: false,\n\tenumerable: false,\n\tconfigurable: true\n});\n\nconst INTERNALS$2 = Symbol('Request internals');\nconst URL = Url.URL || whatwgUrl.URL;\n\n// fix an issue where \"format\", \"parse\" aren't a named export for node <10\nconst parse_url = Url.parse;\nconst format_url = Url.format;\n\n/**\n * Wrapper around `new URL` to handle arbitrary URLs\n *\n * @param  {string} urlStr\n * @return {void}\n */\nfunction parseURL(urlStr) {\n\t/*\n \tCheck whether the URL is absolute or not\n \t\tScheme: https://tools.ietf.org/html/rfc3986#section-3.1\n \tAbsolute URL: https://tools.ietf.org/html/rfc3986#section-4.3\n */\n\tif (/^[a-zA-Z][a-zA-Z\\d+\\-.]*:/.exec(urlStr)) {\n\t\turlStr = new URL(urlStr).toString();\n\t}\n\n\t// Fallback to old implementation for arbitrary URLs\n\treturn parse_url(urlStr);\n}\n\nconst streamDestructionSupported = 'destroy' in Stream.Readable.prototype;\n\n/**\n * Check if a value is an instance of Request.\n *\n * @param   Mixed   input\n * @return  Boolean\n */\nfunction isRequest(input) {\n\treturn typeof input === 'object' && typeof input[INTERNALS$2] === 'object';\n}\n\nfunction isAbortSignal(signal) {\n\tconst proto = signal && typeof signal === 'object' && Object.getPrototypeOf(signal);\n\treturn !!(proto && proto.constructor.name === 'AbortSignal');\n}\n\n/**\n * Request class\n *\n * @param   Mixed   input  Url or Request instance\n * @param   Object  init   Custom options\n * @return  Void\n */\nclass Request {\n\tconstructor(input) {\n\t\tlet init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\tlet parsedURL;\n\n\t\t// normalize input\n\t\tif (!isRequest(input)) {\n\t\t\tif (input && input.href) {\n\t\t\t\t// in order to support Node.js' Url objects; though WHATWG's URL objects\n\t\t\t\t// will fall into this branch also (since their `toString()` will return\n\t\t\t\t// `href` property anyway)\n\t\t\t\tparsedURL = parseURL(input.href);\n\t\t\t} else {\n\t\t\t\t// coerce input to a string before attempting to parse\n\t\t\t\tparsedURL = parseURL(`${input}`);\n\t\t\t}\n\t\t\tinput = {};\n\t\t} else {\n\t\t\tparsedURL = parseURL(input.url);\n\t\t}\n\n\t\tlet method = init.method || input.method || 'GET';\n\t\tmethod = method.toUpperCase();\n\n\t\tif ((init.body != null || isRequest(input) && input.body !== null) && (method === 'GET' || method === 'HEAD')) {\n\t\t\tthrow new TypeError('Request with GET/HEAD method cannot have body');\n\t\t}\n\n\t\tlet inputBody = init.body != null ? init.body : isRequest(input) && input.body !== null ? clone(input) : null;\n\n\t\tBody.call(this, inputBody, {\n\t\t\ttimeout: init.timeout || input.timeout || 0,\n\t\t\tsize: init.size || input.size || 0\n\t\t});\n\n\t\tconst headers = new Headers(init.headers || input.headers || {});\n\n\t\tif (inputBody != null && !headers.has('Content-Type')) {\n\t\t\tconst contentType = extractContentType(inputBody);\n\t\t\tif (contentType) {\n\t\t\t\theaders.append('Content-Type', contentType);\n\t\t\t}\n\t\t}\n\n\t\tlet signal = isRequest(input) ? input.signal : null;\n\t\tif ('signal' in init) signal = init.signal;\n\n\t\tif (signal != null && !isAbortSignal(signal)) {\n\t\t\tthrow new TypeError('Expected signal to be an instanceof AbortSignal');\n\t\t}\n\n\t\tthis[INTERNALS$2] = {\n\t\t\tmethod,\n\t\t\tredirect: init.redirect || input.redirect || 'follow',\n\t\t\theaders,\n\t\t\tparsedURL,\n\t\t\tsignal\n\t\t};\n\n\t\t// node-fetch-only options\n\t\tthis.follow = init.follow !== undefined ? init.follow : input.follow !== undefined ? input.follow : 20;\n\t\tthis.compress = init.compress !== undefined ? init.compress : input.compress !== undefined ? input.compress : true;\n\t\tthis.counter = init.counter || input.counter || 0;\n\t\tthis.agent = init.agent || input.agent;\n\t}\n\n\tget method() {\n\t\treturn this[INTERNALS$2].method;\n\t}\n\n\tget url() {\n\t\treturn format_url(this[INTERNALS$2].parsedURL);\n\t}\n\n\tget headers() {\n\t\treturn this[INTERNALS$2].headers;\n\t}\n\n\tget redirect() {\n\t\treturn this[INTERNALS$2].redirect;\n\t}\n\n\tget signal() {\n\t\treturn this[INTERNALS$2].signal;\n\t}\n\n\t/**\n  * Clone this request\n  *\n  * @return  Request\n  */\n\tclone() {\n\t\treturn new Request(this);\n\t}\n}\n\nBody.mixIn(Request.prototype);\n\nObject.defineProperty(Request.prototype, Symbol.toStringTag, {\n\tvalue: 'Request',\n\twritable: false,\n\tenumerable: false,\n\tconfigurable: true\n});\n\nObject.defineProperties(Request.prototype, {\n\tmethod: { enumerable: true },\n\turl: { enumerable: true },\n\theaders: { enumerable: true },\n\tredirect: { enumerable: true },\n\tclone: { enumerable: true },\n\tsignal: { enumerable: true }\n});\n\n/**\n * Convert a Request to Node.js http request options.\n *\n * @param   Request  A Request instance\n * @return  Object   The options object to be passed to http.request\n */\nfunction getNodeRequestOptions(request) {\n\tconst parsedURL = request[INTERNALS$2].parsedURL;\n\tconst headers = new Headers(request[INTERNALS$2].headers);\n\n\t// fetch step 1.3\n\tif (!headers.has('Accept')) {\n\t\theaders.set('Accept', '*/*');\n\t}\n\n\t// Basic fetch\n\tif (!parsedURL.protocol || !parsedURL.hostname) {\n\t\tthrow new TypeError('Only absolute URLs are supported');\n\t}\n\n\tif (!/^https?:$/.test(parsedURL.protocol)) {\n\t\tthrow new TypeError('Only HTTP(S) protocols are supported');\n\t}\n\n\tif (request.signal && request.body instanceof Stream.Readable && !streamDestructionSupported) {\n\t\tthrow new Error('Cancellation of streamed requests with AbortSignal is not supported in node < 8');\n\t}\n\n\t// HTTP-network-or-cache fetch steps 2.4-2.7\n\tlet contentLengthValue = null;\n\tif (request.body == null && /^(POST|PUT)$/i.test(request.method)) {\n\t\tcontentLengthValue = '0';\n\t}\n\tif (request.body != null) {\n\t\tconst totalBytes = getTotalBytes(request);\n\t\tif (typeof totalBytes === 'number') {\n\t\t\tcontentLengthValue = String(totalBytes);\n\t\t}\n\t}\n\tif (contentLengthValue) {\n\t\theaders.set('Content-Length', contentLengthValue);\n\t}\n\n\t// HTTP-network-or-cache fetch step 2.11\n\tif (!headers.has('User-Agent')) {\n\t\theaders.set('User-Agent', 'node-fetch/1.0 (+https://github.com/bitinn/node-fetch)');\n\t}\n\n\t// HTTP-network-or-cache fetch step 2.15\n\tif (request.compress && !headers.has('Accept-Encoding')) {\n\t\theaders.set('Accept-Encoding', 'gzip,deflate');\n\t}\n\n\tlet agent = request.agent;\n\tif (typeof agent === 'function') {\n\t\tagent = agent(parsedURL);\n\t}\n\n\t// HTTP-network fetch step 4.2\n\t// chunked encoding is handled by Node.js\n\n\treturn Object.assign({}, parsedURL, {\n\t\tmethod: request.method,\n\t\theaders: exportNodeCompatibleHeaders(headers),\n\t\tagent\n\t});\n}\n\n/**\n * abort-error.js\n *\n * AbortError interface for cancelled requests\n */\n\n/**\n * Create AbortError instance\n *\n * @param   String      message      Error message for human\n * @return  AbortError\n */\nfunction AbortError(message) {\n  Error.call(this, message);\n\n  this.type = 'aborted';\n  this.message = message;\n\n  // hide custom error implementation details from end-users\n  Error.captureStackTrace(this, this.constructor);\n}\n\nAbortError.prototype = Object.create(Error.prototype);\nAbortError.prototype.constructor = AbortError;\nAbortError.prototype.name = 'AbortError';\n\nconst URL$1 = Url.URL || whatwgUrl.URL;\n\n// fix an issue where \"PassThrough\", \"resolve\" aren't a named export for node <10\nconst PassThrough$1 = Stream.PassThrough;\n\nconst isDomainOrSubdomain = function isDomainOrSubdomain(destination, original) {\n\tconst orig = new URL$1(original).hostname;\n\tconst dest = new URL$1(destination).hostname;\n\n\treturn orig === dest || orig[orig.length - dest.length - 1] === '.' && orig.endsWith(dest);\n};\n\n/**\n * isSameProtocol reports whether the two provided URLs use the same protocol.\n *\n * Both domains must already be in canonical form.\n * @param {string|URL} original\n * @param {string|URL} destination\n */\nconst isSameProtocol = function isSameProtocol(destination, original) {\n\tconst orig = new URL$1(original).protocol;\n\tconst dest = new URL$1(destination).protocol;\n\n\treturn orig === dest;\n};\n\n/**\n * Fetch function\n *\n * @param   Mixed    url   Absolute url or Request instance\n * @param   Object   opts  Fetch options\n * @return  Promise\n */\nfunction fetch(url, opts) {\n\n\t// allow custom promise\n\tif (!fetch.Promise) {\n\t\tthrow new Error('native promise missing, set fetch.Promise to your favorite alternative');\n\t}\n\n\tBody.Promise = fetch.Promise;\n\n\t// wrap http.request into fetch\n\treturn new fetch.Promise(function (resolve, reject) {\n\t\t// build request object\n\t\tconst request = new Request(url, opts);\n\t\tconst options = getNodeRequestOptions(request);\n\n\t\tconst send = (options.protocol === 'https:' ? https : http).request;\n\t\tconst signal = request.signal;\n\n\t\tlet response = null;\n\n\t\tconst abort = function abort() {\n\t\t\tlet error = new AbortError('The user aborted a request.');\n\t\t\treject(error);\n\t\t\tif (request.body && request.body instanceof Stream.Readable) {\n\t\t\t\tdestroyStream(request.body, error);\n\t\t\t}\n\t\t\tif (!response || !response.body) return;\n\t\t\tresponse.body.emit('error', error);\n\t\t};\n\n\t\tif (signal && signal.aborted) {\n\t\t\tabort();\n\t\t\treturn;\n\t\t}\n\n\t\tconst abortAndFinalize = function abortAndFinalize() {\n\t\t\tabort();\n\t\t\tfinalize();\n\t\t};\n\n\t\t// send request\n\t\tconst req = send(options);\n\t\tlet reqTimeout;\n\n\t\tif (signal) {\n\t\t\tsignal.addEventListener('abort', abortAndFinalize);\n\t\t}\n\n\t\tfunction finalize() {\n\t\t\treq.abort();\n\t\t\tif (signal) signal.removeEventListener('abort', abortAndFinalize);\n\t\t\tclearTimeout(reqTimeout);\n\t\t}\n\n\t\tif (request.timeout) {\n\t\t\treq.once('socket', function (socket) {\n\t\t\t\treqTimeout = setTimeout(function () {\n\t\t\t\t\treject(new FetchError(`network timeout at: ${request.url}`, 'request-timeout'));\n\t\t\t\t\tfinalize();\n\t\t\t\t}, request.timeout);\n\t\t\t});\n\t\t}\n\n\t\treq.on('error', function (err) {\n\t\t\treject(new FetchError(`request to ${request.url} failed, reason: ${err.message}`, 'system', err));\n\n\t\t\tif (response && response.body) {\n\t\t\t\tdestroyStream(response.body, err);\n\t\t\t}\n\n\t\t\tfinalize();\n\t\t});\n\n\t\tfixResponseChunkedTransferBadEnding(req, function (err) {\n\t\t\tif (signal && signal.aborted) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (response && response.body) {\n\t\t\t\tdestroyStream(response.body, err);\n\t\t\t}\n\t\t});\n\n\t\t/* c8 ignore next 18 */\n\t\tif (parseInt(process.version.substring(1)) < 14) {\n\t\t\t// Before Node.js 14, pipeline() does not fully support async iterators and does not always\n\t\t\t// properly handle when the socket close/end events are out of order.\n\t\t\treq.on('socket', function (s) {\n\t\t\t\ts.addListener('close', function (hadError) {\n\t\t\t\t\t// if a data listener is still present we didn't end cleanly\n\t\t\t\t\tconst hasDataListener = s.listenerCount('data') > 0;\n\n\t\t\t\t\t// if end happened before close but the socket didn't emit an error, do it now\n\t\t\t\t\tif (response && hasDataListener && !hadError && !(signal && signal.aborted)) {\n\t\t\t\t\t\tconst err = new Error('Premature close');\n\t\t\t\t\t\terr.code = 'ERR_STREAM_PREMATURE_CLOSE';\n\t\t\t\t\t\tresponse.body.emit('error', err);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\treq.on('response', function (res) {\n\t\t\tclearTimeout(reqTimeout);\n\n\t\t\tconst headers = createHeadersLenient(res.headers);\n\n\t\t\t// HTTP fetch step 5\n\t\t\tif (fetch.isRedirect(res.statusCode)) {\n\t\t\t\t// HTTP fetch step 5.2\n\t\t\t\tconst location = headers.get('Location');\n\n\t\t\t\t// HTTP fetch step 5.3\n\t\t\t\tlet locationURL = null;\n\t\t\t\ttry {\n\t\t\t\t\tlocationURL = location === null ? null : new URL$1(location, request.url).toString();\n\t\t\t\t} catch (err) {\n\t\t\t\t\t// error here can only be invalid URL in Location: header\n\t\t\t\t\t// do not throw when options.redirect == manual\n\t\t\t\t\t// let the user extract the errorneous redirect URL\n\t\t\t\t\tif (request.redirect !== 'manual') {\n\t\t\t\t\t\treject(new FetchError(`uri requested responds with an invalid redirect URL: ${location}`, 'invalid-redirect'));\n\t\t\t\t\t\tfinalize();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// HTTP fetch step 5.5\n\t\t\t\tswitch (request.redirect) {\n\t\t\t\t\tcase 'error':\n\t\t\t\t\t\treject(new FetchError(`uri requested responds with a redirect, redirect mode is set to error: ${request.url}`, 'no-redirect'));\n\t\t\t\t\t\tfinalize();\n\t\t\t\t\t\treturn;\n\t\t\t\t\tcase 'manual':\n\t\t\t\t\t\t// node-fetch-specific step: make manual redirect a bit easier to use by setting the Location header value to the resolved URL.\n\t\t\t\t\t\tif (locationURL !== null) {\n\t\t\t\t\t\t\t// handle corrupted header\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\theaders.set('Location', locationURL);\n\t\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\t\t// istanbul ignore next: nodejs server prevent invalid response headers, we can't test this through normal request\n\t\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'follow':\n\t\t\t\t\t\t// HTTP-redirect fetch step 2\n\t\t\t\t\t\tif (locationURL === null) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// HTTP-redirect fetch step 5\n\t\t\t\t\t\tif (request.counter >= request.follow) {\n\t\t\t\t\t\t\treject(new FetchError(`maximum redirect reached at: ${request.url}`, 'max-redirect'));\n\t\t\t\t\t\t\tfinalize();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// HTTP-redirect fetch step 6 (counter increment)\n\t\t\t\t\t\t// Create a new Request object.\n\t\t\t\t\t\tconst requestOpts = {\n\t\t\t\t\t\t\theaders: new Headers(request.headers),\n\t\t\t\t\t\t\tfollow: request.follow,\n\t\t\t\t\t\t\tcounter: request.counter + 1,\n\t\t\t\t\t\t\tagent: request.agent,\n\t\t\t\t\t\t\tcompress: request.compress,\n\t\t\t\t\t\t\tmethod: request.method,\n\t\t\t\t\t\t\tbody: request.body,\n\t\t\t\t\t\t\tsignal: request.signal,\n\t\t\t\t\t\t\ttimeout: request.timeout,\n\t\t\t\t\t\t\tsize: request.size\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif (!isDomainOrSubdomain(request.url, locationURL) || !isSameProtocol(request.url, locationURL)) {\n\t\t\t\t\t\t\tfor (const name of ['authorization', 'www-authenticate', 'cookie', 'cookie2']) {\n\t\t\t\t\t\t\t\trequestOpts.headers.delete(name);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// HTTP-redirect fetch step 9\n\t\t\t\t\t\tif (res.statusCode !== 303 && request.body && getTotalBytes(request) === null) {\n\t\t\t\t\t\t\treject(new FetchError('Cannot follow redirect with body being a readable stream', 'unsupported-redirect'));\n\t\t\t\t\t\t\tfinalize();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// HTTP-redirect fetch step 11\n\t\t\t\t\t\tif (res.statusCode === 303 || (res.statusCode === 301 || res.statusCode === 302) && request.method === 'POST') {\n\t\t\t\t\t\t\trequestOpts.method = 'GET';\n\t\t\t\t\t\t\trequestOpts.body = undefined;\n\t\t\t\t\t\t\trequestOpts.headers.delete('content-length');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// HTTP-redirect fetch step 15\n\t\t\t\t\t\tresolve(fetch(new Request(locationURL, requestOpts)));\n\t\t\t\t\t\tfinalize();\n\t\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// prepare response\n\t\t\tres.once('end', function () {\n\t\t\t\tif (signal) signal.removeEventListener('abort', abortAndFinalize);\n\t\t\t});\n\t\t\tlet body = res.pipe(new PassThrough$1());\n\n\t\t\tconst response_options = {\n\t\t\t\turl: request.url,\n\t\t\t\tstatus: res.statusCode,\n\t\t\t\tstatusText: res.statusMessage,\n\t\t\t\theaders: headers,\n\t\t\t\tsize: request.size,\n\t\t\t\ttimeout: request.timeout,\n\t\t\t\tcounter: request.counter\n\t\t\t};\n\n\t\t\t// HTTP-network fetch step 12.1.1.3\n\t\t\tconst codings = headers.get('Content-Encoding');\n\n\t\t\t// HTTP-network fetch step 12.1.1.4: handle content codings\n\n\t\t\t// in following scenarios we ignore compression support\n\t\t\t// 1. compression support is disabled\n\t\t\t// 2. HEAD request\n\t\t\t// 3. no Content-Encoding header\n\t\t\t// 4. no content response (204)\n\t\t\t// 5. content not modified response (304)\n\t\t\tif (!request.compress || request.method === 'HEAD' || codings === null || res.statusCode === 204 || res.statusCode === 304) {\n\t\t\t\tresponse = new Response(body, response_options);\n\t\t\t\tresolve(response);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// For Node v6+\n\t\t\t// Be less strict when decoding compressed responses, since sometimes\n\t\t\t// servers send slightly invalid responses that are still accepted\n\t\t\t// by common browsers.\n\t\t\t// Always using Z_SYNC_FLUSH is what cURL does.\n\t\t\tconst zlibOptions = {\n\t\t\t\tflush: zlib.Z_SYNC_FLUSH,\n\t\t\t\tfinishFlush: zlib.Z_SYNC_FLUSH\n\t\t\t};\n\n\t\t\t// for gzip\n\t\t\tif (codings == 'gzip' || codings == 'x-gzip') {\n\t\t\t\tbody = body.pipe(zlib.createGunzip(zlibOptions));\n\t\t\t\tresponse = new Response(body, response_options);\n\t\t\t\tresolve(response);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// for deflate\n\t\t\tif (codings == 'deflate' || codings == 'x-deflate') {\n\t\t\t\t// handle the infamous raw deflate response from old servers\n\t\t\t\t// a hack for old IIS and Apache servers\n\t\t\t\tconst raw = res.pipe(new PassThrough$1());\n\t\t\t\traw.once('data', function (chunk) {\n\t\t\t\t\t// see http://stackoverflow.com/questions/37519828\n\t\t\t\t\tif ((chunk[0] & 0x0F) === 0x08) {\n\t\t\t\t\t\tbody = body.pipe(zlib.createInflate());\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbody = body.pipe(zlib.createInflateRaw());\n\t\t\t\t\t}\n\t\t\t\t\tresponse = new Response(body, response_options);\n\t\t\t\t\tresolve(response);\n\t\t\t\t});\n\t\t\t\traw.on('end', function () {\n\t\t\t\t\t// some old IIS servers return zero-length OK deflate responses, so 'data' is never emitted.\n\t\t\t\t\tif (!response) {\n\t\t\t\t\t\tresponse = new Response(body, response_options);\n\t\t\t\t\t\tresolve(response);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// for br\n\t\t\tif (codings == 'br' && typeof zlib.createBrotliDecompress === 'function') {\n\t\t\t\tbody = body.pipe(zlib.createBrotliDecompress());\n\t\t\t\tresponse = new Response(body, response_options);\n\t\t\t\tresolve(response);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// otherwise, use response as-is\n\t\t\tresponse = new Response(body, response_options);\n\t\t\tresolve(response);\n\t\t});\n\n\t\twriteToStream(req, request);\n\t});\n}\nfunction fixResponseChunkedTransferBadEnding(request, errorCallback) {\n\tlet socket;\n\n\trequest.on('socket', function (s) {\n\t\tsocket = s;\n\t});\n\n\trequest.on('response', function (response) {\n\t\tconst headers = response.headers;\n\n\t\tif (headers['transfer-encoding'] === 'chunked' && !headers['content-length']) {\n\t\t\tresponse.once('close', function (hadError) {\n\t\t\t\t// tests for socket presence, as in some situations the\n\t\t\t\t// the 'socket' event is not triggered for the request\n\t\t\t\t// (happens in deno), avoids `TypeError`\n\t\t\t\t// if a data listener is still present we didn't end cleanly\n\t\t\t\tconst hasDataListener = socket && socket.listenerCount('data') > 0;\n\n\t\t\t\tif (hasDataListener && !hadError) {\n\t\t\t\t\tconst err = new Error('Premature close');\n\t\t\t\t\terr.code = 'ERR_STREAM_PREMATURE_CLOSE';\n\t\t\t\t\terrorCallback(err);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n}\n\nfunction destroyStream(stream, err) {\n\tif (stream.destroy) {\n\t\tstream.destroy(err);\n\t} else {\n\t\t// node < 8\n\t\tstream.emit('error', err);\n\t\tstream.end();\n\t}\n}\n\n/**\n * Redirect code matching\n *\n * @param   Number   code  Status code\n * @return  Boolean\n */\nfetch.isRedirect = function (code) {\n\treturn code === 301 || code === 302 || code === 303 || code === 307 || code === 308;\n};\n\n// expose Promise\nfetch.Promise = global.Promise;\n\nmodule.exports = exports = fetch;\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = exports;\nexports.Headers = Headers;\nexports.Request = Request;\nexports.Response = Response;\nexports.FetchError = FetchError;\nexports.AbortError = AbortError;\n", "'use strict';\n\nconst isStream = stream =>\n\tstream !== null &&\n\ttypeof stream === 'object' &&\n\ttypeof stream.pipe === 'function';\n\nisStream.writable = stream =>\n\tisStream(stream) &&\n\tstream.writable !== false &&\n\ttypeof stream._write === 'function' &&\n\ttypeof stream._writableState === 'object';\n\nisStream.readable = stream =>\n\tisStream(stream) &&\n\tstream.readable !== false &&\n\ttypeof stream._read === 'function' &&\n\ttypeof stream._readableState === 'object';\n\nisStream.duplex = stream =>\n\tisStream.writable(stream) &&\n\tisStream.readable(stream);\n\nisStream.transform = stream =>\n\tisStream.duplex(stream) &&\n\ttypeof stream._transform === 'function';\n\nmodule.exports = isStream;\n", "{\n  \"name\": \"gaxios\",\n  \"version\": \"6.7.1\",\n  \"description\": \"A simple common HTTP client specifically for Google APIs and services.\",\n  \"main\": \"build/src/index.js\",\n  \"types\": \"build/src/index.d.ts\",\n  \"files\": [\n    \"build/src\"\n  ],\n  \"scripts\": {\n    \"lint\": \"gts check\",\n    \"test\": \"c8 mocha build/test\",\n    \"presystem-test\": \"npm run compile\",\n    \"system-test\": \"mocha build/system-test --timeout 80000\",\n    \"compile\": \"tsc -p .\",\n    \"fix\": \"gts fix\",\n    \"prepare\": \"npm run compile\",\n    \"pretest\": \"npm run compile\",\n    \"webpack\": \"webpack\",\n    \"prebrowser-test\": \"npm run compile\",\n    \"browser-test\": \"node build/browser-test/browser-test-runner.js\",\n    \"docs\": \"compodoc src/\",\n    \"docs-test\": \"linkinator docs\",\n    \"predocs-test\": \"npm run docs\",\n    \"samples-test\": \"cd samples/ && npm link ../ && npm test && cd ../\",\n    \"prelint\": \"cd samples; npm link ../; npm install\",\n    \"clean\": \"gts clean\",\n    \"precompile\": \"gts clean\"\n  },\n  \"repository\": \"googleapis/gaxios\",\n  \"keywords\": [\n    \"google\"\n  ],\n  \"engines\": {\n    \"node\": \">=14\"\n  },\n  \"author\": \"Google, LLC\",\n  \"license\": \"Apache-2.0\",\n  \"devDependencies\": {\n    \"@babel/plugin-proposal-private-methods\": \"^7.18.6\",\n    \"@compodoc/compodoc\": \"1.1.19\",\n    \"@types/cors\": \"^2.8.6\",\n    \"@types/express\": \"^4.16.1\",\n    \"@types/extend\": \"^3.0.1\",\n    \"@types/mocha\": \"^9.0.0\",\n    \"@types/multiparty\": \"0.0.36\",\n    \"@types/mv\": \"^2.1.0\",\n    \"@types/ncp\": \"^2.0.1\",\n    \"@types/node\": \"^20.0.0\",\n    \"@types/node-fetch\": \"^2.5.7\",\n    \"@types/sinon\": \"^17.0.0\",\n    \"@types/tmp\": \"0.2.6\",\n    \"@types/uuid\": \"^10.0.0\",\n    \"abort-controller\": \"^3.0.0\",\n    \"assert\": \"^2.0.0\",\n    \"browserify\": \"^17.0.0\",\n    \"c8\": \"^8.0.0\",\n    \"cheerio\": \"1.0.0-rc.10\",\n    \"cors\": \"^2.8.5\",\n    \"execa\": \"^5.0.0\",\n    \"express\": \"^4.16.4\",\n    \"form-data\": \"^4.0.0\",\n    \"gts\": \"^5.0.0\",\n    \"is-docker\": \"^2.0.0\",\n    \"karma\": \"^6.0.0\",\n    \"karma-chrome-launcher\": \"^3.0.0\",\n    \"karma-coverage\": \"^2.0.0\",\n    \"karma-firefox-launcher\": \"^2.0.0\",\n    \"karma-mocha\": \"^2.0.0\",\n    \"karma-remap-coverage\": \"^0.1.5\",\n    \"karma-sourcemap-loader\": \"^0.4.0\",\n    \"karma-webpack\": \"5.0.0\",\n    \"linkinator\": \"^3.0.0\",\n    \"mocha\": \"^8.0.0\",\n    \"multiparty\": \"^4.2.1\",\n    \"mv\": \"^2.1.1\",\n    \"ncp\": \"^2.0.0\",\n    \"nock\": \"^13.0.0\",\n    \"null-loader\": \"^4.0.0\",\n    \"puppeteer\": \"^19.0.0\",\n    \"sinon\": \"^18.0.0\",\n    \"stream-browserify\": \"^3.0.0\",\n    \"tmp\": \"0.2.3\",\n    \"ts-loader\": \"^8.0.0\",\n    \"typescript\": \"^5.1.6\",\n    \"webpack\": \"^5.35.0\",\n    \"webpack-cli\": \"^4.0.0\"\n  },\n  \"dependencies\": {\n    \"extend\": \"^3.0.2\",\n    \"https-proxy-agent\": \"^7.0.1\",\n    \"is-stream\": \"^2.0.0\",\n    \"node-fetch\": \"^2.6.9\",\n    \"uuid\": \"^9.0.1\"\n  }\n}\n", null, null, null, "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = 'ffffffff-ffff-ffff-ffff-ffffffffffff';\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = '00000000-0000-0000-0000-000000000000';\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/i;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst regex_js_1 = require(\"./regex.js\");\nfunction validate(uuid) {\n    return typeof uuid === 'string' && regex_js_1.default.test(uuid);\n}\nexports.default = validate;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst validate_js_1 = require(\"./validate.js\");\nfunction parse(uuid) {\n    if (!(0, validate_js_1.default)(uuid)) {\n        throw TypeError('Invalid UUID');\n    }\n    let v;\n    return Uint8Array.of((v = parseInt(uuid.slice(0, 8), 16)) >>> 24, (v >>> 16) & 0xff, (v >>> 8) & 0xff, v & 0xff, (v = parseInt(uuid.slice(9, 13), 16)) >>> 8, v & 0xff, (v = parseInt(uuid.slice(14, 18), 16)) >>> 8, v & 0xff, (v = parseInt(uuid.slice(19, 23), 16)) >>> 8, v & 0xff, ((v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000) & 0xff, (v / 0x100000000) & 0xff, (v >>> 24) & 0xff, (v >>> 16) & 0xff, (v >>> 8) & 0xff, v & 0xff);\n}\nexports.default = parse;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.unsafeStringify = void 0;\nconst validate_js_1 = require(\"./validate.js\");\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n    byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nfunction unsafeStringify(arr, offset = 0) {\n    return (byteToHex[arr[offset + 0]] +\n        byteToHex[arr[offset + 1]] +\n        byteToHex[arr[offset + 2]] +\n        byteToHex[arr[offset + 3]] +\n        '-' +\n        byteToHex[arr[offset + 4]] +\n        byteToHex[arr[offset + 5]] +\n        '-' +\n        byteToHex[arr[offset + 6]] +\n        byteToHex[arr[offset + 7]] +\n        '-' +\n        byteToHex[arr[offset + 8]] +\n        byteToHex[arr[offset + 9]] +\n        '-' +\n        byteToHex[arr[offset + 10]] +\n        byteToHex[arr[offset + 11]] +\n        byteToHex[arr[offset + 12]] +\n        byteToHex[arr[offset + 13]] +\n        byteToHex[arr[offset + 14]] +\n        byteToHex[arr[offset + 15]]).toLowerCase();\n}\nexports.unsafeStringify = unsafeStringify;\nfunction stringify(arr, offset = 0) {\n    const uuid = unsafeStringify(arr, offset);\n    if (!(0, validate_js_1.default)(uuid)) {\n        throw TypeError('Stringified UUID is invalid');\n    }\n    return uuid;\n}\nexports.default = stringify;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst crypto_1 = require(\"crypto\");\nconst rnds8Pool = new Uint8Array(256);\nlet poolPtr = rnds8Pool.length;\nfunction rng() {\n    if (poolPtr > rnds8Pool.length - 16) {\n        (0, crypto_1.randomFillSync)(rnds8Pool);\n        poolPtr = 0;\n    }\n    return rnds8Pool.slice(poolPtr, (poolPtr += 16));\n}\nexports.default = rng;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.updateV1State = void 0;\nconst rng_js_1 = require(\"./rng.js\");\nconst stringify_js_1 = require(\"./stringify.js\");\nconst _state = {};\nfunction v1(options, buf, offset) {\n    let bytes;\n    const isV6 = options?._v6 ?? false;\n    if (options) {\n        const optionsKeys = Object.keys(options);\n        if (optionsKeys.length === 1 && optionsKeys[0] === '_v6') {\n            options = undefined;\n        }\n    }\n    if (options) {\n        bytes = v1Bytes(options.random ?? options.rng?.() ?? (0, rng_js_1.default)(), options.msecs, options.nsecs, options.clockseq, options.node, buf, offset);\n    }\n    else {\n        const now = Date.now();\n        const rnds = (0, rng_js_1.default)();\n        updateV1State(_state, now, rnds);\n        bytes = v1Bytes(rnds, _state.msecs, _state.nsecs, isV6 ? undefined : _state.clockseq, isV6 ? undefined : _state.node, buf, offset);\n    }\n    return buf ?? (0, stringify_js_1.unsafeStringify)(bytes);\n}\nfunction updateV1State(state, now, rnds) {\n    state.msecs ??= -Infinity;\n    state.nsecs ??= 0;\n    if (now === state.msecs) {\n        state.nsecs++;\n        if (state.nsecs >= 10000) {\n            state.node = undefined;\n            state.nsecs = 0;\n        }\n    }\n    else if (now > state.msecs) {\n        state.nsecs = 0;\n    }\n    else if (now < state.msecs) {\n        state.node = undefined;\n    }\n    if (!state.node) {\n        state.node = rnds.slice(10, 16);\n        state.node[0] |= 0x01;\n        state.clockseq = ((rnds[8] << 8) | rnds[9]) & 0x3fff;\n    }\n    state.msecs = now;\n    return state;\n}\nexports.updateV1State = updateV1State;\nfunction v1Bytes(rnds, msecs, nsecs, clockseq, node, buf, offset = 0) {\n    if (rnds.length < 16) {\n        throw new Error('Random bytes length must be >= 16');\n    }\n    if (!buf) {\n        buf = new Uint8Array(16);\n        offset = 0;\n    }\n    else {\n        if (offset < 0 || offset + 16 > buf.length) {\n            throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n        }\n    }\n    msecs ??= Date.now();\n    nsecs ??= 0;\n    clockseq ??= ((rnds[8] << 8) | rnds[9]) & 0x3fff;\n    node ??= rnds.slice(10, 16);\n    msecs += 12219292800000;\n    const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n    buf[offset++] = (tl >>> 24) & 0xff;\n    buf[offset++] = (tl >>> 16) & 0xff;\n    buf[offset++] = (tl >>> 8) & 0xff;\n    buf[offset++] = tl & 0xff;\n    const tmh = ((msecs / 0x100000000) * 10000) & 0xfffffff;\n    buf[offset++] = (tmh >>> 8) & 0xff;\n    buf[offset++] = tmh & 0xff;\n    buf[offset++] = ((tmh >>> 24) & 0xf) | 0x10;\n    buf[offset++] = (tmh >>> 16) & 0xff;\n    buf[offset++] = (clockseq >>> 8) | 0x80;\n    buf[offset++] = clockseq & 0xff;\n    for (let n = 0; n < 6; ++n) {\n        buf[offset++] = node[n];\n    }\n    return buf;\n}\nexports.default = v1;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst parse_js_1 = require(\"./parse.js\");\nconst stringify_js_1 = require(\"./stringify.js\");\nfunction v1ToV6(uuid) {\n    const v1Bytes = typeof uuid === 'string' ? (0, parse_js_1.default)(uuid) : uuid;\n    const v6Bytes = _v1ToV6(v1Bytes);\n    return typeof uuid === 'string' ? (0, stringify_js_1.unsafeStringify)(v6Bytes) : v6Bytes;\n}\nexports.default = v1ToV6;\nfunction _v1ToV6(v1Bytes) {\n    return Uint8Array.of(((v1Bytes[6] & 0x0f) << 4) | ((v1Bytes[7] >> 4) & 0x0f), ((v1Bytes[7] & 0x0f) << 4) | ((v1Bytes[4] & 0xf0) >> 4), ((v1Bytes[4] & 0x0f) << 4) | ((v1Bytes[5] & 0xf0) >> 4), ((v1Bytes[5] & 0x0f) << 4) | ((v1Bytes[0] & 0xf0) >> 4), ((v1Bytes[0] & 0x0f) << 4) | ((v1Bytes[1] & 0xf0) >> 4), ((v1Bytes[1] & 0x0f) << 4) | ((v1Bytes[2] & 0xf0) >> 4), 0x60 | (v1Bytes[2] & 0x0f), v1Bytes[3], v1Bytes[8], v1Bytes[9], v1Bytes[10], v1Bytes[11], v1Bytes[12], v1Bytes[13], v1Bytes[14], v1Bytes[15]);\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst crypto_1 = require(\"crypto\");\nfunction md5(bytes) {\n    if (Array.isArray(bytes)) {\n        bytes = Buffer.from(bytes);\n    }\n    else if (typeof bytes === 'string') {\n        bytes = Buffer.from(bytes, 'utf8');\n    }\n    return (0, crypto_1.createHash)('md5').update(bytes).digest();\n}\nexports.default = md5;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.URL = exports.DNS = exports.stringToBytes = void 0;\nconst parse_js_1 = require(\"./parse.js\");\nconst stringify_js_1 = require(\"./stringify.js\");\nfunction stringToBytes(str) {\n    str = unescape(encodeURIComponent(str));\n    const bytes = new Uint8Array(str.length);\n    for (let i = 0; i < str.length; ++i) {\n        bytes[i] = str.charCodeAt(i);\n    }\n    return bytes;\n}\nexports.stringToBytes = stringToBytes;\nexports.DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nexports.URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';\nfunction v35(version, hash, value, namespace, buf, offset) {\n    const valueBytes = typeof value === 'string' ? stringToBytes(value) : value;\n    const namespaceBytes = typeof namespace === 'string' ? (0, parse_js_1.default)(namespace) : namespace;\n    if (typeof namespace === 'string') {\n        namespace = (0, parse_js_1.default)(namespace);\n    }\n    if (namespace?.length !== 16) {\n        throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');\n    }\n    let bytes = new Uint8Array(16 + valueBytes.length);\n    bytes.set(namespaceBytes);\n    bytes.set(valueBytes, namespaceBytes.length);\n    bytes = hash(bytes);\n    bytes[6] = (bytes[6] & 0x0f) | version;\n    bytes[8] = (bytes[8] & 0x3f) | 0x80;\n    if (buf) {\n        offset = offset || 0;\n        if (offset < 0 || offset + 16 > buf.length) {\n            throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n        }\n        for (let i = 0; i < 16; ++i) {\n            buf[offset + i] = bytes[i];\n        }\n        return buf;\n    }\n    return (0, stringify_js_1.unsafeStringify)(bytes);\n}\nexports.default = v35;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.URL = exports.DNS = void 0;\nconst md5_js_1 = require(\"./md5.js\");\nconst v35_js_1 = require(\"./v35.js\");\nvar v35_js_2 = require(\"./v35.js\");\nObject.defineProperty(exports, \"DNS\", { enumerable: true, get: function () { return v35_js_2.DNS; } });\nObject.defineProperty(exports, \"URL\", { enumerable: true, get: function () { return v35_js_2.URL; } });\nfunction v3(value, namespace, buf, offset) {\n    return (0, v35_js_1.default)(0x30, md5_js_1.default, value, namespace, buf, offset);\n}\nv3.DNS = v35_js_1.DNS;\nv3.URL = v35_js_1.URL;\nexports.default = v3;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst crypto_1 = require(\"crypto\");\nexports.default = { randomUUID: crypto_1.randomUUID };\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst native_js_1 = require(\"./native.js\");\nconst rng_js_1 = require(\"./rng.js\");\nconst stringify_js_1 = require(\"./stringify.js\");\nfunction v4(options, buf, offset) {\n    if (native_js_1.default.randomUUID && !buf && !options) {\n        return native_js_1.default.randomUUID();\n    }\n    options = options || {};\n    const rnds = options.random ?? options.rng?.() ?? (0, rng_js_1.default)();\n    if (rnds.length < 16) {\n        throw new Error('Random bytes length must be >= 16');\n    }\n    rnds[6] = (rnds[6] & 0x0f) | 0x40;\n    rnds[8] = (rnds[8] & 0x3f) | 0x80;\n    if (buf) {\n        offset = offset || 0;\n        if (offset < 0 || offset + 16 > buf.length) {\n            throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n        }\n        for (let i = 0; i < 16; ++i) {\n            buf[offset + i] = rnds[i];\n        }\n        return buf;\n    }\n    return (0, stringify_js_1.unsafeStringify)(rnds);\n}\nexports.default = v4;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst crypto_1 = require(\"crypto\");\nfunction sha1(bytes) {\n    if (Array.isArray(bytes)) {\n        bytes = Buffer.from(bytes);\n    }\n    else if (typeof bytes === 'string') {\n        bytes = Buffer.from(bytes, 'utf8');\n    }\n    return (0, crypto_1.createHash)('sha1').update(bytes).digest();\n}\nexports.default = sha1;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.URL = exports.DNS = void 0;\nconst sha1_js_1 = require(\"./sha1.js\");\nconst v35_js_1 = require(\"./v35.js\");\nvar v35_js_2 = require(\"./v35.js\");\nObject.defineProperty(exports, \"DNS\", { enumerable: true, get: function () { return v35_js_2.DNS; } });\nObject.defineProperty(exports, \"URL\", { enumerable: true, get: function () { return v35_js_2.URL; } });\nfunction v5(value, namespace, buf, offset) {\n    return (0, v35_js_1.default)(0x50, sha1_js_1.default, value, namespace, buf, offset);\n}\nv5.DNS = v35_js_1.DNS;\nv5.URL = v35_js_1.URL;\nexports.default = v5;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst stringify_js_1 = require(\"./stringify.js\");\nconst v1_js_1 = require(\"./v1.js\");\nconst v1ToV6_js_1 = require(\"./v1ToV6.js\");\nfunction v6(options, buf, offset) {\n    options ??= {};\n    offset ??= 0;\n    let bytes = (0, v1_js_1.default)({ ...options, _v6: true }, new Uint8Array(16));\n    bytes = (0, v1ToV6_js_1.default)(bytes);\n    if (buf) {\n        if (offset < 0 || offset + 16 > buf.length) {\n            throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n        }\n        for (let i = 0; i < 16; i++) {\n            buf[offset + i] = bytes[i];\n        }\n        return buf;\n    }\n    return (0, stringify_js_1.unsafeStringify)(bytes);\n}\nexports.default = v6;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst parse_js_1 = require(\"./parse.js\");\nconst stringify_js_1 = require(\"./stringify.js\");\nfunction v6ToV1(uuid) {\n    const v6Bytes = typeof uuid === 'string' ? (0, parse_js_1.default)(uuid) : uuid;\n    const v1Bytes = _v6ToV1(v6Bytes);\n    return typeof uuid === 'string' ? (0, stringify_js_1.unsafeStringify)(v1Bytes) : v1Bytes;\n}\nexports.default = v6ToV1;\nfunction _v6ToV1(v6Bytes) {\n    return Uint8Array.of(((v6Bytes[3] & 0x0f) << 4) | ((v6Bytes[4] >> 4) & 0x0f), ((v6Bytes[4] & 0x0f) << 4) | ((v6Bytes[5] & 0xf0) >> 4), ((v6Bytes[5] & 0x0f) << 4) | (v6Bytes[6] & 0x0f), v6Bytes[7], ((v6Bytes[1] & 0x0f) << 4) | ((v6Bytes[2] & 0xf0) >> 4), ((v6Bytes[2] & 0x0f) << 4) | ((v6Bytes[3] & 0xf0) >> 4), 0x10 | ((v6Bytes[0] & 0xf0) >> 4), ((v6Bytes[0] & 0x0f) << 4) | ((v6Bytes[1] & 0xf0) >> 4), v6Bytes[8], v6Bytes[9], v6Bytes[10], v6Bytes[11], v6Bytes[12], v6Bytes[13], v6Bytes[14], v6Bytes[15]);\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.updateV7State = void 0;\nconst rng_js_1 = require(\"./rng.js\");\nconst stringify_js_1 = require(\"./stringify.js\");\nconst _state = {};\nfunction v7(options, buf, offset) {\n    let bytes;\n    if (options) {\n        bytes = v7Bytes(options.random ?? options.rng?.() ?? (0, rng_js_1.default)(), options.msecs, options.seq, buf, offset);\n    }\n    else {\n        const now = Date.now();\n        const rnds = (0, rng_js_1.default)();\n        updateV7State(_state, now, rnds);\n        bytes = v7Bytes(rnds, _state.msecs, _state.seq, buf, offset);\n    }\n    return buf ?? (0, stringify_js_1.unsafeStringify)(bytes);\n}\nfunction updateV7State(state, now, rnds) {\n    state.msecs ??= -Infinity;\n    state.seq ??= 0;\n    if (now > state.msecs) {\n        state.seq = (rnds[6] << 23) | (rnds[7] << 16) | (rnds[8] << 8) | rnds[9];\n        state.msecs = now;\n    }\n    else {\n        state.seq = (state.seq + 1) | 0;\n        if (state.seq === 0) {\n            state.msecs++;\n        }\n    }\n    return state;\n}\nexports.updateV7State = updateV7State;\nfunction v7Bytes(rnds, msecs, seq, buf, offset = 0) {\n    if (rnds.length < 16) {\n        throw new Error('Random bytes length must be >= 16');\n    }\n    if (!buf) {\n        buf = new Uint8Array(16);\n        offset = 0;\n    }\n    else {\n        if (offset < 0 || offset + 16 > buf.length) {\n            throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n        }\n    }\n    msecs ??= Date.now();\n    seq ??= ((rnds[6] * 0x7f) << 24) | (rnds[7] << 16) | (rnds[8] << 8) | rnds[9];\n    buf[offset++] = (msecs / 0x10000000000) & 0xff;\n    buf[offset++] = (msecs / 0x100000000) & 0xff;\n    buf[offset++] = (msecs / 0x1000000) & 0xff;\n    buf[offset++] = (msecs / 0x10000) & 0xff;\n    buf[offset++] = (msecs / 0x100) & 0xff;\n    buf[offset++] = msecs & 0xff;\n    buf[offset++] = 0x70 | ((seq >>> 28) & 0x0f);\n    buf[offset++] = (seq >>> 20) & 0xff;\n    buf[offset++] = 0x80 | ((seq >>> 14) & 0x3f);\n    buf[offset++] = (seq >>> 6) & 0xff;\n    buf[offset++] = ((seq << 2) & 0xff) | (rnds[10] & 0x03);\n    buf[offset++] = rnds[11];\n    buf[offset++] = rnds[12];\n    buf[offset++] = rnds[13];\n    buf[offset++] = rnds[14];\n    buf[offset++] = rnds[15];\n    return buf;\n}\nexports.default = v7;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst validate_js_1 = require(\"./validate.js\");\nfunction version(uuid) {\n    if (!(0, validate_js_1.default)(uuid)) {\n        throw TypeError('Invalid UUID');\n    }\n    return parseInt(uuid.slice(14, 15), 16);\n}\nexports.default = version;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.version = exports.validate = exports.v7 = exports.v6ToV1 = exports.v6 = exports.v5 = exports.v4 = exports.v3 = exports.v1ToV6 = exports.v1 = exports.stringify = exports.parse = exports.NIL = exports.MAX = void 0;\nvar max_js_1 = require(\"./max.js\");\nObject.defineProperty(exports, \"MAX\", { enumerable: true, get: function () { return max_js_1.default; } });\nvar nil_js_1 = require(\"./nil.js\");\nObject.defineProperty(exports, \"NIL\", { enumerable: true, get: function () { return nil_js_1.default; } });\nvar parse_js_1 = require(\"./parse.js\");\nObject.defineProperty(exports, \"parse\", { enumerable: true, get: function () { return parse_js_1.default; } });\nvar stringify_js_1 = require(\"./stringify.js\");\nObject.defineProperty(exports, \"stringify\", { enumerable: true, get: function () { return stringify_js_1.default; } });\nvar v1_js_1 = require(\"./v1.js\");\nObject.defineProperty(exports, \"v1\", { enumerable: true, get: function () { return v1_js_1.default; } });\nvar v1ToV6_js_1 = require(\"./v1ToV6.js\");\nObject.defineProperty(exports, \"v1ToV6\", { enumerable: true, get: function () { return v1ToV6_js_1.default; } });\nvar v3_js_1 = require(\"./v3.js\");\nObject.defineProperty(exports, \"v3\", { enumerable: true, get: function () { return v3_js_1.default; } });\nvar v4_js_1 = require(\"./v4.js\");\nObject.defineProperty(exports, \"v4\", { enumerable: true, get: function () { return v4_js_1.default; } });\nvar v5_js_1 = require(\"./v5.js\");\nObject.defineProperty(exports, \"v5\", { enumerable: true, get: function () { return v5_js_1.default; } });\nvar v6_js_1 = require(\"./v6.js\");\nObject.defineProperty(exports, \"v6\", { enumerable: true, get: function () { return v6_js_1.default; } });\nvar v6ToV1_js_1 = require(\"./v6ToV1.js\");\nObject.defineProperty(exports, \"v6ToV1\", { enumerable: true, get: function () { return v6ToV1_js_1.default; } });\nvar v7_js_1 = require(\"./v7.js\");\nObject.defineProperty(exports, \"v7\", { enumerable: true, get: function () { return v7_js_1.default; } });\nvar validate_js_1 = require(\"./validate.js\");\nObject.defineProperty(exports, \"validate\", { enumerable: true, get: function () { return validate_js_1.default; } });\nvar version_js_1 = require(\"./version.js\");\nObject.defineProperty(exports, \"version\", { enumerable: true, get: function () { return version_js_1.default; } });\n", null, null, null, ";(function (globalObject) {\r\n  'use strict';\r\n\r\n/*\r\n *      bignumber.js v9.3.1\r\n *      A JavaScript library for arbitrary-precision arithmetic.\r\n *      https://github.com/MikeMcl/bignumber.js\r\n *      Copyright (c) 2025 Michael Mclaughlin <M8ch88l@gmail.com>\r\n *      MIT Licensed.\r\n *\r\n *      BigNumber.prototype methods     |  BigNumber methods\r\n *                                      |\r\n *      absoluteValue            abs    |  clone\r\n *      comparedTo                      |  config               set\r\n *      decimalPlaces            dp     |      DECIMAL_PLACES\r\n *      dividedBy                div    |      ROUNDING_MODE\r\n *      dividedToIntegerBy       idiv   |      EXPONENTIAL_AT\r\n *      exponentiatedBy          pow    |      RANGE\r\n *      integerValue                    |      CRYPTO\r\n *      isEqualTo                eq     |      MODULO_MODE\r\n *      isFinite                        |      POW_PRECISION\r\n *      isGreaterThan            gt     |      FORMAT\r\n *      isGreaterThanOrEqualTo   gte    |      ALPHABET\r\n *      isInteger                       |  isBigNumber\r\n *      isLessThan               lt     |  maximum              max\r\n *      isLessThanOrEqualTo      lte    |  minimum              min\r\n *      isNaN                           |  random\r\n *      isNegative                      |  sum\r\n *      isPositive                      |\r\n *      isZero                          |\r\n *      minus                           |\r\n *      modulo                   mod    |\r\n *      multipliedBy             times  |\r\n *      negated                         |\r\n *      plus                            |\r\n *      precision                sd     |\r\n *      shiftedBy                       |\r\n *      squareRoot               sqrt   |\r\n *      toExponential                   |\r\n *      toFixed                         |\r\n *      toFormat                        |\r\n *      toFraction                      |\r\n *      toJSON                          |\r\n *      toNumber                        |\r\n *      toPrecision                     |\r\n *      toString                        |\r\n *      valueOf                         |\r\n *\r\n */\r\n\r\n\r\n  var BigNumber,\r\n    isNumeric = /^-?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?$/i,\r\n    mathceil = Math.ceil,\r\n    mathfloor = Math.floor,\r\n\r\n    bignumberError = '[BigNumber Error] ',\r\n    tooManyDigits = bignumberError + 'Number primitive has more than 15 significant digits: ',\r\n\r\n    BASE = 1e14,\r\n    LOG_BASE = 14,\r\n    MAX_SAFE_INTEGER = 0x1fffffffffffff,         // 2^53 - 1\r\n    // MAX_INT32 = 0x7fffffff,                   // 2^31 - 1\r\n    POWS_TEN = [1, 10, 100, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13],\r\n    SQRT_BASE = 1e7,\r\n\r\n    // EDITABLE\r\n    // The limit on the value of DECIMAL_PLACES, TO_EXP_NEG, TO_EXP_POS, MIN_EXP, MAX_EXP, and\r\n    // the arguments to toExponential, toFixed, toFormat, and toPrecision.\r\n    MAX = 1E9;                                   // 0 to MAX_INT32\r\n\r\n\r\n  /*\r\n   * Create and return a BigNumber constructor.\r\n   */\r\n  function clone(configObject) {\r\n    var div, convertBase, parseNumeric,\r\n      P = BigNumber.prototype = { constructor: BigNumber, toString: null, valueOf: null },\r\n      ONE = new BigNumber(1),\r\n\r\n\r\n      //----------------------------- EDITABLE CONFIG DEFAULTS -------------------------------\r\n\r\n\r\n      // The default values below must be integers within the inclusive ranges stated.\r\n      // The values can also be changed at run-time using BigNumber.set.\r\n\r\n      // The maximum number of decimal places for operations involving division.\r\n      DECIMAL_PLACES = 20,                     // 0 to MAX\r\n\r\n      // The rounding mode used when rounding to the above decimal places, and when using\r\n      // toExponential, toFixed, toFormat and toPrecision, and round (default value).\r\n      // UP         0 Away from zero.\r\n      // DOWN       1 Towards zero.\r\n      // CEIL       2 Towards +Infinity.\r\n      // FLOOR      3 Towards -Infinity.\r\n      // HALF_UP    4 Towards nearest neighbour. If equidistant, up.\r\n      // HALF_DOWN  5 Towards nearest neighbour. If equidistant, down.\r\n      // HALF_EVEN  6 Towards nearest neighbour. If equidistant, towards even neighbour.\r\n      // HALF_CEIL  7 Towards nearest neighbour. If equidistant, towards +Infinity.\r\n      // HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity.\r\n      ROUNDING_MODE = 4,                       // 0 to 8\r\n\r\n      // EXPONENTIAL_AT : [TO_EXP_NEG , TO_EXP_POS]\r\n\r\n      // The exponent value at and beneath which toString returns exponential notation.\r\n      // Number type: -7\r\n      TO_EXP_NEG = -7,                         // 0 to -MAX\r\n\r\n      // The exponent value at and above which toString returns exponential notation.\r\n      // Number type: 21\r\n      TO_EXP_POS = 21,                         // 0 to MAX\r\n\r\n      // RANGE : [MIN_EXP, MAX_EXP]\r\n\r\n      // The minimum exponent value, beneath which underflow to zero occurs.\r\n      // Number type: -324  (5e-324)\r\n      MIN_EXP = -1e7,                          // -1 to -MAX\r\n\r\n      // The maximum exponent value, above which overflow to Infinity occurs.\r\n      // Number type:  308  (1.7976931348623157e+308)\r\n      // For MAX_EXP > 1e7, e.g. new BigNumber('1e100000000').plus(1) may be slow.\r\n      MAX_EXP = 1e7,                           // 1 to MAX\r\n\r\n      // Whether to use cryptographically-secure random number generation, if available.\r\n      CRYPTO = false,                          // true or false\r\n\r\n      // The modulo mode used when calculating the modulus: a mod n.\r\n      // The quotient (q = a / n) is calculated according to the corresponding rounding mode.\r\n      // The remainder (r) is calculated as: r = a - n * q.\r\n      //\r\n      // UP        0 The remainder is positive if the dividend is negative, else is negative.\r\n      // DOWN      1 The remainder has the same sign as the dividend.\r\n      //             This modulo mode is commonly known as 'truncated division' and is\r\n      //             equivalent to (a % n) in JavaScript.\r\n      // FLOOR     3 The remainder has the same sign as the divisor (Python %).\r\n      // HALF_EVEN 6 This modulo mode implements the IEEE 754 remainder function.\r\n      // EUCLID    9 Euclidian division. q = sign(n) * floor(a / abs(n)).\r\n      //             The remainder is always positive.\r\n      //\r\n      // The truncated division, floored division, Euclidian division and IEEE 754 remainder\r\n      // modes are commonly used for the modulus operation.\r\n      // Although the other rounding modes can also be used, they may not give useful results.\r\n      MODULO_MODE = 1,                         // 0 to 9\r\n\r\n      // The maximum number of significant digits of the result of the exponentiatedBy operation.\r\n      // If POW_PRECISION is 0, there will be unlimited significant digits.\r\n      POW_PRECISION = 0,                       // 0 to MAX\r\n\r\n      // The format specification used by the BigNumber.prototype.toFormat method.\r\n      FORMAT = {\r\n        prefix: '',\r\n        groupSize: 3,\r\n        secondaryGroupSize: 0,\r\n        groupSeparator: ',',\r\n        decimalSeparator: '.',\r\n        fractionGroupSize: 0,\r\n        fractionGroupSeparator: '\\xA0',        // non-breaking space\r\n        suffix: ''\r\n      },\r\n\r\n      // The alphabet used for base conversion. It must be at least 2 characters long, with no '+',\r\n      // '-', '.', whitespace, or repeated character.\r\n      // '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_'\r\n      ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyz',\r\n      alphabetHasNormalDecimalDigits = true;\r\n\r\n\r\n    //------------------------------------------------------------------------------------------\r\n\r\n\r\n    // CONSTRUCTOR\r\n\r\n\r\n    /*\r\n     * The BigNumber constructor and exported function.\r\n     * Create and return a new instance of a BigNumber object.\r\n     *\r\n     * v {number|string|BigNumber} A numeric value.\r\n     * [b] {number} The base of v. Integer, 2 to ALPHABET.length inclusive.\r\n     */\r\n    function BigNumber(v, b) {\r\n      var alphabet, c, caseChanged, e, i, isNum, len, str,\r\n        x = this;\r\n\r\n      // Enable constructor call without `new`.\r\n      if (!(x instanceof BigNumber)) return new BigNumber(v, b);\r\n\r\n      if (b == null) {\r\n\r\n        if (v && v._isBigNumber === true) {\r\n          x.s = v.s;\r\n\r\n          if (!v.c || v.e > MAX_EXP) {\r\n            x.c = x.e = null;\r\n          } else if (v.e < MIN_EXP) {\r\n            x.c = [x.e = 0];\r\n          } else {\r\n            x.e = v.e;\r\n            x.c = v.c.slice();\r\n          }\r\n\r\n          return;\r\n        }\r\n\r\n        if ((isNum = typeof v == 'number') && v * 0 == 0) {\r\n\r\n          // Use `1 / n` to handle minus zero also.\r\n          x.s = 1 / v < 0 ? (v = -v, -1) : 1;\r\n\r\n          // Fast path for integers, where n < 2147483648 (2**31).\r\n          if (v === ~~v) {\r\n            for (e = 0, i = v; i >= 10; i /= 10, e++);\r\n\r\n            if (e > MAX_EXP) {\r\n              x.c = x.e = null;\r\n            } else {\r\n              x.e = e;\r\n              x.c = [v];\r\n            }\r\n\r\n            return;\r\n          }\r\n\r\n          str = String(v);\r\n        } else {\r\n\r\n          if (!isNumeric.test(str = String(v))) return parseNumeric(x, str, isNum);\r\n\r\n          x.s = str.charCodeAt(0) == 45 ? (str = str.slice(1), -1) : 1;\r\n        }\r\n\r\n        // Decimal point?\r\n        if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');\r\n\r\n        // Exponential form?\r\n        if ((i = str.search(/e/i)) > 0) {\r\n\r\n          // Determine exponent.\r\n          if (e < 0) e = i;\r\n          e += +str.slice(i + 1);\r\n          str = str.substring(0, i);\r\n        } else if (e < 0) {\r\n\r\n          // Integer.\r\n          e = str.length;\r\n        }\r\n\r\n      } else {\r\n\r\n        // '[BigNumber Error] Base {not a primitive number|not an integer|out of range}: {b}'\r\n        intCheck(b, 2, ALPHABET.length, 'Base');\r\n\r\n        // Allow exponential notation to be used with base 10 argument, while\r\n        // also rounding to DECIMAL_PLACES as with other bases.\r\n        if (b == 10 && alphabetHasNormalDecimalDigits) {\r\n          x = new BigNumber(v);\r\n          return round(x, DECIMAL_PLACES + x.e + 1, ROUNDING_MODE);\r\n        }\r\n\r\n        str = String(v);\r\n\r\n        if (isNum = typeof v == 'number') {\r\n\r\n          // Avoid potential interpretation of Infinity and NaN as base 44+ values.\r\n          if (v * 0 != 0) return parseNumeric(x, str, isNum, b);\r\n\r\n          x.s = 1 / v < 0 ? (str = str.slice(1), -1) : 1;\r\n\r\n          // '[BigNumber Error] Number primitive has more than 15 significant digits: {n}'\r\n          if (BigNumber.DEBUG && str.replace(/^0\\.0*|\\./, '').length > 15) {\r\n            throw Error\r\n             (tooManyDigits + v);\r\n          }\r\n        } else {\r\n          x.s = str.charCodeAt(0) === 45 ? (str = str.slice(1), -1) : 1;\r\n        }\r\n\r\n        alphabet = ALPHABET.slice(0, b);\r\n        e = i = 0;\r\n\r\n        // Check that str is a valid base b number.\r\n        // Don't use RegExp, so alphabet can contain special characters.\r\n        for (len = str.length; i < len; i++) {\r\n          if (alphabet.indexOf(c = str.charAt(i)) < 0) {\r\n            if (c == '.') {\r\n\r\n              // If '.' is not the first character and it has not be found before.\r\n              if (i > e) {\r\n                e = len;\r\n                continue;\r\n              }\r\n            } else if (!caseChanged) {\r\n\r\n              // Allow e.g. hexadecimal 'FF' as well as 'ff'.\r\n              if (str == str.toUpperCase() && (str = str.toLowerCase()) ||\r\n                  str == str.toLowerCase() && (str = str.toUpperCase())) {\r\n                caseChanged = true;\r\n                i = -1;\r\n                e = 0;\r\n                continue;\r\n              }\r\n            }\r\n\r\n            return parseNumeric(x, String(v), isNum, b);\r\n          }\r\n        }\r\n\r\n        // Prevent later check for length on converted number.\r\n        isNum = false;\r\n        str = convertBase(str, b, 10, x.s);\r\n\r\n        // Decimal point?\r\n        if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');\r\n        else e = str.length;\r\n      }\r\n\r\n      // Determine leading zeros.\r\n      for (i = 0; str.charCodeAt(i) === 48; i++);\r\n\r\n      // Determine trailing zeros.\r\n      for (len = str.length; str.charCodeAt(--len) === 48;);\r\n\r\n      if (str = str.slice(i, ++len)) {\r\n        len -= i;\r\n\r\n        // '[BigNumber Error] Number primitive has more than 15 significant digits: {n}'\r\n        if (isNum && BigNumber.DEBUG &&\r\n          len > 15 && (v > MAX_SAFE_INTEGER || v !== mathfloor(v))) {\r\n            throw Error\r\n             (tooManyDigits + (x.s * v));\r\n        }\r\n\r\n         // Overflow?\r\n        if ((e = e - i - 1) > MAX_EXP) {\r\n\r\n          // Infinity.\r\n          x.c = x.e = null;\r\n\r\n        // Underflow?\r\n        } else if (e < MIN_EXP) {\r\n\r\n          // Zero.\r\n          x.c = [x.e = 0];\r\n        } else {\r\n          x.e = e;\r\n          x.c = [];\r\n\r\n          // Transform base\r\n\r\n          // e is the base 10 exponent.\r\n          // i is where to slice str to get the first element of the coefficient array.\r\n          i = (e + 1) % LOG_BASE;\r\n          if (e < 0) i += LOG_BASE;  // i < 1\r\n\r\n          if (i < len) {\r\n            if (i) x.c.push(+str.slice(0, i));\r\n\r\n            for (len -= LOG_BASE; i < len;) {\r\n              x.c.push(+str.slice(i, i += LOG_BASE));\r\n            }\r\n\r\n            i = LOG_BASE - (str = str.slice(i)).length;\r\n          } else {\r\n            i -= len;\r\n          }\r\n\r\n          for (; i--; str += '0');\r\n          x.c.push(+str);\r\n        }\r\n      } else {\r\n\r\n        // Zero.\r\n        x.c = [x.e = 0];\r\n      }\r\n    }\r\n\r\n\r\n    // CONSTRUCTOR PROPERTIES\r\n\r\n\r\n    BigNumber.clone = clone;\r\n\r\n    BigNumber.ROUND_UP = 0;\r\n    BigNumber.ROUND_DOWN = 1;\r\n    BigNumber.ROUND_CEIL = 2;\r\n    BigNumber.ROUND_FLOOR = 3;\r\n    BigNumber.ROUND_HALF_UP = 4;\r\n    BigNumber.ROUND_HALF_DOWN = 5;\r\n    BigNumber.ROUND_HALF_EVEN = 6;\r\n    BigNumber.ROUND_HALF_CEIL = 7;\r\n    BigNumber.ROUND_HALF_FLOOR = 8;\r\n    BigNumber.EUCLID = 9;\r\n\r\n\r\n    /*\r\n     * Configure infrequently-changing library-wide settings.\r\n     *\r\n     * Accept an object with the following optional properties (if the value of a property is\r\n     * a number, it must be an integer within the inclusive range stated):\r\n     *\r\n     *   DECIMAL_PLACES   {number}           0 to MAX\r\n     *   ROUNDING_MODE    {number}           0 to 8\r\n     *   EXPONENTIAL_AT   {number|number[]}  -MAX to MAX  or  [-MAX to 0, 0 to MAX]\r\n     *   RANGE            {number|number[]}  -MAX to MAX (not zero)  or  [-MAX to -1, 1 to MAX]\r\n     *   CRYPTO           {boolean}          true or false\r\n     *   MODULO_MODE      {number}           0 to 9\r\n     *   POW_PRECISION       {number}           0 to MAX\r\n     *   ALPHABET         {string}           A string of two or more unique characters which does\r\n     *                                       not contain '.'.\r\n     *   FORMAT           {object}           An object with some of the following properties:\r\n     *     prefix                 {string}\r\n     *     groupSize              {number}\r\n     *     secondaryGroupSize     {number}\r\n     *     groupSeparator         {string}\r\n     *     decimalSeparator       {string}\r\n     *     fractionGroupSize      {number}\r\n     *     fractionGroupSeparator {string}\r\n     *     suffix                 {string}\r\n     *\r\n     * (The values assigned to the above FORMAT object properties are not checked for validity.)\r\n     *\r\n     * E.g.\r\n     * BigNumber.config({ DECIMAL_PLACES : 20, ROUNDING_MODE : 4 })\r\n     *\r\n     * Ignore properties/parameters set to null or undefined, except for ALPHABET.\r\n     *\r\n     * Return an object with the properties current values.\r\n     */\r\n    BigNumber.config = BigNumber.set = function (obj) {\r\n      var p, v;\r\n\r\n      if (obj != null) {\r\n\r\n        if (typeof obj == 'object') {\r\n\r\n          // DECIMAL_PLACES {number} Integer, 0 to MAX inclusive.\r\n          // '[BigNumber Error] DECIMAL_PLACES {not a primitive number|not an integer|out of range}: {v}'\r\n          if (obj.hasOwnProperty(p = 'DECIMAL_PLACES')) {\r\n            v = obj[p];\r\n            intCheck(v, 0, MAX, p);\r\n            DECIMAL_PLACES = v;\r\n          }\r\n\r\n          // ROUNDING_MODE {number} Integer, 0 to 8 inclusive.\r\n          // '[BigNumber Error] ROUNDING_MODE {not a primitive number|not an integer|out of range}: {v}'\r\n          if (obj.hasOwnProperty(p = 'ROUNDING_MODE')) {\r\n            v = obj[p];\r\n            intCheck(v, 0, 8, p);\r\n            ROUNDING_MODE = v;\r\n          }\r\n\r\n          // EXPONENTIAL_AT {number|number[]}\r\n          // Integer, -MAX to MAX inclusive or\r\n          // [integer -MAX to 0 inclusive, 0 to MAX inclusive].\r\n          // '[BigNumber Error] EXPONENTIAL_AT {not a primitive number|not an integer|out of range}: {v}'\r\n          if (obj.hasOwnProperty(p = 'EXPONENTIAL_AT')) {\r\n            v = obj[p];\r\n            if (v && v.pop) {\r\n              intCheck(v[0], -MAX, 0, p);\r\n              intCheck(v[1], 0, MAX, p);\r\n              TO_EXP_NEG = v[0];\r\n              TO_EXP_POS = v[1];\r\n            } else {\r\n              intCheck(v, -MAX, MAX, p);\r\n              TO_EXP_NEG = -(TO_EXP_POS = v < 0 ? -v : v);\r\n            }\r\n          }\r\n\r\n          // RANGE {number|number[]} Non-zero integer, -MAX to MAX inclusive or\r\n          // [integer -MAX to -1 inclusive, integer 1 to MAX inclusive].\r\n          // '[BigNumber Error] RANGE {not a primitive number|not an integer|out of range|cannot be zero}: {v}'\r\n          if (obj.hasOwnProperty(p = 'RANGE')) {\r\n            v = obj[p];\r\n            if (v && v.pop) {\r\n              intCheck(v[0], -MAX, -1, p);\r\n              intCheck(v[1], 1, MAX, p);\r\n              MIN_EXP = v[0];\r\n              MAX_EXP = v[1];\r\n            } else {\r\n              intCheck(v, -MAX, MAX, p);\r\n              if (v) {\r\n                MIN_EXP = -(MAX_EXP = v < 0 ? -v : v);\r\n              } else {\r\n                throw Error\r\n                 (bignumberError + p + ' cannot be zero: ' + v);\r\n              }\r\n            }\r\n          }\r\n\r\n          // CRYPTO {boolean} true or false.\r\n          // '[BigNumber Error] CRYPTO not true or false: {v}'\r\n          // '[BigNumber Error] crypto unavailable'\r\n          if (obj.hasOwnProperty(p = 'CRYPTO')) {\r\n            v = obj[p];\r\n            if (v === !!v) {\r\n              if (v) {\r\n                if (typeof crypto != 'undefined' && crypto &&\r\n                 (crypto.getRandomValues || crypto.randomBytes)) {\r\n                  CRYPTO = v;\r\n                } else {\r\n                  CRYPTO = !v;\r\n                  throw Error\r\n                   (bignumberError + 'crypto unavailable');\r\n                }\r\n              } else {\r\n                CRYPTO = v;\r\n              }\r\n            } else {\r\n              throw Error\r\n               (bignumberError + p + ' not true or false: ' + v);\r\n            }\r\n          }\r\n\r\n          // MODULO_MODE {number} Integer, 0 to 9 inclusive.\r\n          // '[BigNumber Error] MODULO_MODE {not a primitive number|not an integer|out of range}: {v}'\r\n          if (obj.hasOwnProperty(p = 'MODULO_MODE')) {\r\n            v = obj[p];\r\n            intCheck(v, 0, 9, p);\r\n            MODULO_MODE = v;\r\n          }\r\n\r\n          // POW_PRECISION {number} Integer, 0 to MAX inclusive.\r\n          // '[BigNumber Error] POW_PRECISION {not a primitive number|not an integer|out of range}: {v}'\r\n          if (obj.hasOwnProperty(p = 'POW_PRECISION')) {\r\n            v = obj[p];\r\n            intCheck(v, 0, MAX, p);\r\n            POW_PRECISION = v;\r\n          }\r\n\r\n          // FORMAT {object}\r\n          // '[BigNumber Error] FORMAT not an object: {v}'\r\n          if (obj.hasOwnProperty(p = 'FORMAT')) {\r\n            v = obj[p];\r\n            if (typeof v == 'object') FORMAT = v;\r\n            else throw Error\r\n             (bignumberError + p + ' not an object: ' + v);\r\n          }\r\n\r\n          // ALPHABET {string}\r\n          // '[BigNumber Error] ALPHABET invalid: {v}'\r\n          if (obj.hasOwnProperty(p = 'ALPHABET')) {\r\n            v = obj[p];\r\n\r\n            // Disallow if less than two characters,\r\n            // or if it contains '+', '-', '.', whitespace, or a repeated character.\r\n            if (typeof v == 'string' && !/^.?$|[+\\-.\\s]|(.).*\\1/.test(v)) {\r\n              alphabetHasNormalDecimalDigits = v.slice(0, 10) == '0123456789';\r\n              ALPHABET = v;\r\n            } else {\r\n              throw Error\r\n               (bignumberError + p + ' invalid: ' + v);\r\n            }\r\n          }\r\n\r\n        } else {\r\n\r\n          // '[BigNumber Error] Object expected: {v}'\r\n          throw Error\r\n           (bignumberError + 'Object expected: ' + obj);\r\n        }\r\n      }\r\n\r\n      return {\r\n        DECIMAL_PLACES: DECIMAL_PLACES,\r\n        ROUNDING_MODE: ROUNDING_MODE,\r\n        EXPONENTIAL_AT: [TO_EXP_NEG, TO_EXP_POS],\r\n        RANGE: [MIN_EXP, MAX_EXP],\r\n        CRYPTO: CRYPTO,\r\n        MODULO_MODE: MODULO_MODE,\r\n        POW_PRECISION: POW_PRECISION,\r\n        FORMAT: FORMAT,\r\n        ALPHABET: ALPHABET\r\n      };\r\n    };\r\n\r\n\r\n    /*\r\n     * Return true if v is a BigNumber instance, otherwise return false.\r\n     *\r\n     * If BigNumber.DEBUG is true, throw if a BigNumber instance is not well-formed.\r\n     *\r\n     * v {any}\r\n     *\r\n     * '[BigNumber Error] Invalid BigNumber: {v}'\r\n     */\r\n    BigNumber.isBigNumber = function (v) {\r\n      if (!v || v._isBigNumber !== true) return false;\r\n      if (!BigNumber.DEBUG) return true;\r\n\r\n      var i, n,\r\n        c = v.c,\r\n        e = v.e,\r\n        s = v.s;\r\n\r\n      out: if ({}.toString.call(c) == '[object Array]') {\r\n\r\n        if ((s === 1 || s === -1) && e >= -MAX && e <= MAX && e === mathfloor(e)) {\r\n\r\n          // If the first element is zero, the BigNumber value must be zero.\r\n          if (c[0] === 0) {\r\n            if (e === 0 && c.length === 1) return true;\r\n            break out;\r\n          }\r\n\r\n          // Calculate number of digits that c[0] should have, based on the exponent.\r\n          i = (e + 1) % LOG_BASE;\r\n          if (i < 1) i += LOG_BASE;\r\n\r\n          // Calculate number of digits of c[0].\r\n          //if (Math.ceil(Math.log(c[0] + 1) / Math.LN10) == i) {\r\n          if (String(c[0]).length == i) {\r\n\r\n            for (i = 0; i < c.length; i++) {\r\n              n = c[i];\r\n              if (n < 0 || n >= BASE || n !== mathfloor(n)) break out;\r\n            }\r\n\r\n            // Last element cannot be zero, unless it is the only element.\r\n            if (n !== 0) return true;\r\n          }\r\n        }\r\n\r\n      // Infinity/NaN\r\n      } else if (c === null && e === null && (s === null || s === 1 || s === -1)) {\r\n        return true;\r\n      }\r\n\r\n      throw Error\r\n        (bignumberError + 'Invalid BigNumber: ' + v);\r\n    };\r\n\r\n\r\n    /*\r\n     * Return a new BigNumber whose value is the maximum of the arguments.\r\n     *\r\n     * arguments {number|string|BigNumber}\r\n     */\r\n    BigNumber.maximum = BigNumber.max = function () {\r\n      return maxOrMin(arguments, -1);\r\n    };\r\n\r\n\r\n    /*\r\n     * Return a new BigNumber whose value is the minimum of the arguments.\r\n     *\r\n     * arguments {number|string|BigNumber}\r\n     */\r\n    BigNumber.minimum = BigNumber.min = function () {\r\n      return maxOrMin(arguments, 1);\r\n    };\r\n\r\n\r\n    /*\r\n     * Return a new BigNumber with a random value equal to or greater than 0 and less than 1,\r\n     * and with dp, or DECIMAL_PLACES if dp is omitted, decimal places (or less if trailing\r\n     * zeros are produced).\r\n     *\r\n     * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n     *\r\n     * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp}'\r\n     * '[BigNumber Error] crypto unavailable'\r\n     */\r\n    BigNumber.random = (function () {\r\n      var pow2_53 = 0x20000000000000;\r\n\r\n      // Return a 53 bit integer n, where 0 <= n < 9007199254740992.\r\n      // Check if Math.random() produces more than 32 bits of randomness.\r\n      // If it does, assume at least 53 bits are produced, otherwise assume at least 30 bits.\r\n      // 0x40000000 is 2^30, 0x800000 is 2^23, 0x1fffff is 2^21 - 1.\r\n      var random53bitInt = (Math.random() * pow2_53) & 0x1fffff\r\n       ? function () { return mathfloor(Math.random() * pow2_53); }\r\n       : function () { return ((Math.random() * 0x40000000 | 0) * 0x800000) +\r\n         (Math.random() * 0x800000 | 0); };\r\n\r\n      return function (dp) {\r\n        var a, b, e, k, v,\r\n          i = 0,\r\n          c = [],\r\n          rand = new BigNumber(ONE);\r\n\r\n        if (dp == null) dp = DECIMAL_PLACES;\r\n        else intCheck(dp, 0, MAX);\r\n\r\n        k = mathceil(dp / LOG_BASE);\r\n\r\n        if (CRYPTO) {\r\n\r\n          // Browsers supporting crypto.getRandomValues.\r\n          if (crypto.getRandomValues) {\r\n\r\n            a = crypto.getRandomValues(new Uint32Array(k *= 2));\r\n\r\n            for (; i < k;) {\r\n\r\n              // 53 bits:\r\n              // ((Math.pow(2, 32) - 1) * Math.pow(2, 21)).toString(2)\r\n              // 11111 11111111 11111111 11111111 11100000 00000000 00000000\r\n              // ((Math.pow(2, 32) - 1) >>> 11).toString(2)\r\n              //                                     11111 11111111 11111111\r\n              // 0x20000 is 2^21.\r\n              v = a[i] * 0x20000 + (a[i + 1] >>> 11);\r\n\r\n              // Rejection sampling:\r\n              // 0 <= v < 9007199254740992\r\n              // Probability that v >= 9e15, is\r\n              // 7199254740992 / 9007199254740992 ~= 0.0008, i.e. 1 in 1251\r\n              if (v >= 9e15) {\r\n                b = crypto.getRandomValues(new Uint32Array(2));\r\n                a[i] = b[0];\r\n                a[i + 1] = b[1];\r\n              } else {\r\n\r\n                // 0 <= v <= 8999999999999999\r\n                // 0 <= (v % 1e14) <= 99999999999999\r\n                c.push(v % 1e14);\r\n                i += 2;\r\n              }\r\n            }\r\n            i = k / 2;\r\n\r\n          // Node.js supporting crypto.randomBytes.\r\n          } else if (crypto.randomBytes) {\r\n\r\n            // buffer\r\n            a = crypto.randomBytes(k *= 7);\r\n\r\n            for (; i < k;) {\r\n\r\n              // 0x1000000000000 is 2^48, 0x10000000000 is 2^40\r\n              // 0x100000000 is 2^32, 0x1000000 is 2^24\r\n              // 11111 11111111 11111111 11111111 11111111 11111111 11111111\r\n              // 0 <= v < 9007199254740992\r\n              v = ((a[i] & 31) * 0x1000000000000) + (a[i + 1] * 0x10000000000) +\r\n                 (a[i + 2] * 0x100000000) + (a[i + 3] * 0x1000000) +\r\n                 (a[i + 4] << 16) + (a[i + 5] << 8) + a[i + 6];\r\n\r\n              if (v >= 9e15) {\r\n                crypto.randomBytes(7).copy(a, i);\r\n              } else {\r\n\r\n                // 0 <= (v % 1e14) <= 99999999999999\r\n                c.push(v % 1e14);\r\n                i += 7;\r\n              }\r\n            }\r\n            i = k / 7;\r\n          } else {\r\n            CRYPTO = false;\r\n            throw Error\r\n             (bignumberError + 'crypto unavailable');\r\n          }\r\n        }\r\n\r\n        // Use Math.random.\r\n        if (!CRYPTO) {\r\n\r\n          for (; i < k;) {\r\n            v = random53bitInt();\r\n            if (v < 9e15) c[i++] = v % 1e14;\r\n          }\r\n        }\r\n\r\n        k = c[--i];\r\n        dp %= LOG_BASE;\r\n\r\n        // Convert trailing digits to zeros according to dp.\r\n        if (k && dp) {\r\n          v = POWS_TEN[LOG_BASE - dp];\r\n          c[i] = mathfloor(k / v) * v;\r\n        }\r\n\r\n        // Remove trailing elements which are zero.\r\n        for (; c[i] === 0; c.pop(), i--);\r\n\r\n        // Zero?\r\n        if (i < 0) {\r\n          c = [e = 0];\r\n        } else {\r\n\r\n          // Remove leading elements which are zero and adjust exponent accordingly.\r\n          for (e = -1 ; c[0] === 0; c.splice(0, 1), e -= LOG_BASE);\r\n\r\n          // Count the digits of the first element of c to determine leading zeros, and...\r\n          for (i = 1, v = c[0]; v >= 10; v /= 10, i++);\r\n\r\n          // adjust the exponent accordingly.\r\n          if (i < LOG_BASE) e -= LOG_BASE - i;\r\n        }\r\n\r\n        rand.e = e;\r\n        rand.c = c;\r\n        return rand;\r\n      };\r\n    })();\r\n\r\n\r\n    /*\r\n     * Return a BigNumber whose value is the sum of the arguments.\r\n     *\r\n     * arguments {number|string|BigNumber}\r\n     */\r\n    BigNumber.sum = function () {\r\n      var i = 1,\r\n        args = arguments,\r\n        sum = new BigNumber(args[0]);\r\n      for (; i < args.length;) sum = sum.plus(args[i++]);\r\n      return sum;\r\n    };\r\n\r\n\r\n    // PRIVATE FUNCTIONS\r\n\r\n\r\n    // Called by BigNumber and BigNumber.prototype.toString.\r\n    convertBase = (function () {\r\n      var decimal = '0123456789';\r\n\r\n      /*\r\n       * Convert string of baseIn to an array of numbers of baseOut.\r\n       * Eg. toBaseOut('255', 10, 16) returns [15, 15].\r\n       * Eg. toBaseOut('ff', 16, 10) returns [2, 5, 5].\r\n       */\r\n      function toBaseOut(str, baseIn, baseOut, alphabet) {\r\n        var j,\r\n          arr = [0],\r\n          arrL,\r\n          i = 0,\r\n          len = str.length;\r\n\r\n        for (; i < len;) {\r\n          for (arrL = arr.length; arrL--; arr[arrL] *= baseIn);\r\n\r\n          arr[0] += alphabet.indexOf(str.charAt(i++));\r\n\r\n          for (j = 0; j < arr.length; j++) {\r\n\r\n            if (arr[j] > baseOut - 1) {\r\n              if (arr[j + 1] == null) arr[j + 1] = 0;\r\n              arr[j + 1] += arr[j] / baseOut | 0;\r\n              arr[j] %= baseOut;\r\n            }\r\n          }\r\n        }\r\n\r\n        return arr.reverse();\r\n      }\r\n\r\n      // Convert a numeric string of baseIn to a numeric string of baseOut.\r\n      // If the caller is toString, we are converting from base 10 to baseOut.\r\n      // If the caller is BigNumber, we are converting from baseIn to base 10.\r\n      return function (str, baseIn, baseOut, sign, callerIsToString) {\r\n        var alphabet, d, e, k, r, x, xc, y,\r\n          i = str.indexOf('.'),\r\n          dp = DECIMAL_PLACES,\r\n          rm = ROUNDING_MODE;\r\n\r\n        // Non-integer.\r\n        if (i >= 0) {\r\n          k = POW_PRECISION;\r\n\r\n          // Unlimited precision.\r\n          POW_PRECISION = 0;\r\n          str = str.replace('.', '');\r\n          y = new BigNumber(baseIn);\r\n          x = y.pow(str.length - i);\r\n          POW_PRECISION = k;\r\n\r\n          // Convert str as if an integer, then restore the fraction part by dividing the\r\n          // result by its base raised to a power.\r\n\r\n          y.c = toBaseOut(toFixedPoint(coeffToString(x.c), x.e, '0'),\r\n           10, baseOut, decimal);\r\n          y.e = y.c.length;\r\n        }\r\n\r\n        // Convert the number as integer.\r\n\r\n        xc = toBaseOut(str, baseIn, baseOut, callerIsToString\r\n         ? (alphabet = ALPHABET, decimal)\r\n         : (alphabet = decimal, ALPHABET));\r\n\r\n        // xc now represents str as an integer and converted to baseOut. e is the exponent.\r\n        e = k = xc.length;\r\n\r\n        // Remove trailing zeros.\r\n        for (; xc[--k] == 0; xc.pop());\r\n\r\n        // Zero?\r\n        if (!xc[0]) return alphabet.charAt(0);\r\n\r\n        // Does str represent an integer? If so, no need for the division.\r\n        if (i < 0) {\r\n          --e;\r\n        } else {\r\n          x.c = xc;\r\n          x.e = e;\r\n\r\n          // The sign is needed for correct rounding.\r\n          x.s = sign;\r\n          x = div(x, y, dp, rm, baseOut);\r\n          xc = x.c;\r\n          r = x.r;\r\n          e = x.e;\r\n        }\r\n\r\n        // xc now represents str converted to baseOut.\r\n\r\n        // The index of the rounding digit.\r\n        d = e + dp + 1;\r\n\r\n        // The rounding digit: the digit to the right of the digit that may be rounded up.\r\n        i = xc[d];\r\n\r\n        // Look at the rounding digits and mode to determine whether to round up.\r\n\r\n        k = baseOut / 2;\r\n        r = r || d < 0 || xc[d + 1] != null;\r\n\r\n        r = rm < 4 ? (i != null || r) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))\r\n              : i > k || i == k &&(rm == 4 || r || rm == 6 && xc[d - 1] & 1 ||\r\n               rm == (x.s < 0 ? 8 : 7));\r\n\r\n        // If the index of the rounding digit is not greater than zero, or xc represents\r\n        // zero, then the result of the base conversion is zero or, if rounding up, a value\r\n        // such as 0.00001.\r\n        if (d < 1 || !xc[0]) {\r\n\r\n          // 1^-dp or 0\r\n          str = r ? toFixedPoint(alphabet.charAt(1), -dp, alphabet.charAt(0)) : alphabet.charAt(0);\r\n        } else {\r\n\r\n          // Truncate xc to the required number of decimal places.\r\n          xc.length = d;\r\n\r\n          // Round up?\r\n          if (r) {\r\n\r\n            // Rounding up may mean the previous digit has to be rounded up and so on.\r\n            for (--baseOut; ++xc[--d] > baseOut;) {\r\n              xc[d] = 0;\r\n\r\n              if (!d) {\r\n                ++e;\r\n                xc = [1].concat(xc);\r\n              }\r\n            }\r\n          }\r\n\r\n          // Determine trailing zeros.\r\n          for (k = xc.length; !xc[--k];);\r\n\r\n          // E.g. [4, 11, 15] becomes 4bf.\r\n          for (i = 0, str = ''; i <= k; str += alphabet.charAt(xc[i++]));\r\n\r\n          // Add leading zeros, decimal point and trailing zeros as required.\r\n          str = toFixedPoint(str, e, alphabet.charAt(0));\r\n        }\r\n\r\n        // The caller will add the sign.\r\n        return str;\r\n      };\r\n    })();\r\n\r\n\r\n    // Perform division in the specified base. Called by div and convertBase.\r\n    div = (function () {\r\n\r\n      // Assume non-zero x and k.\r\n      function multiply(x, k, base) {\r\n        var m, temp, xlo, xhi,\r\n          carry = 0,\r\n          i = x.length,\r\n          klo = k % SQRT_BASE,\r\n          khi = k / SQRT_BASE | 0;\r\n\r\n        for (x = x.slice(); i--;) {\r\n          xlo = x[i] % SQRT_BASE;\r\n          xhi = x[i] / SQRT_BASE | 0;\r\n          m = khi * xlo + xhi * klo;\r\n          temp = klo * xlo + ((m % SQRT_BASE) * SQRT_BASE) + carry;\r\n          carry = (temp / base | 0) + (m / SQRT_BASE | 0) + khi * xhi;\r\n          x[i] = temp % base;\r\n        }\r\n\r\n        if (carry) x = [carry].concat(x);\r\n\r\n        return x;\r\n      }\r\n\r\n      function compare(a, b, aL, bL) {\r\n        var i, cmp;\r\n\r\n        if (aL != bL) {\r\n          cmp = aL > bL ? 1 : -1;\r\n        } else {\r\n\r\n          for (i = cmp = 0; i < aL; i++) {\r\n\r\n            if (a[i] != b[i]) {\r\n              cmp = a[i] > b[i] ? 1 : -1;\r\n              break;\r\n            }\r\n          }\r\n        }\r\n\r\n        return cmp;\r\n      }\r\n\r\n      function subtract(a, b, aL, base) {\r\n        var i = 0;\r\n\r\n        // Subtract b from a.\r\n        for (; aL--;) {\r\n          a[aL] -= i;\r\n          i = a[aL] < b[aL] ? 1 : 0;\r\n          a[aL] = i * base + a[aL] - b[aL];\r\n        }\r\n\r\n        // Remove leading zeros.\r\n        for (; !a[0] && a.length > 1; a.splice(0, 1));\r\n      }\r\n\r\n      // x: dividend, y: divisor.\r\n      return function (x, y, dp, rm, base) {\r\n        var cmp, e, i, more, n, prod, prodL, q, qc, rem, remL, rem0, xi, xL, yc0,\r\n          yL, yz,\r\n          s = x.s == y.s ? 1 : -1,\r\n          xc = x.c,\r\n          yc = y.c;\r\n\r\n        // Either NaN, Infinity or 0?\r\n        if (!xc || !xc[0] || !yc || !yc[0]) {\r\n\r\n          return new BigNumber(\r\n\r\n           // Return NaN if either NaN, or both Infinity or 0.\r\n           !x.s || !y.s || (xc ? yc && xc[0] == yc[0] : !yc) ? NaN :\r\n\r\n            // Return \u00B10 if x is \u00B10 or y is \u00B1Infinity, or return \u00B1Infinity as y is \u00B10.\r\n            xc && xc[0] == 0 || !yc ? s * 0 : s / 0\r\n         );\r\n        }\r\n\r\n        q = new BigNumber(s);\r\n        qc = q.c = [];\r\n        e = x.e - y.e;\r\n        s = dp + e + 1;\r\n\r\n        if (!base) {\r\n          base = BASE;\r\n          e = bitFloor(x.e / LOG_BASE) - bitFloor(y.e / LOG_BASE);\r\n          s = s / LOG_BASE | 0;\r\n        }\r\n\r\n        // Result exponent may be one less then the current value of e.\r\n        // The coefficients of the BigNumbers from convertBase may have trailing zeros.\r\n        for (i = 0; yc[i] == (xc[i] || 0); i++);\r\n\r\n        if (yc[i] > (xc[i] || 0)) e--;\r\n\r\n        if (s < 0) {\r\n          qc.push(1);\r\n          more = true;\r\n        } else {\r\n          xL = xc.length;\r\n          yL = yc.length;\r\n          i = 0;\r\n          s += 2;\r\n\r\n          // Normalise xc and yc so highest order digit of yc is >= base / 2.\r\n\r\n          n = mathfloor(base / (yc[0] + 1));\r\n\r\n          // Not necessary, but to handle odd bases where yc[0] == (base / 2) - 1.\r\n          // if (n > 1 || n++ == 1 && yc[0] < base / 2) {\r\n          if (n > 1) {\r\n            yc = multiply(yc, n, base);\r\n            xc = multiply(xc, n, base);\r\n            yL = yc.length;\r\n            xL = xc.length;\r\n          }\r\n\r\n          xi = yL;\r\n          rem = xc.slice(0, yL);\r\n          remL = rem.length;\r\n\r\n          // Add zeros to make remainder as long as divisor.\r\n          for (; remL < yL; rem[remL++] = 0);\r\n          yz = yc.slice();\r\n          yz = [0].concat(yz);\r\n          yc0 = yc[0];\r\n          if (yc[1] >= base / 2) yc0++;\r\n          // Not necessary, but to prevent trial digit n > base, when using base 3.\r\n          // else if (base == 3 && yc0 == 1) yc0 = 1 + 1e-15;\r\n\r\n          do {\r\n            n = 0;\r\n\r\n            // Compare divisor and remainder.\r\n            cmp = compare(yc, rem, yL, remL);\r\n\r\n            // If divisor < remainder.\r\n            if (cmp < 0) {\r\n\r\n              // Calculate trial digit, n.\r\n\r\n              rem0 = rem[0];\r\n              if (yL != remL) rem0 = rem0 * base + (rem[1] || 0);\r\n\r\n              // n is how many times the divisor goes into the current remainder.\r\n              n = mathfloor(rem0 / yc0);\r\n\r\n              //  Algorithm:\r\n              //  product = divisor multiplied by trial digit (n).\r\n              //  Compare product and remainder.\r\n              //  If product is greater than remainder:\r\n              //    Subtract divisor from product, decrement trial digit.\r\n              //  Subtract product from remainder.\r\n              //  If product was less than remainder at the last compare:\r\n              //    Compare new remainder and divisor.\r\n              //    If remainder is greater than divisor:\r\n              //      Subtract divisor from remainder, increment trial digit.\r\n\r\n              if (n > 1) {\r\n\r\n                // n may be > base only when base is 3.\r\n                if (n >= base) n = base - 1;\r\n\r\n                // product = divisor * trial digit.\r\n                prod = multiply(yc, n, base);\r\n                prodL = prod.length;\r\n                remL = rem.length;\r\n\r\n                // Compare product and remainder.\r\n                // If product > remainder then trial digit n too high.\r\n                // n is 1 too high about 5% of the time, and is not known to have\r\n                // ever been more than 1 too high.\r\n                while (compare(prod, rem, prodL, remL) == 1) {\r\n                  n--;\r\n\r\n                  // Subtract divisor from product.\r\n                  subtract(prod, yL < prodL ? yz : yc, prodL, base);\r\n                  prodL = prod.length;\r\n                  cmp = 1;\r\n                }\r\n              } else {\r\n\r\n                // n is 0 or 1, cmp is -1.\r\n                // If n is 0, there is no need to compare yc and rem again below,\r\n                // so change cmp to 1 to avoid it.\r\n                // If n is 1, leave cmp as -1, so yc and rem are compared again.\r\n                if (n == 0) {\r\n\r\n                  // divisor < remainder, so n must be at least 1.\r\n                  cmp = n = 1;\r\n                }\r\n\r\n                // product = divisor\r\n                prod = yc.slice();\r\n                prodL = prod.length;\r\n              }\r\n\r\n              if (prodL < remL) prod = [0].concat(prod);\r\n\r\n              // Subtract product from remainder.\r\n              subtract(rem, prod, remL, base);\r\n              remL = rem.length;\r\n\r\n               // If product was < remainder.\r\n              if (cmp == -1) {\r\n\r\n                // Compare divisor and new remainder.\r\n                // If divisor < new remainder, subtract divisor from remainder.\r\n                // Trial digit n too low.\r\n                // n is 1 too low about 5% of the time, and very rarely 2 too low.\r\n                while (compare(yc, rem, yL, remL) < 1) {\r\n                  n++;\r\n\r\n                  // Subtract divisor from remainder.\r\n                  subtract(rem, yL < remL ? yz : yc, remL, base);\r\n                  remL = rem.length;\r\n                }\r\n              }\r\n            } else if (cmp === 0) {\r\n              n++;\r\n              rem = [0];\r\n            } // else cmp === 1 and n will be 0\r\n\r\n            // Add the next digit, n, to the result array.\r\n            qc[i++] = n;\r\n\r\n            // Update the remainder.\r\n            if (rem[0]) {\r\n              rem[remL++] = xc[xi] || 0;\r\n            } else {\r\n              rem = [xc[xi]];\r\n              remL = 1;\r\n            }\r\n          } while ((xi++ < xL || rem[0] != null) && s--);\r\n\r\n          more = rem[0] != null;\r\n\r\n          // Leading zero?\r\n          if (!qc[0]) qc.splice(0, 1);\r\n        }\r\n\r\n        if (base == BASE) {\r\n\r\n          // To calculate q.e, first get the number of digits of qc[0].\r\n          for (i = 1, s = qc[0]; s >= 10; s /= 10, i++);\r\n\r\n          round(q, dp + (q.e = i + e * LOG_BASE - 1) + 1, rm, more);\r\n\r\n        // Caller is convertBase.\r\n        } else {\r\n          q.e = e;\r\n          q.r = +more;\r\n        }\r\n\r\n        return q;\r\n      };\r\n    })();\r\n\r\n\r\n    /*\r\n     * Return a string representing the value of BigNumber n in fixed-point or exponential\r\n     * notation rounded to the specified decimal places or significant digits.\r\n     *\r\n     * n: a BigNumber.\r\n     * i: the index of the last digit required (i.e. the digit that may be rounded up).\r\n     * rm: the rounding mode.\r\n     * id: 1 (toExponential) or 2 (toPrecision).\r\n     */\r\n    function format(n, i, rm, id) {\r\n      var c0, e, ne, len, str;\r\n\r\n      if (rm == null) rm = ROUNDING_MODE;\r\n      else intCheck(rm, 0, 8);\r\n\r\n      if (!n.c) return n.toString();\r\n\r\n      c0 = n.c[0];\r\n      ne = n.e;\r\n\r\n      if (i == null) {\r\n        str = coeffToString(n.c);\r\n        str = id == 1 || id == 2 && (ne <= TO_EXP_NEG || ne >= TO_EXP_POS)\r\n         ? toExponential(str, ne)\r\n         : toFixedPoint(str, ne, '0');\r\n      } else {\r\n        n = round(new BigNumber(n), i, rm);\r\n\r\n        // n.e may have changed if the value was rounded up.\r\n        e = n.e;\r\n\r\n        str = coeffToString(n.c);\r\n        len = str.length;\r\n\r\n        // toPrecision returns exponential notation if the number of significant digits\r\n        // specified is less than the number of digits necessary to represent the integer\r\n        // part of the value in fixed-point notation.\r\n\r\n        // Exponential notation.\r\n        if (id == 1 || id == 2 && (i <= e || e <= TO_EXP_NEG)) {\r\n\r\n          // Append zeros?\r\n          for (; len < i; str += '0', len++);\r\n          str = toExponential(str, e);\r\n\r\n        // Fixed-point notation.\r\n        } else {\r\n          i -= ne + (id === 2 && e > ne);\r\n          str = toFixedPoint(str, e, '0');\r\n\r\n          // Append zeros?\r\n          if (e + 1 > len) {\r\n            if (--i > 0) for (str += '.'; i--; str += '0');\r\n          } else {\r\n            i += e - len;\r\n            if (i > 0) {\r\n              if (e + 1 == len) str += '.';\r\n              for (; i--; str += '0');\r\n            }\r\n          }\r\n        }\r\n      }\r\n\r\n      return n.s < 0 && c0 ? '-' + str : str;\r\n    }\r\n\r\n\r\n    // Handle BigNumber.max and BigNumber.min.\r\n    // If any number is NaN, return NaN.\r\n    function maxOrMin(args, n) {\r\n      var k, y,\r\n        i = 1,\r\n        x = new BigNumber(args[0]);\r\n\r\n      for (; i < args.length; i++) {\r\n        y = new BigNumber(args[i]);\r\n        if (!y.s || (k = compare(x, y)) === n || k === 0 && x.s === n) {\r\n          x = y;\r\n        }\r\n      }\r\n\r\n      return x;\r\n    }\r\n\r\n\r\n    /*\r\n     * Strip trailing zeros, calculate base 10 exponent and check against MIN_EXP and MAX_EXP.\r\n     * Called by minus, plus and times.\r\n     */\r\n    function normalise(n, c, e) {\r\n      var i = 1,\r\n        j = c.length;\r\n\r\n       // Remove trailing zeros.\r\n      for (; !c[--j]; c.pop());\r\n\r\n      // Calculate the base 10 exponent. First get the number of digits of c[0].\r\n      for (j = c[0]; j >= 10; j /= 10, i++);\r\n\r\n      // Overflow?\r\n      if ((e = i + e * LOG_BASE - 1) > MAX_EXP) {\r\n\r\n        // Infinity.\r\n        n.c = n.e = null;\r\n\r\n      // Underflow?\r\n      } else if (e < MIN_EXP) {\r\n\r\n        // Zero.\r\n        n.c = [n.e = 0];\r\n      } else {\r\n        n.e = e;\r\n        n.c = c;\r\n      }\r\n\r\n      return n;\r\n    }\r\n\r\n\r\n    // Handle values that fail the validity test in BigNumber.\r\n    parseNumeric = (function () {\r\n      var basePrefix = /^(-?)0([xbo])(?=\\w[\\w.]*$)/i,\r\n        dotAfter = /^([^.]+)\\.$/,\r\n        dotBefore = /^\\.([^.]+)$/,\r\n        isInfinityOrNaN = /^-?(Infinity|NaN)$/,\r\n        whitespaceOrPlus = /^\\s*\\+(?=[\\w.])|^\\s+|\\s+$/g;\r\n\r\n      return function (x, str, isNum, b) {\r\n        var base,\r\n          s = isNum ? str : str.replace(whitespaceOrPlus, '');\r\n\r\n        // No exception on \u00B1Infinity or NaN.\r\n        if (isInfinityOrNaN.test(s)) {\r\n          x.s = isNaN(s) ? null : s < 0 ? -1 : 1;\r\n        } else {\r\n          if (!isNum) {\r\n\r\n            // basePrefix = /^(-?)0([xbo])(?=\\w[\\w.]*$)/i\r\n            s = s.replace(basePrefix, function (m, p1, p2) {\r\n              base = (p2 = p2.toLowerCase()) == 'x' ? 16 : p2 == 'b' ? 2 : 8;\r\n              return !b || b == base ? p1 : m;\r\n            });\r\n\r\n            if (b) {\r\n              base = b;\r\n\r\n              // E.g. '1.' to '1', '.1' to '0.1'\r\n              s = s.replace(dotAfter, '$1').replace(dotBefore, '0.$1');\r\n            }\r\n\r\n            if (str != s) return new BigNumber(s, base);\r\n          }\r\n\r\n          // '[BigNumber Error] Not a number: {n}'\r\n          // '[BigNumber Error] Not a base {b} number: {n}'\r\n          if (BigNumber.DEBUG) {\r\n            throw Error\r\n              (bignumberError + 'Not a' + (b ? ' base ' + b : '') + ' number: ' + str);\r\n          }\r\n\r\n          // NaN\r\n          x.s = null;\r\n        }\r\n\r\n        x.c = x.e = null;\r\n      }\r\n    })();\r\n\r\n\r\n    /*\r\n     * Round x to sd significant digits using rounding mode rm. Check for over/under-flow.\r\n     * If r is truthy, it is known that there are more digits after the rounding digit.\r\n     */\r\n    function round(x, sd, rm, r) {\r\n      var d, i, j, k, n, ni, rd,\r\n        xc = x.c,\r\n        pows10 = POWS_TEN;\r\n\r\n      // if x is not Infinity or NaN...\r\n      if (xc) {\r\n\r\n        // rd is the rounding digit, i.e. the digit after the digit that may be rounded up.\r\n        // n is a base 1e14 number, the value of the element of array x.c containing rd.\r\n        // ni is the index of n within x.c.\r\n        // d is the number of digits of n.\r\n        // i is the index of rd within n including leading zeros.\r\n        // j is the actual index of rd within n (if < 0, rd is a leading zero).\r\n        out: {\r\n\r\n          // Get the number of digits of the first element of xc.\r\n          for (d = 1, k = xc[0]; k >= 10; k /= 10, d++);\r\n          i = sd - d;\r\n\r\n          // If the rounding digit is in the first element of xc...\r\n          if (i < 0) {\r\n            i += LOG_BASE;\r\n            j = sd;\r\n            n = xc[ni = 0];\r\n\r\n            // Get the rounding digit at index j of n.\r\n            rd = mathfloor(n / pows10[d - j - 1] % 10);\r\n          } else {\r\n            ni = mathceil((i + 1) / LOG_BASE);\r\n\r\n            if (ni >= xc.length) {\r\n\r\n              if (r) {\r\n\r\n                // Needed by sqrt.\r\n                for (; xc.length <= ni; xc.push(0));\r\n                n = rd = 0;\r\n                d = 1;\r\n                i %= LOG_BASE;\r\n                j = i - LOG_BASE + 1;\r\n              } else {\r\n                break out;\r\n              }\r\n            } else {\r\n              n = k = xc[ni];\r\n\r\n              // Get the number of digits of n.\r\n              for (d = 1; k >= 10; k /= 10, d++);\r\n\r\n              // Get the index of rd within n.\r\n              i %= LOG_BASE;\r\n\r\n              // Get the index of rd within n, adjusted for leading zeros.\r\n              // The number of leading zeros of n is given by LOG_BASE - d.\r\n              j = i - LOG_BASE + d;\r\n\r\n              // Get the rounding digit at index j of n.\r\n              rd = j < 0 ? 0 : mathfloor(n / pows10[d - j - 1] % 10);\r\n            }\r\n          }\r\n\r\n          r = r || sd < 0 ||\r\n\r\n          // Are there any non-zero digits after the rounding digit?\r\n          // The expression  n % pows10[d - j - 1]  returns all digits of n to the right\r\n          // of the digit at j, e.g. if n is 908714 and j is 2, the expression gives 714.\r\n           xc[ni + 1] != null || (j < 0 ? n : n % pows10[d - j - 1]);\r\n\r\n          r = rm < 4\r\n           ? (rd || r) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))\r\n           : rd > 5 || rd == 5 && (rm == 4 || r || rm == 6 &&\r\n\r\n            // Check whether the digit to the left of the rounding digit is odd.\r\n            ((i > 0 ? j > 0 ? n / pows10[d - j] : 0 : xc[ni - 1]) % 10) & 1 ||\r\n             rm == (x.s < 0 ? 8 : 7));\r\n\r\n          if (sd < 1 || !xc[0]) {\r\n            xc.length = 0;\r\n\r\n            if (r) {\r\n\r\n              // Convert sd to decimal places.\r\n              sd -= x.e + 1;\r\n\r\n              // 1, 0.1, 0.01, 0.001, 0.0001 etc.\r\n              xc[0] = pows10[(LOG_BASE - sd % LOG_BASE) % LOG_BASE];\r\n              x.e = -sd || 0;\r\n            } else {\r\n\r\n              // Zero.\r\n              xc[0] = x.e = 0;\r\n            }\r\n\r\n            return x;\r\n          }\r\n\r\n          // Remove excess digits.\r\n          if (i == 0) {\r\n            xc.length = ni;\r\n            k = 1;\r\n            ni--;\r\n          } else {\r\n            xc.length = ni + 1;\r\n            k = pows10[LOG_BASE - i];\r\n\r\n            // E.g. 56700 becomes 56000 if 7 is the rounding digit.\r\n            // j > 0 means i > number of leading zeros of n.\r\n            xc[ni] = j > 0 ? mathfloor(n / pows10[d - j] % pows10[j]) * k : 0;\r\n          }\r\n\r\n          // Round up?\r\n          if (r) {\r\n\r\n            for (; ;) {\r\n\r\n              // If the digit to be rounded up is in the first element of xc...\r\n              if (ni == 0) {\r\n\r\n                // i will be the length of xc[0] before k is added.\r\n                for (i = 1, j = xc[0]; j >= 10; j /= 10, i++);\r\n                j = xc[0] += k;\r\n                for (k = 1; j >= 10; j /= 10, k++);\r\n\r\n                // if i != k the length has increased.\r\n                if (i != k) {\r\n                  x.e++;\r\n                  if (xc[0] == BASE) xc[0] = 1;\r\n                }\r\n\r\n                break;\r\n              } else {\r\n                xc[ni] += k;\r\n                if (xc[ni] != BASE) break;\r\n                xc[ni--] = 0;\r\n                k = 1;\r\n              }\r\n            }\r\n          }\r\n\r\n          // Remove trailing zeros.\r\n          for (i = xc.length; xc[--i] === 0; xc.pop());\r\n        }\r\n\r\n        // Overflow? Infinity.\r\n        if (x.e > MAX_EXP) {\r\n          x.c = x.e = null;\r\n\r\n        // Underflow? Zero.\r\n        } else if (x.e < MIN_EXP) {\r\n          x.c = [x.e = 0];\r\n        }\r\n      }\r\n\r\n      return x;\r\n    }\r\n\r\n\r\n    function valueOf(n) {\r\n      var str,\r\n        e = n.e;\r\n\r\n      if (e === null) return n.toString();\r\n\r\n      str = coeffToString(n.c);\r\n\r\n      str = e <= TO_EXP_NEG || e >= TO_EXP_POS\r\n        ? toExponential(str, e)\r\n        : toFixedPoint(str, e, '0');\r\n\r\n      return n.s < 0 ? '-' + str : str;\r\n    }\r\n\r\n\r\n    // PROTOTYPE/INSTANCE METHODS\r\n\r\n\r\n    /*\r\n     * Return a new BigNumber whose value is the absolute value of this BigNumber.\r\n     */\r\n    P.absoluteValue = P.abs = function () {\r\n      var x = new BigNumber(this);\r\n      if (x.s < 0) x.s = 1;\r\n      return x;\r\n    };\r\n\r\n\r\n    /*\r\n     * Return\r\n     *   1 if the value of this BigNumber is greater than the value of BigNumber(y, b),\r\n     *   -1 if the value of this BigNumber is less than the value of BigNumber(y, b),\r\n     *   0 if they have the same value,\r\n     *   or null if the value of either is NaN.\r\n     */\r\n    P.comparedTo = function (y, b) {\r\n      return compare(this, new BigNumber(y, b));\r\n    };\r\n\r\n\r\n    /*\r\n     * If dp is undefined or null or true or false, return the number of decimal places of the\r\n     * value of this BigNumber, or null if the value of this BigNumber is \u00B1Infinity or NaN.\r\n     *\r\n     * Otherwise, if dp is a number, return a new BigNumber whose value is the value of this\r\n     * BigNumber rounded to a maximum of dp decimal places using rounding mode rm, or\r\n     * ROUNDING_MODE if rm is omitted.\r\n     *\r\n     * [dp] {number} Decimal places: integer, 0 to MAX inclusive.\r\n     * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n     *\r\n     * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n     */\r\n    P.decimalPlaces = P.dp = function (dp, rm) {\r\n      var c, n, v,\r\n        x = this;\r\n\r\n      if (dp != null) {\r\n        intCheck(dp, 0, MAX);\r\n        if (rm == null) rm = ROUNDING_MODE;\r\n        else intCheck(rm, 0, 8);\r\n\r\n        return round(new BigNumber(x), dp + x.e + 1, rm);\r\n      }\r\n\r\n      if (!(c = x.c)) return null;\r\n      n = ((v = c.length - 1) - bitFloor(this.e / LOG_BASE)) * LOG_BASE;\r\n\r\n      // Subtract the number of trailing zeros of the last number.\r\n      if (v = c[v]) for (; v % 10 == 0; v /= 10, n--);\r\n      if (n < 0) n = 0;\r\n\r\n      return n;\r\n    };\r\n\r\n\r\n    /*\r\n     *  n / 0 = I\r\n     *  n / N = N\r\n     *  n / I = 0\r\n     *  0 / n = 0\r\n     *  0 / 0 = N\r\n     *  0 / N = N\r\n     *  0 / I = 0\r\n     *  N / n = N\r\n     *  N / 0 = N\r\n     *  N / N = N\r\n     *  N / I = N\r\n     *  I / n = I\r\n     *  I / 0 = I\r\n     *  I / N = N\r\n     *  I / I = N\r\n     *\r\n     * Return a new BigNumber whose value is the value of this BigNumber divided by the value of\r\n     * BigNumber(y, b), rounded according to DECIMAL_PLACES and ROUNDING_MODE.\r\n     */\r\n    P.dividedBy = P.div = function (y, b) {\r\n      return div(this, new BigNumber(y, b), DECIMAL_PLACES, ROUNDING_MODE);\r\n    };\r\n\r\n\r\n    /*\r\n     * Return a new BigNumber whose value is the integer part of dividing the value of this\r\n     * BigNumber by the value of BigNumber(y, b).\r\n     */\r\n    P.dividedToIntegerBy = P.idiv = function (y, b) {\r\n      return div(this, new BigNumber(y, b), 0, 1);\r\n    };\r\n\r\n\r\n    /*\r\n     * Return a BigNumber whose value is the value of this BigNumber exponentiated by n.\r\n     *\r\n     * If m is present, return the result modulo m.\r\n     * If n is negative round according to DECIMAL_PLACES and ROUNDING_MODE.\r\n     * If POW_PRECISION is non-zero and m is not present, round to POW_PRECISION using ROUNDING_MODE.\r\n     *\r\n     * The modular power operation works efficiently when x, n, and m are integers, otherwise it\r\n     * is equivalent to calculating x.exponentiatedBy(n).modulo(m) with a POW_PRECISION of 0.\r\n     *\r\n     * n {number|string|BigNumber} The exponent. An integer.\r\n     * [m] {number|string|BigNumber} The modulus.\r\n     *\r\n     * '[BigNumber Error] Exponent not an integer: {n}'\r\n     */\r\n    P.exponentiatedBy = P.pow = function (n, m) {\r\n      var half, isModExp, i, k, more, nIsBig, nIsNeg, nIsOdd, y,\r\n        x = this;\r\n\r\n      n = new BigNumber(n);\r\n\r\n      // Allow NaN and \u00B1Infinity, but not other non-integers.\r\n      if (n.c && !n.isInteger()) {\r\n        throw Error\r\n          (bignumberError + 'Exponent not an integer: ' + valueOf(n));\r\n      }\r\n\r\n      if (m != null) m = new BigNumber(m);\r\n\r\n      // Exponent of MAX_SAFE_INTEGER is 15.\r\n      nIsBig = n.e > 14;\r\n\r\n      // If x is NaN, \u00B1Infinity, \u00B10 or \u00B11, or n is \u00B1Infinity, NaN or \u00B10.\r\n      if (!x.c || !x.c[0] || x.c[0] == 1 && !x.e && x.c.length == 1 || !n.c || !n.c[0]) {\r\n\r\n        // The sign of the result of pow when x is negative depends on the evenness of n.\r\n        // If +n overflows to \u00B1Infinity, the evenness of n would be not be known.\r\n        y = new BigNumber(Math.pow(+valueOf(x), nIsBig ? n.s * (2 - isOdd(n)) : +valueOf(n)));\r\n        return m ? y.mod(m) : y;\r\n      }\r\n\r\n      nIsNeg = n.s < 0;\r\n\r\n      if (m) {\r\n\r\n        // x % m returns NaN if abs(m) is zero, or m is NaN.\r\n        if (m.c ? !m.c[0] : !m.s) return new BigNumber(NaN);\r\n\r\n        isModExp = !nIsNeg && x.isInteger() && m.isInteger();\r\n\r\n        if (isModExp) x = x.mod(m);\r\n\r\n      // Overflow to \u00B1Infinity: >=2**1e10 or >=1.0000024**1e15.\r\n      // Underflow to \u00B10: <=0.79**1e10 or <=0.9999975**1e15.\r\n      } else if (n.e > 9 && (x.e > 0 || x.e < -1 || (x.e == 0\r\n        // [1, 240000000]\r\n        ? x.c[0] > 1 || nIsBig && x.c[1] >= 24e7\r\n        // [80000000000000]  [99999750000000]\r\n        : x.c[0] < 8e13 || nIsBig && x.c[0] <= 9999975e7))) {\r\n\r\n        // If x is negative and n is odd, k = -0, else k = 0.\r\n        k = x.s < 0 && isOdd(n) ? -0 : 0;\r\n\r\n        // If x >= 1, k = \u00B1Infinity.\r\n        if (x.e > -1) k = 1 / k;\r\n\r\n        // If n is negative return \u00B10, else return \u00B1Infinity.\r\n        return new BigNumber(nIsNeg ? 1 / k : k);\r\n\r\n      } else if (POW_PRECISION) {\r\n\r\n        // Truncating each coefficient array to a length of k after each multiplication\r\n        // equates to truncating significant digits to POW_PRECISION + [28, 41],\r\n        // i.e. there will be a minimum of 28 guard digits retained.\r\n        k = mathceil(POW_PRECISION / LOG_BASE + 2);\r\n      }\r\n\r\n      if (nIsBig) {\r\n        half = new BigNumber(0.5);\r\n        if (nIsNeg) n.s = 1;\r\n        nIsOdd = isOdd(n);\r\n      } else {\r\n        i = Math.abs(+valueOf(n));\r\n        nIsOdd = i % 2;\r\n      }\r\n\r\n      y = new BigNumber(ONE);\r\n\r\n      // Performs 54 loop iterations for n of 9007199254740991.\r\n      for (; ;) {\r\n\r\n        if (nIsOdd) {\r\n          y = y.times(x);\r\n          if (!y.c) break;\r\n\r\n          if (k) {\r\n            if (y.c.length > k) y.c.length = k;\r\n          } else if (isModExp) {\r\n            y = y.mod(m);    //y = y.minus(div(y, m, 0, MODULO_MODE).times(m));\r\n          }\r\n        }\r\n\r\n        if (i) {\r\n          i = mathfloor(i / 2);\r\n          if (i === 0) break;\r\n          nIsOdd = i % 2;\r\n        } else {\r\n          n = n.times(half);\r\n          round(n, n.e + 1, 1);\r\n\r\n          if (n.e > 14) {\r\n            nIsOdd = isOdd(n);\r\n          } else {\r\n            i = +valueOf(n);\r\n            if (i === 0) break;\r\n            nIsOdd = i % 2;\r\n          }\r\n        }\r\n\r\n        x = x.times(x);\r\n\r\n        if (k) {\r\n          if (x.c && x.c.length > k) x.c.length = k;\r\n        } else if (isModExp) {\r\n          x = x.mod(m);    //x = x.minus(div(x, m, 0, MODULO_MODE).times(m));\r\n        }\r\n      }\r\n\r\n      if (isModExp) return y;\r\n      if (nIsNeg) y = ONE.div(y);\r\n\r\n      return m ? y.mod(m) : k ? round(y, POW_PRECISION, ROUNDING_MODE, more) : y;\r\n    };\r\n\r\n\r\n    /*\r\n     * Return a new BigNumber whose value is the value of this BigNumber rounded to an integer\r\n     * using rounding mode rm, or ROUNDING_MODE if rm is omitted.\r\n     *\r\n     * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n     *\r\n     * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {rm}'\r\n     */\r\n    P.integerValue = function (rm) {\r\n      var n = new BigNumber(this);\r\n      if (rm == null) rm = ROUNDING_MODE;\r\n      else intCheck(rm, 0, 8);\r\n      return round(n, n.e + 1, rm);\r\n    };\r\n\r\n\r\n    /*\r\n     * Return true if the value of this BigNumber is equal to the value of BigNumber(y, b),\r\n     * otherwise return false.\r\n     */\r\n    P.isEqualTo = P.eq = function (y, b) {\r\n      return compare(this, new BigNumber(y, b)) === 0;\r\n    };\r\n\r\n\r\n    /*\r\n     * Return true if the value of this BigNumber is a finite number, otherwise return false.\r\n     */\r\n    P.isFinite = function () {\r\n      return !!this.c;\r\n    };\r\n\r\n\r\n    /*\r\n     * Return true if the value of this BigNumber is greater than the value of BigNumber(y, b),\r\n     * otherwise return false.\r\n     */\r\n    P.isGreaterThan = P.gt = function (y, b) {\r\n      return compare(this, new BigNumber(y, b)) > 0;\r\n    };\r\n\r\n\r\n    /*\r\n     * Return true if the value of this BigNumber is greater than or equal to the value of\r\n     * BigNumber(y, b), otherwise return false.\r\n     */\r\n    P.isGreaterThanOrEqualTo = P.gte = function (y, b) {\r\n      return (b = compare(this, new BigNumber(y, b))) === 1 || b === 0;\r\n\r\n    };\r\n\r\n\r\n    /*\r\n     * Return true if the value of this BigNumber is an integer, otherwise return false.\r\n     */\r\n    P.isInteger = function () {\r\n      return !!this.c && bitFloor(this.e / LOG_BASE) > this.c.length - 2;\r\n    };\r\n\r\n\r\n    /*\r\n     * Return true if the value of this BigNumber is less than the value of BigNumber(y, b),\r\n     * otherwise return false.\r\n     */\r\n    P.isLessThan = P.lt = function (y, b) {\r\n      return compare(this, new BigNumber(y, b)) < 0;\r\n    };\r\n\r\n\r\n    /*\r\n     * Return true if the value of this BigNumber is less than or equal to the value of\r\n     * BigNumber(y, b), otherwise return false.\r\n     */\r\n    P.isLessThanOrEqualTo = P.lte = function (y, b) {\r\n      return (b = compare(this, new BigNumber(y, b))) === -1 || b === 0;\r\n    };\r\n\r\n\r\n    /*\r\n     * Return true if the value of this BigNumber is NaN, otherwise return false.\r\n     */\r\n    P.isNaN = function () {\r\n      return !this.s;\r\n    };\r\n\r\n\r\n    /*\r\n     * Return true if the value of this BigNumber is negative, otherwise return false.\r\n     */\r\n    P.isNegative = function () {\r\n      return this.s < 0;\r\n    };\r\n\r\n\r\n    /*\r\n     * Return true if the value of this BigNumber is positive, otherwise return false.\r\n     */\r\n    P.isPositive = function () {\r\n      return this.s > 0;\r\n    };\r\n\r\n\r\n    /*\r\n     * Return true if the value of this BigNumber is 0 or -0, otherwise return false.\r\n     */\r\n    P.isZero = function () {\r\n      return !!this.c && this.c[0] == 0;\r\n    };\r\n\r\n\r\n    /*\r\n     *  n - 0 = n\r\n     *  n - N = N\r\n     *  n - I = -I\r\n     *  0 - n = -n\r\n     *  0 - 0 = 0\r\n     *  0 - N = N\r\n     *  0 - I = -I\r\n     *  N - n = N\r\n     *  N - 0 = N\r\n     *  N - N = N\r\n     *  N - I = N\r\n     *  I - n = I\r\n     *  I - 0 = I\r\n     *  I - N = N\r\n     *  I - I = N\r\n     *\r\n     * Return a new BigNumber whose value is the value of this BigNumber minus the value of\r\n     * BigNumber(y, b).\r\n     */\r\n    P.minus = function (y, b) {\r\n      var i, j, t, xLTy,\r\n        x = this,\r\n        a = x.s;\r\n\r\n      y = new BigNumber(y, b);\r\n      b = y.s;\r\n\r\n      // Either NaN?\r\n      if (!a || !b) return new BigNumber(NaN);\r\n\r\n      // Signs differ?\r\n      if (a != b) {\r\n        y.s = -b;\r\n        return x.plus(y);\r\n      }\r\n\r\n      var xe = x.e / LOG_BASE,\r\n        ye = y.e / LOG_BASE,\r\n        xc = x.c,\r\n        yc = y.c;\r\n\r\n      if (!xe || !ye) {\r\n\r\n        // Either Infinity?\r\n        if (!xc || !yc) return xc ? (y.s = -b, y) : new BigNumber(yc ? x : NaN);\r\n\r\n        // Either zero?\r\n        if (!xc[0] || !yc[0]) {\r\n\r\n          // Return y if y is non-zero, x if x is non-zero, or zero if both are zero.\r\n          return yc[0] ? (y.s = -b, y) : new BigNumber(xc[0] ? x :\r\n\r\n           // IEEE 754 (2008) 6.3: n - n = -0 when rounding to -Infinity\r\n           ROUNDING_MODE == 3 ? -0 : 0);\r\n        }\r\n      }\r\n\r\n      xe = bitFloor(xe);\r\n      ye = bitFloor(ye);\r\n      xc = xc.slice();\r\n\r\n      // Determine which is the bigger number.\r\n      if (a = xe - ye) {\r\n\r\n        if (xLTy = a < 0) {\r\n          a = -a;\r\n          t = xc;\r\n        } else {\r\n          ye = xe;\r\n          t = yc;\r\n        }\r\n\r\n        t.reverse();\r\n\r\n        // Prepend zeros to equalise exponents.\r\n        for (b = a; b--; t.push(0));\r\n        t.reverse();\r\n      } else {\r\n\r\n        // Exponents equal. Check digit by digit.\r\n        j = (xLTy = (a = xc.length) < (b = yc.length)) ? a : b;\r\n\r\n        for (a = b = 0; b < j; b++) {\r\n\r\n          if (xc[b] != yc[b]) {\r\n            xLTy = xc[b] < yc[b];\r\n            break;\r\n          }\r\n        }\r\n      }\r\n\r\n      // x < y? Point xc to the array of the bigger number.\r\n      if (xLTy) {\r\n        t = xc;\r\n        xc = yc;\r\n        yc = t;\r\n        y.s = -y.s;\r\n      }\r\n\r\n      b = (j = yc.length) - (i = xc.length);\r\n\r\n      // Append zeros to xc if shorter.\r\n      // No need to add zeros to yc if shorter as subtract only needs to start at yc.length.\r\n      if (b > 0) for (; b--; xc[i++] = 0);\r\n      b = BASE - 1;\r\n\r\n      // Subtract yc from xc.\r\n      for (; j > a;) {\r\n\r\n        if (xc[--j] < yc[j]) {\r\n          for (i = j; i && !xc[--i]; xc[i] = b);\r\n          --xc[i];\r\n          xc[j] += BASE;\r\n        }\r\n\r\n        xc[j] -= yc[j];\r\n      }\r\n\r\n      // Remove leading zeros and adjust exponent accordingly.\r\n      for (; xc[0] == 0; xc.splice(0, 1), --ye);\r\n\r\n      // Zero?\r\n      if (!xc[0]) {\r\n\r\n        // Following IEEE 754 (2008) 6.3,\r\n        // n - n = +0  but  n - n = -0  when rounding towards -Infinity.\r\n        y.s = ROUNDING_MODE == 3 ? -1 : 1;\r\n        y.c = [y.e = 0];\r\n        return y;\r\n      }\r\n\r\n      // No need to check for Infinity as +x - +y != Infinity && -x - -y != Infinity\r\n      // for finite x and y.\r\n      return normalise(y, xc, ye);\r\n    };\r\n\r\n\r\n    /*\r\n     *   n % 0 =  N\r\n     *   n % N =  N\r\n     *   n % I =  n\r\n     *   0 % n =  0\r\n     *  -0 % n = -0\r\n     *   0 % 0 =  N\r\n     *   0 % N =  N\r\n     *   0 % I =  0\r\n     *   N % n =  N\r\n     *   N % 0 =  N\r\n     *   N % N =  N\r\n     *   N % I =  N\r\n     *   I % n =  N\r\n     *   I % 0 =  N\r\n     *   I % N =  N\r\n     *   I % I =  N\r\n     *\r\n     * Return a new BigNumber whose value is the value of this BigNumber modulo the value of\r\n     * BigNumber(y, b). The result depends on the value of MODULO_MODE.\r\n     */\r\n    P.modulo = P.mod = function (y, b) {\r\n      var q, s,\r\n        x = this;\r\n\r\n      y = new BigNumber(y, b);\r\n\r\n      // Return NaN if x is Infinity or NaN, or y is NaN or zero.\r\n      if (!x.c || !y.s || y.c && !y.c[0]) {\r\n        return new BigNumber(NaN);\r\n\r\n      // Return x if y is Infinity or x is zero.\r\n      } else if (!y.c || x.c && !x.c[0]) {\r\n        return new BigNumber(x);\r\n      }\r\n\r\n      if (MODULO_MODE == 9) {\r\n\r\n        // Euclidian division: q = sign(y) * floor(x / abs(y))\r\n        // r = x - qy    where  0 <= r < abs(y)\r\n        s = y.s;\r\n        y.s = 1;\r\n        q = div(x, y, 0, 3);\r\n        y.s = s;\r\n        q.s *= s;\r\n      } else {\r\n        q = div(x, y, 0, MODULO_MODE);\r\n      }\r\n\r\n      y = x.minus(q.times(y));\r\n\r\n      // To match JavaScript %, ensure sign of zero is sign of dividend.\r\n      if (!y.c[0] && MODULO_MODE == 1) y.s = x.s;\r\n\r\n      return y;\r\n    };\r\n\r\n\r\n    /*\r\n     *  n * 0 = 0\r\n     *  n * N = N\r\n     *  n * I = I\r\n     *  0 * n = 0\r\n     *  0 * 0 = 0\r\n     *  0 * N = N\r\n     *  0 * I = N\r\n     *  N * n = N\r\n     *  N * 0 = N\r\n     *  N * N = N\r\n     *  N * I = N\r\n     *  I * n = I\r\n     *  I * 0 = N\r\n     *  I * N = N\r\n     *  I * I = I\r\n     *\r\n     * Return a new BigNumber whose value is the value of this BigNumber multiplied by the value\r\n     * of BigNumber(y, b).\r\n     */\r\n    P.multipliedBy = P.times = function (y, b) {\r\n      var c, e, i, j, k, m, xcL, xlo, xhi, ycL, ylo, yhi, zc,\r\n        base, sqrtBase,\r\n        x = this,\r\n        xc = x.c,\r\n        yc = (y = new BigNumber(y, b)).c;\r\n\r\n      // Either NaN, \u00B1Infinity or \u00B10?\r\n      if (!xc || !yc || !xc[0] || !yc[0]) {\r\n\r\n        // Return NaN if either is NaN, or one is 0 and the other is Infinity.\r\n        if (!x.s || !y.s || xc && !xc[0] && !yc || yc && !yc[0] && !xc) {\r\n          y.c = y.e = y.s = null;\r\n        } else {\r\n          y.s *= x.s;\r\n\r\n          // Return \u00B1Infinity if either is \u00B1Infinity.\r\n          if (!xc || !yc) {\r\n            y.c = y.e = null;\r\n\r\n          // Return \u00B10 if either is \u00B10.\r\n          } else {\r\n            y.c = [0];\r\n            y.e = 0;\r\n          }\r\n        }\r\n\r\n        return y;\r\n      }\r\n\r\n      e = bitFloor(x.e / LOG_BASE) + bitFloor(y.e / LOG_BASE);\r\n      y.s *= x.s;\r\n      xcL = xc.length;\r\n      ycL = yc.length;\r\n\r\n      // Ensure xc points to longer array and xcL to its length.\r\n      if (xcL < ycL) {\r\n        zc = xc;\r\n        xc = yc;\r\n        yc = zc;\r\n        i = xcL;\r\n        xcL = ycL;\r\n        ycL = i;\r\n      }\r\n\r\n      // Initialise the result array with zeros.\r\n      for (i = xcL + ycL, zc = []; i--; zc.push(0));\r\n\r\n      base = BASE;\r\n      sqrtBase = SQRT_BASE;\r\n\r\n      for (i = ycL; --i >= 0;) {\r\n        c = 0;\r\n        ylo = yc[i] % sqrtBase;\r\n        yhi = yc[i] / sqrtBase | 0;\r\n\r\n        for (k = xcL, j = i + k; j > i;) {\r\n          xlo = xc[--k] % sqrtBase;\r\n          xhi = xc[k] / sqrtBase | 0;\r\n          m = yhi * xlo + xhi * ylo;\r\n          xlo = ylo * xlo + ((m % sqrtBase) * sqrtBase) + zc[j] + c;\r\n          c = (xlo / base | 0) + (m / sqrtBase | 0) + yhi * xhi;\r\n          zc[j--] = xlo % base;\r\n        }\r\n\r\n        zc[j] = c;\r\n      }\r\n\r\n      if (c) {\r\n        ++e;\r\n      } else {\r\n        zc.splice(0, 1);\r\n      }\r\n\r\n      return normalise(y, zc, e);\r\n    };\r\n\r\n\r\n    /*\r\n     * Return a new BigNumber whose value is the value of this BigNumber negated,\r\n     * i.e. multiplied by -1.\r\n     */\r\n    P.negated = function () {\r\n      var x = new BigNumber(this);\r\n      x.s = -x.s || null;\r\n      return x;\r\n    };\r\n\r\n\r\n    /*\r\n     *  n + 0 = n\r\n     *  n + N = N\r\n     *  n + I = I\r\n     *  0 + n = n\r\n     *  0 + 0 = 0\r\n     *  0 + N = N\r\n     *  0 + I = I\r\n     *  N + n = N\r\n     *  N + 0 = N\r\n     *  N + N = N\r\n     *  N + I = N\r\n     *  I + n = I\r\n     *  I + 0 = I\r\n     *  I + N = N\r\n     *  I + I = I\r\n     *\r\n     * Return a new BigNumber whose value is the value of this BigNumber plus the value of\r\n     * BigNumber(y, b).\r\n     */\r\n    P.plus = function (y, b) {\r\n      var t,\r\n        x = this,\r\n        a = x.s;\r\n\r\n      y = new BigNumber(y, b);\r\n      b = y.s;\r\n\r\n      // Either NaN?\r\n      if (!a || !b) return new BigNumber(NaN);\r\n\r\n      // Signs differ?\r\n       if (a != b) {\r\n        y.s = -b;\r\n        return x.minus(y);\r\n      }\r\n\r\n      var xe = x.e / LOG_BASE,\r\n        ye = y.e / LOG_BASE,\r\n        xc = x.c,\r\n        yc = y.c;\r\n\r\n      if (!xe || !ye) {\r\n\r\n        // Return \u00B1Infinity if either \u00B1Infinity.\r\n        if (!xc || !yc) return new BigNumber(a / 0);\r\n\r\n        // Either zero?\r\n        // Return y if y is non-zero, x if x is non-zero, or zero if both are zero.\r\n        if (!xc[0] || !yc[0]) return yc[0] ? y : new BigNumber(xc[0] ? x : a * 0);\r\n      }\r\n\r\n      xe = bitFloor(xe);\r\n      ye = bitFloor(ye);\r\n      xc = xc.slice();\r\n\r\n      // Prepend zeros to equalise exponents. Faster to use reverse then do unshifts.\r\n      if (a = xe - ye) {\r\n        if (a > 0) {\r\n          ye = xe;\r\n          t = yc;\r\n        } else {\r\n          a = -a;\r\n          t = xc;\r\n        }\r\n\r\n        t.reverse();\r\n        for (; a--; t.push(0));\r\n        t.reverse();\r\n      }\r\n\r\n      a = xc.length;\r\n      b = yc.length;\r\n\r\n      // Point xc to the longer array, and b to the shorter length.\r\n      if (a - b < 0) {\r\n        t = yc;\r\n        yc = xc;\r\n        xc = t;\r\n        b = a;\r\n      }\r\n\r\n      // Only start adding at yc.length - 1 as the further digits of xc can be ignored.\r\n      for (a = 0; b;) {\r\n        a = (xc[--b] = xc[b] + yc[b] + a) / BASE | 0;\r\n        xc[b] = BASE === xc[b] ? 0 : xc[b] % BASE;\r\n      }\r\n\r\n      if (a) {\r\n        xc = [a].concat(xc);\r\n        ++ye;\r\n      }\r\n\r\n      // No need to check for zero, as +x + +y != 0 && -x + -y != 0\r\n      // ye = MAX_EXP + 1 possible\r\n      return normalise(y, xc, ye);\r\n    };\r\n\r\n\r\n    /*\r\n     * If sd is undefined or null or true or false, return the number of significant digits of\r\n     * the value of this BigNumber, or null if the value of this BigNumber is \u00B1Infinity or NaN.\r\n     * If sd is true include integer-part trailing zeros in the count.\r\n     *\r\n     * Otherwise, if sd is a number, return a new BigNumber whose value is the value of this\r\n     * BigNumber rounded to a maximum of sd significant digits using rounding mode rm, or\r\n     * ROUNDING_MODE if rm is omitted.\r\n     *\r\n     * sd {number|boolean} number: significant digits: integer, 1 to MAX inclusive.\r\n     *                     boolean: whether to count integer-part trailing zeros: true or false.\r\n     * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n     *\r\n     * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {sd|rm}'\r\n     */\r\n    P.precision = P.sd = function (sd, rm) {\r\n      var c, n, v,\r\n        x = this;\r\n\r\n      if (sd != null && sd !== !!sd) {\r\n        intCheck(sd, 1, MAX);\r\n        if (rm == null) rm = ROUNDING_MODE;\r\n        else intCheck(rm, 0, 8);\r\n\r\n        return round(new BigNumber(x), sd, rm);\r\n      }\r\n\r\n      if (!(c = x.c)) return null;\r\n      v = c.length - 1;\r\n      n = v * LOG_BASE + 1;\r\n\r\n      if (v = c[v]) {\r\n\r\n        // Subtract the number of trailing zeros of the last element.\r\n        for (; v % 10 == 0; v /= 10, n--);\r\n\r\n        // Add the number of digits of the first element.\r\n        for (v = c[0]; v >= 10; v /= 10, n++);\r\n      }\r\n\r\n      if (sd && x.e + 1 > n) n = x.e + 1;\r\n\r\n      return n;\r\n    };\r\n\r\n\r\n    /*\r\n     * Return a new BigNumber whose value is the value of this BigNumber shifted by k places\r\n     * (powers of 10). Shift to the right if n > 0, and to the left if n < 0.\r\n     *\r\n     * k {number} Integer, -MAX_SAFE_INTEGER to MAX_SAFE_INTEGER inclusive.\r\n     *\r\n     * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {k}'\r\n     */\r\n    P.shiftedBy = function (k) {\r\n      intCheck(k, -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER);\r\n      return this.times('1e' + k);\r\n    };\r\n\r\n\r\n    /*\r\n     *  sqrt(-n) =  N\r\n     *  sqrt(N) =  N\r\n     *  sqrt(-I) =  N\r\n     *  sqrt(I) =  I\r\n     *  sqrt(0) =  0\r\n     *  sqrt(-0) = -0\r\n     *\r\n     * Return a new BigNumber whose value is the square root of the value of this BigNumber,\r\n     * rounded according to DECIMAL_PLACES and ROUNDING_MODE.\r\n     */\r\n    P.squareRoot = P.sqrt = function () {\r\n      var m, n, r, rep, t,\r\n        x = this,\r\n        c = x.c,\r\n        s = x.s,\r\n        e = x.e,\r\n        dp = DECIMAL_PLACES + 4,\r\n        half = new BigNumber('0.5');\r\n\r\n      // Negative/NaN/Infinity/zero?\r\n      if (s !== 1 || !c || !c[0]) {\r\n        return new BigNumber(!s || s < 0 && (!c || c[0]) ? NaN : c ? x : 1 / 0);\r\n      }\r\n\r\n      // Initial estimate.\r\n      s = Math.sqrt(+valueOf(x));\r\n\r\n      // Math.sqrt underflow/overflow?\r\n      // Pass x to Math.sqrt as integer, then adjust the exponent of the result.\r\n      if (s == 0 || s == 1 / 0) {\r\n        n = coeffToString(c);\r\n        if ((n.length + e) % 2 == 0) n += '0';\r\n        s = Math.sqrt(+n);\r\n        e = bitFloor((e + 1) / 2) - (e < 0 || e % 2);\r\n\r\n        if (s == 1 / 0) {\r\n          n = '5e' + e;\r\n        } else {\r\n          n = s.toExponential();\r\n          n = n.slice(0, n.indexOf('e') + 1) + e;\r\n        }\r\n\r\n        r = new BigNumber(n);\r\n      } else {\r\n        r = new BigNumber(s + '');\r\n      }\r\n\r\n      // Check for zero.\r\n      // r could be zero if MIN_EXP is changed after the this value was created.\r\n      // This would cause a division by zero (x/t) and hence Infinity below, which would cause\r\n      // coeffToString to throw.\r\n      if (r.c[0]) {\r\n        e = r.e;\r\n        s = e + dp;\r\n        if (s < 3) s = 0;\r\n\r\n        // Newton-Raphson iteration.\r\n        for (; ;) {\r\n          t = r;\r\n          r = half.times(t.plus(div(x, t, dp, 1)));\r\n\r\n          if (coeffToString(t.c).slice(0, s) === (n = coeffToString(r.c)).slice(0, s)) {\r\n\r\n            // The exponent of r may here be one less than the final result exponent,\r\n            // e.g 0.0009999 (e-4) --> 0.001 (e-3), so adjust s so the rounding digits\r\n            // are indexed correctly.\r\n            if (r.e < e) --s;\r\n            n = n.slice(s - 3, s + 1);\r\n\r\n            // The 4th rounding digit may be in error by -1 so if the 4 rounding digits\r\n            // are 9999 or 4999 (i.e. approaching a rounding boundary) continue the\r\n            // iteration.\r\n            if (n == '9999' || !rep && n == '4999') {\r\n\r\n              // On the first iteration only, check to see if rounding up gives the\r\n              // exact result as the nines may infinitely repeat.\r\n              if (!rep) {\r\n                round(t, t.e + DECIMAL_PLACES + 2, 0);\r\n\r\n                if (t.times(t).eq(x)) {\r\n                  r = t;\r\n                  break;\r\n                }\r\n              }\r\n\r\n              dp += 4;\r\n              s += 4;\r\n              rep = 1;\r\n            } else {\r\n\r\n              // If rounding digits are null, 0{0,4} or 50{0,3}, check for exact\r\n              // result. If not, then there are further digits and m will be truthy.\r\n              if (!+n || !+n.slice(1) && n.charAt(0) == '5') {\r\n\r\n                // Truncate to the first rounding digit.\r\n                round(r, r.e + DECIMAL_PLACES + 2, 1);\r\n                m = !r.times(r).eq(x);\r\n              }\r\n\r\n              break;\r\n            }\r\n          }\r\n        }\r\n      }\r\n\r\n      return round(r, r.e + DECIMAL_PLACES + 1, ROUNDING_MODE, m);\r\n    };\r\n\r\n\r\n    /*\r\n     * Return a string representing the value of this BigNumber in exponential notation and\r\n     * rounded using ROUNDING_MODE to dp fixed decimal places.\r\n     *\r\n     * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n     * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n     *\r\n     * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n     */\r\n    P.toExponential = function (dp, rm) {\r\n      if (dp != null) {\r\n        intCheck(dp, 0, MAX);\r\n        dp++;\r\n      }\r\n      return format(this, dp, rm, 1);\r\n    };\r\n\r\n\r\n    /*\r\n     * Return a string representing the value of this BigNumber in fixed-point notation rounding\r\n     * to dp fixed decimal places using rounding mode rm, or ROUNDING_MODE if rm is omitted.\r\n     *\r\n     * Note: as with JavaScript's number type, (-0).toFixed(0) is '0',\r\n     * but e.g. (-0.00001).toFixed(0) is '-0'.\r\n     *\r\n     * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n     * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n     *\r\n     * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n     */\r\n    P.toFixed = function (dp, rm) {\r\n      if (dp != null) {\r\n        intCheck(dp, 0, MAX);\r\n        dp = dp + this.e + 1;\r\n      }\r\n      return format(this, dp, rm);\r\n    };\r\n\r\n\r\n    /*\r\n     * Return a string representing the value of this BigNumber in fixed-point notation rounded\r\n     * using rm or ROUNDING_MODE to dp decimal places, and formatted according to the properties\r\n     * of the format or FORMAT object (see BigNumber.set).\r\n     *\r\n     * The formatting object may contain some or all of the properties shown below.\r\n     *\r\n     * FORMAT = {\r\n     *   prefix: '',\r\n     *   groupSize: 3,\r\n     *   secondaryGroupSize: 0,\r\n     *   groupSeparator: ',',\r\n     *   decimalSeparator: '.',\r\n     *   fractionGroupSize: 0,\r\n     *   fractionGroupSeparator: '\\xA0',      // non-breaking space\r\n     *   suffix: ''\r\n     * };\r\n     *\r\n     * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n     * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n     * [format] {object} Formatting options. See FORMAT pbject above.\r\n     *\r\n     * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n     * '[BigNumber Error] Argument not an object: {format}'\r\n     */\r\n    P.toFormat = function (dp, rm, format) {\r\n      var str,\r\n        x = this;\r\n\r\n      if (format == null) {\r\n        if (dp != null && rm && typeof rm == 'object') {\r\n          format = rm;\r\n          rm = null;\r\n        } else if (dp && typeof dp == 'object') {\r\n          format = dp;\r\n          dp = rm = null;\r\n        } else {\r\n          format = FORMAT;\r\n        }\r\n      } else if (typeof format != 'object') {\r\n        throw Error\r\n          (bignumberError + 'Argument not an object: ' + format);\r\n      }\r\n\r\n      str = x.toFixed(dp, rm);\r\n\r\n      if (x.c) {\r\n        var i,\r\n          arr = str.split('.'),\r\n          g1 = +format.groupSize,\r\n          g2 = +format.secondaryGroupSize,\r\n          groupSeparator = format.groupSeparator || '',\r\n          intPart = arr[0],\r\n          fractionPart = arr[1],\r\n          isNeg = x.s < 0,\r\n          intDigits = isNeg ? intPart.slice(1) : intPart,\r\n          len = intDigits.length;\r\n\r\n        if (g2) {\r\n          i = g1;\r\n          g1 = g2;\r\n          g2 = i;\r\n          len -= i;\r\n        }\r\n\r\n        if (g1 > 0 && len > 0) {\r\n          i = len % g1 || g1;\r\n          intPart = intDigits.substr(0, i);\r\n          for (; i < len; i += g1) intPart += groupSeparator + intDigits.substr(i, g1);\r\n          if (g2 > 0) intPart += groupSeparator + intDigits.slice(i);\r\n          if (isNeg) intPart = '-' + intPart;\r\n        }\r\n\r\n        str = fractionPart\r\n         ? intPart + (format.decimalSeparator || '') + ((g2 = +format.fractionGroupSize)\r\n          ? fractionPart.replace(new RegExp('\\\\d{' + g2 + '}\\\\B', 'g'),\r\n           '$&' + (format.fractionGroupSeparator || ''))\r\n          : fractionPart)\r\n         : intPart;\r\n      }\r\n\r\n      return (format.prefix || '') + str + (format.suffix || '');\r\n    };\r\n\r\n\r\n    /*\r\n     * Return an array of two BigNumbers representing the value of this BigNumber as a simple\r\n     * fraction with an integer numerator and an integer denominator.\r\n     * The denominator will be a positive non-zero value less than or equal to the specified\r\n     * maximum denominator. If a maximum denominator is not specified, the denominator will be\r\n     * the lowest value necessary to represent the number exactly.\r\n     *\r\n     * [md] {number|string|BigNumber} Integer >= 1, or Infinity. The maximum denominator.\r\n     *\r\n     * '[BigNumber Error] Argument {not an integer|out of range} : {md}'\r\n     */\r\n    P.toFraction = function (md) {\r\n      var d, d0, d1, d2, e, exp, n, n0, n1, q, r, s,\r\n        x = this,\r\n        xc = x.c;\r\n\r\n      if (md != null) {\r\n        n = new BigNumber(md);\r\n\r\n        // Throw if md is less than one or is not an integer, unless it is Infinity.\r\n        if (!n.isInteger() && (n.c || n.s !== 1) || n.lt(ONE)) {\r\n          throw Error\r\n            (bignumberError + 'Argument ' +\r\n              (n.isInteger() ? 'out of range: ' : 'not an integer: ') + valueOf(n));\r\n        }\r\n      }\r\n\r\n      if (!xc) return new BigNumber(x);\r\n\r\n      d = new BigNumber(ONE);\r\n      n1 = d0 = new BigNumber(ONE);\r\n      d1 = n0 = new BigNumber(ONE);\r\n      s = coeffToString(xc);\r\n\r\n      // Determine initial denominator.\r\n      // d is a power of 10 and the minimum max denominator that specifies the value exactly.\r\n      e = d.e = s.length - x.e - 1;\r\n      d.c[0] = POWS_TEN[(exp = e % LOG_BASE) < 0 ? LOG_BASE + exp : exp];\r\n      md = !md || n.comparedTo(d) > 0 ? (e > 0 ? d : n1) : n;\r\n\r\n      exp = MAX_EXP;\r\n      MAX_EXP = 1 / 0;\r\n      n = new BigNumber(s);\r\n\r\n      // n0 = d1 = 0\r\n      n0.c[0] = 0;\r\n\r\n      for (; ;)  {\r\n        q = div(n, d, 0, 1);\r\n        d2 = d0.plus(q.times(d1));\r\n        if (d2.comparedTo(md) == 1) break;\r\n        d0 = d1;\r\n        d1 = d2;\r\n        n1 = n0.plus(q.times(d2 = n1));\r\n        n0 = d2;\r\n        d = n.minus(q.times(d2 = d));\r\n        n = d2;\r\n      }\r\n\r\n      d2 = div(md.minus(d0), d1, 0, 1);\r\n      n0 = n0.plus(d2.times(n1));\r\n      d0 = d0.plus(d2.times(d1));\r\n      n0.s = n1.s = x.s;\r\n      e = e * 2;\r\n\r\n      // Determine which fraction is closer to x, n0/d0 or n1/d1\r\n      r = div(n1, d1, e, ROUNDING_MODE).minus(x).abs().comparedTo(\r\n          div(n0, d0, e, ROUNDING_MODE).minus(x).abs()) < 1 ? [n1, d1] : [n0, d0];\r\n\r\n      MAX_EXP = exp;\r\n\r\n      return r;\r\n    };\r\n\r\n\r\n    /*\r\n     * Return the value of this BigNumber converted to a number primitive.\r\n     */\r\n    P.toNumber = function () {\r\n      return +valueOf(this);\r\n    };\r\n\r\n\r\n    /*\r\n     * Return a string representing the value of this BigNumber rounded to sd significant digits\r\n     * using rounding mode rm or ROUNDING_MODE. If sd is less than the number of digits\r\n     * necessary to represent the integer part of the value in fixed-point notation, then use\r\n     * exponential notation.\r\n     *\r\n     * [sd] {number} Significant digits. Integer, 1 to MAX inclusive.\r\n     * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n     *\r\n     * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {sd|rm}'\r\n     */\r\n    P.toPrecision = function (sd, rm) {\r\n      if (sd != null) intCheck(sd, 1, MAX);\r\n      return format(this, sd, rm, 2);\r\n    };\r\n\r\n\r\n    /*\r\n     * Return a string representing the value of this BigNumber in base b, or base 10 if b is\r\n     * omitted. If a base is specified, including base 10, round according to DECIMAL_PLACES and\r\n     * ROUNDING_MODE. If a base is not specified, and this BigNumber has a positive exponent\r\n     * that is equal to or greater than TO_EXP_POS, or a negative exponent equal to or less than\r\n     * TO_EXP_NEG, return exponential notation.\r\n     *\r\n     * [b] {number} Integer, 2 to ALPHABET.length inclusive.\r\n     *\r\n     * '[BigNumber Error] Base {not a primitive number|not an integer|out of range}: {b}'\r\n     */\r\n    P.toString = function (b) {\r\n      var str,\r\n        n = this,\r\n        s = n.s,\r\n        e = n.e;\r\n\r\n      // Infinity or NaN?\r\n      if (e === null) {\r\n        if (s) {\r\n          str = 'Infinity';\r\n          if (s < 0) str = '-' + str;\r\n        } else {\r\n          str = 'NaN';\r\n        }\r\n      } else {\r\n        if (b == null) {\r\n          str = e <= TO_EXP_NEG || e >= TO_EXP_POS\r\n           ? toExponential(coeffToString(n.c), e)\r\n           : toFixedPoint(coeffToString(n.c), e, '0');\r\n        } else if (b === 10 && alphabetHasNormalDecimalDigits) {\r\n          n = round(new BigNumber(n), DECIMAL_PLACES + e + 1, ROUNDING_MODE);\r\n          str = toFixedPoint(coeffToString(n.c), n.e, '0');\r\n        } else {\r\n          intCheck(b, 2, ALPHABET.length, 'Base');\r\n          str = convertBase(toFixedPoint(coeffToString(n.c), e, '0'), 10, b, s, true);\r\n        }\r\n\r\n        if (s < 0 && n.c[0]) str = '-' + str;\r\n      }\r\n\r\n      return str;\r\n    };\r\n\r\n\r\n    /*\r\n     * Return as toString, but do not accept a base argument, and include the minus sign for\r\n     * negative zero.\r\n     */\r\n    P.valueOf = P.toJSON = function () {\r\n      return valueOf(this);\r\n    };\r\n\r\n\r\n    P._isBigNumber = true;\r\n\r\n    if (configObject != null) BigNumber.set(configObject);\r\n\r\n    return BigNumber;\r\n  }\r\n\r\n\r\n  // PRIVATE HELPER FUNCTIONS\r\n\r\n  // These functions don't need access to variables,\r\n  // e.g. DECIMAL_PLACES, in the scope of the `clone` function above.\r\n\r\n\r\n  function bitFloor(n) {\r\n    var i = n | 0;\r\n    return n > 0 || n === i ? i : i - 1;\r\n  }\r\n\r\n\r\n  // Return a coefficient array as a string of base 10 digits.\r\n  function coeffToString(a) {\r\n    var s, z,\r\n      i = 1,\r\n      j = a.length,\r\n      r = a[0] + '';\r\n\r\n    for (; i < j;) {\r\n      s = a[i++] + '';\r\n      z = LOG_BASE - s.length;\r\n      for (; z--; s = '0' + s);\r\n      r += s;\r\n    }\r\n\r\n    // Determine trailing zeros.\r\n    for (j = r.length; r.charCodeAt(--j) === 48;);\r\n\r\n    return r.slice(0, j + 1 || 1);\r\n  }\r\n\r\n\r\n  // Compare the value of BigNumbers x and y.\r\n  function compare(x, y) {\r\n    var a, b,\r\n      xc = x.c,\r\n      yc = y.c,\r\n      i = x.s,\r\n      j = y.s,\r\n      k = x.e,\r\n      l = y.e;\r\n\r\n    // Either NaN?\r\n    if (!i || !j) return null;\r\n\r\n    a = xc && !xc[0];\r\n    b = yc && !yc[0];\r\n\r\n    // Either zero?\r\n    if (a || b) return a ? b ? 0 : -j : i;\r\n\r\n    // Signs differ?\r\n    if (i != j) return i;\r\n\r\n    a = i < 0;\r\n    b = k == l;\r\n\r\n    // Either Infinity?\r\n    if (!xc || !yc) return b ? 0 : !xc ^ a ? 1 : -1;\r\n\r\n    // Compare exponents.\r\n    if (!b) return k > l ^ a ? 1 : -1;\r\n\r\n    j = (k = xc.length) < (l = yc.length) ? k : l;\r\n\r\n    // Compare digit by digit.\r\n    for (i = 0; i < j; i++) if (xc[i] != yc[i]) return xc[i] > yc[i] ^ a ? 1 : -1;\r\n\r\n    // Compare lengths.\r\n    return k == l ? 0 : k > l ^ a ? 1 : -1;\r\n  }\r\n\r\n\r\n  /*\r\n   * Check that n is a primitive number, an integer, and in range, otherwise throw.\r\n   */\r\n  function intCheck(n, min, max, name) {\r\n    if (n < min || n > max || n !== mathfloor(n)) {\r\n      throw Error\r\n       (bignumberError + (name || 'Argument') + (typeof n == 'number'\r\n         ? n < min || n > max ? ' out of range: ' : ' not an integer: '\r\n         : ' not a primitive number: ') + String(n));\r\n    }\r\n  }\r\n\r\n\r\n  // Assumes finite n.\r\n  function isOdd(n) {\r\n    var k = n.c.length - 1;\r\n    return bitFloor(n.e / LOG_BASE) == k && n.c[k] % 2 != 0;\r\n  }\r\n\r\n\r\n  function toExponential(str, e) {\r\n    return (str.length > 1 ? str.charAt(0) + '.' + str.slice(1) : str) +\r\n     (e < 0 ? 'e' : 'e+') + e;\r\n  }\r\n\r\n\r\n  function toFixedPoint(str, e, z) {\r\n    var len, zs;\r\n\r\n    // Negative exponent?\r\n    if (e < 0) {\r\n\r\n      // Prepend zeros.\r\n      for (zs = z + '.'; ++e; zs += z);\r\n      str = zs + str;\r\n\r\n    // Positive exponent\r\n    } else {\r\n      len = str.length;\r\n\r\n      // Append zeros.\r\n      if (++e > len) {\r\n        for (zs = z, e -= len; --e; zs += z);\r\n        str += zs;\r\n      } else if (e < len) {\r\n        str = str.slice(0, e) + '.' + str.slice(e);\r\n      }\r\n    }\r\n\r\n    return str;\r\n  }\r\n\r\n\r\n  // EXPORT\r\n\r\n\r\n  BigNumber = clone();\r\n  BigNumber['default'] = BigNumber.BigNumber = BigNumber;\r\n\r\n  // AMD.\r\n  if (typeof define == 'function' && define.amd) {\r\n    define(function () { return BigNumber; });\r\n\r\n  // Node.js and other environments that support module.exports.\r\n  } else if (typeof module != 'undefined' && module.exports) {\r\n    module.exports = BigNumber;\r\n\r\n  // Browser.\r\n  } else {\r\n    if (!globalObject) {\r\n      globalObject = typeof self != 'undefined' && self ? self : window;\r\n    }\r\n\r\n    globalObject.BigNumber = BigNumber;\r\n  }\r\n})(this);\r\n", "var BigNumber = require('bignumber.js');\n\n/*\n    json2.js\n    2013-05-26\n\n    Public Domain.\n\n    NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n\n    See http://www.JSON.org/js.html\n\n\n    This code should be minified before deployment.\n    See http://javascript.crockford.com/jsmin.html\n\n    USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO\n    NOT CONTROL.\n\n\n    This file creates a global JSON object containing two methods: stringify\n    and parse.\n\n        JSON.stringify(value, replacer, space)\n            value       any JavaScript value, usually an object or array.\n\n            replacer    an optional parameter that determines how object\n                        values are stringified for objects. It can be a\n                        function or an array of strings.\n\n            space       an optional parameter that specifies the indentation\n                        of nested structures. If it is omitted, the text will\n                        be packed without extra whitespace. If it is a number,\n                        it will specify the number of spaces to indent at each\n                        level. If it is a string (such as '\\t' or '&nbsp;'),\n                        it contains the characters used to indent at each level.\n\n            This method produces a JSON text from a JavaScript value.\n\n            When an object value is found, if the object contains a toJSON\n            method, its toJSON method will be called and the result will be\n            stringified. A toJSON method does not serialize: it returns the\n            value represented by the name/value pair that should be serialized,\n            or undefined if nothing should be serialized. The toJSON method\n            will be passed the key associated with the value, and this will be\n            bound to the value\n\n            For example, this would serialize Dates as ISO strings.\n\n                Date.prototype.toJSON = function (key) {\n                    function f(n) {\n                        // Format integers to have at least two digits.\n                        return n < 10 ? '0' + n : n;\n                    }\n\n                    return this.getUTCFullYear()   + '-' +\n                         f(this.getUTCMonth() + 1) + '-' +\n                         f(this.getUTCDate())      + 'T' +\n                         f(this.getUTCHours())     + ':' +\n                         f(this.getUTCMinutes())   + ':' +\n                         f(this.getUTCSeconds())   + 'Z';\n                };\n\n            You can provide an optional replacer method. It will be passed the\n            key and value of each member, with this bound to the containing\n            object. The value that is returned from your method will be\n            serialized. If your method returns undefined, then the member will\n            be excluded from the serialization.\n\n            If the replacer parameter is an array of strings, then it will be\n            used to select the members to be serialized. It filters the results\n            such that only members with keys listed in the replacer array are\n            stringified.\n\n            Values that do not have JSON representations, such as undefined or\n            functions, will not be serialized. Such values in objects will be\n            dropped; in arrays they will be replaced with null. You can use\n            a replacer function to replace those with JSON values.\n            JSON.stringify(undefined) returns undefined.\n\n            The optional space parameter produces a stringification of the\n            value that is filled with line breaks and indentation to make it\n            easier to read.\n\n            If the space parameter is a non-empty string, then that string will\n            be used for indentation. If the space parameter is a number, then\n            the indentation will be that many spaces.\n\n            Example:\n\n            text = JSON.stringify(['e', {pluribus: 'unum'}]);\n            // text is '[\"e\",{\"pluribus\":\"unum\"}]'\n\n\n            text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\\t');\n            // text is '[\\n\\t\"e\",\\n\\t{\\n\\t\\t\"pluribus\": \"unum\"\\n\\t}\\n]'\n\n            text = JSON.stringify([new Date()], function (key, value) {\n                return this[key] instanceof Date ?\n                    'Date(' + this[key] + ')' : value;\n            });\n            // text is '[\"Date(---current time---)\"]'\n\n\n        JSON.parse(text, reviver)\n            This method parses a JSON text to produce an object or array.\n            It can throw a SyntaxError exception.\n\n            The optional reviver parameter is a function that can filter and\n            transform the results. It receives each of the keys and values,\n            and its return value is used instead of the original value.\n            If it returns what it received, then the structure is not modified.\n            If it returns undefined then the member is deleted.\n\n            Example:\n\n            // Parse the text. Values that look like ISO date strings will\n            // be converted to Date objects.\n\n            myData = JSON.parse(text, function (key, value) {\n                var a;\n                if (typeof value === 'string') {\n                    a =\n/^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2}(?:\\.\\d*)?)Z$/.exec(value);\n                    if (a) {\n                        return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],\n                            +a[5], +a[6]));\n                    }\n                }\n                return value;\n            });\n\n            myData = JSON.parse('[\"Date(09/09/2001)\"]', function (key, value) {\n                var d;\n                if (typeof value === 'string' &&\n                        value.slice(0, 5) === 'Date(' &&\n                        value.slice(-1) === ')') {\n                    d = new Date(value.slice(5, -1));\n                    if (d) {\n                        return d;\n                    }\n                }\n                return value;\n            });\n\n\n    This is a reference implementation. You are free to copy, modify, or\n    redistribute.\n*/\n\n/*jslint evil: true, regexp: true */\n\n/*members \"\", \"\\b\", \"\\t\", \"\\n\", \"\\f\", \"\\r\", \"\\\"\", JSON, \"\\\\\", apply,\n    call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,\n    getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,\n    lastIndex, length, parse, prototype, push, replace, slice, stringify,\n    test, toJSON, toString, valueOf\n*/\n\n\n// Create a JSON object only if one does not already exist. We create the\n// methods in a closure to avoid creating global variables.\n\nvar JSON = module.exports;\n\n(function () {\n    'use strict';\n\n    function f(n) {\n        // Format integers to have at least two digits.\n        return n < 10 ? '0' + n : n;\n    }\n\n    var cx = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n        escapable = /[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n        gap,\n        indent,\n        meta = {    // table of character substitutions\n            '\\b': '\\\\b',\n            '\\t': '\\\\t',\n            '\\n': '\\\\n',\n            '\\f': '\\\\f',\n            '\\r': '\\\\r',\n            '\"' : '\\\\\"',\n            '\\\\': '\\\\\\\\'\n        },\n        rep;\n\n\n    function quote(string) {\n\n// If the string contains no control characters, no quote characters, and no\n// backslash characters, then we can safely slap some quotes around it.\n// Otherwise we must also replace the offending characters with safe escape\n// sequences.\n\n        escapable.lastIndex = 0;\n        return escapable.test(string) ? '\"' + string.replace(escapable, function (a) {\n            var c = meta[a];\n            return typeof c === 'string'\n                ? c\n                : '\\\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n        }) + '\"' : '\"' + string + '\"';\n    }\n\n\n    function str(key, holder) {\n\n// Produce a string from holder[key].\n\n        var i,          // The loop counter.\n            k,          // The member key.\n            v,          // The member value.\n            length,\n            mind = gap,\n            partial,\n            value = holder[key],\n            isBigNumber = value != null && (value instanceof BigNumber || BigNumber.isBigNumber(value));\n\n// If the value has a toJSON method, call it to obtain a replacement value.\n\n        if (value && typeof value === 'object' &&\n                typeof value.toJSON === 'function') {\n            value = value.toJSON(key);\n        }\n\n// If we were called with a replacer function, then call the replacer to\n// obtain a replacement value.\n\n        if (typeof rep === 'function') {\n            value = rep.call(holder, key, value);\n        }\n\n// What happens next depends on the value's type.\n\n        switch (typeof value) {\n        case 'string':\n            if (isBigNumber) {\n                return value;\n            } else {\n                return quote(value);\n            }\n\n        case 'number':\n\n// JSON numbers must be finite. Encode non-finite numbers as null.\n\n            return isFinite(value) ? String(value) : 'null';\n\n        case 'boolean':\n        case 'null':\n        case 'bigint':\n\n// If the value is a boolean or null, convert it to a string. Note:\n// typeof null does not produce 'null'. The case is included here in\n// the remote chance that this gets fixed someday.\n\n            return String(value);\n\n// If the type is 'object', we might be dealing with an object or an array or\n// null.\n\n        case 'object':\n\n// Due to a specification blunder in ECMAScript, typeof null is 'object',\n// so watch out for that case.\n\n            if (!value) {\n                return 'null';\n            }\n\n// Make an array to hold the partial results of stringifying this object value.\n\n            gap += indent;\n            partial = [];\n\n// Is the value an array?\n\n            if (Object.prototype.toString.apply(value) === '[object Array]') {\n\n// The value is an array. Stringify every element. Use null as a placeholder\n// for non-JSON values.\n\n                length = value.length;\n                for (i = 0; i < length; i += 1) {\n                    partial[i] = str(i, value) || 'null';\n                }\n\n// Join all of the elements together, separated with commas, and wrap them in\n// brackets.\n\n                v = partial.length === 0\n                    ? '[]'\n                    : gap\n                    ? '[\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + ']'\n                    : '[' + partial.join(',') + ']';\n                gap = mind;\n                return v;\n            }\n\n// If the replacer is an array, use it to select the members to be stringified.\n\n            if (rep && typeof rep === 'object') {\n                length = rep.length;\n                for (i = 0; i < length; i += 1) {\n                    if (typeof rep[i] === 'string') {\n                        k = rep[i];\n                        v = str(k, value);\n                        if (v) {\n                            partial.push(quote(k) + (gap ? ': ' : ':') + v);\n                        }\n                    }\n                }\n            } else {\n\n// Otherwise, iterate through all of the keys in the object.\n\n                Object.keys(value).forEach(function(k) {\n                    var v = str(k, value);\n                    if (v) {\n                        partial.push(quote(k) + (gap ? ': ' : ':') + v);\n                    }\n                });\n            }\n\n// Join all of the member texts together, separated with commas,\n// and wrap them in braces.\n\n            v = partial.length === 0\n                ? '{}'\n                : gap\n                ? '{\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + '}'\n                : '{' + partial.join(',') + '}';\n            gap = mind;\n            return v;\n        }\n    }\n\n// If the JSON object does not yet have a stringify method, give it one.\n\n    if (typeof JSON.stringify !== 'function') {\n        JSON.stringify = function (value, replacer, space) {\n\n// The stringify method takes a value and an optional replacer, and an optional\n// space parameter, and returns a JSON text. The replacer can be a function\n// that can replace values, or an array of strings that will select the keys.\n// A default replacer method can be provided. Use of the space parameter can\n// produce text that is more easily readable.\n\n            var i;\n            gap = '';\n            indent = '';\n\n// If the space parameter is a number, make an indent string containing that\n// many spaces.\n\n            if (typeof space === 'number') {\n                for (i = 0; i < space; i += 1) {\n                    indent += ' ';\n                }\n\n// If the space parameter is a string, it will be used as the indent string.\n\n            } else if (typeof space === 'string') {\n                indent = space;\n            }\n\n// If there is a replacer, it must be a function or an array.\n// Otherwise, throw an error.\n\n            rep = replacer;\n            if (replacer && typeof replacer !== 'function' &&\n                    (typeof replacer !== 'object' ||\n                    typeof replacer.length !== 'number')) {\n                throw new Error('JSON.stringify');\n            }\n\n// Make a fake root object containing our value under the key of ''.\n// Return the result of stringifying the value.\n\n            return str('', {'': value});\n        };\n    }\n}());\n", "var BigNumber = null;\n\n// regexpxs extracted from\n// (c) BSD-3-Clause\n// https://github.com/fastify/secure-json-parse/graphs/contributors and https://github.com/hapijs/bourne/graphs/contributors\n\nconst suspectProtoRx = /(?:_|\\\\u005[Ff])(?:_|\\\\u005[Ff])(?:p|\\\\u0070)(?:r|\\\\u0072)(?:o|\\\\u006[Ff])(?:t|\\\\u0074)(?:o|\\\\u006[Ff])(?:_|\\\\u005[Ff])(?:_|\\\\u005[Ff])/;\nconst suspectConstructorRx = /(?:c|\\\\u0063)(?:o|\\\\u006[Ff])(?:n|\\\\u006[Ee])(?:s|\\\\u0073)(?:t|\\\\u0074)(?:r|\\\\u0072)(?:u|\\\\u0075)(?:c|\\\\u0063)(?:t|\\\\u0074)(?:o|\\\\u006[Ff])(?:r|\\\\u0072)/;\n\n/*\n    json_parse.js\n    2012-06-20\n\n    Public Domain.\n\n    NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n\n    This file creates a json_parse function.\n    During create you can (optionally) specify some behavioural switches\n\n        require('json-bigint')(options)\n\n            The optional options parameter holds switches that drive certain\n            aspects of the parsing process:\n            * options.strict = true will warn about duplicate-key usage in the json.\n              The default (strict = false) will silently ignore those and overwrite\n              values for keys that are in duplicate use.\n\n    The resulting function follows this signature:\n        json_parse(text, reviver)\n            This method parses a JSON text to produce an object or array.\n            It can throw a SyntaxError exception.\n\n            The optional reviver parameter is a function that can filter and\n            transform the results. It receives each of the keys and values,\n            and its return value is used instead of the original value.\n            If it returns what it received, then the structure is not modified.\n            If it returns undefined then the member is deleted.\n\n            Example:\n\n            // Parse the text. Values that look like ISO date strings will\n            // be converted to Date objects.\n\n            myData = json_parse(text, function (key, value) {\n                var a;\n                if (typeof value === 'string') {\n                    a =\n/^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2}(?:\\.\\d*)?)Z$/.exec(value);\n                    if (a) {\n                        return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],\n                            +a[5], +a[6]));\n                    }\n                }\n                return value;\n            });\n\n    This is a reference implementation. You are free to copy, modify, or\n    redistribute.\n\n    This code should be minified before deployment.\n    See http://javascript.crockford.com/jsmin.html\n\n    USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO\n    NOT CONTROL.\n*/\n\n/*members \"\", \"\\\"\", \"\\/\", \"\\\\\", at, b, call, charAt, f, fromCharCode,\n    hasOwnProperty, message, n, name, prototype, push, r, t, text\n*/\n\nvar json_parse = function (options) {\n  'use strict';\n\n  // This is a function that can parse a JSON text, producing a JavaScript\n  // data structure. It is a simple, recursive descent parser. It does not use\n  // eval or regular expressions, so it can be used as a model for implementing\n  // a JSON parser in other languages.\n\n  // We are defining the function inside of another function to avoid creating\n  // global variables.\n\n  // Default options one can override by passing options to the parse()\n  var _options = {\n    strict: false, // not being strict means do not generate syntax errors for \"duplicate key\"\n    storeAsString: false, // toggles whether the values should be stored as BigNumber (default) or a string\n    alwaysParseAsBig: false, // toggles whether all numbers should be Big\n    useNativeBigInt: false, // toggles whether to use native BigInt instead of bignumber.js\n    protoAction: 'error',\n    constructorAction: 'error',\n  };\n\n  // If there are options, then use them to override the default _options\n  if (options !== undefined && options !== null) {\n    if (options.strict === true) {\n      _options.strict = true;\n    }\n    if (options.storeAsString === true) {\n      _options.storeAsString = true;\n    }\n    _options.alwaysParseAsBig =\n      options.alwaysParseAsBig === true ? options.alwaysParseAsBig : false;\n    _options.useNativeBigInt =\n      options.useNativeBigInt === true ? options.useNativeBigInt : false;\n\n    if (typeof options.constructorAction !== 'undefined') {\n      if (\n        options.constructorAction === 'error' ||\n        options.constructorAction === 'ignore' ||\n        options.constructorAction === 'preserve'\n      ) {\n        _options.constructorAction = options.constructorAction;\n      } else {\n        throw new Error(\n          `Incorrect value for constructorAction option, must be \"error\", \"ignore\" or undefined but passed ${options.constructorAction}`\n        );\n      }\n    }\n\n    if (typeof options.protoAction !== 'undefined') {\n      if (\n        options.protoAction === 'error' ||\n        options.protoAction === 'ignore' ||\n        options.protoAction === 'preserve'\n      ) {\n        _options.protoAction = options.protoAction;\n      } else {\n        throw new Error(\n          `Incorrect value for protoAction option, must be \"error\", \"ignore\" or undefined but passed ${options.protoAction}`\n        );\n      }\n    }\n  }\n\n  var at, // The index of the current character\n    ch, // The current character\n    escapee = {\n      '\"': '\"',\n      '\\\\': '\\\\',\n      '/': '/',\n      b: '\\b',\n      f: '\\f',\n      n: '\\n',\n      r: '\\r',\n      t: '\\t',\n    },\n    text,\n    error = function (m) {\n      // Call error when something is wrong.\n\n      throw {\n        name: 'SyntaxError',\n        message: m,\n        at: at,\n        text: text,\n      };\n    },\n    next = function (c) {\n      // If a c parameter is provided, verify that it matches the current character.\n\n      if (c && c !== ch) {\n        error(\"Expected '\" + c + \"' instead of '\" + ch + \"'\");\n      }\n\n      // Get the next character. When there are no more characters,\n      // return the empty string.\n\n      ch = text.charAt(at);\n      at += 1;\n      return ch;\n    },\n    number = function () {\n      // Parse a number value.\n\n      var number,\n        string = '';\n\n      if (ch === '-') {\n        string = '-';\n        next('-');\n      }\n      while (ch >= '0' && ch <= '9') {\n        string += ch;\n        next();\n      }\n      if (ch === '.') {\n        string += '.';\n        while (next() && ch >= '0' && ch <= '9') {\n          string += ch;\n        }\n      }\n      if (ch === 'e' || ch === 'E') {\n        string += ch;\n        next();\n        if (ch === '-' || ch === '+') {\n          string += ch;\n          next();\n        }\n        while (ch >= '0' && ch <= '9') {\n          string += ch;\n          next();\n        }\n      }\n      number = +string;\n      if (!isFinite(number)) {\n        error('Bad number');\n      } else {\n        if (BigNumber == null) BigNumber = require('bignumber.js');\n        //if (number > 9007199254740992 || number < -9007199254740992)\n        // Bignumber has stricter check: everything with length > 15 digits disallowed\n        if (string.length > 15)\n          return _options.storeAsString\n            ? string\n            : _options.useNativeBigInt\n            ? BigInt(string)\n            : new BigNumber(string);\n        else\n          return !_options.alwaysParseAsBig\n            ? number\n            : _options.useNativeBigInt\n            ? BigInt(number)\n            : new BigNumber(number);\n      }\n    },\n    string = function () {\n      // Parse a string value.\n\n      var hex,\n        i,\n        string = '',\n        uffff;\n\n      // When parsing for string values, we must look for \" and \\ characters.\n\n      if (ch === '\"') {\n        var startAt = at;\n        while (next()) {\n          if (ch === '\"') {\n            if (at - 1 > startAt) string += text.substring(startAt, at - 1);\n            next();\n            return string;\n          }\n          if (ch === '\\\\') {\n            if (at - 1 > startAt) string += text.substring(startAt, at - 1);\n            next();\n            if (ch === 'u') {\n              uffff = 0;\n              for (i = 0; i < 4; i += 1) {\n                hex = parseInt(next(), 16);\n                if (!isFinite(hex)) {\n                  break;\n                }\n                uffff = uffff * 16 + hex;\n              }\n              string += String.fromCharCode(uffff);\n            } else if (typeof escapee[ch] === 'string') {\n              string += escapee[ch];\n            } else {\n              break;\n            }\n            startAt = at;\n          }\n        }\n      }\n      error('Bad string');\n    },\n    white = function () {\n      // Skip whitespace.\n\n      while (ch && ch <= ' ') {\n        next();\n      }\n    },\n    word = function () {\n      // true, false, or null.\n\n      switch (ch) {\n        case 't':\n          next('t');\n          next('r');\n          next('u');\n          next('e');\n          return true;\n        case 'f':\n          next('f');\n          next('a');\n          next('l');\n          next('s');\n          next('e');\n          return false;\n        case 'n':\n          next('n');\n          next('u');\n          next('l');\n          next('l');\n          return null;\n      }\n      error(\"Unexpected '\" + ch + \"'\");\n    },\n    value, // Place holder for the value function.\n    array = function () {\n      // Parse an array value.\n\n      var array = [];\n\n      if (ch === '[') {\n        next('[');\n        white();\n        if (ch === ']') {\n          next(']');\n          return array; // empty array\n        }\n        while (ch) {\n          array.push(value());\n          white();\n          if (ch === ']') {\n            next(']');\n            return array;\n          }\n          next(',');\n          white();\n        }\n      }\n      error('Bad array');\n    },\n    object = function () {\n      // Parse an object value.\n\n      var key,\n        object = Object.create(null);\n\n      if (ch === '{') {\n        next('{');\n        white();\n        if (ch === '}') {\n          next('}');\n          return object; // empty object\n        }\n        while (ch) {\n          key = string();\n          white();\n          next(':');\n          if (\n            _options.strict === true &&\n            Object.hasOwnProperty.call(object, key)\n          ) {\n            error('Duplicate key \"' + key + '\"');\n          }\n\n          if (suspectProtoRx.test(key) === true) {\n            if (_options.protoAction === 'error') {\n              error('Object contains forbidden prototype property');\n            } else if (_options.protoAction === 'ignore') {\n              value();\n            } else {\n              object[key] = value();\n            }\n          } else if (suspectConstructorRx.test(key) === true) {\n            if (_options.constructorAction === 'error') {\n              error('Object contains forbidden constructor property');\n            } else if (_options.constructorAction === 'ignore') {\n              value();\n            } else {\n              object[key] = value();\n            }\n          } else {\n            object[key] = value();\n          }\n\n          white();\n          if (ch === '}') {\n            next('}');\n            return object;\n          }\n          next(',');\n          white();\n        }\n      }\n      error('Bad object');\n    };\n\n  value = function () {\n    // Parse a JSON value. It could be an object, an array, a string, a number,\n    // or a word.\n\n    white();\n    switch (ch) {\n      case '{':\n        return object();\n      case '[':\n        return array();\n      case '\"':\n        return string();\n      case '-':\n        return number();\n      default:\n        return ch >= '0' && ch <= '9' ? number() : word();\n    }\n  };\n\n  // Return the json_parse function. It will have access to all of the above\n  // functions and variables.\n\n  return function (source, reviver) {\n    var result;\n\n    text = source + '';\n    at = 0;\n    ch = ' ';\n    result = value();\n    white();\n    if (ch) {\n      error('Syntax error');\n    }\n\n    // If there is a reviver function, we recursively walk the new structure,\n    // passing each name/value pair to the reviver function for possible\n    // transformation, starting with a temporary root object that holds the result\n    // in an empty key. If there is not a reviver function, we simply return the\n    // result.\n\n    return typeof reviver === 'function'\n      ? (function walk(holder, key) {\n          var k,\n            v,\n            value = holder[key];\n          if (value && typeof value === 'object') {\n            Object.keys(value).forEach(function (k) {\n              v = walk(value, k);\n              if (v !== undefined) {\n                value[k] = v;\n              } else {\n                delete value[k];\n              }\n            });\n          }\n          return reviver.call(holder, key, value);\n        })({ '': result }, '')\n      : result;\n  };\n};\n\nmodule.exports = json_parse;\n", "var json_stringify = require('./lib/stringify.js').stringify;\nvar json_parse     = require('./lib/parse.js');\n\nmodule.exports = function(options) {\n    return  {\n        parse: json_parse(options),\n        stringify: json_stringify\n    }\n};\n//create the default method members with no options applied for backwards compatibility\nmodule.exports.parse = json_parse();\nmodule.exports.stringify = json_stringify;\n", null, null, null, null, null, "'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n  lookup[i] = code[i]\n  revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n  var len = b64.length\n\n  if (len % 4 > 0) {\n    throw new Error('Invalid string. Length must be a multiple of 4')\n  }\n\n  // Trim off extra bytes after placeholder bytes are found\n  // See: https://github.com/beatgammit/base64-js/issues/42\n  var validLen = b64.indexOf('=')\n  if (validLen === -1) validLen = len\n\n  var placeHoldersLen = validLen === len\n    ? 0\n    : 4 - (validLen % 4)\n\n  return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n  var tmp\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n\n  var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n  var curByte = 0\n\n  // if there are placeholders, only get up to the last complete 4 chars\n  var len = placeHoldersLen > 0\n    ? validLen - 4\n    : validLen\n\n  var i\n  for (i = 0; i < len; i += 4) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 18) |\n      (revLookup[b64.charCodeAt(i + 1)] << 12) |\n      (revLookup[b64.charCodeAt(i + 2)] << 6) |\n      revLookup[b64.charCodeAt(i + 3)]\n    arr[curByte++] = (tmp >> 16) & 0xFF\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 2) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 2) |\n      (revLookup[b64.charCodeAt(i + 1)] >> 4)\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 1) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 10) |\n      (revLookup[b64.charCodeAt(i + 1)] << 4) |\n      (revLookup[b64.charCodeAt(i + 2)] >> 2)\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  return arr\n}\n\nfunction tripletToBase64 (num) {\n  return lookup[num >> 18 & 0x3F] +\n    lookup[num >> 12 & 0x3F] +\n    lookup[num >> 6 & 0x3F] +\n    lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n  var tmp\n  var output = []\n  for (var i = start; i < end; i += 3) {\n    tmp =\n      ((uint8[i] << 16) & 0xFF0000) +\n      ((uint8[i + 1] << 8) & 0xFF00) +\n      (uint8[i + 2] & 0xFF)\n    output.push(tripletToBase64(tmp))\n  }\n  return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n  var tmp\n  var len = uint8.length\n  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n  var parts = []\n  var maxChunkLength = 16383 // must be multiple of 3\n\n  // go through the array every three bytes, we'll deal with trailing stuff later\n  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n    parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n  }\n\n  // pad the end with zeros, but make sure to not forget the extra bytes\n  if (extraBytes === 1) {\n    tmp = uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 2] +\n      lookup[(tmp << 4) & 0x3F] +\n      '=='\n    )\n  } else if (extraBytes === 2) {\n    tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 10] +\n      lookup[(tmp >> 4) & 0x3F] +\n      lookup[(tmp << 2) & 0x3F] +\n      '='\n    )\n  }\n\n  return parts.join('')\n}\n", "\"use strict\";\n// Copyright 2019 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n/* global window */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.BrowserCrypto = void 0;\n// This file implements crypto functions we need using in-browser\n// SubtleCrypto interface `window.crypto.subtle`.\nconst base64js = require(\"base64-js\");\nconst crypto_1 = require(\"../crypto\");\nclass BrowserCrypto {\n    constructor() {\n        if (typeof window === 'undefined' ||\n            window.crypto === undefined ||\n            window.crypto.subtle === undefined) {\n            throw new Error(\"SubtleCrypto not found. Make sure it's an https:// website.\");\n        }\n    }\n    async sha256DigestBase64(str) {\n        // SubtleCrypto digest() method is async, so we must make\n        // this method async as well.\n        // To calculate SHA256 digest using SubtleCrypto, we first\n        // need to convert an input string to an ArrayBuffer:\n        const inputBuffer = new TextEncoder().encode(str);\n        // Result is ArrayBuffer as well.\n        const outputBuffer = await window.crypto.subtle.digest('SHA-256', inputBuffer);\n        return base64js.fromByteArray(new Uint8Array(outputBuffer));\n    }\n    randomBytesBase64(count) {\n        const array = new Uint8Array(count);\n        window.crypto.getRandomValues(array);\n        return base64js.fromByteArray(array);\n    }\n    static padBase64(base64) {\n        // base64js requires padding, so let's add some '='\n        while (base64.length % 4 !== 0) {\n            base64 += '=';\n        }\n        return base64;\n    }\n    async verify(pubkey, data, signature) {\n        const algo = {\n            name: 'RSASSA-PKCS1-v1_5',\n            hash: { name: 'SHA-256' },\n        };\n        const dataArray = new TextEncoder().encode(data);\n        const signatureArray = base64js.toByteArray(BrowserCrypto.padBase64(signature));\n        const cryptoKey = await window.crypto.subtle.importKey('jwk', pubkey, algo, true, ['verify']);\n        // SubtleCrypto's verify method is async so we must make\n        // this method async as well.\n        const result = await window.crypto.subtle.verify(algo, cryptoKey, signatureArray, dataArray);\n        return result;\n    }\n    async sign(privateKey, data) {\n        const algo = {\n            name: 'RSASSA-PKCS1-v1_5',\n            hash: { name: 'SHA-256' },\n        };\n        const dataArray = new TextEncoder().encode(data);\n        const cryptoKey = await window.crypto.subtle.importKey('jwk', privateKey, algo, true, ['sign']);\n        // SubtleCrypto's sign method is async so we must make\n        // this method async as well.\n        const result = await window.crypto.subtle.sign(algo, cryptoKey, dataArray);\n        return base64js.fromByteArray(new Uint8Array(result));\n    }\n    decodeBase64StringUtf8(base64) {\n        const uint8array = base64js.toByteArray(BrowserCrypto.padBase64(base64));\n        const result = new TextDecoder().decode(uint8array);\n        return result;\n    }\n    encodeBase64StringUtf8(text) {\n        const uint8array = new TextEncoder().encode(text);\n        const result = base64js.fromByteArray(uint8array);\n        return result;\n    }\n    /**\n     * Computes the SHA-256 hash of the provided string.\n     * @param str The plain text string to hash.\n     * @return A promise that resolves with the SHA-256 hash of the provided\n     *   string in hexadecimal encoding.\n     */\n    async sha256DigestHex(str) {\n        // SubtleCrypto digest() method is async, so we must make\n        // this method async as well.\n        // To calculate SHA256 digest using SubtleCrypto, we first\n        // need to convert an input string to an ArrayBuffer:\n        const inputBuffer = new TextEncoder().encode(str);\n        // Result is ArrayBuffer as well.\n        const outputBuffer = await window.crypto.subtle.digest('SHA-256', inputBuffer);\n        return (0, crypto_1.fromArrayBufferToHex)(outputBuffer);\n    }\n    /**\n     * Computes the HMAC hash of a message using the provided crypto key and the\n     * SHA-256 algorithm.\n     * @param key The secret crypto key in utf-8 or ArrayBuffer format.\n     * @param msg The plain text message.\n     * @return A promise that resolves with the HMAC-SHA256 hash in ArrayBuffer\n     *   format.\n     */\n    async signWithHmacSha256(key, msg) {\n        // Convert key, if provided in ArrayBuffer format, to string.\n        const rawKey = typeof key === 'string'\n            ? key\n            : String.fromCharCode(...new Uint16Array(key));\n        const enc = new TextEncoder();\n        const cryptoKey = await window.crypto.subtle.importKey('raw', enc.encode(rawKey), {\n            name: 'HMAC',\n            hash: {\n                name: 'SHA-256',\n            },\n        }, false, ['sign']);\n        return window.crypto.subtle.sign('HMAC', cryptoKey, enc.encode(msg));\n    }\n}\nexports.BrowserCrypto = BrowserCrypto;\n", "\"use strict\";\n// Copyright 2019 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NodeCrypto = void 0;\nconst crypto = require(\"crypto\");\nclass NodeCrypto {\n    async sha256DigestBase64(str) {\n        return crypto.createHash('sha256').update(str).digest('base64');\n    }\n    randomBytesBase64(count) {\n        return crypto.randomBytes(count).toString('base64');\n    }\n    async verify(pubkey, data, signature) {\n        const verifier = crypto.createVerify('RSA-SHA256');\n        verifier.update(data);\n        verifier.end();\n        return verifier.verify(pubkey, signature, 'base64');\n    }\n    async sign(privateKey, data) {\n        const signer = crypto.createSign('RSA-SHA256');\n        signer.update(data);\n        signer.end();\n        return signer.sign(privateKey, 'base64');\n    }\n    decodeBase64StringUtf8(base64) {\n        return Buffer.from(base64, 'base64').toString('utf-8');\n    }\n    encodeBase64StringUtf8(text) {\n        return Buffer.from(text, 'utf-8').toString('base64');\n    }\n    /**\n     * Computes the SHA-256 hash of the provided string.\n     * @param str The plain text string to hash.\n     * @return A promise that resolves with the SHA-256 hash of the provided\n     *   string in hexadecimal encoding.\n     */\n    async sha256DigestHex(str) {\n        return crypto.createHash('sha256').update(str).digest('hex');\n    }\n    /**\n     * Computes the HMAC hash of a message using the provided crypto key and the\n     * SHA-256 algorithm.\n     * @param key The secret crypto key in utf-8 or ArrayBuffer format.\n     * @param msg The plain text message.\n     * @return A promise that resolves with the HMAC-SHA256 hash in ArrayBuffer\n     *   format.\n     */\n    async signWithHmacSha256(key, msg) {\n        const cryptoKey = typeof key === 'string' ? key : toBuffer(key);\n        return toArrayBuffer(crypto.createHmac('sha256', cryptoKey).update(msg).digest());\n    }\n}\nexports.NodeCrypto = NodeCrypto;\n/**\n * Converts a Node.js Buffer to an ArrayBuffer.\n * https://stackoverflow.com/questions/8609289/convert-a-binary-nodejs-buffer-to-javascript-arraybuffer\n * @param buffer The Buffer input to covert.\n * @return The ArrayBuffer representation of the input.\n */\nfunction toArrayBuffer(buffer) {\n    return buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);\n}\n/**\n * Converts an ArrayBuffer to a Node.js Buffer.\n * @param arrayBuffer The ArrayBuffer input to covert.\n * @return The Buffer representation of the input.\n */\nfunction toBuffer(arrayBuffer) {\n    return Buffer.from(arrayBuffer);\n}\n", "\"use strict\";\n// Copyright 2019 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n/* global window */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createCrypto = createCrypto;\nexports.hasBrowserCrypto = hasBrowserCrypto;\nexports.fromArrayBufferToHex = fromArrayBufferToHex;\nconst crypto_1 = require(\"./browser/crypto\");\nconst crypto_2 = require(\"./node/crypto\");\nfunction createCrypto() {\n    if (hasBrowserCrypto()) {\n        return new crypto_1.BrowserCrypto();\n    }\n    return new crypto_2.NodeCrypto();\n}\nfunction hasBrowserCrypto() {\n    return (typeof window !== 'undefined' &&\n        typeof window.crypto !== 'undefined' &&\n        typeof window.crypto.subtle !== 'undefined');\n}\n/**\n * Converts an ArrayBuffer to a hexadecimal string.\n * @param arrayBuffer The ArrayBuffer to convert to hexadecimal string.\n * @return The hexadecimal encoding of the ArrayBuffer.\n */\nfunction fromArrayBufferToHex(arrayBuffer) {\n    // Convert buffer to byte array.\n    const byteArray = Array.from(new Uint8Array(arrayBuffer));\n    // Convert bytes to hex string.\n    return byteArray\n        .map(byte => {\n        return byte.toString(16).padStart(2, '0');\n    })\n        .join('');\n}\n", "\"use strict\";\n// Copyright 2017 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validate = validate;\n// Accepts an options object passed from the user to the API.  In the\n// previous version of the API, it referred to a `Request` options object.\n// Now it refers to an Axiox Request Config object.  This is here to help\n// ensure users don't pass invalid options when they upgrade from 0.x to 1.x.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction validate(options) {\n    const vpairs = [\n        { invalid: 'uri', expected: 'url' },\n        { invalid: 'json', expected: 'data' },\n        { invalid: 'qs', expected: 'params' },\n    ];\n    for (const pair of vpairs) {\n        if (options[pair.invalid]) {\n            const e = `'${pair.invalid}' is not a valid configuration option. Please use '${pair.expected}' instead. This library is using Axios for requests. Please see https://github.com/axios/axios to learn more about the valid request options.`;\n            throw new Error(e);\n        }\n    }\n}\n", "{\n  \"name\": \"google-auth-library\",\n  \"version\": \"9.15.1\",\n  \"author\": \"Google Inc.\",\n  \"description\": \"Google APIs Authentication Client Library for Node.js\",\n  \"engines\": {\n    \"node\": \">=14\"\n  },\n  \"main\": \"./build/src/index.js\",\n  \"types\": \"./build/src/index.d.ts\",\n  \"repository\": \"googleapis/google-auth-library-nodejs.git\",\n  \"keywords\": [\n    \"google\",\n    \"api\",\n    \"google apis\",\n    \"client\",\n    \"client library\"\n  ],\n  \"dependencies\": {\n    \"base64-js\": \"^1.3.0\",\n    \"ecdsa-sig-formatter\": \"^1.0.11\",\n    \"gaxios\": \"^6.1.1\",\n    \"gcp-metadata\": \"^6.1.0\",\n    \"gtoken\": \"^7.0.0\",\n    \"jws\": \"^4.0.0\"\n  },\n  \"devDependencies\": {\n    \"@types/base64-js\": \"^1.2.5\",\n    \"@types/chai\": \"^4.1.7\",\n    \"@types/jws\": \"^3.1.0\",\n    \"@types/mocha\": \"^9.0.0\",\n    \"@types/mv\": \"^2.1.0\",\n    \"@types/ncp\": \"^2.0.1\",\n    \"@types/node\": \"^20.4.2\",\n    \"@types/sinon\": \"^17.0.0\",\n    \"assert-rejects\": \"^1.0.0\",\n    \"c8\": \"^8.0.0\",\n    \"chai\": \"^4.2.0\",\n    \"cheerio\": \"1.0.0-rc.12\",\n    \"codecov\": \"^3.0.2\",\n    \"engine.io\": \"6.6.2\",\n    \"gts\": \"^5.0.0\",\n    \"is-docker\": \"^2.0.0\",\n    \"jsdoc\": \"^4.0.0\",\n    \"jsdoc-fresh\": \"^3.0.0\",\n    \"jsdoc-region-tag\": \"^3.0.0\",\n    \"karma\": \"^6.0.0\",\n    \"karma-chrome-launcher\": \"^3.0.0\",\n    \"karma-coverage\": \"^2.0.0\",\n    \"karma-firefox-launcher\": \"^2.0.0\",\n    \"karma-mocha\": \"^2.0.0\",\n    \"karma-sourcemap-loader\": \"^0.4.0\",\n    \"karma-webpack\": \"5.0.0\",\n    \"keypair\": \"^1.0.4\",\n    \"linkinator\": \"^4.0.0\",\n    \"mocha\": \"^9.2.2\",\n    \"mv\": \"^2.1.1\",\n    \"ncp\": \"^2.0.0\",\n    \"nock\": \"^13.0.0\",\n    \"null-loader\": \"^4.0.0\",\n    \"pdfmake\": \"0.2.12\",\n    \"puppeteer\": \"^21.0.0\",\n    \"sinon\": \"^18.0.0\",\n    \"ts-loader\": \"^8.0.0\",\n    \"typescript\": \"^5.1.6\",\n    \"webpack\": \"^5.21.2\",\n    \"webpack-cli\": \"^4.0.0\"\n  },\n  \"files\": [\n    \"build/src\",\n    \"!build/src/**/*.map\"\n  ],\n  \"scripts\": {\n    \"test\": \"c8 mocha build/test\",\n    \"clean\": \"gts clean\",\n    \"prepare\": \"npm run compile\",\n    \"lint\": \"gts check\",\n    \"compile\": \"tsc -p .\",\n    \"fix\": \"gts fix\",\n    \"pretest\": \"npm run compile -- --sourceMap\",\n    \"docs\": \"jsdoc -c .jsdoc.json\",\n    \"samples-setup\": \"cd samples/ && npm link ../ && npm run setup && cd ../\",\n    \"samples-test\": \"cd samples/ && npm link ../ && npm test && cd ../\",\n    \"system-test\": \"mocha build/system-test --timeout 60000\",\n    \"presystem-test\": \"npm run compile -- --sourceMap\",\n    \"webpack\": \"webpack\",\n    \"browser-test\": \"karma start\",\n    \"docs-test\": \"linkinator docs\",\n    \"predocs-test\": \"npm run docs\",\n    \"prelint\": \"cd samples; npm link ../; npm install\",\n    \"precompile\": \"gts clean\"\n  },\n  \"license\": \"Apache-2.0\"\n}\n", "\"use strict\";\n// Copyright 2019 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DefaultTransporter = void 0;\nconst gaxios_1 = require(\"gaxios\");\nconst options_1 = require(\"./options\");\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst pkg = require('../../package.json');\nconst PRODUCT_NAME = 'google-api-nodejs-client';\nclass DefaultTransporter {\n    constructor() {\n        /**\n         * A configurable, replacable `Gaxios` instance.\n         */\n        this.instance = new gaxios_1.Gaxios();\n    }\n    /**\n     * Configures request options before making a request.\n     * @param opts GaxiosOptions options.\n     * @return Configured options.\n     */\n    configure(opts = {}) {\n        opts.headers = opts.headers || {};\n        if (typeof window === 'undefined') {\n            // set transporter user agent if not in browser\n            const uaValue = opts.headers['User-Agent'];\n            if (!uaValue) {\n                opts.headers['User-Agent'] = DefaultTransporter.USER_AGENT;\n            }\n            else if (!uaValue.includes(`${PRODUCT_NAME}/`)) {\n                opts.headers['User-Agent'] =\n                    `${uaValue} ${DefaultTransporter.USER_AGENT}`;\n            }\n            // track google-auth-library-nodejs version:\n            if (!opts.headers['x-goog-api-client']) {\n                const nodeVersion = process.version.replace(/^v/, '');\n                opts.headers['x-goog-api-client'] = `gl-node/${nodeVersion}`;\n            }\n        }\n        return opts;\n    }\n    /**\n     * Makes a request using Gaxios with given options.\n     * @param opts GaxiosOptions options.\n     * @param callback optional callback that contains GaxiosResponse object.\n     * @return GaxiosPromise, assuming no callback is passed.\n     */\n    request(opts) {\n        // ensure the user isn't passing in request-style options\n        opts = this.configure(opts);\n        (0, options_1.validate)(opts);\n        return this.instance.request(opts).catch(e => {\n            throw this.processError(e);\n        });\n    }\n    get defaults() {\n        return this.instance.defaults;\n    }\n    set defaults(opts) {\n        this.instance.defaults = opts;\n    }\n    /**\n     * Changes the error to include details from the body.\n     */\n    processError(e) {\n        const res = e.response;\n        const err = e;\n        const body = res ? res.data : null;\n        if (res && body && body.error && res.status !== 200) {\n            if (typeof body.error === 'string') {\n                err.message = body.error;\n                err.status = res.status;\n            }\n            else if (Array.isArray(body.error.errors)) {\n                err.message = body.error.errors\n                    .map((err2) => err2.message)\n                    .join('\\n');\n                err.code = body.error.code;\n                err.errors = body.error.errors;\n            }\n            else {\n                err.message = body.error.message;\n                err.code = body.error.code;\n            }\n        }\n        else if (res && res.status >= 400) {\n            // Consider all 4xx and 5xx responses errors.\n            err.message = body;\n            err.status = res.status;\n        }\n        return err;\n    }\n}\nexports.DefaultTransporter = DefaultTransporter;\n/**\n * Default user agent.\n */\nDefaultTransporter.USER_AGENT = `${PRODUCT_NAME}/${pkg.version}`;\n", "/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */\n/* eslint-disable node/no-deprecated-api */\nvar buffer = require('buffer')\nvar Buffer = buffer.Buffer\n\n// alternative to using Object.keys for old browsers\nfunction copyProps (src, dst) {\n  for (var key in src) {\n    dst[key] = src[key]\n  }\n}\nif (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {\n  module.exports = buffer\n} else {\n  // Copy properties from require('buffer')\n  copyProps(buffer, exports)\n  exports.Buffer = SafeBuffer\n}\n\nfunction SafeBuffer (arg, encodingOrOffset, length) {\n  return Buffer(arg, encodingOrOffset, length)\n}\n\nSafeBuffer.prototype = Object.create(Buffer.prototype)\n\n// Copy static methods from Buffer\ncopyProps(Buffer, SafeBuffer)\n\nSafeBuffer.from = function (arg, encodingOrOffset, length) {\n  if (typeof arg === 'number') {\n    throw new TypeError('Argument must not be a number')\n  }\n  return Buffer(arg, encodingOrOffset, length)\n}\n\nSafeBuffer.alloc = function (size, fill, encoding) {\n  if (typeof size !== 'number') {\n    throw new TypeError('Argument must be a number')\n  }\n  var buf = Buffer(size)\n  if (fill !== undefined) {\n    if (typeof encoding === 'string') {\n      buf.fill(fill, encoding)\n    } else {\n      buf.fill(fill)\n    }\n  } else {\n    buf.fill(0)\n  }\n  return buf\n}\n\nSafeBuffer.allocUnsafe = function (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('Argument must be a number')\n  }\n  return Buffer(size)\n}\n\nSafeBuffer.allocUnsafeSlow = function (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('Argument must be a number')\n  }\n  return buffer.SlowBuffer(size)\n}\n", "'use strict';\n\nfunction getParamSize(keySize) {\n\tvar result = ((keySize / 8) | 0) + (keySize % 8 === 0 ? 0 : 1);\n\treturn result;\n}\n\nvar paramBytesForAlg = {\n\tES256: getParamSize(256),\n\tES384: getParamSize(384),\n\tES512: getParamSize(521)\n};\n\nfunction getParamBytesForAlg(alg) {\n\tvar paramBytes = paramBytesForAlg[alg];\n\tif (paramBytes) {\n\t\treturn paramBytes;\n\t}\n\n\tthrow new Error('Unknown algorithm \"' + alg + '\"');\n}\n\nmodule.exports = getParamBytesForAlg;\n", "'use strict';\n\nvar Buffer = require('safe-buffer').Buffer;\n\nvar getParamBytesForAlg = require('./param-bytes-for-alg');\n\nvar MAX_OCTET = 0x80,\n\tCLASS_UNIVERSAL = 0,\n\tPRIMITIVE_BIT = 0x20,\n\tTAG_SEQ = 0x10,\n\tTAG_INT = 0x02,\n\tENCODED_TAG_SEQ = (TAG_SEQ | PRIMITIVE_BIT) | (CLASS_UNIVERSAL << 6),\n\tENCODED_TAG_INT = TAG_INT | (CLASS_UNIVERSAL << 6);\n\nfunction base64Url(base64) {\n\treturn base64\n\t\t.replace(/=/g, '')\n\t\t.replace(/\\+/g, '-')\n\t\t.replace(/\\//g, '_');\n}\n\nfunction signatureAsBuffer(signature) {\n\tif (Buffer.isBuffer(signature)) {\n\t\treturn signature;\n\t} else if ('string' === typeof signature) {\n\t\treturn Buffer.from(signature, 'base64');\n\t}\n\n\tthrow new TypeError('ECDSA signature must be a Base64 string or a Buffer');\n}\n\nfunction derToJose(signature, alg) {\n\tsignature = signatureAsBuffer(signature);\n\tvar paramBytes = getParamBytesForAlg(alg);\n\n\t// the DER encoded param should at most be the param size, plus a padding\n\t// zero, since due to being a signed integer\n\tvar maxEncodedParamLength = paramBytes + 1;\n\n\tvar inputLength = signature.length;\n\n\tvar offset = 0;\n\tif (signature[offset++] !== ENCODED_TAG_SEQ) {\n\t\tthrow new Error('Could not find expected \"seq\"');\n\t}\n\n\tvar seqLength = signature[offset++];\n\tif (seqLength === (MAX_OCTET | 1)) {\n\t\tseqLength = signature[offset++];\n\t}\n\n\tif (inputLength - offset < seqLength) {\n\t\tthrow new Error('\"seq\" specified length of \"' + seqLength + '\", only \"' + (inputLength - offset) + '\" remaining');\n\t}\n\n\tif (signature[offset++] !== ENCODED_TAG_INT) {\n\t\tthrow new Error('Could not find expected \"int\" for \"r\"');\n\t}\n\n\tvar rLength = signature[offset++];\n\n\tif (inputLength - offset - 2 < rLength) {\n\t\tthrow new Error('\"r\" specified length of \"' + rLength + '\", only \"' + (inputLength - offset - 2) + '\" available');\n\t}\n\n\tif (maxEncodedParamLength < rLength) {\n\t\tthrow new Error('\"r\" specified length of \"' + rLength + '\", max of \"' + maxEncodedParamLength + '\" is acceptable');\n\t}\n\n\tvar rOffset = offset;\n\toffset += rLength;\n\n\tif (signature[offset++] !== ENCODED_TAG_INT) {\n\t\tthrow new Error('Could not find expected \"int\" for \"s\"');\n\t}\n\n\tvar sLength = signature[offset++];\n\n\tif (inputLength - offset !== sLength) {\n\t\tthrow new Error('\"s\" specified length of \"' + sLength + '\", expected \"' + (inputLength - offset) + '\"');\n\t}\n\n\tif (maxEncodedParamLength < sLength) {\n\t\tthrow new Error('\"s\" specified length of \"' + sLength + '\", max of \"' + maxEncodedParamLength + '\" is acceptable');\n\t}\n\n\tvar sOffset = offset;\n\toffset += sLength;\n\n\tif (offset !== inputLength) {\n\t\tthrow new Error('Expected to consume entire buffer, but \"' + (inputLength - offset) + '\" bytes remain');\n\t}\n\n\tvar rPadding = paramBytes - rLength,\n\t\tsPadding = paramBytes - sLength;\n\n\tvar dst = Buffer.allocUnsafe(rPadding + rLength + sPadding + sLength);\n\n\tfor (offset = 0; offset < rPadding; ++offset) {\n\t\tdst[offset] = 0;\n\t}\n\tsignature.copy(dst, offset, rOffset + Math.max(-rPadding, 0), rOffset + rLength);\n\n\toffset = paramBytes;\n\n\tfor (var o = offset; offset < o + sPadding; ++offset) {\n\t\tdst[offset] = 0;\n\t}\n\tsignature.copy(dst, offset, sOffset + Math.max(-sPadding, 0), sOffset + sLength);\n\n\tdst = dst.toString('base64');\n\tdst = base64Url(dst);\n\n\treturn dst;\n}\n\nfunction countPadding(buf, start, stop) {\n\tvar padding = 0;\n\twhile (start + padding < stop && buf[start + padding] === 0) {\n\t\t++padding;\n\t}\n\n\tvar needsSign = buf[start + padding] >= MAX_OCTET;\n\tif (needsSign) {\n\t\t--padding;\n\t}\n\n\treturn padding;\n}\n\nfunction joseToDer(signature, alg) {\n\tsignature = signatureAsBuffer(signature);\n\tvar paramBytes = getParamBytesForAlg(alg);\n\n\tvar signatureBytes = signature.length;\n\tif (signatureBytes !== paramBytes * 2) {\n\t\tthrow new TypeError('\"' + alg + '\" signatures must be \"' + paramBytes * 2 + '\" bytes, saw \"' + signatureBytes + '\"');\n\t}\n\n\tvar rPadding = countPadding(signature, 0, paramBytes);\n\tvar sPadding = countPadding(signature, paramBytes, signature.length);\n\tvar rLength = paramBytes - rPadding;\n\tvar sLength = paramBytes - sPadding;\n\n\tvar rsBytes = 1 + 1 + rLength + 1 + 1 + sLength;\n\n\tvar shortLength = rsBytes < MAX_OCTET;\n\n\tvar dst = Buffer.allocUnsafe((shortLength ? 2 : 3) + rsBytes);\n\n\tvar offset = 0;\n\tdst[offset++] = ENCODED_TAG_SEQ;\n\tif (shortLength) {\n\t\t// Bit 8 has value \"0\"\n\t\t// bits 7-1 give the length.\n\t\tdst[offset++] = rsBytes;\n\t} else {\n\t\t// Bit 8 of first octet has value \"1\"\n\t\t// bits 7-1 give the number of additional length octets.\n\t\tdst[offset++] = MAX_OCTET\t| 1;\n\t\t// length, base 256\n\t\tdst[offset++] = rsBytes & 0xff;\n\t}\n\tdst[offset++] = ENCODED_TAG_INT;\n\tdst[offset++] = rLength;\n\tif (rPadding < 0) {\n\t\tdst[offset++] = 0;\n\t\toffset += signature.copy(dst, offset, 0, paramBytes);\n\t} else {\n\t\toffset += signature.copy(dst, offset, rPadding, paramBytes);\n\t}\n\tdst[offset++] = ENCODED_TAG_INT;\n\tdst[offset++] = sLength;\n\tif (sPadding < 0) {\n\t\tdst[offset++] = 0;\n\t\tsignature.copy(dst, offset, paramBytes);\n\t} else {\n\t\tsignature.copy(dst, offset, paramBytes + sPadding);\n\t}\n\n\treturn dst;\n}\n\nmodule.exports = {\n\tderToJose: derToJose,\n\tjoseToDer: joseToDer\n};\n", "\"use strict\";\n// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nvar __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n    return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar _LRUCache_instances, _LRUCache_cache, _LRUCache_moveToEnd, _LRUCache_evict;\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LRUCache = void 0;\nexports.snakeToCamel = snakeToCamel;\nexports.originalOrCamelOptions = originalOrCamelOptions;\n/**\n * Returns the camel case of a provided string.\n *\n * @remarks\n *\n * Match any `_` and not `_` pair, then return the uppercase of the not `_`\n * character.\n *\n * @internal\n *\n * @param str the string to convert\n * @returns the camelCase'd string\n */\nfunction snakeToCamel(str) {\n    return str.replace(/([_][^_])/g, match => match.slice(1).toUpperCase());\n}\n/**\n * Get the value of `obj[key]` or `obj[camelCaseKey]`, with a preference\n * for original, non-camelCase key.\n *\n * @param obj object to lookup a value in\n * @returns a `get` function for getting `obj[key || snakeKey]`, if available\n */\nfunction originalOrCamelOptions(obj) {\n    /**\n     *\n     * @param key an index of object, preferably snake_case\n     * @returns the value `obj[key || snakeKey]`, if available\n     */\n    function get(key) {\n        var _a;\n        const o = (obj || {});\n        return (_a = o[key]) !== null && _a !== void 0 ? _a : o[snakeToCamel(key)];\n    }\n    return { get };\n}\n/**\n * A simple LRU cache utility.\n * Not meant for external usage.\n *\n * @experimental\n * @internal\n */\nclass LRUCache {\n    constructor(options) {\n        _LRUCache_instances.add(this);\n        /**\n         * Maps are in order. Thus, the older item is the first item.\n         *\n         * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map}\n         */\n        _LRUCache_cache.set(this, new Map());\n        this.capacity = options.capacity;\n        this.maxAge = options.maxAge;\n    }\n    /**\n     * Add an item to the cache.\n     *\n     * @param key the key to upsert\n     * @param value the value of the key\n     */\n    set(key, value) {\n        __classPrivateFieldGet(this, _LRUCache_instances, \"m\", _LRUCache_moveToEnd).call(this, key, value);\n        __classPrivateFieldGet(this, _LRUCache_instances, \"m\", _LRUCache_evict).call(this);\n    }\n    /**\n     * Get an item from the cache.\n     *\n     * @param key the key to retrieve\n     */\n    get(key) {\n        const item = __classPrivateFieldGet(this, _LRUCache_cache, \"f\").get(key);\n        if (!item)\n            return;\n        __classPrivateFieldGet(this, _LRUCache_instances, \"m\", _LRUCache_moveToEnd).call(this, key, item.value);\n        __classPrivateFieldGet(this, _LRUCache_instances, \"m\", _LRUCache_evict).call(this);\n        return item.value;\n    }\n}\nexports.LRUCache = LRUCache;\n_LRUCache_cache = new WeakMap(), _LRUCache_instances = new WeakSet(), _LRUCache_moveToEnd = function _LRUCache_moveToEnd(key, value) {\n    __classPrivateFieldGet(this, _LRUCache_cache, \"f\").delete(key);\n    __classPrivateFieldGet(this, _LRUCache_cache, \"f\").set(key, {\n        value,\n        lastAccessed: Date.now(),\n    });\n}, _LRUCache_evict = function _LRUCache_evict() {\n    const cutoffDate = this.maxAge ? Date.now() - this.maxAge : 0;\n    /**\n     * Because we know Maps are in order, this item is both the\n     * last item in the list (capacity) and oldest (maxAge).\n     */\n    let oldestItem = __classPrivateFieldGet(this, _LRUCache_cache, \"f\").entries().next();\n    while (!oldestItem.done &&\n        (__classPrivateFieldGet(this, _LRUCache_cache, \"f\").size > this.capacity || // too many\n            oldestItem.value[1].lastAccessed < cutoffDate) // too old\n    ) {\n        __classPrivateFieldGet(this, _LRUCache_cache, \"f\").delete(oldestItem.value[0]);\n        oldestItem = __classPrivateFieldGet(this, _LRUCache_cache, \"f\").entries().next();\n    }\n};\n", "\"use strict\";\n// Copyright 2012 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AuthClient = exports.DEFAULT_EAGER_REFRESH_THRESHOLD_MILLIS = exports.DEFAULT_UNIVERSE = void 0;\nconst events_1 = require(\"events\");\nconst gaxios_1 = require(\"gaxios\");\nconst transporters_1 = require(\"../transporters\");\nconst util_1 = require(\"../util\");\n/**\n * The default cloud universe\n *\n * @see {@link AuthJSONOptions.universe_domain}\n */\nexports.DEFAULT_UNIVERSE = 'googleapis.com';\n/**\n * The default {@link AuthClientOptions.eagerRefreshThresholdMillis}\n */\nexports.DEFAULT_EAGER_REFRESH_THRESHOLD_MILLIS = 5 * 60 * 1000;\nclass AuthClient extends events_1.EventEmitter {\n    constructor(opts = {}) {\n        var _a, _b, _c, _d, _e;\n        super();\n        this.credentials = {};\n        this.eagerRefreshThresholdMillis = exports.DEFAULT_EAGER_REFRESH_THRESHOLD_MILLIS;\n        this.forceRefreshOnFailure = false;\n        this.universeDomain = exports.DEFAULT_UNIVERSE;\n        const options = (0, util_1.originalOrCamelOptions)(opts);\n        // Shared auth options\n        this.apiKey = opts.apiKey;\n        this.projectId = (_a = options.get('project_id')) !== null && _a !== void 0 ? _a : null;\n        this.quotaProjectId = options.get('quota_project_id');\n        this.credentials = (_b = options.get('credentials')) !== null && _b !== void 0 ? _b : {};\n        this.universeDomain = (_c = options.get('universe_domain')) !== null && _c !== void 0 ? _c : exports.DEFAULT_UNIVERSE;\n        // Shared client options\n        this.transporter = (_d = opts.transporter) !== null && _d !== void 0 ? _d : new transporters_1.DefaultTransporter();\n        if (opts.transporterOptions) {\n            this.transporter.defaults = opts.transporterOptions;\n        }\n        if (opts.eagerRefreshThresholdMillis) {\n            this.eagerRefreshThresholdMillis = opts.eagerRefreshThresholdMillis;\n        }\n        this.forceRefreshOnFailure = (_e = opts.forceRefreshOnFailure) !== null && _e !== void 0 ? _e : false;\n    }\n    /**\n     * Return the {@link Gaxios `Gaxios`} instance from the {@link AuthClient.transporter}.\n     *\n     * @expiremental\n     */\n    get gaxios() {\n        if (this.transporter instanceof gaxios_1.Gaxios) {\n            return this.transporter;\n        }\n        else if (this.transporter instanceof transporters_1.DefaultTransporter) {\n            return this.transporter.instance;\n        }\n        else if ('instance' in this.transporter &&\n            this.transporter.instance instanceof gaxios_1.Gaxios) {\n            return this.transporter.instance;\n        }\n        return null;\n    }\n    /**\n     * Sets the auth credentials.\n     */\n    setCredentials(credentials) {\n        this.credentials = credentials;\n    }\n    /**\n     * Append additional headers, e.g., x-goog-user-project, shared across the\n     * classes inheriting AuthClient. This method should be used by any method\n     * that overrides getRequestMetadataAsync(), which is a shared helper for\n     * setting request information in both gRPC and HTTP API calls.\n     *\n     * @param headers object to append additional headers to.\n     */\n    addSharedMetadataHeaders(headers) {\n        // quota_project_id, stored in application_default_credentials.json, is set in\n        // the x-goog-user-project header, to indicate an alternate account for\n        // billing and quota:\n        if (!headers['x-goog-user-project'] && // don't override a value the user sets.\n            this.quotaProjectId) {\n            headers['x-goog-user-project'] = this.quotaProjectId;\n        }\n        return headers;\n    }\n    /**\n     * Retry config for Auth-related requests.\n     *\n     * @remarks\n     *\n     * This is not a part of the default {@link AuthClient.transporter transporter/gaxios}\n     * config as some downstream APIs would prefer if customers explicitly enable retries,\n     * such as GCS.\n     */\n    static get RETRY_CONFIG() {\n        return {\n            retry: true,\n            retryConfig: {\n                httpMethodsToRetry: ['GET', 'PUT', 'POST', 'HEAD', 'OPTIONS', 'DELETE'],\n            },\n        };\n    }\n}\nexports.AuthClient = AuthClient;\n", "\"use strict\";\n// Copyright 2014 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LoginTicket = void 0;\nclass LoginTicket {\n    /**\n     * Create a simple class to extract user ID from an ID Token\n     *\n     * @param {string} env Envelope of the jwt\n     * @param {TokenPayload} pay Payload of the jwt\n     * @constructor\n     */\n    constructor(env, pay) {\n        this.envelope = env;\n        this.payload = pay;\n    }\n    getEnvelope() {\n        return this.envelope;\n    }\n    getPayload() {\n        return this.payload;\n    }\n    /**\n     * Create a simple class to extract user ID from an ID Token\n     *\n     * @return The user ID\n     */\n    getUserId() {\n        const payload = this.getPayload();\n        if (payload && payload.sub) {\n            return payload.sub;\n        }\n        return null;\n    }\n    /**\n     * Returns attributes from the login ticket.  This can contain\n     * various information about the user session.\n     *\n     * @return The envelope and payload\n     */\n    getAttributes() {\n        return { envelope: this.getEnvelope(), payload: this.getPayload() };\n    }\n}\nexports.LoginTicket = LoginTicket;\n", "\"use strict\";\n// Copyright 2019 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.OAuth2Client = exports.ClientAuthentication = exports.CertificateFormat = exports.CodeChallengeMethod = void 0;\nconst gaxios_1 = require(\"gaxios\");\nconst querystring = require(\"querystring\");\nconst stream = require(\"stream\");\nconst formatEcdsa = require(\"ecdsa-sig-formatter\");\nconst crypto_1 = require(\"../crypto/crypto\");\nconst authclient_1 = require(\"./authclient\");\nconst loginticket_1 = require(\"./loginticket\");\nvar CodeChallengeMethod;\n(function (CodeChallengeMethod) {\n    CodeChallengeMethod[\"Plain\"] = \"plain\";\n    CodeChallengeMethod[\"S256\"] = \"S256\";\n})(CodeChallengeMethod || (exports.CodeChallengeMethod = CodeChallengeMethod = {}));\nvar CertificateFormat;\n(function (CertificateFormat) {\n    CertificateFormat[\"PEM\"] = \"PEM\";\n    CertificateFormat[\"JWK\"] = \"JWK\";\n})(CertificateFormat || (exports.CertificateFormat = CertificateFormat = {}));\n/**\n * The client authentication type. Supported values are basic, post, and none.\n * https://datatracker.ietf.org/doc/html/rfc7591#section-2\n */\nvar ClientAuthentication;\n(function (ClientAuthentication) {\n    ClientAuthentication[\"ClientSecretPost\"] = \"ClientSecretPost\";\n    ClientAuthentication[\"ClientSecretBasic\"] = \"ClientSecretBasic\";\n    ClientAuthentication[\"None\"] = \"None\";\n})(ClientAuthentication || (exports.ClientAuthentication = ClientAuthentication = {}));\nclass OAuth2Client extends authclient_1.AuthClient {\n    constructor(optionsOrClientId, clientSecret, redirectUri) {\n        const opts = optionsOrClientId && typeof optionsOrClientId === 'object'\n            ? optionsOrClientId\n            : { clientId: optionsOrClientId, clientSecret, redirectUri };\n        super(opts);\n        this.certificateCache = {};\n        this.certificateExpiry = null;\n        this.certificateCacheFormat = CertificateFormat.PEM;\n        this.refreshTokenPromises = new Map();\n        this._clientId = opts.clientId;\n        this._clientSecret = opts.clientSecret;\n        this.redirectUri = opts.redirectUri;\n        this.endpoints = {\n            tokenInfoUrl: 'https://oauth2.googleapis.com/tokeninfo',\n            oauth2AuthBaseUrl: 'https://accounts.google.com/o/oauth2/v2/auth',\n            oauth2TokenUrl: 'https://oauth2.googleapis.com/token',\n            oauth2RevokeUrl: 'https://oauth2.googleapis.com/revoke',\n            oauth2FederatedSignonPemCertsUrl: 'https://www.googleapis.com/oauth2/v1/certs',\n            oauth2FederatedSignonJwkCertsUrl: 'https://www.googleapis.com/oauth2/v3/certs',\n            oauth2IapPublicKeyUrl: 'https://www.gstatic.com/iap/verify/public_key',\n            ...opts.endpoints,\n        };\n        this.clientAuthentication =\n            opts.clientAuthentication || ClientAuthentication.ClientSecretPost;\n        this.issuers = opts.issuers || [\n            'accounts.google.com',\n            'https://accounts.google.com',\n            this.universeDomain,\n        ];\n    }\n    /**\n     * Generates URL for consent page landing.\n     * @param opts Options.\n     * @return URL to consent page.\n     */\n    generateAuthUrl(opts = {}) {\n        if (opts.code_challenge_method && !opts.code_challenge) {\n            throw new Error('If a code_challenge_method is provided, code_challenge must be included.');\n        }\n        opts.response_type = opts.response_type || 'code';\n        opts.client_id = opts.client_id || this._clientId;\n        opts.redirect_uri = opts.redirect_uri || this.redirectUri;\n        // Allow scopes to be passed either as array or a string\n        if (Array.isArray(opts.scope)) {\n            opts.scope = opts.scope.join(' ');\n        }\n        const rootUrl = this.endpoints.oauth2AuthBaseUrl.toString();\n        return (rootUrl +\n            '?' +\n            querystring.stringify(opts));\n    }\n    generateCodeVerifier() {\n        // To make the code compatible with browser SubtleCrypto we need to make\n        // this method async.\n        throw new Error('generateCodeVerifier is removed, please use generateCodeVerifierAsync instead.');\n    }\n    /**\n     * Convenience method to automatically generate a code_verifier, and its\n     * resulting SHA256. If used, this must be paired with a S256\n     * code_challenge_method.\n     *\n     * For a full example see:\n     * https://github.com/googleapis/google-auth-library-nodejs/blob/main/samples/oauth2-codeVerifier.js\n     */\n    async generateCodeVerifierAsync() {\n        // base64 encoding uses 6 bits per character, and we want to generate128\n        // characters. 6*128/8 = 96.\n        const crypto = (0, crypto_1.createCrypto)();\n        const randomString = crypto.randomBytesBase64(96);\n        // The valid characters in the code_verifier are [A-Z]/[a-z]/[0-9]/\n        // \"-\"/\".\"/\"_\"/\"~\". Base64 encoded strings are pretty close, so we're just\n        // swapping out a few chars.\n        const codeVerifier = randomString\n            .replace(/\\+/g, '~')\n            .replace(/=/g, '_')\n            .replace(/\\//g, '-');\n        // Generate the base64 encoded SHA256\n        const unencodedCodeChallenge = await crypto.sha256DigestBase64(codeVerifier);\n        // We need to use base64UrlEncoding instead of standard base64\n        const codeChallenge = unencodedCodeChallenge\n            .split('=')[0]\n            .replace(/\\+/g, '-')\n            .replace(/\\//g, '_');\n        return { codeVerifier, codeChallenge };\n    }\n    getToken(codeOrOptions, callback) {\n        const options = typeof codeOrOptions === 'string' ? { code: codeOrOptions } : codeOrOptions;\n        if (callback) {\n            this.getTokenAsync(options).then(r => callback(null, r.tokens, r.res), e => callback(e, null, e.response));\n        }\n        else {\n            return this.getTokenAsync(options);\n        }\n    }\n    async getTokenAsync(options) {\n        const url = this.endpoints.oauth2TokenUrl.toString();\n        const headers = {\n            'Content-Type': 'application/x-www-form-urlencoded',\n        };\n        const values = {\n            client_id: options.client_id || this._clientId,\n            code_verifier: options.codeVerifier,\n            code: options.code,\n            grant_type: 'authorization_code',\n            redirect_uri: options.redirect_uri || this.redirectUri,\n        };\n        if (this.clientAuthentication === ClientAuthentication.ClientSecretBasic) {\n            const basic = Buffer.from(`${this._clientId}:${this._clientSecret}`);\n            headers['Authorization'] = `Basic ${basic.toString('base64')}`;\n        }\n        if (this.clientAuthentication === ClientAuthentication.ClientSecretPost) {\n            values.client_secret = this._clientSecret;\n        }\n        const res = await this.transporter.request({\n            ...OAuth2Client.RETRY_CONFIG,\n            method: 'POST',\n            url,\n            data: querystring.stringify(values),\n            headers,\n        });\n        const tokens = res.data;\n        if (res.data && res.data.expires_in) {\n            tokens.expiry_date = new Date().getTime() + res.data.expires_in * 1000;\n            delete tokens.expires_in;\n        }\n        this.emit('tokens', tokens);\n        return { tokens, res };\n    }\n    /**\n     * Refreshes the access token.\n     * @param refresh_token Existing refresh token.\n     * @private\n     */\n    async refreshToken(refreshToken) {\n        if (!refreshToken) {\n            return this.refreshTokenNoCache(refreshToken);\n        }\n        // If a request to refresh using the same token has started,\n        // return the same promise.\n        if (this.refreshTokenPromises.has(refreshToken)) {\n            return this.refreshTokenPromises.get(refreshToken);\n        }\n        const p = this.refreshTokenNoCache(refreshToken).then(r => {\n            this.refreshTokenPromises.delete(refreshToken);\n            return r;\n        }, e => {\n            this.refreshTokenPromises.delete(refreshToken);\n            throw e;\n        });\n        this.refreshTokenPromises.set(refreshToken, p);\n        return p;\n    }\n    async refreshTokenNoCache(refreshToken) {\n        var _a;\n        if (!refreshToken) {\n            throw new Error('No refresh token is set.');\n        }\n        const url = this.endpoints.oauth2TokenUrl.toString();\n        const data = {\n            refresh_token: refreshToken,\n            client_id: this._clientId,\n            client_secret: this._clientSecret,\n            grant_type: 'refresh_token',\n        };\n        let res;\n        try {\n            // request for new token\n            res = await this.transporter.request({\n                ...OAuth2Client.RETRY_CONFIG,\n                method: 'POST',\n                url,\n                data: querystring.stringify(data),\n                headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n            });\n        }\n        catch (e) {\n            if (e instanceof gaxios_1.GaxiosError &&\n                e.message === 'invalid_grant' &&\n                ((_a = e.response) === null || _a === void 0 ? void 0 : _a.data) &&\n                /ReAuth/i.test(e.response.data.error_description)) {\n                e.message = JSON.stringify(e.response.data);\n            }\n            throw e;\n        }\n        const tokens = res.data;\n        // TODO: de-duplicate this code from a few spots\n        if (res.data && res.data.expires_in) {\n            tokens.expiry_date = new Date().getTime() + res.data.expires_in * 1000;\n            delete tokens.expires_in;\n        }\n        this.emit('tokens', tokens);\n        return { tokens, res };\n    }\n    refreshAccessToken(callback) {\n        if (callback) {\n            this.refreshAccessTokenAsync().then(r => callback(null, r.credentials, r.res), callback);\n        }\n        else {\n            return this.refreshAccessTokenAsync();\n        }\n    }\n    async refreshAccessTokenAsync() {\n        const r = await this.refreshToken(this.credentials.refresh_token);\n        const tokens = r.tokens;\n        tokens.refresh_token = this.credentials.refresh_token;\n        this.credentials = tokens;\n        return { credentials: this.credentials, res: r.res };\n    }\n    getAccessToken(callback) {\n        if (callback) {\n            this.getAccessTokenAsync().then(r => callback(null, r.token, r.res), callback);\n        }\n        else {\n            return this.getAccessTokenAsync();\n        }\n    }\n    async getAccessTokenAsync() {\n        const shouldRefresh = !this.credentials.access_token || this.isTokenExpiring();\n        if (shouldRefresh) {\n            if (!this.credentials.refresh_token) {\n                if (this.refreshHandler) {\n                    const refreshedAccessToken = await this.processAndValidateRefreshHandler();\n                    if (refreshedAccessToken === null || refreshedAccessToken === void 0 ? void 0 : refreshedAccessToken.access_token) {\n                        this.setCredentials(refreshedAccessToken);\n                        return { token: this.credentials.access_token };\n                    }\n                }\n                else {\n                    throw new Error('No refresh token or refresh handler callback is set.');\n                }\n            }\n            const r = await this.refreshAccessTokenAsync();\n            if (!r.credentials || (r.credentials && !r.credentials.access_token)) {\n                throw new Error('Could not refresh access token.');\n            }\n            return { token: r.credentials.access_token, res: r.res };\n        }\n        else {\n            return { token: this.credentials.access_token };\n        }\n    }\n    /**\n     * The main authentication interface.  It takes an optional url which when\n     * present is the endpoint being accessed, and returns a Promise which\n     * resolves with authorization header fields.\n     *\n     * In OAuth2Client, the result has the form:\n     * { Authorization: 'Bearer <access_token_value>' }\n     * @param url The optional url being authorized\n     */\n    async getRequestHeaders(url) {\n        const headers = (await this.getRequestMetadataAsync(url)).headers;\n        return headers;\n    }\n    async getRequestMetadataAsync(\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    url) {\n        const thisCreds = this.credentials;\n        if (!thisCreds.access_token &&\n            !thisCreds.refresh_token &&\n            !this.apiKey &&\n            !this.refreshHandler) {\n            throw new Error('No access, refresh token, API key or refresh handler callback is set.');\n        }\n        if (thisCreds.access_token && !this.isTokenExpiring()) {\n            thisCreds.token_type = thisCreds.token_type || 'Bearer';\n            const headers = {\n                Authorization: thisCreds.token_type + ' ' + thisCreds.access_token,\n            };\n            return { headers: this.addSharedMetadataHeaders(headers) };\n        }\n        // If refreshHandler exists, call processAndValidateRefreshHandler().\n        if (this.refreshHandler) {\n            const refreshedAccessToken = await this.processAndValidateRefreshHandler();\n            if (refreshedAccessToken === null || refreshedAccessToken === void 0 ? void 0 : refreshedAccessToken.access_token) {\n                this.setCredentials(refreshedAccessToken);\n                const headers = {\n                    Authorization: 'Bearer ' + this.credentials.access_token,\n                };\n                return { headers: this.addSharedMetadataHeaders(headers) };\n            }\n        }\n        if (this.apiKey) {\n            return { headers: { 'X-Goog-Api-Key': this.apiKey } };\n        }\n        let r = null;\n        let tokens = null;\n        try {\n            r = await this.refreshToken(thisCreds.refresh_token);\n            tokens = r.tokens;\n        }\n        catch (err) {\n            const e = err;\n            if (e.response &&\n                (e.response.status === 403 || e.response.status === 404)) {\n                e.message = `Could not refresh access token: ${e.message}`;\n            }\n            throw e;\n        }\n        const credentials = this.credentials;\n        credentials.token_type = credentials.token_type || 'Bearer';\n        tokens.refresh_token = credentials.refresh_token;\n        this.credentials = tokens;\n        const headers = {\n            Authorization: credentials.token_type + ' ' + tokens.access_token,\n        };\n        return { headers: this.addSharedMetadataHeaders(headers), res: r.res };\n    }\n    /**\n     * Generates an URL to revoke the given token.\n     * @param token The existing token to be revoked.\n     *\n     * @deprecated use instance method {@link OAuth2Client.getRevokeTokenURL}\n     */\n    static getRevokeTokenUrl(token) {\n        return new OAuth2Client().getRevokeTokenURL(token).toString();\n    }\n    /**\n     * Generates a URL to revoke the given token.\n     *\n     * @param token The existing token to be revoked.\n     */\n    getRevokeTokenURL(token) {\n        const url = new URL(this.endpoints.oauth2RevokeUrl);\n        url.searchParams.append('token', token);\n        return url;\n    }\n    revokeToken(token, callback) {\n        const opts = {\n            ...OAuth2Client.RETRY_CONFIG,\n            url: this.getRevokeTokenURL(token).toString(),\n            method: 'POST',\n        };\n        if (callback) {\n            this.transporter\n                .request(opts)\n                .then(r => callback(null, r), callback);\n        }\n        else {\n            return this.transporter.request(opts);\n        }\n    }\n    revokeCredentials(callback) {\n        if (callback) {\n            this.revokeCredentialsAsync().then(res => callback(null, res), callback);\n        }\n        else {\n            return this.revokeCredentialsAsync();\n        }\n    }\n    async revokeCredentialsAsync() {\n        const token = this.credentials.access_token;\n        this.credentials = {};\n        if (token) {\n            return this.revokeToken(token);\n        }\n        else {\n            throw new Error('No access token to revoke.');\n        }\n    }\n    request(opts, callback) {\n        if (callback) {\n            this.requestAsync(opts).then(r => callback(null, r), e => {\n                return callback(e, e.response);\n            });\n        }\n        else {\n            return this.requestAsync(opts);\n        }\n    }\n    async requestAsync(opts, reAuthRetried = false) {\n        let r2;\n        try {\n            const r = await this.getRequestMetadataAsync(opts.url);\n            opts.headers = opts.headers || {};\n            if (r.headers && r.headers['x-goog-user-project']) {\n                opts.headers['x-goog-user-project'] = r.headers['x-goog-user-project'];\n            }\n            if (r.headers && r.headers.Authorization) {\n                opts.headers.Authorization = r.headers.Authorization;\n            }\n            if (this.apiKey) {\n                opts.headers['X-Goog-Api-Key'] = this.apiKey;\n            }\n            r2 = await this.transporter.request(opts);\n        }\n        catch (e) {\n            const res = e.response;\n            if (res) {\n                const statusCode = res.status;\n                // Retry the request for metadata if the following criteria are true:\n                // - We haven't already retried.  It only makes sense to retry once.\n                // - The response was a 401 or a 403\n                // - The request didn't send a readableStream\n                // - An access_token and refresh_token were available, but either no\n                //   expiry_date was available or the forceRefreshOnFailure flag is set.\n                //   The absent expiry_date case can happen when developers stash the\n                //   access_token and refresh_token for later use, but the access_token\n                //   fails on the first try because it's expired. Some developers may\n                //   choose to enable forceRefreshOnFailure to mitigate time-related\n                //   errors.\n                // Or the following criteria are true:\n                // - We haven't already retried.  It only makes sense to retry once.\n                // - The response was a 401 or a 403\n                // - The request didn't send a readableStream\n                // - No refresh_token was available\n                // - An access_token and a refreshHandler callback were available, but\n                //   either no expiry_date was available or the forceRefreshOnFailure\n                //   flag is set. The access_token fails on the first try because it's\n                //   expired. Some developers may choose to enable forceRefreshOnFailure\n                //   to mitigate time-related errors.\n                const mayRequireRefresh = this.credentials &&\n                    this.credentials.access_token &&\n                    this.credentials.refresh_token &&\n                    (!this.credentials.expiry_date || this.forceRefreshOnFailure);\n                const mayRequireRefreshWithNoRefreshToken = this.credentials &&\n                    this.credentials.access_token &&\n                    !this.credentials.refresh_token &&\n                    (!this.credentials.expiry_date || this.forceRefreshOnFailure) &&\n                    this.refreshHandler;\n                const isReadableStream = res.config.data instanceof stream.Readable;\n                const isAuthErr = statusCode === 401 || statusCode === 403;\n                if (!reAuthRetried &&\n                    isAuthErr &&\n                    !isReadableStream &&\n                    mayRequireRefresh) {\n                    await this.refreshAccessTokenAsync();\n                    return this.requestAsync(opts, true);\n                }\n                else if (!reAuthRetried &&\n                    isAuthErr &&\n                    !isReadableStream &&\n                    mayRequireRefreshWithNoRefreshToken) {\n                    const refreshedAccessToken = await this.processAndValidateRefreshHandler();\n                    if (refreshedAccessToken === null || refreshedAccessToken === void 0 ? void 0 : refreshedAccessToken.access_token) {\n                        this.setCredentials(refreshedAccessToken);\n                    }\n                    return this.requestAsync(opts, true);\n                }\n            }\n            throw e;\n        }\n        return r2;\n    }\n    verifyIdToken(options, callback) {\n        // This function used to accept two arguments instead of an options object.\n        // Check the types to help users upgrade with less pain.\n        // This check can be removed after a 2.0 release.\n        if (callback && typeof callback !== 'function') {\n            throw new Error('This method accepts an options object as the first parameter, which includes the idToken, audience, and maxExpiry.');\n        }\n        if (callback) {\n            this.verifyIdTokenAsync(options).then(r => callback(null, r), callback);\n        }\n        else {\n            return this.verifyIdTokenAsync(options);\n        }\n    }\n    async verifyIdTokenAsync(options) {\n        if (!options.idToken) {\n            throw new Error('The verifyIdToken method requires an ID Token');\n        }\n        const response = await this.getFederatedSignonCertsAsync();\n        const login = await this.verifySignedJwtWithCertsAsync(options.idToken, response.certs, options.audience, this.issuers, options.maxExpiry);\n        return login;\n    }\n    /**\n     * Obtains information about the provisioned access token.  Especially useful\n     * if you want to check the scopes that were provisioned to a given token.\n     *\n     * @param accessToken Required.  The Access Token for which you want to get\n     * user info.\n     */\n    async getTokenInfo(accessToken) {\n        const { data } = await this.transporter.request({\n            ...OAuth2Client.RETRY_CONFIG,\n            method: 'POST',\n            headers: {\n                'Content-Type': 'application/x-www-form-urlencoded',\n                Authorization: `Bearer ${accessToken}`,\n            },\n            url: this.endpoints.tokenInfoUrl.toString(),\n        });\n        const info = Object.assign({\n            expiry_date: new Date().getTime() + data.expires_in * 1000,\n            scopes: data.scope.split(' '),\n        }, data);\n        delete info.expires_in;\n        delete info.scope;\n        return info;\n    }\n    getFederatedSignonCerts(callback) {\n        if (callback) {\n            this.getFederatedSignonCertsAsync().then(r => callback(null, r.certs, r.res), callback);\n        }\n        else {\n            return this.getFederatedSignonCertsAsync();\n        }\n    }\n    async getFederatedSignonCertsAsync() {\n        const nowTime = new Date().getTime();\n        const format = (0, crypto_1.hasBrowserCrypto)()\n            ? CertificateFormat.JWK\n            : CertificateFormat.PEM;\n        if (this.certificateExpiry &&\n            nowTime < this.certificateExpiry.getTime() &&\n            this.certificateCacheFormat === format) {\n            return { certs: this.certificateCache, format };\n        }\n        let res;\n        let url;\n        switch (format) {\n            case CertificateFormat.PEM:\n                url = this.endpoints.oauth2FederatedSignonPemCertsUrl.toString();\n                break;\n            case CertificateFormat.JWK:\n                url = this.endpoints.oauth2FederatedSignonJwkCertsUrl.toString();\n                break;\n            default:\n                throw new Error(`Unsupported certificate format ${format}`);\n        }\n        try {\n            res = await this.transporter.request({\n                ...OAuth2Client.RETRY_CONFIG,\n                url,\n            });\n        }\n        catch (e) {\n            if (e instanceof Error) {\n                e.message = `Failed to retrieve verification certificates: ${e.message}`;\n            }\n            throw e;\n        }\n        const cacheControl = res ? res.headers['cache-control'] : undefined;\n        let cacheAge = -1;\n        if (cacheControl) {\n            const pattern = new RegExp('max-age=([0-9]*)');\n            const regexResult = pattern.exec(cacheControl);\n            if (regexResult && regexResult.length === 2) {\n                // Cache results with max-age (in seconds)\n                cacheAge = Number(regexResult[1]) * 1000; // milliseconds\n            }\n        }\n        let certificates = {};\n        switch (format) {\n            case CertificateFormat.PEM:\n                certificates = res.data;\n                break;\n            case CertificateFormat.JWK:\n                for (const key of res.data.keys) {\n                    certificates[key.kid] = key;\n                }\n                break;\n            default:\n                throw new Error(`Unsupported certificate format ${format}`);\n        }\n        const now = new Date();\n        this.certificateExpiry =\n            cacheAge === -1 ? null : new Date(now.getTime() + cacheAge);\n        this.certificateCache = certificates;\n        this.certificateCacheFormat = format;\n        return { certs: certificates, format, res };\n    }\n    getIapPublicKeys(callback) {\n        if (callback) {\n            this.getIapPublicKeysAsync().then(r => callback(null, r.pubkeys, r.res), callback);\n        }\n        else {\n            return this.getIapPublicKeysAsync();\n        }\n    }\n    async getIapPublicKeysAsync() {\n        let res;\n        const url = this.endpoints.oauth2IapPublicKeyUrl.toString();\n        try {\n            res = await this.transporter.request({\n                ...OAuth2Client.RETRY_CONFIG,\n                url,\n            });\n        }\n        catch (e) {\n            if (e instanceof Error) {\n                e.message = `Failed to retrieve verification certificates: ${e.message}`;\n            }\n            throw e;\n        }\n        return { pubkeys: res.data, res };\n    }\n    verifySignedJwtWithCerts() {\n        // To make the code compatible with browser SubtleCrypto we need to make\n        // this method async.\n        throw new Error('verifySignedJwtWithCerts is removed, please use verifySignedJwtWithCertsAsync instead.');\n    }\n    /**\n     * Verify the id token is signed with the correct certificate\n     * and is from the correct audience.\n     * @param jwt The jwt to verify (The ID Token in this case).\n     * @param certs The array of certs to test the jwt against.\n     * @param requiredAudience The audience to test the jwt against.\n     * @param issuers The allowed issuers of the jwt (Optional).\n     * @param maxExpiry The max expiry the certificate can be (Optional).\n     * @return Returns a promise resolving to LoginTicket on verification.\n     */\n    async verifySignedJwtWithCertsAsync(jwt, certs, requiredAudience, issuers, maxExpiry) {\n        const crypto = (0, crypto_1.createCrypto)();\n        if (!maxExpiry) {\n            maxExpiry = OAuth2Client.DEFAULT_MAX_TOKEN_LIFETIME_SECS_;\n        }\n        const segments = jwt.split('.');\n        if (segments.length !== 3) {\n            throw new Error('Wrong number of segments in token: ' + jwt);\n        }\n        const signed = segments[0] + '.' + segments[1];\n        let signature = segments[2];\n        let envelope;\n        let payload;\n        try {\n            envelope = JSON.parse(crypto.decodeBase64StringUtf8(segments[0]));\n        }\n        catch (err) {\n            if (err instanceof Error) {\n                err.message = `Can't parse token envelope: ${segments[0]}': ${err.message}`;\n            }\n            throw err;\n        }\n        if (!envelope) {\n            throw new Error(\"Can't parse token envelope: \" + segments[0]);\n        }\n        try {\n            payload = JSON.parse(crypto.decodeBase64StringUtf8(segments[1]));\n        }\n        catch (err) {\n            if (err instanceof Error) {\n                err.message = `Can't parse token payload '${segments[0]}`;\n            }\n            throw err;\n        }\n        if (!payload) {\n            throw new Error(\"Can't parse token payload: \" + segments[1]);\n        }\n        if (!Object.prototype.hasOwnProperty.call(certs, envelope.kid)) {\n            // If this is not present, then there's no reason to attempt verification\n            throw new Error('No pem found for envelope: ' + JSON.stringify(envelope));\n        }\n        const cert = certs[envelope.kid];\n        if (envelope.alg === 'ES256') {\n            signature = formatEcdsa.joseToDer(signature, 'ES256').toString('base64');\n        }\n        const verified = await crypto.verify(cert, signed, signature);\n        if (!verified) {\n            throw new Error('Invalid token signature: ' + jwt);\n        }\n        if (!payload.iat) {\n            throw new Error('No issue time in token: ' + JSON.stringify(payload));\n        }\n        if (!payload.exp) {\n            throw new Error('No expiration time in token: ' + JSON.stringify(payload));\n        }\n        const iat = Number(payload.iat);\n        if (isNaN(iat))\n            throw new Error('iat field using invalid format');\n        const exp = Number(payload.exp);\n        if (isNaN(exp))\n            throw new Error('exp field using invalid format');\n        const now = new Date().getTime() / 1000;\n        if (exp >= now + maxExpiry) {\n            throw new Error('Expiration time too far in future: ' + JSON.stringify(payload));\n        }\n        const earliest = iat - OAuth2Client.CLOCK_SKEW_SECS_;\n        const latest = exp + OAuth2Client.CLOCK_SKEW_SECS_;\n        if (now < earliest) {\n            throw new Error('Token used too early, ' +\n                now +\n                ' < ' +\n                earliest +\n                ': ' +\n                JSON.stringify(payload));\n        }\n        if (now > latest) {\n            throw new Error('Token used too late, ' +\n                now +\n                ' > ' +\n                latest +\n                ': ' +\n                JSON.stringify(payload));\n        }\n        if (issuers && issuers.indexOf(payload.iss) < 0) {\n            throw new Error('Invalid issuer, expected one of [' +\n                issuers +\n                '], but got ' +\n                payload.iss);\n        }\n        // Check the audience matches if we have one\n        if (typeof requiredAudience !== 'undefined' && requiredAudience !== null) {\n            const aud = payload.aud;\n            let audVerified = false;\n            // If the requiredAudience is an array, check if it contains token\n            // audience\n            if (requiredAudience.constructor === Array) {\n                audVerified = requiredAudience.indexOf(aud) > -1;\n            }\n            else {\n                audVerified = aud === requiredAudience;\n            }\n            if (!audVerified) {\n                throw new Error('Wrong recipient, payload audience != requiredAudience');\n            }\n        }\n        return new loginticket_1.LoginTicket(envelope, payload);\n    }\n    /**\n     * Returns a promise that resolves with AccessTokenResponse type if\n     * refreshHandler is defined.\n     * If not, nothing is returned.\n     */\n    async processAndValidateRefreshHandler() {\n        if (this.refreshHandler) {\n            const accessTokenResponse = await this.refreshHandler();\n            if (!accessTokenResponse.access_token) {\n                throw new Error('No access token is returned by the refreshHandler callback.');\n            }\n            return accessTokenResponse;\n        }\n        return;\n    }\n    /**\n     * Returns true if a token is expired or will expire within\n     * eagerRefreshThresholdMillismilliseconds.\n     * If there is no expiry time, assumes the token is not expired or expiring.\n     */\n    isTokenExpiring() {\n        const expiryDate = this.credentials.expiry_date;\n        return expiryDate\n            ? expiryDate <= new Date().getTime() + this.eagerRefreshThresholdMillis\n            : false;\n    }\n}\nexports.OAuth2Client = OAuth2Client;\n/**\n * @deprecated use instance's {@link OAuth2Client.endpoints}\n */\nOAuth2Client.GOOGLE_TOKEN_INFO_URL = 'https://oauth2.googleapis.com/tokeninfo';\n/**\n * Clock skew - five minutes in seconds\n */\nOAuth2Client.CLOCK_SKEW_SECS_ = 300;\n/**\n * The default max Token Lifetime is one day in seconds\n */\nOAuth2Client.DEFAULT_MAX_TOKEN_LIFETIME_SECS_ = 86400;\n", "\"use strict\";\n// Copyright 2013 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Compute = void 0;\nconst gaxios_1 = require(\"gaxios\");\nconst gcpMetadata = require(\"gcp-metadata\");\nconst oauth2client_1 = require(\"./oauth2client\");\nclass Compute extends oauth2client_1.OAuth2Client {\n    /**\n     * Google Compute Engine service account credentials.\n     *\n     * Retrieve access token from the metadata server.\n     * See: https://cloud.google.com/compute/docs/access/authenticate-workloads#applications\n     */\n    constructor(options = {}) {\n        super(options);\n        // Start with an expired refresh token, which will automatically be\n        // refreshed before the first API call is made.\n        this.credentials = { expiry_date: 1, refresh_token: 'compute-placeholder' };\n        this.serviceAccountEmail = options.serviceAccountEmail || 'default';\n        this.scopes = Array.isArray(options.scopes)\n            ? options.scopes\n            : options.scopes\n                ? [options.scopes]\n                : [];\n    }\n    /**\n     * Refreshes the access token.\n     * @param refreshToken Unused parameter\n     */\n    async refreshTokenNoCache(\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    refreshToken) {\n        const tokenPath = `service-accounts/${this.serviceAccountEmail}/token`;\n        let data;\n        try {\n            const instanceOptions = {\n                property: tokenPath,\n            };\n            if (this.scopes.length > 0) {\n                instanceOptions.params = {\n                    scopes: this.scopes.join(','),\n                };\n            }\n            data = await gcpMetadata.instance(instanceOptions);\n        }\n        catch (e) {\n            if (e instanceof gaxios_1.GaxiosError) {\n                e.message = `Could not refresh access token: ${e.message}`;\n                this.wrapError(e);\n            }\n            throw e;\n        }\n        const tokens = data;\n        if (data && data.expires_in) {\n            tokens.expiry_date = new Date().getTime() + data.expires_in * 1000;\n            delete tokens.expires_in;\n        }\n        this.emit('tokens', tokens);\n        return { tokens, res: null };\n    }\n    /**\n     * Fetches an ID token.\n     * @param targetAudience the audience for the fetched ID token.\n     */\n    async fetchIdToken(targetAudience) {\n        const idTokenPath = `service-accounts/${this.serviceAccountEmail}/identity` +\n            `?format=full&audience=${targetAudience}`;\n        let idToken;\n        try {\n            const instanceOptions = {\n                property: idTokenPath,\n            };\n            idToken = await gcpMetadata.instance(instanceOptions);\n        }\n        catch (e) {\n            if (e instanceof Error) {\n                e.message = `Could not fetch ID token: ${e.message}`;\n            }\n            throw e;\n        }\n        return idToken;\n    }\n    wrapError(e) {\n        const res = e.response;\n        if (res && res.status) {\n            e.status = res.status;\n            if (res.status === 403) {\n                e.message =\n                    'A Forbidden error was returned while attempting to retrieve an access ' +\n                        'token for the Compute Engine built-in service account. This may be because the Compute ' +\n                        'Engine instance does not have the correct permission scopes specified: ' +\n                        e.message;\n            }\n            else if (res.status === 404) {\n                e.message =\n                    'A Not Found error was returned while attempting to retrieve an access' +\n                        'token for the Compute Engine built-in service account. This may be because the Compute ' +\n                        'Engine instance does not have any permission scopes specified: ' +\n                        e.message;\n            }\n        }\n    }\n}\nexports.Compute = Compute;\n", "\"use strict\";\n// Copyright 2020 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.IdTokenClient = void 0;\nconst oauth2client_1 = require(\"./oauth2client\");\nclass IdTokenClient extends oauth2client_1.OAuth2Client {\n    /**\n     * Google ID Token client\n     *\n     * Retrieve ID token from the metadata server.\n     * See: https://cloud.google.com/docs/authentication/get-id-token#metadata-server\n     */\n    constructor(options) {\n        super(options);\n        this.targetAudience = options.targetAudience;\n        this.idTokenProvider = options.idTokenProvider;\n    }\n    async getRequestMetadataAsync(\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    url) {\n        if (!this.credentials.id_token ||\n            !this.credentials.expiry_date ||\n            this.isTokenExpiring()) {\n            const idToken = await this.idTokenProvider.fetchIdToken(this.targetAudience);\n            this.credentials = {\n                id_token: idToken,\n                expiry_date: this.getIdTokenExpiryDate(idToken),\n            };\n        }\n        const headers = {\n            Authorization: 'Bearer ' + this.credentials.id_token,\n        };\n        return { headers };\n    }\n    getIdTokenExpiryDate(idToken) {\n        const payloadB64 = idToken.split('.')[1];\n        if (payloadB64) {\n            const payload = JSON.parse(Buffer.from(payloadB64, 'base64').toString('ascii'));\n            return payload.exp * 1000;\n        }\n    }\n}\nexports.IdTokenClient = IdTokenClient;\n", "\"use strict\";\n// Copyright 2018 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GCPEnv = void 0;\nexports.clear = clear;\nexports.getEnv = getEnv;\nconst gcpMetadata = require(\"gcp-metadata\");\nvar GCPEnv;\n(function (GCPEnv) {\n    GCPEnv[\"APP_ENGINE\"] = \"APP_ENGINE\";\n    GCPEnv[\"KUBERNETES_ENGINE\"] = \"KUBERNETES_ENGINE\";\n    GCPEnv[\"CLOUD_FUNCTIONS\"] = \"CLOUD_FUNCTIONS\";\n    GCPEnv[\"COMPUTE_ENGINE\"] = \"COMPUTE_ENGINE\";\n    GCPEnv[\"CLOUD_RUN\"] = \"CLOUD_RUN\";\n    GCPEnv[\"NONE\"] = \"NONE\";\n})(GCPEnv || (exports.GCPEnv = GCPEnv = {}));\nlet envPromise;\nfunction clear() {\n    envPromise = undefined;\n}\nasync function getEnv() {\n    if (envPromise) {\n        return envPromise;\n    }\n    envPromise = getEnvMemoized();\n    return envPromise;\n}\nasync function getEnvMemoized() {\n    let env = GCPEnv.NONE;\n    if (isAppEngine()) {\n        env = GCPEnv.APP_ENGINE;\n    }\n    else if (isCloudFunction()) {\n        env = GCPEnv.CLOUD_FUNCTIONS;\n    }\n    else if (await isComputeEngine()) {\n        if (await isKubernetesEngine()) {\n            env = GCPEnv.KUBERNETES_ENGINE;\n        }\n        else if (isCloudRun()) {\n            env = GCPEnv.CLOUD_RUN;\n        }\n        else {\n            env = GCPEnv.COMPUTE_ENGINE;\n        }\n    }\n    else {\n        env = GCPEnv.NONE;\n    }\n    return env;\n}\nfunction isAppEngine() {\n    return !!(process.env.GAE_SERVICE || process.env.GAE_MODULE_NAME);\n}\nfunction isCloudFunction() {\n    return !!(process.env.FUNCTION_NAME || process.env.FUNCTION_TARGET);\n}\n/**\n * This check only verifies that the environment is running knative.\n * This must be run *after* checking for Kubernetes, otherwise it will\n * return a false positive.\n */\nfunction isCloudRun() {\n    return !!process.env.K_CONFIGURATION;\n}\nasync function isKubernetesEngine() {\n    try {\n        await gcpMetadata.instance('attributes/cluster-name');\n        return true;\n    }\n    catch (e) {\n        return false;\n    }\n}\nasync function isComputeEngine() {\n    return gcpMetadata.isAvailable();\n}\n", "/*global module, process*/\nvar Buffer = require('safe-buffer').Buffer;\nvar Stream = require('stream');\nvar util = require('util');\n\nfunction DataStream(data) {\n  this.buffer = null;\n  this.writable = true;\n  this.readable = true;\n\n  // No input\n  if (!data) {\n    this.buffer = Buffer.alloc(0);\n    return this;\n  }\n\n  // Stream\n  if (typeof data.pipe === 'function') {\n    this.buffer = Buffer.alloc(0);\n    data.pipe(this);\n    return this;\n  }\n\n  // Buffer or String\n  // or Object (assumedly a passworded key)\n  if (data.length || typeof data === 'object') {\n    this.buffer = data;\n    this.writable = false;\n    process.nextTick(function () {\n      this.emit('end', data);\n      this.readable = false;\n      this.emit('close');\n    }.bind(this));\n    return this;\n  }\n\n  throw new TypeError('Unexpected data type ('+ typeof data + ')');\n}\nutil.inherits(DataStream, Stream);\n\nDataStream.prototype.write = function write(data) {\n  this.buffer = Buffer.concat([this.buffer, Buffer.from(data)]);\n  this.emit('data', data);\n};\n\nDataStream.prototype.end = function end(data) {\n  if (data)\n    this.write(data);\n  this.emit('end', data);\n  this.emit('close');\n  this.writable = false;\n  this.readable = false;\n};\n\nmodule.exports = DataStream;\n", "/*jshint node:true */\n'use strict';\nvar Buffer = require('buffer').Buffer; // browserify\nvar SlowBuffer = require('buffer').SlowBuffer;\n\nmodule.exports = bufferEq;\n\nfunction bufferEq(a, b) {\n\n  // shortcutting on type is necessary for correctness\n  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n    return false;\n  }\n\n  // buffer sizes should be well-known information, so despite this\n  // shortcutting, it doesn't leak any information about the *contents* of the\n  // buffers.\n  if (a.length !== b.length) {\n    return false;\n  }\n\n  var c = 0;\n  for (var i = 0; i < a.length; i++) {\n    /*jshint bitwise:false */\n    c |= a[i] ^ b[i]; // XOR\n  }\n  return c === 0;\n}\n\nbufferEq.install = function() {\n  Buffer.prototype.equal = SlowBuffer.prototype.equal = function equal(that) {\n    return bufferEq(this, that);\n  };\n};\n\nvar origBufEqual = Buffer.prototype.equal;\nvar origSlowBufEqual = SlowBuffer.prototype.equal;\nbufferEq.restore = function() {\n  Buffer.prototype.equal = origBufEqual;\n  SlowBuffer.prototype.equal = origSlowBufEqual;\n};\n", "var Buffer = require('safe-buffer').Buffer;\nvar crypto = require('crypto');\nvar formatEcdsa = require('ecdsa-sig-formatter');\nvar util = require('util');\n\nvar MSG_INVALID_ALGORITHM = '\"%s\" is not a valid algorithm.\\n  Supported algorithms are:\\n  \"HS256\", \"HS384\", \"HS512\", \"RS256\", \"RS384\", \"RS512\", \"PS256\", \"PS384\", \"PS512\", \"ES256\", \"ES384\", \"ES512\" and \"none\".'\nvar MSG_INVALID_SECRET = 'secret must be a string or buffer';\nvar MSG_INVALID_VERIFIER_KEY = 'key must be a string or a buffer';\nvar MSG_INVALID_SIGNER_KEY = 'key must be a string, a buffer or an object';\n\nvar supportsKeyObjects = typeof crypto.createPublicKey === 'function';\nif (supportsKeyObjects) {\n  MSG_INVALID_VERIFIER_KEY += ' or a KeyObject';\n  MSG_INVALID_SECRET += 'or a KeyObject';\n}\n\nfunction checkIsPublicKey(key) {\n  if (Buffer.isBuffer(key)) {\n    return;\n  }\n\n  if (typeof key === 'string') {\n    return;\n  }\n\n  if (!supportsKeyObjects) {\n    throw typeError(MSG_INVALID_VERIFIER_KEY);\n  }\n\n  if (typeof key !== 'object') {\n    throw typeError(MSG_INVALID_VERIFIER_KEY);\n  }\n\n  if (typeof key.type !== 'string') {\n    throw typeError(MSG_INVALID_VERIFIER_KEY);\n  }\n\n  if (typeof key.asymmetricKeyType !== 'string') {\n    throw typeError(MSG_INVALID_VERIFIER_KEY);\n  }\n\n  if (typeof key.export !== 'function') {\n    throw typeError(MSG_INVALID_VERIFIER_KEY);\n  }\n};\n\nfunction checkIsPrivateKey(key) {\n  if (Buffer.isBuffer(key)) {\n    return;\n  }\n\n  if (typeof key === 'string') {\n    return;\n  }\n\n  if (typeof key === 'object') {\n    return;\n  }\n\n  throw typeError(MSG_INVALID_SIGNER_KEY);\n};\n\nfunction checkIsSecretKey(key) {\n  if (Buffer.isBuffer(key)) {\n    return;\n  }\n\n  if (typeof key === 'string') {\n    return key;\n  }\n\n  if (!supportsKeyObjects) {\n    throw typeError(MSG_INVALID_SECRET);\n  }\n\n  if (typeof key !== 'object') {\n    throw typeError(MSG_INVALID_SECRET);\n  }\n\n  if (key.type !== 'secret') {\n    throw typeError(MSG_INVALID_SECRET);\n  }\n\n  if (typeof key.export !== 'function') {\n    throw typeError(MSG_INVALID_SECRET);\n  }\n}\n\nfunction fromBase64(base64) {\n  return base64\n    .replace(/=/g, '')\n    .replace(/\\+/g, '-')\n    .replace(/\\//g, '_');\n}\n\nfunction toBase64(base64url) {\n  base64url = base64url.toString();\n\n  var padding = 4 - base64url.length % 4;\n  if (padding !== 4) {\n    for (var i = 0; i < padding; ++i) {\n      base64url += '=';\n    }\n  }\n\n  return base64url\n    .replace(/\\-/g, '+')\n    .replace(/_/g, '/');\n}\n\nfunction typeError(template) {\n  var args = [].slice.call(arguments, 1);\n  var errMsg = util.format.bind(util, template).apply(null, args);\n  return new TypeError(errMsg);\n}\n\nfunction bufferOrString(obj) {\n  return Buffer.isBuffer(obj) || typeof obj === 'string';\n}\n\nfunction normalizeInput(thing) {\n  if (!bufferOrString(thing))\n    thing = JSON.stringify(thing);\n  return thing;\n}\n\nfunction createHmacSigner(bits) {\n  return function sign(thing, secret) {\n    checkIsSecretKey(secret);\n    thing = normalizeInput(thing);\n    var hmac = crypto.createHmac('sha' + bits, secret);\n    var sig = (hmac.update(thing), hmac.digest('base64'))\n    return fromBase64(sig);\n  }\n}\n\nvar bufferEqual;\nvar timingSafeEqual = 'timingSafeEqual' in crypto ? function timingSafeEqual(a, b) {\n  if (a.byteLength !== b.byteLength) {\n    return false;\n  }\n\n  return crypto.timingSafeEqual(a, b)\n} : function timingSafeEqual(a, b) {\n  if (!bufferEqual) {\n    bufferEqual = require('buffer-equal-constant-time');\n  }\n\n  return bufferEqual(a, b)\n}\n\nfunction createHmacVerifier(bits) {\n  return function verify(thing, signature, secret) {\n    var computedSig = createHmacSigner(bits)(thing, secret);\n    return timingSafeEqual(Buffer.from(signature), Buffer.from(computedSig));\n  }\n}\n\nfunction createKeySigner(bits) {\n return function sign(thing, privateKey) {\n    checkIsPrivateKey(privateKey);\n    thing = normalizeInput(thing);\n    // Even though we are specifying \"RSA\" here, this works with ECDSA\n    // keys as well.\n    var signer = crypto.createSign('RSA-SHA' + bits);\n    var sig = (signer.update(thing), signer.sign(privateKey, 'base64'));\n    return fromBase64(sig);\n  }\n}\n\nfunction createKeyVerifier(bits) {\n  return function verify(thing, signature, publicKey) {\n    checkIsPublicKey(publicKey);\n    thing = normalizeInput(thing);\n    signature = toBase64(signature);\n    var verifier = crypto.createVerify('RSA-SHA' + bits);\n    verifier.update(thing);\n    return verifier.verify(publicKey, signature, 'base64');\n  }\n}\n\nfunction createPSSKeySigner(bits) {\n  return function sign(thing, privateKey) {\n    checkIsPrivateKey(privateKey);\n    thing = normalizeInput(thing);\n    var signer = crypto.createSign('RSA-SHA' + bits);\n    var sig = (signer.update(thing), signer.sign({\n      key: privateKey,\n      padding: crypto.constants.RSA_PKCS1_PSS_PADDING,\n      saltLength: crypto.constants.RSA_PSS_SALTLEN_DIGEST\n    }, 'base64'));\n    return fromBase64(sig);\n  }\n}\n\nfunction createPSSKeyVerifier(bits) {\n  return function verify(thing, signature, publicKey) {\n    checkIsPublicKey(publicKey);\n    thing = normalizeInput(thing);\n    signature = toBase64(signature);\n    var verifier = crypto.createVerify('RSA-SHA' + bits);\n    verifier.update(thing);\n    return verifier.verify({\n      key: publicKey,\n      padding: crypto.constants.RSA_PKCS1_PSS_PADDING,\n      saltLength: crypto.constants.RSA_PSS_SALTLEN_DIGEST\n    }, signature, 'base64');\n  }\n}\n\nfunction createECDSASigner(bits) {\n  var inner = createKeySigner(bits);\n  return function sign() {\n    var signature = inner.apply(null, arguments);\n    signature = formatEcdsa.derToJose(signature, 'ES' + bits);\n    return signature;\n  };\n}\n\nfunction createECDSAVerifer(bits) {\n  var inner = createKeyVerifier(bits);\n  return function verify(thing, signature, publicKey) {\n    signature = formatEcdsa.joseToDer(signature, 'ES' + bits).toString('base64');\n    var result = inner(thing, signature, publicKey);\n    return result;\n  };\n}\n\nfunction createNoneSigner() {\n  return function sign() {\n    return '';\n  }\n}\n\nfunction createNoneVerifier() {\n  return function verify(thing, signature) {\n    return signature === '';\n  }\n}\n\nmodule.exports = function jwa(algorithm) {\n  var signerFactories = {\n    hs: createHmacSigner,\n    rs: createKeySigner,\n    ps: createPSSKeySigner,\n    es: createECDSASigner,\n    none: createNoneSigner,\n  }\n  var verifierFactories = {\n    hs: createHmacVerifier,\n    rs: createKeyVerifier,\n    ps: createPSSKeyVerifier,\n    es: createECDSAVerifer,\n    none: createNoneVerifier,\n  }\n  var match = algorithm.match(/^(RS|PS|ES|HS)(256|384|512)$|^(none)$/);\n  if (!match)\n    throw typeError(MSG_INVALID_ALGORITHM, algorithm);\n  var algo = (match[1] || match[3]).toLowerCase();\n  var bits = match[2];\n\n  return {\n    sign: signerFactories[algo](bits),\n    verify: verifierFactories[algo](bits),\n  }\n};\n", "/*global module*/\nvar Buffer = require('buffer').Buffer;\n\nmodule.exports = function toString(obj) {\n  if (typeof obj === 'string')\n    return obj;\n  if (typeof obj === 'number' || Buffer.isBuffer(obj))\n    return obj.toString();\n  return JSON.stringify(obj);\n};\n", "/*global module*/\nvar Buffer = require('safe-buffer').Buffer;\nvar DataStream = require('./data-stream');\nvar jwa = require('jwa');\nvar Stream = require('stream');\nvar toString = require('./tostring');\nvar util = require('util');\n\nfunction base64url(string, encoding) {\n  return Buffer\n    .from(string, encoding)\n    .toString('base64')\n    .replace(/=/g, '')\n    .replace(/\\+/g, '-')\n    .replace(/\\//g, '_');\n}\n\nfunction jwsSecuredInput(header, payload, encoding) {\n  encoding = encoding || 'utf8';\n  var encodedHeader = base64url(toString(header), 'binary');\n  var encodedPayload = base64url(toString(payload), encoding);\n  return util.format('%s.%s', encodedHeader, encodedPayload);\n}\n\nfunction jwsSign(opts) {\n  var header = opts.header;\n  var payload = opts.payload;\n  var secretOrKey = opts.secret || opts.privateKey;\n  var encoding = opts.encoding;\n  var algo = jwa(header.alg);\n  var securedInput = jwsSecuredInput(header, payload, encoding);\n  var signature = algo.sign(securedInput, secretOrKey);\n  return util.format('%s.%s', securedInput, signature);\n}\n\nfunction SignStream(opts) {\n  var secret = opts.secret;\n  secret = secret == null ? opts.privateKey : secret;\n  secret = secret == null ? opts.key : secret;\n  if (/^hs/i.test(opts.header.alg) === true && secret == null) {\n    throw new TypeError('secret must be a string or buffer or a KeyObject')\n  }\n  var secretStream = new DataStream(secret);\n  this.readable = true;\n  this.header = opts.header;\n  this.encoding = opts.encoding;\n  this.secret = this.privateKey = this.key = secretStream;\n  this.payload = new DataStream(opts.payload);\n  this.secret.once('close', function () {\n    if (!this.payload.writable && this.readable)\n      this.sign();\n  }.bind(this));\n\n  this.payload.once('close', function () {\n    if (!this.secret.writable && this.readable)\n      this.sign();\n  }.bind(this));\n}\nutil.inherits(SignStream, Stream);\n\nSignStream.prototype.sign = function sign() {\n  try {\n    var signature = jwsSign({\n      header: this.header,\n      payload: this.payload.buffer,\n      secret: this.secret.buffer,\n      encoding: this.encoding\n    });\n    this.emit('done', signature);\n    this.emit('data', signature);\n    this.emit('end');\n    this.readable = false;\n    return signature;\n  } catch (e) {\n    this.readable = false;\n    this.emit('error', e);\n    this.emit('close');\n  }\n};\n\nSignStream.sign = jwsSign;\n\nmodule.exports = SignStream;\n", "/*global module*/\nvar Buffer = require('safe-buffer').Buffer;\nvar DataStream = require('./data-stream');\nvar jwa = require('jwa');\nvar Stream = require('stream');\nvar toString = require('./tostring');\nvar util = require('util');\nvar JWS_REGEX = /^[a-zA-Z0-9\\-_]+?\\.[a-zA-Z0-9\\-_]+?\\.([a-zA-Z0-9\\-_]+)?$/;\n\nfunction isObject(thing) {\n  return Object.prototype.toString.call(thing) === '[object Object]';\n}\n\nfunction safeJsonParse(thing) {\n  if (isObject(thing))\n    return thing;\n  try { return JSON.parse(thing); }\n  catch (e) { return undefined; }\n}\n\nfunction headerFromJWS(jwsSig) {\n  var encodedHeader = jwsSig.split('.', 1)[0];\n  return safeJsonParse(Buffer.from(encodedHeader, 'base64').toString('binary'));\n}\n\nfunction securedInputFromJWS(jwsSig) {\n  return jwsSig.split('.', 2).join('.');\n}\n\nfunction signatureFromJWS(jwsSig) {\n  return jwsSig.split('.')[2];\n}\n\nfunction payloadFromJWS(jwsSig, encoding) {\n  encoding = encoding || 'utf8';\n  var payload = jwsSig.split('.')[1];\n  return Buffer.from(payload, 'base64').toString(encoding);\n}\n\nfunction isValidJws(string) {\n  return JWS_REGEX.test(string) && !!headerFromJWS(string);\n}\n\nfunction jwsVerify(jwsSig, algorithm, secretOrKey) {\n  if (!algorithm) {\n    var err = new Error(\"Missing algorithm parameter for jws.verify\");\n    err.code = \"MISSING_ALGORITHM\";\n    throw err;\n  }\n  jwsSig = toString(jwsSig);\n  var signature = signatureFromJWS(jwsSig);\n  var securedInput = securedInputFromJWS(jwsSig);\n  var algo = jwa(algorithm);\n  return algo.verify(securedInput, signature, secretOrKey);\n}\n\nfunction jwsDecode(jwsSig, opts) {\n  opts = opts || {};\n  jwsSig = toString(jwsSig);\n\n  if (!isValidJws(jwsSig))\n    return null;\n\n  var header = headerFromJWS(jwsSig);\n\n  if (!header)\n    return null;\n\n  var payload = payloadFromJWS(jwsSig);\n  if (header.typ === 'JWT' || opts.json)\n    payload = JSON.parse(payload, opts.encoding);\n\n  return {\n    header: header,\n    payload: payload,\n    signature: signatureFromJWS(jwsSig)\n  };\n}\n\nfunction VerifyStream(opts) {\n  opts = opts || {};\n  var secretOrKey = opts.secret;\n  secretOrKey = secretOrKey == null ? opts.publicKey : secretOrKey;\n  secretOrKey = secretOrKey == null ? opts.key : secretOrKey;\n  if (/^hs/i.test(opts.algorithm) === true && secretOrKey == null) {\n    throw new TypeError('secret must be a string or buffer or a KeyObject')\n  }\n  var secretStream = new DataStream(secretOrKey);\n  this.readable = true;\n  this.algorithm = opts.algorithm;\n  this.encoding = opts.encoding;\n  this.secret = this.publicKey = this.key = secretStream;\n  this.signature = new DataStream(opts.signature);\n  this.secret.once('close', function () {\n    if (!this.signature.writable && this.readable)\n      this.verify();\n  }.bind(this));\n\n  this.signature.once('close', function () {\n    if (!this.secret.writable && this.readable)\n      this.verify();\n  }.bind(this));\n}\nutil.inherits(VerifyStream, Stream);\nVerifyStream.prototype.verify = function verify() {\n  try {\n    var valid = jwsVerify(this.signature.buffer, this.algorithm, this.key.buffer);\n    var obj = jwsDecode(this.signature.buffer, this.encoding);\n    this.emit('done', valid, obj);\n    this.emit('data', valid);\n    this.emit('end');\n    this.readable = false;\n    return valid;\n  } catch (e) {\n    this.readable = false;\n    this.emit('error', e);\n    this.emit('close');\n  }\n};\n\nVerifyStream.decode = jwsDecode;\nVerifyStream.isValid = isValidJws;\nVerifyStream.verify = jwsVerify;\n\nmodule.exports = VerifyStream;\n", "/*global exports*/\nvar SignStream = require('./lib/sign-stream');\nvar VerifyStream = require('./lib/verify-stream');\n\nvar ALGORITHMS = [\n  'HS256', 'HS384', 'HS512',\n  'RS256', 'RS384', 'RS512',\n  'PS256', 'PS384', 'PS512',\n  'ES256', 'ES384', 'ES512'\n];\n\nexports.ALGORITHMS = ALGORITHMS;\nexports.sign = SignStream.sign;\nexports.verify = VerifyStream.verify;\nexports.decode = VerifyStream.decode;\nexports.isValid = VerifyStream.isValid;\nexports.createSign = function createSign(opts) {\n  return new SignStream(opts);\n};\nexports.createVerify = function createVerify(opts) {\n  return new VerifyStream(opts);\n};\n", "\"use strict\";\n/**\n * Copyright 2018 Google LLC\n *\n * Distributed under MIT license.\n * See file LICENSE for detail or copy at https://opensource.org/licenses/MIT\n */\nvar __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n    return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {\n    if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n    return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n};\nvar _GoogleToken_instances, _GoogleToken_inFlightRequest, _GoogleToken_getTokenAsync, _GoogleToken_getTokenAsyncInner, _GoogleToken_ensureEmail, _GoogleToken_revokeTokenAsync, _GoogleToken_configure, _GoogleToken_requestToken;\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GoogleToken = void 0;\nconst fs = require(\"fs\");\nconst gaxios_1 = require(\"gaxios\");\nconst jws = require(\"jws\");\nconst path = require(\"path\");\nconst util_1 = require(\"util\");\nconst readFile = fs.readFile\n    ? (0, util_1.promisify)(fs.readFile)\n    : async () => {\n        // if running in the web-browser, fs.readFile may not have been shimmed.\n        throw new ErrorWithCode('use key rather than keyFile.', 'MISSING_CREDENTIALS');\n    };\nconst GOOGLE_TOKEN_URL = 'https://www.googleapis.com/oauth2/v4/token';\nconst GOOGLE_REVOKE_TOKEN_URL = 'https://accounts.google.com/o/oauth2/revoke?token=';\nclass ErrorWithCode extends Error {\n    constructor(message, code) {\n        super(message);\n        this.code = code;\n    }\n}\nclass GoogleToken {\n    get accessToken() {\n        return this.rawToken ? this.rawToken.access_token : undefined;\n    }\n    get idToken() {\n        return this.rawToken ? this.rawToken.id_token : undefined;\n    }\n    get tokenType() {\n        return this.rawToken ? this.rawToken.token_type : undefined;\n    }\n    get refreshToken() {\n        return this.rawToken ? this.rawToken.refresh_token : undefined;\n    }\n    /**\n     * Create a GoogleToken.\n     *\n     * @param options  Configuration object.\n     */\n    constructor(options) {\n        _GoogleToken_instances.add(this);\n        this.transporter = {\n            request: opts => (0, gaxios_1.request)(opts),\n        };\n        _GoogleToken_inFlightRequest.set(this, void 0);\n        __classPrivateFieldGet(this, _GoogleToken_instances, \"m\", _GoogleToken_configure).call(this, options);\n    }\n    /**\n     * Returns whether the token has expired.\n     *\n     * @return true if the token has expired, false otherwise.\n     */\n    hasExpired() {\n        const now = new Date().getTime();\n        if (this.rawToken && this.expiresAt) {\n            return now >= this.expiresAt;\n        }\n        else {\n            return true;\n        }\n    }\n    /**\n     * Returns whether the token will expire within eagerRefreshThresholdMillis\n     *\n     * @return true if the token will be expired within eagerRefreshThresholdMillis, false otherwise.\n     */\n    isTokenExpiring() {\n        var _a;\n        const now = new Date().getTime();\n        const eagerRefreshThresholdMillis = (_a = this.eagerRefreshThresholdMillis) !== null && _a !== void 0 ? _a : 0;\n        if (this.rawToken && this.expiresAt) {\n            return this.expiresAt <= now + eagerRefreshThresholdMillis;\n        }\n        else {\n            return true;\n        }\n    }\n    getToken(callback, opts = {}) {\n        if (typeof callback === 'object') {\n            opts = callback;\n            callback = undefined;\n        }\n        opts = Object.assign({\n            forceRefresh: false,\n        }, opts);\n        if (callback) {\n            const cb = callback;\n            __classPrivateFieldGet(this, _GoogleToken_instances, \"m\", _GoogleToken_getTokenAsync).call(this, opts).then(t => cb(null, t), callback);\n            return;\n        }\n        return __classPrivateFieldGet(this, _GoogleToken_instances, \"m\", _GoogleToken_getTokenAsync).call(this, opts);\n    }\n    /**\n     * Given a keyFile, extract the key and client email if available\n     * @param keyFile Path to a json, pem, or p12 file that contains the key.\n     * @returns an object with privateKey and clientEmail properties\n     */\n    async getCredentials(keyFile) {\n        const ext = path.extname(keyFile);\n        switch (ext) {\n            case '.json': {\n                const key = await readFile(keyFile, 'utf8');\n                const body = JSON.parse(key);\n                const privateKey = body.private_key;\n                const clientEmail = body.client_email;\n                if (!privateKey || !clientEmail) {\n                    throw new ErrorWithCode('private_key and client_email are required.', 'MISSING_CREDENTIALS');\n                }\n                return { privateKey, clientEmail };\n            }\n            case '.der':\n            case '.crt':\n            case '.pem': {\n                const privateKey = await readFile(keyFile, 'utf8');\n                return { privateKey };\n            }\n            case '.p12':\n            case '.pfx': {\n                throw new ErrorWithCode('*.p12 certificates are not supported after v6.1.2. ' +\n                    'Consider utilizing *.json format or converting *.p12 to *.pem using the OpenSSL CLI.', 'UNKNOWN_CERTIFICATE_TYPE');\n            }\n            default:\n                throw new ErrorWithCode('Unknown certificate type. Type is determined based on file extension. ' +\n                    'Current supported extensions are *.json, and *.pem.', 'UNKNOWN_CERTIFICATE_TYPE');\n        }\n    }\n    revokeToken(callback) {\n        if (callback) {\n            __classPrivateFieldGet(this, _GoogleToken_instances, \"m\", _GoogleToken_revokeTokenAsync).call(this).then(() => callback(), callback);\n            return;\n        }\n        return __classPrivateFieldGet(this, _GoogleToken_instances, \"m\", _GoogleToken_revokeTokenAsync).call(this);\n    }\n}\nexports.GoogleToken = GoogleToken;\n_GoogleToken_inFlightRequest = new WeakMap(), _GoogleToken_instances = new WeakSet(), _GoogleToken_getTokenAsync = async function _GoogleToken_getTokenAsync(opts) {\n    if (__classPrivateFieldGet(this, _GoogleToken_inFlightRequest, \"f\") && !opts.forceRefresh) {\n        return __classPrivateFieldGet(this, _GoogleToken_inFlightRequest, \"f\");\n    }\n    try {\n        return await (__classPrivateFieldSet(this, _GoogleToken_inFlightRequest, __classPrivateFieldGet(this, _GoogleToken_instances, \"m\", _GoogleToken_getTokenAsyncInner).call(this, opts), \"f\"));\n    }\n    finally {\n        __classPrivateFieldSet(this, _GoogleToken_inFlightRequest, undefined, \"f\");\n    }\n}, _GoogleToken_getTokenAsyncInner = async function _GoogleToken_getTokenAsyncInner(opts) {\n    if (this.isTokenExpiring() === false && opts.forceRefresh === false) {\n        return Promise.resolve(this.rawToken);\n    }\n    if (!this.key && !this.keyFile) {\n        throw new Error('No key or keyFile set.');\n    }\n    if (!this.key && this.keyFile) {\n        const creds = await this.getCredentials(this.keyFile);\n        this.key = creds.privateKey;\n        this.iss = creds.clientEmail || this.iss;\n        if (!creds.clientEmail) {\n            __classPrivateFieldGet(this, _GoogleToken_instances, \"m\", _GoogleToken_ensureEmail).call(this);\n        }\n    }\n    return __classPrivateFieldGet(this, _GoogleToken_instances, \"m\", _GoogleToken_requestToken).call(this);\n}, _GoogleToken_ensureEmail = function _GoogleToken_ensureEmail() {\n    if (!this.iss) {\n        throw new ErrorWithCode('email is required.', 'MISSING_CREDENTIALS');\n    }\n}, _GoogleToken_revokeTokenAsync = async function _GoogleToken_revokeTokenAsync() {\n    if (!this.accessToken) {\n        throw new Error('No token to revoke.');\n    }\n    const url = GOOGLE_REVOKE_TOKEN_URL + this.accessToken;\n    await this.transporter.request({\n        url,\n        retry: true,\n    });\n    __classPrivateFieldGet(this, _GoogleToken_instances, \"m\", _GoogleToken_configure).call(this, {\n        email: this.iss,\n        sub: this.sub,\n        key: this.key,\n        keyFile: this.keyFile,\n        scope: this.scope,\n        additionalClaims: this.additionalClaims,\n    });\n}, _GoogleToken_configure = function _GoogleToken_configure(options = {}) {\n    this.keyFile = options.keyFile;\n    this.key = options.key;\n    this.rawToken = undefined;\n    this.iss = options.email || options.iss;\n    this.sub = options.sub;\n    this.additionalClaims = options.additionalClaims;\n    if (typeof options.scope === 'object') {\n        this.scope = options.scope.join(' ');\n    }\n    else {\n        this.scope = options.scope;\n    }\n    this.eagerRefreshThresholdMillis = options.eagerRefreshThresholdMillis;\n    if (options.transporter) {\n        this.transporter = options.transporter;\n    }\n}, _GoogleToken_requestToken = \n/**\n * Request the token from Google.\n */\nasync function _GoogleToken_requestToken() {\n    var _a, _b;\n    const iat = Math.floor(new Date().getTime() / 1000);\n    const additionalClaims = this.additionalClaims || {};\n    const payload = Object.assign({\n        iss: this.iss,\n        scope: this.scope,\n        aud: GOOGLE_TOKEN_URL,\n        exp: iat + 3600,\n        iat,\n        sub: this.sub,\n    }, additionalClaims);\n    const signedJWT = jws.sign({\n        header: { alg: 'RS256' },\n        payload,\n        secret: this.key,\n    });\n    try {\n        const r = await this.transporter.request({\n            method: 'POST',\n            url: GOOGLE_TOKEN_URL,\n            data: {\n                grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',\n                assertion: signedJWT,\n            },\n            headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n            responseType: 'json',\n            retryConfig: {\n                httpMethodsToRetry: ['POST'],\n            },\n        });\n        this.rawToken = r.data;\n        this.expiresAt =\n            r.data.expires_in === null || r.data.expires_in === undefined\n                ? undefined\n                : (iat + r.data.expires_in) * 1000;\n        return this.rawToken;\n    }\n    catch (e) {\n        this.rawToken = undefined;\n        this.tokenExpires = undefined;\n        const body = e.response && ((_a = e.response) === null || _a === void 0 ? void 0 : _a.data)\n            ? (_b = e.response) === null || _b === void 0 ? void 0 : _b.data\n            : {};\n        if (body.error) {\n            const desc = body.error_description\n                ? `: ${body.error_description}`\n                : '';\n            e.message = `${body.error}${desc}`;\n        }\n        throw e;\n    }\n};\n//# sourceMappingURL=index.js.map", "\"use strict\";\n// Copyright 2015 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.JWTAccess = void 0;\nconst jws = require(\"jws\");\nconst util_1 = require(\"../util\");\nconst DEFAULT_HEADER = {\n    alg: 'RS256',\n    typ: 'JWT',\n};\nclass JWTAccess {\n    /**\n     * JWTAccess service account credentials.\n     *\n     * Create a new access token by using the credential to create a new JWT token\n     * that's recognized as the access token.\n     *\n     * @param email the service account email address.\n     * @param key the private key that will be used to sign the token.\n     * @param keyId the ID of the private key used to sign the token.\n     */\n    constructor(email, key, keyId, eagerRefreshThresholdMillis) {\n        this.cache = new util_1.LRUCache({\n            capacity: 500,\n            maxAge: 60 * 60 * 1000,\n        });\n        this.email = email;\n        this.key = key;\n        this.keyId = keyId;\n        this.eagerRefreshThresholdMillis =\n            eagerRefreshThresholdMillis !== null && eagerRefreshThresholdMillis !== void 0 ? eagerRefreshThresholdMillis : 5 * 60 * 1000;\n    }\n    /**\n     * Ensures that we're caching a key appropriately, giving precedence to scopes vs. url\n     *\n     * @param url The URI being authorized.\n     * @param scopes The scope or scopes being authorized\n     * @returns A string that returns the cached key.\n     */\n    getCachedKey(url, scopes) {\n        let cacheKey = url;\n        if (scopes && Array.isArray(scopes) && scopes.length) {\n            cacheKey = url ? `${url}_${scopes.join('_')}` : `${scopes.join('_')}`;\n        }\n        else if (typeof scopes === 'string') {\n            cacheKey = url ? `${url}_${scopes}` : scopes;\n        }\n        if (!cacheKey) {\n            throw Error('Scopes or url must be provided');\n        }\n        return cacheKey;\n    }\n    /**\n     * Get a non-expired access token, after refreshing if necessary.\n     *\n     * @param url The URI being authorized.\n     * @param additionalClaims An object with a set of additional claims to\n     * include in the payload.\n     * @returns An object that includes the authorization header.\n     */\n    getRequestHeaders(url, additionalClaims, scopes) {\n        // Return cached authorization headers, unless we are within\n        // eagerRefreshThresholdMillis ms of them expiring:\n        const key = this.getCachedKey(url, scopes);\n        const cachedToken = this.cache.get(key);\n        const now = Date.now();\n        if (cachedToken &&\n            cachedToken.expiration - now > this.eagerRefreshThresholdMillis) {\n            return cachedToken.headers;\n        }\n        const iat = Math.floor(Date.now() / 1000);\n        const exp = JWTAccess.getExpirationTime(iat);\n        let defaultClaims;\n        // Turn scopes into space-separated string\n        if (Array.isArray(scopes)) {\n            scopes = scopes.join(' ');\n        }\n        // If scopes are specified, sign with scopes\n        if (scopes) {\n            defaultClaims = {\n                iss: this.email,\n                sub: this.email,\n                scope: scopes,\n                exp,\n                iat,\n            };\n        }\n        else {\n            defaultClaims = {\n                iss: this.email,\n                sub: this.email,\n                aud: url,\n                exp,\n                iat,\n            };\n        }\n        // if additionalClaims are provided, ensure they do not collide with\n        // other required claims.\n        if (additionalClaims) {\n            for (const claim in defaultClaims) {\n                if (additionalClaims[claim]) {\n                    throw new Error(`The '${claim}' property is not allowed when passing additionalClaims. This claim is included in the JWT by default.`);\n                }\n            }\n        }\n        const header = this.keyId\n            ? { ...DEFAULT_HEADER, kid: this.keyId }\n            : DEFAULT_HEADER;\n        const payload = Object.assign(defaultClaims, additionalClaims);\n        // Sign the jwt and add it to the cache\n        const signedJWT = jws.sign({ header, payload, secret: this.key });\n        const headers = { Authorization: `Bearer ${signedJWT}` };\n        this.cache.set(key, {\n            expiration: exp * 1000,\n            headers,\n        });\n        return headers;\n    }\n    /**\n     * Returns an expiration time for the JWT token.\n     *\n     * @param iat The issued at time for the JWT.\n     * @returns An expiration time for the JWT.\n     */\n    static getExpirationTime(iat) {\n        const exp = iat + 3600; // 3600 seconds = 1 hour\n        return exp;\n    }\n    /**\n     * Create a JWTAccess credentials instance using the given input options.\n     * @param json The input object.\n     */\n    fromJSON(json) {\n        if (!json) {\n            throw new Error('Must pass in a JSON object containing the service account auth settings.');\n        }\n        if (!json.client_email) {\n            throw new Error('The incoming JSON object does not contain a client_email field');\n        }\n        if (!json.private_key) {\n            throw new Error('The incoming JSON object does not contain a private_key field');\n        }\n        // Extract the relevant information from the json key file.\n        this.email = json.client_email;\n        this.key = json.private_key;\n        this.keyId = json.private_key_id;\n        this.projectId = json.project_id;\n    }\n    fromStream(inputStream, callback) {\n        if (callback) {\n            this.fromStreamAsync(inputStream).then(() => callback(), callback);\n        }\n        else {\n            return this.fromStreamAsync(inputStream);\n        }\n    }\n    fromStreamAsync(inputStream) {\n        return new Promise((resolve, reject) => {\n            if (!inputStream) {\n                reject(new Error('Must pass in a stream containing the service account auth settings.'));\n            }\n            let s = '';\n            inputStream\n                .setEncoding('utf8')\n                .on('data', chunk => (s += chunk))\n                .on('error', reject)\n                .on('end', () => {\n                try {\n                    const data = JSON.parse(s);\n                    this.fromJSON(data);\n                    resolve();\n                }\n                catch (err) {\n                    reject(err);\n                }\n            });\n        });\n    }\n}\nexports.JWTAccess = JWTAccess;\n", "\"use strict\";\n// Copyright 2013 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.JWT = void 0;\nconst gtoken_1 = require(\"gtoken\");\nconst jwtaccess_1 = require(\"./jwtaccess\");\nconst oauth2client_1 = require(\"./oauth2client\");\nconst authclient_1 = require(\"./authclient\");\nclass JWT extends oauth2client_1.OAuth2Client {\n    constructor(optionsOrEmail, keyFile, key, scopes, subject, keyId) {\n        const opts = optionsOrEmail && typeof optionsOrEmail === 'object'\n            ? optionsOrEmail\n            : { email: optionsOrEmail, keyFile, key, keyId, scopes, subject };\n        super(opts);\n        this.email = opts.email;\n        this.keyFile = opts.keyFile;\n        this.key = opts.key;\n        this.keyId = opts.keyId;\n        this.scopes = opts.scopes;\n        this.subject = opts.subject;\n        this.additionalClaims = opts.additionalClaims;\n        // Start with an expired refresh token, which will automatically be\n        // refreshed before the first API call is made.\n        this.credentials = { refresh_token: 'jwt-placeholder', expiry_date: 1 };\n    }\n    /**\n     * Creates a copy of the credential with the specified scopes.\n     * @param scopes List of requested scopes or a single scope.\n     * @return The cloned instance.\n     */\n    createScoped(scopes) {\n        const jwt = new JWT(this);\n        jwt.scopes = scopes;\n        return jwt;\n    }\n    /**\n     * Obtains the metadata to be sent with the request.\n     *\n     * @param url the URI being authorized.\n     */\n    async getRequestMetadataAsync(url) {\n        url = this.defaultServicePath ? `https://${this.defaultServicePath}/` : url;\n        const useSelfSignedJWT = (!this.hasUserScopes() && url) ||\n            (this.useJWTAccessWithScope && this.hasAnyScopes()) ||\n            this.universeDomain !== authclient_1.DEFAULT_UNIVERSE;\n        if (this.subject && this.universeDomain !== authclient_1.DEFAULT_UNIVERSE) {\n            throw new RangeError(`Service Account user is configured for the credential. Domain-wide delegation is not supported in universes other than ${authclient_1.DEFAULT_UNIVERSE}`);\n        }\n        if (!this.apiKey && useSelfSignedJWT) {\n            if (this.additionalClaims &&\n                this.additionalClaims.target_audience) {\n                const { tokens } = await this.refreshToken();\n                return {\n                    headers: this.addSharedMetadataHeaders({\n                        Authorization: `Bearer ${tokens.id_token}`,\n                    }),\n                };\n            }\n            else {\n                // no scopes have been set, but a uri has been provided. Use JWTAccess\n                // credentials.\n                if (!this.access) {\n                    this.access = new jwtaccess_1.JWTAccess(this.email, this.key, this.keyId, this.eagerRefreshThresholdMillis);\n                }\n                let scopes;\n                if (this.hasUserScopes()) {\n                    scopes = this.scopes;\n                }\n                else if (!url) {\n                    scopes = this.defaultScopes;\n                }\n                const useScopes = this.useJWTAccessWithScope ||\n                    this.universeDomain !== authclient_1.DEFAULT_UNIVERSE;\n                const headers = await this.access.getRequestHeaders(url !== null && url !== void 0 ? url : undefined, this.additionalClaims, \n                // Scopes take precedent over audience for signing,\n                // so we only provide them if `useJWTAccessWithScope` is on or\n                // if we are in a non-default universe\n                useScopes ? scopes : undefined);\n                return { headers: this.addSharedMetadataHeaders(headers) };\n            }\n        }\n        else if (this.hasAnyScopes() || this.apiKey) {\n            return super.getRequestMetadataAsync(url);\n        }\n        else {\n            // If no audience, apiKey, or scopes are provided, we should not attempt\n            // to populate any headers:\n            return { headers: {} };\n        }\n    }\n    /**\n     * Fetches an ID token.\n     * @param targetAudience the audience for the fetched ID token.\n     */\n    async fetchIdToken(targetAudience) {\n        // Create a new gToken for fetching an ID token\n        const gtoken = new gtoken_1.GoogleToken({\n            iss: this.email,\n            sub: this.subject,\n            scope: this.scopes || this.defaultScopes,\n            keyFile: this.keyFile,\n            key: this.key,\n            additionalClaims: { target_audience: targetAudience },\n            transporter: this.transporter,\n        });\n        await gtoken.getToken({\n            forceRefresh: true,\n        });\n        if (!gtoken.idToken) {\n            throw new Error('Unknown error: Failed to fetch ID token');\n        }\n        return gtoken.idToken;\n    }\n    /**\n     * Determine if there are currently scopes available.\n     */\n    hasUserScopes() {\n        if (!this.scopes) {\n            return false;\n        }\n        return this.scopes.length > 0;\n    }\n    /**\n     * Are there any default or user scopes defined.\n     */\n    hasAnyScopes() {\n        if (this.scopes && this.scopes.length > 0)\n            return true;\n        if (this.defaultScopes && this.defaultScopes.length > 0)\n            return true;\n        return false;\n    }\n    authorize(callback) {\n        if (callback) {\n            this.authorizeAsync().then(r => callback(null, r), callback);\n        }\n        else {\n            return this.authorizeAsync();\n        }\n    }\n    async authorizeAsync() {\n        const result = await this.refreshToken();\n        if (!result) {\n            throw new Error('No result returned');\n        }\n        this.credentials = result.tokens;\n        this.credentials.refresh_token = 'jwt-placeholder';\n        this.key = this.gtoken.key;\n        this.email = this.gtoken.iss;\n        return result.tokens;\n    }\n    /**\n     * Refreshes the access token.\n     * @param refreshToken ignored\n     * @private\n     */\n    async refreshTokenNoCache(\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    refreshToken) {\n        const gtoken = this.createGToken();\n        const token = await gtoken.getToken({\n            forceRefresh: this.isTokenExpiring(),\n        });\n        const tokens = {\n            access_token: token.access_token,\n            token_type: 'Bearer',\n            expiry_date: gtoken.expiresAt,\n            id_token: gtoken.idToken,\n        };\n        this.emit('tokens', tokens);\n        return { res: null, tokens };\n    }\n    /**\n     * Create a gToken if it doesn't already exist.\n     */\n    createGToken() {\n        if (!this.gtoken) {\n            this.gtoken = new gtoken_1.GoogleToken({\n                iss: this.email,\n                sub: this.subject,\n                scope: this.scopes || this.defaultScopes,\n                keyFile: this.keyFile,\n                key: this.key,\n                additionalClaims: this.additionalClaims,\n                transporter: this.transporter,\n            });\n        }\n        return this.gtoken;\n    }\n    /**\n     * Create a JWT credentials instance using the given input options.\n     * @param json The input object.\n     *\n     * @remarks\n     *\n     * **Important**: If you accept a credential configuration (credential JSON/File/Stream) from an external source for authentication to Google Cloud, you must validate it before providing it to any Google API or library. Providing an unvalidated credential configuration to Google APIs can compromise the security of your systems and data. For more information, refer to {@link https://cloud.google.com/docs/authentication/external/externally-sourced-credentials Validate credential configurations from external sources}.\n     */\n    fromJSON(json) {\n        if (!json) {\n            throw new Error('Must pass in a JSON object containing the service account auth settings.');\n        }\n        if (!json.client_email) {\n            throw new Error('The incoming JSON object does not contain a client_email field');\n        }\n        if (!json.private_key) {\n            throw new Error('The incoming JSON object does not contain a private_key field');\n        }\n        // Extract the relevant information from the json key file.\n        this.email = json.client_email;\n        this.key = json.private_key;\n        this.keyId = json.private_key_id;\n        this.projectId = json.project_id;\n        this.quotaProjectId = json.quota_project_id;\n        this.universeDomain = json.universe_domain || this.universeDomain;\n    }\n    fromStream(inputStream, callback) {\n        if (callback) {\n            this.fromStreamAsync(inputStream).then(() => callback(), callback);\n        }\n        else {\n            return this.fromStreamAsync(inputStream);\n        }\n    }\n    fromStreamAsync(inputStream) {\n        return new Promise((resolve, reject) => {\n            if (!inputStream) {\n                throw new Error('Must pass in a stream containing the service account auth settings.');\n            }\n            let s = '';\n            inputStream\n                .setEncoding('utf8')\n                .on('error', reject)\n                .on('data', chunk => (s += chunk))\n                .on('end', () => {\n                try {\n                    const data = JSON.parse(s);\n                    this.fromJSON(data);\n                    resolve();\n                }\n                catch (e) {\n                    reject(e);\n                }\n            });\n        });\n    }\n    /**\n     * Creates a JWT credentials instance using an API Key for authentication.\n     * @param apiKey The API Key in string form.\n     */\n    fromAPIKey(apiKey) {\n        if (typeof apiKey !== 'string') {\n            throw new Error('Must provide an API Key string.');\n        }\n        this.apiKey = apiKey;\n    }\n    /**\n     * Using the key or keyFile on the JWT client, obtain an object that contains\n     * the key and the client email.\n     */\n    async getCredentials() {\n        if (this.key) {\n            return { private_key: this.key, client_email: this.email };\n        }\n        else if (this.keyFile) {\n            const gtoken = this.createGToken();\n            const creds = await gtoken.getCredentials(this.keyFile);\n            return { private_key: creds.privateKey, client_email: creds.clientEmail };\n        }\n        throw new Error('A key or a keyFile must be provided to getCredentials.');\n    }\n}\nexports.JWT = JWT;\n", "\"use strict\";\n// Copyright 2015 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UserRefreshClient = exports.USER_REFRESH_ACCOUNT_TYPE = void 0;\nconst oauth2client_1 = require(\"./oauth2client\");\nconst querystring_1 = require(\"querystring\");\nexports.USER_REFRESH_ACCOUNT_TYPE = 'authorized_user';\nclass UserRefreshClient extends oauth2client_1.OAuth2Client {\n    constructor(optionsOrClientId, clientSecret, refreshToken, eagerRefreshThresholdMillis, forceRefreshOnFailure) {\n        const opts = optionsOrClientId && typeof optionsOrClientId === 'object'\n            ? optionsOrClientId\n            : {\n                clientId: optionsOrClientId,\n                clientSecret,\n                refreshToken,\n                eagerRefreshThresholdMillis,\n                forceRefreshOnFailure,\n            };\n        super(opts);\n        this._refreshToken = opts.refreshToken;\n        this.credentials.refresh_token = opts.refreshToken;\n    }\n    /**\n     * Refreshes the access token.\n     * @param refreshToken An ignored refreshToken..\n     * @param callback Optional callback.\n     */\n    async refreshTokenNoCache(\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    refreshToken) {\n        return super.refreshTokenNoCache(this._refreshToken);\n    }\n    async fetchIdToken(targetAudience) {\n        const res = await this.transporter.request({\n            ...UserRefreshClient.RETRY_CONFIG,\n            url: this.endpoints.oauth2TokenUrl,\n            headers: {\n                'Content-Type': 'application/x-www-form-urlencoded',\n            },\n            method: 'POST',\n            data: (0, querystring_1.stringify)({\n                client_id: this._clientId,\n                client_secret: this._clientSecret,\n                grant_type: 'refresh_token',\n                refresh_token: this._refreshToken,\n                target_audience: targetAudience,\n            }),\n        });\n        return res.data.id_token;\n    }\n    /**\n     * Create a UserRefreshClient credentials instance using the given input\n     * options.\n     * @param json The input object.\n     */\n    fromJSON(json) {\n        if (!json) {\n            throw new Error('Must pass in a JSON object containing the user refresh token');\n        }\n        if (json.type !== 'authorized_user') {\n            throw new Error('The incoming JSON object does not have the \"authorized_user\" type');\n        }\n        if (!json.client_id) {\n            throw new Error('The incoming JSON object does not contain a client_id field');\n        }\n        if (!json.client_secret) {\n            throw new Error('The incoming JSON object does not contain a client_secret field');\n        }\n        if (!json.refresh_token) {\n            throw new Error('The incoming JSON object does not contain a refresh_token field');\n        }\n        this._clientId = json.client_id;\n        this._clientSecret = json.client_secret;\n        this._refreshToken = json.refresh_token;\n        this.credentials.refresh_token = json.refresh_token;\n        this.quotaProjectId = json.quota_project_id;\n        this.universeDomain = json.universe_domain || this.universeDomain;\n    }\n    fromStream(inputStream, callback) {\n        if (callback) {\n            this.fromStreamAsync(inputStream).then(() => callback(), callback);\n        }\n        else {\n            return this.fromStreamAsync(inputStream);\n        }\n    }\n    async fromStreamAsync(inputStream) {\n        return new Promise((resolve, reject) => {\n            if (!inputStream) {\n                return reject(new Error('Must pass in a stream containing the user refresh token.'));\n            }\n            let s = '';\n            inputStream\n                .setEncoding('utf8')\n                .on('error', reject)\n                .on('data', chunk => (s += chunk))\n                .on('end', () => {\n                try {\n                    const data = JSON.parse(s);\n                    this.fromJSON(data);\n                    return resolve();\n                }\n                catch (err) {\n                    return reject(err);\n                }\n            });\n        });\n    }\n    /**\n     * Create a UserRefreshClient credentials instance using the given input\n     * options.\n     * @param json The input object.\n     */\n    static fromJSON(json) {\n        const client = new UserRefreshClient();\n        client.fromJSON(json);\n        return client;\n    }\n}\nexports.UserRefreshClient = UserRefreshClient;\n", "\"use strict\";\n/**\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Impersonated = exports.IMPERSONATED_ACCOUNT_TYPE = void 0;\nconst oauth2client_1 = require(\"./oauth2client\");\nconst gaxios_1 = require(\"gaxios\");\nconst util_1 = require(\"../util\");\nexports.IMPERSONATED_ACCOUNT_TYPE = 'impersonated_service_account';\nclass Impersonated extends oauth2client_1.OAuth2Client {\n    /**\n     * Impersonated service account credentials.\n     *\n     * Create a new access token by impersonating another service account.\n     *\n     * Impersonated Credentials allowing credentials issued to a user or\n     * service account to impersonate another. The source project using\n     * Impersonated Credentials must enable the \"IAMCredentials\" API.\n     * Also, the target service account must grant the orginating principal\n     * the \"Service Account Token Creator\" IAM role.\n     *\n     * @param {object} options - The configuration object.\n     * @param {object} [options.sourceClient] the source credential used as to\n     * acquire the impersonated credentials.\n     * @param {string} [options.targetPrincipal] the service account to\n     * impersonate.\n     * @param {string[]} [options.delegates] the chained list of delegates\n     * required to grant the final access_token. If set, the sequence of\n     * identities must have \"Service Account Token Creator\" capability granted to\n     * the preceding identity. For example, if set to [serviceAccountB,\n     * serviceAccountC], the sourceCredential must have the Token Creator role on\n     * serviceAccountB. serviceAccountB must have the Token Creator on\n     * serviceAccountC. Finally, C must have Token Creator on target_principal.\n     * If left unset, sourceCredential must have that role on targetPrincipal.\n     * @param {string[]} [options.targetScopes] scopes to request during the\n     * authorization grant.\n     * @param {number} [options.lifetime] number of seconds the delegated\n     * credential should be valid for up to 3600 seconds by default, or 43,200\n     * seconds by extending the token's lifetime, see:\n     * https://cloud.google.com/iam/docs/creating-short-lived-service-account-credentials#sa-credentials-oauth\n     * @param {string} [options.endpoint] api endpoint override.\n     */\n    constructor(options = {}) {\n        var _a, _b, _c, _d, _e, _f;\n        super(options);\n        // Start with an expired refresh token, which will automatically be\n        // refreshed before the first API call is made.\n        this.credentials = {\n            expiry_date: 1,\n            refresh_token: 'impersonated-placeholder',\n        };\n        this.sourceClient = (_a = options.sourceClient) !== null && _a !== void 0 ? _a : new oauth2client_1.OAuth2Client();\n        this.targetPrincipal = (_b = options.targetPrincipal) !== null && _b !== void 0 ? _b : '';\n        this.delegates = (_c = options.delegates) !== null && _c !== void 0 ? _c : [];\n        this.targetScopes = (_d = options.targetScopes) !== null && _d !== void 0 ? _d : [];\n        this.lifetime = (_e = options.lifetime) !== null && _e !== void 0 ? _e : 3600;\n        const usingExplicitUniverseDomain = !!(0, util_1.originalOrCamelOptions)(options).get('universe_domain');\n        if (!usingExplicitUniverseDomain) {\n            // override the default universe with the source's universe\n            this.universeDomain = this.sourceClient.universeDomain;\n        }\n        else if (this.sourceClient.universeDomain !== this.universeDomain) {\n            // non-default universe and is not matching the source - this could be a credential leak\n            throw new RangeError(`Universe domain ${this.sourceClient.universeDomain} in source credentials does not match ${this.universeDomain} universe domain set for impersonated credentials.`);\n        }\n        this.endpoint =\n            (_f = options.endpoint) !== null && _f !== void 0 ? _f : `https://iamcredentials.${this.universeDomain}`;\n    }\n    /**\n     * Signs some bytes.\n     *\n     * {@link https://cloud.google.com/iam/docs/reference/credentials/rest/v1/projects.serviceAccounts/signBlob Reference Documentation}\n     * @param blobToSign String to sign.\n     *\n     * @returns A {@link SignBlobResponse} denoting the keyID and signedBlob in base64 string\n     */\n    async sign(blobToSign) {\n        await this.sourceClient.getAccessToken();\n        const name = `projects/-/serviceAccounts/${this.targetPrincipal}`;\n        const u = `${this.endpoint}/v1/${name}:signBlob`;\n        const body = {\n            delegates: this.delegates,\n            payload: Buffer.from(blobToSign).toString('base64'),\n        };\n        const res = await this.sourceClient.request({\n            ...Impersonated.RETRY_CONFIG,\n            url: u,\n            data: body,\n            method: 'POST',\n        });\n        return res.data;\n    }\n    /** The service account email to be impersonated. */\n    getTargetPrincipal() {\n        return this.targetPrincipal;\n    }\n    /**\n     * Refreshes the access token.\n     */\n    async refreshToken() {\n        var _a, _b, _c, _d, _e, _f;\n        try {\n            await this.sourceClient.getAccessToken();\n            const name = 'projects/-/serviceAccounts/' + this.targetPrincipal;\n            const u = `${this.endpoint}/v1/${name}:generateAccessToken`;\n            const body = {\n                delegates: this.delegates,\n                scope: this.targetScopes,\n                lifetime: this.lifetime + 's',\n            };\n            const res = await this.sourceClient.request({\n                ...Impersonated.RETRY_CONFIG,\n                url: u,\n                data: body,\n                method: 'POST',\n            });\n            const tokenResponse = res.data;\n            this.credentials.access_token = tokenResponse.accessToken;\n            this.credentials.expiry_date = Date.parse(tokenResponse.expireTime);\n            return {\n                tokens: this.credentials,\n                res,\n            };\n        }\n        catch (error) {\n            if (!(error instanceof Error))\n                throw error;\n            let status = 0;\n            let message = '';\n            if (error instanceof gaxios_1.GaxiosError) {\n                status = (_c = (_b = (_a = error === null || error === void 0 ? void 0 : error.response) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.error) === null || _c === void 0 ? void 0 : _c.status;\n                message = (_f = (_e = (_d = error === null || error === void 0 ? void 0 : error.response) === null || _d === void 0 ? void 0 : _d.data) === null || _e === void 0 ? void 0 : _e.error) === null || _f === void 0 ? void 0 : _f.message;\n            }\n            if (status && message) {\n                error.message = `${status}: unable to impersonate: ${message}`;\n                throw error;\n            }\n            else {\n                error.message = `unable to impersonate: ${error}`;\n                throw error;\n            }\n        }\n    }\n    /**\n     * Generates an OpenID Connect ID token for a service account.\n     *\n     * {@link https://cloud.google.com/iam/docs/reference/credentials/rest/v1/projects.serviceAccounts/generateIdToken Reference Documentation}\n     *\n     * @param targetAudience the audience for the fetched ID token.\n     * @param options the for the request\n     * @return an OpenID Connect ID token\n     */\n    async fetchIdToken(targetAudience, options) {\n        var _a, _b;\n        await this.sourceClient.getAccessToken();\n        const name = `projects/-/serviceAccounts/${this.targetPrincipal}`;\n        const u = `${this.endpoint}/v1/${name}:generateIdToken`;\n        const body = {\n            delegates: this.delegates,\n            audience: targetAudience,\n            includeEmail: (_a = options === null || options === void 0 ? void 0 : options.includeEmail) !== null && _a !== void 0 ? _a : true,\n            useEmailAzp: (_b = options === null || options === void 0 ? void 0 : options.includeEmail) !== null && _b !== void 0 ? _b : true,\n        };\n        const res = await this.sourceClient.request({\n            ...Impersonated.RETRY_CONFIG,\n            url: u,\n            data: body,\n            method: 'POST',\n        });\n        return res.data.token;\n    }\n}\nexports.Impersonated = Impersonated;\n", "\"use strict\";\n// Copyright 2021 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.OAuthClientAuthHandler = void 0;\nexports.getErrorFromOAuthErrorResponse = getErrorFromOAuthErrorResponse;\nconst querystring = require(\"querystring\");\nconst crypto_1 = require(\"../crypto/crypto\");\n/** List of HTTP methods that accept request bodies. */\nconst METHODS_SUPPORTING_REQUEST_BODY = ['PUT', 'POST', 'PATCH'];\n/**\n * Abstract class for handling client authentication in OAuth-based\n * operations.\n * When request-body client authentication is used, only application/json and\n * application/x-www-form-urlencoded content types for HTTP methods that support\n * request bodies are supported.\n */\nclass OAuthClientAuthHandler {\n    /**\n     * Instantiates an OAuth client authentication handler.\n     * @param clientAuthentication The client auth credentials.\n     */\n    constructor(clientAuthentication) {\n        this.clientAuthentication = clientAuthentication;\n        this.crypto = (0, crypto_1.createCrypto)();\n    }\n    /**\n     * Applies client authentication on the OAuth request's headers or POST\n     * body but does not process the request.\n     * @param opts The GaxiosOptions whose headers or data are to be modified\n     *   depending on the client authentication mechanism to be used.\n     * @param bearerToken The optional bearer token to use for authentication.\n     *   When this is used, no client authentication credentials are needed.\n     */\n    applyClientAuthenticationOptions(opts, bearerToken) {\n        // Inject authenticated header.\n        this.injectAuthenticatedHeaders(opts, bearerToken);\n        // Inject authenticated request body.\n        if (!bearerToken) {\n            this.injectAuthenticatedRequestBody(opts);\n        }\n    }\n    /**\n     * Applies client authentication on the request's header if either\n     * basic authentication or bearer token authentication is selected.\n     *\n     * @param opts The GaxiosOptions whose headers or data are to be modified\n     *   depending on the client authentication mechanism to be used.\n     * @param bearerToken The optional bearer token to use for authentication.\n     *   When this is used, no client authentication credentials are needed.\n     */\n    injectAuthenticatedHeaders(opts, bearerToken) {\n        var _a;\n        // Bearer token prioritized higher than basic Auth.\n        if (bearerToken) {\n            opts.headers = opts.headers || {};\n            Object.assign(opts.headers, {\n                Authorization: `Bearer ${bearerToken}}`,\n            });\n        }\n        else if (((_a = this.clientAuthentication) === null || _a === void 0 ? void 0 : _a.confidentialClientType) === 'basic') {\n            opts.headers = opts.headers || {};\n            const clientId = this.clientAuthentication.clientId;\n            const clientSecret = this.clientAuthentication.clientSecret || '';\n            const base64EncodedCreds = this.crypto.encodeBase64StringUtf8(`${clientId}:${clientSecret}`);\n            Object.assign(opts.headers, {\n                Authorization: `Basic ${base64EncodedCreds}`,\n            });\n        }\n    }\n    /**\n     * Applies client authentication on the request's body if request-body\n     * client authentication is selected.\n     *\n     * @param opts The GaxiosOptions whose headers or data are to be modified\n     *   depending on the client authentication mechanism to be used.\n     */\n    injectAuthenticatedRequestBody(opts) {\n        var _a;\n        if (((_a = this.clientAuthentication) === null || _a === void 0 ? void 0 : _a.confidentialClientType) === 'request-body') {\n            const method = (opts.method || 'GET').toUpperCase();\n            // Inject authenticated request body.\n            if (METHODS_SUPPORTING_REQUEST_BODY.indexOf(method) !== -1) {\n                // Get content-type.\n                let contentType;\n                const headers = opts.headers || {};\n                for (const key in headers) {\n                    if (key.toLowerCase() === 'content-type' && headers[key]) {\n                        contentType = headers[key].toLowerCase();\n                        break;\n                    }\n                }\n                if (contentType === 'application/x-www-form-urlencoded') {\n                    opts.data = opts.data || '';\n                    const data = querystring.parse(opts.data);\n                    Object.assign(data, {\n                        client_id: this.clientAuthentication.clientId,\n                        client_secret: this.clientAuthentication.clientSecret || '',\n                    });\n                    opts.data = querystring.stringify(data);\n                }\n                else if (contentType === 'application/json') {\n                    opts.data = opts.data || {};\n                    Object.assign(opts.data, {\n                        client_id: this.clientAuthentication.clientId,\n                        client_secret: this.clientAuthentication.clientSecret || '',\n                    });\n                }\n                else {\n                    throw new Error(`${contentType} content-types are not supported with ` +\n                        `${this.clientAuthentication.confidentialClientType} ` +\n                        'client authentication');\n                }\n            }\n            else {\n                throw new Error(`${method} HTTP method does not support ` +\n                    `${this.clientAuthentication.confidentialClientType} ` +\n                    'client authentication');\n            }\n        }\n    }\n    /**\n     * Retry config for Auth-related requests.\n     *\n     * @remarks\n     *\n     * This is not a part of the default {@link AuthClient.transporter transporter/gaxios}\n     * config as some downstream APIs would prefer if customers explicitly enable retries,\n     * such as GCS.\n     */\n    static get RETRY_CONFIG() {\n        return {\n            retry: true,\n            retryConfig: {\n                httpMethodsToRetry: ['GET', 'PUT', 'POST', 'HEAD', 'OPTIONS', 'DELETE'],\n            },\n        };\n    }\n}\nexports.OAuthClientAuthHandler = OAuthClientAuthHandler;\n/**\n * Converts an OAuth error response to a native JavaScript Error.\n * @param resp The OAuth error response to convert to a native Error object.\n * @param err The optional original error. If provided, the error properties\n *   will be copied to the new error.\n * @return The converted native Error object.\n */\nfunction getErrorFromOAuthErrorResponse(resp, err) {\n    // Error response.\n    const errorCode = resp.error;\n    const errorDescription = resp.error_description;\n    const errorUri = resp.error_uri;\n    let message = `Error code ${errorCode}`;\n    if (typeof errorDescription !== 'undefined') {\n        message += `: ${errorDescription}`;\n    }\n    if (typeof errorUri !== 'undefined') {\n        message += ` - ${errorUri}`;\n    }\n    const newError = new Error(message);\n    // Copy properties from original error to newly generated error.\n    if (err) {\n        const keys = Object.keys(err);\n        if (err.stack) {\n            // Copy error.stack if available.\n            keys.push('stack');\n        }\n        keys.forEach(key => {\n            // Do not overwrite the message field.\n            if (key !== 'message') {\n                Object.defineProperty(newError, key, {\n                    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n                    value: err[key],\n                    writable: false,\n                    enumerable: true,\n                });\n            }\n        });\n    }\n    return newError;\n}\n", "\"use strict\";\n// Copyright 2021 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.StsCredentials = void 0;\nconst gaxios_1 = require(\"gaxios\");\nconst querystring = require(\"querystring\");\nconst transporters_1 = require(\"../transporters\");\nconst oauth2common_1 = require(\"./oauth2common\");\n/**\n * Implements the OAuth 2.0 token exchange based on\n * https://tools.ietf.org/html/rfc8693\n */\nclass StsCredentials extends oauth2common_1.OAuthClientAuthHandler {\n    /**\n     * Initializes an STS credentials instance.\n     * @param tokenExchangeEndpoint The token exchange endpoint.\n     * @param clientAuthentication The client authentication credentials if\n     *   available.\n     */\n    constructor(tokenExchangeEndpoint, clientAuthentication) {\n        super(clientAuthentication);\n        this.tokenExchangeEndpoint = tokenExchangeEndpoint;\n        this.transporter = new transporters_1.DefaultTransporter();\n    }\n    /**\n     * Exchanges the provided token for another type of token based on the\n     * rfc8693 spec.\n     * @param stsCredentialsOptions The token exchange options used to populate\n     *   the token exchange request.\n     * @param additionalHeaders Optional additional headers to pass along the\n     *   request.\n     * @param options Optional additional GCP-specific non-spec defined options\n     *   to send with the request.\n     *   Example: `&options=${encodeUriComponent(JSON.stringified(options))}`\n     * @return A promise that resolves with the token exchange response containing\n     *   the requested token and its expiration time.\n     */\n    async exchangeToken(stsCredentialsOptions, additionalHeaders, \n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    options) {\n        var _a, _b, _c;\n        const values = {\n            grant_type: stsCredentialsOptions.grantType,\n            resource: stsCredentialsOptions.resource,\n            audience: stsCredentialsOptions.audience,\n            scope: (_a = stsCredentialsOptions.scope) === null || _a === void 0 ? void 0 : _a.join(' '),\n            requested_token_type: stsCredentialsOptions.requestedTokenType,\n            subject_token: stsCredentialsOptions.subjectToken,\n            subject_token_type: stsCredentialsOptions.subjectTokenType,\n            actor_token: (_b = stsCredentialsOptions.actingParty) === null || _b === void 0 ? void 0 : _b.actorToken,\n            actor_token_type: (_c = stsCredentialsOptions.actingParty) === null || _c === void 0 ? void 0 : _c.actorTokenType,\n            // Non-standard GCP-specific options.\n            options: options && JSON.stringify(options),\n        };\n        // Remove undefined fields.\n        Object.keys(values).forEach(key => {\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\n            if (typeof values[key] === 'undefined') {\n                // eslint-disable-next-line @typescript-eslint/no-explicit-any\n                delete values[key];\n            }\n        });\n        const headers = {\n            'Content-Type': 'application/x-www-form-urlencoded',\n        };\n        // Inject additional STS headers if available.\n        Object.assign(headers, additionalHeaders || {});\n        const opts = {\n            ...StsCredentials.RETRY_CONFIG,\n            url: this.tokenExchangeEndpoint.toString(),\n            method: 'POST',\n            headers,\n            data: querystring.stringify(values),\n            responseType: 'json',\n        };\n        // Apply OAuth client authentication.\n        this.applyClientAuthenticationOptions(opts);\n        try {\n            const response = await this.transporter.request(opts);\n            // Successful response.\n            const stsSuccessfulResponse = response.data;\n            stsSuccessfulResponse.res = response;\n            return stsSuccessfulResponse;\n        }\n        catch (error) {\n            // Translate error to OAuthError.\n            if (error instanceof gaxios_1.GaxiosError && error.response) {\n                throw (0, oauth2common_1.getErrorFromOAuthErrorResponse)(error.response.data, \n                // Preserve other fields from the original error.\n                error);\n            }\n            // Request could fail before the server responds.\n            throw error;\n        }\n    }\n}\nexports.StsCredentials = StsCredentials;\n", "\"use strict\";\n// Copyright 2021 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nvar __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n    return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {\n    if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n    return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n};\nvar _BaseExternalAccountClient_instances, _BaseExternalAccountClient_pendingAccessToken, _BaseExternalAccountClient_internalRefreshAccessTokenAsync;\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.BaseExternalAccountClient = exports.DEFAULT_UNIVERSE = exports.CLOUD_RESOURCE_MANAGER = exports.EXTERNAL_ACCOUNT_TYPE = exports.EXPIRATION_TIME_OFFSET = void 0;\nconst stream = require(\"stream\");\nconst authclient_1 = require(\"./authclient\");\nconst sts = require(\"./stscredentials\");\nconst util_1 = require(\"../util\");\n/**\n * The required token exchange grant_type: rfc8693#section-2.1\n */\nconst STS_GRANT_TYPE = 'urn:ietf:params:oauth:grant-type:token-exchange';\n/**\n * The requested token exchange requested_token_type: rfc8693#section-2.1\n */\nconst STS_REQUEST_TOKEN_TYPE = 'urn:ietf:params:oauth:token-type:access_token';\n/** The default OAuth scope to request when none is provided. */\nconst DEFAULT_OAUTH_SCOPE = 'https://www.googleapis.com/auth/cloud-platform';\n/** Default impersonated token lifespan in seconds.*/\nconst DEFAULT_TOKEN_LIFESPAN = 3600;\n/**\n * Offset to take into account network delays and server clock skews.\n */\nexports.EXPIRATION_TIME_OFFSET = 5 * 60 * 1000;\n/**\n * The credentials JSON file type for external account clients.\n * There are 3 types of JSON configs:\n * 1. authorized_user => Google end user credential\n * 2. service_account => Google service account credential\n * 3. external_Account => non-GCP service (eg. AWS, Azure, K8s)\n */\nexports.EXTERNAL_ACCOUNT_TYPE = 'external_account';\n/**\n * Cloud resource manager URL used to retrieve project information.\n *\n * @deprecated use {@link BaseExternalAccountClient.cloudResourceManagerURL} instead\n **/\nexports.CLOUD_RESOURCE_MANAGER = 'https://cloudresourcemanager.googleapis.com/v1/projects/';\n/** The workforce audience pattern. */\nconst WORKFORCE_AUDIENCE_PATTERN = '//iam\\\\.googleapis\\\\.com/locations/[^/]+/workforcePools/[^/]+/providers/.+';\nconst DEFAULT_TOKEN_URL = 'https://sts.{universeDomain}/v1/token';\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst pkg = require('../../../package.json');\n/**\n * For backwards compatibility.\n */\nvar authclient_2 = require(\"./authclient\");\nObject.defineProperty(exports, \"DEFAULT_UNIVERSE\", { enumerable: true, get: function () { return authclient_2.DEFAULT_UNIVERSE; } });\n/**\n * Base external account client. This is used to instantiate AuthClients for\n * exchanging external account credentials for GCP access token and authorizing\n * requests to GCP APIs.\n * The base class implements common logic for exchanging various type of\n * external credentials for GCP access token. The logic of determining and\n * retrieving the external credential based on the environment and\n * credential_source will be left for the subclasses.\n */\nclass BaseExternalAccountClient extends authclient_1.AuthClient {\n    /**\n     * Instantiate a BaseExternalAccountClient instance using the provided JSON\n     * object loaded from an external account credentials file.\n     * @param options The external account options object typically loaded\n     *   from the external account JSON credential file. The camelCased options\n     *   are aliases for the snake_cased options.\n     * @param additionalOptions **DEPRECATED, all options are available in the\n     *   `options` parameter.** Optional additional behavior customization options.\n     *   These currently customize expiration threshold time and whether to retry\n     *   on 401/403 API request errors.\n     */\n    constructor(options, additionalOptions) {\n        var _a;\n        super({ ...options, ...additionalOptions });\n        _BaseExternalAccountClient_instances.add(this);\n        /**\n         * A pending access token request. Used for concurrent calls.\n         */\n        _BaseExternalAccountClient_pendingAccessToken.set(this, null);\n        const opts = (0, util_1.originalOrCamelOptions)(options);\n        const type = opts.get('type');\n        if (type && type !== exports.EXTERNAL_ACCOUNT_TYPE) {\n            throw new Error(`Expected \"${exports.EXTERNAL_ACCOUNT_TYPE}\" type but ` +\n                `received \"${options.type}\"`);\n        }\n        const clientId = opts.get('client_id');\n        const clientSecret = opts.get('client_secret');\n        const tokenUrl = (_a = opts.get('token_url')) !== null && _a !== void 0 ? _a : DEFAULT_TOKEN_URL.replace('{universeDomain}', this.universeDomain);\n        const subjectTokenType = opts.get('subject_token_type');\n        const workforcePoolUserProject = opts.get('workforce_pool_user_project');\n        const serviceAccountImpersonationUrl = opts.get('service_account_impersonation_url');\n        const serviceAccountImpersonation = opts.get('service_account_impersonation');\n        const serviceAccountImpersonationLifetime = (0, util_1.originalOrCamelOptions)(serviceAccountImpersonation).get('token_lifetime_seconds');\n        this.cloudResourceManagerURL = new URL(opts.get('cloud_resource_manager_url') ||\n            `https://cloudresourcemanager.${this.universeDomain}/v1/projects/`);\n        if (clientId) {\n            this.clientAuth = {\n                confidentialClientType: 'basic',\n                clientId,\n                clientSecret,\n            };\n        }\n        this.stsCredential = new sts.StsCredentials(tokenUrl, this.clientAuth);\n        this.scopes = opts.get('scopes') || [DEFAULT_OAUTH_SCOPE];\n        this.cachedAccessToken = null;\n        this.audience = opts.get('audience');\n        this.subjectTokenType = subjectTokenType;\n        this.workforcePoolUserProject = workforcePoolUserProject;\n        const workforceAudiencePattern = new RegExp(WORKFORCE_AUDIENCE_PATTERN);\n        if (this.workforcePoolUserProject &&\n            !this.audience.match(workforceAudiencePattern)) {\n            throw new Error('workforcePoolUserProject should not be set for non-workforce pool ' +\n                'credentials.');\n        }\n        this.serviceAccountImpersonationUrl = serviceAccountImpersonationUrl;\n        this.serviceAccountImpersonationLifetime =\n            serviceAccountImpersonationLifetime;\n        if (this.serviceAccountImpersonationLifetime) {\n            this.configLifetimeRequested = true;\n        }\n        else {\n            this.configLifetimeRequested = false;\n            this.serviceAccountImpersonationLifetime = DEFAULT_TOKEN_LIFESPAN;\n        }\n        this.projectNumber = this.getProjectNumber(this.audience);\n        this.supplierContext = {\n            audience: this.audience,\n            subjectTokenType: this.subjectTokenType,\n            transporter: this.transporter,\n        };\n    }\n    /** The service account email to be impersonated, if available. */\n    getServiceAccountEmail() {\n        var _a;\n        if (this.serviceAccountImpersonationUrl) {\n            if (this.serviceAccountImpersonationUrl.length > 256) {\n                /**\n                 * Prevents DOS attacks.\n                 * @see {@link https://github.com/googleapis/google-auth-library-nodejs/security/code-scanning/84}\n                 **/\n                throw new RangeError(`URL is too long: ${this.serviceAccountImpersonationUrl}`);\n            }\n            // Parse email from URL. The formal looks as follows:\n            // https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/name@project-id.iam.gserviceaccount.com:generateAccessToken\n            const re = /serviceAccounts\\/(?<email>[^:]+):generateAccessToken$/;\n            const result = re.exec(this.serviceAccountImpersonationUrl);\n            return ((_a = result === null || result === void 0 ? void 0 : result.groups) === null || _a === void 0 ? void 0 : _a.email) || null;\n        }\n        return null;\n    }\n    /**\n     * Provides a mechanism to inject GCP access tokens directly.\n     * When the provided credential expires, a new credential, using the\n     * external account options, is retrieved.\n     * @param credentials The Credentials object to set on the current client.\n     */\n    setCredentials(credentials) {\n        super.setCredentials(credentials);\n        this.cachedAccessToken = credentials;\n    }\n    /**\n     * @return A promise that resolves with the current GCP access token\n     *   response. If the current credential is expired, a new one is retrieved.\n     */\n    async getAccessToken() {\n        // If cached access token is unavailable or expired, force refresh.\n        if (!this.cachedAccessToken || this.isExpired(this.cachedAccessToken)) {\n            await this.refreshAccessTokenAsync();\n        }\n        // Return GCP access token in GetAccessTokenResponse format.\n        return {\n            token: this.cachedAccessToken.access_token,\n            res: this.cachedAccessToken.res,\n        };\n    }\n    /**\n     * The main authentication interface. It takes an optional url which when\n     * present is the endpoint being accessed, and returns a Promise which\n     * resolves with authorization header fields.\n     *\n     * The result has the form:\n     * { Authorization: 'Bearer <access_token_value>' }\n     */\n    async getRequestHeaders() {\n        const accessTokenResponse = await this.getAccessToken();\n        const headers = {\n            Authorization: `Bearer ${accessTokenResponse.token}`,\n        };\n        return this.addSharedMetadataHeaders(headers);\n    }\n    request(opts, callback) {\n        if (callback) {\n            this.requestAsync(opts).then(r => callback(null, r), e => {\n                return callback(e, e.response);\n            });\n        }\n        else {\n            return this.requestAsync(opts);\n        }\n    }\n    /**\n     * @return A promise that resolves with the project ID corresponding to the\n     *   current workload identity pool or current workforce pool if\n     *   determinable. For workforce pool credential, it returns the project ID\n     *   corresponding to the workforcePoolUserProject.\n     *   This is introduced to match the current pattern of using the Auth\n     *   library:\n     *   const projectId = await auth.getProjectId();\n     *   const url = `https://dns.googleapis.com/dns/v1/projects/${projectId}`;\n     *   const res = await client.request({ url });\n     *   The resource may not have permission\n     *   (resourcemanager.projects.get) to call this API or the required\n     *   scopes may not be selected:\n     *   https://cloud.google.com/resource-manager/reference/rest/v1/projects/get#authorization-scopes\n     */\n    async getProjectId() {\n        const projectNumber = this.projectNumber || this.workforcePoolUserProject;\n        if (this.projectId) {\n            // Return previously determined project ID.\n            return this.projectId;\n        }\n        else if (projectNumber) {\n            // Preferable not to use request() to avoid retrial policies.\n            const headers = await this.getRequestHeaders();\n            const response = await this.transporter.request({\n                ...BaseExternalAccountClient.RETRY_CONFIG,\n                headers,\n                url: `${this.cloudResourceManagerURL.toString()}${projectNumber}`,\n                responseType: 'json',\n            });\n            this.projectId = response.data.projectId;\n            return this.projectId;\n        }\n        return null;\n    }\n    /**\n     * Authenticates the provided HTTP request, processes it and resolves with the\n     * returned response.\n     * @param opts The HTTP request options.\n     * @param reAuthRetried Whether the current attempt is a retry after a failed attempt due to an auth failure.\n     * @return A promise that resolves with the successful response.\n     */\n    async requestAsync(opts, reAuthRetried = false) {\n        let response;\n        try {\n            const requestHeaders = await this.getRequestHeaders();\n            opts.headers = opts.headers || {};\n            if (requestHeaders && requestHeaders['x-goog-user-project']) {\n                opts.headers['x-goog-user-project'] =\n                    requestHeaders['x-goog-user-project'];\n            }\n            if (requestHeaders && requestHeaders.Authorization) {\n                opts.headers.Authorization = requestHeaders.Authorization;\n            }\n            response = await this.transporter.request(opts);\n        }\n        catch (e) {\n            const res = e.response;\n            if (res) {\n                const statusCode = res.status;\n                // Retry the request for metadata if the following criteria are true:\n                // - We haven't already retried.  It only makes sense to retry once.\n                // - The response was a 401 or a 403\n                // - The request didn't send a readableStream\n                // - forceRefreshOnFailure is true\n                const isReadableStream = res.config.data instanceof stream.Readable;\n                const isAuthErr = statusCode === 401 || statusCode === 403;\n                if (!reAuthRetried &&\n                    isAuthErr &&\n                    !isReadableStream &&\n                    this.forceRefreshOnFailure) {\n                    await this.refreshAccessTokenAsync();\n                    return await this.requestAsync(opts, true);\n                }\n            }\n            throw e;\n        }\n        return response;\n    }\n    /**\n     * Forces token refresh, even if unexpired tokens are currently cached.\n     * External credentials are exchanged for GCP access tokens via the token\n     * exchange endpoint and other settings provided in the client options\n     * object.\n     * If the service_account_impersonation_url is provided, an additional\n     * step to exchange the external account GCP access token for a service\n     * account impersonated token is performed.\n     * @return A promise that resolves with the fresh GCP access tokens.\n     */\n    async refreshAccessTokenAsync() {\n        // Use an existing access token request, or cache a new one\n        __classPrivateFieldSet(this, _BaseExternalAccountClient_pendingAccessToken, __classPrivateFieldGet(this, _BaseExternalAccountClient_pendingAccessToken, \"f\") || __classPrivateFieldGet(this, _BaseExternalAccountClient_instances, \"m\", _BaseExternalAccountClient_internalRefreshAccessTokenAsync).call(this), \"f\");\n        try {\n            return await __classPrivateFieldGet(this, _BaseExternalAccountClient_pendingAccessToken, \"f\");\n        }\n        finally {\n            // clear pending access token for future requests\n            __classPrivateFieldSet(this, _BaseExternalAccountClient_pendingAccessToken, null, \"f\");\n        }\n    }\n    /**\n     * Returns the workload identity pool project number if it is determinable\n     * from the audience resource name.\n     * @param audience The STS audience used to determine the project number.\n     * @return The project number associated with the workload identity pool, if\n     *   this can be determined from the STS audience field. Otherwise, null is\n     *   returned.\n     */\n    getProjectNumber(audience) {\n        // STS audience pattern:\n        // //iam.googleapis.com/projects/$PROJECT_NUMBER/locations/...\n        const match = audience.match(/\\/projects\\/([^/]+)/);\n        if (!match) {\n            return null;\n        }\n        return match[1];\n    }\n    /**\n     * Exchanges an external account GCP access token for a service\n     * account impersonated access token using iamcredentials\n     * GenerateAccessToken API.\n     * @param token The access token to exchange for a service account access\n     *   token.\n     * @return A promise that resolves with the service account impersonated\n     *   credentials response.\n     */\n    async getImpersonatedAccessToken(token) {\n        const opts = {\n            ...BaseExternalAccountClient.RETRY_CONFIG,\n            url: this.serviceAccountImpersonationUrl,\n            method: 'POST',\n            headers: {\n                'Content-Type': 'application/json',\n                Authorization: `Bearer ${token}`,\n            },\n            data: {\n                scope: this.getScopesArray(),\n                lifetime: this.serviceAccountImpersonationLifetime + 's',\n            },\n            responseType: 'json',\n        };\n        const response = await this.transporter.request(opts);\n        const successResponse = response.data;\n        return {\n            access_token: successResponse.accessToken,\n            // Convert from ISO format to timestamp.\n            expiry_date: new Date(successResponse.expireTime).getTime(),\n            res: response,\n        };\n    }\n    /**\n     * Returns whether the provided credentials are expired or not.\n     * If there is no expiry time, assumes the token is not expired or expiring.\n     * @param accessToken The credentials to check for expiration.\n     * @return Whether the credentials are expired or not.\n     */\n    isExpired(accessToken) {\n        const now = new Date().getTime();\n        return accessToken.expiry_date\n            ? now >= accessToken.expiry_date - this.eagerRefreshThresholdMillis\n            : false;\n    }\n    /**\n     * @return The list of scopes for the requested GCP access token.\n     */\n    getScopesArray() {\n        // Since scopes can be provided as string or array, the type should\n        // be normalized.\n        if (typeof this.scopes === 'string') {\n            return [this.scopes];\n        }\n        return this.scopes || [DEFAULT_OAUTH_SCOPE];\n    }\n    getMetricsHeaderValue() {\n        const nodeVersion = process.version.replace(/^v/, '');\n        const saImpersonation = this.serviceAccountImpersonationUrl !== undefined;\n        const credentialSourceType = this.credentialSourceType\n            ? this.credentialSourceType\n            : 'unknown';\n        return `gl-node/${nodeVersion} auth/${pkg.version} google-byoid-sdk source/${credentialSourceType} sa-impersonation/${saImpersonation} config-lifetime/${this.configLifetimeRequested}`;\n    }\n}\nexports.BaseExternalAccountClient = BaseExternalAccountClient;\n_BaseExternalAccountClient_pendingAccessToken = new WeakMap(), _BaseExternalAccountClient_instances = new WeakSet(), _BaseExternalAccountClient_internalRefreshAccessTokenAsync = async function _BaseExternalAccountClient_internalRefreshAccessTokenAsync() {\n    // Retrieve the external credential.\n    const subjectToken = await this.retrieveSubjectToken();\n    // Construct the STS credentials options.\n    const stsCredentialsOptions = {\n        grantType: STS_GRANT_TYPE,\n        audience: this.audience,\n        requestedTokenType: STS_REQUEST_TOKEN_TYPE,\n        subjectToken,\n        subjectTokenType: this.subjectTokenType,\n        // generateAccessToken requires the provided access token to have\n        // scopes:\n        // https://www.googleapis.com/auth/iam or\n        // https://www.googleapis.com/auth/cloud-platform\n        // The new service account access token scopes will match the user\n        // provided ones.\n        scope: this.serviceAccountImpersonationUrl\n            ? [DEFAULT_OAUTH_SCOPE]\n            : this.getScopesArray(),\n    };\n    // Exchange the external credentials for a GCP access token.\n    // Client auth is prioritized over passing the workforcePoolUserProject\n    // parameter for STS token exchange.\n    const additionalOptions = !this.clientAuth && this.workforcePoolUserProject\n        ? { userProject: this.workforcePoolUserProject }\n        : undefined;\n    const additionalHeaders = {\n        'x-goog-api-client': this.getMetricsHeaderValue(),\n    };\n    const stsResponse = await this.stsCredential.exchangeToken(stsCredentialsOptions, additionalHeaders, additionalOptions);\n    if (this.serviceAccountImpersonationUrl) {\n        this.cachedAccessToken = await this.getImpersonatedAccessToken(stsResponse.access_token);\n    }\n    else if (stsResponse.expires_in) {\n        // Save response in cached access token.\n        this.cachedAccessToken = {\n            access_token: stsResponse.access_token,\n            expiry_date: new Date().getTime() + stsResponse.expires_in * 1000,\n            res: stsResponse.res,\n        };\n    }\n    else {\n        // Save response in cached access token.\n        this.cachedAccessToken = {\n            access_token: stsResponse.access_token,\n            res: stsResponse.res,\n        };\n    }\n    // Save credentials.\n    this.credentials = {};\n    Object.assign(this.credentials, this.cachedAccessToken);\n    delete this.credentials.res;\n    // Trigger tokens event to notify external listeners.\n    this.emit('tokens', {\n        refresh_token: null,\n        expiry_date: this.cachedAccessToken.expiry_date,\n        access_token: this.cachedAccessToken.access_token,\n        token_type: 'Bearer',\n        id_token: null,\n    });\n    // Return the cached access token.\n    return this.cachedAccessToken;\n};\n", "\"use strict\";\n// Copyright 2024 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nvar _a, _b, _c;\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.FileSubjectTokenSupplier = void 0;\nconst util_1 = require(\"util\");\nconst fs = require(\"fs\");\n// fs.readfile is undefined in browser karma tests causing\n// `npm run browser-test` to fail as test.oauth2.ts imports this file via\n// src/index.ts.\n// Fallback to void function to avoid promisify throwing a TypeError.\nconst readFile = (0, util_1.promisify)((_a = fs.readFile) !== null && _a !== void 0 ? _a : (() => { }));\nconst realpath = (0, util_1.promisify)((_b = fs.realpath) !== null && _b !== void 0 ? _b : (() => { }));\nconst lstat = (0, util_1.promisify)((_c = fs.lstat) !== null && _c !== void 0 ? _c : (() => { }));\n/**\n * Internal subject token supplier implementation used when a file location\n * is configured in the credential configuration used to build an {@link IdentityPoolClient}\n */\nclass FileSubjectTokenSupplier {\n    /**\n     * Instantiates a new file based subject token supplier.\n     * @param opts The file subject token supplier options to build the supplier\n     *   with.\n     */\n    constructor(opts) {\n        this.filePath = opts.filePath;\n        this.formatType = opts.formatType;\n        this.subjectTokenFieldName = opts.subjectTokenFieldName;\n    }\n    /**\n     * Returns the subject token stored at the file specified in the constructor.\n     * @param context {@link ExternalAccountSupplierContext} from the calling\n     *   {@link IdentityPoolClient}, contains the requested audience and subject\n     *   token type for the external account identity. Not used.\n     */\n    async getSubjectToken(context) {\n        // Make sure there is a file at the path. lstatSync will throw if there is\n        // nothing there.\n        let parsedFilePath = this.filePath;\n        try {\n            // Resolve path to actual file in case of symlink. Expect a thrown error\n            // if not resolvable.\n            parsedFilePath = await realpath(parsedFilePath);\n            if (!(await lstat(parsedFilePath)).isFile()) {\n                throw new Error();\n            }\n        }\n        catch (err) {\n            if (err instanceof Error) {\n                err.message = `The file at ${parsedFilePath} does not exist, or it is not a file. ${err.message}`;\n            }\n            throw err;\n        }\n        let subjectToken;\n        const rawText = await readFile(parsedFilePath, { encoding: 'utf8' });\n        if (this.formatType === 'text') {\n            subjectToken = rawText;\n        }\n        else if (this.formatType === 'json' && this.subjectTokenFieldName) {\n            const json = JSON.parse(rawText);\n            subjectToken = json[this.subjectTokenFieldName];\n        }\n        if (!subjectToken) {\n            throw new Error('Unable to parse the subject_token from the credential_source file');\n        }\n        return subjectToken;\n    }\n}\nexports.FileSubjectTokenSupplier = FileSubjectTokenSupplier;\n", "\"use strict\";\n// Copyright 2024 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UrlSubjectTokenSupplier = void 0;\n/**\n * Internal subject token supplier implementation used when a URL\n * is configured in the credential configuration used to build an {@link IdentityPoolClient}\n */\nclass UrlSubjectTokenSupplier {\n    /**\n     * Instantiates a URL subject token supplier.\n     * @param opts The URL subject token supplier options to build the supplier with.\n     */\n    constructor(opts) {\n        this.url = opts.url;\n        this.formatType = opts.formatType;\n        this.subjectTokenFieldName = opts.subjectTokenFieldName;\n        this.headers = opts.headers;\n        this.additionalGaxiosOptions = opts.additionalGaxiosOptions;\n    }\n    /**\n     * Sends a GET request to the URL provided in the constructor and resolves\n     * with the returned external subject token.\n     * @param context {@link ExternalAccountSupplierContext} from the calling\n     *   {@link IdentityPoolClient}, contains the requested audience and subject\n     *   token type for the external account identity. Not used.\n     */\n    async getSubjectToken(context) {\n        const opts = {\n            ...this.additionalGaxiosOptions,\n            url: this.url,\n            method: 'GET',\n            headers: this.headers,\n            responseType: this.formatType,\n        };\n        let subjectToken;\n        if (this.formatType === 'text') {\n            const response = await context.transporter.request(opts);\n            subjectToken = response.data;\n        }\n        else if (this.formatType === 'json' && this.subjectTokenFieldName) {\n            const response = await context.transporter.request(opts);\n            subjectToken = response.data[this.subjectTokenFieldName];\n        }\n        if (!subjectToken) {\n            throw new Error('Unable to parse the subject_token from the credential_source URL');\n        }\n        return subjectToken;\n    }\n}\nexports.UrlSubjectTokenSupplier = UrlSubjectTokenSupplier;\n", "\"use strict\";\n// Copyright 2021 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.IdentityPoolClient = void 0;\nconst baseexternalclient_1 = require(\"./baseexternalclient\");\nconst util_1 = require(\"../util\");\nconst filesubjecttokensupplier_1 = require(\"./filesubjecttokensupplier\");\nconst urlsubjecttokensupplier_1 = require(\"./urlsubjecttokensupplier\");\n/**\n * Defines the Url-sourced and file-sourced external account clients mainly\n * used for K8s and Azure workloads.\n */\nclass IdentityPoolClient extends baseexternalclient_1.BaseExternalAccountClient {\n    /**\n     * Instantiate an IdentityPoolClient instance using the provided JSON\n     * object loaded from an external account credentials file.\n     * An error is thrown if the credential is not a valid file-sourced or\n     * url-sourced credential or a workforce pool user project is provided\n     * with a non workforce audience.\n     * @param options The external account options object typically loaded\n     *   from the external account JSON credential file. The camelCased options\n     *   are aliases for the snake_cased options.\n     * @param additionalOptions **DEPRECATED, all options are available in the\n     *   `options` parameter.** Optional additional behavior customization options.\n     *   These currently customize expiration threshold time and whether to retry\n     *   on 401/403 API request errors.\n     */\n    constructor(options, additionalOptions) {\n        super(options, additionalOptions);\n        const opts = (0, util_1.originalOrCamelOptions)(options);\n        const credentialSource = opts.get('credential_source');\n        const subjectTokenSupplier = opts.get('subject_token_supplier');\n        // Validate credential sourcing configuration.\n        if (!credentialSource && !subjectTokenSupplier) {\n            throw new Error('A credential source or subject token supplier must be specified.');\n        }\n        if (credentialSource && subjectTokenSupplier) {\n            throw new Error('Only one of credential source or subject token supplier can be specified.');\n        }\n        if (subjectTokenSupplier) {\n            this.subjectTokenSupplier = subjectTokenSupplier;\n            this.credentialSourceType = 'programmatic';\n        }\n        else {\n            const credentialSourceOpts = (0, util_1.originalOrCamelOptions)(credentialSource);\n            const formatOpts = (0, util_1.originalOrCamelOptions)(credentialSourceOpts.get('format'));\n            // Text is the default format type.\n            const formatType = formatOpts.get('type') || 'text';\n            const formatSubjectTokenFieldName = formatOpts.get('subject_token_field_name');\n            if (formatType !== 'json' && formatType !== 'text') {\n                throw new Error(`Invalid credential_source format \"${formatType}\"`);\n            }\n            if (formatType === 'json' && !formatSubjectTokenFieldName) {\n                throw new Error('Missing subject_token_field_name for JSON credential_source format');\n            }\n            const file = credentialSourceOpts.get('file');\n            const url = credentialSourceOpts.get('url');\n            const headers = credentialSourceOpts.get('headers');\n            if (file && url) {\n                throw new Error('No valid Identity Pool \"credential_source\" provided, must be either file or url.');\n            }\n            else if (file && !url) {\n                this.credentialSourceType = 'file';\n                this.subjectTokenSupplier = new filesubjecttokensupplier_1.FileSubjectTokenSupplier({\n                    filePath: file,\n                    formatType: formatType,\n                    subjectTokenFieldName: formatSubjectTokenFieldName,\n                });\n            }\n            else if (!file && url) {\n                this.credentialSourceType = 'url';\n                this.subjectTokenSupplier = new urlsubjecttokensupplier_1.UrlSubjectTokenSupplier({\n                    url: url,\n                    formatType: formatType,\n                    subjectTokenFieldName: formatSubjectTokenFieldName,\n                    headers: headers,\n                    additionalGaxiosOptions: IdentityPoolClient.RETRY_CONFIG,\n                });\n            }\n            else {\n                throw new Error('No valid Identity Pool \"credential_source\" provided, must be either file or url.');\n            }\n        }\n    }\n    /**\n     * Triggered when a external subject token is needed to be exchanged for a GCP\n     * access token via GCP STS endpoint. Gets a subject token by calling\n     * the configured {@link SubjectTokenSupplier}\n     * @return A promise that resolves with the external subject token.\n     */\n    async retrieveSubjectToken() {\n        return this.subjectTokenSupplier.getSubjectToken(this.supplierContext);\n    }\n}\nexports.IdentityPoolClient = IdentityPoolClient;\n", "\"use strict\";\n// Copyright 2021 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AwsRequestSigner = void 0;\nconst crypto_1 = require(\"../crypto/crypto\");\n/** AWS Signature Version 4 signing algorithm identifier.  */\nconst AWS_ALGORITHM = 'AWS4-HMAC-SHA256';\n/**\n * The termination string for the AWS credential scope value as defined in\n * https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html\n */\nconst AWS_REQUEST_TYPE = 'aws4_request';\n/**\n * Implements an AWS API request signer based on the AWS Signature Version 4\n * signing process.\n * https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html\n */\nclass AwsRequestSigner {\n    /**\n     * Instantiates an AWS API request signer used to send authenticated signed\n     * requests to AWS APIs based on the AWS Signature Version 4 signing process.\n     * This also provides a mechanism to generate the signed request without\n     * sending it.\n     * @param getCredentials A mechanism to retrieve AWS security credentials\n     *   when needed.\n     * @param region The AWS region to use.\n     */\n    constructor(getCredentials, region) {\n        this.getCredentials = getCredentials;\n        this.region = region;\n        this.crypto = (0, crypto_1.createCrypto)();\n    }\n    /**\n     * Generates the signed request for the provided HTTP request for calling\n     * an AWS API. This follows the steps described at:\n     * https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html\n     * @param amzOptions The AWS request options that need to be signed.\n     * @return A promise that resolves with the GaxiosOptions containing the\n     *   signed HTTP request parameters.\n     */\n    async getRequestOptions(amzOptions) {\n        if (!amzOptions.url) {\n            throw new Error('\"url\" is required in \"amzOptions\"');\n        }\n        // Stringify JSON requests. This will be set in the request body of the\n        // generated signed request.\n        const requestPayloadData = typeof amzOptions.data === 'object'\n            ? JSON.stringify(amzOptions.data)\n            : amzOptions.data;\n        const url = amzOptions.url;\n        const method = amzOptions.method || 'GET';\n        const requestPayload = amzOptions.body || requestPayloadData;\n        const additionalAmzHeaders = amzOptions.headers;\n        const awsSecurityCredentials = await this.getCredentials();\n        const uri = new URL(url);\n        const headerMap = await generateAuthenticationHeaderMap({\n            crypto: this.crypto,\n            host: uri.host,\n            canonicalUri: uri.pathname,\n            canonicalQuerystring: uri.search.substr(1),\n            method,\n            region: this.region,\n            securityCredentials: awsSecurityCredentials,\n            requestPayload,\n            additionalAmzHeaders,\n        });\n        // Append additional optional headers, eg. X-Amz-Target, Content-Type, etc.\n        const headers = Object.assign(\n        // Add x-amz-date if available.\n        headerMap.amzDate ? { 'x-amz-date': headerMap.amzDate } : {}, {\n            Authorization: headerMap.authorizationHeader,\n            host: uri.host,\n        }, additionalAmzHeaders || {});\n        if (awsSecurityCredentials.token) {\n            Object.assign(headers, {\n                'x-amz-security-token': awsSecurityCredentials.token,\n            });\n        }\n        const awsSignedReq = {\n            url,\n            method: method,\n            headers,\n        };\n        if (typeof requestPayload !== 'undefined') {\n            awsSignedReq.body = requestPayload;\n        }\n        return awsSignedReq;\n    }\n}\nexports.AwsRequestSigner = AwsRequestSigner;\n/**\n * Creates the HMAC-SHA256 hash of the provided message using the\n * provided key.\n *\n * @param crypto The crypto instance used to facilitate cryptographic\n *   operations.\n * @param key The HMAC-SHA256 key to use.\n * @param msg The message to hash.\n * @return The computed hash bytes.\n */\nasync function sign(crypto, key, msg) {\n    return await crypto.signWithHmacSha256(key, msg);\n}\n/**\n * Calculates the signing key used to calculate the signature for\n * AWS Signature Version 4 based on:\n * https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html\n *\n * @param crypto The crypto instance used to facilitate cryptographic\n *   operations.\n * @param key The AWS secret access key.\n * @param dateStamp The '%Y%m%d' date format.\n * @param region The AWS region.\n * @param serviceName The AWS service name, eg. sts.\n * @return The signing key bytes.\n */\nasync function getSigningKey(crypto, key, dateStamp, region, serviceName) {\n    const kDate = await sign(crypto, `AWS4${key}`, dateStamp);\n    const kRegion = await sign(crypto, kDate, region);\n    const kService = await sign(crypto, kRegion, serviceName);\n    const kSigning = await sign(crypto, kService, 'aws4_request');\n    return kSigning;\n}\n/**\n * Generates the authentication header map needed for generating the AWS\n * Signature Version 4 signed request.\n *\n * @param option The options needed to compute the authentication header map.\n * @return The AWS authentication header map which constitutes of the following\n *   components: amz-date, authorization header and canonical query string.\n */\nasync function generateAuthenticationHeaderMap(options) {\n    const additionalAmzHeaders = options.additionalAmzHeaders || {};\n    const requestPayload = options.requestPayload || '';\n    // iam.amazonaws.com host => iam service.\n    // sts.us-east-2.amazonaws.com => sts service.\n    const serviceName = options.host.split('.')[0];\n    const now = new Date();\n    // Format: '%Y%m%dT%H%M%SZ'.\n    const amzDate = now\n        .toISOString()\n        .replace(/[-:]/g, '')\n        .replace(/\\.[0-9]+/, '');\n    // Format: '%Y%m%d'.\n    const dateStamp = now.toISOString().replace(/[-]/g, '').replace(/T.*/, '');\n    // Change all additional headers to be lower case.\n    const reformattedAdditionalAmzHeaders = {};\n    Object.keys(additionalAmzHeaders).forEach(key => {\n        reformattedAdditionalAmzHeaders[key.toLowerCase()] =\n            additionalAmzHeaders[key];\n    });\n    // Add AWS token if available.\n    if (options.securityCredentials.token) {\n        reformattedAdditionalAmzHeaders['x-amz-security-token'] =\n            options.securityCredentials.token;\n    }\n    // Header keys need to be sorted alphabetically.\n    const amzHeaders = Object.assign({\n        host: options.host,\n    }, \n    // Previously the date was not fixed with x-amz- and could be provided manually.\n    // https://github.com/boto/botocore/blob/879f8440a4e9ace5d3cf145ce8b3d5e5ffb892ef/tests/unit/auth/aws4_testsuite/get-header-value-trim.req\n    reformattedAdditionalAmzHeaders.date ? {} : { 'x-amz-date': amzDate }, reformattedAdditionalAmzHeaders);\n    let canonicalHeaders = '';\n    const signedHeadersList = Object.keys(amzHeaders).sort();\n    signedHeadersList.forEach(key => {\n        canonicalHeaders += `${key}:${amzHeaders[key]}\\n`;\n    });\n    const signedHeaders = signedHeadersList.join(';');\n    const payloadHash = await options.crypto.sha256DigestHex(requestPayload);\n    // https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html\n    const canonicalRequest = `${options.method}\\n` +\n        `${options.canonicalUri}\\n` +\n        `${options.canonicalQuerystring}\\n` +\n        `${canonicalHeaders}\\n` +\n        `${signedHeaders}\\n` +\n        `${payloadHash}`;\n    const credentialScope = `${dateStamp}/${options.region}/${serviceName}/${AWS_REQUEST_TYPE}`;\n    // https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html\n    const stringToSign = `${AWS_ALGORITHM}\\n` +\n        `${amzDate}\\n` +\n        `${credentialScope}\\n` +\n        (await options.crypto.sha256DigestHex(canonicalRequest));\n    // https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html\n    const signingKey = await getSigningKey(options.crypto, options.securityCredentials.secretAccessKey, dateStamp, options.region, serviceName);\n    const signature = await sign(options.crypto, signingKey, stringToSign);\n    // https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n    const authorizationHeader = `${AWS_ALGORITHM} Credential=${options.securityCredentials.accessKeyId}/` +\n        `${credentialScope}, SignedHeaders=${signedHeaders}, ` +\n        `Signature=${(0, crypto_1.fromArrayBufferToHex)(signature)}`;\n    return {\n        // Do not return x-amz-date if date is available.\n        amzDate: reformattedAdditionalAmzHeaders.date ? undefined : amzDate,\n        authorizationHeader,\n        canonicalQuerystring: options.canonicalQuerystring,\n    };\n}\n", "\"use strict\";\n// Copyright 2024 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nvar __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n    return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar _DefaultAwsSecurityCredentialsSupplier_instances, _DefaultAwsSecurityCredentialsSupplier_getImdsV2SessionToken, _DefaultAwsSecurityCredentialsSupplier_getAwsRoleName, _DefaultAwsSecurityCredentialsSupplier_retrieveAwsSecurityCredentials, _DefaultAwsSecurityCredentialsSupplier_regionFromEnv_get, _DefaultAwsSecurityCredentialsSupplier_securityCredentialsFromEnv_get;\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DefaultAwsSecurityCredentialsSupplier = void 0;\n/**\n * Internal AWS security credentials supplier implementation used by {@link AwsClient}\n * when a credential source is provided instead of a user defined supplier.\n * The logic is summarized as:\n * 1. If imdsv2_session_token_url is provided in the credential source, then\n *    fetch the aws session token and include it in the headers of the\n *    metadata requests. This is a requirement for IDMSv2 but optional\n *    for IDMSv1.\n * 2. Retrieve AWS region from availability-zone.\n * 3a. Check AWS credentials in environment variables. If not found, get\n *     from security-credentials endpoint.\n * 3b. Get AWS credentials from security-credentials endpoint. In order\n *     to retrieve this, the AWS role needs to be determined by calling\n *     security-credentials endpoint without any argument. Then the\n *     credentials can be retrieved via: security-credentials/role_name\n * 4. Generate the signed request to AWS STS GetCallerIdentity action.\n * 5. Inject x-goog-cloud-target-resource into header and serialize the\n *    signed request. This will be the subject-token to pass to GCP STS.\n */\nclass DefaultAwsSecurityCredentialsSupplier {\n    /**\n     * Instantiates a new DefaultAwsSecurityCredentialsSupplier using information\n     * from the credential_source stored in the ADC file.\n     * @param opts The default aws security credentials supplier options object to\n     *   build the supplier with.\n     */\n    constructor(opts) {\n        _DefaultAwsSecurityCredentialsSupplier_instances.add(this);\n        this.regionUrl = opts.regionUrl;\n        this.securityCredentialsUrl = opts.securityCredentialsUrl;\n        this.imdsV2SessionTokenUrl = opts.imdsV2SessionTokenUrl;\n        this.additionalGaxiosOptions = opts.additionalGaxiosOptions;\n    }\n    /**\n     * Returns the active AWS region. This first checks to see if the region\n     * is available as an environment variable. If it is not, then the supplier\n     * will call the region URL.\n     * @param context {@link ExternalAccountSupplierContext} from the calling\n     *   {@link AwsClient}, contains the requested audience and subject token type\n     *   for the external account identity.\n     * @return A promise that resolves with the AWS region string.\n     */\n    async getAwsRegion(context) {\n        // Priority order for region determination:\n        // AWS_REGION > AWS_DEFAULT_REGION > metadata server.\n        if (__classPrivateFieldGet(this, _DefaultAwsSecurityCredentialsSupplier_instances, \"a\", _DefaultAwsSecurityCredentialsSupplier_regionFromEnv_get)) {\n            return __classPrivateFieldGet(this, _DefaultAwsSecurityCredentialsSupplier_instances, \"a\", _DefaultAwsSecurityCredentialsSupplier_regionFromEnv_get);\n        }\n        const metadataHeaders = {};\n        if (!__classPrivateFieldGet(this, _DefaultAwsSecurityCredentialsSupplier_instances, \"a\", _DefaultAwsSecurityCredentialsSupplier_regionFromEnv_get) && this.imdsV2SessionTokenUrl) {\n            metadataHeaders['x-aws-ec2-metadata-token'] =\n                await __classPrivateFieldGet(this, _DefaultAwsSecurityCredentialsSupplier_instances, \"m\", _DefaultAwsSecurityCredentialsSupplier_getImdsV2SessionToken).call(this, context.transporter);\n        }\n        if (!this.regionUrl) {\n            throw new Error('Unable to determine AWS region due to missing ' +\n                '\"options.credential_source.region_url\"');\n        }\n        const opts = {\n            ...this.additionalGaxiosOptions,\n            url: this.regionUrl,\n            method: 'GET',\n            responseType: 'text',\n            headers: metadataHeaders,\n        };\n        const response = await context.transporter.request(opts);\n        // Remove last character. For example, if us-east-2b is returned,\n        // the region would be us-east-2.\n        return response.data.substr(0, response.data.length - 1);\n    }\n    /**\n     * Returns AWS security credentials. This first checks to see if the credentials\n     * is available as environment variables. If it is not, then the supplier\n     * will call the security credentials URL.\n     * @param context {@link ExternalAccountSupplierContext} from the calling\n     *   {@link AwsClient}, contains the requested audience and subject token type\n     *   for the external account identity.\n     * @return A promise that resolves with the AWS security credentials.\n     */\n    async getAwsSecurityCredentials(context) {\n        // Check environment variables for permanent credentials first.\n        // https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html\n        if (__classPrivateFieldGet(this, _DefaultAwsSecurityCredentialsSupplier_instances, \"a\", _DefaultAwsSecurityCredentialsSupplier_securityCredentialsFromEnv_get)) {\n            return __classPrivateFieldGet(this, _DefaultAwsSecurityCredentialsSupplier_instances, \"a\", _DefaultAwsSecurityCredentialsSupplier_securityCredentialsFromEnv_get);\n        }\n        const metadataHeaders = {};\n        if (this.imdsV2SessionTokenUrl) {\n            metadataHeaders['x-aws-ec2-metadata-token'] =\n                await __classPrivateFieldGet(this, _DefaultAwsSecurityCredentialsSupplier_instances, \"m\", _DefaultAwsSecurityCredentialsSupplier_getImdsV2SessionToken).call(this, context.transporter);\n        }\n        // Since the role on a VM can change, we don't need to cache it.\n        const roleName = await __classPrivateFieldGet(this, _DefaultAwsSecurityCredentialsSupplier_instances, \"m\", _DefaultAwsSecurityCredentialsSupplier_getAwsRoleName).call(this, metadataHeaders, context.transporter);\n        // Temporary credentials typically last for several hours.\n        // Expiration is returned in response.\n        // Consider future optimization of this logic to cache AWS tokens\n        // until their natural expiration.\n        const awsCreds = await __classPrivateFieldGet(this, _DefaultAwsSecurityCredentialsSupplier_instances, \"m\", _DefaultAwsSecurityCredentialsSupplier_retrieveAwsSecurityCredentials).call(this, roleName, metadataHeaders, context.transporter);\n        return {\n            accessKeyId: awsCreds.AccessKeyId,\n            secretAccessKey: awsCreds.SecretAccessKey,\n            token: awsCreds.Token,\n        };\n    }\n}\nexports.DefaultAwsSecurityCredentialsSupplier = DefaultAwsSecurityCredentialsSupplier;\n_DefaultAwsSecurityCredentialsSupplier_instances = new WeakSet(), _DefaultAwsSecurityCredentialsSupplier_getImdsV2SessionToken = \n/**\n * @param transporter The transporter to use for requests.\n * @return A promise that resolves with the IMDSv2 Session Token.\n */\nasync function _DefaultAwsSecurityCredentialsSupplier_getImdsV2SessionToken(transporter) {\n    const opts = {\n        ...this.additionalGaxiosOptions,\n        url: this.imdsV2SessionTokenUrl,\n        method: 'PUT',\n        responseType: 'text',\n        headers: { 'x-aws-ec2-metadata-token-ttl-seconds': '300' },\n    };\n    const response = await transporter.request(opts);\n    return response.data;\n}, _DefaultAwsSecurityCredentialsSupplier_getAwsRoleName = \n/**\n * @param headers The headers to be used in the metadata request.\n * @param transporter The transporter to use for requests.\n * @return A promise that resolves with the assigned role to the current\n *   AWS VM. This is needed for calling the security-credentials endpoint.\n */\nasync function _DefaultAwsSecurityCredentialsSupplier_getAwsRoleName(headers, transporter) {\n    if (!this.securityCredentialsUrl) {\n        throw new Error('Unable to determine AWS role name due to missing ' +\n            '\"options.credential_source.url\"');\n    }\n    const opts = {\n        ...this.additionalGaxiosOptions,\n        url: this.securityCredentialsUrl,\n        method: 'GET',\n        responseType: 'text',\n        headers: headers,\n    };\n    const response = await transporter.request(opts);\n    return response.data;\n}, _DefaultAwsSecurityCredentialsSupplier_retrieveAwsSecurityCredentials = \n/**\n * Retrieves the temporary AWS credentials by calling the security-credentials\n * endpoint as specified in the `credential_source` object.\n * @param roleName The role attached to the current VM.\n * @param headers The headers to be used in the metadata request.\n * @param transporter The transporter to use for requests.\n * @return A promise that resolves with the temporary AWS credentials\n *   needed for creating the GetCallerIdentity signed request.\n */\nasync function _DefaultAwsSecurityCredentialsSupplier_retrieveAwsSecurityCredentials(roleName, headers, transporter) {\n    const response = await transporter.request({\n        ...this.additionalGaxiosOptions,\n        url: `${this.securityCredentialsUrl}/${roleName}`,\n        responseType: 'json',\n        headers: headers,\n    });\n    return response.data;\n}, _DefaultAwsSecurityCredentialsSupplier_regionFromEnv_get = function _DefaultAwsSecurityCredentialsSupplier_regionFromEnv_get() {\n    // The AWS region can be provided through AWS_REGION or AWS_DEFAULT_REGION.\n    // Only one is required.\n    return (process.env['AWS_REGION'] || process.env['AWS_DEFAULT_REGION'] || null);\n}, _DefaultAwsSecurityCredentialsSupplier_securityCredentialsFromEnv_get = function _DefaultAwsSecurityCredentialsSupplier_securityCredentialsFromEnv_get() {\n    // Both AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY are required.\n    if (process.env['AWS_ACCESS_KEY_ID'] &&\n        process.env['AWS_SECRET_ACCESS_KEY']) {\n        return {\n            accessKeyId: process.env['AWS_ACCESS_KEY_ID'],\n            secretAccessKey: process.env['AWS_SECRET_ACCESS_KEY'],\n            token: process.env['AWS_SESSION_TOKEN'],\n        };\n    }\n    return null;\n};\n", "\"use strict\";\n// Copyright 2021 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nvar __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n    return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar _a, _AwsClient_DEFAULT_AWS_REGIONAL_CREDENTIAL_VERIFICATION_URL;\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AwsClient = void 0;\nconst awsrequestsigner_1 = require(\"./awsrequestsigner\");\nconst baseexternalclient_1 = require(\"./baseexternalclient\");\nconst defaultawssecuritycredentialssupplier_1 = require(\"./defaultawssecuritycredentialssupplier\");\nconst util_1 = require(\"../util\");\n/**\n * AWS external account client. This is used for AWS workloads, where\n * AWS STS GetCallerIdentity serialized signed requests are exchanged for\n * GCP access token.\n */\nclass AwsClient extends baseexternalclient_1.BaseExternalAccountClient {\n    /**\n     * Instantiates an AwsClient instance using the provided JSON\n     * object loaded from an external account credentials file.\n     * An error is thrown if the credential is not a valid AWS credential.\n     * @param options The external account options object typically loaded\n     *   from the external account JSON credential file.\n     * @param additionalOptions **DEPRECATED, all options are available in the\n     *   `options` parameter.** Optional additional behavior customization options.\n     *   These currently customize expiration threshold time and whether to retry\n     *   on 401/403 API request errors.\n     */\n    constructor(options, additionalOptions) {\n        super(options, additionalOptions);\n        const opts = (0, util_1.originalOrCamelOptions)(options);\n        const credentialSource = opts.get('credential_source');\n        const awsSecurityCredentialsSupplier = opts.get('aws_security_credentials_supplier');\n        // Validate credential sourcing configuration.\n        if (!credentialSource && !awsSecurityCredentialsSupplier) {\n            throw new Error('A credential source or AWS security credentials supplier must be specified.');\n        }\n        if (credentialSource && awsSecurityCredentialsSupplier) {\n            throw new Error('Only one of credential source or AWS security credentials supplier can be specified.');\n        }\n        if (awsSecurityCredentialsSupplier) {\n            this.awsSecurityCredentialsSupplier = awsSecurityCredentialsSupplier;\n            this.regionalCredVerificationUrl =\n                __classPrivateFieldGet(_a, _a, \"f\", _AwsClient_DEFAULT_AWS_REGIONAL_CREDENTIAL_VERIFICATION_URL);\n            this.credentialSourceType = 'programmatic';\n        }\n        else {\n            const credentialSourceOpts = (0, util_1.originalOrCamelOptions)(credentialSource);\n            this.environmentId = credentialSourceOpts.get('environment_id');\n            // This is only required if the AWS region is not available in the\n            // AWS_REGION or AWS_DEFAULT_REGION environment variables.\n            const regionUrl = credentialSourceOpts.get('region_url');\n            // This is only required if AWS security credentials are not available in\n            // environment variables.\n            const securityCredentialsUrl = credentialSourceOpts.get('url');\n            const imdsV2SessionTokenUrl = credentialSourceOpts.get('imdsv2_session_token_url');\n            this.awsSecurityCredentialsSupplier =\n                new defaultawssecuritycredentialssupplier_1.DefaultAwsSecurityCredentialsSupplier({\n                    regionUrl: regionUrl,\n                    securityCredentialsUrl: securityCredentialsUrl,\n                    imdsV2SessionTokenUrl: imdsV2SessionTokenUrl,\n                });\n            this.regionalCredVerificationUrl = credentialSourceOpts.get('regional_cred_verification_url');\n            this.credentialSourceType = 'aws';\n            // Data validators.\n            this.validateEnvironmentId();\n        }\n        this.awsRequestSigner = null;\n        this.region = '';\n    }\n    validateEnvironmentId() {\n        var _b;\n        const match = (_b = this.environmentId) === null || _b === void 0 ? void 0 : _b.match(/^(aws)(\\d+)$/);\n        if (!match || !this.regionalCredVerificationUrl) {\n            throw new Error('No valid AWS \"credential_source\" provided');\n        }\n        else if (parseInt(match[2], 10) !== 1) {\n            throw new Error(`aws version \"${match[2]}\" is not supported in the current build.`);\n        }\n    }\n    /**\n     * Triggered when an external subject token is needed to be exchanged for a\n     * GCP access token via GCP STS endpoint. This will call the\n     * {@link AwsSecurityCredentialsSupplier} to retrieve an AWS region and AWS\n     * Security Credentials, then use them to create a signed AWS STS request that\n     * can be exchanged for a GCP access token.\n     * @return A promise that resolves with the external subject token.\n     */\n    async retrieveSubjectToken() {\n        // Initialize AWS request signer if not already initialized.\n        if (!this.awsRequestSigner) {\n            this.region = await this.awsSecurityCredentialsSupplier.getAwsRegion(this.supplierContext);\n            this.awsRequestSigner = new awsrequestsigner_1.AwsRequestSigner(async () => {\n                return this.awsSecurityCredentialsSupplier.getAwsSecurityCredentials(this.supplierContext);\n            }, this.region);\n        }\n        // Generate signed request to AWS STS GetCallerIdentity API.\n        // Use the required regional endpoint. Otherwise, the request will fail.\n        const options = await this.awsRequestSigner.getRequestOptions({\n            ..._a.RETRY_CONFIG,\n            url: this.regionalCredVerificationUrl.replace('{region}', this.region),\n            method: 'POST',\n        });\n        // The GCP STS endpoint expects the headers to be formatted as:\n        // [\n        //   {key: 'x-amz-date', value: '...'},\n        //   {key: 'Authorization', value: '...'},\n        //   ...\n        // ]\n        // And then serialized as:\n        // encodeURIComponent(JSON.stringify({\n        //   url: '...',\n        //   method: 'POST',\n        //   headers: [{key: 'x-amz-date', value: '...'}, ...]\n        // }))\n        const reformattedHeader = [];\n        const extendedHeaders = Object.assign({\n            // The full, canonical resource name of the workload identity pool\n            // provider, with or without the HTTPS prefix.\n            // Including this header as part of the signature is recommended to\n            // ensure data integrity.\n            'x-goog-cloud-target-resource': this.audience,\n        }, options.headers);\n        // Reformat header to GCP STS expected format.\n        for (const key in extendedHeaders) {\n            reformattedHeader.push({\n                key,\n                value: extendedHeaders[key],\n            });\n        }\n        // Serialize the reformatted signed request.\n        return encodeURIComponent(JSON.stringify({\n            url: options.url,\n            method: options.method,\n            headers: reformattedHeader,\n        }));\n    }\n}\nexports.AwsClient = AwsClient;\n_a = AwsClient;\n_AwsClient_DEFAULT_AWS_REGIONAL_CREDENTIAL_VERIFICATION_URL = { value: 'https://sts.{region}.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15' };\n/**\n * @deprecated AWS client no validates the EC2 metadata address.\n **/\nAwsClient.AWS_EC2_METADATA_IPV4_ADDRESS = '169.254.169.254';\n/**\n * @deprecated AWS client no validates the EC2 metadata address.\n **/\nAwsClient.AWS_EC2_METADATA_IPV6_ADDRESS = 'fd00:ec2::254';\n", "\"use strict\";\n// Copyright 2022 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.InvalidSubjectTokenError = exports.InvalidMessageFieldError = exports.InvalidCodeFieldError = exports.InvalidTokenTypeFieldError = exports.InvalidExpirationTimeFieldError = exports.InvalidSuccessFieldError = exports.InvalidVersionFieldError = exports.ExecutableResponseError = exports.ExecutableResponse = void 0;\nconst SAML_SUBJECT_TOKEN_TYPE = 'urn:ietf:params:oauth:token-type:saml2';\nconst OIDC_SUBJECT_TOKEN_TYPE1 = 'urn:ietf:params:oauth:token-type:id_token';\nconst OIDC_SUBJECT_TOKEN_TYPE2 = 'urn:ietf:params:oauth:token-type:jwt';\n/**\n * Defines the response of a 3rd party executable run by the pluggable auth client.\n */\nclass ExecutableResponse {\n    /**\n     * Instantiates an ExecutableResponse instance using the provided JSON object\n     * from the output of the executable.\n     * @param responseJson Response from a 3rd party executable, loaded from a\n     * run of the executable or a cached output file.\n     */\n    constructor(responseJson) {\n        // Check that the required fields exist in the json response.\n        if (!responseJson.version) {\n            throw new InvalidVersionFieldError(\"Executable response must contain a 'version' field.\");\n        }\n        if (responseJson.success === undefined) {\n            throw new InvalidSuccessFieldError(\"Executable response must contain a 'success' field.\");\n        }\n        this.version = responseJson.version;\n        this.success = responseJson.success;\n        // Validate required fields for a successful response.\n        if (this.success) {\n            this.expirationTime = responseJson.expiration_time;\n            this.tokenType = responseJson.token_type;\n            // Validate token type field.\n            if (this.tokenType !== SAML_SUBJECT_TOKEN_TYPE &&\n                this.tokenType !== OIDC_SUBJECT_TOKEN_TYPE1 &&\n                this.tokenType !== OIDC_SUBJECT_TOKEN_TYPE2) {\n                throw new InvalidTokenTypeFieldError(\"Executable response must contain a 'token_type' field when successful \" +\n                    `and it must be one of ${OIDC_SUBJECT_TOKEN_TYPE1}, ${OIDC_SUBJECT_TOKEN_TYPE2}, or ${SAML_SUBJECT_TOKEN_TYPE}.`);\n            }\n            // Validate subject token.\n            if (this.tokenType === SAML_SUBJECT_TOKEN_TYPE) {\n                if (!responseJson.saml_response) {\n                    throw new InvalidSubjectTokenError(`Executable response must contain a 'saml_response' field when token_type=${SAML_SUBJECT_TOKEN_TYPE}.`);\n                }\n                this.subjectToken = responseJson.saml_response;\n            }\n            else {\n                if (!responseJson.id_token) {\n                    throw new InvalidSubjectTokenError(\"Executable response must contain a 'id_token' field when \" +\n                        `token_type=${OIDC_SUBJECT_TOKEN_TYPE1} or ${OIDC_SUBJECT_TOKEN_TYPE2}.`);\n                }\n                this.subjectToken = responseJson.id_token;\n            }\n        }\n        else {\n            // Both code and message must be provided for unsuccessful responses.\n            if (!responseJson.code) {\n                throw new InvalidCodeFieldError(\"Executable response must contain a 'code' field when unsuccessful.\");\n            }\n            if (!responseJson.message) {\n                throw new InvalidMessageFieldError(\"Executable response must contain a 'message' field when unsuccessful.\");\n            }\n            this.errorCode = responseJson.code;\n            this.errorMessage = responseJson.message;\n        }\n    }\n    /**\n     * @return A boolean representing if the response has a valid token. Returns\n     * true when the response was successful and the token is not expired.\n     */\n    isValid() {\n        return !this.isExpired() && this.success;\n    }\n    /**\n     * @return A boolean representing if the response is expired. Returns true if the\n     * provided timeout has passed.\n     */\n    isExpired() {\n        return (this.expirationTime !== undefined &&\n            this.expirationTime < Math.round(Date.now() / 1000));\n    }\n}\nexports.ExecutableResponse = ExecutableResponse;\n/**\n * An error thrown by the ExecutableResponse class.\n */\nclass ExecutableResponseError extends Error {\n    constructor(message) {\n        super(message);\n        Object.setPrototypeOf(this, new.target.prototype);\n    }\n}\nexports.ExecutableResponseError = ExecutableResponseError;\n/**\n * An error thrown when the 'version' field in an executable response is missing or invalid.\n */\nclass InvalidVersionFieldError extends ExecutableResponseError {\n}\nexports.InvalidVersionFieldError = InvalidVersionFieldError;\n/**\n * An error thrown when the 'success' field in an executable response is missing or invalid.\n */\nclass InvalidSuccessFieldError extends ExecutableResponseError {\n}\nexports.InvalidSuccessFieldError = InvalidSuccessFieldError;\n/**\n * An error thrown when the 'expiration_time' field in an executable response is missing or invalid.\n */\nclass InvalidExpirationTimeFieldError extends ExecutableResponseError {\n}\nexports.InvalidExpirationTimeFieldError = InvalidExpirationTimeFieldError;\n/**\n * An error thrown when the 'token_type' field in an executable response is missing or invalid.\n */\nclass InvalidTokenTypeFieldError extends ExecutableResponseError {\n}\nexports.InvalidTokenTypeFieldError = InvalidTokenTypeFieldError;\n/**\n * An error thrown when the 'code' field in an executable response is missing or invalid.\n */\nclass InvalidCodeFieldError extends ExecutableResponseError {\n}\nexports.InvalidCodeFieldError = InvalidCodeFieldError;\n/**\n * An error thrown when the 'message' field in an executable response is missing or invalid.\n */\nclass InvalidMessageFieldError extends ExecutableResponseError {\n}\nexports.InvalidMessageFieldError = InvalidMessageFieldError;\n/**\n * An error thrown when the subject token in an executable response is missing or invalid.\n */\nclass InvalidSubjectTokenError extends ExecutableResponseError {\n}\nexports.InvalidSubjectTokenError = InvalidSubjectTokenError;\n", "\"use strict\";\n// Copyright 2022 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PluggableAuthHandler = void 0;\nconst pluggable_auth_client_1 = require(\"./pluggable-auth-client\");\nconst executable_response_1 = require(\"./executable-response\");\nconst childProcess = require(\"child_process\");\nconst fs = require(\"fs\");\n/**\n * A handler used to retrieve 3rd party token responses from user defined\n * executables and cached file output for the PluggableAuthClient class.\n */\nclass PluggableAuthHandler {\n    /**\n     * Instantiates a PluggableAuthHandler instance using the provided\n     * PluggableAuthHandlerOptions object.\n     */\n    constructor(options) {\n        if (!options.command) {\n            throw new Error('No command provided.');\n        }\n        this.commandComponents = PluggableAuthHandler.parseCommand(options.command);\n        this.timeoutMillis = options.timeoutMillis;\n        if (!this.timeoutMillis) {\n            throw new Error('No timeoutMillis provided.');\n        }\n        this.outputFile = options.outputFile;\n    }\n    /**\n     * Calls user provided executable to get a 3rd party subject token and\n     * returns the response.\n     * @param envMap a Map of additional Environment Variables required for\n     *   the executable.\n     * @return A promise that resolves with the executable response.\n     */\n    retrieveResponseFromExecutable(envMap) {\n        return new Promise((resolve, reject) => {\n            // Spawn process to run executable using added environment variables.\n            const child = childProcess.spawn(this.commandComponents[0], this.commandComponents.slice(1), {\n                env: { ...process.env, ...Object.fromEntries(envMap) },\n            });\n            let output = '';\n            // Append stdout to output as executable runs.\n            child.stdout.on('data', (data) => {\n                output += data;\n            });\n            // Append stderr as executable runs.\n            child.stderr.on('data', (err) => {\n                output += err;\n            });\n            // Set up a timeout to end the child process and throw an error.\n            const timeout = setTimeout(() => {\n                // Kill child process and remove listeners so 'close' event doesn't get\n                // read after child process is killed.\n                child.removeAllListeners();\n                child.kill();\n                return reject(new Error('The executable failed to finish within the timeout specified.'));\n            }, this.timeoutMillis);\n            child.on('close', (code) => {\n                // Cancel timeout if executable closes before timeout is reached.\n                clearTimeout(timeout);\n                if (code === 0) {\n                    // If the executable completed successfully, try to return the parsed response.\n                    try {\n                        const responseJson = JSON.parse(output);\n                        const response = new executable_response_1.ExecutableResponse(responseJson);\n                        return resolve(response);\n                    }\n                    catch (error) {\n                        if (error instanceof executable_response_1.ExecutableResponseError) {\n                            return reject(error);\n                        }\n                        return reject(new executable_response_1.ExecutableResponseError(`The executable returned an invalid response: ${output}`));\n                    }\n                }\n                else {\n                    return reject(new pluggable_auth_client_1.ExecutableError(output, code.toString()));\n                }\n            });\n        });\n    }\n    /**\n     * Checks user provided output file for response from previous run of\n     * executable and return the response if it exists, is formatted correctly, and is not expired.\n     */\n    async retrieveCachedResponse() {\n        if (!this.outputFile || this.outputFile.length === 0) {\n            return undefined;\n        }\n        let filePath;\n        try {\n            filePath = await fs.promises.realpath(this.outputFile);\n        }\n        catch (_a) {\n            // If file path cannot be resolved, return undefined.\n            return undefined;\n        }\n        if (!(await fs.promises.lstat(filePath)).isFile()) {\n            // If path does not lead to file, return undefined.\n            return undefined;\n        }\n        const responseString = await fs.promises.readFile(filePath, {\n            encoding: 'utf8',\n        });\n        if (responseString === '') {\n            return undefined;\n        }\n        try {\n            const responseJson = JSON.parse(responseString);\n            const response = new executable_response_1.ExecutableResponse(responseJson);\n            // Check if response is successful and unexpired.\n            if (response.isValid()) {\n                return new executable_response_1.ExecutableResponse(responseJson);\n            }\n            return undefined;\n        }\n        catch (error) {\n            if (error instanceof executable_response_1.ExecutableResponseError) {\n                throw error;\n            }\n            throw new executable_response_1.ExecutableResponseError(`The output file contained an invalid response: ${responseString}`);\n        }\n    }\n    /**\n     * Parses given command string into component array, splitting on spaces unless\n     * spaces are between quotation marks.\n     */\n    static parseCommand(command) {\n        // Split the command into components by splitting on spaces,\n        // unless spaces are contained in quotation marks.\n        const components = command.match(/(?:[^\\s\"]+|\"[^\"]*\")+/g);\n        if (!components) {\n            throw new Error(`Provided command: \"${command}\" could not be parsed.`);\n        }\n        // Remove quotation marks from the beginning and end of each component if they are present.\n        for (let i = 0; i < components.length; i++) {\n            if (components[i][0] === '\"' && components[i].slice(-1) === '\"') {\n                components[i] = components[i].slice(1, -1);\n            }\n        }\n        return components;\n    }\n}\nexports.PluggableAuthHandler = PluggableAuthHandler;\n", "\"use strict\";\n// Copyright 2022 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PluggableAuthClient = exports.ExecutableError = void 0;\nconst baseexternalclient_1 = require(\"./baseexternalclient\");\nconst executable_response_1 = require(\"./executable-response\");\nconst pluggable_auth_handler_1 = require(\"./pluggable-auth-handler\");\n/**\n * Error thrown from the executable run by PluggableAuthClient.\n */\nclass ExecutableError extends Error {\n    constructor(message, code) {\n        super(`The executable failed with exit code: ${code} and error message: ${message}.`);\n        this.code = code;\n        Object.setPrototypeOf(this, new.target.prototype);\n    }\n}\nexports.ExecutableError = ExecutableError;\n/**\n * The default executable timeout when none is provided, in milliseconds.\n */\nconst DEFAULT_EXECUTABLE_TIMEOUT_MILLIS = 30 * 1000;\n/**\n * The minimum allowed executable timeout in milliseconds.\n */\nconst MINIMUM_EXECUTABLE_TIMEOUT_MILLIS = 5 * 1000;\n/**\n * The maximum allowed executable timeout in milliseconds.\n */\nconst MAXIMUM_EXECUTABLE_TIMEOUT_MILLIS = 120 * 1000;\n/**\n * The environment variable to check to see if executable can be run.\n * Value must be set to '1' for the executable to run.\n */\nconst GOOGLE_EXTERNAL_ACCOUNT_ALLOW_EXECUTABLES = 'GOOGLE_EXTERNAL_ACCOUNT_ALLOW_EXECUTABLES';\n/**\n * The maximum currently supported executable version.\n */\nconst MAXIMUM_EXECUTABLE_VERSION = 1;\n/**\n * PluggableAuthClient enables the exchange of workload identity pool external credentials for\n * Google access tokens by retrieving 3rd party tokens through a user supplied executable. These\n * scripts/executables are completely independent of the Google Cloud Auth libraries. These\n * credentials plug into ADC and will call the specified executable to retrieve the 3rd party token\n * to be exchanged for a Google access token.\n *\n * <p>To use these credentials, the GOOGLE_EXTERNAL_ACCOUNT_ALLOW_EXECUTABLES environment variable\n * must be set to '1'. This is for security reasons.\n *\n * <p>Both OIDC and SAML are supported. The executable must adhere to a specific response format\n * defined below.\n *\n * <p>The executable must print out the 3rd party token to STDOUT in JSON format. When an\n * output_file is specified in the credential configuration, the executable must also handle writing the\n * JSON response to this file.\n *\n * <pre>\n * OIDC response sample:\n * {\n *   \"version\": 1,\n *   \"success\": true,\n *   \"token_type\": \"urn:ietf:params:oauth:token-type:id_token\",\n *   \"id_token\": \"HEADER.PAYLOAD.SIGNATURE\",\n *   \"expiration_time\": 1620433341\n * }\n *\n * SAML2 response sample:\n * {\n *   \"version\": 1,\n *   \"success\": true,\n *   \"token_type\": \"urn:ietf:params:oauth:token-type:saml2\",\n *   \"saml_response\": \"...\",\n *   \"expiration_time\": 1620433341\n * }\n *\n * Error response sample:\n * {\n *   \"version\": 1,\n *   \"success\": false,\n *   \"code\": \"401\",\n *   \"message\": \"Error message.\"\n * }\n * </pre>\n *\n * <p>The \"expiration_time\" field in the JSON response is only required for successful\n * responses when an output file was specified in the credential configuration\n *\n * <p>The auth libraries will populate certain environment variables that will be accessible by the\n * executable, such as: GOOGLE_EXTERNAL_ACCOUNT_AUDIENCE, GOOGLE_EXTERNAL_ACCOUNT_TOKEN_TYPE,\n * GOOGLE_EXTERNAL_ACCOUNT_INTERACTIVE, GOOGLE_EXTERNAL_ACCOUNT_IMPERSONATED_EMAIL, and\n * GOOGLE_EXTERNAL_ACCOUNT_OUTPUT_FILE.\n *\n * <p>Please see this repositories README for a complete executable request/response specification.\n */\nclass PluggableAuthClient extends baseexternalclient_1.BaseExternalAccountClient {\n    /**\n     * Instantiates a PluggableAuthClient instance using the provided JSON\n     * object loaded from an external account credentials file.\n     * An error is thrown if the credential is not a valid pluggable auth credential.\n     * @param options The external account options object typically loaded from\n     *   the external account JSON credential file.\n     * @param additionalOptions **DEPRECATED, all options are available in the\n     *   `options` parameter.** Optional additional behavior customization options.\n     *   These currently customize expiration threshold time and whether to retry\n     *   on 401/403 API request errors.\n     */\n    constructor(options, additionalOptions) {\n        super(options, additionalOptions);\n        if (!options.credential_source.executable) {\n            throw new Error('No valid Pluggable Auth \"credential_source\" provided.');\n        }\n        this.command = options.credential_source.executable.command;\n        if (!this.command) {\n            throw new Error('No valid Pluggable Auth \"credential_source\" provided.');\n        }\n        // Check if the provided timeout exists and if it is valid.\n        if (options.credential_source.executable.timeout_millis === undefined) {\n            this.timeoutMillis = DEFAULT_EXECUTABLE_TIMEOUT_MILLIS;\n        }\n        else {\n            this.timeoutMillis = options.credential_source.executable.timeout_millis;\n            if (this.timeoutMillis < MINIMUM_EXECUTABLE_TIMEOUT_MILLIS ||\n                this.timeoutMillis > MAXIMUM_EXECUTABLE_TIMEOUT_MILLIS) {\n                throw new Error(`Timeout must be between ${MINIMUM_EXECUTABLE_TIMEOUT_MILLIS} and ` +\n                    `${MAXIMUM_EXECUTABLE_TIMEOUT_MILLIS} milliseconds.`);\n            }\n        }\n        this.outputFile = options.credential_source.executable.output_file;\n        this.handler = new pluggable_auth_handler_1.PluggableAuthHandler({\n            command: this.command,\n            timeoutMillis: this.timeoutMillis,\n            outputFile: this.outputFile,\n        });\n        this.credentialSourceType = 'executable';\n    }\n    /**\n     * Triggered when an external subject token is needed to be exchanged for a\n     * GCP access token via GCP STS endpoint.\n     * This uses the `options.credential_source` object to figure out how\n     * to retrieve the token using the current environment. In this case,\n     * this calls a user provided executable which returns the subject token.\n     * The logic is summarized as:\n     * 1. Validated that the executable is allowed to run. The\n     *    GOOGLE_EXTERNAL_ACCOUNT_ALLOW_EXECUTABLES environment must be set to\n     *    1 for security reasons.\n     * 2. If an output file is specified by the user, check the file location\n     *    for a response. If the file exists and contains a valid response,\n     *    return the subject token from the file.\n     * 3. Call the provided executable and return response.\n     * @return A promise that resolves with the external subject token.\n     */\n    async retrieveSubjectToken() {\n        // Check if the executable is allowed to run.\n        if (process.env[GOOGLE_EXTERNAL_ACCOUNT_ALLOW_EXECUTABLES] !== '1') {\n            throw new Error('Pluggable Auth executables need to be explicitly allowed to run by ' +\n                'setting the GOOGLE_EXTERNAL_ACCOUNT_ALLOW_EXECUTABLES environment ' +\n                'Variable to 1.');\n        }\n        let executableResponse = undefined;\n        // Try to get cached executable response from output file.\n        if (this.outputFile) {\n            executableResponse = await this.handler.retrieveCachedResponse();\n        }\n        // If no response from output file, call the executable.\n        if (!executableResponse) {\n            // Set up environment map with required values for the executable.\n            const envMap = new Map();\n            envMap.set('GOOGLE_EXTERNAL_ACCOUNT_AUDIENCE', this.audience);\n            envMap.set('GOOGLE_EXTERNAL_ACCOUNT_TOKEN_TYPE', this.subjectTokenType);\n            // Always set to 0 because interactive mode is not supported.\n            envMap.set('GOOGLE_EXTERNAL_ACCOUNT_INTERACTIVE', '0');\n            if (this.outputFile) {\n                envMap.set('GOOGLE_EXTERNAL_ACCOUNT_OUTPUT_FILE', this.outputFile);\n            }\n            const serviceAccountEmail = this.getServiceAccountEmail();\n            if (serviceAccountEmail) {\n                envMap.set('GOOGLE_EXTERNAL_ACCOUNT_IMPERSONATED_EMAIL', serviceAccountEmail);\n            }\n            executableResponse =\n                await this.handler.retrieveResponseFromExecutable(envMap);\n        }\n        if (executableResponse.version > MAXIMUM_EXECUTABLE_VERSION) {\n            throw new Error(`Version of executable is not currently supported, maximum supported version is ${MAXIMUM_EXECUTABLE_VERSION}.`);\n        }\n        // Check that response was successful.\n        if (!executableResponse.success) {\n            throw new ExecutableError(executableResponse.errorMessage, executableResponse.errorCode);\n        }\n        // Check that response contains expiration time if output file was specified.\n        if (this.outputFile) {\n            if (!executableResponse.expirationTime) {\n                throw new executable_response_1.InvalidExpirationTimeFieldError('The executable response must contain the `expiration_time` field for successful responses when an output_file has been specified in the configuration.');\n            }\n        }\n        // Check that response is not expired.\n        if (executableResponse.isExpired()) {\n            throw new Error('Executable response is expired.');\n        }\n        // Return subject token from response.\n        return executableResponse.subjectToken;\n    }\n}\nexports.PluggableAuthClient = PluggableAuthClient;\n", "\"use strict\";\n// Copyright 2021 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ExternalAccountClient = void 0;\nconst baseexternalclient_1 = require(\"./baseexternalclient\");\nconst identitypoolclient_1 = require(\"./identitypoolclient\");\nconst awsclient_1 = require(\"./awsclient\");\nconst pluggable_auth_client_1 = require(\"./pluggable-auth-client\");\n/**\n * Dummy class with no constructor. Developers are expected to use fromJSON.\n */\nclass ExternalAccountClient {\n    constructor() {\n        throw new Error('ExternalAccountClients should be initialized via: ' +\n            'ExternalAccountClient.fromJSON(), ' +\n            'directly via explicit constructors, eg. ' +\n            'new AwsClient(options), new IdentityPoolClient(options), new' +\n            'PluggableAuthClientOptions, or via ' +\n            'new GoogleAuth(options).getClient()');\n    }\n    /**\n     * This static method will instantiate the\n     * corresponding type of external account credential depending on the\n     * underlying credential source.\n     * @param options The external account options object typically loaded\n     *   from the external account JSON credential file.\n     * @param additionalOptions **DEPRECATED, all options are available in the\n     *   `options` parameter.** Optional additional behavior customization options.\n     *   These currently customize expiration threshold time and whether to retry\n     *   on 401/403 API request errors.\n     * @return A BaseExternalAccountClient instance or null if the options\n     *   provided do not correspond to an external account credential.\n     */\n    static fromJSON(options, additionalOptions) {\n        var _a, _b;\n        if (options && options.type === baseexternalclient_1.EXTERNAL_ACCOUNT_TYPE) {\n            if ((_a = options.credential_source) === null || _a === void 0 ? void 0 : _a.environment_id) {\n                return new awsclient_1.AwsClient(options, additionalOptions);\n            }\n            else if ((_b = options.credential_source) === null || _b === void 0 ? void 0 : _b.executable) {\n                return new pluggable_auth_client_1.PluggableAuthClient(options, additionalOptions);\n            }\n            else {\n                return new identitypoolclient_1.IdentityPoolClient(options, additionalOptions);\n            }\n        }\n        else {\n            return null;\n        }\n    }\n}\nexports.ExternalAccountClient = ExternalAccountClient;\n", "\"use strict\";\n// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ExternalAccountAuthorizedUserClient = exports.EXTERNAL_ACCOUNT_AUTHORIZED_USER_TYPE = void 0;\nconst authclient_1 = require(\"./authclient\");\nconst oauth2common_1 = require(\"./oauth2common\");\nconst gaxios_1 = require(\"gaxios\");\nconst stream = require(\"stream\");\nconst baseexternalclient_1 = require(\"./baseexternalclient\");\n/**\n * The credentials JSON file type for external account authorized user clients.\n */\nexports.EXTERNAL_ACCOUNT_AUTHORIZED_USER_TYPE = 'external_account_authorized_user';\nconst DEFAULT_TOKEN_URL = 'https://sts.{universeDomain}/v1/oauthtoken';\n/**\n * Handler for token refresh requests sent to the token_url endpoint for external\n * authorized user credentials.\n */\nclass ExternalAccountAuthorizedUserHandler extends oauth2common_1.OAuthClientAuthHandler {\n    /**\n     * Initializes an ExternalAccountAuthorizedUserHandler instance.\n     * @param url The URL of the token refresh endpoint.\n     * @param transporter The transporter to use for the refresh request.\n     * @param clientAuthentication The client authentication credentials to use\n     *   for the refresh request.\n     */\n    constructor(url, transporter, clientAuthentication) {\n        super(clientAuthentication);\n        this.url = url;\n        this.transporter = transporter;\n    }\n    /**\n     * Requests a new access token from the token_url endpoint using the provided\n     *   refresh token.\n     * @param refreshToken The refresh token to use to generate a new access token.\n     * @param additionalHeaders Optional additional headers to pass along the\n     *   request.\n     * @return A promise that resolves with the token refresh response containing\n     *   the requested access token and its expiration time.\n     */\n    async refreshToken(refreshToken, additionalHeaders) {\n        const values = new URLSearchParams({\n            grant_type: 'refresh_token',\n            refresh_token: refreshToken,\n        });\n        const headers = {\n            'Content-Type': 'application/x-www-form-urlencoded',\n            ...additionalHeaders,\n        };\n        const opts = {\n            ...ExternalAccountAuthorizedUserHandler.RETRY_CONFIG,\n            url: this.url,\n            method: 'POST',\n            headers,\n            data: values.toString(),\n            responseType: 'json',\n        };\n        // Apply OAuth client authentication.\n        this.applyClientAuthenticationOptions(opts);\n        try {\n            const response = await this.transporter.request(opts);\n            // Successful response.\n            const tokenRefreshResponse = response.data;\n            tokenRefreshResponse.res = response;\n            return tokenRefreshResponse;\n        }\n        catch (error) {\n            // Translate error to OAuthError.\n            if (error instanceof gaxios_1.GaxiosError && error.response) {\n                throw (0, oauth2common_1.getErrorFromOAuthErrorResponse)(error.response.data, \n                // Preserve other fields from the original error.\n                error);\n            }\n            // Request could fail before the server responds.\n            throw error;\n        }\n    }\n}\n/**\n * External Account Authorized User Client. This is used for OAuth2 credentials\n * sourced using external identities through Workforce Identity Federation.\n * Obtaining the initial access and refresh token can be done through the\n * Google Cloud CLI.\n */\nclass ExternalAccountAuthorizedUserClient extends authclient_1.AuthClient {\n    /**\n     * Instantiates an ExternalAccountAuthorizedUserClient instances using the\n     * provided JSON object loaded from a credentials files.\n     * An error is throws if the credential is not valid.\n     * @param options The external account authorized user option object typically\n     *   from the external accoutn authorized user JSON credential file.\n     * @param additionalOptions **DEPRECATED, all options are available in the\n     *   `options` parameter.** Optional additional behavior customization options.\n     *   These currently customize expiration threshold time and whether to retry\n     *   on 401/403 API request errors.\n     */\n    constructor(options, additionalOptions) {\n        var _a;\n        super({ ...options, ...additionalOptions });\n        if (options.universe_domain) {\n            this.universeDomain = options.universe_domain;\n        }\n        this.refreshToken = options.refresh_token;\n        const clientAuth = {\n            confidentialClientType: 'basic',\n            clientId: options.client_id,\n            clientSecret: options.client_secret,\n        };\n        this.externalAccountAuthorizedUserHandler =\n            new ExternalAccountAuthorizedUserHandler((_a = options.token_url) !== null && _a !== void 0 ? _a : DEFAULT_TOKEN_URL.replace('{universeDomain}', this.universeDomain), this.transporter, clientAuth);\n        this.cachedAccessToken = null;\n        this.quotaProjectId = options.quota_project_id;\n        // As threshold could be zero,\n        // eagerRefreshThresholdMillis || EXPIRATION_TIME_OFFSET will override the\n        // zero value.\n        if (typeof (additionalOptions === null || additionalOptions === void 0 ? void 0 : additionalOptions.eagerRefreshThresholdMillis) !== 'number') {\n            this.eagerRefreshThresholdMillis = baseexternalclient_1.EXPIRATION_TIME_OFFSET;\n        }\n        else {\n            this.eagerRefreshThresholdMillis = additionalOptions\n                .eagerRefreshThresholdMillis;\n        }\n        this.forceRefreshOnFailure = !!(additionalOptions === null || additionalOptions === void 0 ? void 0 : additionalOptions.forceRefreshOnFailure);\n    }\n    async getAccessToken() {\n        // If cached access token is unavailable or expired, force refresh.\n        if (!this.cachedAccessToken || this.isExpired(this.cachedAccessToken)) {\n            await this.refreshAccessTokenAsync();\n        }\n        // Return GCP access token in GetAccessTokenResponse format.\n        return {\n            token: this.cachedAccessToken.access_token,\n            res: this.cachedAccessToken.res,\n        };\n    }\n    async getRequestHeaders() {\n        const accessTokenResponse = await this.getAccessToken();\n        const headers = {\n            Authorization: `Bearer ${accessTokenResponse.token}`,\n        };\n        return this.addSharedMetadataHeaders(headers);\n    }\n    request(opts, callback) {\n        if (callback) {\n            this.requestAsync(opts).then(r => callback(null, r), e => {\n                return callback(e, e.response);\n            });\n        }\n        else {\n            return this.requestAsync(opts);\n        }\n    }\n    /**\n     * Authenticates the provided HTTP request, processes it and resolves with the\n     * returned response.\n     * @param opts The HTTP request options.\n     * @param reAuthRetried Whether the current attempt is a retry after a failed attempt due to an auth failure.\n     * @return A promise that resolves with the successful response.\n     */\n    async requestAsync(opts, reAuthRetried = false) {\n        let response;\n        try {\n            const requestHeaders = await this.getRequestHeaders();\n            opts.headers = opts.headers || {};\n            if (requestHeaders && requestHeaders['x-goog-user-project']) {\n                opts.headers['x-goog-user-project'] =\n                    requestHeaders['x-goog-user-project'];\n            }\n            if (requestHeaders && requestHeaders.Authorization) {\n                opts.headers.Authorization = requestHeaders.Authorization;\n            }\n            response = await this.transporter.request(opts);\n        }\n        catch (e) {\n            const res = e.response;\n            if (res) {\n                const statusCode = res.status;\n                // Retry the request for metadata if the following criteria are true:\n                // - We haven't already retried.  It only makes sense to retry once.\n                // - The response was a 401 or a 403\n                // - The request didn't send a readableStream\n                // - forceRefreshOnFailure is true\n                const isReadableStream = res.config.data instanceof stream.Readable;\n                const isAuthErr = statusCode === 401 || statusCode === 403;\n                if (!reAuthRetried &&\n                    isAuthErr &&\n                    !isReadableStream &&\n                    this.forceRefreshOnFailure) {\n                    await this.refreshAccessTokenAsync();\n                    return await this.requestAsync(opts, true);\n                }\n            }\n            throw e;\n        }\n        return response;\n    }\n    /**\n     * Forces token refresh, even if unexpired tokens are currently cached.\n     * @return A promise that resolves with the refreshed credential.\n     */\n    async refreshAccessTokenAsync() {\n        // Refresh the access token using the refresh token.\n        const refreshResponse = await this.externalAccountAuthorizedUserHandler.refreshToken(this.refreshToken);\n        this.cachedAccessToken = {\n            access_token: refreshResponse.access_token,\n            expiry_date: new Date().getTime() + refreshResponse.expires_in * 1000,\n            res: refreshResponse.res,\n        };\n        if (refreshResponse.refresh_token !== undefined) {\n            this.refreshToken = refreshResponse.refresh_token;\n        }\n        return this.cachedAccessToken;\n    }\n    /**\n     * Returns whether the provided credentials are expired or not.\n     * If there is no expiry time, assumes the token is not expired or expiring.\n     * @param credentials The credentials to check for expiration.\n     * @return Whether the credentials are expired or not.\n     */\n    isExpired(credentials) {\n        const now = new Date().getTime();\n        return credentials.expiry_date\n            ? now >= credentials.expiry_date - this.eagerRefreshThresholdMillis\n            : false;\n    }\n}\nexports.ExternalAccountAuthorizedUserClient = ExternalAccountAuthorizedUserClient;\n", "\"use strict\";\n// Copyright 2019 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nvar __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n    return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {\n    if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n    return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n};\nvar _GoogleAuth_instances, _GoogleAuth_pendingAuthClient, _GoogleAuth_prepareAndCacheClient, _GoogleAuth_determineClient;\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GoogleAuth = exports.GoogleAuthExceptionMessages = exports.CLOUD_SDK_CLIENT_ID = void 0;\nconst child_process_1 = require(\"child_process\");\nconst fs = require(\"fs\");\nconst gcpMetadata = require(\"gcp-metadata\");\nconst os = require(\"os\");\nconst path = require(\"path\");\nconst crypto_1 = require(\"../crypto/crypto\");\nconst transporters_1 = require(\"../transporters\");\nconst computeclient_1 = require(\"./computeclient\");\nconst idtokenclient_1 = require(\"./idtokenclient\");\nconst envDetect_1 = require(\"./envDetect\");\nconst jwtclient_1 = require(\"./jwtclient\");\nconst refreshclient_1 = require(\"./refreshclient\");\nconst impersonated_1 = require(\"./impersonated\");\nconst externalclient_1 = require(\"./externalclient\");\nconst baseexternalclient_1 = require(\"./baseexternalclient\");\nconst authclient_1 = require(\"./authclient\");\nconst externalAccountAuthorizedUserClient_1 = require(\"./externalAccountAuthorizedUserClient\");\nconst util_1 = require(\"../util\");\nexports.CLOUD_SDK_CLIENT_ID = '764086051850-6qr4p6gpi6hn506pt8ejuq83di341hur.apps.googleusercontent.com';\nexports.GoogleAuthExceptionMessages = {\n    API_KEY_WITH_CREDENTIALS: 'API Keys and Credentials are mutually exclusive authentication methods and cannot be used together.',\n    NO_PROJECT_ID_FOUND: 'Unable to detect a Project Id in the current environment. \\n' +\n        'To learn more about authentication and Google APIs, visit: \\n' +\n        'https://cloud.google.com/docs/authentication/getting-started',\n    NO_CREDENTIALS_FOUND: 'Unable to find credentials in current environment. \\n' +\n        'To learn more about authentication and Google APIs, visit: \\n' +\n        'https://cloud.google.com/docs/authentication/getting-started',\n    NO_ADC_FOUND: 'Could not load the default credentials. Browse to https://cloud.google.com/docs/authentication/getting-started for more information.',\n    NO_UNIVERSE_DOMAIN_FOUND: 'Unable to detect a Universe Domain in the current environment.\\n' +\n        'To learn more about Universe Domain retrieval, visit: \\n' +\n        'https://cloud.google.com/compute/docs/metadata/predefined-metadata-keys',\n};\nclass GoogleAuth {\n    // Note:  this properly is only public to satisfy unit tests.\n    // https://github.com/Microsoft/TypeScript/issues/5228\n    get isGCE() {\n        return this.checkIsGCE;\n    }\n    /**\n     * Configuration is resolved in the following order of precedence:\n     * - {@link GoogleAuthOptions.credentials `credentials`}\n     * - {@link GoogleAuthOptions.keyFilename `keyFilename`}\n     * - {@link GoogleAuthOptions.keyFile `keyFile`}\n     *\n     * {@link GoogleAuthOptions.clientOptions `clientOptions`} are passed to the\n     * {@link AuthClient `AuthClient`s}.\n     *\n     * @param opts\n     */\n    constructor(opts = {}) {\n        _GoogleAuth_instances.add(this);\n        /**\n         * Caches a value indicating whether the auth layer is running on Google\n         * Compute Engine.\n         * @private\n         */\n        this.checkIsGCE = undefined;\n        // To save the contents of the JSON credential file\n        this.jsonContent = null;\n        this.cachedCredential = null;\n        /**\n         * A pending {@link AuthClient}. Used for concurrent {@link GoogleAuth.getClient} calls.\n         */\n        _GoogleAuth_pendingAuthClient.set(this, null);\n        this.clientOptions = {};\n        this._cachedProjectId = opts.projectId || null;\n        this.cachedCredential = opts.authClient || null;\n        this.keyFilename = opts.keyFilename || opts.keyFile;\n        this.scopes = opts.scopes;\n        this.clientOptions = opts.clientOptions || {};\n        this.jsonContent = opts.credentials || null;\n        this.apiKey = opts.apiKey || this.clientOptions.apiKey || null;\n        // Cannot use both API Key + Credentials\n        if (this.apiKey && (this.jsonContent || this.clientOptions.credentials)) {\n            throw new RangeError(exports.GoogleAuthExceptionMessages.API_KEY_WITH_CREDENTIALS);\n        }\n        if (opts.universeDomain) {\n            this.clientOptions.universeDomain = opts.universeDomain;\n        }\n    }\n    // GAPIC client libraries should always use self-signed JWTs. The following\n    // variables are set on the JWT client in order to indicate the type of library,\n    // and sign the JWT with the correct audience and scopes (if not supplied).\n    setGapicJWTValues(client) {\n        client.defaultServicePath = this.defaultServicePath;\n        client.useJWTAccessWithScope = this.useJWTAccessWithScope;\n        client.defaultScopes = this.defaultScopes;\n    }\n    getProjectId(callback) {\n        if (callback) {\n            this.getProjectIdAsync().then(r => callback(null, r), callback);\n        }\n        else {\n            return this.getProjectIdAsync();\n        }\n    }\n    /**\n     * A temporary method for internal `getProjectId` usages where `null` is\n     * acceptable. In a future major release, `getProjectId` should return `null`\n     * (as the `Promise<string | null>` base signature describes) and this private\n     * method should be removed.\n     *\n     * @returns Promise that resolves with project id (or `null`)\n     */\n    async getProjectIdOptional() {\n        try {\n            return await this.getProjectId();\n        }\n        catch (e) {\n            if (e instanceof Error &&\n                e.message === exports.GoogleAuthExceptionMessages.NO_PROJECT_ID_FOUND) {\n                return null;\n            }\n            else {\n                throw e;\n            }\n        }\n    }\n    /**\n     * A private method for finding and caching a projectId.\n     *\n     * Supports environments in order of precedence:\n     * - GCLOUD_PROJECT or GOOGLE_CLOUD_PROJECT environment variable\n     * - GOOGLE_APPLICATION_CREDENTIALS JSON file\n     * - Cloud SDK: `gcloud config config-helper --format json`\n     * - GCE project ID from metadata server\n     *\n     * @returns projectId\n     */\n    async findAndCacheProjectId() {\n        let projectId = null;\n        projectId || (projectId = await this.getProductionProjectId());\n        projectId || (projectId = await this.getFileProjectId());\n        projectId || (projectId = await this.getDefaultServiceProjectId());\n        projectId || (projectId = await this.getGCEProjectId());\n        projectId || (projectId = await this.getExternalAccountClientProjectId());\n        if (projectId) {\n            this._cachedProjectId = projectId;\n            return projectId;\n        }\n        else {\n            throw new Error(exports.GoogleAuthExceptionMessages.NO_PROJECT_ID_FOUND);\n        }\n    }\n    async getProjectIdAsync() {\n        if (this._cachedProjectId) {\n            return this._cachedProjectId;\n        }\n        if (!this._findProjectIdPromise) {\n            this._findProjectIdPromise = this.findAndCacheProjectId();\n        }\n        return this._findProjectIdPromise;\n    }\n    /**\n     * Retrieves a universe domain from the metadata server via\n     * {@link gcpMetadata.universe}.\n     *\n     * @returns a universe domain\n     */\n    async getUniverseDomainFromMetadataServer() {\n        var _a;\n        let universeDomain;\n        try {\n            universeDomain = await gcpMetadata.universe('universe-domain');\n            universeDomain || (universeDomain = authclient_1.DEFAULT_UNIVERSE);\n        }\n        catch (e) {\n            if (e && ((_a = e === null || e === void 0 ? void 0 : e.response) === null || _a === void 0 ? void 0 : _a.status) === 404) {\n                universeDomain = authclient_1.DEFAULT_UNIVERSE;\n            }\n            else {\n                throw e;\n            }\n        }\n        return universeDomain;\n    }\n    /**\n     * Retrieves, caches, and returns the universe domain in the following order\n     * of precedence:\n     * - The universe domain in {@link GoogleAuth.clientOptions}\n     * - An existing or ADC {@link AuthClient}'s universe domain\n     * - {@link gcpMetadata.universe}, if {@link Compute} client\n     *\n     * @returns The universe domain\n     */\n    async getUniverseDomain() {\n        let universeDomain = (0, util_1.originalOrCamelOptions)(this.clientOptions).get('universe_domain');\n        try {\n            universeDomain !== null && universeDomain !== void 0 ? universeDomain : (universeDomain = (await this.getClient()).universeDomain);\n        }\n        catch (_a) {\n            // client or ADC is not available\n            universeDomain !== null && universeDomain !== void 0 ? universeDomain : (universeDomain = authclient_1.DEFAULT_UNIVERSE);\n        }\n        return universeDomain;\n    }\n    /**\n     * @returns Any scopes (user-specified or default scopes specified by the\n     *   client library) that need to be set on the current Auth client.\n     */\n    getAnyScopes() {\n        return this.scopes || this.defaultScopes;\n    }\n    getApplicationDefault(optionsOrCallback = {}, callback) {\n        let options;\n        if (typeof optionsOrCallback === 'function') {\n            callback = optionsOrCallback;\n        }\n        else {\n            options = optionsOrCallback;\n        }\n        if (callback) {\n            this.getApplicationDefaultAsync(options).then(r => callback(null, r.credential, r.projectId), callback);\n        }\n        else {\n            return this.getApplicationDefaultAsync(options);\n        }\n    }\n    async getApplicationDefaultAsync(options = {}) {\n        // If we've already got a cached credential, return it.\n        // This will also preserve one's configured quota project, in case they\n        // set one directly on the credential previously.\n        if (this.cachedCredential) {\n            // cache, while preserving existing quota project preferences\n            return await __classPrivateFieldGet(this, _GoogleAuth_instances, \"m\", _GoogleAuth_prepareAndCacheClient).call(this, this.cachedCredential, null);\n        }\n        let credential;\n        // Check for the existence of a local environment variable pointing to the\n        // location of the credential file. This is typically used in local\n        // developer scenarios.\n        credential =\n            await this._tryGetApplicationCredentialsFromEnvironmentVariable(options);\n        if (credential) {\n            if (credential instanceof jwtclient_1.JWT) {\n                credential.scopes = this.scopes;\n            }\n            else if (credential instanceof baseexternalclient_1.BaseExternalAccountClient) {\n                credential.scopes = this.getAnyScopes();\n            }\n            return await __classPrivateFieldGet(this, _GoogleAuth_instances, \"m\", _GoogleAuth_prepareAndCacheClient).call(this, credential);\n        }\n        // Look in the well-known credential file location.\n        credential =\n            await this._tryGetApplicationCredentialsFromWellKnownFile(options);\n        if (credential) {\n            if (credential instanceof jwtclient_1.JWT) {\n                credential.scopes = this.scopes;\n            }\n            else if (credential instanceof baseexternalclient_1.BaseExternalAccountClient) {\n                credential.scopes = this.getAnyScopes();\n            }\n            return await __classPrivateFieldGet(this, _GoogleAuth_instances, \"m\", _GoogleAuth_prepareAndCacheClient).call(this, credential);\n        }\n        // Determine if we're running on GCE.\n        if (await this._checkIsGCE()) {\n            options.scopes = this.getAnyScopes();\n            return await __classPrivateFieldGet(this, _GoogleAuth_instances, \"m\", _GoogleAuth_prepareAndCacheClient).call(this, new computeclient_1.Compute(options));\n        }\n        throw new Error(exports.GoogleAuthExceptionMessages.NO_ADC_FOUND);\n    }\n    /**\n     * Determines whether the auth layer is running on Google Compute Engine.\n     * Checks for GCP Residency, then fallback to checking if metadata server\n     * is available.\n     *\n     * @returns A promise that resolves with the boolean.\n     * @api private\n     */\n    async _checkIsGCE() {\n        if (this.checkIsGCE === undefined) {\n            this.checkIsGCE =\n                gcpMetadata.getGCPResidency() || (await gcpMetadata.isAvailable());\n        }\n        return this.checkIsGCE;\n    }\n    /**\n     * Attempts to load default credentials from the environment variable path..\n     * @returns Promise that resolves with the OAuth2Client or null.\n     * @api private\n     */\n    async _tryGetApplicationCredentialsFromEnvironmentVariable(options) {\n        const credentialsPath = process.env['GOOGLE_APPLICATION_CREDENTIALS'] ||\n            process.env['google_application_credentials'];\n        if (!credentialsPath || credentialsPath.length === 0) {\n            return null;\n        }\n        try {\n            return this._getApplicationCredentialsFromFilePath(credentialsPath, options);\n        }\n        catch (e) {\n            if (e instanceof Error) {\n                e.message = `Unable to read the credential file specified by the GOOGLE_APPLICATION_CREDENTIALS environment variable: ${e.message}`;\n            }\n            throw e;\n        }\n    }\n    /**\n     * Attempts to load default credentials from a well-known file location\n     * @return Promise that resolves with the OAuth2Client or null.\n     * @api private\n     */\n    async _tryGetApplicationCredentialsFromWellKnownFile(options) {\n        // First, figure out the location of the file, depending upon the OS type.\n        let location = null;\n        if (this._isWindows()) {\n            // Windows\n            location = process.env['APPDATA'];\n        }\n        else {\n            // Linux or Mac\n            const home = process.env['HOME'];\n            if (home) {\n                location = path.join(home, '.config');\n            }\n        }\n        // If we found the root path, expand it.\n        if (location) {\n            location = path.join(location, 'gcloud', 'application_default_credentials.json');\n            if (!fs.existsSync(location)) {\n                location = null;\n            }\n        }\n        // The file does not exist.\n        if (!location) {\n            return null;\n        }\n        // The file seems to exist. Try to use it.\n        const client = await this._getApplicationCredentialsFromFilePath(location, options);\n        return client;\n    }\n    /**\n     * Attempts to load default credentials from a file at the given path..\n     * @param filePath The path to the file to read.\n     * @returns Promise that resolves with the OAuth2Client\n     * @api private\n     */\n    async _getApplicationCredentialsFromFilePath(filePath, options = {}) {\n        // Make sure the path looks like a string.\n        if (!filePath || filePath.length === 0) {\n            throw new Error('The file path is invalid.');\n        }\n        // Make sure there is a file at the path. lstatSync will throw if there is\n        // nothing there.\n        try {\n            // Resolve path to actual file in case of symlink. Expect a thrown error\n            // if not resolvable.\n            filePath = fs.realpathSync(filePath);\n            if (!fs.lstatSync(filePath).isFile()) {\n                throw new Error();\n            }\n        }\n        catch (err) {\n            if (err instanceof Error) {\n                err.message = `The file at ${filePath} does not exist, or it is not a file. ${err.message}`;\n            }\n            throw err;\n        }\n        // Now open a read stream on the file, and parse it.\n        const readStream = fs.createReadStream(filePath);\n        return this.fromStream(readStream, options);\n    }\n    /**\n     * Create a credentials instance using a given impersonated input options.\n     * @param json The impersonated input object.\n     * @returns JWT or UserRefresh Client with data\n     */\n    fromImpersonatedJSON(json) {\n        var _a, _b, _c, _d;\n        if (!json) {\n            throw new Error('Must pass in a JSON object containing an  impersonated refresh token');\n        }\n        if (json.type !== impersonated_1.IMPERSONATED_ACCOUNT_TYPE) {\n            throw new Error(`The incoming JSON object does not have the \"${impersonated_1.IMPERSONATED_ACCOUNT_TYPE}\" type`);\n        }\n        if (!json.source_credentials) {\n            throw new Error('The incoming JSON object does not contain a source_credentials field');\n        }\n        if (!json.service_account_impersonation_url) {\n            throw new Error('The incoming JSON object does not contain a service_account_impersonation_url field');\n        }\n        const sourceClient = this.fromJSON(json.source_credentials);\n        if (((_a = json.service_account_impersonation_url) === null || _a === void 0 ? void 0 : _a.length) > 256) {\n            /**\n             * Prevents DOS attacks.\n             * @see {@link https://github.com/googleapis/google-auth-library-nodejs/security/code-scanning/85}\n             **/\n            throw new RangeError(`Target principal is too long: ${json.service_account_impersonation_url}`);\n        }\n        // Extract service account from service_account_impersonation_url\n        const targetPrincipal = (_c = (_b = /(?<target>[^/]+):(generateAccessToken|generateIdToken)$/.exec(json.service_account_impersonation_url)) === null || _b === void 0 ? void 0 : _b.groups) === null || _c === void 0 ? void 0 : _c.target;\n        if (!targetPrincipal) {\n            throw new RangeError(`Cannot extract target principal from ${json.service_account_impersonation_url}`);\n        }\n        const targetScopes = (_d = this.getAnyScopes()) !== null && _d !== void 0 ? _d : [];\n        return new impersonated_1.Impersonated({\n            ...json,\n            sourceClient,\n            targetPrincipal,\n            targetScopes: Array.isArray(targetScopes) ? targetScopes : [targetScopes],\n        });\n    }\n    /**\n     * Create a credentials instance using the given input options.\n     * This client is not cached.\n     *\n     * **Important**: If you accept a credential configuration (credential JSON/File/Stream) from an external source for authentication to Google Cloud, you must validate it before providing it to any Google API or library. Providing an unvalidated credential configuration to Google APIs can compromise the security of your systems and data. For more information, refer to {@link https://cloud.google.com/docs/authentication/external/externally-sourced-credentials Validate credential configurations from external sources}.\n     *\n     * @param json The input object.\n     * @param options The JWT or UserRefresh options for the client\n     * @returns JWT or UserRefresh Client with data\n     */\n    fromJSON(json, options = {}) {\n        let client;\n        // user's preferred universe domain\n        const preferredUniverseDomain = (0, util_1.originalOrCamelOptions)(options).get('universe_domain');\n        if (json.type === refreshclient_1.USER_REFRESH_ACCOUNT_TYPE) {\n            client = new refreshclient_1.UserRefreshClient(options);\n            client.fromJSON(json);\n        }\n        else if (json.type === impersonated_1.IMPERSONATED_ACCOUNT_TYPE) {\n            client = this.fromImpersonatedJSON(json);\n        }\n        else if (json.type === baseexternalclient_1.EXTERNAL_ACCOUNT_TYPE) {\n            client = externalclient_1.ExternalAccountClient.fromJSON(json, options);\n            client.scopes = this.getAnyScopes();\n        }\n        else if (json.type === externalAccountAuthorizedUserClient_1.EXTERNAL_ACCOUNT_AUTHORIZED_USER_TYPE) {\n            client = new externalAccountAuthorizedUserClient_1.ExternalAccountAuthorizedUserClient(json, options);\n        }\n        else {\n            options.scopes = this.scopes;\n            client = new jwtclient_1.JWT(options);\n            this.setGapicJWTValues(client);\n            client.fromJSON(json);\n        }\n        if (preferredUniverseDomain) {\n            client.universeDomain = preferredUniverseDomain;\n        }\n        return client;\n    }\n    /**\n     * Return a JWT or UserRefreshClient from JavaScript object, caching both the\n     * object used to instantiate and the client.\n     * @param json The input object.\n     * @param options The JWT or UserRefresh options for the client\n     * @returns JWT or UserRefresh Client with data\n     */\n    _cacheClientFromJSON(json, options) {\n        const client = this.fromJSON(json, options);\n        // cache both raw data used to instantiate client and client itself.\n        this.jsonContent = json;\n        this.cachedCredential = client;\n        return client;\n    }\n    fromStream(inputStream, optionsOrCallback = {}, callback) {\n        let options = {};\n        if (typeof optionsOrCallback === 'function') {\n            callback = optionsOrCallback;\n        }\n        else {\n            options = optionsOrCallback;\n        }\n        if (callback) {\n            this.fromStreamAsync(inputStream, options).then(r => callback(null, r), callback);\n        }\n        else {\n            return this.fromStreamAsync(inputStream, options);\n        }\n    }\n    fromStreamAsync(inputStream, options) {\n        return new Promise((resolve, reject) => {\n            if (!inputStream) {\n                throw new Error('Must pass in a stream containing the Google auth settings.');\n            }\n            const chunks = [];\n            inputStream\n                .setEncoding('utf8')\n                .on('error', reject)\n                .on('data', chunk => chunks.push(chunk))\n                .on('end', () => {\n                try {\n                    try {\n                        const data = JSON.parse(chunks.join(''));\n                        const r = this._cacheClientFromJSON(data, options);\n                        return resolve(r);\n                    }\n                    catch (err) {\n                        // If we failed parsing this.keyFileName, assume that it\n                        // is a PEM or p12 certificate:\n                        if (!this.keyFilename)\n                            throw err;\n                        const client = new jwtclient_1.JWT({\n                            ...this.clientOptions,\n                            keyFile: this.keyFilename,\n                        });\n                        this.cachedCredential = client;\n                        this.setGapicJWTValues(client);\n                        return resolve(client);\n                    }\n                }\n                catch (err) {\n                    return reject(err);\n                }\n            });\n        });\n    }\n    /**\n     * Create a credentials instance using the given API key string.\n     * The created client is not cached. In order to create and cache it use the {@link GoogleAuth.getClient `getClient`} method after first providing an {@link GoogleAuth.apiKey `apiKey`}.\n     *\n     * @param apiKey The API key string\n     * @param options An optional options object.\n     * @returns A JWT loaded from the key\n     */\n    fromAPIKey(apiKey, options = {}) {\n        return new jwtclient_1.JWT({ ...options, apiKey });\n    }\n    /**\n     * Determines whether the current operating system is Windows.\n     * @api private\n     */\n    _isWindows() {\n        const sys = os.platform();\n        if (sys && sys.length >= 3) {\n            if (sys.substring(0, 3).toLowerCase() === 'win') {\n                return true;\n            }\n        }\n        return false;\n    }\n    /**\n     * Run the Google Cloud SDK command that prints the default project ID\n     */\n    async getDefaultServiceProjectId() {\n        return new Promise(resolve => {\n            (0, child_process_1.exec)('gcloud config config-helper --format json', (err, stdout) => {\n                if (!err && stdout) {\n                    try {\n                        const projectId = JSON.parse(stdout).configuration.properties.core.project;\n                        resolve(projectId);\n                        return;\n                    }\n                    catch (e) {\n                        // ignore errors\n                    }\n                }\n                resolve(null);\n            });\n        });\n    }\n    /**\n     * Loads the project id from environment variables.\n     * @api private\n     */\n    getProductionProjectId() {\n        return (process.env['GCLOUD_PROJECT'] ||\n            process.env['GOOGLE_CLOUD_PROJECT'] ||\n            process.env['gcloud_project'] ||\n            process.env['google_cloud_project']);\n    }\n    /**\n     * Loads the project id from the GOOGLE_APPLICATION_CREDENTIALS json file.\n     * @api private\n     */\n    async getFileProjectId() {\n        if (this.cachedCredential) {\n            // Try to read the project ID from the cached credentials file\n            return this.cachedCredential.projectId;\n        }\n        // Ensure the projectId is loaded from the keyFile if available.\n        if (this.keyFilename) {\n            const creds = await this.getClient();\n            if (creds && creds.projectId) {\n                return creds.projectId;\n            }\n        }\n        // Try to load a credentials file and read its project ID\n        const r = await this._tryGetApplicationCredentialsFromEnvironmentVariable();\n        if (r) {\n            return r.projectId;\n        }\n        else {\n            return null;\n        }\n    }\n    /**\n     * Gets the project ID from external account client if available.\n     */\n    async getExternalAccountClientProjectId() {\n        if (!this.jsonContent || this.jsonContent.type !== baseexternalclient_1.EXTERNAL_ACCOUNT_TYPE) {\n            return null;\n        }\n        const creds = await this.getClient();\n        // Do not suppress the underlying error, as the error could contain helpful\n        // information for debugging and fixing. This is especially true for\n        // external account creds as in order to get the project ID, the following\n        // operations have to succeed:\n        // 1. Valid credentials file should be supplied.\n        // 2. Ability to retrieve access tokens from STS token exchange API.\n        // 3. Ability to exchange for service account impersonated credentials (if\n        //    enabled).\n        // 4. Ability to get project info using the access token from step 2 or 3.\n        // Without surfacing the error, it is harder for developers to determine\n        // which step went wrong.\n        return await creds.getProjectId();\n    }\n    /**\n     * Gets the Compute Engine project ID if it can be inferred.\n     */\n    async getGCEProjectId() {\n        try {\n            const r = await gcpMetadata.project('project-id');\n            return r;\n        }\n        catch (e) {\n            // Ignore any errors\n            return null;\n        }\n    }\n    getCredentials(callback) {\n        if (callback) {\n            this.getCredentialsAsync().then(r => callback(null, r), callback);\n        }\n        else {\n            return this.getCredentialsAsync();\n        }\n    }\n    async getCredentialsAsync() {\n        const client = await this.getClient();\n        if (client instanceof impersonated_1.Impersonated) {\n            return { client_email: client.getTargetPrincipal() };\n        }\n        if (client instanceof baseexternalclient_1.BaseExternalAccountClient) {\n            const serviceAccountEmail = client.getServiceAccountEmail();\n            if (serviceAccountEmail) {\n                return {\n                    client_email: serviceAccountEmail,\n                    universe_domain: client.universeDomain,\n                };\n            }\n        }\n        if (this.jsonContent) {\n            return {\n                client_email: this.jsonContent.client_email,\n                private_key: this.jsonContent.private_key,\n                universe_domain: this.jsonContent.universe_domain,\n            };\n        }\n        if (await this._checkIsGCE()) {\n            const [client_email, universe_domain] = await Promise.all([\n                gcpMetadata.instance('service-accounts/default/email'),\n                this.getUniverseDomain(),\n            ]);\n            return { client_email, universe_domain };\n        }\n        throw new Error(exports.GoogleAuthExceptionMessages.NO_CREDENTIALS_FOUND);\n    }\n    /**\n     * Automatically obtain an {@link AuthClient `AuthClient`} based on the\n     * provided configuration. If no options were passed, use Application\n     * Default Credentials.\n     */\n    async getClient() {\n        if (this.cachedCredential) {\n            return this.cachedCredential;\n        }\n        // Use an existing auth client request, or cache a new one\n        __classPrivateFieldSet(this, _GoogleAuth_pendingAuthClient, __classPrivateFieldGet(this, _GoogleAuth_pendingAuthClient, \"f\") || __classPrivateFieldGet(this, _GoogleAuth_instances, \"m\", _GoogleAuth_determineClient).call(this), \"f\");\n        try {\n            return await __classPrivateFieldGet(this, _GoogleAuth_pendingAuthClient, \"f\");\n        }\n        finally {\n            // reset the pending auth client in case it is changed later\n            __classPrivateFieldSet(this, _GoogleAuth_pendingAuthClient, null, \"f\");\n        }\n    }\n    /**\n     * Creates a client which will fetch an ID token for authorization.\n     * @param targetAudience the audience for the fetched ID token.\n     * @returns IdTokenClient for making HTTP calls authenticated with ID tokens.\n     */\n    async getIdTokenClient(targetAudience) {\n        const client = await this.getClient();\n        if (!('fetchIdToken' in client)) {\n            throw new Error('Cannot fetch ID token in this environment, use GCE or set the GOOGLE_APPLICATION_CREDENTIALS environment variable to a service account credentials JSON file.');\n        }\n        return new idtokenclient_1.IdTokenClient({ targetAudience, idTokenProvider: client });\n    }\n    /**\n     * Automatically obtain application default credentials, and return\n     * an access token for making requests.\n     */\n    async getAccessToken() {\n        const client = await this.getClient();\n        return (await client.getAccessToken()).token;\n    }\n    /**\n     * Obtain the HTTP headers that will provide authorization for a given\n     * request.\n     */\n    async getRequestHeaders(url) {\n        const client = await this.getClient();\n        return client.getRequestHeaders(url);\n    }\n    /**\n     * Obtain credentials for a request, then attach the appropriate headers to\n     * the request options.\n     * @param opts Axios or Request options on which to attach the headers\n     */\n    async authorizeRequest(opts) {\n        opts = opts || {};\n        const url = opts.url || opts.uri;\n        const client = await this.getClient();\n        const headers = await client.getRequestHeaders(url);\n        opts.headers = Object.assign(opts.headers || {}, headers);\n        return opts;\n    }\n    /**\n     * Automatically obtain application default credentials, and make an\n     * HTTP request using the given options.\n     * @param opts Axios request options for the HTTP request.\n     */\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    async request(opts) {\n        const client = await this.getClient();\n        return client.request(opts);\n    }\n    /**\n     * Determine the compute environment in which the code is running.\n     */\n    getEnv() {\n        return (0, envDetect_1.getEnv)();\n    }\n    /**\n     * Sign the given data with the current private key, or go out\n     * to the IAM API to sign it.\n     * @param data The data to be signed.\n     * @param endpoint A custom endpoint to use.\n     *\n     * @example\n     * ```\n     * sign('data', 'https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/');\n     * ```\n     */\n    async sign(data, endpoint) {\n        const client = await this.getClient();\n        const universe = await this.getUniverseDomain();\n        endpoint =\n            endpoint ||\n                `https://iamcredentials.${universe}/v1/projects/-/serviceAccounts/`;\n        if (client instanceof impersonated_1.Impersonated) {\n            const signed = await client.sign(data);\n            return signed.signedBlob;\n        }\n        const crypto = (0, crypto_1.createCrypto)();\n        if (client instanceof jwtclient_1.JWT && client.key) {\n            const sign = await crypto.sign(client.key, data);\n            return sign;\n        }\n        const creds = await this.getCredentials();\n        if (!creds.client_email) {\n            throw new Error('Cannot sign data without `client_email`.');\n        }\n        return this.signBlob(crypto, creds.client_email, data, endpoint);\n    }\n    async signBlob(crypto, emailOrUniqueId, data, endpoint) {\n        const url = new URL(endpoint + `${emailOrUniqueId}:signBlob`);\n        const res = await this.request({\n            method: 'POST',\n            url: url.href,\n            data: {\n                payload: crypto.encodeBase64StringUtf8(data),\n            },\n            retry: true,\n            retryConfig: {\n                httpMethodsToRetry: ['POST'],\n            },\n        });\n        return res.data.signedBlob;\n    }\n}\nexports.GoogleAuth = GoogleAuth;\n_GoogleAuth_pendingAuthClient = new WeakMap(), _GoogleAuth_instances = new WeakSet(), _GoogleAuth_prepareAndCacheClient = async function _GoogleAuth_prepareAndCacheClient(credential, quotaProjectIdOverride = process.env['GOOGLE_CLOUD_QUOTA_PROJECT'] || null) {\n    const projectId = await this.getProjectIdOptional();\n    if (quotaProjectIdOverride) {\n        credential.quotaProjectId = quotaProjectIdOverride;\n    }\n    this.cachedCredential = credential;\n    return { credential, projectId };\n}, _GoogleAuth_determineClient = async function _GoogleAuth_determineClient() {\n    if (this.jsonContent) {\n        return this._cacheClientFromJSON(this.jsonContent, this.clientOptions);\n    }\n    else if (this.keyFilename) {\n        const filePath = path.resolve(this.keyFilename);\n        const stream = fs.createReadStream(filePath);\n        return await this.fromStreamAsync(stream, this.clientOptions);\n    }\n    else if (this.apiKey) {\n        const client = await this.fromAPIKey(this.apiKey, this.clientOptions);\n        client.scopes = this.scopes;\n        const { credential } = await __classPrivateFieldGet(this, _GoogleAuth_instances, \"m\", _GoogleAuth_prepareAndCacheClient).call(this, client);\n        return credential;\n    }\n    else {\n        const { credential } = await this.getApplicationDefaultAsync(this.clientOptions);\n        return credential;\n    }\n};\n/**\n * Export DefaultTransporter as a static property of the class.\n */\nGoogleAuth.DefaultTransporter = transporters_1.DefaultTransporter;\n", "\"use strict\";\n// Copyright 2014 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.IAMAuth = void 0;\nclass IAMAuth {\n    /**\n     * IAM credentials.\n     *\n     * @param selector the iam authority selector\n     * @param token the token\n     * @constructor\n     */\n    constructor(selector, token) {\n        this.selector = selector;\n        this.token = token;\n        this.selector = selector;\n        this.token = token;\n    }\n    /**\n     * Acquire the HTTP headers required to make an authenticated request.\n     */\n    getRequestHeaders() {\n        return {\n            'x-goog-iam-authority-selector': this.selector,\n            'x-goog-iam-authorization-token': this.token,\n        };\n    }\n}\nexports.IAMAuth = IAMAuth;\n", "\"use strict\";\n// Copyright 2021 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DownscopedClient = exports.EXPIRATION_TIME_OFFSET = exports.MAX_ACCESS_BOUNDARY_RULES_COUNT = void 0;\nconst stream = require(\"stream\");\nconst authclient_1 = require(\"./authclient\");\nconst sts = require(\"./stscredentials\");\n/**\n * The required token exchange grant_type: rfc8693#section-2.1\n */\nconst STS_GRANT_TYPE = 'urn:ietf:params:oauth:grant-type:token-exchange';\n/**\n * The requested token exchange requested_token_type: rfc8693#section-2.1\n */\nconst STS_REQUEST_TOKEN_TYPE = 'urn:ietf:params:oauth:token-type:access_token';\n/**\n * The requested token exchange subject_token_type: rfc8693#section-2.1\n */\nconst STS_SUBJECT_TOKEN_TYPE = 'urn:ietf:params:oauth:token-type:access_token';\n/**\n * The maximum number of access boundary rules a Credential Access Boundary\n * can contain.\n */\nexports.MAX_ACCESS_BOUNDARY_RULES_COUNT = 10;\n/**\n * Offset to take into account network delays and server clock skews.\n */\nexports.EXPIRATION_TIME_OFFSET = 5 * 60 * 1000;\n/**\n * Defines a set of Google credentials that are downscoped from an existing set\n * of Google OAuth2 credentials. This is useful to restrict the Identity and\n * Access Management (IAM) permissions that a short-lived credential can use.\n * The common pattern of usage is to have a token broker with elevated access\n * generate these downscoped credentials from higher access source credentials\n * and pass the downscoped short-lived access tokens to a token consumer via\n * some secure authenticated channel for limited access to Google Cloud Storage\n * resources.\n */\nclass DownscopedClient extends authclient_1.AuthClient {\n    /**\n     * Instantiates a downscoped client object using the provided source\n     * AuthClient and credential access boundary rules.\n     * To downscope permissions of a source AuthClient, a Credential Access\n     * Boundary that specifies which resources the new credential can access, as\n     * well as an upper bound on the permissions that are available on each\n     * resource, has to be defined. A downscoped client can then be instantiated\n     * using the source AuthClient and the Credential Access Boundary.\n     * @param authClient The source AuthClient to be downscoped based on the\n     *   provided Credential Access Boundary rules.\n     * @param credentialAccessBoundary The Credential Access Boundary which\n     *   contains a list of access boundary rules. Each rule contains information\n     *   on the resource that the rule applies to, the upper bound of the\n     *   permissions that are available on that resource and an optional\n     *   condition to further restrict permissions.\n     * @param additionalOptions **DEPRECATED, set this in the provided `authClient`.**\n     *   Optional additional behavior customization options.\n     * @param quotaProjectId **DEPRECATED, set this in the provided `authClient`.**\n     *   Optional quota project id for setting up in the x-goog-user-project header.\n     */\n    constructor(authClient, credentialAccessBoundary, additionalOptions, quotaProjectId) {\n        super({ ...additionalOptions, quotaProjectId });\n        this.authClient = authClient;\n        this.credentialAccessBoundary = credentialAccessBoundary;\n        // Check 1-10 Access Boundary Rules are defined within Credential Access\n        // Boundary.\n        if (credentialAccessBoundary.accessBoundary.accessBoundaryRules.length === 0) {\n            throw new Error('At least one access boundary rule needs to be defined.');\n        }\n        else if (credentialAccessBoundary.accessBoundary.accessBoundaryRules.length >\n            exports.MAX_ACCESS_BOUNDARY_RULES_COUNT) {\n            throw new Error('The provided access boundary has more than ' +\n                `${exports.MAX_ACCESS_BOUNDARY_RULES_COUNT} access boundary rules.`);\n        }\n        // Check at least one permission should be defined in each Access Boundary\n        // Rule.\n        for (const rule of credentialAccessBoundary.accessBoundary\n            .accessBoundaryRules) {\n            if (rule.availablePermissions.length === 0) {\n                throw new Error('At least one permission should be defined in access boundary rules.');\n            }\n        }\n        this.stsCredential = new sts.StsCredentials(`https://sts.${this.universeDomain}/v1/token`);\n        this.cachedDownscopedAccessToken = null;\n    }\n    /**\n     * Provides a mechanism to inject Downscoped access tokens directly.\n     * The expiry_date field is required to facilitate determination of the token\n     * expiration which would make it easier for the token consumer to handle.\n     * @param credentials The Credentials object to set on the current client.\n     */\n    setCredentials(credentials) {\n        if (!credentials.expiry_date) {\n            throw new Error('The access token expiry_date field is missing in the provided ' +\n                'credentials.');\n        }\n        super.setCredentials(credentials);\n        this.cachedDownscopedAccessToken = credentials;\n    }\n    async getAccessToken() {\n        // If the cached access token is unavailable or expired, force refresh.\n        // The Downscoped access token will be returned in\n        // DownscopedAccessTokenResponse format.\n        if (!this.cachedDownscopedAccessToken ||\n            this.isExpired(this.cachedDownscopedAccessToken)) {\n            await this.refreshAccessTokenAsync();\n        }\n        // Return Downscoped access token in DownscopedAccessTokenResponse format.\n        return {\n            token: this.cachedDownscopedAccessToken.access_token,\n            expirationTime: this.cachedDownscopedAccessToken.expiry_date,\n            res: this.cachedDownscopedAccessToken.res,\n        };\n    }\n    /**\n     * The main authentication interface. It takes an optional url which when\n     * present is the endpoint being accessed, and returns a Promise which\n     * resolves with authorization header fields.\n     *\n     * The result has the form:\n     * { Authorization: 'Bearer <access_token_value>' }\n     */\n    async getRequestHeaders() {\n        const accessTokenResponse = await this.getAccessToken();\n        const headers = {\n            Authorization: `Bearer ${accessTokenResponse.token}`,\n        };\n        return this.addSharedMetadataHeaders(headers);\n    }\n    request(opts, callback) {\n        if (callback) {\n            this.requestAsync(opts).then(r => callback(null, r), e => {\n                return callback(e, e.response);\n            });\n        }\n        else {\n            return this.requestAsync(opts);\n        }\n    }\n    /**\n     * Authenticates the provided HTTP request, processes it and resolves with the\n     * returned response.\n     * @param opts The HTTP request options.\n     * @param reAuthRetried Whether the current attempt is a retry after a failed attempt due to an auth failure\n     * @return A promise that resolves with the successful response.\n     */\n    async requestAsync(opts, reAuthRetried = false) {\n        let response;\n        try {\n            const requestHeaders = await this.getRequestHeaders();\n            opts.headers = opts.headers || {};\n            if (requestHeaders && requestHeaders['x-goog-user-project']) {\n                opts.headers['x-goog-user-project'] =\n                    requestHeaders['x-goog-user-project'];\n            }\n            if (requestHeaders && requestHeaders.Authorization) {\n                opts.headers.Authorization = requestHeaders.Authorization;\n            }\n            response = await this.transporter.request(opts);\n        }\n        catch (e) {\n            const res = e.response;\n            if (res) {\n                const statusCode = res.status;\n                // Retry the request for metadata if the following criteria are true:\n                // - We haven't already retried.  It only makes sense to retry once.\n                // - The response was a 401 or a 403\n                // - The request didn't send a readableStream\n                // - forceRefreshOnFailure is true\n                const isReadableStream = res.config.data instanceof stream.Readable;\n                const isAuthErr = statusCode === 401 || statusCode === 403;\n                if (!reAuthRetried &&\n                    isAuthErr &&\n                    !isReadableStream &&\n                    this.forceRefreshOnFailure) {\n                    await this.refreshAccessTokenAsync();\n                    return await this.requestAsync(opts, true);\n                }\n            }\n            throw e;\n        }\n        return response;\n    }\n    /**\n     * Forces token refresh, even if unexpired tokens are currently cached.\n     * GCP access tokens are retrieved from authclient object/source credential.\n     * Then GCP access tokens are exchanged for downscoped access tokens via the\n     * token exchange endpoint.\n     * @return A promise that resolves with the fresh downscoped access token.\n     */\n    async refreshAccessTokenAsync() {\n        var _a;\n        // Retrieve GCP access token from source credential.\n        const subjectToken = (await this.authClient.getAccessToken()).token;\n        // Construct the STS credentials options.\n        const stsCredentialsOptions = {\n            grantType: STS_GRANT_TYPE,\n            requestedTokenType: STS_REQUEST_TOKEN_TYPE,\n            subjectToken: subjectToken,\n            subjectTokenType: STS_SUBJECT_TOKEN_TYPE,\n        };\n        // Exchange the source AuthClient access token for a Downscoped access\n        // token.\n        const stsResponse = await this.stsCredential.exchangeToken(stsCredentialsOptions, undefined, this.credentialAccessBoundary);\n        /**\n         * The STS endpoint will only return the expiration time for the downscoped\n         * access token if the original access token represents a service account.\n         * The downscoped token's expiration time will always match the source\n         * credential expiration. When no expires_in is returned, we can copy the\n         * source credential's expiration time.\n         */\n        const sourceCredExpireDate = ((_a = this.authClient.credentials) === null || _a === void 0 ? void 0 : _a.expiry_date) || null;\n        const expiryDate = stsResponse.expires_in\n            ? new Date().getTime() + stsResponse.expires_in * 1000\n            : sourceCredExpireDate;\n        // Save response in cached access token.\n        this.cachedDownscopedAccessToken = {\n            access_token: stsResponse.access_token,\n            expiry_date: expiryDate,\n            res: stsResponse.res,\n        };\n        // Save credentials.\n        this.credentials = {};\n        Object.assign(this.credentials, this.cachedDownscopedAccessToken);\n        delete this.credentials.res;\n        // Trigger tokens event to notify external listeners.\n        this.emit('tokens', {\n            refresh_token: null,\n            expiry_date: this.cachedDownscopedAccessToken.expiry_date,\n            access_token: this.cachedDownscopedAccessToken.access_token,\n            token_type: 'Bearer',\n            id_token: null,\n        });\n        // Return the cached access token.\n        return this.cachedDownscopedAccessToken;\n    }\n    /**\n     * Returns whether the provided credentials are expired or not.\n     * If there is no expiry time, assumes the token is not expired or expiring.\n     * @param downscopedAccessToken The credentials to check for expiration.\n     * @return Whether the credentials are expired or not.\n     */\n    isExpired(downscopedAccessToken) {\n        const now = new Date().getTime();\n        return downscopedAccessToken.expiry_date\n            ? now >=\n                downscopedAccessToken.expiry_date - this.eagerRefreshThresholdMillis\n            : false;\n    }\n}\nexports.DownscopedClient = DownscopedClient;\n", "\"use strict\";\n// Copyright 2024 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PassThroughClient = void 0;\nconst authclient_1 = require(\"./authclient\");\n/**\n * An AuthClient without any Authentication information. Useful for:\n * - Anonymous access\n * - Local Emulators\n * - Testing Environments\n *\n */\nclass PassThroughClient extends authclient_1.AuthClient {\n    /**\n     * Creates a request without any authentication headers or checks.\n     *\n     * @remarks\n     *\n     * In testing environments it may be useful to change the provided\n     * {@link AuthClient.transporter} for any desired request overrides/handling.\n     *\n     * @param opts\n     * @returns The response of the request.\n     */\n    async request(opts) {\n        return this.transporter.request(opts);\n    }\n    /**\n     * A required method of the base class.\n     * Always will return an empty object.\n     *\n     * @returns {}\n     */\n    async getAccessToken() {\n        return {};\n    }\n    /**\n     * A required method of the base class.\n     * Always will return an empty object.\n     *\n     * @returns {}\n     */\n    async getRequestHeaders() {\n        return {};\n    }\n}\nexports.PassThroughClient = PassThroughClient;\nconst a = new PassThroughClient();\na.getAccessToken();\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GoogleAuth = exports.auth = exports.DefaultTransporter = exports.PassThroughClient = exports.ExecutableError = exports.PluggableAuthClient = exports.DownscopedClient = exports.BaseExternalAccountClient = exports.ExternalAccountClient = exports.IdentityPoolClient = exports.AwsRequestSigner = exports.AwsClient = exports.UserRefreshClient = exports.LoginTicket = exports.ClientAuthentication = exports.OAuth2Client = exports.CodeChallengeMethod = exports.Impersonated = exports.JWT = exports.JWTAccess = exports.IdTokenClient = exports.IAMAuth = exports.GCPEnv = exports.Compute = exports.DEFAULT_UNIVERSE = exports.AuthClient = exports.gaxios = exports.gcpMetadata = void 0;\n// Copyright 2017 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nconst googleauth_1 = require(\"./auth/googleauth\");\nObject.defineProperty(exports, \"GoogleAuth\", { enumerable: true, get: function () { return googleauth_1.GoogleAuth; } });\n// Export common deps to ensure types/instances are the exact match. Useful\n// for consistently configuring the library across versions.\nexports.gcpMetadata = require(\"gcp-metadata\");\nexports.gaxios = require(\"gaxios\");\nvar authclient_1 = require(\"./auth/authclient\");\nObject.defineProperty(exports, \"AuthClient\", { enumerable: true, get: function () { return authclient_1.AuthClient; } });\nObject.defineProperty(exports, \"DEFAULT_UNIVERSE\", { enumerable: true, get: function () { return authclient_1.DEFAULT_UNIVERSE; } });\nvar computeclient_1 = require(\"./auth/computeclient\");\nObject.defineProperty(exports, \"Compute\", { enumerable: true, get: function () { return computeclient_1.Compute; } });\nvar envDetect_1 = require(\"./auth/envDetect\");\nObject.defineProperty(exports, \"GCPEnv\", { enumerable: true, get: function () { return envDetect_1.GCPEnv; } });\nvar iam_1 = require(\"./auth/iam\");\nObject.defineProperty(exports, \"IAMAuth\", { enumerable: true, get: function () { return iam_1.IAMAuth; } });\nvar idtokenclient_1 = require(\"./auth/idtokenclient\");\nObject.defineProperty(exports, \"IdTokenClient\", { enumerable: true, get: function () { return idtokenclient_1.IdTokenClient; } });\nvar jwtaccess_1 = require(\"./auth/jwtaccess\");\nObject.defineProperty(exports, \"JWTAccess\", { enumerable: true, get: function () { return jwtaccess_1.JWTAccess; } });\nvar jwtclient_1 = require(\"./auth/jwtclient\");\nObject.defineProperty(exports, \"JWT\", { enumerable: true, get: function () { return jwtclient_1.JWT; } });\nvar impersonated_1 = require(\"./auth/impersonated\");\nObject.defineProperty(exports, \"Impersonated\", { enumerable: true, get: function () { return impersonated_1.Impersonated; } });\nvar oauth2client_1 = require(\"./auth/oauth2client\");\nObject.defineProperty(exports, \"CodeChallengeMethod\", { enumerable: true, get: function () { return oauth2client_1.CodeChallengeMethod; } });\nObject.defineProperty(exports, \"OAuth2Client\", { enumerable: true, get: function () { return oauth2client_1.OAuth2Client; } });\nObject.defineProperty(exports, \"ClientAuthentication\", { enumerable: true, get: function () { return oauth2client_1.ClientAuthentication; } });\nvar loginticket_1 = require(\"./auth/loginticket\");\nObject.defineProperty(exports, \"LoginTicket\", { enumerable: true, get: function () { return loginticket_1.LoginTicket; } });\nvar refreshclient_1 = require(\"./auth/refreshclient\");\nObject.defineProperty(exports, \"UserRefreshClient\", { enumerable: true, get: function () { return refreshclient_1.UserRefreshClient; } });\nvar awsclient_1 = require(\"./auth/awsclient\");\nObject.defineProperty(exports, \"AwsClient\", { enumerable: true, get: function () { return awsclient_1.AwsClient; } });\nvar awsrequestsigner_1 = require(\"./auth/awsrequestsigner\");\nObject.defineProperty(exports, \"AwsRequestSigner\", { enumerable: true, get: function () { return awsrequestsigner_1.AwsRequestSigner; } });\nvar identitypoolclient_1 = require(\"./auth/identitypoolclient\");\nObject.defineProperty(exports, \"IdentityPoolClient\", { enumerable: true, get: function () { return identitypoolclient_1.IdentityPoolClient; } });\nvar externalclient_1 = require(\"./auth/externalclient\");\nObject.defineProperty(exports, \"ExternalAccountClient\", { enumerable: true, get: function () { return externalclient_1.ExternalAccountClient; } });\nvar baseexternalclient_1 = require(\"./auth/baseexternalclient\");\nObject.defineProperty(exports, \"BaseExternalAccountClient\", { enumerable: true, get: function () { return baseexternalclient_1.BaseExternalAccountClient; } });\nvar downscopedclient_1 = require(\"./auth/downscopedclient\");\nObject.defineProperty(exports, \"DownscopedClient\", { enumerable: true, get: function () { return downscopedclient_1.DownscopedClient; } });\nvar pluggable_auth_client_1 = require(\"./auth/pluggable-auth-client\");\nObject.defineProperty(exports, \"PluggableAuthClient\", { enumerable: true, get: function () { return pluggable_auth_client_1.PluggableAuthClient; } });\nObject.defineProperty(exports, \"ExecutableError\", { enumerable: true, get: function () { return pluggable_auth_client_1.ExecutableError; } });\nvar passthrough_1 = require(\"./auth/passthrough\");\nObject.defineProperty(exports, \"PassThroughClient\", { enumerable: true, get: function () { return passthrough_1.PassThroughClient; } });\nvar transporters_1 = require(\"./transporters\");\nObject.defineProperty(exports, \"DefaultTransporter\", { enumerable: true, get: function () { return transporters_1.DefaultTransporter; } });\nconst auth = new googleauth_1.GoogleAuth();\nexports.auth = auth;\n", "import chalk from 'chalk'\r\nimport { exec } from 'child_process'\r\nimport { execa } from 'execa'\r\nimport { mkdir, stat } from 'fs/promises'\r\nimport memoize from 'lodash-es/memoize.js'\r\nimport { join } from 'path'\r\nimport { CLAUDE_AI_PROFILE_SCOPE } from 'src/constants/oauth.js'\r\nimport {\r\n  type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,\r\n  logEvent,\r\n} from 'src/services/analytics/index.js'\r\nimport { getModelStrings } from 'src/utils/model/modelStrings.js'\r\nimport { type APIProvider, getAPIProvider } from 'src/utils/model/providers.js'\r\nimport {\r\n  getIsNonInteractiveSession,\r\n  preferThirdPartyAuthentication,\r\n} from '../bootstrap/state.js'\r\nimport {\r\n  getMockSubscriptionType,\r\n  shouldUseMockSubscription,\r\n} from '../services/mockRateLimits.js'\r\nimport {\r\n  isOAuthTokenExpired,\r\n  refreshOAuthToken,\r\n  shouldUseClaudeAIAuth,\r\n} from '../services/oauth/client.js'\r\nimport { getOauthProfileFromOauthToken } from '../services/oauth/getOauthProfile.js'\r\nimport type { OAuthTokens, SubscriptionType } from '../services/oauth/types.js'\r\nimport {\r\n  getApiKeyFromFileDescriptor,\r\n  getOAuthTokenFromFileDescriptor,\r\n} from './authFileDescriptor.js'\r\nimport {\r\n  maybeRemoveApiKeyFromMacOSKeychainThrows,\r\n  normalizeApiKeyForConfig,\r\n} from './authPortable.js'\r\nimport {\r\n  checkStsCallerIdentity,\r\n  clearAwsIniCache,\r\n  isValidAwsStsOutput,\r\n} from './aws.js'\r\nimport { AwsAuthStatusManager } from './awsAuthStatusManager.js'\r\nimport { clearBetasCaches } from './betas.js'\r\nimport {\r\n  type AccountInfo,\r\n  checkHasTrustDialogAccepted,\r\n  getGlobalConfig,\r\n  saveGlobalConfig,\r\n} from './config.js'\r\nimport { logAntError, logForDebugging } from './debug.js'\r\nimport {\r\n  getClaudeConfigHomeDir,\r\n  isBareMode,\r\n  isEnvTruthy,\r\n  isRunningOnHomespace,\r\n} from './envUtils.js'\r\nimport { errorMessage } from './errors.js'\r\nimport { execSyncWithDefaults_DEPRECATED } from './execFileNoThrow.js'\r\nimport * as lockfile from './lockfile.js'\r\nimport { logError } from './log.js'\nimport { memoizeWithTTLAsync } from './memoize.js'\nimport { loadOpenCodeApiKeyFromAuthFile } from './opencodeAuth.js'\nimport { getSecureStorage } from './secureStorage/index.js'\nimport {\r\n  clearLegacyApiKeyPrefetch,\r\n  getLegacyApiKeyPrefetchResult,\r\n} from './secureStorage/keychainPrefetch.js'\r\nimport {\r\n  clearKeychainCache,\r\n  getMacOsKeychainStorageServiceName,\r\n  getUsername,\r\n} from './secureStorage/macOsKeychainHelpers.js'\r\nimport {\r\n  getSettings_DEPRECATED,\r\n  getSettingsForSource,\r\n} from './settings/settings.js'\r\nimport { sleep } from './sleep.js'\r\nimport { jsonParse } from './slowOperations.js'\r\nimport { clearToolSchemaCache } from './toolSchemaCache.js'\r\n\r\n/** Default TTL for API key helper cache in milliseconds (5 minutes) */\r\nconst DEFAULT_API_KEY_HELPER_TTL = 5 * 60 * 1000\r\n\r\n/**\r\n * CCR and Claude Desktop spawn the CLI with OAuth and should never fall back\r\n * to the user's ~/.claude/settings.json API-key config (apiKeyHelper,\r\n * env.ANTHROPIC_API_KEY, env.ANTHROPIC_AUTH_TOKEN). Those settings exist for\r\n * the user's terminal CLI, not managed sessions. Without this guard, a user\r\n * who runs `claude` in their terminal with an API key sees every CCD session\r\n * also use that key \u2014 and fail if it's stale/wrong-org.\r\n */\r\nfunction isManagedOAuthContext(): boolean {\r\n  return (\r\n    isEnvTruthy(process.env.CLAUDE_CODE_REMOTE) ||\r\n    process.env.CLAUDE_CODE_ENTRYPOINT === 'claude-desktop'\r\n  )\r\n}\r\n\r\n/** Whether we are supporting direct 1P auth. */\r\n// this code is closely related to getAuthTokenSource\r\nexport function isAnthropicAuthEnabled(): boolean {\r\n  // --bare: API-key-only, never OAuth.\r\n  if (isBareMode()) return false\r\n\r\n  // `claude ssh` remote: ANTHROPIC_UNIX_SOCKET tunnels API calls through a\r\n  // local auth-injecting proxy. The launcher sets CLAUDE_CODE_OAUTH_TOKEN as a\r\n  // placeholder iff the local side is a subscriber (so the remote includes the\r\n  // oauth-2025 beta header to match what the proxy will inject). The remote's\r\n  // ~/.claude settings (apiKeyHelper, settings.env.ANTHROPIC_API_KEY) MUST NOT\r\n  // flip this \u2014 they'd cause a header mismatch with the proxy and a bogus\r\n  // \"invalid x-api-key\" from the API. See src/ssh/sshAuthProxy.ts.\r\n  if (process.env.ANTHROPIC_UNIX_SOCKET) {\r\n    return !!process.env.CLAUDE_CODE_OAUTH_TOKEN\r\n  }\r\n\r\n  const is3P =\r\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_BEDROCK) ||\r\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_VERTEX) ||\r\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_FOUNDRY)\r\n\r\n  // Check if user has configured an external API key source\r\n  // This allows externally-provided API keys to work (without requiring proxy configuration)\r\n  const settings = getSettings_DEPRECATED() || {}\r\n  const apiKeyHelper = settings.apiKeyHelper\r\n  const hasExternalAuthToken =\r\n    process.env.ANTHROPIC_AUTH_TOKEN ||\r\n    apiKeyHelper ||\r\n    process.env.CLAUDE_CODE_API_KEY_FILE_DESCRIPTOR\r\n\r\n  // Check if API key is from an external source (not managed by /login)\r\n  const { source: apiKeySource } = getAnthropicApiKeyWithSource({\r\n    skipRetrievingKeyFromApiKeyHelper: true,\r\n  })\r\n  const hasExternalApiKey =\r\n    apiKeySource === 'ANTHROPIC_API_KEY' || apiKeySource === 'apiKeyHelper'\r\n\r\n  // Disable Anthropic auth if:\r\n  // 1. Using 3rd party services (Bedrock/Vertex/Foundry)\r\n  // 2. User has an external API key (regardless of proxy configuration)\r\n  // 3. User has an external auth token (regardless of proxy configuration)\r\n  // this may cause issues if users have complex proxy / gateway \"client-side creds\" auth scenarios,\r\n  // e.g. if they want to set X-Api-Key to a gateway key but use Anthropic OAuth for the Authorization\r\n  // if we get reports of that, we should probably add an env var to force OAuth enablement\r\n  const shouldDisableAuth =\r\n    is3P ||\r\n    (hasExternalAuthToken && !isManagedOAuthContext()) ||\r\n    (hasExternalApiKey && !isManagedOAuthContext())\r\n\r\n  return !shouldDisableAuth\r\n}\r\n\r\n/** Where the auth token is being sourced from, if any. */\r\n// this code is closely related to isAnthropicAuthEnabled\r\nexport function getAuthTokenSource() {\r\n  // --bare: API-key-only. apiKeyHelper (from --settings) is the only\r\n  // bearer-token-shaped source allowed. OAuth env vars, FD tokens, and\r\n  // keychain are ignored.\r\n  if (isBareMode()) {\r\n    if (getConfiguredApiKeyHelper()) {\r\n      return { source: 'apiKeyHelper' as const, hasToken: true }\r\n    }\r\n    return { source: 'none' as const, hasToken: false }\r\n  }\r\n\r\n  if (process.env.ANTHROPIC_AUTH_TOKEN && !isManagedOAuthContext()) {\r\n    return { source: 'ANTHROPIC_AUTH_TOKEN' as const, hasToken: true }\r\n  }\r\n\r\n  if (process.env.CLAUDE_CODE_OAUTH_TOKEN) {\r\n    return { source: 'CLAUDE_CODE_OAUTH_TOKEN' as const, hasToken: true }\r\n  }\r\n\r\n  // Check for OAuth token from file descriptor (or its CCR disk fallback)\r\n  const oauthTokenFromFd = getOAuthTokenFromFileDescriptor()\r\n  if (oauthTokenFromFd) {\r\n    // getOAuthTokenFromFileDescriptor has a disk fallback for CCR subprocesses\r\n    // that can't inherit the pipe FD. Distinguish by env var presence so the\r\n    // org-mismatch message doesn't tell the user to unset a variable that\r\n    // doesn't exist. Call sites fall through correctly \u2014 the new source is\r\n    // !== 'none' (cli/handlers/auth.ts \u2192 oauth_token) and not in the\r\n    // isEnvVarToken set (auth.ts:1844 \u2192 generic re-login message).\r\n    if (process.env.CLAUDE_CODE_OAUTH_TOKEN_FILE_DESCRIPTOR) {\r\n      return {\r\n        source: 'CLAUDE_CODE_OAUTH_TOKEN_FILE_DESCRIPTOR' as const,\r\n        hasToken: true,\r\n      }\r\n    }\r\n    return {\r\n      source: 'CCR_OAUTH_TOKEN_FILE' as const,\r\n      hasToken: true,\r\n    }\r\n  }\r\n\r\n  // Check if apiKeyHelper is configured without executing it\r\n  // This prevents security issues where arbitrary code could execute before trust is established\r\n  const apiKeyHelper = getConfiguredApiKeyHelper()\r\n  if (apiKeyHelper && !isManagedOAuthContext()) {\r\n    return { source: 'apiKeyHelper' as const, hasToken: true }\r\n  }\r\n\r\n  const oauthTokens = getClaudeAIOAuthTokens()\r\n  if (shouldUseClaudeAIAuth(oauthTokens?.scopes) && oauthTokens?.accessToken) {\r\n    return { source: 'claude.ai' as const, hasToken: true }\r\n  }\r\n\r\n  return { source: 'none' as const, hasToken: false }\r\n}\r\n\r\nexport type ApiKeySource =\r\n  | 'ANTHROPIC_API_KEY'\r\n  | 'apiKeyHelper'\r\n  | '/login managed key'\r\n  | 'none'\r\n\r\nexport function getAnthropicApiKey(): null | string {\r\n  const { key } = getAnthropicApiKeyWithSource()\r\n  return key\r\n}\r\n\r\nexport function hasAnthropicApiKeyAuth(): boolean {\r\n  const { key, source } = getAnthropicApiKeyWithSource({\r\n    skipRetrievingKeyFromApiKeyHelper: true,\r\n  })\r\n  return key !== null && source !== 'none'\r\n}\r\n\r\nexport function getAnthropicApiKeyWithSource(\r\n  opts: { skipRetrievingKeyFromApiKeyHelper?: boolean } = {},\r\n): {\r\n  key: null | string\r\n  source: ApiKeySource\r\n} {\r\n  // --bare: hermetic auth. Only ANTHROPIC_API_KEY env or apiKeyHelper from\r\n  // the --settings flag. Never touches keychain, config file, or approval\r\n  // lists. 3P (Bedrock/Vertex/Foundry) uses provider creds, not this path.\r\n  if (isBareMode()) {\r\n    if (process.env.ANTHROPIC_API_KEY) {\r\n      return { key: process.env.ANTHROPIC_API_KEY, source: 'ANTHROPIC_API_KEY' }\r\n    }\r\n    if (getConfiguredApiKeyHelper()) {\r\n      return {\r\n        key: opts.skipRetrievingKeyFromApiKeyHelper\r\n          ? null\r\n          : getApiKeyFromApiKeyHelperCached(),\r\n        source: 'apiKeyHelper',\r\n      }\r\n    }\r\n    return { key: null, source: 'none' }\r\n  }\r\n\r\n  // On homespace, don't use ANTHROPIC_API_KEY (use Console key instead)\r\n  // https://anthropic.slack.com/archives/C08428WSLKV/p1747331773214779\r\n  const apiKeyEnv = isRunningOnHomespace()\r\n    ? undefined\r\n    : process.env.ANTHROPIC_API_KEY\r\n\r\n  // Always check for direct environment variable when the user ran claude --print.\r\n  // This is useful for CI, etc.\r\n  if (preferThirdPartyAuthentication() && apiKeyEnv) {\r\n    return {\r\n      key: apiKeyEnv,\r\n      source: 'ANTHROPIC_API_KEY',\r\n    }\r\n  }\r\n\r\n  if (isEnvTruthy(process.env.CI) || process.env.NODE_ENV === 'test') {\r\n    // Check for API key from file descriptor first\r\n    const apiKeyFromFd = getApiKeyFromFileDescriptor()\r\n    if (apiKeyFromFd) {\r\n      return {\r\n        key: apiKeyFromFd,\r\n        source: 'ANTHROPIC_API_KEY',\r\n      }\r\n    }\r\n\r\n    if (\r\n      !apiKeyEnv &&\r\n      !process.env.CLAUDE_CODE_OAUTH_TOKEN &&\r\n      !process.env.CLAUDE_CODE_OAUTH_TOKEN_FILE_DESCRIPTOR\r\n    ) {\r\n      throw new Error(\r\n        'ANTHROPIC_API_KEY or CLAUDE_CODE_OAUTH_TOKEN env var is required',\r\n      )\r\n    }\r\n\r\n    if (apiKeyEnv) {\r\n      return {\r\n        key: apiKeyEnv,\r\n        source: 'ANTHROPIC_API_KEY',\r\n      }\r\n    }\r\n\r\n    // OAuth token is present but this function returns API keys only\r\n    return {\r\n      key: null,\r\n      source: 'none',\r\n    }\r\n  }\r\n  // Check for ANTHROPIC_API_KEY before checking the apiKeyHelper or /login-managed key\r\n  if (\r\n    apiKeyEnv &&\r\n    getGlobalConfig().customApiKeyResponses?.approved?.includes(\r\n      normalizeApiKeyForConfig(apiKeyEnv),\r\n    )\r\n  ) {\r\n    return {\r\n      key: apiKeyEnv,\r\n      source: 'ANTHROPIC_API_KEY',\r\n    }\r\n  }\r\n\r\n  // Check for API key from file descriptor\r\n  const apiKeyFromFd = getApiKeyFromFileDescriptor()\r\n  if (apiKeyFromFd) {\r\n    return {\r\n      key: apiKeyFromFd,\r\n      source: 'ANTHROPIC_API_KEY',\r\n    }\r\n  }\r\n\r\n  // Check for apiKeyHelper \u2014 use sync cache, never block\r\n  const apiKeyHelperCommand = getConfiguredApiKeyHelper()\r\n  if (apiKeyHelperCommand) {\r\n    if (opts.skipRetrievingKeyFromApiKeyHelper) {\r\n      return {\r\n        key: null,\r\n        source: 'apiKeyHelper',\r\n      }\r\n    }\r\n    // Cache may be cold (helper hasn't finished yet). Return null with\r\n    // source='apiKeyHelper' rather than falling through to keychain \u2014\r\n    // apiKeyHelper must win. Callers needing a real key must await\r\n    // getApiKeyFromApiKeyHelper() first (client.ts, useApiKeyVerification do).\r\n    return {\r\n      key: getApiKeyFromApiKeyHelperCached(),\r\n      source: 'apiKeyHelper',\r\n    }\r\n  }\r\n\r\n  const apiKeyFromConfigOrMacOSKeychain = getApiKeyFromConfigOrMacOSKeychain()\r\n  if (apiKeyFromConfigOrMacOSKeychain) {\r\n    return apiKeyFromConfigOrMacOSKeychain\r\n  }\r\n\r\n  return {\r\n    key: null,\r\n    source: 'none',\r\n  }\r\n}\r\n\r\n/**\r\n * Get the configured apiKeyHelper from settings.\r\n * In bare mode, only the --settings flag source is consulted \u2014 apiKeyHelper\r\n * from ~/.claude/settings.json or project settings is ignored.\r\n */\r\nexport function getConfiguredApiKeyHelper(): string | undefined {\r\n  if (isBareMode()) {\r\n    return getSettingsForSource('flagSettings')?.apiKeyHelper\r\n  }\r\n  const mergedSettings = getSettings_DEPRECATED() || {}\r\n  return mergedSettings.apiKeyHelper\r\n}\r\n\r\n/**\r\n * Check if the configured apiKeyHelper comes from project settings (projectSettings or localSettings)\r\n */\r\nfunction isApiKeyHelperFromProjectOrLocalSettings(): boolean {\r\n  const apiKeyHelper = getConfiguredApiKeyHelper()\r\n  if (!apiKeyHelper) {\r\n    return false\r\n  }\r\n\r\n  const projectSettings = getSettingsForSource('projectSettings')\r\n  const localSettings = getSettingsForSource('localSettings')\r\n  return (\r\n    projectSettings?.apiKeyHelper === apiKeyHelper ||\r\n    localSettings?.apiKeyHelper === apiKeyHelper\r\n  )\r\n}\r\n\r\n/**\r\n * Get the configured awsAuthRefresh from settings\r\n */\r\nfunction getConfiguredAwsAuthRefresh(): string | undefined {\r\n  const mergedSettings = getSettings_DEPRECATED() || {}\r\n  return mergedSettings.awsAuthRefresh\r\n}\r\n\r\n/**\r\n * Check if the configured awsAuthRefresh comes from project settings\r\n */\r\nexport function isAwsAuthRefreshFromProjectSettings(): boolean {\r\n  const awsAuthRefresh = getConfiguredAwsAuthRefresh()\r\n  if (!awsAuthRefresh) {\r\n    return false\r\n  }\r\n\r\n  const projectSettings = getSettingsForSource('projectSettings')\r\n  const localSettings = getSettingsForSource('localSettings')\r\n  return (\r\n    projectSettings?.awsAuthRefresh === awsAuthRefresh ||\r\n    localSettings?.awsAuthRefresh === awsAuthRefresh\r\n  )\r\n}\r\n\r\n/**\r\n * Get the configured awsCredentialExport from settings\r\n */\r\nfunction getConfiguredAwsCredentialExport(): string | undefined {\r\n  const mergedSettings = getSettings_DEPRECATED() || {}\r\n  return mergedSettings.awsCredentialExport\r\n}\r\n\r\n/**\r\n * Check if the configured awsCredentialExport comes from project settings\r\n */\r\nexport function isAwsCredentialExportFromProjectSettings(): boolean {\r\n  const awsCredentialExport = getConfiguredAwsCredentialExport()\r\n  if (!awsCredentialExport) {\r\n    return false\r\n  }\r\n\r\n  const projectSettings = getSettingsForSource('projectSettings')\r\n  const localSettings = getSettingsForSource('localSettings')\r\n  return (\r\n    projectSettings?.awsCredentialExport === awsCredentialExport ||\r\n    localSettings?.awsCredentialExport === awsCredentialExport\r\n  )\r\n}\r\n\r\n/**\r\n * Calculate TTL in milliseconds for the API key helper cache\r\n * Uses CLAUDE_CODE_API_KEY_HELPER_TTL_MS env var if set and valid,\r\n * otherwise defaults to 5 minutes\r\n */\r\nexport function calculateApiKeyHelperTTL(): number {\r\n  const envTtl = process.env.CLAUDE_CODE_API_KEY_HELPER_TTL_MS\r\n\r\n  if (envTtl) {\r\n    const parsed = parseInt(envTtl, 10)\r\n    if (!Number.isNaN(parsed) && parsed >= 0) {\r\n      return parsed\r\n    }\r\n    logForDebugging(\r\n      `Found CLAUDE_CODE_API_KEY_HELPER_TTL_MS env var, but it was not a valid number. Got ${envTtl}`,\r\n      { level: 'error' },\r\n    )\r\n  }\r\n\r\n  return DEFAULT_API_KEY_HELPER_TTL\r\n}\r\n\r\n// Async API key helper with sync cache for non-blocking reads.\r\n// Epoch bumps on clearApiKeyHelperCache() \u2014 orphaned executions check their\r\n// captured epoch before touching module state so a settings-change or 401-retry\r\n// mid-flight can't clobber the newer cache/inflight.\r\nlet _apiKeyHelperCache: { value: string; timestamp: number } | null = null\r\nlet _apiKeyHelperInflight: {\r\n  promise: Promise<string | null>\r\n  // Only set on cold launches (user is waiting); null for SWR background refreshes.\r\n  startedAt: number | null\r\n} | null = null\r\nlet _apiKeyHelperEpoch = 0\r\n\r\nexport function getApiKeyHelperElapsedMs(): number {\r\n  const startedAt = _apiKeyHelperInflight?.startedAt\r\n  return startedAt ? Date.now() - startedAt : 0\r\n}\r\n\r\nexport async function getApiKeyFromApiKeyHelper(\r\n  isNonInteractiveSession: boolean,\r\n): Promise<string | null> {\r\n  if (!getConfiguredApiKeyHelper()) return null\r\n  const ttl = calculateApiKeyHelperTTL()\r\n  if (_apiKeyHelperCache) {\r\n    if (Date.now() - _apiKeyHelperCache.timestamp < ttl) {\r\n      return _apiKeyHelperCache.value\r\n    }\r\n    // Stale \u2014 return stale value now, refresh in the background.\r\n    // `??=` banned here by eslint no-nullish-assign-object-call (bun bug).\r\n    if (!_apiKeyHelperInflight) {\r\n      _apiKeyHelperInflight = {\r\n        promise: _runAndCache(\r\n          isNonInteractiveSession,\r\n          false,\r\n          _apiKeyHelperEpoch,\r\n        ),\r\n        startedAt: null,\r\n      }\r\n    }\r\n    return _apiKeyHelperCache.value\r\n  }\r\n  // Cold cache \u2014 deduplicate concurrent calls\r\n  if (_apiKeyHelperInflight) return _apiKeyHelperInflight.promise\r\n  _apiKeyHelperInflight = {\r\n    promise: _runAndCache(isNonInteractiveSession, true, _apiKeyHelperEpoch),\r\n    startedAt: Date.now(),\r\n  }\r\n  return _apiKeyHelperInflight.promise\r\n}\r\n\r\nasync function _runAndCache(\r\n  isNonInteractiveSession: boolean,\r\n  isCold: boolean,\r\n  epoch: number,\r\n): Promise<string | null> {\r\n  try {\r\n    const value = await _executeApiKeyHelper(isNonInteractiveSession)\r\n    if (epoch !== _apiKeyHelperEpoch) return value\r\n    if (value !== null) {\r\n      _apiKeyHelperCache = { value, timestamp: Date.now() }\r\n    }\r\n    return value\r\n  } catch (e) {\r\n    if (epoch !== _apiKeyHelperEpoch) return ' '\r\n    const detail = e instanceof Error ? e.message : String(e)\r\n    // biome-ignore lint/suspicious/noConsole: user-configured script failed; must be visible without --debug\r\n    console.error(chalk.red(`apiKeyHelper failed: ${detail}`))\r\n    logForDebugging(`Error getting API key from apiKeyHelper: ${detail}`, {\r\n      level: 'error',\r\n    })\r\n    // SWR path: a transient failure shouldn't replace a working key with\r\n    // the ' ' sentinel \u2014 keep serving the stale value and bump timestamp\r\n    // so we don't hammer-retry every call.\r\n    if (!isCold && _apiKeyHelperCache && _apiKeyHelperCache.value !== ' ') {\r\n      _apiKeyHelperCache = { ..._apiKeyHelperCache, timestamp: Date.now() }\r\n      return _apiKeyHelperCache.value\r\n    }\r\n    // Cold cache or prior error \u2014 cache ' ' so callers don't fall back to OAuth\r\n    _apiKeyHelperCache = { value: ' ', timestamp: Date.now() }\r\n    return ' '\r\n  } finally {\r\n    if (epoch === _apiKeyHelperEpoch) {\r\n      _apiKeyHelperInflight = null\r\n    }\r\n  }\r\n}\r\n\r\nasync function _executeApiKeyHelper(\r\n  isNonInteractiveSession: boolean,\r\n): Promise<string | null> {\r\n  const apiKeyHelper = getConfiguredApiKeyHelper()\r\n  if (!apiKeyHelper) {\r\n    return null\r\n  }\r\n\r\n  if (isApiKeyHelperFromProjectOrLocalSettings()) {\r\n    const hasTrust = checkHasTrustDialogAccepted()\r\n    if (!hasTrust && !isNonInteractiveSession) {\r\n      const error = new Error(\r\n        `Security: apiKeyHelper executed before workspace trust is confirmed. If you see this message, post in ${MACRO.FEEDBACK_CHANNEL}.`,\r\n      )\r\n      logAntError('apiKeyHelper invoked before trust check', error)\r\n      logEvent('tengu_apiKeyHelper_missing_trust11', {})\r\n      return null\r\n    }\r\n  }\r\n\r\n  const result = await execa(apiKeyHelper, {\r\n    shell: true,\r\n    timeout: 10 * 60 * 1000,\r\n    reject: false,\r\n  })\r\n  if (result.failed) {\r\n    // reject:false \u2014 execa resolves on exit\u22600/timeout, stderr is on result\r\n    const why = result.timedOut ? 'timed out' : `exited ${result.exitCode}`\r\n    const stderr = result.stderr?.trim()\r\n    throw new Error(stderr ? `${why}: ${stderr}` : why)\r\n  }\r\n  const stdout = result.stdout?.trim()\r\n  if (!stdout) {\r\n    throw new Error('did not return a value')\r\n  }\r\n  return stdout\r\n}\r\n\r\n/**\r\n * Sync cache reader \u2014 returns the last fetched apiKeyHelper value without executing.\r\n * Returns stale values to match SWR semantics of the async reader.\r\n * Returns null only if the async fetch hasn't completed yet.\r\n */\r\nexport function getApiKeyFromApiKeyHelperCached(): string | null {\r\n  return _apiKeyHelperCache?.value ?? null\r\n}\r\n\r\nexport function clearApiKeyHelperCache(): void {\r\n  _apiKeyHelperEpoch++\r\n  _apiKeyHelperCache = null\r\n  _apiKeyHelperInflight = null\r\n}\r\n\r\nexport function prefetchApiKeyFromApiKeyHelperIfSafe(\r\n  isNonInteractiveSession: boolean,\r\n): void {\r\n  // Skip if trust not yet accepted \u2014 the inner _executeApiKeyHelper check\r\n  // would catch this too, but would fire a false-positive analytics event.\r\n  if (\r\n    isApiKeyHelperFromProjectOrLocalSettings() &&\r\n    !checkHasTrustDialogAccepted()\r\n  ) {\r\n    return\r\n  }\r\n  void getApiKeyFromApiKeyHelper(isNonInteractiveSession)\r\n}\r\n\r\n/** Default STS credentials are one hour. We manually manage invalidation, so not too worried about this being accurate. */\r\nconst DEFAULT_AWS_STS_TTL = 60 * 60 * 1000\r\n\r\n/**\r\n * Run awsAuthRefresh to perform interactive authentication (e.g., aws sso login)\r\n * Streams output in real-time for user visibility\r\n */\r\nasync function runAwsAuthRefresh(): Promise<boolean> {\r\n  const awsAuthRefresh = getConfiguredAwsAuthRefresh()\r\n\r\n  if (!awsAuthRefresh) {\r\n    return false // Not configured, treat as success\r\n  }\r\n\r\n  // SECURITY: Check if awsAuthRefresh is from project settings\r\n  if (isAwsAuthRefreshFromProjectSettings()) {\r\n    // Check if trust has been established for this project\r\n    const hasTrust = checkHasTrustDialogAccepted()\r\n    if (!hasTrust && !getIsNonInteractiveSession()) {\r\n      const error = new Error(\r\n        `Security: awsAuthRefresh executed before workspace trust is confirmed. If you see this message, post in ${MACRO.FEEDBACK_CHANNEL}.`,\r\n      )\r\n      logAntError('awsAuthRefresh invoked before trust check', error)\r\n      logEvent('tengu_awsAuthRefresh_missing_trust', {})\r\n      return false\r\n    }\r\n  }\r\n\r\n  try {\r\n    logForDebugging('Fetching AWS caller identity for AWS auth refresh command')\r\n    await checkStsCallerIdentity()\r\n    logForDebugging(\r\n      'Fetched AWS caller identity, skipping AWS auth refresh command',\r\n    )\r\n    return false\r\n  } catch {\r\n    // only actually do the refresh if caller-identity calls\r\n    return refreshAwsAuth(awsAuthRefresh)\r\n  }\r\n}\r\n\r\n// Timeout for AWS auth refresh command (3 minutes).\r\n// Long enough for browser-based SSO flows, short enough to prevent indefinite hangs.\r\nconst AWS_AUTH_REFRESH_TIMEOUT_MS = 3 * 60 * 1000\r\n\r\nexport function refreshAwsAuth(awsAuthRefresh: string): Promise<boolean> {\r\n  logForDebugging('Running AWS auth refresh command')\r\n  // Start tracking authentication status\r\n  const authStatusManager = AwsAuthStatusManager.getInstance()\r\n  authStatusManager.startAuthentication()\r\n\r\n  return new Promise(resolve => {\r\n    const refreshProc = exec(awsAuthRefresh, {\r\n      timeout: AWS_AUTH_REFRESH_TIMEOUT_MS,\r\n    })\r\n    refreshProc.stdout!.on('data', data => {\r\n      const output = data.toString().trim()\r\n      if (output) {\r\n        // Add output to status manager for UI display\r\n        authStatusManager.addOutput(output)\r\n        // Also log for debugging\r\n        logForDebugging(output, { level: 'debug' })\r\n      }\r\n    })\r\n\r\n    refreshProc.stderr!.on('data', data => {\r\n      const error = data.toString().trim()\r\n      if (error) {\r\n        authStatusManager.setError(error)\r\n        logForDebugging(error, { level: 'error' })\r\n      }\r\n    })\r\n\r\n    refreshProc.on('close', (code, signal) => {\r\n      if (code === 0) {\r\n        logForDebugging('AWS auth refresh completed successfully')\r\n        authStatusManager.endAuthentication(true)\r\n        void resolve(true)\r\n      } else {\r\n        const timedOut = signal === 'SIGTERM'\r\n        const message = timedOut\r\n          ? chalk.red(\r\n              'AWS auth refresh timed out after 3 minutes. Run your auth command manually in a separate terminal.',\r\n            )\r\n          : chalk.red(\r\n              'Error running awsAuthRefresh (in settings or ~/.claude.json):',\r\n            )\r\n        // biome-ignore lint/suspicious/noConsole:: intentional console output\r\n        console.error(message)\r\n        authStatusManager.endAuthentication(false)\r\n        void resolve(false)\r\n      }\r\n    })\r\n  })\r\n}\r\n\r\n/**\r\n * Run awsCredentialExport to get credentials and set environment variables\r\n * Expects JSON output containing AWS credentials\r\n */\r\nasync function getAwsCredsFromCredentialExport(): Promise<{\r\n  accessKeyId: string\r\n  secretAccessKey: string\r\n  sessionToken: string\r\n} | null> {\r\n  const awsCredentialExport = getConfiguredAwsCredentialExport()\r\n\r\n  if (!awsCredentialExport) {\r\n    return null\r\n  }\r\n\r\n  // SECURITY: Check if awsCredentialExport is from project settings\r\n  if (isAwsCredentialExportFromProjectSettings()) {\r\n    // Check if trust has been established for this project\r\n    const hasTrust = checkHasTrustDialogAccepted()\r\n    if (!hasTrust && !getIsNonInteractiveSession()) {\r\n      const error = new Error(\r\n        `Security: awsCredentialExport executed before workspace trust is confirmed. If you see this message, post in ${MACRO.FEEDBACK_CHANNEL}.`,\r\n      )\r\n      logAntError('awsCredentialExport invoked before trust check', error)\r\n      logEvent('tengu_awsCredentialExport_missing_trust', {})\r\n      return null\r\n    }\r\n  }\r\n\r\n  try {\r\n    logForDebugging(\r\n      'Fetching AWS caller identity for credential export command',\r\n    )\r\n    await checkStsCallerIdentity()\r\n    logForDebugging(\r\n      'Fetched AWS caller identity, skipping AWS credential export command',\r\n    )\r\n    return null\r\n  } catch {\r\n    // only actually do the export if caller-identity calls\r\n    try {\r\n      logForDebugging('Running AWS credential export command')\r\n      const result = await execa(awsCredentialExport, {\r\n        shell: true,\r\n        reject: false,\r\n      })\r\n      if (result.exitCode !== 0 || !result.stdout) {\r\n        throw new Error('awsCredentialExport did not return a valid value')\r\n      }\r\n\r\n      // Parse the JSON output from aws sts commands\r\n      const awsOutput = jsonParse(result.stdout.trim())\r\n\r\n      if (!isValidAwsStsOutput(awsOutput)) {\r\n        throw new Error(\r\n          'awsCredentialExport did not return valid AWS STS output structure',\r\n        )\r\n      }\r\n\r\n      logForDebugging('AWS credentials retrieved from awsCredentialExport')\r\n      return {\r\n        accessKeyId: awsOutput.Credentials.AccessKeyId,\r\n        secretAccessKey: awsOutput.Credentials.SecretAccessKey,\r\n        sessionToken: awsOutput.Credentials.SessionToken,\r\n      }\r\n    } catch (e) {\r\n      const message = chalk.red(\r\n        'Error getting AWS credentials from awsCredentialExport (in settings or ~/.claude.json):',\r\n      )\r\n      if (e instanceof Error) {\r\n        // biome-ignore lint/suspicious/noConsole:: intentional console output\r\n        console.error(message, e.message)\r\n      } else {\r\n        // biome-ignore lint/suspicious/noConsole:: intentional console output\r\n        console.error(message, e)\r\n      }\r\n      return null\r\n    }\r\n  }\r\n}\r\n\r\n/**\r\n * Refresh AWS authentication and get credentials with cache clearing\r\n * This combines runAwsAuthRefresh, getAwsCredsFromCredentialExport, and clearAwsIniCache\r\n * to ensure fresh credentials are always used\r\n */\r\nexport const refreshAndGetAwsCredentials = memoizeWithTTLAsync(\r\n  async (): Promise<{\r\n    accessKeyId: string\r\n    secretAccessKey: string\r\n    sessionToken: string\r\n  } | null> => {\r\n    // First run auth refresh if needed\r\n    const refreshed = await runAwsAuthRefresh()\r\n\r\n    // Get credentials from export\r\n    const credentials = await getAwsCredsFromCredentialExport()\r\n\r\n    // Clear AWS INI cache to ensure fresh credentials are used\r\n    if (refreshed || credentials) {\r\n      await clearAwsIniCache()\r\n    }\r\n\r\n    return credentials\r\n  },\r\n  DEFAULT_AWS_STS_TTL,\r\n)\r\n\r\nexport function clearAwsCredentialsCache(): void {\r\n  refreshAndGetAwsCredentials.cache.clear()\r\n}\r\n\r\n/**\r\n * Get the configured gcpAuthRefresh from settings\r\n */\r\nfunction getConfiguredGcpAuthRefresh(): string | undefined {\r\n  const mergedSettings = getSettings_DEPRECATED() || {}\r\n  return mergedSettings.gcpAuthRefresh\r\n}\r\n\r\n/**\r\n * Check if the configured gcpAuthRefresh comes from project settings\r\n */\r\nexport function isGcpAuthRefreshFromProjectSettings(): boolean {\r\n  const gcpAuthRefresh = getConfiguredGcpAuthRefresh()\r\n  if (!gcpAuthRefresh) {\r\n    return false\r\n  }\r\n\r\n  const projectSettings = getSettingsForSource('projectSettings')\r\n  const localSettings = getSettingsForSource('localSettings')\r\n  return (\r\n    projectSettings?.gcpAuthRefresh === gcpAuthRefresh ||\r\n    localSettings?.gcpAuthRefresh === gcpAuthRefresh\r\n  )\r\n}\r\n\r\n/** Short timeout for the GCP credentials probe. Without this, when no local\r\n *  credential source exists (no ADC file, no env var), google-auth-library falls\r\n *  through to the GCE metadata server which hangs ~12s outside GCP. */\r\nconst GCP_CREDENTIALS_CHECK_TIMEOUT_MS = 5_000\r\n\r\n/**\r\n * Check if GCP credentials are currently valid by attempting to get an access token.\r\n * This uses the same authentication chain that the Vertex SDK uses.\r\n */\r\nexport async function checkGcpCredentialsValid(): Promise<boolean> {\r\n  try {\r\n    // Dynamically import to avoid loading google-auth-library unnecessarily\r\n    const { GoogleAuth } = await import('google-auth-library')\r\n    const auth = new GoogleAuth({\r\n      scopes: ['https://www.googleapis.com/auth/cloud-platform'],\r\n    })\r\n    const probe = (async () => {\r\n      const client = await auth.getClient()\r\n      await client.getAccessToken()\r\n    })()\r\n    const timeout = sleep(GCP_CREDENTIALS_CHECK_TIMEOUT_MS).then(() => {\r\n      throw new GcpCredentialsTimeoutError('GCP credentials check timed out')\r\n    })\r\n    await Promise.race([probe, timeout])\r\n    return true\r\n  } catch {\r\n    return false\r\n  }\r\n}\r\n\r\n/** Default GCP credential TTL - 1 hour to match typical ADC token lifetime */\r\nconst DEFAULT_GCP_CREDENTIAL_TTL = 60 * 60 * 1000\r\n\r\n/**\r\n * Run gcpAuthRefresh to perform interactive authentication (e.g., gcloud auth application-default login)\r\n * Streams output in real-time for user visibility\r\n */\r\nasync function runGcpAuthRefresh(): Promise<boolean> {\r\n  const gcpAuthRefresh = getConfiguredGcpAuthRefresh()\r\n\r\n  if (!gcpAuthRefresh) {\r\n    return false // Not configured, treat as success\r\n  }\r\n\r\n  // SECURITY: Check if gcpAuthRefresh is from project settings\r\n  if (isGcpAuthRefreshFromProjectSettings()) {\r\n    // Check if trust has been established for this project\r\n    // Pass true to indicate this is a dangerous feature that requires trust\r\n    const hasTrust = checkHasTrustDialogAccepted()\r\n    if (!hasTrust && !getIsNonInteractiveSession()) {\r\n      const error = new Error(\r\n        `Security: gcpAuthRefresh executed before workspace trust is confirmed. If you see this message, post in ${MACRO.FEEDBACK_CHANNEL}.`,\r\n      )\r\n      logAntError('gcpAuthRefresh invoked before trust check', error)\r\n      logEvent('tengu_gcpAuthRefresh_missing_trust', {})\r\n      return false\r\n    }\r\n  }\r\n\r\n  try {\r\n    logForDebugging('Checking GCP credentials validity for auth refresh')\r\n    const isValid = await checkGcpCredentialsValid()\r\n    if (isValid) {\r\n      logForDebugging(\r\n        'GCP credentials are valid, skipping auth refresh command',\r\n      )\r\n      return false\r\n    }\r\n  } catch {\r\n    // Credentials check failed, proceed with refresh\r\n  }\r\n\r\n  return refreshGcpAuth(gcpAuthRefresh)\r\n}\r\n\r\n// Timeout for GCP auth refresh command (3 minutes).\r\n// Long enough for browser-based auth flows, short enough to prevent indefinite hangs.\r\nconst GCP_AUTH_REFRESH_TIMEOUT_MS = 3 * 60 * 1000\r\n\r\nexport function refreshGcpAuth(gcpAuthRefresh: string): Promise<boolean> {\r\n  logForDebugging('Running GCP auth refresh command')\r\n  // Start tracking authentication status. AwsAuthStatusManager is cloud-provider-agnostic\r\n  // despite the name \u2014 print.ts emits its updates as generic SDK 'auth_status' messages.\r\n  const authStatusManager = AwsAuthStatusManager.getInstance()\r\n  authStatusManager.startAuthentication()\r\n\r\n  return new Promise(resolve => {\r\n    const refreshProc = exec(gcpAuthRefresh, {\r\n      timeout: GCP_AUTH_REFRESH_TIMEOUT_MS,\r\n    })\r\n    refreshProc.stdout!.on('data', data => {\r\n      const output = data.toString().trim()\r\n      if (output) {\r\n        // Add output to status manager for UI display\r\n        authStatusManager.addOutput(output)\r\n        // Also log for debugging\r\n        logForDebugging(output, { level: 'debug' })\r\n      }\r\n    })\r\n\r\n    refreshProc.stderr!.on('data', data => {\r\n      const error = data.toString().trim()\r\n      if (error) {\r\n        authStatusManager.setError(error)\r\n        logForDebugging(error, { level: 'error' })\r\n      }\r\n    })\r\n\r\n    refreshProc.on('close', (code, signal) => {\r\n      if (code === 0) {\r\n        logForDebugging('GCP auth refresh completed successfully')\r\n        authStatusManager.endAuthentication(true)\r\n        void resolve(true)\r\n      } else {\r\n        const timedOut = signal === 'SIGTERM'\r\n        const message = timedOut\r\n          ? chalk.red(\r\n              'GCP auth refresh timed out after 3 minutes. Run your auth command manually in a separate terminal.',\r\n            )\r\n          : chalk.red(\r\n              'Error running gcpAuthRefresh (in settings or ~/.claude.json):',\r\n            )\r\n        // biome-ignore lint/suspicious/noConsole:: intentional console output\r\n        console.error(message)\r\n        authStatusManager.endAuthentication(false)\r\n        void resolve(false)\r\n      }\r\n    })\r\n  })\r\n}\r\n\r\n/**\r\n * Refresh GCP authentication if needed.\r\n * This function checks if credentials are valid and runs the refresh command if not.\r\n * Memoized with TTL to avoid excessive refresh attempts.\r\n */\r\nexport const refreshGcpCredentialsIfNeeded = memoizeWithTTLAsync(\r\n  async (): Promise<boolean> => {\r\n    // Run auth refresh if needed\r\n    const refreshed = await runGcpAuthRefresh()\r\n    return refreshed\r\n  },\r\n  DEFAULT_GCP_CREDENTIAL_TTL,\r\n)\r\n\r\nexport function clearGcpCredentialsCache(): void {\r\n  refreshGcpCredentialsIfNeeded.cache.clear()\r\n}\r\n\r\n/**\r\n * Prefetches GCP credentials only if workspace trust has already been established.\r\n * This allows us to start the potentially slow GCP commands early for trusted workspaces\r\n * while maintaining security for untrusted ones.\r\n *\r\n * Returns void to prevent misuse - use refreshGcpCredentialsIfNeeded() to actually refresh.\r\n */\r\nexport function prefetchGcpCredentialsIfSafe(): void {\r\n  // Check if gcpAuthRefresh is configured\r\n  const gcpAuthRefresh = getConfiguredGcpAuthRefresh()\r\n\r\n  if (!gcpAuthRefresh) {\r\n    return\r\n  }\r\n\r\n  // Check if gcpAuthRefresh is from project settings\r\n  if (isGcpAuthRefreshFromProjectSettings()) {\r\n    // Only prefetch if trust has already been established\r\n    const hasTrust = checkHasTrustDialogAccepted()\r\n    if (!hasTrust && !getIsNonInteractiveSession()) {\r\n      // Don't prefetch - wait for trust to be established first\r\n      return\r\n    }\r\n  }\r\n\r\n  // Safe to prefetch - either not from project settings or trust already established\r\n  void refreshGcpCredentialsIfNeeded()\r\n}\r\n\r\n/**\r\n * Prefetches AWS credentials only if workspace trust has already been established.\r\n * This allows us to start the potentially slow AWS commands early for trusted workspaces\r\n * while maintaining security for untrusted ones.\r\n *\r\n * Returns void to prevent misuse - use refreshAndGetAwsCredentials() to actually retrieve credentials.\r\n */\r\nexport function prefetchAwsCredentialsAndBedRockInfoIfSafe(): void {\r\n  // Check if either AWS command is configured\r\n  const awsAuthRefresh = getConfiguredAwsAuthRefresh()\r\n  const awsCredentialExport = getConfiguredAwsCredentialExport()\r\n\r\n  if (!awsAuthRefresh && !awsCredentialExport) {\r\n    return\r\n  }\r\n\r\n  // Check if either command is from project settings\r\n  if (\r\n    isAwsAuthRefreshFromProjectSettings() ||\r\n    isAwsCredentialExportFromProjectSettings()\r\n  ) {\r\n    // Only prefetch if trust has already been established\r\n    const hasTrust = checkHasTrustDialogAccepted()\r\n    if (!hasTrust && !getIsNonInteractiveSession()) {\r\n      // Don't prefetch - wait for trust to be established first\r\n      return\r\n    }\r\n  }\r\n\r\n  // Safe to prefetch - either not from project settings or trust already established\r\n  void refreshAndGetAwsCredentials()\r\n  getModelStrings()\r\n}\r\n\r\n/** @private Use {@link getAnthropicApiKey} or {@link getAnthropicApiKeyWithSource} */\r\nexport const getApiKeyFromConfigOrMacOSKeychain = memoize(\r\n  (): { key: string; source: ApiKeySource } | null => {\r\n    if (isBareMode()) return null\r\n    // TODO: migrate to SecureStorage\r\n    if (process.platform === 'darwin') {\r\n      // keychainPrefetch.ts fires this read at main.tsx top-level in parallel\r\n      // with module imports. If it completed, use that instead of spawning a\r\n      // sync `security` subprocess here (~33ms).\r\n      const prefetch = getLegacyApiKeyPrefetchResult()\r\n      if (prefetch) {\r\n        if (prefetch.stdout) {\r\n          return { key: prefetch.stdout, source: '/login managed key' }\r\n        }\r\n        // Prefetch completed with no key \u2014 fall through to config, not keychain.\r\n      } else {\r\n        const storageServiceName = getMacOsKeychainStorageServiceName()\r\n        try {\r\n          const result = execSyncWithDefaults_DEPRECATED(\r\n            `security find-generic-password -a $USER -w -s \"${storageServiceName}\"`,\r\n          )\r\n          if (result) {\r\n            return { key: result, source: '/login managed key' }\r\n          }\r\n        } catch (e) {\r\n          logError(e)\r\n        }\r\n      }\r\n    }\r\n\r\n    const config = getGlobalConfig()\r\n    if (!config.primaryApiKey) {\r\n      return null\r\n    }\r\n\r\n    return { key: config.primaryApiKey, source: '/login managed key' }\r\n  },\r\n)\r\n\r\nfunction isValidApiKey(apiKey: string): boolean {\r\n  // Only allow alphanumeric characters, dashes, and underscores\r\n  return /^[a-zA-Z0-9-_]+$/.test(apiKey)\r\n}\r\n\r\nexport async function saveApiKey(apiKey: string): Promise<void> {\r\n  if (!isValidApiKey(apiKey)) {\r\n    throw new Error(\r\n      'Invalid API key format. API key must contain only alphanumeric characters, dashes, and underscores.',\r\n    )\r\n  }\r\n\r\n  // Store as primary API key\r\n  await maybeRemoveApiKeyFromMacOSKeychain()\r\n  let savedToKeychain = false\r\n  if (process.platform === 'darwin') {\r\n    try {\r\n      // TODO: migrate to SecureStorage\r\n      const storageServiceName = getMacOsKeychainStorageServiceName()\r\n      const username = getUsername()\r\n\r\n      // Convert to hexadecimal to avoid any escaping issues\r\n      const hexValue = Buffer.from(apiKey, 'utf-8').toString('hex')\r\n\r\n      // Use security's interactive mode (-i) with -X (hexadecimal) option\r\n      // This ensures credentials never appear in process command-line arguments\r\n      // Process monitors only see \"security -i\", not the password\r\n      const command = `add-generic-password -U -a \"${username}\" -s \"${storageServiceName}\" -X \"${hexValue}\"\\n`\r\n\r\n      await execa('security', ['-i'], {\r\n        input: command,\r\n        reject: false,\r\n      })\r\n\r\n      logEvent('tengu_api_key_saved_to_keychain', {})\r\n      savedToKeychain = true\r\n    } catch (e) {\r\n      logError(e)\r\n      logEvent('tengu_api_key_keychain_error', {\r\n        error: errorMessage(\r\n          e,\r\n        ) as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,\r\n      })\r\n      logEvent('tengu_api_key_saved_to_config', {})\r\n    }\r\n  } else {\r\n    logEvent('tengu_api_key_saved_to_config', {})\r\n  }\r\n\r\n  const normalizedKey = normalizeApiKeyForConfig(apiKey)\r\n\r\n  // Save config with all updates\r\n  saveGlobalConfig(current => {\r\n    const approved = current.customApiKeyResponses?.approved ?? []\r\n    return {\r\n      ...current,\r\n      // Only save to config if keychain save failed or not on darwin\r\n      primaryApiKey: savedToKeychain ? current.primaryApiKey : apiKey,\r\n      customApiKeyResponses: {\r\n        ...current.customApiKeyResponses,\r\n        approved: approved.includes(normalizedKey)\r\n          ? approved\r\n          : [...approved, normalizedKey],\r\n        rejected: current.customApiKeyResponses?.rejected ?? [],\r\n      },\r\n    }\r\n  })\r\n\r\n  // Clear memo cache\r\n  getApiKeyFromConfigOrMacOSKeychain.cache.clear?.()\r\n  clearLegacyApiKeyPrefetch()\r\n}\r\n\r\nexport function isCustomApiKeyApproved(apiKey: string): boolean {\r\n  const config = getGlobalConfig()\r\n  const normalizedKey = normalizeApiKeyForConfig(apiKey)\r\n  return (\r\n    config.customApiKeyResponses?.approved?.includes(normalizedKey) ?? false\r\n  )\r\n}\r\n\r\nexport async function removeApiKey(): Promise<void> {\r\n  await maybeRemoveApiKeyFromMacOSKeychain()\r\n\r\n  // Also remove from config instead of returning early, for older clients\r\n  // that set keys before we supported keychain.\r\n  saveGlobalConfig(current => ({\r\n    ...current,\r\n    primaryApiKey: undefined,\r\n  }))\r\n\r\n  // Clear memo cache\r\n  getApiKeyFromConfigOrMacOSKeychain.cache.clear?.()\r\n  clearLegacyApiKeyPrefetch()\r\n}\r\n\r\nasync function maybeRemoveApiKeyFromMacOSKeychain(): Promise<void> {\r\n  try {\r\n    await maybeRemoveApiKeyFromMacOSKeychainThrows()\r\n  } catch (e) {\r\n    logError(e)\r\n  }\r\n}\r\n\r\n// Function to store OAuth tokens in secure storage\r\nexport function saveOAuthTokensIfNeeded(tokens: OAuthTokens): {\r\n  success: boolean\r\n  warning?: string\r\n} {\r\n  if (!shouldUseClaudeAIAuth(tokens.scopes)) {\r\n    logEvent('tengu_oauth_tokens_not_claude_ai', {})\r\n    return { success: true }\r\n  }\r\n\r\n  // Skip saving inference-only tokens (they come from env vars)\r\n  if (!tokens.refreshToken || !tokens.expiresAt) {\r\n    logEvent('tengu_oauth_tokens_inference_only', {})\r\n    return { success: true }\r\n  }\r\n\r\n  const secureStorage = getSecureStorage()\r\n  const storageBackend =\r\n    secureStorage.name as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS\r\n\r\n  try {\r\n    const storageData = secureStorage.read() || {}\r\n    const existingOauth = storageData.claudeAiOauth\r\n\r\n    storageData.claudeAiOauth = {\r\n      accessToken: tokens.accessToken,\r\n      refreshToken: tokens.refreshToken,\r\n      expiresAt: tokens.expiresAt,\r\n      scopes: tokens.scopes,\r\n      // Profile fetch in refreshOAuthToken swallows errors and returns null on\r\n      // transient failures (network, 5xx, rate limit). Don't clobber a valid\r\n      // stored subscription with null \u2014 fall back to the existing value.\r\n      subscriptionType:\r\n        tokens.subscriptionType ?? existingOauth?.subscriptionType ?? null,\r\n      rateLimitTier:\r\n        tokens.rateLimitTier ?? existingOauth?.rateLimitTier ?? null,\r\n    }\r\n\r\n    const updateStatus = secureStorage.update(storageData)\r\n\r\n    if (updateStatus.success) {\r\n      logEvent('tengu_oauth_tokens_saved', { storageBackend })\r\n    } else {\r\n      logEvent('tengu_oauth_tokens_save_failed', { storageBackend })\r\n    }\r\n\r\n    getClaudeAIOAuthTokens.cache?.clear?.()\r\n    clearBetasCaches()\r\n    clearToolSchemaCache()\r\n    return updateStatus\r\n  } catch (error) {\r\n    logError(error)\r\n    logEvent('tengu_oauth_tokens_save_exception', {\r\n      storageBackend,\r\n      error: errorMessage(\r\n        error,\r\n      ) as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,\r\n    })\r\n    return { success: false, warning: 'Failed to save OAuth tokens' }\r\n  }\r\n}\r\n\r\nexport const getClaudeAIOAuthTokens = memoize((): OAuthTokens | null => {\r\n  // --bare: API-key-only. No OAuth env tokens, no keychain, no credentials file.\r\n  if (isBareMode()) return null\r\n\r\n  // Check for force-set OAuth token from environment variable\r\n  if (process.env.CLAUDE_CODE_OAUTH_TOKEN) {\r\n    // Return an inference-only token (unknown refresh and expiry)\r\n    return {\r\n      accessToken: process.env.CLAUDE_CODE_OAUTH_TOKEN,\r\n      refreshToken: null,\r\n      expiresAt: null,\r\n      scopes: ['user:inference'],\r\n      subscriptionType: null,\r\n      rateLimitTier: null,\r\n    }\r\n  }\r\n\r\n  // Check for OAuth token from file descriptor\r\n  const oauthTokenFromFd = getOAuthTokenFromFileDescriptor()\r\n  if (oauthTokenFromFd) {\r\n    // Return an inference-only token (unknown refresh and expiry)\r\n    return {\r\n      accessToken: oauthTokenFromFd,\r\n      refreshToken: null,\r\n      expiresAt: null,\r\n      scopes: ['user:inference'],\r\n      subscriptionType: null,\r\n      rateLimitTier: null,\r\n    }\r\n  }\r\n\r\n  try {\r\n    const secureStorage = getSecureStorage()\r\n    const storageData = secureStorage.read()\r\n    const oauthData = storageData?.claudeAiOauth\r\n\r\n    if (!oauthData?.accessToken) {\r\n      return null\r\n    }\r\n\r\n    return oauthData\r\n  } catch (error) {\r\n    logError(error)\r\n    return null\r\n  }\r\n})\r\n\r\n/**\r\n * Clears all OAuth token caches. Call this on 401 errors to ensure\r\n * the next token read comes from secure storage, not stale in-memory caches.\r\n * This handles the case where the local expiration check disagrees with the\r\n * server (e.g., due to clock corrections after token was issued).\r\n */\r\nexport function clearOAuthTokenCache(): void {\r\n  getClaudeAIOAuthTokens.cache?.clear?.()\r\n  clearKeychainCache()\r\n}\r\n\r\nlet lastCredentialsMtimeMs = 0\r\n\r\n// Cross-process staleness: another CC instance may write fresh tokens to\r\n// disk (refresh or /login), but this process's memoize caches forever.\r\n// Without this, terminal 1's /login fixes terminal 1; terminal 2's /login\r\n// then revokes terminal 1 server-side, and terminal 1's memoize never\r\n// re-reads \u2014 infinite /login regress (CC-1096, GH#24317).\r\nasync function invalidateOAuthCacheIfDiskChanged(): Promise<void> {\r\n  try {\r\n    const { mtimeMs } = await stat(\r\n      join(getClaudeConfigHomeDir(), '.credentials.json'),\r\n    )\r\n    if (mtimeMs !== lastCredentialsMtimeMs) {\r\n      lastCredentialsMtimeMs = mtimeMs\r\n      clearOAuthTokenCache()\r\n    }\r\n  } catch {\r\n    // ENOENT \u2014 macOS keychain path (file deleted on migration). Clear only\r\n    // the memoize so it delegates to the keychain cache's 30s TTL instead\r\n    // of caching forever on top. `security find-generic-password` is\r\n    // ~15ms; bounded to once per 30s by the keychain cache.\r\n    getClaudeAIOAuthTokens.cache?.clear?.()\r\n  }\r\n}\r\n\r\n// In-flight dedup: when N claude.ai proxy connectors hit 401 with the same\r\n// token simultaneously (common at startup \u2014 #20930), only one should clear\r\n// caches and re-read the keychain. Without this, each call's clearOAuthTokenCache()\r\n// nukes readInFlight in macOsKeychainStorage and triggers a fresh spawn \u2014\r\n// sync spawns stacked to 800ms+ of blocked render frames.\r\nconst pending401Handlers = new Map<string, Promise<boolean>>()\r\n\r\n/**\r\n * Handle a 401 \"OAuth token has expired\" error from the API.\r\n *\r\n * This function forces a token refresh when the server says the token is expired,\r\n * even if our local expiration check disagrees (which can happen due to clock\r\n * issues when the token was issued).\r\n *\r\n * Safety: We compare the failed token with what's in keychain. If another tab\r\n * already refreshed (different token in keychain), we use that instead of\r\n * refreshing again. Concurrent calls with the same failedAccessToken are\r\n * deduplicated to a single keychain read.\r\n *\r\n * @param failedAccessToken - The access token that was rejected with 401\r\n * @returns true if we now have a valid token, false otherwise\r\n */\r\nexport function handleOAuth401Error(\r\n  failedAccessToken: string,\r\n): Promise<boolean> {\r\n  const pending = pending401Handlers.get(failedAccessToken)\r\n  if (pending) return pending\r\n\r\n  const promise = handleOAuth401ErrorImpl(failedAccessToken).finally(() => {\r\n    pending401Handlers.delete(failedAccessToken)\r\n  })\r\n  pending401Handlers.set(failedAccessToken, promise)\r\n  return promise\r\n}\r\n\r\nasync function handleOAuth401ErrorImpl(\r\n  failedAccessToken: string,\r\n): Promise<boolean> {\r\n  // Clear caches and re-read from keychain (async \u2014 sync read blocks ~100ms/call)\r\n  clearOAuthTokenCache()\r\n  const currentTokens = await getClaudeAIOAuthTokensAsync()\r\n\r\n  if (!currentTokens?.refreshToken) {\r\n    return false\r\n  }\r\n\r\n  // If keychain has a different token, another tab already refreshed - use it\r\n  if (currentTokens.accessToken !== failedAccessToken) {\r\n    logEvent('tengu_oauth_401_recovered_from_keychain', {})\r\n    return true\r\n  }\r\n\r\n  // Same token that failed - force refresh, bypassing local expiration check\r\n  return checkAndRefreshOAuthTokenIfNeeded(0, true)\r\n}\r\n\r\n/**\r\n * Reads OAuth tokens asynchronously, avoiding blocking keychain reads.\r\n * Delegates to the sync memoized version for env var / file descriptor tokens\r\n * (which don't hit the keychain), and only uses async for storage reads.\r\n */\r\nexport async function getClaudeAIOAuthTokensAsync(): Promise<OAuthTokens | null> {\r\n  if (isBareMode()) return null\r\n\r\n  // Env var and FD tokens are sync and don't hit the keychain\r\n  if (\r\n    process.env.CLAUDE_CODE_OAUTH_TOKEN ||\r\n    getOAuthTokenFromFileDescriptor()\r\n  ) {\r\n    return getClaudeAIOAuthTokens()\r\n  }\r\n\r\n  try {\r\n    const secureStorage = getSecureStorage()\r\n    const storageData = await secureStorage.readAsync()\r\n    const oauthData = storageData?.claudeAiOauth\r\n    if (!oauthData?.accessToken) {\r\n      return null\r\n    }\r\n    return oauthData\r\n  } catch (error) {\r\n    logError(error)\r\n    return null\r\n  }\r\n}\r\n\r\n// In-flight promise for deduplicating concurrent calls\r\nlet pendingRefreshCheck: Promise<boolean> | null = null\r\n\r\nexport function checkAndRefreshOAuthTokenIfNeeded(\r\n  retryCount = 0,\r\n  force = false,\r\n): Promise<boolean> {\r\n  // Deduplicate concurrent non-retry, non-force calls\r\n  if (retryCount === 0 && !force) {\r\n    if (pendingRefreshCheck) {\r\n      return pendingRefreshCheck\r\n    }\r\n\r\n    const promise = checkAndRefreshOAuthTokenIfNeededImpl(retryCount, force)\r\n    pendingRefreshCheck = promise.finally(() => {\r\n      pendingRefreshCheck = null\r\n    })\r\n    return pendingRefreshCheck\r\n  }\r\n\r\n  return checkAndRefreshOAuthTokenIfNeededImpl(retryCount, force)\r\n}\r\n\r\nasync function checkAndRefreshOAuthTokenIfNeededImpl(\r\n  retryCount: number,\r\n  force: boolean,\r\n): Promise<boolean> {\r\n  const MAX_RETRIES = 5\r\n\r\n  await invalidateOAuthCacheIfDiskChanged()\r\n\r\n  // First check if token is expired with cached value\r\n  // Skip this check if force=true (server already told us token is bad)\r\n  const tokens = getClaudeAIOAuthTokens()\r\n  if (!force) {\r\n    if (!tokens?.refreshToken || !isOAuthTokenExpired(tokens.expiresAt)) {\r\n      return false\r\n    }\r\n  }\r\n\r\n  if (!tokens?.refreshToken) {\r\n    return false\r\n  }\r\n\r\n  if (!shouldUseClaudeAIAuth(tokens.scopes)) {\r\n    return false\r\n  }\r\n\r\n  // Re-read tokens async to check if they're still expired\r\n  // Another process might have refreshed them\r\n  getClaudeAIOAuthTokens.cache?.clear?.()\r\n  clearKeychainCache()\r\n  const freshTokens = await getClaudeAIOAuthTokensAsync()\r\n  if (\r\n    !freshTokens?.refreshToken ||\r\n    !isOAuthTokenExpired(freshTokens.expiresAt)\r\n  ) {\r\n    return false\r\n  }\r\n\r\n  // Tokens are still expired, try to acquire lock and refresh\r\n  const claudeDir = getClaudeConfigHomeDir()\r\n  await mkdir(claudeDir, { recursive: true })\r\n\r\n  let release\r\n  try {\r\n    logEvent('tengu_oauth_token_refresh_lock_acquiring', {})\r\n    release = await lockfile.lock(claudeDir)\r\n    logEvent('tengu_oauth_token_refresh_lock_acquired', {})\r\n  } catch (err) {\r\n    if ((err as { code?: string }).code === 'ELOCKED') {\r\n      // Another process has the lock, let's retry if we haven't exceeded max retries\r\n      if (retryCount < MAX_RETRIES) {\r\n        logEvent('tengu_oauth_token_refresh_lock_retry', {\r\n          retryCount: retryCount + 1,\r\n        })\r\n        // Wait a bit before retrying\r\n        await sleep(1000 + Math.random() * 1000)\r\n        return checkAndRefreshOAuthTokenIfNeededImpl(retryCount + 1, force)\r\n      }\r\n      logEvent('tengu_oauth_token_refresh_lock_retry_limit_reached', {\r\n        maxRetries: MAX_RETRIES,\r\n      })\r\n      return false\r\n    }\r\n    logError(err)\r\n    logEvent('tengu_oauth_token_refresh_lock_error', {\r\n      error: errorMessage(\r\n        err,\r\n      ) as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,\r\n    })\r\n    return false\r\n  }\r\n  try {\r\n    // Check one more time after acquiring lock\r\n    getClaudeAIOAuthTokens.cache?.clear?.()\r\n    clearKeychainCache()\r\n    const lockedTokens = await getClaudeAIOAuthTokensAsync()\r\n    if (\r\n      !lockedTokens?.refreshToken ||\r\n      !isOAuthTokenExpired(lockedTokens.expiresAt)\r\n    ) {\r\n      logEvent('tengu_oauth_token_refresh_race_resolved', {})\r\n      return false\r\n    }\r\n\r\n    logEvent('tengu_oauth_token_refresh_starting', {})\r\n    const refreshedTokens = await refreshOAuthToken(lockedTokens.refreshToken, {\r\n      // For Claude.ai subscribers, omit scopes so the default\r\n      // CLAUDE_AI_OAUTH_SCOPES applies \u2014 this allows scope expansion\r\n      // (e.g. adding user:file_upload) on refresh without re-login.\r\n      scopes: shouldUseClaudeAIAuth(lockedTokens.scopes)\r\n        ? undefined\r\n        : lockedTokens.scopes,\r\n    })\r\n    saveOAuthTokensIfNeeded(refreshedTokens)\r\n\r\n    // Clear the cache after refreshing token\r\n    getClaudeAIOAuthTokens.cache?.clear?.()\r\n    clearKeychainCache()\r\n    return true\r\n  } catch (error) {\r\n    logError(error)\r\n\r\n    getClaudeAIOAuthTokens.cache?.clear?.()\r\n    clearKeychainCache()\r\n    const currentTokens = await getClaudeAIOAuthTokensAsync()\r\n    if (currentTokens && !isOAuthTokenExpired(currentTokens.expiresAt)) {\r\n      logEvent('tengu_oauth_token_refresh_race_recovered', {})\r\n      return true\r\n    }\r\n\r\n    return false\r\n  } finally {\r\n    logEvent('tengu_oauth_token_refresh_lock_releasing', {})\r\n    await release()\r\n    logEvent('tengu_oauth_token_refresh_lock_released', {})\r\n  }\r\n}\r\n\r\nexport function isClaudeAISubscriber(): boolean {\r\n  if (!isAnthropicAuthEnabled()) {\r\n    return false\r\n  }\r\n\r\n  return shouldUseClaudeAIAuth(getClaudeAIOAuthTokens()?.scopes)\r\n}\r\n\r\n/**\r\n * Check if the current OAuth token has the user:profile scope.\r\n *\r\n * Real /login tokens always include this scope. Env-var and file-descriptor\r\n * tokens (service keys) hardcode scopes to ['user:inference'] only. Use this\r\n * to gate calls to profile-scoped endpoints so service key sessions don't\r\n * generate 403 storms against /api/oauth/profile, bootstrap, etc.\r\n */\r\nexport function hasProfileScope(): boolean {\r\n  return (\r\n    getClaudeAIOAuthTokens()?.scopes?.includes(CLAUDE_AI_PROFILE_SCOPE) ?? false\r\n  )\r\n}\r\n\r\nexport function is1PApiCustomer(): boolean {\r\n  // 1P API customers are users who are NOT:\r\n  // 1. Claude.ai subscribers (Max, Pro, Enterprise, Team)\r\n  // 2. Vertex AI users\r\n  // 3. AWS Bedrock users\r\n  // 4. Foundry users\r\n\r\n  // Exclude Vertex, Bedrock, and Foundry customers\r\n  if (\r\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_BEDROCK) ||\r\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_VERTEX) ||\r\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_FOUNDRY)\r\n  ) {\r\n    return false\r\n  }\r\n\r\n  // Exclude Claude.ai subscribers\r\n  if (isClaudeAISubscriber()) {\r\n    return false\r\n  }\r\n\r\n  // Everyone else is an API customer (OAuth API customers, direct API key users, etc.)\r\n  return true\r\n}\r\n\r\n/**\r\n * Gets OAuth account information when Anthropic auth is enabled.\r\n * Returns undefined when using external API keys or third-party services.\r\n */\r\nexport function getOauthAccountInfo(): AccountInfo | undefined {\r\n  return isAnthropicAuthEnabled() ? getGlobalConfig().oauthAccount : undefined\r\n}\r\n\r\n/**\r\n * Checks if overage/extra usage provisioning is allowed for this organization.\r\n * This mirrors the logic in apps/claude-ai `useIsOverageProvisioningAllowed` hook as closely as possible.\r\n */\r\nexport function isOverageProvisioningAllowed(): boolean {\r\n  const accountInfo = getOauthAccountInfo()\r\n  const billingType = accountInfo?.billingType\r\n\r\n  // Must be a Claude subscriber with a supported subscription type\r\n  if (!isClaudeAISubscriber() || !billingType) {\r\n    return false\r\n  }\r\n\r\n  // only allow Stripe and mobile billing types to purchase extra usage\r\n  if (\r\n    billingType !== 'stripe_subscription' &&\r\n    billingType !== 'stripe_subscription_contracted' &&\r\n    billingType !== 'apple_subscription' &&\r\n    billingType !== 'google_play_subscription'\r\n  ) {\r\n    return false\r\n  }\r\n\r\n  return true\r\n}\r\n\r\n// Returns whether the user has Opus access at all, regardless of whether they\r\n// are a subscriber or PayG.\r\nexport function hasOpusAccess(): boolean {\r\n  const subscriptionType = getSubscriptionType()\r\n\r\n  return (\r\n    subscriptionType === 'max' ||\r\n    subscriptionType === 'enterprise' ||\r\n    subscriptionType === 'team' ||\r\n    subscriptionType === 'pro' ||\r\n    // subscriptionType === null covers both API users and the case where\r\n    // subscribers do not have subscription type populated. For those\r\n    // subscribers, when in doubt, we should not limit their access to Opus.\r\n    subscriptionType === null\r\n  )\r\n}\r\n\r\nexport function getSubscriptionType(): SubscriptionType | null {\r\n  // Check for mock subscription type first (ANT-only testing)\r\n  if (shouldUseMockSubscription()) {\r\n    return getMockSubscriptionType()\r\n  }\r\n\r\n  if (!isAnthropicAuthEnabled()) {\r\n    return null\r\n  }\r\n  const oauthTokens = getClaudeAIOAuthTokens()\r\n  if (!oauthTokens) {\r\n    return null\r\n  }\r\n\r\n  return oauthTokens.subscriptionType ?? null\r\n}\r\n\r\nexport function isMaxSubscriber(): boolean {\r\n  return getSubscriptionType() === 'max'\r\n}\r\n\r\nexport function isTeamSubscriber(): boolean {\r\n  return getSubscriptionType() === 'team'\r\n}\r\n\r\nexport function isTeamPremiumSubscriber(): boolean {\r\n  return (\r\n    getSubscriptionType() === 'team' &&\r\n    getRateLimitTier() === 'default_claude_max_5x'\r\n  )\r\n}\r\n\r\nexport function isEnterpriseSubscriber(): boolean {\r\n  return getSubscriptionType() === 'enterprise'\r\n}\r\n\r\nexport function isProSubscriber(): boolean {\r\n  return getSubscriptionType() === 'pro'\r\n}\r\n\r\nexport function getRateLimitTier(): string | null {\r\n  if (!isAnthropicAuthEnabled()) {\r\n    return null\r\n  }\r\n  const oauthTokens = getClaudeAIOAuthTokens()\r\n  if (!oauthTokens) {\r\n    return null\r\n  }\r\n\r\n  return oauthTokens.rateLimitTier ?? null\r\n}\r\n\r\nexport function getSubscriptionName(): string {\r\n  const subscriptionType = getSubscriptionType()\r\n\r\n  switch (subscriptionType) {\r\n    case 'enterprise':\r\n      return 'Claude Enterprise'\r\n    case 'team':\r\n      return 'Claude Team'\r\n    case 'max':\r\n      return 'Claude Max'\r\n    case 'pro':\r\n      return 'Claude Pro'\r\n    default:\r\n      return 'Claude API'\r\n  }\r\n}\r\n\r\n/** Check if using third-party services (Bedrock or Vertex or Foundry) */\r\nexport function isUsing3PServices(): boolean {\r\n  return !!(\r\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_BEDROCK) ||\r\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_VERTEX) ||\r\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_FOUNDRY)\r\n  )\r\n}\r\n\r\n// \u2500\u2500\u2500 Third-Party (Non-Anthropic) Provider Auth \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n/** Auth method resolved for a third-party provider */\r\nexport type ProviderAuthMethod = 'api_key' | 'oauth' | 'none'\r\n\r\n/** Supported auth methods per provider */\r\nexport const PROVIDER_AUTH_SUPPORT: Record<string, ProviderAuthMethod[]> = {\r\n  firstParty:  ['api_key', 'oauth'],\r\n  openai:      ['api_key', 'oauth'],\r\n  gemini:      ['api_key', 'oauth'],\r\n  antigravity: ['oauth'],\r\n  openrouter:  ['api_key'],\r\n  agentrouter: ['api_key'],\r\n  modelrouter: ['api_key'],\r\n  vercel:      ['api_key'],\r\n  requesty:    ['api_key'],\n  opencode:    ['api_key'],\n  commandcode: ['api_key'],\n  groq:        ['api_key'],\n  mistral:     ['api_key'],\r\n  nim:         ['api_key'],\r\n  deepseek:    ['api_key'],\r\n  glm:         ['api_key'],\r\n  moonshot:    ['api_key'],\r\n  minimax:     ['api_key'],\r\n  ollama:      ['api_key'],\r\n  lmstudio:    ['api_key'],\r\n  cline:       ['oauth'],\r\n  copilot:     ['oauth'],\r\n  cursor:      ['oauth'],\r\n  iflow:       ['oauth'],\r\n  kilocode:    ['oauth'],\r\n  kiro:        ['oauth'],\r\n}\r\n\r\n/**\r\n * Determines which auth method is active for a provider.\r\n * Priority: OAuth token (if supported & stored) \u2192 API key \u2192 none\r\n *\r\n * OAuth takes priority because it uses the user's account subscription\r\n * (e.g. Gemini Pro, ChatGPT Plus), while API keys typically give\r\n * free-tier access with strict rate limits.\r\n */\r\nexport function getProviderAuthMethod(provider: APIProvider): ProviderAuthMethod {\r\n  if (provider === 'firstParty') {\r\n    if (getClaudeAIOAuthTokens()?.accessToken) return 'oauth'\r\n    if (hasAnthropicApiKeyAuth()) return 'api_key'\r\n    return 'none'\r\n  }\r\n\r\n  // Check OAuth first for providers that support it\r\n  // OAuth = user's paid subscription; API key = often free tier\r\n  const supported = PROVIDER_AUTH_SUPPORT[provider]\r\n  if (supported?.includes('oauth')) {\r\n    if (_hasStoredOAuthCredential(provider)) return 'oauth'\r\n  }\r\n\r\n  if (provider === 'ollama') {\r\n    return process.env.OLLAMA_API_KEY ?? _loadStoredKey('ollama')\r\n      ? 'api_key'\r\n      : 'none'\r\n  }\r\n\r\n  if (provider === 'lmstudio') {\r\n    return process.env.LMSTUDIO_API_KEY ?? _loadStoredKey('lmstudio')\r\n      ? 'api_key'\r\n      : 'none'\r\n  }\r\n\r\n  // Fall back to API key\r\n  const key = _getApiKeyDirect(provider)\r\n  if (key) return 'api_key'\r\n\r\n  return 'none'\r\n}\r\n\r\n/**\r\n * Returns the API key for a third-party LLM provider.\r\n * Checks: env var \u2192 stored key file \u2192 null.\r\n */\r\nexport function getProviderApiKey(provider: APIProvider): string | null {\n  return _getApiKeyDirect(provider)\n}\n\n/**\n * Returns the key used at request time. OpenCode Zen accepts `Bearer public`\n * for anonymous allow-listed models; paid rows still require a real account key.\n */\nexport function getProviderRuntimeApiKey(provider: APIProvider): string | null {\n  if (provider === 'opencode') return _getApiKeyDirect(provider) ?? 'public'\n  return _getApiKeyDirect(provider)\n}\n\r\n/** Direct API key lookup \u2014 env var \u2192 stored key. No OAuth fallback. */\r\nfunction _getApiKeyDirect(provider: APIProvider): string | null {\r\n  switch (provider) {\r\n    case 'openai':      return process.env.OPENAI_API_KEY ?? _loadStoredKey('openai')\r\n    case 'openrouter':  return process.env.OPENROUTER_API_KEY ?? _loadStoredKey('openrouter')\r\n    case 'agentrouter': return process.env.AGENT_ROUTER_TOKEN ?? process.env.AGENTROUTER_API_KEY ?? _loadStoredKey('agentrouter')\r\n    case 'modelrouter': return process.env.MODEL_ROUTER_API_KEY ?? process.env.MODELROUTER_API_KEY ?? process.env.LXG2IT_API_KEY ?? _loadStoredKey('modelrouter')\r\n    case 'vercel':      return process.env.AI_GATEWAY_API_KEY ?? process.env.VERCEL_AI_GATEWAY_API_KEY ?? process.env.VERCEL_OIDC_TOKEN ?? _loadStoredKey('vercel')\r\n    case 'requesty':    return process.env.REQUESTY_API_KEY ?? _loadStoredKey('requesty')\n    case 'opencode':    return process.env.OPENCODE_API_KEY ?? process.env.OPENCODE_ZEN_API_KEY ?? _loadStoredKey('opencode') ?? loadOpenCodeApiKeyFromAuthFile()\n    case 'commandcode': return process.env.CMD_API_KEY ?? process.env.COMMANDCODE_API_KEY ?? process.env.COMMAND_CODE_API_KEY ?? _loadStoredKey('commandcode') ?? loadCommandCodeApiKeyFromAuthFile()\n    case 'groq':        return process.env.GROQ_API_KEY ?? _loadStoredKey('groq')\n    case 'mistral':     return process.env.MISTRAL_API_KEY ?? _loadStoredKey('mistral')\r\n    case 'nim':         return process.env.NIM_API_KEY ?? _loadStoredKey('nim')\r\n    case 'gemini':      return process.env.GEMINI_API_KEY ?? _loadStoredKey('gemini')\r\n    case 'antigravity': return null  // OAuth-only provider\r\n    case 'deepseek':    return process.env.DEEPSEEK_API_KEY ?? _loadStoredKey('deepseek')\r\n    case 'glm':         return process.env.GLM_API_KEY ?? process.env.BIGMODEL_API_KEY ?? process.env.ZHIPU_API_KEY ?? process.env.ZAI_API_KEY ?? process.env.Z_AI_API_KEY ?? _loadStoredKey('glm')\r\n    case 'moonshot':    return process.env.MOONSHOT_API_KEY ?? process.env.MOONSHOTAI_API_KEY ?? _loadStoredKey('moonshot')\r\n    case 'minimax':     return process.env.MINIMAX_API_KEY ?? _loadStoredKey('minimax')\r\n    case 'ollama':      return process.env.OLLAMA_API_KEY ?? _loadStoredKey('ollama') ?? 'ollama'\r\n    case 'lmstudio':    return process.env.LMSTUDIO_API_KEY ?? _loadStoredKey('lmstudio') ?? 'lm-studio'\r\n    case 'cline':       return null  // OAuth-only\r\n    case 'copilot':     return null  // OAuth-only\r\n    case 'cursor':      return null  // OAuth-only\r\n    case 'iflow':       return null  // OAuth-only\r\n    case 'kilocode':    return null  // OAuth-only\r\n    case 'kiro':        return null  // OAuth-only\r\n    default:            return getAnthropicApiKey()\r\n  }\r\n}\r\n\r\n/**\r\n * Returns an OAuth access token for a provider, if one is stored and valid.\r\n * Returns null if OAuth is not available or token is missing/expired.\r\n */\r\nexport function getProviderOAuthToken(provider: APIProvider): string | null {\r\n  return _loadStoredOAuthToken(provider)\r\n}\r\n\r\n/** Load a stored OAuth token from provider-keys.json */\r\nfunction _loadStoredOAuthToken(provider: string): string | null {\r\n  try {\r\n    const { readFileSync, existsSync } = require('fs')\r\n    const { join } = require('path')\r\n    const { homedir } = require('os')\r\n    const keysFile = join(homedir(), '.config', 'claude-code', 'provider-keys.json')\r\n    if (!existsSync(keysFile)) return null\r\n    const data = JSON.parse(readFileSync(keysFile, 'utf-8'))\r\n\r\n    // Gemini now uses the CLI-tier OAuth only \u2014 Antigravity has its own\r\n    // provider row that reads gemini_oauth_antigravity directly.\r\n    if (provider === 'gemini') {\r\n      return _tryParseToken(data?.keys?.['gemini_oauth_cli'])\r\n          ?? _tryParseToken(data?.keys?.['gemini_oauth'])  // legacy\r\n    }\r\n    if (provider === 'antigravity') {\r\n      return _tryParseToken(data?.keys?.['gemini_oauth_antigravity'])\r\n    }\r\n\r\n    const oauthKey = `${provider}_oauth`\r\n    return _tryParseToken(data?.keys?.[oauthKey])\r\n  } catch {\r\n    return null\r\n  }\r\n}\r\n\r\nfunction _hasStoredOAuthCredential(provider: string): boolean {\r\n  try {\r\n    const { readFileSync, existsSync } = require('fs')\r\n    const { join } = require('path')\r\n    const { homedir } = require('os')\r\n    const keysFile = join(homedir(), '.config', 'claude-code', 'provider-keys.json')\r\n    if (!existsSync(keysFile)) return false\r\n    const data = JSON.parse(readFileSync(keysFile, 'utf-8'))\r\n\r\n    if (provider === 'gemini') {\r\n      return _hasStoredOAuthBlob(data?.keys?.['gemini_oauth_cli'])\r\n        || _hasStoredOAuthBlob(data?.keys?.['gemini_oauth'])\r\n    }\r\n    if (provider === 'antigravity') {\r\n      return _hasStoredOAuthBlob(data?.keys?.['gemini_oauth_antigravity'])\r\n    }\r\n\r\n    return _hasStoredOAuthBlob(data?.keys?.[`${provider}_oauth`])\r\n  } catch {\r\n    return false\r\n  }\r\n}\r\n\r\n/** Parse a stored token JSON string \u2014 returns accessToken if not expired, else null. */\r\nfunction _tryParseToken(stored: string | undefined): string | null {\r\n  if (!stored) return null\r\n  try {\r\n    const tokens = JSON.parse(stored)\r\n    if (tokens.expiresAt && Date.now() > tokens.expiresAt - 5 * 60 * 1000) {\r\n      return null\r\n    }\r\n    return tokens.accessToken ?? null\r\n  } catch {\r\n    return null\r\n  }\r\n}\r\n\r\nfunction _hasStoredOAuthBlob(stored: string | undefined): boolean {\r\n  if (!stored) return false\r\n  try {\r\n    const tokens = JSON.parse(stored) as {\r\n      accessToken?: unknown\r\n      refreshToken?: unknown\r\n    }\r\n    return (\r\n      (typeof tokens.accessToken === 'string' && tokens.accessToken.length > 0)\r\n      || (typeof tokens.refreshToken === 'string' && tokens.refreshToken.length > 0)\r\n    )\r\n  } catch {\r\n    return false\r\n  }\r\n}\r\n\r\n/**\r\n * Returns the base URL for a third-party LLM provider's API.\r\n */\r\nexport function getProviderBaseUrl(provider: APIProvider): string {\r\n  switch (provider) {\r\n    case 'openai':      return process.env.OPENAI_BASE_URL ?? 'https://api.openai.com/v1'\r\n    case 'openrouter':  return 'https://openrouter.ai/api/v1'\r\n    case 'agentrouter': return process.env.AGENTROUTER_BASE_URL ?? 'https://agentrouter.org/v1'\r\n    case 'modelrouter': return process.env.MODELROUTER_BASE_URL ?? process.env.MODEL_ROUTER_BASE_URL ?? process.env.LXG2IT_BASE_URL ?? 'https://api.lxg2it.com/v1'\r\n    case 'vercel':      return process.env.VERCEL_AI_GATEWAY_BASE_URL ?? process.env.AI_GATEWAY_BASE_URL ?? 'https://ai-gateway.vercel.sh/v1'\r\n    case 'requesty':    return process.env.REQUESTY_BASE_URL ?? 'https://router.requesty.ai/v1'\n    case 'opencode':    return process.env.OPENCODE_BASE_URL ?? process.env.OPENCODE_ZEN_BASE_URL ?? 'https://opencode.ai/zen/v1'\n    case 'commandcode': return normalizeCommandCodeBaseUrl(process.env.COMMANDCODE_BASE_URL ?? process.env.COMMAND_CODE_BASE_URL ?? process.env.CMD_BASE_URL ?? 'https://api.commandcode.ai/provider/v1')\n    case 'groq':        return 'https://api.groq.com/openai/v1'\n    case 'mistral':     return process.env.MISTRAL_BASE_URL ?? process.env.MISTRAL_API_BASE_URL ?? 'https://api.mistral.ai/v1'\r\n    case 'nim':         return process.env.NIM_BASE_URL ?? 'https://integrate.api.nvidia.com/v1'\r\n    case 'gemini':      return 'https://generativelanguage.googleapis.com/v1beta'\r\n    case 'antigravity': return 'https://cloudcode-pa.googleapis.com/v1internal'\r\n    case 'deepseek':    return process.env.DEEPSEEK_BASE_URL ?? 'https://api.deepseek.com/v1'\r\n    case 'glm':         return process.env.GLM_BASE_URL ?? process.env.GLM_API_URL ?? process.env.BIGMODEL_BASE_URL ?? process.env.ZHIPU_BASE_URL ?? process.env.ZAI_BASE_URL ?? process.env.Z_AI_BASE_URL ?? 'https://open.bigmodel.cn/api/paas/v4'\r\n    case 'moonshot':    return process.env.MOONSHOT_BASE_URL ?? process.env.MOONSHOT_API_BASE_URL ?? 'https://api.moonshot.ai/v1'\r\n    case 'minimax':     return process.env.MINIMAX_BASE_URL ?? process.env.MINIMAX_API_BASE_URL ?? 'https://api.minimax.io/v1'\r\n    case 'ollama':      return process.env.OLLAMA_BASE_URL ?? 'http://localhost:11434/v1'\r\n    case 'lmstudio':    return normalizeLmStudioBaseUrl(process.env.LMSTUDIO_BASE_URL ?? process.env.LM_STUDIO_BASE_URL ?? _loadStoredKey('lmstudio_base_url') ?? 'http://localhost:1234/v1')\r\n    case 'cline':       return process.env.CLINE_BASE_URL ?? 'https://api.cline.bot/v1'\r\n    case 'copilot':     return 'https://api.githubcopilot.com'\r\n    case 'cursor':      return 'https://api2.cursor.sh'\r\n    case 'iflow':       return 'https://apis.iflow.cn/v1'\r\n    case 'kilocode':    return 'https://api.kilo.ai'\r\n    case 'kiro':        return 'https://codewhisperer.us-east-1.amazonaws.com'\r\n    default:            return process.env.ANTHROPIC_BASE_URL ?? 'https://api.anthropic.com'\r\n  }\r\n}\r\n\r\n/**\r\n * Check if using any non-Anthropic third-party LLM provider.\r\n */\r\nexport function isUsingThirdPartyLLM(): boolean {\r\n  return !!(\r\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_OPENAI) ||\r\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_GEMINI) ||\r\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_OPENROUTER) ||\r\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_AGENTROUTER) ||\r\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_MODELROUTER) ||\r\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_MODEL_ROUTER) ||\r\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_LXG2IT) ||\r\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_VERCEL) ||\r\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_VERCEL_AI_GATEWAY) ||\r\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_REQUESTY) ||\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_OPENCODE) ||\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_OPENCODE_ZEN) ||\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_COMMANDCODE) ||\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_COMMAND_CODE) ||\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_GROQ) ||\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_MISTRAL) ||\r\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_NIM) ||\r\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_DEEPSEEK) ||\r\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_GLM) ||\r\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_MOONSHOT) ||\r\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_MINIMAX) ||\r\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_LMSTUDIO)\r\n  )\r\n}\r\n\r\nfunction normalizeLmStudioBaseUrl(raw: string): string {\n  const withScheme = /^https?:\\/\\//i.test(raw) ? raw : `http://${raw}`\n  const trimmed = withScheme.replace(/\\/+$/, '')\n  return /\\/v1$/i.test(trimmed) ? trimmed : `${trimmed}/v1`\n}\n\nfunction normalizeCommandCodeBaseUrl(raw: string): string {\n  const trimmed = raw.replace(/\\/+$/, '')\n  return /\\/v1$/i.test(trimmed) ? trimmed : `${trimmed}/v1`\n}\n\r\n/**\r\n * Validates that the current provider has valid credentials configured.\r\n * Accepts either API key or OAuth token (for providers that support OAuth).\r\n * Returns { valid: true, method } or { valid: false, reason }.\r\n */\r\nexport function validateProviderAuth(provider: APIProvider): { valid: boolean; method?: ProviderAuthMethod; reason?: string } {\n  const authMethod = getProviderAuthMethod(provider)\n\n  if (provider === 'opencode' && getProviderRuntimeApiKey(provider)) {\n    return { valid: true, method: 'api_key' }\n  }\n\n  if (authMethod === 'api_key') {\n    const key = getProviderApiKey(provider)!\n    const formatCheck = _validateKeyFormat(provider, key)\r\n    if (!formatCheck.valid) return formatCheck\r\n    return { valid: true, method: 'api_key' }\r\n  }\r\n\r\n  if (authMethod === 'oauth') {\r\n    return { valid: true, method: 'oauth' }\r\n  }\r\n\r\n  // No auth found \u2014 build helpful error message\r\n  if (provider === 'ollama' || provider === 'lmstudio') {\r\n    return { valid: true, method: 'none' }\r\n  }\r\n\r\n  const envVar = _getApiKeyEnvName(provider)\r\n  const supported = PROVIDER_AUTH_SUPPORT[provider] ?? ['api_key']\r\n  const methods = supported.join(' or ')\r\n  const oauthHint = supported.includes('oauth')\r\n    ? ` Or authenticate with OAuth: run \\`/login\\` and choose ${provider}.`\r\n    : ''\r\n\r\n  return {\r\n    valid: false,\r\n    reason: `No credentials found for ${provider}. Set ${envVar} (${methods}).${oauthHint}`,\r\n  }\r\n}\r\n\r\nfunction _getApiKeyEnvName(provider: APIProvider): string {\r\n  switch (provider) {\r\n    case 'openai':      return 'OPENAI_API_KEY'\r\n    case 'openrouter':  return 'OPENROUTER_API_KEY'\r\n    case 'agentrouter': return 'AGENT_ROUTER_TOKEN or AGENTROUTER_API_KEY'\r\n    case 'modelrouter': return 'MODEL_ROUTER_API_KEY or LXG2IT_API_KEY'\r\n    case 'vercel':      return 'AI_GATEWAY_API_KEY or VERCEL_AI_GATEWAY_API_KEY'\r\n    case 'requesty':    return 'REQUESTY_API_KEY'\n    case 'commandcode': return 'CMD_API_KEY'\n    case 'groq':        return 'GROQ_API_KEY'\n    case 'mistral':     return 'MISTRAL_API_KEY'\r\n    case 'nim':         return 'NIM_API_KEY'\r\n    case 'gemini':      return 'GEMINI_API_KEY'\r\n    case 'antigravity': return '(OAuth only \u2014 no API key)'\r\n    case 'deepseek':    return 'DEEPSEEK_API_KEY'\r\n    case 'glm':         return 'GLM_API_KEY'\r\n    case 'moonshot':    return 'MOONSHOT_API_KEY'\r\n    case 'minimax':     return 'MINIMAX_API_KEY'\r\n    case 'ollama':      return 'OLLAMA_API_KEY'\r\n    case 'lmstudio':    return 'LMSTUDIO_API_KEY'\r\n    case 'cline':       return '(OAuth only \u2014 no API key)'\r\n    case 'copilot':     return '(OAuth only \u2014 no API key)'\r\n    case 'cursor':      return '(OAuth only \u2014 no API key)'\r\n    case 'iflow':       return '(OAuth only \u2014 no API key)'\r\n    case 'kilocode':    return '(OAuth only \u2014 no API key)'\r\n    case 'kiro':        return '(OAuth only \u2014 no API key)'\r\n    default:            return 'ANTHROPIC_API_KEY'\r\n  }\r\n}\r\n\r\nfunction _validateKeyFormat(provider: APIProvider, key: string): { valid: boolean; reason?: string } {\r\n  // Light sanity checks \u2014 don't reject valid keys, just catch obvious misconfigs\r\n  const checks: Record<string, { prefix?: string; minLen: number }> = {\r\n    openai:      { prefix: 'sk-', minLen: 20 },\r\n    openrouter:  { prefix: 'sk-or-', minLen: 20 },\r\n    agentrouter: { minLen: 16 },\r\n    modelrouter: { minLen: 10 },\r\n    vercel:      { minLen: 10 },\n    requesty:    { minLen: 10 },\n    commandcode: { minLen: 10 },\n    groq:        { prefix: 'gsk_', minLen: 20 },\n    mistral:     { minLen: 20 },\r\n    nim:         { prefix: 'nvapi-', minLen: 20 },\r\n    gemini:      { minLen: 10 },\r\n    deepseek:    { prefix: 'sk-', minLen: 20 },\r\n    glm:         { minLen: 10 },\r\n    moonshot:    { prefix: 'sk-', minLen: 20 },\r\n    minimax:     { minLen: 10 },\r\n  }\r\n  const check = checks[provider]\r\n  if (!check) return { valid: true }\r\n  if (key.length < check.minLen) {\r\n    return { valid: false, reason: `${provider} API key appears too short (${key.length} chars).` }\r\n  }\r\n  // Prefix check is advisory only \u2014 some providers issue keys without standard prefixes\r\n  return { valid: true }\r\n}\r\n\r\n/** Load a stored key from ~/.config/claude-code/provider-keys.json */\r\nfunction _loadStoredKey(provider: string): string | null {\r\n  try {\r\n    // Dynamic import to avoid circular deps \u2014 api_key_manager is a leaf module\r\n    const { readFileSync, existsSync } = require('fs')\r\n    const { join } = require('path')\r\n    const { homedir } = require('os')\r\n    const keysFile = join(homedir(), '.config', 'claude-code', 'provider-keys.json')\r\n    if (!existsSync(keysFile)) return null\r\n    const data = JSON.parse(readFileSync(keysFile, 'utf-8'))\r\n    return data?.keys?.[provider] ?? null\r\n  } catch {\n    return null\n  }\n}\n\n/** Load a Command Code account key from ~/.commandcode/auth.json, if present. */\nfunction loadCommandCodeApiKeyFromAuthFile(): string | null {\n  try {\n    const { readFileSync, existsSync } = require('fs')\n    const { join } = require('path')\n    const { homedir } = require('os')\n    const authFile = join(homedir(), '.commandcode', 'auth.json')\n    if (!existsSync(authFile)) return null\n    const data = JSON.parse(readFileSync(authFile, 'utf-8'))\n    const key = data?.apiKey\n    return typeof key === 'string' && key.trim() ? key.trim() : null\n  } catch {\n    return null\n  }\n}\n\n/**\n * Get the configured otelHeadersHelper from settings\n */\nfunction getConfiguredOtelHeadersHelper(): string | undefined {\n  const mergedSettings = getSettings_DEPRECATED() || {}\r\n  return mergedSettings.otelHeadersHelper\r\n}\r\n\r\n/**\r\n * Check if the configured otelHeadersHelper comes from project settings (projectSettings or localSettings)\r\n */\r\nexport function isOtelHeadersHelperFromProjectOrLocalSettings(): boolean {\r\n  const otelHeadersHelper = getConfiguredOtelHeadersHelper()\r\n  if (!otelHeadersHelper) {\r\n    return false\r\n  }\r\n\r\n  const projectSettings = getSettingsForSource('projectSettings')\r\n  const localSettings = getSettingsForSource('localSettings')\r\n  return (\r\n    projectSettings?.otelHeadersHelper === otelHeadersHelper ||\r\n    localSettings?.otelHeadersHelper === otelHeadersHelper\r\n  )\r\n}\r\n\r\n// Cache for debouncing otelHeadersHelper calls\r\nlet cachedOtelHeaders: Record<string, string> | null = null\r\nlet cachedOtelHeadersTimestamp = 0\r\nconst DEFAULT_OTEL_HEADERS_DEBOUNCE_MS = 29 * 60 * 1000 // 29 minutes\r\n\r\nexport function getOtelHeadersFromHelper(): Record<string, string> {\r\n  const otelHeadersHelper = getConfiguredOtelHeadersHelper()\r\n\r\n  if (!otelHeadersHelper) {\r\n    return {}\r\n  }\r\n\r\n  // Return cached headers if still valid (debounce)\r\n  const debounceMs = parseInt(\r\n    process.env.CLAUDE_CODE_OTEL_HEADERS_HELPER_DEBOUNCE_MS ||\r\n      DEFAULT_OTEL_HEADERS_DEBOUNCE_MS.toString(),\r\n  )\r\n  if (\r\n    cachedOtelHeaders &&\r\n    Date.now() - cachedOtelHeadersTimestamp < debounceMs\r\n  ) {\r\n    return cachedOtelHeaders\r\n  }\r\n\r\n  if (isOtelHeadersHelperFromProjectOrLocalSettings()) {\r\n    // Check if trust has been established for this project\r\n    const hasTrust = checkHasTrustDialogAccepted()\r\n    if (!hasTrust) {\r\n      return {}\r\n    }\r\n  }\r\n\r\n  try {\r\n    const result = execSyncWithDefaults_DEPRECATED(otelHeadersHelper, {\r\n      timeout: 30000, // 30 seconds - allows for auth service latency\r\n    })\r\n      ?.toString()\r\n      .trim()\r\n    if (!result) {\r\n      throw new Error('otelHeadersHelper did not return a valid value')\r\n    }\r\n\r\n    const headers = jsonParse(result)\r\n    if (\r\n      typeof headers !== 'object' ||\r\n      headers === null ||\r\n      Array.isArray(headers)\r\n    ) {\r\n      throw new Error(\r\n        'otelHeadersHelper must return a JSON object with string key-value pairs',\r\n      )\r\n    }\r\n\r\n    // Validate all values are strings\r\n    for (const [key, value] of Object.entries(headers)) {\r\n      if (typeof value !== 'string') {\r\n        throw new Error(\r\n          `otelHeadersHelper returned non-string value for key \"${key}\": ${typeof value}`,\r\n        )\r\n      }\r\n    }\r\n\r\n    // Cache the result\r\n    cachedOtelHeaders = headers as Record<string, string>\r\n    cachedOtelHeadersTimestamp = Date.now()\r\n\r\n    return cachedOtelHeaders\r\n  } catch (error) {\r\n    logError(\r\n      new Error(\r\n        `Error getting OpenTelemetry headers from otelHeadersHelper (in settings): ${errorMessage(error)}`,\r\n      ),\r\n    )\r\n    throw error\r\n  }\r\n}\r\n\r\nfunction isConsumerPlan(plan: SubscriptionType): plan is 'max' | 'pro' {\r\n  return plan === 'max' || plan === 'pro'\r\n}\r\n\r\nexport function isConsumerSubscriber(): boolean {\r\n  const subscriptionType = getSubscriptionType()\r\n  return (\r\n    isClaudeAISubscriber() &&\r\n    subscriptionType !== null &&\r\n    isConsumerPlan(subscriptionType)\r\n  )\r\n}\r\n\r\nexport type UserAccountInfo = {\r\n  subscription?: string\r\n  tokenSource?: string\r\n  apiKeySource?: ApiKeySource\r\n  organization?: string\r\n  email?: string\r\n}\r\n\r\nexport function getAccountInformation() {\r\n  const apiProvider = getAPIProvider()\r\n  // Only provide account info for first-party Anthropic API\r\n  if (apiProvider !== 'firstParty') {\r\n    return undefined\r\n  }\r\n  const { source: authTokenSource } = getAuthTokenSource()\r\n  const accountInfo: UserAccountInfo = {}\r\n  if (\r\n    authTokenSource === 'CLAUDE_CODE_OAUTH_TOKEN' ||\r\n    authTokenSource === 'CLAUDE_CODE_OAUTH_TOKEN_FILE_DESCRIPTOR'\r\n  ) {\r\n    accountInfo.tokenSource = authTokenSource\r\n  } else if (isClaudeAISubscriber()) {\r\n    accountInfo.subscription = getSubscriptionName()\r\n  } else {\r\n    accountInfo.tokenSource = authTokenSource\r\n  }\r\n  const { key: apiKey, source: apiKeySource } = getAnthropicApiKeyWithSource()\r\n  if (apiKey) {\r\n    accountInfo.apiKeySource = apiKeySource\r\n  }\r\n\r\n  // We don't know the organization if we're relying on an external API key or auth token\r\n  if (\r\n    authTokenSource === 'claude.ai' ||\r\n    apiKeySource === '/login managed key'\r\n  ) {\r\n    // Get organization name from OAuth account info\r\n    const orgName = getOauthAccountInfo()?.organizationName\r\n    if (orgName) {\r\n      accountInfo.organization = orgName\r\n    }\r\n  }\r\n  const email = getOauthAccountInfo()?.emailAddress\r\n  if (\r\n    (authTokenSource === 'claude.ai' ||\r\n      apiKeySource === '/login managed key') &&\r\n    email\r\n  ) {\r\n    accountInfo.email = email\r\n  }\r\n  return accountInfo\r\n}\r\n\r\n/**\r\n * Result of org validation \u2014 either success or a descriptive error.\r\n */\r\nexport type OrgValidationResult =\r\n  | { valid: true }\r\n  | { valid: false; message: string }\r\n\r\n/**\r\n * Validate that the active OAuth token belongs to the organization required\r\n * by `forceLoginOrgUUID` in managed settings. Returns a result object\r\n * rather than throwing so callers can choose how to surface the error.\r\n *\r\n * Fails closed: if `forceLoginOrgUUID` is set and we cannot determine the\r\n * token's org (network error, missing profile data), validation fails.\r\n */\r\nexport async function validateForceLoginOrg(): Promise<OrgValidationResult> {\r\n  // `claude ssh` remote: real auth lives on the local machine and is injected\r\n  // by the proxy. The placeholder token can't be validated against the profile\r\n  // endpoint. The local side already ran this check before establishing the session.\r\n  if (process.env.ANTHROPIC_UNIX_SOCKET) {\r\n    return { valid: true }\r\n  }\r\n\r\n  if (!isAnthropicAuthEnabled()) {\r\n    return { valid: true }\r\n  }\r\n\r\n  const requiredOrgUuid =\r\n    getSettingsForSource('policySettings')?.forceLoginOrgUUID\r\n  if (!requiredOrgUuid) {\r\n    return { valid: true }\r\n  }\r\n\r\n  // Ensure the access token is fresh before hitting the profile endpoint.\r\n  // No-op for env-var tokens (refreshToken is null).\r\n  await checkAndRefreshOAuthTokenIfNeeded()\r\n\r\n  const tokens = getClaudeAIOAuthTokens()\r\n  if (!tokens) {\r\n    return { valid: true }\r\n  }\r\n\r\n  // Always fetch the authoritative org UUID from the profile endpoint.\r\n  // Even keychain-sourced tokens verify server-side: the cached org UUID\r\n  // in ~/.claude.json is user-writable and cannot be trusted.\r\n  const { source } = getAuthTokenSource()\r\n  const isEnvVarToken =\r\n    source === 'CLAUDE_CODE_OAUTH_TOKEN' ||\r\n    source === 'CLAUDE_CODE_OAUTH_TOKEN_FILE_DESCRIPTOR'\r\n\r\n  const profile = await getOauthProfileFromOauthToken(tokens.accessToken)\r\n  if (!profile) {\r\n    // Fail closed \u2014 we can't verify the org\r\n    return {\r\n      valid: false,\r\n      message:\r\n        `Unable to verify organization for the current authentication token.\\n` +\r\n        `This machine requires organization ${requiredOrgUuid} but the profile could not be fetched.\\n` +\r\n        `This may be a network error, or the token may lack the user:profile scope required for\\n` +\r\n        `verification (tokens from 'claude setup-token' do not include this scope).\\n` +\r\n        `Try again, or obtain a full-scope token via 'claude auth login'.`,\r\n    }\r\n  }\r\n\r\n  const tokenOrgUuid = profile.organization.uuid\r\n  if (tokenOrgUuid === requiredOrgUuid) {\r\n    return { valid: true }\r\n  }\r\n\r\n  if (isEnvVarToken) {\r\n    const envVarName =\r\n      source === 'CLAUDE_CODE_OAUTH_TOKEN'\r\n        ? 'CLAUDE_CODE_OAUTH_TOKEN'\r\n        : 'CLAUDE_CODE_OAUTH_TOKEN_FILE_DESCRIPTOR'\r\n    return {\r\n      valid: false,\r\n      message:\r\n        `The ${envVarName} environment variable provides a token for a\\n` +\r\n        `different organization than required by this machine's managed settings.\\n\\n` +\r\n        `Required organization: ${requiredOrgUuid}\\n` +\r\n        `Token organization:   ${tokenOrgUuid}\\n\\n` +\r\n        `Remove the environment variable or obtain a token for the correct organization.`,\r\n    }\r\n  }\r\n\r\n  return {\r\n    valid: false,\r\n    message:\r\n      `Your authentication token belongs to organization ${tokenOrgUuid},\\n` +\r\n      `but this machine requires organization ${requiredOrgUuid}.\\n\\n` +\r\n      `Please log in with the correct organization: claude auth login`,\r\n  }\r\n}\r\n\r\nclass GcpCredentialsTimeoutError extends Error {}\r\n", "/**\n * User-Agent string helpers.\n *\n * Kept dependency-free so SDK-bundled code (bridge, cli/transports) can\n * import without pulling in auth.ts and its transitive dependency tree.\n */\n\nexport function getClaudeCodeUserAgent(): string {\n  return `claude-code/${MACRO.VERSION}`\n}\n", "/**\n * Turn-scoped workload tag via AsyncLocalStorage.\n *\n * WHY a separate module from bootstrap/state.ts:\n * bootstrap is transitively imported by src/entrypoints/browser-sdk.ts, and\n * the browser bundle cannot import Node's async_hooks. This module is only\n * imported from CLI/SDK code paths that never end up in the browser build.\n *\n * WHY AsyncLocalStorage (not a global mutable slot):\n * void-detached background agents (executeForkedSlashCommand, AgentTool)\n * yield at their first await. The parent turn's synchronous continuation \u2014\n * including any `finally` block \u2014 runs to completion BEFORE the detached\n * closure resumes. A global setWorkload('cron') at the top of the closure\n * is deterministically clobbered. ALS captures context at invocation time\n * and survives every await in that chain, isolated from the parent. Same\n * pattern as agentContext.ts.\n */\n\nimport { AsyncLocalStorage } from 'async_hooks'\n\n/**\n * Server-side sanitizer (_sanitize_entrypoint in claude_code.py) accepts\n * only lowercase [a-z0-9_-]{0,32}. Uppercase stops parsing at char 0.\n */\nexport type Workload = 'cron'\nexport const WORKLOAD_CRON: Workload = 'cron'\n\nconst workloadStorage = new AsyncLocalStorage<{\n  workload: string | undefined\n}>()\n\nexport function getWorkload(): string | undefined {\n  return workloadStorage.getStore()?.workload\n}\n\n/**\n * Wrap `fn` in a workload ALS context. ALWAYS establishes a new context\n * boundary, even when `workload` is undefined.\n *\n * The previous implementation short-circuited on `undefined` with\n * `return fn()` \u2014 but that's a pass-through, not a boundary. If the caller\n * is already inside a leaked cron context (REPL: queryGuard.end() \u2192\n * _notify() \u2192 React subscriber \u2192 scheduled re-render captures ALS at\n * scheduling time \u2192 useQueueProcessor effect \u2192 executeQueuedInput \u2192 here),\n * a pass-through lets `getWorkload()` inside `fn` return the leaked tag.\n * Once leaked, it's sticky forever: every turn's end-notify re-propagates\n * the ambient context to the next turn's scheduling chain.\n *\n * Always calling `.run()` guarantees `getWorkload()` inside `fn` returns\n * exactly what the caller passed \u2014 including `undefined`.\n */\nexport function runWithWorkload<T>(\n  workload: string | undefined,\n  fn: () => T,\n): T {\n  return workloadStorage.run({ workload }, fn)\n}\n", "/**\n * HTTP utility constants and helpers\n */\n\nimport axios from 'axios'\nimport { OAUTH_BETA_HEADER } from '../constants/oauth.js'\nimport {\n  getAnthropicApiKey,\n  getClaudeAIOAuthTokens,\n  handleOAuth401Error,\n  isClaudeAISubscriber,\n} from './auth.js'\nimport { getClaudeCodeUserAgent } from './userAgent.js'\nimport { getWorkload } from './workloadContext.js'\n\n// WARNING: We rely on `claude-cli` in the user agent for log filtering.\n// Please do NOT change this without making sure that logging also gets updated!\nexport function getUserAgent(): string {\n  const agentSdkVersion = process.env.CLAUDE_AGENT_SDK_VERSION\n    ? `, agent-sdk/${process.env.CLAUDE_AGENT_SDK_VERSION}`\n    : ''\n  // SDK consumers can identify their app/library via CLAUDE_AGENT_SDK_CLIENT_APP\n  // e.g., \"my-app/1.0.0\" or \"my-library/2.1\"\n  const clientApp = process.env.CLAUDE_AGENT_SDK_CLIENT_APP\n    ? `, client-app/${process.env.CLAUDE_AGENT_SDK_CLIENT_APP}`\n    : ''\n  // Turn-/process-scoped workload tag for cron-initiated requests. 1P-only\n  // observability \u2014 proxies strip HTTP headers; QoS routing uses cc_workload\n  // in the billing-header attribution block instead (see constants/system.ts).\n  // getAnthropicClient (client.ts:98) calls this per-request inside withRetry,\n  // so the read picks up the same setWorkload() value as getAttributionHeader.\n  const workload = getWorkload()\n  const workloadSuffix = workload ? `, workload/${workload}` : ''\n  return `claude-cli/${MACRO.VERSION} (${process.env.USER_TYPE}, ${process.env.CLAUDE_CODE_ENTRYPOINT ?? 'cli'}${agentSdkVersion}${clientApp}${workloadSuffix})`\n}\n\nexport function getMCPUserAgent(): string {\n  const parts: string[] = []\n  if (process.env.CLAUDE_CODE_ENTRYPOINT) {\n    parts.push(process.env.CLAUDE_CODE_ENTRYPOINT)\n  }\n  if (process.env.CLAUDE_AGENT_SDK_VERSION) {\n    parts.push(`agent-sdk/${process.env.CLAUDE_AGENT_SDK_VERSION}`)\n  }\n  if (process.env.CLAUDE_AGENT_SDK_CLIENT_APP) {\n    parts.push(`client-app/${process.env.CLAUDE_AGENT_SDK_CLIENT_APP}`)\n  }\n  const suffix = parts.length > 0 ? ` (${parts.join(', ')})` : ''\n  return `claude-code/${MACRO.VERSION}${suffix}`\n}\n\n// User-Agent for WebFetch requests to arbitrary sites. `Claude-User` is\n// Anthropic's publicly documented agent for user-initiated fetches (what site\n// operators match in robots.txt); the claude-code suffix lets them distinguish\n// local CLI traffic from claude.ai server-side fetches.\nexport function getWebFetchUserAgent(): string {\n  return `Claude-User (${getClaudeCodeUserAgent()}; +https://support.anthropic.com/)`\n}\n\nexport type AuthHeaders = {\n  headers: Record<string, string>\n  error?: string\n}\n\n/**\n * Get authentication headers for API requests\n * Returns either OAuth headers for Max/Pro users or API key headers for regular users\n */\nexport function getAuthHeaders(): AuthHeaders {\n  if (isClaudeAISubscriber()) {\n    const oauthTokens = getClaudeAIOAuthTokens()\n    if (!oauthTokens?.accessToken) {\n      return {\n        headers: {},\n        error: 'No OAuth token available',\n      }\n    }\n    return {\n      headers: {\n        Authorization: `Bearer ${oauthTokens.accessToken}`,\n        'anthropic-beta': OAUTH_BETA_HEADER,\n      },\n    }\n  }\n  // TODO: this will fail if the API key is being set to an LLM Gateway key\n  // should we try to query keychain / credentials for a valid Anthropic key?\n  const apiKey = getAnthropicApiKey()\n  if (!apiKey) {\n    return {\n      headers: {},\n      error: 'No API key available',\n    }\n  }\n  return {\n    headers: {\n      'x-api-key': apiKey,\n    },\n  }\n}\n\n/**\n * Wrapper that handles OAuth 401 errors by force-refreshing the token and\n * retrying once. Addresses clock drift scenarios where the local expiration\n * check disagrees with the server.\n *\n * The request closure is called again on retry, so it should re-read auth\n * (e.g., via getAuthHeaders()) to pick up the refreshed token.\n *\n * Note: bridgeApi.ts has its own DI-injected version \u2014 handleOAuth401Error\n * transitively pulls in config.ts (~1300 modules), which breaks the SDK bundle.\n *\n * @param opts.also403Revoked - Also retry on 403 with \"OAuth token has been\n *   revoked\" body (some endpoints signal revocation this way instead of 401).\n */\nexport async function withOAuth401Retry<T>(\n  request: () => Promise<T>,\n  opts?: { also403Revoked?: boolean },\n): Promise<T> {\n  try {\n    return await request()\n  } catch (err) {\n    if (!axios.isAxiosError(err)) throw err\n    const status = err.response?.status\n    const isAuthError =\n      status === 401 ||\n      (opts?.also403Revoked &&\n        status === 403 &&\n        typeof err.response?.data === 'string' &&\n        err.response.data.includes('OAuth token has been revoked'))\n    if (!isAuthError) throw err\n    const failedAccessToken = getClaudeAIOAuthTokens()?.accessToken\n    if (!failedAccessToken) throw err\n    await handleOAuth401Error(failedAccessToken)\n    return await request()\n  }\n}\n", "import { execa } from 'execa'\nimport memoize from 'lodash-es/memoize.js'\nimport { getSessionId } from '../bootstrap/state.js'\nimport {\n  getOauthAccountInfo,\n  getRateLimitTier,\n  getSubscriptionType,\n} from './auth.js'\nimport { getGlobalConfig, getOrCreateUserID } from './config.js'\nimport { getCwd } from './cwd.js'\nimport { type env, getHostPlatformForAnalytics } from './env.js'\nimport { isEnvTruthy } from './envUtils.js'\n\n// Cache for email fetched asynchronously at startup\nlet cachedEmail: string | undefined | null = null // null means not fetched yet\nlet emailFetchPromise: Promise<string | undefined> | null = null\n\n/**\n * GitHub Actions metadata when running in CI\n */\nexport type GitHubActionsMetadata = {\n  actor?: string\n  actorId?: string\n  repository?: string\n  repositoryId?: string\n  repositoryOwner?: string\n  repositoryOwnerId?: string\n}\n\n/**\n * Core user data used as base for all analytics providers.\n * This is also the format used by GrowthBook.\n */\nexport type CoreUserData = {\n  deviceId: string\n  sessionId: string\n  email?: string\n  appVersion: string\n  platform: typeof env.platform\n  organizationUuid?: string\n  accountUuid?: string\n  userType?: string\n  subscriptionType?: string\n  rateLimitTier?: string\n  firstTokenTime?: number\n  githubActionsMetadata?: GitHubActionsMetadata\n}\n\n/**\n * Initialize user data asynchronously. Should be called early in startup.\n * This pre-fetches the email so getUser() can remain synchronous.\n */\nexport async function initUser(): Promise<void> {\n  if (cachedEmail === null && !emailFetchPromise) {\n    emailFetchPromise = getEmailAsync()\n    cachedEmail = await emailFetchPromise\n    emailFetchPromise = null\n    // Clear memoization cache so next call picks up the email\n    getCoreUserData.cache.clear?.()\n  }\n}\n\n/**\n * Reset all user data caches. Call on auth changes (login/logout/account switch)\n * so the next getCoreUserData() call picks up fresh credentials and email.\n */\nexport function resetUserCache(): void {\n  cachedEmail = null\n  emailFetchPromise = null\n  getCoreUserData.cache.clear?.()\n  getGitEmail.cache.clear?.()\n}\n\n/**\n * Get core user data.\n * This is the base representation that gets transformed for different analytics providers.\n */\nexport const getCoreUserData = memoize(\n  (includeAnalyticsMetadata?: boolean): CoreUserData => {\n    const deviceId = getOrCreateUserID()\n    const config = getGlobalConfig()\n\n    let subscriptionType: string | undefined\n    let rateLimitTier: string | undefined\n    let firstTokenTime: number | undefined\n    if (includeAnalyticsMetadata) {\n      subscriptionType = getSubscriptionType() ?? undefined\n      rateLimitTier = getRateLimitTier() ?? undefined\n      if (subscriptionType && config.claudeCodeFirstTokenDate) {\n        const configFirstTokenTime = new Date(\n          config.claudeCodeFirstTokenDate,\n        ).getTime()\n        if (!isNaN(configFirstTokenTime)) {\n          firstTokenTime = configFirstTokenTime\n        }\n      }\n    }\n\n    // Only include OAuth account data when actively using OAuth authentication\n    const oauthAccount = getOauthAccountInfo()\n    const organizationUuid = oauthAccount?.organizationUuid\n    const accountUuid = oauthAccount?.accountUuid\n\n    return {\n      deviceId,\n      sessionId: getSessionId(),\n      email: getEmail(),\n      appVersion: MACRO.VERSION,\n      platform: getHostPlatformForAnalytics(),\n      organizationUuid,\n      accountUuid,\n      userType: process.env.USER_TYPE,\n      subscriptionType,\n      rateLimitTier,\n      firstTokenTime,\n      ...(isEnvTruthy(process.env.GITHUB_ACTIONS) && {\n        githubActionsMetadata: {\n          actor: process.env.GITHUB_ACTOR,\n          actorId: process.env.GITHUB_ACTOR_ID,\n          repository: process.env.GITHUB_REPOSITORY,\n          repositoryId: process.env.GITHUB_REPOSITORY_ID,\n          repositoryOwner: process.env.GITHUB_REPOSITORY_OWNER,\n          repositoryOwnerId: process.env.GITHUB_REPOSITORY_OWNER_ID,\n        },\n      }),\n    }\n  },\n)\n\n/**\n * Get user data for GrowthBook (same as core data with analytics metadata).\n */\nexport function getUserForGrowthBook(): CoreUserData {\n  return getCoreUserData(true)\n}\n\nfunction getEmail(): string | undefined {\n  // Return cached email if available (from async initialization)\n  if (cachedEmail !== null) {\n    return cachedEmail\n  }\n\n  // Only include OAuth email when actively using OAuth authentication\n  const oauthAccount = getOauthAccountInfo()\n  if (oauthAccount?.emailAddress) {\n    return oauthAccount.emailAddress\n  }\n\n  // Ant-only fallbacks below (no execSync)\n  if (process.env.USER_TYPE !== 'ant') {\n    return undefined\n  }\n\n  if (process.env.COO_CREATOR) {\n    return `${process.env.COO_CREATOR}@anthropic.com`\n  }\n\n  // If initUser() wasn't called, we return undefined instead of blocking\n  return undefined\n}\n\nasync function getEmailAsync(): Promise<string | undefined> {\n  // Only include OAuth email when actively using OAuth authentication\n  const oauthAccount = getOauthAccountInfo()\n  if (oauthAccount?.emailAddress) {\n    return oauthAccount.emailAddress\n  }\n\n  // Ant-only fallbacks below\n  if (process.env.USER_TYPE !== 'ant') {\n    return undefined\n  }\n\n  if (process.env.COO_CREATOR) {\n    return `${process.env.COO_CREATOR}@anthropic.com`\n  }\n\n  return getGitEmail()\n}\n\n/**\n * Get the user's git email from `git config user.email`.\n * Memoized so the subprocess only spawns once per process.\n */\nexport const getGitEmail = memoize(async (): Promise<string | undefined> => {\n  const result = await execa('git config --get user.email', {\n    shell: true,\n    reject: false,\n    cwd: getCwd(),\n  })\n  return result.exitCode === 0 && result.stdout\n    ? result.stdout.trim()\n    : undefined\n})\n", "/**\n * Shared analytics configuration\n *\n * Common logic for determining when analytics should be disabled\n * across all analytics systems (Datadog, 1P)\n */\n\nimport { isEnvTruthy } from '../../utils/envUtils.js'\nimport { isTelemetryDisabled } from '../../utils/privacyLevel.js'\n\n/**\n * Check if analytics operations should be disabled\n *\n * Analytics is disabled in the following cases:\n * - Test environment (NODE_ENV === 'test')\n * - Third-party cloud providers (Bedrock/Vertex)\n * - Privacy level is no-telemetry or essential-traffic\n */\nexport function isAnalyticsDisabled(): boolean {\n  return (\n    process.env.NODE_ENV === 'test' ||\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_BEDROCK) ||\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_VERTEX) ||\n    isEnvTruthy(process.env.CLAUDE_CODE_USE_FOUNDRY) ||\n    isTelemetryDisabled()\n  )\n}\n\n/**\n * Check if the feedback survey should be suppressed.\n *\n * Unlike isAnalyticsDisabled(), this does NOT block on 3P providers\n * (Bedrock/Vertex/Foundry). The survey is a local UI prompt with no\n * transcript data \u2014 enterprise customers capture responses via OTEL.\n */\nexport function isFeedbackSurveyDisabled(): boolean {\n  return process.env.NODE_ENV === 'test' || isTelemetryDisabled()\n}\n", "// Code generated by protoc-gen-ts_proto. DO NOT EDIT.\n// versions:\n//   protoc-gen-ts_proto  v2.6.1\n//   protoc               unknown\n// source: google/protobuf/timestamp.proto\n\n/* eslint-disable */\n\n/**\n * A Timestamp represents a point in time independent of any time zone or local\n * calendar, encoded as a count of seconds and fractions of seconds at\n * nanosecond resolution. The count is relative to an epoch at UTC midnight on\n * January 1, 1970, in the proleptic Gregorian calendar which extends the\n * Gregorian calendar backwards to year one.\n *\n * All minutes are 60 seconds long. Leap seconds are \"smeared\" so that no leap\n * second table is needed for interpretation, using a [24-hour linear\n * smear](https://developers.google.com/time/smear).\n *\n * The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By\n * restricting to that range, we ensure that we can convert to and from [RFC\n * 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.\n *\n * # Examples\n *\n * Example 1: Compute Timestamp from POSIX `time()`.\n *\n *     Timestamp timestamp;\n *     timestamp.set_seconds(time(NULL));\n *     timestamp.set_nanos(0);\n *\n * Example 2: Compute Timestamp from POSIX `gettimeofday()`.\n *\n *     struct timeval tv;\n *     gettimeofday(&tv, NULL);\n *\n *     Timestamp timestamp;\n *     timestamp.set_seconds(tv.tv_sec);\n *     timestamp.set_nanos(tv.tv_usec * 1000);\n *\n * Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.\n *\n *     FILETIME ft;\n *     GetSystemTimeAsFileTime(&ft);\n *     UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;\n *\n *     // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z\n *     // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.\n *     Timestamp timestamp;\n *     timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));\n *     timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));\n *\n * Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.\n *\n *     long millis = System.currentTimeMillis();\n *\n *     Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)\n *         .setNanos((int) ((millis % 1000) * 1000000)).build();\n *\n * Example 5: Compute Timestamp from Java `Instant.now()`.\n *\n *     Instant now = Instant.now();\n *\n *     Timestamp timestamp =\n *         Timestamp.newBuilder().setSeconds(now.getEpochSecond())\n *             .setNanos(now.getNano()).build();\n *\n * Example 6: Compute Timestamp from current time in Python.\n *\n *     timestamp = Timestamp()\n *     timestamp.GetCurrentTime()\n *\n * # JSON Mapping\n *\n * In JSON format, the Timestamp type is encoded as a string in the\n * [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the\n * format is \"{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z\"\n * where {year} is always expressed using four digits while {month}, {day},\n * {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional\n * seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution),\n * are optional. The \"Z\" suffix indicates the timezone (\"UTC\"); the timezone\n * is required. A proto3 JSON serializer should always use UTC (as indicated by\n * \"Z\") when printing the Timestamp type and a proto3 JSON parser should be\n * able to accept both UTC and other timezones (as indicated by an offset).\n *\n * For example, \"2017-01-15T01:30:15.01Z\" encodes 15.01 seconds past\n * 01:30 UTC on January 15, 2017.\n *\n * In JavaScript, one can convert a Date object to this format using the\n * standard\n * [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)\n * method. In Python, a standard `datetime.datetime` object can be converted\n * to this format using\n * [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with\n * the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use\n * the Joda Time's [`ISODateTimeFormat.dateTime()`](\n * http://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime()\n * ) to obtain a formatter capable of generating timestamps in this format.\n */\nexport interface Timestamp {\n  /**\n   * Represents seconds of UTC time since Unix epoch\n   * 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to\n   * 9999-12-31T23:59:59Z inclusive.\n   */\n  seconds?: number | undefined\n  /**\n   * Non-negative fractions of a second at nanosecond resolution. Negative\n   * second values with fractions must still have non-negative nanos values\n   * that count forward in time. Must be from 0 to 999,999,999\n   * inclusive.\n   */\n  nanos?: number | undefined\n}\n\nfunction createBaseTimestamp(): Timestamp {\n  return { seconds: 0, nanos: 0 }\n}\n\nexport const Timestamp: MessageFns<Timestamp> = {\n  fromJSON(object: any): Timestamp {\n    return {\n      seconds: isSet(object.seconds) ? globalThis.Number(object.seconds) : 0,\n      nanos: isSet(object.nanos) ? globalThis.Number(object.nanos) : 0,\n    }\n  },\n\n  toJSON(message: Timestamp): unknown {\n    const obj: any = {}\n    if (message.seconds !== undefined) {\n      obj.seconds = Math.round(message.seconds)\n    }\n    if (message.nanos !== undefined) {\n      obj.nanos = Math.round(message.nanos)\n    }\n    return obj\n  },\n\n  create<I extends Exact<DeepPartial<Timestamp>, I>>(base?: I): Timestamp {\n    return Timestamp.fromPartial(base ?? ({} as any))\n  },\n  fromPartial<I extends Exact<DeepPartial<Timestamp>, I>>(\n    object: I,\n  ): Timestamp {\n    const message = createBaseTimestamp()\n    message.seconds = object.seconds ?? 0\n    message.nanos = object.nanos ?? 0\n    return message\n  },\n}\n\ntype Builtin =\n  | Date\n  | Function\n  | Uint8Array\n  | string\n  | number\n  | boolean\n  | undefined\n\ntype DeepPartial<T> = T extends Builtin\n  ? T\n  : T extends globalThis.Array<infer U>\n    ? globalThis.Array<DeepPartial<U>>\n    : T extends ReadonlyArray<infer U>\n      ? ReadonlyArray<DeepPartial<U>>\n      : T extends {}\n        ? { [K in keyof T]?: DeepPartial<T[K]> }\n        : Partial<T>\n\ntype KeysOfUnion<T> = T extends T ? keyof T : never\ntype Exact<P, I extends P> = P extends Builtin\n  ? P\n  : P & { [K in keyof P]: Exact<P[K], I[K]> } & {\n      [K in Exclude<keyof I, KeysOfUnion<P>>]: never\n    }\n\nfunction isSet(value: any): boolean {\n  return value !== null && value !== undefined\n}\n\ninterface MessageFns<T> {\n  fromJSON(object: any): T\n  toJSON(message: T): unknown\n  create<I extends Exact<DeepPartial<T>, I>>(base?: I): T\n  fromPartial<I extends Exact<DeepPartial<T>, I>>(object: I): T\n}\n", "// Code generated by protoc-gen-ts_proto. DO NOT EDIT.\n// versions:\n//   protoc-gen-ts_proto  v2.6.1\n//   protoc               unknown\n// source: events_mono/common/v1/auth.proto\n\n/* eslint-disable */\n\n/** PublicApiAuth contains authentication context automatically injected by the API */\nexport interface PublicApiAuth {\n  account_id?: number | undefined\n  organization_uuid?: string | undefined\n  account_uuid?: string | undefined\n}\n\nfunction createBasePublicApiAuth(): PublicApiAuth {\n  return { account_id: 0, organization_uuid: '', account_uuid: '' }\n}\n\nexport const PublicApiAuth: MessageFns<PublicApiAuth> = {\n  fromJSON(object: any): PublicApiAuth {\n    return {\n      account_id: isSet(object.account_id)\n        ? globalThis.Number(object.account_id)\n        : 0,\n      organization_uuid: isSet(object.organization_uuid)\n        ? globalThis.String(object.organization_uuid)\n        : '',\n      account_uuid: isSet(object.account_uuid)\n        ? globalThis.String(object.account_uuid)\n        : '',\n    }\n  },\n\n  toJSON(message: PublicApiAuth): unknown {\n    const obj: any = {}\n    if (message.account_id !== undefined) {\n      obj.account_id = Math.round(message.account_id)\n    }\n    if (message.organization_uuid !== undefined) {\n      obj.organization_uuid = message.organization_uuid\n    }\n    if (message.account_uuid !== undefined) {\n      obj.account_uuid = message.account_uuid\n    }\n    return obj\n  },\n\n  create<I extends Exact<DeepPartial<PublicApiAuth>, I>>(\n    base?: I,\n  ): PublicApiAuth {\n    return PublicApiAuth.fromPartial(base ?? ({} as any))\n  },\n  fromPartial<I extends Exact<DeepPartial<PublicApiAuth>, I>>(\n    object: I,\n  ): PublicApiAuth {\n    const message = createBasePublicApiAuth()\n    message.account_id = object.account_id ?? 0\n    message.organization_uuid = object.organization_uuid ?? ''\n    message.account_uuid = object.account_uuid ?? ''\n    return message\n  },\n}\n\ntype Builtin =\n  | Date\n  | Function\n  | Uint8Array\n  | string\n  | number\n  | boolean\n  | undefined\n\ntype DeepPartial<T> = T extends Builtin\n  ? T\n  : T extends globalThis.Array<infer U>\n    ? globalThis.Array<DeepPartial<U>>\n    : T extends ReadonlyArray<infer U>\n      ? ReadonlyArray<DeepPartial<U>>\n      : T extends {}\n        ? { [K in keyof T]?: DeepPartial<T[K]> }\n        : Partial<T>\n\ntype KeysOfUnion<T> = T extends T ? keyof T : never\ntype Exact<P, I extends P> = P extends Builtin\n  ? P\n  : P & { [K in keyof P]: Exact<P[K], I[K]> } & {\n      [K in Exclude<keyof I, KeysOfUnion<P>>]: never\n    }\n\nfunction isSet(value: any): boolean {\n  return value !== null && value !== undefined\n}\n\ninterface MessageFns<T> {\n  fromJSON(object: any): T\n  toJSON(message: T): unknown\n  create<I extends Exact<DeepPartial<T>, I>>(base?: I): T\n  fromPartial<I extends Exact<DeepPartial<T>, I>>(object: I): T\n}\n", "// Code generated by protoc-gen-ts_proto. DO NOT EDIT.\n// versions:\n//   protoc-gen-ts_proto  v2.6.1\n//   protoc               unknown\n// source: events_mono/claude_code/v1/claude_code_internal_event.proto\n\n/* eslint-disable */\nimport { Timestamp } from '../../../google/protobuf/timestamp.js'\nimport { PublicApiAuth } from '../../common/v1/auth.js'\n\n/** GitHubActionsMetadata contains GitHub Actions-specific environment information */\nexport interface GitHubActionsMetadata {\n  actor_id?: string | undefined\n  repository_id?: string | undefined\n  repository_owner_id?: string | undefined\n}\n\n/**\n * EnvironmentMetadata contains environment and runtime information\n * See claude-cli-internal/src/services/statsig.ts for the source of these fields\n */\nexport interface EnvironmentMetadata {\n  platform?: string | undefined\n  node_version?: string | undefined\n  terminal?: string | undefined\n  package_managers?: string | undefined\n  runtimes?: string | undefined\n  is_running_with_bun?: boolean | undefined\n  is_ci?: boolean | undefined\n  is_claubbit?: boolean | undefined\n  is_github_action?: boolean | undefined\n  is_claude_code_action?: boolean | undefined\n  is_claude_ai_auth?: boolean | undefined\n  version?: string | undefined\n  /** GitHub Actions specific fields (only present when is_github_action is true) */\n  github_event_name?: string | undefined\n  github_actions_runner_environment?: string | undefined\n  github_actions_runner_os?: string | undefined\n  github_action_ref?: string | undefined\n  /** WSL specific field */\n  wsl_version?: string | undefined\n  /** GitHub metadata (only present when is_github_action is true) */\n  github_actions_metadata?: GitHubActionsMetadata | undefined\n  arch?: string | undefined\n  is_claude_code_remote?: boolean | undefined\n  remote_environment_type?: string | undefined\n  claude_code_container_id?: string | undefined\n  claude_code_remote_session_id?: string | undefined\n  tags?: string[] | undefined\n  deployment_environment?: string | undefined\n  is_conductor?: boolean | undefined\n  version_base?: string | undefined\n  coworker_type?: string | undefined\n  build_time?: string | undefined\n  is_local_agent_mode?: boolean | undefined\n  linux_distro_id?: string | undefined\n  linux_distro_version?: string | undefined\n  linux_kernel?: string | undefined\n  vcs?: string | undefined\n  platform_raw?: string | undefined\n}\n\n/**\n * SlackContext contains context fields present on every Claude-in-Slack (CIS) event.\n * Event-specific fields (errorType, durationMs, httpStatus, etc.) go in\n * ClaudeCodeInternalEvent.additional_metadata as JSON.\n */\nexport interface SlackContext {\n  slack_team_id?: string | undefined\n  is_enterprise_install?: boolean | undefined\n  trigger?: string | undefined\n  creation_method?: string | undefined\n}\n\n/**\n * ClaudeCodeInternalEvent represents events logged from Tau via Statsig\n * This schema matches the structure in claude-cli-internal/src/services/statsig.ts\n * Source table: proj-product-data-nhme.raw_statsig_internal_tools.events\n */\nexport interface ClaudeCodeInternalEvent {\n  /** Event name (e.g., \"tengu_binary_feedback\", \"tengu_api_success\") */\n  event_name?: string | undefined\n  /** Event timestamp */\n  client_timestamp?: Date | undefined\n  model?: string | undefined\n  session_id?: string | undefined\n  user_type?: string | undefined\n  betas?: string | undefined\n  /** Environment and runtime information */\n  env?: EnvironmentMetadata | undefined\n  entrypoint?: string | undefined\n  agent_sdk_version?: string | undefined\n  is_interactive?: boolean | undefined\n  client_type?: string | undefined\n  /**\n   * Process metrics as JSON string (ant-only)\n   * Contains: uptime, rss, heapTotal, heapUsed, external, arrayBuffers,\n   * constrainedMemory, cpuUsage\n   */\n  process?: string | undefined\n  /**\n   * Additional metadata passed to logEvent (event-specific)\n   * This includes fields like msg_id_A, msg_id_B, gitBranch, gitHead, etc.\n   * that vary per event type\n   */\n  additional_metadata?: string | undefined\n  /** Authentication context automatically injected by the API */\n  auth?: PublicApiAuth | undefined\n  /** Server timestamp automatically injected by the API */\n  server_timestamp?: Date | undefined\n  /** Unique identifier for this event (automatically generated by API endpoint) */\n  event_id?: string | undefined\n  /** Device identifier for the client */\n  device_id?: string | undefined\n  /** SWE-bench fields */\n  swe_bench_run_id?: string | undefined\n  swe_bench_instance_id?: string | undefined\n  swe_bench_task_id?: string | undefined\n  email?: string | undefined\n  /** Swarm/team agent identification for analytics attribution */\n  agent_id?: string | undefined\n  parent_session_id?: string | undefined\n  agent_type?: string | undefined\n  /** Claude-in-Slack context (only present for cis_* events) */\n  slack?: SlackContext | undefined\n  team_name?: string | undefined\n  skill_name?: string | undefined\n  plugin_name?: string | undefined\n  marketplace_name?: string | undefined\n}\n\nfunction createBaseGitHubActionsMetadata(): GitHubActionsMetadata {\n  return { actor_id: '', repository_id: '', repository_owner_id: '' }\n}\n\nexport const GitHubActionsMetadata: MessageFns<GitHubActionsMetadata> = {\n  fromJSON(object: any): GitHubActionsMetadata {\n    return {\n      actor_id: isSet(object.actor_id)\n        ? globalThis.String(object.actor_id)\n        : '',\n      repository_id: isSet(object.repository_id)\n        ? globalThis.String(object.repository_id)\n        : '',\n      repository_owner_id: isSet(object.repository_owner_id)\n        ? globalThis.String(object.repository_owner_id)\n        : '',\n    }\n  },\n\n  toJSON(message: GitHubActionsMetadata): unknown {\n    const obj: any = {}\n    if (message.actor_id !== undefined) {\n      obj.actor_id = message.actor_id\n    }\n    if (message.repository_id !== undefined) {\n      obj.repository_id = message.repository_id\n    }\n    if (message.repository_owner_id !== undefined) {\n      obj.repository_owner_id = message.repository_owner_id\n    }\n    return obj\n  },\n\n  create<I extends Exact<DeepPartial<GitHubActionsMetadata>, I>>(\n    base?: I,\n  ): GitHubActionsMetadata {\n    return GitHubActionsMetadata.fromPartial(base ?? ({} as any))\n  },\n  fromPartial<I extends Exact<DeepPartial<GitHubActionsMetadata>, I>>(\n    object: I,\n  ): GitHubActionsMetadata {\n    const message = createBaseGitHubActionsMetadata()\n    message.actor_id = object.actor_id ?? ''\n    message.repository_id = object.repository_id ?? ''\n    message.repository_owner_id = object.repository_owner_id ?? ''\n    return message\n  },\n}\n\nfunction createBaseEnvironmentMetadata(): EnvironmentMetadata {\n  return {\n    platform: '',\n    node_version: '',\n    terminal: '',\n    package_managers: '',\n    runtimes: '',\n    is_running_with_bun: false,\n    is_ci: false,\n    is_claubbit: false,\n    is_github_action: false,\n    is_claude_code_action: false,\n    is_claude_ai_auth: false,\n    version: '',\n    github_event_name: '',\n    github_actions_runner_environment: '',\n    github_actions_runner_os: '',\n    github_action_ref: '',\n    wsl_version: '',\n    github_actions_metadata: undefined,\n    arch: '',\n    is_claude_code_remote: false,\n    remote_environment_type: '',\n    claude_code_container_id: '',\n    claude_code_remote_session_id: '',\n    tags: [],\n    deployment_environment: '',\n    is_conductor: false,\n    version_base: '',\n    coworker_type: '',\n    build_time: '',\n    is_local_agent_mode: false,\n    linux_distro_id: '',\n    linux_distro_version: '',\n    linux_kernel: '',\n    vcs: '',\n    platform_raw: '',\n  }\n}\n\nexport const EnvironmentMetadata: MessageFns<EnvironmentMetadata> = {\n  fromJSON(object: any): EnvironmentMetadata {\n    return {\n      platform: isSet(object.platform)\n        ? globalThis.String(object.platform)\n        : '',\n      node_version: isSet(object.node_version)\n        ? globalThis.String(object.node_version)\n        : '',\n      terminal: isSet(object.terminal)\n        ? globalThis.String(object.terminal)\n        : '',\n      package_managers: isSet(object.package_managers)\n        ? globalThis.String(object.package_managers)\n        : '',\n      runtimes: isSet(object.runtimes)\n        ? globalThis.String(object.runtimes)\n        : '',\n      is_running_with_bun: isSet(object.is_running_with_bun)\n        ? globalThis.Boolean(object.is_running_with_bun)\n        : false,\n      is_ci: isSet(object.is_ci) ? globalThis.Boolean(object.is_ci) : false,\n      is_claubbit: isSet(object.is_claubbit)\n        ? globalThis.Boolean(object.is_claubbit)\n        : false,\n      is_github_action: isSet(object.is_github_action)\n        ? globalThis.Boolean(object.is_github_action)\n        : false,\n      is_claude_code_action: isSet(object.is_claude_code_action)\n        ? globalThis.Boolean(object.is_claude_code_action)\n        : false,\n      is_claude_ai_auth: isSet(object.is_claude_ai_auth)\n        ? globalThis.Boolean(object.is_claude_ai_auth)\n        : false,\n      version: isSet(object.version) ? globalThis.String(object.version) : '',\n      github_event_name: isSet(object.github_event_name)\n        ? globalThis.String(object.github_event_name)\n        : '',\n      github_actions_runner_environment: isSet(\n        object.github_actions_runner_environment,\n      )\n        ? globalThis.String(object.github_actions_runner_environment)\n        : '',\n      github_actions_runner_os: isSet(object.github_actions_runner_os)\n        ? globalThis.String(object.github_actions_runner_os)\n        : '',\n      github_action_ref: isSet(object.github_action_ref)\n        ? globalThis.String(object.github_action_ref)\n        : '',\n      wsl_version: isSet(object.wsl_version)\n        ? globalThis.String(object.wsl_version)\n        : '',\n      github_actions_metadata: isSet(object.github_actions_metadata)\n        ? GitHubActionsMetadata.fromJSON(object.github_actions_metadata)\n        : undefined,\n      arch: isSet(object.arch) ? globalThis.String(object.arch) : '',\n      is_claude_code_remote: isSet(object.is_claude_code_remote)\n        ? globalThis.Boolean(object.is_claude_code_remote)\n        : false,\n      remote_environment_type: isSet(object.remote_environment_type)\n        ? globalThis.String(object.remote_environment_type)\n        : '',\n      claude_code_container_id: isSet(object.claude_code_container_id)\n        ? globalThis.String(object.claude_code_container_id)\n        : '',\n      claude_code_remote_session_id: isSet(object.claude_code_remote_session_id)\n        ? globalThis.String(object.claude_code_remote_session_id)\n        : '',\n      tags: globalThis.Array.isArray(object?.tags)\n        ? object.tags.map((e: any) => globalThis.String(e))\n        : [],\n      deployment_environment: isSet(object.deployment_environment)\n        ? globalThis.String(object.deployment_environment)\n        : '',\n      is_conductor: isSet(object.is_conductor)\n        ? globalThis.Boolean(object.is_conductor)\n        : false,\n      version_base: isSet(object.version_base)\n        ? globalThis.String(object.version_base)\n        : '',\n      coworker_type: isSet(object.coworker_type)\n        ? globalThis.String(object.coworker_type)\n        : '',\n      build_time: isSet(object.build_time)\n        ? globalThis.String(object.build_time)\n        : '',\n      is_local_agent_mode: isSet(object.is_local_agent_mode)\n        ? globalThis.Boolean(object.is_local_agent_mode)\n        : false,\n      linux_distro_id: isSet(object.linux_distro_id)\n        ? globalThis.String(object.linux_distro_id)\n        : '',\n      linux_distro_version: isSet(object.linux_distro_version)\n        ? globalThis.String(object.linux_distro_version)\n        : '',\n      linux_kernel: isSet(object.linux_kernel)\n        ? globalThis.String(object.linux_kernel)\n        : '',\n      vcs: isSet(object.vcs) ? globalThis.String(object.vcs) : '',\n      platform_raw: isSet(object.platform_raw)\n        ? globalThis.String(object.platform_raw)\n        : '',\n    }\n  },\n\n  toJSON(message: EnvironmentMetadata): unknown {\n    const obj: any = {}\n    if (message.platform !== undefined) {\n      obj.platform = message.platform\n    }\n    if (message.node_version !== undefined) {\n      obj.node_version = message.node_version\n    }\n    if (message.terminal !== undefined) {\n      obj.terminal = message.terminal\n    }\n    if (message.package_managers !== undefined) {\n      obj.package_managers = message.package_managers\n    }\n    if (message.runtimes !== undefined) {\n      obj.runtimes = message.runtimes\n    }\n    if (message.is_running_with_bun !== undefined) {\n      obj.is_running_with_bun = message.is_running_with_bun\n    }\n    if (message.is_ci !== undefined) {\n      obj.is_ci = message.is_ci\n    }\n    if (message.is_claubbit !== undefined) {\n      obj.is_claubbit = message.is_claubbit\n    }\n    if (message.is_github_action !== undefined) {\n      obj.is_github_action = message.is_github_action\n    }\n    if (message.is_claude_code_action !== undefined) {\n      obj.is_claude_code_action = message.is_claude_code_action\n    }\n    if (message.is_claude_ai_auth !== undefined) {\n      obj.is_claude_ai_auth = message.is_claude_ai_auth\n    }\n    if (message.version !== undefined) {\n      obj.version = message.version\n    }\n    if (message.github_event_name !== undefined) {\n      obj.github_event_name = message.github_event_name\n    }\n    if (message.github_actions_runner_environment !== undefined) {\n      obj.github_actions_runner_environment =\n        message.github_actions_runner_environment\n    }\n    if (message.github_actions_runner_os !== undefined) {\n      obj.github_actions_runner_os = message.github_actions_runner_os\n    }\n    if (message.github_action_ref !== undefined) {\n      obj.github_action_ref = message.github_action_ref\n    }\n    if (message.wsl_version !== undefined) {\n      obj.wsl_version = message.wsl_version\n    }\n    if (message.github_actions_metadata !== undefined) {\n      obj.github_actions_metadata = GitHubActionsMetadata.toJSON(\n        message.github_actions_metadata,\n      )\n    }\n    if (message.arch !== undefined) {\n      obj.arch = message.arch\n    }\n    if (message.is_claude_code_remote !== undefined) {\n      obj.is_claude_code_remote = message.is_claude_code_remote\n    }\n    if (message.remote_environment_type !== undefined) {\n      obj.remote_environment_type = message.remote_environment_type\n    }\n    if (message.claude_code_container_id !== undefined) {\n      obj.claude_code_container_id = message.claude_code_container_id\n    }\n    if (message.claude_code_remote_session_id !== undefined) {\n      obj.claude_code_remote_session_id = message.claude_code_remote_session_id\n    }\n    if (message.tags?.length) {\n      obj.tags = message.tags\n    }\n    if (message.deployment_environment !== undefined) {\n      obj.deployment_environment = message.deployment_environment\n    }\n    if (message.is_conductor !== undefined) {\n      obj.is_conductor = message.is_conductor\n    }\n    if (message.version_base !== undefined) {\n      obj.version_base = message.version_base\n    }\n    if (message.coworker_type !== undefined) {\n      obj.coworker_type = message.coworker_type\n    }\n    if (message.build_time !== undefined) {\n      obj.build_time = message.build_time\n    }\n    if (message.is_local_agent_mode !== undefined) {\n      obj.is_local_agent_mode = message.is_local_agent_mode\n    }\n    if (message.linux_distro_id !== undefined) {\n      obj.linux_distro_id = message.linux_distro_id\n    }\n    if (message.linux_distro_version !== undefined) {\n      obj.linux_distro_version = message.linux_distro_version\n    }\n    if (message.linux_kernel !== undefined) {\n      obj.linux_kernel = message.linux_kernel\n    }\n    if (message.vcs !== undefined) {\n      obj.vcs = message.vcs\n    }\n    if (message.platform_raw !== undefined) {\n      obj.platform_raw = message.platform_raw\n    }\n    return obj\n  },\n\n  create<I extends Exact<DeepPartial<EnvironmentMetadata>, I>>(\n    base?: I,\n  ): EnvironmentMetadata {\n    return EnvironmentMetadata.fromPartial(base ?? ({} as any))\n  },\n  fromPartial<I extends Exact<DeepPartial<EnvironmentMetadata>, I>>(\n    object: I,\n  ): EnvironmentMetadata {\n    const message = createBaseEnvironmentMetadata()\n    message.platform = object.platform ?? ''\n    message.node_version = object.node_version ?? ''\n    message.terminal = object.terminal ?? ''\n    message.package_managers = object.package_managers ?? ''\n    message.runtimes = object.runtimes ?? ''\n    message.is_running_with_bun = object.is_running_with_bun ?? false\n    message.is_ci = object.is_ci ?? false\n    message.is_claubbit = object.is_claubbit ?? false\n    message.is_github_action = object.is_github_action ?? false\n    message.is_claude_code_action = object.is_claude_code_action ?? false\n    message.is_claude_ai_auth = object.is_claude_ai_auth ?? false\n    message.version = object.version ?? ''\n    message.github_event_name = object.github_event_name ?? ''\n    message.github_actions_runner_environment =\n      object.github_actions_runner_environment ?? ''\n    message.github_actions_runner_os = object.github_actions_runner_os ?? ''\n    message.github_action_ref = object.github_action_ref ?? ''\n    message.wsl_version = object.wsl_version ?? ''\n    message.github_actions_metadata =\n      object.github_actions_metadata !== undefined &&\n      object.github_actions_metadata !== null\n        ? GitHubActionsMetadata.fromPartial(object.github_actions_metadata)\n        : undefined\n    message.arch = object.arch ?? ''\n    message.is_claude_code_remote = object.is_claude_code_remote ?? false\n    message.remote_environment_type = object.remote_environment_type ?? ''\n    message.claude_code_container_id = object.claude_code_container_id ?? ''\n    message.claude_code_remote_session_id =\n      object.claude_code_remote_session_id ?? ''\n    message.tags = object.tags?.map(e => e) || []\n    message.deployment_environment = object.deployment_environment ?? ''\n    message.is_conductor = object.is_conductor ?? false\n    message.version_base = object.version_base ?? ''\n    message.coworker_type = object.coworker_type ?? ''\n    message.build_time = object.build_time ?? ''\n    message.is_local_agent_mode = object.is_local_agent_mode ?? false\n    message.linux_distro_id = object.linux_distro_id ?? ''\n    message.linux_distro_version = object.linux_distro_version ?? ''\n    message.linux_kernel = object.linux_kernel ?? ''\n    message.vcs = object.vcs ?? ''\n    message.platform_raw = object.platform_raw ?? ''\n    return message\n  },\n}\n\nfunction createBaseSlackContext(): SlackContext {\n  return {\n    slack_team_id: '',\n    is_enterprise_install: false,\n    trigger: '',\n    creation_method: '',\n  }\n}\n\nexport const SlackContext: MessageFns<SlackContext> = {\n  fromJSON(object: any): SlackContext {\n    return {\n      slack_team_id: isSet(object.slack_team_id)\n        ? globalThis.String(object.slack_team_id)\n        : '',\n      is_enterprise_install: isSet(object.is_enterprise_install)\n        ? globalThis.Boolean(object.is_enterprise_install)\n        : false,\n      trigger: isSet(object.trigger) ? globalThis.String(object.trigger) : '',\n      creation_method: isSet(object.creation_method)\n        ? globalThis.String(object.creation_method)\n        : '',\n    }\n  },\n\n  toJSON(message: SlackContext): unknown {\n    const obj: any = {}\n    if (message.slack_team_id !== undefined) {\n      obj.slack_team_id = message.slack_team_id\n    }\n    if (message.is_enterprise_install !== undefined) {\n      obj.is_enterprise_install = message.is_enterprise_install\n    }\n    if (message.trigger !== undefined) {\n      obj.trigger = message.trigger\n    }\n    if (message.creation_method !== undefined) {\n      obj.creation_method = message.creation_method\n    }\n    return obj\n  },\n\n  create<I extends Exact<DeepPartial<SlackContext>, I>>(\n    base?: I,\n  ): SlackContext {\n    return SlackContext.fromPartial(base ?? ({} as any))\n  },\n  fromPartial<I extends Exact<DeepPartial<SlackContext>, I>>(\n    object: I,\n  ): SlackContext {\n    const message = createBaseSlackContext()\n    message.slack_team_id = object.slack_team_id ?? ''\n    message.is_enterprise_install = object.is_enterprise_install ?? false\n    message.trigger = object.trigger ?? ''\n    message.creation_method = object.creation_method ?? ''\n    return message\n  },\n}\n\nfunction createBaseClaudeCodeInternalEvent(): ClaudeCodeInternalEvent {\n  return {\n    event_name: '',\n    client_timestamp: undefined,\n    model: '',\n    session_id: '',\n    user_type: '',\n    betas: '',\n    env: undefined,\n    entrypoint: '',\n    agent_sdk_version: '',\n    is_interactive: false,\n    client_type: '',\n    process: '',\n    additional_metadata: '',\n    auth: undefined,\n    server_timestamp: undefined,\n    event_id: '',\n    device_id: '',\n    swe_bench_run_id: '',\n    swe_bench_instance_id: '',\n    swe_bench_task_id: '',\n    email: '',\n    agent_id: '',\n    parent_session_id: '',\n    agent_type: '',\n    slack: undefined,\n    team_name: '',\n    skill_name: '',\n    plugin_name: '',\n    marketplace_name: '',\n  }\n}\n\nexport const ClaudeCodeInternalEvent: MessageFns<ClaudeCodeInternalEvent> = {\n  fromJSON(object: any): ClaudeCodeInternalEvent {\n    return {\n      event_name: isSet(object.event_name)\n        ? globalThis.String(object.event_name)\n        : '',\n      client_timestamp: isSet(object.client_timestamp)\n        ? fromJsonTimestamp(object.client_timestamp)\n        : undefined,\n      model: isSet(object.model) ? globalThis.String(object.model) : '',\n      session_id: isSet(object.session_id)\n        ? globalThis.String(object.session_id)\n        : '',\n      user_type: isSet(object.user_type)\n        ? globalThis.String(object.user_type)\n        : '',\n      betas: isSet(object.betas) ? globalThis.String(object.betas) : '',\n      env: isSet(object.env)\n        ? EnvironmentMetadata.fromJSON(object.env)\n        : undefined,\n      entrypoint: isSet(object.entrypoint)\n        ? globalThis.String(object.entrypoint)\n        : '',\n      agent_sdk_version: isSet(object.agent_sdk_version)\n        ? globalThis.String(object.agent_sdk_version)\n        : '',\n      is_interactive: isSet(object.is_interactive)\n        ? globalThis.Boolean(object.is_interactive)\n        : false,\n      client_type: isSet(object.client_type)\n        ? globalThis.String(object.client_type)\n        : '',\n      process: isSet(object.process) ? globalThis.String(object.process) : '',\n      additional_metadata: isSet(object.additional_metadata)\n        ? globalThis.String(object.additional_metadata)\n        : '',\n      auth: isSet(object.auth)\n        ? PublicApiAuth.fromJSON(object.auth)\n        : undefined,\n      server_timestamp: isSet(object.server_timestamp)\n        ? fromJsonTimestamp(object.server_timestamp)\n        : undefined,\n      event_id: isSet(object.event_id)\n        ? globalThis.String(object.event_id)\n        : '',\n      device_id: isSet(object.device_id)\n        ? globalThis.String(object.device_id)\n        : '',\n      swe_bench_run_id: isSet(object.swe_bench_run_id)\n        ? globalThis.String(object.swe_bench_run_id)\n        : '',\n      swe_bench_instance_id: isSet(object.swe_bench_instance_id)\n        ? globalThis.String(object.swe_bench_instance_id)\n        : '',\n      swe_bench_task_id: isSet(object.swe_bench_task_id)\n        ? globalThis.String(object.swe_bench_task_id)\n        : '',\n      email: isSet(object.email) ? globalThis.String(object.email) : '',\n      agent_id: isSet(object.agent_id)\n        ? globalThis.String(object.agent_id)\n        : '',\n      parent_session_id: isSet(object.parent_session_id)\n        ? globalThis.String(object.parent_session_id)\n        : '',\n      agent_type: isSet(object.agent_type)\n        ? globalThis.String(object.agent_type)\n        : '',\n      slack: isSet(object.slack)\n        ? SlackContext.fromJSON(object.slack)\n        : undefined,\n      team_name: isSet(object.team_name)\n        ? globalThis.String(object.team_name)\n        : '',\n      skill_name: isSet(object.skill_name)\n        ? globalThis.String(object.skill_name)\n        : '',\n      plugin_name: isSet(object.plugin_name)\n        ? globalThis.String(object.plugin_name)\n        : '',\n      marketplace_name: isSet(object.marketplace_name)\n        ? globalThis.String(object.marketplace_name)\n        : '',\n    }\n  },\n\n  toJSON(message: ClaudeCodeInternalEvent): unknown {\n    const obj: any = {}\n    if (message.event_name !== undefined) {\n      obj.event_name = message.event_name\n    }\n    if (message.client_timestamp !== undefined) {\n      obj.client_timestamp = message.client_timestamp.toISOString()\n    }\n    if (message.model !== undefined) {\n      obj.model = message.model\n    }\n    if (message.session_id !== undefined) {\n      obj.session_id = message.session_id\n    }\n    if (message.user_type !== undefined) {\n      obj.user_type = message.user_type\n    }\n    if (message.betas !== undefined) {\n      obj.betas = message.betas\n    }\n    if (message.env !== undefined) {\n      obj.env = EnvironmentMetadata.toJSON(message.env)\n    }\n    if (message.entrypoint !== undefined) {\n      obj.entrypoint = message.entrypoint\n    }\n    if (message.agent_sdk_version !== undefined) {\n      obj.agent_sdk_version = message.agent_sdk_version\n    }\n    if (message.is_interactive !== undefined) {\n      obj.is_interactive = message.is_interactive\n    }\n    if (message.client_type !== undefined) {\n      obj.client_type = message.client_type\n    }\n    if (message.process !== undefined) {\n      obj.process = message.process\n    }\n    if (message.additional_metadata !== undefined) {\n      obj.additional_metadata = message.additional_metadata\n    }\n    if (message.auth !== undefined) {\n      obj.auth = PublicApiAuth.toJSON(message.auth)\n    }\n    if (message.server_timestamp !== undefined) {\n      obj.server_timestamp = message.server_timestamp.toISOString()\n    }\n    if (message.event_id !== undefined) {\n      obj.event_id = message.event_id\n    }\n    if (message.device_id !== undefined) {\n      obj.device_id = message.device_id\n    }\n    if (message.swe_bench_run_id !== undefined) {\n      obj.swe_bench_run_id = message.swe_bench_run_id\n    }\n    if (message.swe_bench_instance_id !== undefined) {\n      obj.swe_bench_instance_id = message.swe_bench_instance_id\n    }\n    if (message.swe_bench_task_id !== undefined) {\n      obj.swe_bench_task_id = message.swe_bench_task_id\n    }\n    if (message.email !== undefined) {\n      obj.email = message.email\n    }\n    if (message.agent_id !== undefined) {\n      obj.agent_id = message.agent_id\n    }\n    if (message.parent_session_id !== undefined) {\n      obj.parent_session_id = message.parent_session_id\n    }\n    if (message.agent_type !== undefined) {\n      obj.agent_type = message.agent_type\n    }\n    if (message.slack !== undefined) {\n      obj.slack = SlackContext.toJSON(message.slack)\n    }\n    if (message.team_name !== undefined) {\n      obj.team_name = message.team_name\n    }\n    if (message.skill_name !== undefined) {\n      obj.skill_name = message.skill_name\n    }\n    if (message.plugin_name !== undefined) {\n      obj.plugin_name = message.plugin_name\n    }\n    if (message.marketplace_name !== undefined) {\n      obj.marketplace_name = message.marketplace_name\n    }\n    return obj\n  },\n\n  create<I extends Exact<DeepPartial<ClaudeCodeInternalEvent>, I>>(\n    base?: I,\n  ): ClaudeCodeInternalEvent {\n    return ClaudeCodeInternalEvent.fromPartial(base ?? ({} as any))\n  },\n  fromPartial<I extends Exact<DeepPartial<ClaudeCodeInternalEvent>, I>>(\n    object: I,\n  ): ClaudeCodeInternalEvent {\n    const message = createBaseClaudeCodeInternalEvent()\n    message.event_name = object.event_name ?? ''\n    message.client_timestamp = object.client_timestamp ?? undefined\n    message.model = object.model ?? ''\n    message.session_id = object.session_id ?? ''\n    message.user_type = object.user_type ?? ''\n    message.betas = object.betas ?? ''\n    message.env =\n      object.env !== undefined && object.env !== null\n        ? EnvironmentMetadata.fromPartial(object.env)\n        : undefined\n    message.entrypoint = object.entrypoint ?? ''\n    message.agent_sdk_version = object.agent_sdk_version ?? ''\n    message.is_interactive = object.is_interactive ?? false\n    message.client_type = object.client_type ?? ''\n    message.process = object.process ?? ''\n    message.additional_metadata = object.additional_metadata ?? ''\n    message.auth =\n      object.auth !== undefined && object.auth !== null\n        ? PublicApiAuth.fromPartial(object.auth)\n        : undefined\n    message.server_timestamp = object.server_timestamp ?? undefined\n    message.event_id = object.event_id ?? ''\n    message.device_id = object.device_id ?? ''\n    message.swe_bench_run_id = object.swe_bench_run_id ?? ''\n    message.swe_bench_instance_id = object.swe_bench_instance_id ?? ''\n    message.swe_bench_task_id = object.swe_bench_task_id ?? ''\n    message.email = object.email ?? ''\n    message.agent_id = object.agent_id ?? ''\n    message.parent_session_id = object.parent_session_id ?? ''\n    message.agent_type = object.agent_type ?? ''\n    message.slack =\n      object.slack !== undefined && object.slack !== null\n        ? SlackContext.fromPartial(object.slack)\n        : undefined\n    message.team_name = object.team_name ?? ''\n    message.skill_name = object.skill_name ?? ''\n    message.plugin_name = object.plugin_name ?? ''\n    message.marketplace_name = object.marketplace_name ?? ''\n    return message\n  },\n}\n\ntype Builtin =\n  | Date\n  | Function\n  | Uint8Array\n  | string\n  | number\n  | boolean\n  | undefined\n\ntype DeepPartial<T> = T extends Builtin\n  ? T\n  : T extends globalThis.Array<infer U>\n    ? globalThis.Array<DeepPartial<U>>\n    : T extends ReadonlyArray<infer U>\n      ? ReadonlyArray<DeepPartial<U>>\n      : T extends {}\n        ? { [K in keyof T]?: DeepPartial<T[K]> }\n        : Partial<T>\n\ntype KeysOfUnion<T> = T extends T ? keyof T : never\ntype Exact<P, I extends P> = P extends Builtin\n  ? P\n  : P & { [K in keyof P]: Exact<P[K], I[K]> } & {\n      [K in Exclude<keyof I, KeysOfUnion<P>>]: never\n    }\n\nfunction fromTimestamp(t: Timestamp): Date {\n  let millis = (t.seconds || 0) * 1_000\n  millis += (t.nanos || 0) / 1_000_000\n  return new globalThis.Date(millis)\n}\n\nfunction fromJsonTimestamp(o: any): Date {\n  if (o instanceof globalThis.Date) {\n    return o\n  } else if (typeof o === 'string') {\n    return new globalThis.Date(o)\n  } else {\n    return fromTimestamp(Timestamp.fromJSON(o))\n  }\n}\n\nfunction isSet(value: any): boolean {\n  return value !== null && value !== undefined\n}\n\ninterface MessageFns<T> {\n  fromJSON(object: any): T\n  toJSON(message: T): unknown\n  create<I extends Exact<DeepPartial<T>, I>>(base?: I): T\n  fromPartial<I extends Exact<DeepPartial<T>, I>>(object: I): T\n}\n", "// Code generated by protoc-gen-ts_proto. DO NOT EDIT.\n// versions:\n//   protoc-gen-ts_proto  v2.6.1\n//   protoc               unknown\n// source: events_mono/growthbook/v1/growthbook_experiment_event.proto\n\n/* eslint-disable */\nimport { Timestamp } from '../../../google/protobuf/timestamp.js'\nimport { PublicApiAuth } from '../../common/v1/auth.js'\n\n/**\n * GrowthBook experiment assignment event\n * This event tracks when a user is exposed to an experiment variant\n * See: https://docs.growthbook.io/guide/bigquery\n */\nexport interface GrowthbookExperimentEvent {\n  /** Unique event identifier (for deduplication) */\n  event_id?: string | undefined\n  /** When user was exposed to experiment (maps to GrowthBook's timestamp column) */\n  timestamp?: Date | undefined\n  /** Experiment tracking key (maps to GrowthBook's experiment_id column) */\n  experiment_id?: string | undefined\n  /** Variation index: 0=control, 1+=variants (maps to GrowthBook's variation_id column) */\n  variation_id?: number | undefined\n  /** Environment where assignment occurred */\n  environment?: string | undefined\n  /** User attributes at time of assignment */\n  user_attributes?: string | undefined\n  /** Experiment metadata */\n  experiment_metadata?: string | undefined\n  /** Device identifier for the client */\n  device_id?: string | undefined\n  /** Authentication context automatically injected by the API */\n  auth?: PublicApiAuth | undefined\n  /** Session identifier for tracking user sessions */\n  session_id?: string | undefined\n  /** Anonymous identifier for unauthenticated users */\n  anonymous_id?: string | undefined\n  /** Event metadata variables (automatically populated by internal-tools-common event_logging library) */\n  event_metadata_vars?: string | undefined\n}\n\nfunction createBaseGrowthbookExperimentEvent(): GrowthbookExperimentEvent {\n  return {\n    event_id: '',\n    timestamp: undefined,\n    experiment_id: '',\n    variation_id: 0,\n    environment: '',\n    user_attributes: '',\n    experiment_metadata: '',\n    device_id: '',\n    auth: undefined,\n    session_id: '',\n    anonymous_id: '',\n    event_metadata_vars: '',\n  }\n}\n\nexport const GrowthbookExperimentEvent: MessageFns<GrowthbookExperimentEvent> =\n  {\n    fromJSON(object: any): GrowthbookExperimentEvent {\n      return {\n        event_id: isSet(object.event_id)\n          ? globalThis.String(object.event_id)\n          : '',\n        timestamp: isSet(object.timestamp)\n          ? fromJsonTimestamp(object.timestamp)\n          : undefined,\n        experiment_id: isSet(object.experiment_id)\n          ? globalThis.String(object.experiment_id)\n          : '',\n        variation_id: isSet(object.variation_id)\n          ? globalThis.Number(object.variation_id)\n          : 0,\n        environment: isSet(object.environment)\n          ? globalThis.String(object.environment)\n          : '',\n        user_attributes: isSet(object.user_attributes)\n          ? globalThis.String(object.user_attributes)\n          : '',\n        experiment_metadata: isSet(object.experiment_metadata)\n          ? globalThis.String(object.experiment_metadata)\n          : '',\n        device_id: isSet(object.device_id)\n          ? globalThis.String(object.device_id)\n          : '',\n        auth: isSet(object.auth)\n          ? PublicApiAuth.fromJSON(object.auth)\n          : undefined,\n        session_id: isSet(object.session_id)\n          ? globalThis.String(object.session_id)\n          : '',\n        anonymous_id: isSet(object.anonymous_id)\n          ? globalThis.String(object.anonymous_id)\n          : '',\n        event_metadata_vars: isSet(object.event_metadata_vars)\n          ? globalThis.String(object.event_metadata_vars)\n          : '',\n      }\n    },\n\n    toJSON(message: GrowthbookExperimentEvent): unknown {\n      const obj: any = {}\n      if (message.event_id !== undefined) {\n        obj.event_id = message.event_id\n      }\n      if (message.timestamp !== undefined) {\n        obj.timestamp = message.timestamp.toISOString()\n      }\n      if (message.experiment_id !== undefined) {\n        obj.experiment_id = message.experiment_id\n      }\n      if (message.variation_id !== undefined) {\n        obj.variation_id = Math.round(message.variation_id)\n      }\n      if (message.environment !== undefined) {\n        obj.environment = message.environment\n      }\n      if (message.user_attributes !== undefined) {\n        obj.user_attributes = message.user_attributes\n      }\n      if (message.experiment_metadata !== undefined) {\n        obj.experiment_metadata = message.experiment_metadata\n      }\n      if (message.device_id !== undefined) {\n        obj.device_id = message.device_id\n      }\n      if (message.auth !== undefined) {\n        obj.auth = PublicApiAuth.toJSON(message.auth)\n      }\n      if (message.session_id !== undefined) {\n        obj.session_id = message.session_id\n      }\n      if (message.anonymous_id !== undefined) {\n        obj.anonymous_id = message.anonymous_id\n      }\n      if (message.event_metadata_vars !== undefined) {\n        obj.event_metadata_vars = message.event_metadata_vars\n      }\n      return obj\n    },\n\n    create<I extends Exact<DeepPartial<GrowthbookExperimentEvent>, I>>(\n      base?: I,\n    ): GrowthbookExperimentEvent {\n      return GrowthbookExperimentEvent.fromPartial(base ?? ({} as any))\n    },\n    fromPartial<I extends Exact<DeepPartial<GrowthbookExperimentEvent>, I>>(\n      object: I,\n    ): GrowthbookExperimentEvent {\n      const message = createBaseGrowthbookExperimentEvent()\n      message.event_id = object.event_id ?? ''\n      message.timestamp = object.timestamp ?? undefined\n      message.experiment_id = object.experiment_id ?? ''\n      message.variation_id = object.variation_id ?? 0\n      message.environment = object.environment ?? ''\n      message.user_attributes = object.user_attributes ?? ''\n      message.experiment_metadata = object.experiment_metadata ?? ''\n      message.device_id = object.device_id ?? ''\n      message.auth =\n        object.auth !== undefined && object.auth !== null\n          ? PublicApiAuth.fromPartial(object.auth)\n          : undefined\n      message.session_id = object.session_id ?? ''\n      message.anonymous_id = object.anonymous_id ?? ''\n      message.event_metadata_vars = object.event_metadata_vars ?? ''\n      return message\n    },\n  }\n\ntype Builtin =\n  | Date\n  | Function\n  | Uint8Array\n  | string\n  | number\n  | boolean\n  | undefined\n\ntype DeepPartial<T> = T extends Builtin\n  ? T\n  : T extends globalThis.Array<infer U>\n    ? globalThis.Array<DeepPartial<U>>\n    : T extends ReadonlyArray<infer U>\n      ? ReadonlyArray<DeepPartial<U>>\n      : T extends {}\n        ? { [K in keyof T]?: DeepPartial<T[K]> }\n        : Partial<T>\n\ntype KeysOfUnion<T> = T extends T ? keyof T : never\ntype Exact<P, I extends P> = P extends Builtin\n  ? P\n  : P & { [K in keyof P]: Exact<P[K], I[K]> } & {\n      [K in Exclude<keyof I, KeysOfUnion<P>>]: never\n    }\n\nfunction fromTimestamp(t: Timestamp): Date {\n  let millis = (t.seconds || 0) * 1_000\n  millis += (t.nanos || 0) / 1_000_000\n  return new globalThis.Date(millis)\n}\n\nfunction fromJsonTimestamp(o: any): Date {\n  if (o instanceof globalThis.Date) {\n    return o\n  } else if (typeof o === 'string') {\n    return new globalThis.Date(o)\n  } else {\n    return fromTimestamp(Timestamp.fromJSON(o))\n  }\n}\n\nfunction isSet(value: any): boolean {\n  return value !== null && value !== undefined\n}\n\ninterface MessageFns<T> {\n  fromJSON(object: any): T\n  toJSON(message: T): unknown\n  create<I extends Exact<DeepPartial<T>, I>>(base?: I): T\n  fromPartial<I extends Exact<DeepPartial<T>, I>>(object: I): T\n}\n", "import {\n  execFileNoThrowWithCwd,\n  execSyncWithDefaults_DEPRECATED,\n} from './execFileNoThrow.js'\n\n// This file contains platform-agnostic implementations of common `ps` type commands.\n// When adding new code to this file, make sure to handle:\n// - Win32, as `ps` within cygwin and WSL may not behave as expected, particularly when attempting to access processes on the host.\n// - Unix vs BSD-style `ps` have different options.\n\n/**\n * Check if a process with the given PID is running (signal 0 probe).\n *\n * PID \u2264 1 returns false (0 is current process group, 1 is init).\n *\n * Note: `process.kill(pid, 0)` throws EPERM when the process exists but is\n * owned by another user. This reports such processes as NOT running, which\n * is conservative for lock recovery (we won't steal a live lock).\n */\nexport function isProcessRunning(pid: number): boolean {\n  if (pid <= 1) return false\n  try {\n    process.kill(pid, 0)\n    return true\n  } catch {\n    return false\n  }\n}\n\n/**\n * Gets the ancestor process chain for a given process (up to maxDepth levels)\n * @param pid - The starting process ID\n * @param maxDepth - Maximum number of ancestors to fetch (default: 10)\n * @returns Array of ancestor PIDs from immediate parent to furthest ancestor\n */\nexport async function getAncestorPidsAsync(\n  pid: string | number,\n  maxDepth = 10,\n): Promise<number[]> {\n  if (process.platform === 'win32') {\n    // For Windows, use a PowerShell script that walks the process tree\n    const script = `\n      $pid = ${String(pid)}\n      $ancestors = @()\n      for ($i = 0; $i -lt ${maxDepth}; $i++) {\n        $proc = Get-CimInstance Win32_Process -Filter \"ProcessId=$pid\" -ErrorAction SilentlyContinue\n        if (-not $proc -or -not $proc.ParentProcessId -or $proc.ParentProcessId -eq 0) { break }\n        $pid = $proc.ParentProcessId\n        $ancestors += $pid\n      }\n      $ancestors -join ','\n    `.trim()\n\n    const result = await execFileNoThrowWithCwd(\n      'powershell.exe',\n      ['-NoProfile', '-Command', script],\n      { timeout: 3000 },\n    )\n    if (result.code !== 0 || !result.stdout?.trim()) {\n      return []\n    }\n    return result.stdout\n      .trim()\n      .split(',')\n      .filter(Boolean)\n      .map(p => parseInt(p, 10))\n      .filter(p => !isNaN(p))\n  }\n\n  // For Unix, use a shell command that walks up the process tree\n  // This uses a single process invocation instead of multiple sequential calls\n  const script = `pid=${String(pid)}; for i in $(seq 1 ${maxDepth}); do ppid=$(ps -o ppid= -p $pid 2>/dev/null | tr -d ' '); if [ -z \"$ppid\" ] || [ \"$ppid\" = \"0\" ] || [ \"$ppid\" = \"1\" ]; then break; fi; echo $ppid; pid=$ppid; done`\n\n  const result = await execFileNoThrowWithCwd('sh', ['-c', script], {\n    timeout: 3000,\n  })\n  if (result.code !== 0 || !result.stdout?.trim()) {\n    return []\n  }\n  return result.stdout\n    .trim()\n    .split('\\n')\n    .filter(Boolean)\n    .map(p => parseInt(p, 10))\n    .filter(p => !isNaN(p))\n}\n\n/**\n * Gets the command line for a given process\n * @param pid - The process ID to get the command for\n * @returns The command line string, or null if not found\n * @deprecated Use getAncestorCommandsAsync instead\n */\nexport function getProcessCommand(pid: string | number): string | null {\n  try {\n    const pidStr = String(pid)\n    const command =\n      process.platform === 'win32'\n        ? `powershell.exe -NoProfile -Command \"(Get-CimInstance Win32_Process -Filter \\\\\"ProcessId=${pidStr}\\\\\").CommandLine\"`\n        : `ps -o command= -p ${pidStr}`\n\n    const result = execSyncWithDefaults_DEPRECATED(command, { timeout: 1000 })\n    return result ? result.trim() : null\n  } catch {\n    return null\n  }\n}\n\n/**\n * Gets the command lines for a process and its ancestors in a single call\n * @param pid - The starting process ID\n * @param maxDepth - Maximum depth to traverse (default: 10)\n * @returns Array of command strings for the process chain\n */\nexport async function getAncestorCommandsAsync(\n  pid: string | number,\n  maxDepth = 10,\n): Promise<string[]> {\n  if (process.platform === 'win32') {\n    // For Windows, use a PowerShell script that walks the process tree and collects commands\n    const script = `\n      $currentPid = ${String(pid)}\n      $commands = @()\n      for ($i = 0; $i -lt ${maxDepth}; $i++) {\n        $proc = Get-CimInstance Win32_Process -Filter \"ProcessId=$currentPid\" -ErrorAction SilentlyContinue\n        if (-not $proc) { break }\n        if ($proc.CommandLine) { $commands += $proc.CommandLine }\n        if (-not $proc.ParentProcessId -or $proc.ParentProcessId -eq 0) { break }\n        $currentPid = $proc.ParentProcessId\n      }\n      $commands -join [char]0\n    `.trim()\n\n    const result = await execFileNoThrowWithCwd(\n      'powershell.exe',\n      ['-NoProfile', '-Command', script],\n      { timeout: 3000 },\n    )\n    if (result.code !== 0 || !result.stdout?.trim()) {\n      return []\n    }\n    return result.stdout.split('\\0').filter(Boolean)\n  }\n\n  // For Unix, use a shell command that walks up the process tree and collects commands\n  // Using null byte as separator to handle commands with newlines\n  const script = `currentpid=${String(pid)}; for i in $(seq 1 ${maxDepth}); do cmd=$(ps -o command= -p $currentpid 2>/dev/null); if [ -n \"$cmd\" ]; then printf '%s\\\\0' \"$cmd\"; fi; ppid=$(ps -o ppid= -p $currentpid 2>/dev/null | tr -d ' '); if [ -z \"$ppid\" ] || [ \"$ppid\" = \"0\" ] || [ \"$ppid\" = \"1\" ]; then break; fi; currentpid=$ppid; done`\n\n  const result = await execFileNoThrowWithCwd('sh', ['-c', script], {\n    timeout: 3000,\n  })\n  if (result.code !== 0 || !result.stdout?.trim()) {\n    return []\n  }\n  return result.stdout.split('\\0').filter(Boolean)\n}\n\n/**\n * Gets the child process IDs for a given process\n * @param pid - The parent process ID\n * @returns Array of child process IDs as numbers\n */\nexport function getChildPids(pid: string | number): number[] {\n  try {\n    const pidStr = String(pid)\n    const command =\n      process.platform === 'win32'\n        ? `powershell.exe -NoProfile -Command \"(Get-CimInstance Win32_Process -Filter \\\\\"ParentProcessId=${pidStr}\\\\\").ProcessId\"`\n        : `pgrep -P ${pidStr}`\n\n    const result = execSyncWithDefaults_DEPRECATED(command, { timeout: 1000 })\n    if (!result) {\n      return []\n    }\n    return result\n      .trim()\n      .split('\\n')\n      .filter(Boolean)\n      .map(p => parseInt(p, 10))\n      .filter(p => !isNaN(p))\n  } catch {\n    return []\n  }\n}\n", "import { feature } from 'bun:bundle'\nimport { stat } from 'fs/promises'\nimport memoize from 'lodash-es/memoize.js'\nimport { env, JETBRAINS_IDES } from './env.js'\nimport { isEnvTruthy } from './envUtils.js'\nimport { execFileNoThrow } from './execFileNoThrow.js'\nimport { getAncestorCommandsAsync } from './genericProcessUtils.js'\n\n// Functions that require execFileNoThrow and thus cannot be in env.ts\n\nconst getIsDocker = memoize(async (): Promise<boolean> => {\n  if (process.platform !== 'linux') return false\n  // Check for .dockerenv file\n  const { code } = await execFileNoThrow('test', ['-f', '/.dockerenv'])\n  return code === 0\n})\n\nfunction getIsBubblewrapSandbox(): boolean {\n  return (\n    process.platform === 'linux' &&\n    isEnvTruthy(process.env.CLAUDE_CODE_BUBBLEWRAP)\n  )\n}\n\n// Cache for the runtime musl detection fallback (node/unbundled only).\n// In native linux builds, feature flags resolve this at compile time, so the\n// cache is only consulted when both IS_LIBC_MUSL and IS_LIBC_GLIBC are false.\nlet muslRuntimeCache: boolean | null = null\n\n// Fire-and-forget: populate the musl cache for the node fallback path.\n// Native builds never reach this (feature flags short-circuit), so this only\n// matters for unbundled node on Linux. Installer calls on native builds are\n// unaffected since feature() resolves at compile time.\nif (process.platform === 'linux') {\n  const muslArch = process.arch === 'x64' ? 'x86_64' : 'aarch64'\n  void stat(`/lib/libc.musl-${muslArch}.so.1`).then(\n    () => {\n      muslRuntimeCache = true\n    },\n    () => {\n      muslRuntimeCache = false\n    },\n  )\n}\n\n/**\n * Checks if the system is using MUSL libc instead of glibc.\n * In native linux builds, this is statically known at compile time via IS_LIBC_MUSL/IS_LIBC_GLIBC flags.\n * In node (unbundled), both flags are false and we fall back to a runtime async stat check\n * whose result is cached at module load. If the cache isn't populated yet, returns false.\n */\nfunction isMuslEnvironment(): boolean {\n  if (feature('IS_LIBC_MUSL')) return true\n  if (feature('IS_LIBC_GLIBC')) return false\n\n  // Fallback for node: runtime detection via pre-populated cache\n  if (process.platform !== 'linux') return false\n  return muslRuntimeCache ?? false\n}\n\n// Cache for async JetBrains detection\nlet jetBrainsIDECache: string | null | undefined\n\nasync function detectJetBrainsIDEFromParentProcessAsync(): Promise<\n  string | null\n> {\n  if (jetBrainsIDECache !== undefined) {\n    return jetBrainsIDECache\n  }\n\n  if (process.platform === 'darwin') {\n    jetBrainsIDECache = null\n    return null // macOS uses bundle ID detection which is already handled\n  }\n\n  try {\n    // Get ancestor commands in a single call (avoids sync bash in loop)\n    const commands = await getAncestorCommandsAsync(process.pid, 10)\n\n    for (const command of commands) {\n      const lowerCommand = command.toLowerCase()\n      // Check for specific JetBrains IDEs in the command line\n      for (const ide of JETBRAINS_IDES) {\n        if (lowerCommand.includes(ide)) {\n          jetBrainsIDECache = ide\n          return ide\n        }\n      }\n    }\n  } catch {\n    // Silently fail - this is a best-effort detection\n  }\n\n  jetBrainsIDECache = null\n  return null\n}\n\nexport async function getTerminalWithJetBrainsDetectionAsync(): Promise<\n  string | null\n> {\n  // Check for JetBrains terminal on Linux/Windows\n  if (process.env.TERMINAL_EMULATOR === 'JetBrains-JediTerm') {\n    // For macOS, bundle ID detection above already handles JetBrains IDEs\n    if (env.platform !== 'darwin') {\n      const specificIDE = await detectJetBrainsIDEFromParentProcessAsync()\n      return specificIDE || 'pycharm'\n    }\n  }\n  return env.terminal\n}\n\n// Synchronous version that returns cached result or falls back to env.terminal\n// Used for backward compatibility - callers should migrate to async version\nexport function getTerminalWithJetBrainsDetection(): string | null {\n  // Check for JetBrains terminal on Linux/Windows\n  if (process.env.TERMINAL_EMULATOR === 'JetBrains-JediTerm') {\n    // For macOS, bundle ID detection above already handles JetBrains IDEs\n    if (env.platform !== 'darwin') {\n      // Return cached value if available, otherwise fall back to generic detection\n      // The async version should be called early in app initialization to populate cache\n      if (jetBrainsIDECache !== undefined) {\n        return jetBrainsIDECache || 'pycharm'\n      }\n      // Fall back to generic 'pycharm' if cache not populated yet\n      return 'pycharm'\n    }\n  }\n  return env.terminal\n}\n\n/**\n * Initialize JetBrains IDE detection asynchronously.\n * Call this early in app initialization to populate the cache.\n * After this resolves, getTerminalWithJetBrainsDetection() will return accurate results.\n */\nexport async function initJetBrainsDetection(): Promise<void> {\n  if (process.env.TERMINAL_EMULATOR === 'JetBrains-JediTerm') {\n    await detectJetBrainsIDEFromParentProcessAsync()\n  }\n}\n\n// Combined export that includes all env properties plus dynamic functions\nexport const envDynamic = {\n  ...env, // Include all properties from env\n  terminal: getTerminalWithJetBrainsDetection(),\n  getIsDocker,\n  getIsBubblewrapSandbox,\n  isMuslEnvironment,\n  getTerminalWithJetBrainsDetectionAsync,\n  initJetBrainsDetection,\n}\n", "import axios from 'axios'\nimport { logForDebugging } from '../../utils/debug.js'\nimport { errorMessage } from '../../utils/errors.js'\n\ntype RegistryServer = {\n  server: {\n    remotes?: Array<{ url: string }>\n  }\n}\n\ntype RegistryResponse = {\n  servers: RegistryServer[]\n}\n\n// URLs stripped of query string and trailing slash \u2014 matches the normalization\n// done by getLoggingSafeMcpBaseUrl so direct Set.has() lookup works.\nlet officialUrls: Set<string> | undefined = undefined\n\nfunction normalizeUrl(url: string): string | undefined {\n  try {\n    const u = new URL(url)\n    u.search = ''\n    return u.toString().replace(/\\/$/, '')\n  } catch {\n    return undefined\n  }\n}\n\n/**\n * Fire-and-forget fetch of the official MCP registry.\n * Populates officialUrls for isOfficialMcpUrl lookups.\n */\nexport async function prefetchOfficialMcpUrls(): Promise<void> {\n  if (process.env.CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC) {\n    return\n  }\n\n  try {\n    const response = await axios.get<RegistryResponse>(\n      'https://api.anthropic.com/mcp-registry/v0/servers?version=latest&visibility=commercial',\n      { timeout: 5000 },\n    )\n\n    const urls = new Set<string>()\n    for (const entry of response.data.servers) {\n      for (const remote of entry.server.remotes ?? []) {\n        const normalized = normalizeUrl(remote.url)\n        if (normalized) {\n          urls.add(normalized)\n        }\n      }\n    }\n    officialUrls = urls\n    logForDebugging(`[mcp-registry] Loaded ${urls.size} official MCP URLs`)\n  } catch (error) {\n    logForDebugging(`Failed to fetch MCP registry: ${errorMessage(error)}`, {\n      level: 'error',\n    })\n  }\n}\n\n/**\n * Returns true iff the given (already-normalized via getLoggingSafeMcpBaseUrl)\n * URL is in the official MCP registry. Undefined registry \u2192 false (fail-closed).\n */\nexport function isOfficialMcpUrl(normalizedUrl: string): boolean {\n  return officialUrls?.has(normalizedUrl) ?? false\n}\n\nexport function resetOfficialMcpUrlsForTesting(): void {\n  officialUrls = undefined\n}\n", "import { getFeatureValue_CACHED_MAY_BE_STALE } from '../services/analytics/growthbook.js'\nimport { isEnvTruthy } from './envUtils.js'\n\n/**\n * Check if --agent-teams flag is provided via CLI.\n * Checks process.argv directly to avoid import cycles with bootstrap/state.\n * Note: The flag is only shown in help for ant users, but if external users\n * pass it anyway, it will work (subject to the killswitch).\n */\nfunction isAgentTeamsFlagSet(): boolean {\n  return process.argv.includes('--agent-teams')\n}\n\n/**\n * Centralized runtime check for agent teams/teammate features.\n * This is the single gate that should be checked everywhere teammates\n * are referenced (prompts, code, tools isEnabled, UI, etc.).\n *\n * Ant builds: always enabled.\n * External builds require both:\n * 1. Opt-in via CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS env var OR --agent-teams flag\n * 2. GrowthBook gate 'tengu_amber_flint' enabled (killswitch)\n */\nexport function isAgentSwarmsEnabled(): boolean {\n  // Ant: always on\n  if (process.env.USER_TYPE === 'ant') {\n    return true\n  }\n\n  // External: require opt-in via env var or --agent-teams flag\n  if (\n    !isEnvTruthy(process.env.CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS) &&\n    !isAgentTeamsFlagSet()\n  ) {\n    return false\n  }\n\n  // Killswitch \u2014 always respected for external users\n  if (!getFeatureValue_CACHED_MAY_BE_STALE('tengu_amber_flint', true)) {\n    return false\n  }\n\n  return true\n}\n", "/**\n * Agent context for analytics attribution using AsyncLocalStorage.\n *\n * This module provides a way to track agent identity across async operations\n * without parameter drilling. Supports two agent types:\n *\n * 1. Subagents (Agent tool): Run in-process for quick, delegated tasks.\n *    Context: SubagentContext with agentType: 'subagent'\n *\n * 2. In-process teammates: Part of a swarm with team coordination.\n *    Context: TeammateAgentContext with agentType: 'teammate'\n *\n * For swarm teammates in separate processes (tmux/iTerm2), use environment\n * variables instead: CLAUDE_CODE_AGENT_ID, CLAUDE_CODE_PARENT_SESSION_ID\n *\n * WHY AsyncLocalStorage (not AppState):\n * When agents are backgrounded (ctrl+b), multiple agents can run concurrently\n * in the same process. AppState is a single shared state that would be\n * overwritten, causing Agent A's events to incorrectly use Agent B's context.\n * AsyncLocalStorage isolates each async execution chain, so concurrent agents\n * don't interfere with each other.\n */\n\nimport { AsyncLocalStorage } from 'async_hooks'\nimport type { AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS } from '../services/analytics/index.js'\nimport { isAgentSwarmsEnabled } from './agentSwarmsEnabled.js'\n\n/**\n * Context for subagents (Agent tool agents).\n * Subagents run in-process for quick, delegated tasks.\n */\nexport type SubagentContext = {\n  /** The subagent's UUID (from createAgentId()) */\n  agentId: string\n  /** The team lead's session ID (from CLAUDE_CODE_PARENT_SESSION_ID env var), undefined for main REPL subagents */\n  parentSessionId?: string\n  /** Agent type - 'subagent' for Agent tool agents */\n  agentType: 'subagent'\n  /** The subagent's type name (e.g., \"Explore\", \"Bash\", \"code-reviewer\") */\n  subagentName?: string\n  /** Whether this is a built-in agent (vs user-defined custom agent) */\n  isBuiltIn?: boolean\n  /** The request_id in the invoking agent that spawned or resumed this agent.\n   *  For nested subagents this is the immediate invoker, not the root \u2014\n   *  session_id already bundles the whole tree. Updated on each resume. */\n  invokingRequestId?: string\n  /** Whether this invocation is the initial spawn or a subsequent resume\n   *  via SendMessage. Undefined when invokingRequestId is absent. */\n  invocationKind?: 'spawn' | 'resume'\n  /** Mutable flag: has this invocation's edge been emitted to telemetry yet?\n   *  Reset to false on each spawn/resume; flipped true by\n   *  consumeInvokingRequestId() on the first terminal API event. */\n  invocationEmitted?: boolean\n}\n\n/**\n * Context for in-process teammates.\n * Teammates are part of a swarm and have team coordination.\n */\nexport type TeammateAgentContext = {\n  /** Full agent ID, e.g., \"researcher@my-team\" */\n  agentId: string\n  /** Display name, e.g., \"researcher\" */\n  agentName: string\n  /** Team name this teammate belongs to */\n  teamName: string\n  /** UI color assigned to this teammate */\n  agentColor?: string\n  /** Whether teammate must enter plan mode before implementing */\n  planModeRequired: boolean\n  /** The team lead's session ID for transcript correlation */\n  parentSessionId: string\n  /** Whether this agent is the team lead */\n  isTeamLead: boolean\n  /** Agent type - 'teammate' for swarm teammates */\n  agentType: 'teammate'\n  /** The request_id in the invoking agent that spawned or resumed this\n   *  teammate. Undefined for teammates started outside a tool call\n   *  (e.g. session start). Updated on each resume. */\n  invokingRequestId?: string\n  /** See SubagentContext.invocationKind. */\n  invocationKind?: 'spawn' | 'resume'\n  /** Mutable flag: see SubagentContext.invocationEmitted. */\n  invocationEmitted?: boolean\n}\n\n/**\n * Discriminated union for agent context.\n * Use agentType to distinguish between subagent and teammate contexts.\n */\nexport type AgentContext = SubagentContext | TeammateAgentContext\n\nconst agentContextStorage = new AsyncLocalStorage<AgentContext>()\n\n/**\n * Get the current agent context, if any.\n * Returns undefined if not running within an agent context (subagent or teammate).\n * Use type guards isSubagentContext() or isTeammateAgentContext() to narrow the type.\n */\nexport function getAgentContext(): AgentContext | undefined {\n  return agentContextStorage.getStore()\n}\n\n/**\n * Run an async function with the given agent context.\n * All async operations within the function will have access to this context.\n */\nexport function runWithAgentContext<T>(context: AgentContext, fn: () => T): T {\n  return agentContextStorage.run(context, fn)\n}\n\n/**\n * Type guard to check if context is a SubagentContext.\n */\nexport function isSubagentContext(\n  context: AgentContext | undefined,\n): context is SubagentContext {\n  return context?.agentType === 'subagent'\n}\n\n/**\n * Type guard to check if context is a TeammateAgentContext.\n */\nexport function isTeammateAgentContext(\n  context: AgentContext | undefined,\n): context is TeammateAgentContext {\n  if (isAgentSwarmsEnabled()) {\n    return context?.agentType === 'teammate'\n  }\n  return false\n}\n\n/**\n * Get the subagent name suitable for analytics logging.\n * Returns the agent type name for built-in agents, \"user-defined\" for custom agents,\n * or undefined if not running within a subagent context.\n *\n * Safe for analytics metadata: built-in agent names are code constants,\n * and custom agents are always mapped to the literal \"user-defined\".\n */\nexport function getSubagentLogName():\n  | AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS\n  | undefined {\n  const context = getAgentContext()\n  if (!isSubagentContext(context) || !context.subagentName) {\n    return undefined\n  }\n  return (\n    context.isBuiltIn ? context.subagentName : 'user-defined'\n  ) as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS\n}\n\n/**\n * Get the invoking request_id for the current agent context \u2014 once per\n * invocation. Returns the id on the first call after a spawn/resume, then\n * undefined until the next boundary. Also undefined on the main thread or\n * when the spawn path had no request_id.\n *\n * Sparse edge semantics: invokingRequestId appears on exactly one\n * tengu_api_success/error per invocation, so a non-NULL value downstream\n * marks a spawn/resume boundary.\n */\nexport function consumeInvokingRequestId():\n  | {\n      invokingRequestId: string\n      invocationKind: 'spawn' | 'resume' | undefined\n    }\n  | undefined {\n  const context = getAgentContext()\n  if (!context?.invokingRequestId || context.invocationEmitted) {\n    return undefined\n  }\n  context.invocationEmitted = true\n  return {\n    invokingRequestId: context.invokingRequestId,\n    invocationKind: context.invocationKind,\n  }\n}\n", "/**\n * TeammateContext - Runtime context for in-process teammates\n *\n * This module provides AsyncLocalStorage-based context for in-process teammates,\n * enabling concurrent teammate execution without global state conflicts.\n *\n * Relationship with other teammate identity mechanisms:\n * - Env vars (CLAUDE_CODE_AGENT_ID): Process-based teammates spawned via tmux\n * - dynamicTeamContext (teammate.ts): Process-based teammates joining at runtime\n * - TeammateContext (this file): In-process teammates via AsyncLocalStorage\n *\n * The helper functions in teammate.ts check AsyncLocalStorage first, then\n * dynamicTeamContext, then env vars.\n */\n\nimport { AsyncLocalStorage } from 'async_hooks'\n\n/**\n * Runtime context for in-process teammates.\n * Stored in AsyncLocalStorage for concurrent access.\n */\nexport type TeammateContext = {\n  /** Full agent ID, e.g., \"researcher@my-team\" */\n  agentId: string\n  /** Display name, e.g., \"researcher\" */\n  agentName: string\n  /** Team name this teammate belongs to */\n  teamName: string\n  /** UI color assigned to this teammate */\n  color?: string\n  /** Whether teammate must enter plan mode before implementing */\n  planModeRequired: boolean\n  /** Leader's session ID (for transcript correlation) */\n  parentSessionId: string\n  /** Discriminator - always true for in-process teammates */\n  isInProcess: true\n  /** Abort controller for lifecycle management (linked to parent) */\n  abortController: AbortController\n}\n\nconst teammateContextStorage = new AsyncLocalStorage<TeammateContext>()\n\n/**\n * Get the current in-process teammate context, if running as one.\n * Returns undefined if not running within an in-process teammate context.\n */\nexport function getTeammateContext(): TeammateContext | undefined {\n  return teammateContextStorage.getStore()\n}\n\n/**\n * Run a function with teammate context set.\n * Used when spawning an in-process teammate to establish its execution context.\n *\n * @param context - The teammate context to set\n * @param fn - The function to run with the context\n * @returns The return value of fn\n */\nexport function runWithTeammateContext<T>(\n  context: TeammateContext,\n  fn: () => T,\n): T {\n  return teammateContextStorage.run(context, fn)\n}\n\n/**\n * Check if current execution is within an in-process teammate.\n * This is faster than getTeammateContext() !== undefined for simple checks.\n */\nexport function isInProcessTeammate(): boolean {\n  return teammateContextStorage.getStore() !== undefined\n}\n\n/**\n * Create a TeammateContext from spawn configuration.\n * The abortController is passed in by the caller. For in-process teammates,\n * this is typically an independent controller (not linked to parent) so teammates\n * continue running when the leader's query is interrupted.\n *\n * @param config - Configuration for the teammate context\n * @returns A complete TeammateContext with isInProcess: true\n */\nexport function createTeammateContext(config: {\n  agentId: string\n  agentName: string\n  teamName: string\n  color?: string\n  planModeRequired: boolean\n  parentSessionId: string\n  abortController: AbortController\n}): TeammateContext {\n  return {\n    ...config,\n    isInProcess: true,\n  }\n}\n", "/**\n * Teammate utilities for agent swarm coordination\n *\n * These helpers identify whether this Tau instance is running as a\n * spawned teammate in a swarm. Teammates receive their identity via CLI\n * arguments (--agent-id, --team-name, etc.) which are stored in dynamicTeamContext.\n *\n * For in-process teammates (running in the same process), AsyncLocalStorage\n * provides isolated context per teammate, preventing concurrent overwrites.\n *\n * Priority order for identity resolution:\n * 1. AsyncLocalStorage (in-process teammates) - via teammateContext.ts\n * 2. dynamicTeamContext (tmux teammates via CLI args)\n */\n\n// Re-export in-process teammate utilities from teammateContext.ts\nexport {\n  createTeammateContext,\n  getTeammateContext,\n  isInProcessTeammate,\n  runWithTeammateContext,\n  type TeammateContext,\n} from './teammateContext.js'\n\nimport type { AppState } from '../state/AppState.js'\nimport { isEnvTruthy } from './envUtils.js'\nimport { getTeammateContext } from './teammateContext.js'\n\n/**\n * Returns the parent session ID for this teammate.\n * For in-process teammates, this is the team lead's session ID.\n * Priority: AsyncLocalStorage (in-process) > dynamicTeamContext (tmux teammates).\n */\nexport function getParentSessionId(): string | undefined {\n  const inProcessCtx = getTeammateContext()\n  if (inProcessCtx) return inProcessCtx.parentSessionId\n  return dynamicTeamContext?.parentSessionId\n}\n\n/**\n * Dynamic team context for runtime team joining.\n * When set, these values take precedence over environment variables.\n */\nlet dynamicTeamContext: {\n  agentId: string\n  agentName: string\n  teamName: string\n  color?: string\n  planModeRequired: boolean\n  parentSessionId?: string\n} | null = null\n\n/**\n * Set the dynamic team context (called when joining a team at runtime)\n */\nexport function setDynamicTeamContext(\n  context: {\n    agentId: string\n    agentName: string\n    teamName: string\n    color?: string\n    planModeRequired: boolean\n    parentSessionId?: string\n  } | null,\n): void {\n  dynamicTeamContext = context\n}\n\n/**\n * Clear the dynamic team context (called when leaving a team)\n */\nexport function clearDynamicTeamContext(): void {\n  dynamicTeamContext = null\n}\n\n/**\n * Get the current dynamic team context (for inspection/debugging)\n */\nexport function getDynamicTeamContext(): typeof dynamicTeamContext {\n  return dynamicTeamContext\n}\n\n/**\n * Returns the agent ID if this session is running as a teammate in a swarm,\n * or undefined if running as a standalone session.\n * Priority: AsyncLocalStorage (in-process) > dynamicTeamContext (tmux via CLI args).\n */\nexport function getAgentId(): string | undefined {\n  const inProcessCtx = getTeammateContext()\n  if (inProcessCtx) return inProcessCtx.agentId\n  return dynamicTeamContext?.agentId\n}\n\n/**\n * Returns the agent name if this session is running as a teammate in a swarm.\n * Priority: AsyncLocalStorage (in-process) > dynamicTeamContext (tmux via CLI args).\n */\nexport function getAgentName(): string | undefined {\n  const inProcessCtx = getTeammateContext()\n  if (inProcessCtx) return inProcessCtx.agentName\n  return dynamicTeamContext?.agentName\n}\n\n/**\n * Returns the team name if this session is part of a team.\n * Priority: AsyncLocalStorage (in-process) > dynamicTeamContext (tmux via CLI args) > passed teamContext.\n * Pass teamContext from AppState to support leaders who don't have dynamicTeamContext set.\n *\n * @param teamContext - Optional team context from AppState (for leaders)\n */\nexport function getTeamName(teamContext?: {\n  teamName: string\n}): string | undefined {\n  const inProcessCtx = getTeammateContext()\n  if (inProcessCtx) return inProcessCtx.teamName\n  if (dynamicTeamContext?.teamName) return dynamicTeamContext.teamName\n  return teamContext?.teamName\n}\n\n/**\n * Returns true if this session is running as a teammate in a swarm.\n * Priority: AsyncLocalStorage (in-process) > dynamicTeamContext (tmux via CLI args).\n * For tmux teammates, requires BOTH an agent ID AND a team name.\n */\nexport function isTeammate(): boolean {\n  // In-process teammates run within the same process\n  const inProcessCtx = getTeammateContext()\n  if (inProcessCtx) return true\n  // Tmux teammates require both agent ID and team name\n  return !!(dynamicTeamContext?.agentId && dynamicTeamContext?.teamName)\n}\n\n/**\n * Returns the teammate's assigned color,\n * or undefined if not running as a teammate or no color assigned.\n * Priority: AsyncLocalStorage (in-process) > dynamicTeamContext (tmux teammates).\n */\nexport function getTeammateColor(): string | undefined {\n  const inProcessCtx = getTeammateContext()\n  if (inProcessCtx) return inProcessCtx.color\n  return dynamicTeamContext?.color\n}\n\n/**\n * Returns true if this teammate session requires plan mode before implementation.\n * When enabled, the teammate must enter plan mode and get approval before writing code.\n * Priority: AsyncLocalStorage > dynamicTeamContext > env var.\n */\nexport function isPlanModeRequired(): boolean {\n  const inProcessCtx = getTeammateContext()\n  if (inProcessCtx) return inProcessCtx.planModeRequired\n  if (dynamicTeamContext !== null) {\n    return dynamicTeamContext.planModeRequired\n  }\n  return isEnvTruthy(process.env.CLAUDE_CODE_PLAN_MODE_REQUIRED)\n}\n\n/**\n * Check if this session is a team lead.\n *\n * A session is considered a team lead if:\n * 1. A team context exists with a leadAgentId, AND\n * 2. Either:\n *    - Our CLAUDE_CODE_AGENT_ID matches the leadAgentId, OR\n *    - We have no CLAUDE_CODE_AGENT_ID set (backwards compat: the original\n *      session that created the team before agent IDs were standardized)\n *\n * @param teamContext - The team context from AppState, if any\n * @returns true if this session is the team lead\n */\nexport function isTeamLead(\n  teamContext:\n    | {\n        leadAgentId: string\n      }\n    | undefined,\n): boolean {\n  if (!teamContext?.leadAgentId) {\n    return false\n  }\n\n  // Use getAgentId() for AsyncLocalStorage support (in-process teammates)\n  const myAgentId = getAgentId()\n  const leadAgentId = teamContext.leadAgentId\n\n  // If my agent ID matches the lead agent ID, I'm the lead\n  if (myAgentId === leadAgentId) {\n    return true\n  }\n\n  // Backwards compat: if no agent ID is set and we have a team context,\n  // this is the original session that created the team (the lead)\n  if (!myAgentId) {\n    return true\n  }\n\n  return false\n}\n\n/**\n * Checks if there are any active in-process teammates running.\n * Used by headless/print mode to determine if we should wait for teammates\n * before exiting.\n */\nexport function hasActiveInProcessTeammates(appState: AppState): boolean {\n  // Check for running in-process teammate tasks\n  for (const task of Object.values(appState.tasks)) {\n    if (task.type === 'in_process_teammate' && task.status === 'running') {\n      return true\n    }\n  }\n  return false\n}\n\n/**\n * Checks if there are in-process teammates still actively working on tasks.\n * Returns true if any teammate is running but NOT idle (still processing).\n * Used to determine if we should wait before sending shutdown prompts.\n */\nexport function hasWorkingInProcessTeammates(appState: AppState): boolean {\n  for (const task of Object.values(appState.tasks)) {\n    if (\n      task.type === 'in_process_teammate' &&\n      task.status === 'running' &&\n      !task.isIdle\n    ) {\n      return true\n    }\n  }\n  return false\n}\n\n/**\n * Returns a promise that resolves when all working in-process teammates become idle.\n * Registers callbacks on each working teammate's task - they call these when idle.\n * Returns immediately if no teammates are working.\n */\nexport function waitForTeammatesToBecomeIdle(\n  setAppState: (f: (prev: AppState) => AppState) => void,\n  appState: AppState,\n): Promise<void> {\n  const workingTaskIds: string[] = []\n\n  for (const [taskId, task] of Object.entries(appState.tasks)) {\n    if (\n      task.type === 'in_process_teammate' &&\n      task.status === 'running' &&\n      !task.isIdle\n    ) {\n      workingTaskIds.push(taskId)\n    }\n  }\n\n  if (workingTaskIds.length === 0) {\n    return Promise.resolve()\n  }\n\n  // Create a promise that resolves when all working teammates become idle\n  return new Promise<void>(resolve => {\n    let remaining = workingTaskIds.length\n\n    const onIdle = (): void => {\n      remaining--\n      if (remaining === 0) {\n        // biome-ignore lint/nursery/noFloatingPromises: resolve is a callback, not a Promise\n        resolve()\n      }\n    }\n\n    // Register callback on each working teammate\n    // Check current isIdle state to handle race where teammate became idle\n    // between our initial snapshot and this callback registration\n    setAppState(prev => {\n      const newTasks = { ...prev.tasks }\n      for (const taskId of workingTaskIds) {\n        const task = newTasks[taskId]\n        if (task && task.type === 'in_process_teammate') {\n          // If task is already idle, call onIdle immediately\n          if (task.isIdle) {\n            onIdle()\n          } else {\n            newTasks[taskId] = {\n              ...task,\n              onIdleCallbacks: [...(task.onIdleCallbacks ?? []), onIdle],\n            }\n          }\n        }\n      }\n      return { ...prev, tasks: newTasks }\n    })\n  })\n}\n", "import { normalizeNameForMCP } from '../../services/mcp/normalization.js'\nimport { env } from '../env.js'\n\nexport const COMPUTER_USE_MCP_SERVER_NAME = 'computer-use'\n\n/**\n * Sentinel bundle ID for the frontmost gate. Tau is a terminal \u2014 it has\n * no window. This never matches a real `NSWorkspace.frontmostApplication`, so\n * the package's \"host is frontmost\" branch (mouse click-through exemption,\n * keyboard safety-net) is dead code for us. `prepareForAction`'s \"exempt our\n * own window\" is likewise a no-op \u2014 there is no window to exempt.\n */\nexport const CLI_HOST_BUNDLE_ID = 'com.anthropic.claude-code.cli-no-window'\n\n/**\n * Fallback `env.terminal` \u2192 bundleId map for when `__CFBundleIdentifier` is\n * unset. Covers the macOS terminals we can distinguish \u2014 Linux entries\n * (konsole, gnome-terminal, xterm) are deliberately absent since\n * `createCliExecutor` is darwin-guarded.\n */\nconst TERMINAL_BUNDLE_ID_FALLBACK: Readonly<Record<string, string>> = {\n  'iTerm.app': 'com.googlecode.iterm2',\n  Apple_Terminal: 'com.apple.Terminal',\n  ghostty: 'com.mitchellh.ghostty',\n  kitty: 'net.kovidgoyal.kitty',\n  WarpTerminal: 'dev.warp.Warp-Stable',\n  vscode: 'com.microsoft.VSCode',\n}\n\n/**\n * Bundle ID of the terminal emulator we're running inside, so `prepareDisplay`\n * can exempt it from hiding and `captureExcluding` can keep it out of\n * screenshots. Returns null when undetectable (ssh, cleared env, unknown\n * terminal) \u2014 caller must handle the null case.\n *\n * `__CFBundleIdentifier` is set by LaunchServices when a .app bundle spawns a\n * process and is inherited by children. It's the exact bundleId, no lookup\n * needed \u2014 handles terminals the fallback table doesn't know about. Under\n * tmux/screen it reflects the terminal that started the SERVER, which may\n * differ from the attached client. That's harmless here: we exempt A\n * terminal window, and the screenshots exclude it regardless.\n */\nexport function getTerminalBundleId(): string | null {\n  const cfBundleId = process.env.__CFBundleIdentifier\n  if (cfBundleId) return cfBundleId\n  return TERMINAL_BUNDLE_ID_FALLBACK[env.terminal ?? ''] ?? null\n}\n\n/**\n * Static capabilities for macOS CLI. `hostBundleId` is not here \u2014 it's added\n * by `executor.ts` per `ComputerExecutor.capabilities`. `buildComputerUseTools`\n * takes this shape (no `hostBundleId`, no `teachMode`).\n */\nexport const CLI_CU_CAPABILITIES = {\n  screenshotFiltering: 'native' as const,\n  platform: 'darwin' as const,\n}\n\nexport function isComputerUseMCPServer(name: string): boolean {\n  return normalizeNameForMCP(name) === COMPUTER_USE_MCP_SERVER_NAME\n}\n", "// biome-ignore-all assist/source/organizeImports: ANT-ONLY import markers must not be reordered\n/**\n * Shared event metadata enrichment for analytics systems\n *\n * This module provides a single source of truth for collecting and formatting\n * event metadata across all analytics systems (Datadog, 1P).\n */\n\nimport { extname } from 'path'\nimport memoize from 'lodash-es/memoize.js'\nimport { env, getHostPlatformForAnalytics } from '../../utils/env.js'\nimport { envDynamic } from '../../utils/envDynamic.js'\nimport { getModelBetas } from '../../utils/betas.js'\nimport { getMainLoopModel } from '../../utils/model/model.js'\nimport {\n  getSessionId,\n  getIsInteractive,\n  getKairosActive,\n  getClientType,\n  getParentSessionId as getParentSessionIdFromState,\n} from '../../bootstrap/state.js'\nimport { isEnvTruthy } from '../../utils/envUtils.js'\nimport { isOfficialMcpUrl } from '../mcp/officialRegistry.js'\nimport { isClaudeAISubscriber, getSubscriptionType } from '../../utils/auth.js'\nimport { getRepoRemoteHash } from '../../utils/git.js'\nimport {\n  getWslVersion,\n  getLinuxDistroInfo,\n  detectVcs,\n} from '../../utils/platform.js'\nimport type { CoreUserData } from 'src/utils/user.js'\nimport { getAgentContext } from '../../utils/agentContext.js'\nimport type { EnvironmentMetadata } from '../../types/generated/events_mono/claude_code/v1/claude_code_internal_event.js'\nimport type { PublicApiAuth } from '../../types/generated/events_mono/common/v1/auth.js'\nimport { jsonStringify } from '../../utils/slowOperations.js'\nimport {\n  getAgentId,\n  getParentSessionId as getTeammateParentSessionId,\n  getTeamName,\n  isTeammate,\n} from '../../utils/teammate.js'\nimport { feature } from 'bun:bundle'\n\n/**\n * Marker type for verifying analytics metadata doesn't contain sensitive data\n *\n * This type forces explicit verification that string values being logged\n * don't contain code snippets, file paths, or other sensitive information.\n *\n * The metadata is expected to be JSON-serializable.\n *\n * Usage: `myString as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS`\n *\n * The type is `never` which means it can never actually hold a value - this is\n * intentional as it's only used for type-casting to document developer intent.\n */\nexport type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS = never\n\n/**\n * Sanitizes tool names for analytics logging to avoid PII exposure.\n *\n * MCP tool names follow the format `mcp__<server>__<tool>` and can reveal\n * user-specific server configurations, which is considered PII-medium.\n * This function redacts MCP tool names while preserving built-in tool names\n * (Bash, Read, Write, etc.) which are safe to log.\n *\n * @param toolName - The tool name to sanitize\n * @returns The original name for built-in tools, or 'mcp_tool' for MCP tools\n */\nexport function sanitizeToolNameForAnalytics(\n  toolName: string,\n): AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS {\n  if (toolName.startsWith('mcp__')) {\n    return 'mcp_tool' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS\n  }\n  return toolName as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS\n}\n\n/**\n * Check if detailed tool name logging is enabled for OTLP events.\n * When enabled, MCP server/tool names and Skill names are logged.\n * Disabled by default to protect PII (user-specific server configurations).\n *\n * Enable with OTEL_LOG_TOOL_DETAILS=1\n */\nexport function isToolDetailsLoggingEnabled(): boolean {\n  return isEnvTruthy(process.env.OTEL_LOG_TOOL_DETAILS)\n}\n\n/**\n * Check if detailed tool name logging (MCP server/tool names) is enabled\n * for analytics events.\n *\n * Per go/taxonomy, MCP names are medium PII. We log them for:\n * - Cowork (entrypoint=local-agent) \u2014 no ZDR concept, log all MCPs\n * - claude.ai-proxied connectors \u2014 always official (from claude.ai's list)\n * - Servers whose URL matches the official MCP registry \u2014 directory\n *   connectors added via `claude mcp add`, not customer-specific config\n *\n * Custom/user-configured MCPs stay sanitized (toolName='mcp_tool').\n */\nexport function isAnalyticsToolDetailsLoggingEnabled(\n  mcpServerType: string | undefined,\n  mcpServerBaseUrl: string | undefined,\n): boolean {\n  if (process.env.CLAUDE_CODE_ENTRYPOINT === 'local-agent') {\n    return true\n  }\n  if (mcpServerType === 'claudeai-proxy') {\n    return true\n  }\n  if (mcpServerBaseUrl && isOfficialMcpUrl(mcpServerBaseUrl)) {\n    return true\n  }\n  return false\n}\n\n/**\n * Built-in first-party MCP servers whose names are fixed reserved strings,\n * not user-configured \u2014 so logging them is not PII. Checked in addition to\n * isAnalyticsToolDetailsLoggingEnabled's transport/URL gates, which a stdio\n * built-in would otherwise fail.\n *\n * Feature-gated so the set is empty when the feature is off: the name\n * reservation (main.tsx, config.ts addMcpServer) is itself feature-gated, so\n * a user-configured 'computer-use' is possible in builds without the feature.\n */\n/* eslint-disable @typescript-eslint/no-require-imports */\nconst BUILTIN_MCP_SERVER_NAMES: ReadonlySet<string> = new Set(\n  feature('CHICAGO_MCP')\n    ? [\n        (\n          require('../../utils/computerUse/common.js') as typeof import('../../utils/computerUse/common.js')\n        ).COMPUTER_USE_MCP_SERVER_NAME,\n      ]\n    : [],\n)\n/* eslint-enable @typescript-eslint/no-require-imports */\n\n/**\n * Spreadable helper for logEvent payloads \u2014 returns {mcpServerName, mcpToolName}\n * if the gate passes, empty object otherwise. Consolidates the identical IIFE\n * pattern at each tengu_tool_use_* call site.\n */\nexport function mcpToolDetailsForAnalytics(\n  toolName: string,\n  mcpServerType: string | undefined,\n  mcpServerBaseUrl: string | undefined,\n): {\n  mcpServerName?: AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS\n  mcpToolName?: AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS\n} {\n  const details = extractMcpToolDetails(toolName)\n  if (!details) {\n    return {}\n  }\n  if (\n    !BUILTIN_MCP_SERVER_NAMES.has(details.serverName) &&\n    !isAnalyticsToolDetailsLoggingEnabled(mcpServerType, mcpServerBaseUrl)\n  ) {\n    return {}\n  }\n  return {\n    mcpServerName: details.serverName,\n    mcpToolName: details.mcpToolName,\n  }\n}\n\n/**\n * Extract MCP server and tool names from a full MCP tool name.\n * MCP tool names follow the format: mcp__<server>__<tool>\n *\n * @param toolName - The full tool name (e.g., 'mcp__slack__read_channel')\n * @returns Object with serverName and toolName, or undefined if not an MCP tool\n */\nexport function extractMcpToolDetails(toolName: string):\n  | {\n      serverName: AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS\n      mcpToolName: AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS\n    }\n  | undefined {\n  if (!toolName.startsWith('mcp__')) {\n    return undefined\n  }\n\n  // Format: mcp__<server>__<tool>\n  const parts = toolName.split('__')\n  if (parts.length < 3) {\n    return undefined\n  }\n\n  const serverName = parts[1]\n  // Tool name may contain __ so rejoin remaining parts\n  const mcpToolName = parts.slice(2).join('__')\n\n  if (!serverName || !mcpToolName) {\n    return undefined\n  }\n\n  return {\n    serverName:\n      serverName as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,\n    mcpToolName:\n      mcpToolName as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,\n  }\n}\n\n/**\n * Extract skill name from Skill tool input.\n *\n * @param toolName - The tool name (should be 'Skill')\n * @param input - The tool input containing the skill name\n * @returns The skill name if this is a Skill tool call, undefined otherwise\n */\nexport function extractSkillName(\n  toolName: string,\n  input: unknown,\n): AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS | undefined {\n  if (toolName !== 'Skill') {\n    return undefined\n  }\n\n  if (\n    typeof input === 'object' &&\n    input !== null &&\n    'skill' in input &&\n    typeof (input as { skill: unknown }).skill === 'string'\n  ) {\n    return (input as { skill: string })\n      .skill as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS\n  }\n\n  return undefined\n}\n\nconst TOOL_INPUT_STRING_TRUNCATE_AT = 512\nconst TOOL_INPUT_STRING_TRUNCATE_TO = 128\nconst TOOL_INPUT_MAX_JSON_CHARS = 4 * 1024\nconst TOOL_INPUT_MAX_COLLECTION_ITEMS = 20\nconst TOOL_INPUT_MAX_DEPTH = 2\n\nfunction truncateToolInputValue(value: unknown, depth = 0): unknown {\n  if (typeof value === 'string') {\n    if (value.length > TOOL_INPUT_STRING_TRUNCATE_AT) {\n      return `${value.slice(0, TOOL_INPUT_STRING_TRUNCATE_TO)}\u2026[${value.length} chars]`\n    }\n    return value\n  }\n  if (\n    typeof value === 'number' ||\n    typeof value === 'boolean' ||\n    value === null ||\n    value === undefined\n  ) {\n    return value\n  }\n  if (depth >= TOOL_INPUT_MAX_DEPTH) {\n    return '<nested>'\n  }\n  if (Array.isArray(value)) {\n    const mapped = value\n      .slice(0, TOOL_INPUT_MAX_COLLECTION_ITEMS)\n      .map(v => truncateToolInputValue(v, depth + 1))\n    if (value.length > TOOL_INPUT_MAX_COLLECTION_ITEMS) {\n      mapped.push(`\u2026[${value.length} items]`)\n    }\n    return mapped\n  }\n  if (typeof value === 'object') {\n    const entries = Object.entries(value as Record<string, unknown>)\n      // Skip internal marker keys (e.g. _simulatedSedEdit re-introduced by\n      // SedEditPermissionRequest) so they don't leak into telemetry.\n      .filter(([k]) => !k.startsWith('_'))\n    const mapped = entries\n      .slice(0, TOOL_INPUT_MAX_COLLECTION_ITEMS)\n      .map(([k, v]) => [k, truncateToolInputValue(v, depth + 1)])\n    if (entries.length > TOOL_INPUT_MAX_COLLECTION_ITEMS) {\n      mapped.push(['\u2026', `${entries.length} keys`])\n    }\n    return Object.fromEntries(mapped)\n  }\n  return String(value)\n}\n\n/**\n * Serialize a tool's input arguments for the OTel tool_result event.\n * Truncates long strings and deep nesting to keep the output bounded while\n * preserving forensically useful fields like file paths, URLs, and MCP args.\n * Returns undefined when OTEL_LOG_TOOL_DETAILS is not enabled.\n */\nexport function extractToolInputForTelemetry(\n  input: unknown,\n): string | undefined {\n  if (!isToolDetailsLoggingEnabled()) {\n    return undefined\n  }\n  const truncated = truncateToolInputValue(input)\n  let json = jsonStringify(truncated)\n  if (json.length > TOOL_INPUT_MAX_JSON_CHARS) {\n    json = json.slice(0, TOOL_INPUT_MAX_JSON_CHARS) + '\u2026[truncated]'\n  }\n  return json\n}\n\n/**\n * Maximum length for file extensions to be logged.\n * Extensions longer than this are considered potentially sensitive\n * (e.g., hash-based filenames like \"key-hash-abcd-123-456\") and\n * will be replaced with 'other'.\n */\nconst MAX_FILE_EXTENSION_LENGTH = 10\n\n/**\n * Extracts and sanitizes a file extension for analytics logging.\n *\n * Uses Node's path.extname for reliable cross-platform extension extraction.\n * Returns 'other' for extensions exceeding MAX_FILE_EXTENSION_LENGTH to avoid\n * logging potentially sensitive data (like hash-based filenames).\n *\n * @param filePath - The file path to extract the extension from\n * @returns The sanitized extension, 'other' for long extensions, or undefined if no extension\n */\nexport function getFileExtensionForAnalytics(\n  filePath: string,\n): AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS | undefined {\n  const ext = extname(filePath).toLowerCase()\n  if (!ext || ext === '.') {\n    return undefined\n  }\n\n  const extension = ext.slice(1) // remove leading dot\n  if (extension.length > MAX_FILE_EXTENSION_LENGTH) {\n    return 'other' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS\n  }\n\n  return extension as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS\n}\n\n/** Allow list of commands we extract file extensions from. */\nconst FILE_COMMANDS = new Set([\n  'rm',\n  'mv',\n  'cp',\n  'touch',\n  'mkdir',\n  'chmod',\n  'chown',\n  'cat',\n  'head',\n  'tail',\n  'sort',\n  'stat',\n  'diff',\n  'wc',\n  'grep',\n  'rg',\n  'sed',\n])\n\n/** Regex to split bash commands on compound operators (&&, ||, ;, |). */\nconst COMPOUND_OPERATOR_REGEX = /\\s*(?:&&|\\|\\||[;|])\\s*/\n\n/** Regex to split on whitespace. */\nconst WHITESPACE_REGEX = /\\s+/\n\n/**\n * Extracts file extensions from a bash command for analytics.\n * Best-effort: splits on operators and whitespace, extracts extensions\n * from non-flag args of allowed commands. No heavy shell parsing needed\n * because grep patterns and sed scripts rarely resemble file extensions.\n */\nexport function getFileExtensionsFromBashCommand(\n  command: string,\n  simulatedSedEditFilePath?: string,\n): AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS | undefined {\n  if (!command.includes('.') && !simulatedSedEditFilePath) return undefined\n\n  let result: string | undefined\n  const seen = new Set<string>()\n\n  if (simulatedSedEditFilePath) {\n    const ext = getFileExtensionForAnalytics(simulatedSedEditFilePath)\n    if (ext) {\n      seen.add(ext)\n      result = ext\n    }\n  }\n\n  for (const subcmd of command.split(COMPOUND_OPERATOR_REGEX)) {\n    if (!subcmd) continue\n    const tokens = subcmd.split(WHITESPACE_REGEX)\n    if (tokens.length < 2) continue\n\n    const firstToken = tokens[0]!\n    const slashIdx = firstToken.lastIndexOf('/')\n    const baseCmd = slashIdx >= 0 ? firstToken.slice(slashIdx + 1) : firstToken\n    if (!FILE_COMMANDS.has(baseCmd)) continue\n\n    for (let i = 1; i < tokens.length; i++) {\n      const arg = tokens[i]!\n      if (arg.charCodeAt(0) === 45 /* - */) continue\n      const ext = getFileExtensionForAnalytics(arg)\n      if (ext && !seen.has(ext)) {\n        seen.add(ext)\n        result = result ? result + ',' + ext : ext\n      }\n    }\n  }\n\n  if (!result) return undefined\n  return result as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS\n}\n\n/**\n * Environment context metadata\n */\nexport type EnvContext = {\n  platform: string\n  platformRaw: string\n  arch: string\n  nodeVersion: string\n  terminal: string | null\n  packageManagers: string\n  runtimes: string\n  isRunningWithBun: boolean\n  isCi: boolean\n  isClaubbit: boolean\n  isClaudeCodeRemote: boolean\n  isLocalAgentMode: boolean\n  isConductor: boolean\n  remoteEnvironmentType?: string\n  coworkerType?: string\n  claudeCodeContainerId?: string\n  claudeCodeRemoteSessionId?: string\n  tags?: string\n  isGithubAction: boolean\n  isClaudeCodeAction: boolean\n  isClaudeAiAuth: boolean\n  version: string\n  versionBase?: string\n  buildTime: string\n  deploymentEnvironment: string\n  githubEventName?: string\n  githubActionsRunnerEnvironment?: string\n  githubActionsRunnerOs?: string\n  githubActionRef?: string\n  wslVersion?: string\n  linuxDistroId?: string\n  linuxDistroVersion?: string\n  linuxKernel?: string\n  vcs?: string\n}\n\n/**\n * Process metrics included with all analytics events.\n */\nexport type ProcessMetrics = {\n  uptime: number\n  rss: number\n  heapTotal: number\n  heapUsed: number\n  external: number\n  arrayBuffers: number\n  constrainedMemory: number | undefined\n  cpuUsage: NodeJS.CpuUsage\n  cpuPercent: number | undefined\n}\n\n/**\n * Core event metadata shared across all analytics systems\n */\nexport type EventMetadata = {\n  model: string\n  sessionId: string\n  userType: string\n  betas?: string\n  envContext: EnvContext\n  entrypoint?: string\n  agentSdkVersion?: string\n  isInteractive: string\n  clientType: string\n  processMetrics?: ProcessMetrics\n  sweBenchRunId: string\n  sweBenchInstanceId: string\n  sweBenchTaskId: string\n  // Swarm/team agent identification for analytics attribution\n  agentId?: string // CLAUDE_CODE_AGENT_ID (format: agentName@teamName) or subagent UUID\n  parentSessionId?: string // CLAUDE_CODE_PARENT_SESSION_ID (team lead's session)\n  agentType?: 'teammate' | 'subagent' | 'standalone' // Distinguishes swarm teammates, Agent tool subagents, and standalone agents\n  teamName?: string // Team name for swarm agents (from env var or AsyncLocalStorage)\n  subscriptionType?: string // OAuth subscription tier (max, pro, enterprise, team)\n  rh?: string // Hashed repo remote URL (first 16 chars of SHA256), for joining with server-side data\n  kairosActive?: true // KAIROS assistant mode active (ant-only; set in main.tsx after gate check)\n  skillMode?: 'discovery' | 'coach' | 'discovery_and_coach' // Which skill surfacing mechanism(s) are gated on (ant-only; for BQ session segmentation)\n  observerMode?: 'backseat' | 'skillcoach' | 'both' // Which observer classifiers are gated on (ant-only; for BQ cohort splits on tengu_backseat_* events)\n}\n\n/**\n * Options for enriching event metadata\n */\nexport type EnrichMetadataOptions = {\n  // Model to use, falls back to getMainLoopModel() if not provided\n  model?: unknown\n  // Explicit betas string (already joined)\n  betas?: unknown\n  // Additional metadata to include (optional)\n  additionalMetadata?: Record<string, unknown>\n}\n\n/**\n * Get agent identification for analytics.\n * Priority: AsyncLocalStorage context (subagents) > env vars (swarm teammates)\n */\nfunction getAgentIdentification(): {\n  agentId?: string\n  parentSessionId?: string\n  agentType?: 'teammate' | 'subagent' | 'standalone'\n  teamName?: string\n} {\n  // Check AsyncLocalStorage first (for subagents running in same process)\n  const agentContext = getAgentContext()\n  if (agentContext) {\n    const result: ReturnType<typeof getAgentIdentification> = {\n      agentId: agentContext.agentId,\n      parentSessionId: agentContext.parentSessionId,\n      agentType: agentContext.agentType,\n    }\n    if (agentContext.agentType === 'teammate') {\n      result.teamName = agentContext.teamName\n    }\n    return result\n  }\n\n  // Fall back to swarm helpers (for swarm agents)\n  const agentId = getAgentId()\n  const parentSessionId = getTeammateParentSessionId()\n  const teamName = getTeamName()\n  const isSwarmAgent = isTeammate()\n  // For standalone agents (have agent ID but not a teammate), set agentType to 'standalone'\n  const agentType = isSwarmAgent\n    ? ('teammate' as const)\n    : agentId\n      ? ('standalone' as const)\n      : undefined\n  if (agentId || agentType || parentSessionId || teamName) {\n    return {\n      ...(agentId ? { agentId } : {}),\n      ...(agentType ? { agentType } : {}),\n      ...(parentSessionId ? { parentSessionId } : {}),\n      ...(teamName ? { teamName } : {}),\n    }\n  }\n\n  // Check bootstrap state for parent session ID (e.g., plan mode -> implementation)\n  const stateParentSessionId = getParentSessionIdFromState()\n  if (stateParentSessionId) {\n    return { parentSessionId: stateParentSessionId }\n  }\n\n  return {}\n}\n\n/**\n * Extract base version from full version string. \"2.0.36-dev.20251107.t174150.sha2709699\" \u2192 \"2.0.36-dev\"\n */\nconst getVersionBase = memoize((): string | undefined => {\n  const match = MACRO.VERSION.match(/^\\d+\\.\\d+\\.\\d+(?:-[a-z]+)?/)\n  return match ? match[0] : undefined\n})\n\n/**\n * Builds the environment context object\n */\nconst buildEnvContext = memoize(async (): Promise<EnvContext> => {\n  const [packageManagers, runtimes, linuxDistroInfo, vcs] = await Promise.all([\n    env.getPackageManagers(),\n    env.getRuntimes(),\n    getLinuxDistroInfo(),\n    detectVcs(),\n  ])\n\n  return {\n    platform: getHostPlatformForAnalytics(),\n    // Raw process.platform so freebsd/openbsd/aix/sunos are visible in BQ.\n    // getHostPlatformForAnalytics() buckets those into 'linux'; here we want\n    // the truth. CLAUDE_CODE_HOST_PLATFORM still overrides for container/remote.\n    platformRaw: process.env.CLAUDE_CODE_HOST_PLATFORM || process.platform,\n    arch: env.arch,\n    nodeVersion: env.nodeVersion,\n    terminal: envDynamic.terminal,\n    packageManagers: packageManagers.join(','),\n    runtimes: runtimes.join(','),\n    isRunningWithBun: env.isRunningWithBun(),\n    isCi: isEnvTruthy(process.env.CI),\n    isClaubbit: isEnvTruthy(process.env.CLAUBBIT),\n    isClaudeCodeRemote: isEnvTruthy(process.env.CLAUDE_CODE_REMOTE),\n    isLocalAgentMode: process.env.CLAUDE_CODE_ENTRYPOINT === 'local-agent',\n    isConductor: env.isConductor(),\n    ...(process.env.CLAUDE_CODE_REMOTE_ENVIRONMENT_TYPE && {\n      remoteEnvironmentType: process.env.CLAUDE_CODE_REMOTE_ENVIRONMENT_TYPE,\n    }),\n    // Gated by feature flag to prevent leaking \"coworkerType\" string in external builds\n    ...(feature('COWORKER_TYPE_TELEMETRY')\n      ? process.env.CLAUDE_CODE_COWORKER_TYPE\n        ? { coworkerType: process.env.CLAUDE_CODE_COWORKER_TYPE }\n        : {}\n      : {}),\n    ...(process.env.CLAUDE_CODE_CONTAINER_ID && {\n      claudeCodeContainerId: process.env.CLAUDE_CODE_CONTAINER_ID,\n    }),\n    ...(process.env.CLAUDE_CODE_REMOTE_SESSION_ID && {\n      claudeCodeRemoteSessionId: process.env.CLAUDE_CODE_REMOTE_SESSION_ID,\n    }),\n    ...(process.env.CLAUDE_CODE_TAGS && {\n      tags: process.env.CLAUDE_CODE_TAGS,\n    }),\n    isGithubAction: isEnvTruthy(process.env.GITHUB_ACTIONS),\n    isClaudeCodeAction: isEnvTruthy(process.env.CLAUDE_CODE_ACTION),\n    isClaudeAiAuth: isClaudeAISubscriber(),\n    version: MACRO.VERSION,\n    versionBase: getVersionBase(),\n    buildTime: MACRO.BUILD_TIME,\n    deploymentEnvironment: env.detectDeploymentEnvironment(),\n    ...(isEnvTruthy(process.env.GITHUB_ACTIONS) && {\n      githubEventName: process.env.GITHUB_EVENT_NAME,\n      githubActionsRunnerEnvironment: process.env.RUNNER_ENVIRONMENT,\n      githubActionsRunnerOs: process.env.RUNNER_OS,\n      githubActionRef: process.env.GITHUB_ACTION_PATH?.includes(\n        'claude-code-action/',\n      )\n        ? process.env.GITHUB_ACTION_PATH.split('claude-code-action/')[1]\n        : undefined,\n    }),\n    ...(getWslVersion() && { wslVersion: getWslVersion() }),\n    ...(linuxDistroInfo ?? {}),\n    ...(vcs.length > 0 ? { vcs: vcs.join(',') } : {}),\n  }\n})\n\n// --\n// CPU% delta tracking \u2014 inherently process-global, same pattern as logBatch/flushTimer in datadog.ts\nlet prevCpuUsage: NodeJS.CpuUsage | null = null\nlet prevWallTimeMs: number | null = null\n\n/**\n * Builds process metrics object for all users.\n */\nfunction buildProcessMetrics(): ProcessMetrics | undefined {\n  try {\n    const mem = process.memoryUsage()\n    const cpu = process.cpuUsage()\n    const now = Date.now()\n\n    let cpuPercent: number | undefined\n    if (prevCpuUsage && prevWallTimeMs) {\n      const wallDeltaMs = now - prevWallTimeMs\n      if (wallDeltaMs > 0) {\n        const userDeltaUs = cpu.user - prevCpuUsage.user\n        const systemDeltaUs = cpu.system - prevCpuUsage.system\n        cpuPercent =\n          ((userDeltaUs + systemDeltaUs) / (wallDeltaMs * 1000)) * 100\n      }\n    }\n    prevCpuUsage = cpu\n    prevWallTimeMs = now\n\n    return {\n      uptime: process.uptime(),\n      rss: mem.rss,\n      heapTotal: mem.heapTotal,\n      heapUsed: mem.heapUsed,\n      external: mem.external,\n      arrayBuffers: mem.arrayBuffers,\n      // eslint-disable-next-line eslint-plugin-n/no-unsupported-features/node-builtins\n      constrainedMemory: process.constrainedMemory(),\n      cpuUsage: cpu,\n      cpuPercent,\n    }\n  } catch {\n    return undefined\n  }\n}\n\n/**\n * Get core event metadata shared across all analytics systems.\n *\n * This function collects environment, runtime, and context information\n * that should be included with all analytics events.\n *\n * @param options - Configuration options\n * @returns Promise resolving to enriched metadata object\n */\nexport async function getEventMetadata(\n  options: EnrichMetadataOptions = {},\n): Promise<EventMetadata> {\n  const model = options.model ? String(options.model) : getMainLoopModel()\n  const betas =\n    typeof options.betas === 'string'\n      ? options.betas\n      : getModelBetas(model).join(',')\n  const [envContext, repoRemoteHash] = await Promise.all([\n    buildEnvContext(),\n    getRepoRemoteHash(),\n  ])\n  const processMetrics = buildProcessMetrics()\n\n  const metadata: EventMetadata = {\n    model,\n    sessionId: getSessionId(),\n    userType: process.env.USER_TYPE || '',\n    ...(betas.length > 0 ? { betas: betas } : {}),\n    envContext,\n    ...(process.env.CLAUDE_CODE_ENTRYPOINT && {\n      entrypoint: process.env.CLAUDE_CODE_ENTRYPOINT,\n    }),\n    ...(process.env.CLAUDE_AGENT_SDK_VERSION && {\n      agentSdkVersion: process.env.CLAUDE_AGENT_SDK_VERSION,\n    }),\n    isInteractive: String(getIsInteractive()),\n    clientType: getClientType(),\n    ...(processMetrics && { processMetrics }),\n    sweBenchRunId: process.env.SWE_BENCH_RUN_ID || '',\n    sweBenchInstanceId: process.env.SWE_BENCH_INSTANCE_ID || '',\n    sweBenchTaskId: process.env.SWE_BENCH_TASK_ID || '',\n    // Swarm/team agent identification\n    // Priority: AsyncLocalStorage context (subagents) > env vars (swarm teammates)\n    ...getAgentIdentification(),\n    // Subscription tier for DAU-by-tier analytics\n    ...(getSubscriptionType() && {\n      subscriptionType: getSubscriptionType()!,\n    }),\n    // Assistant mode tag \u2014 lives outside memoized buildEnvContext() because\n    // setKairosActive() runs at main.tsx:~1648, after the first event may\n    // have already fired and memoized the env. Read fresh per-event instead.\n    ...(feature('KAIROS') && getKairosActive()\n      ? { kairosActive: true as const }\n      : {}),\n    // Repo remote hash for joining with server-side repo bundle data\n    ...(repoRemoteHash && { rh: repoRemoteHash }),\n  }\n\n  return metadata\n}\n\n\n/**\n * Core event metadata for 1P event logging (snake_case format).\n */\nexport type FirstPartyEventLoggingCoreMetadata = {\n  session_id: string\n  model: string\n  user_type: string\n  betas?: string\n  entrypoint?: string\n  agent_sdk_version?: string\n  is_interactive: boolean\n  client_type: string\n  swe_bench_run_id?: string\n  swe_bench_instance_id?: string\n  swe_bench_task_id?: string\n  // Swarm/team agent identification\n  agent_id?: string\n  parent_session_id?: string\n  agent_type?: 'teammate' | 'subagent' | 'standalone'\n  team_name?: string\n}\n\n/**\n * Complete event logging metadata format for 1P events.\n */\nexport type FirstPartyEventLoggingMetadata = {\n  env: EnvironmentMetadata\n  process?: string\n  // auth is a top-level field on ClaudeCodeInternalEvent (proto PublicApiAuth).\n  // account_id is intentionally omitted \u2014 only UUID fields are populated client-side.\n  auth?: PublicApiAuth\n  // core fields correspond to the top level of ClaudeCodeInternalEvent.\n  // They get directly exported to their individual columns in the BigQuery tables\n  core: FirstPartyEventLoggingCoreMetadata\n  // additional fields are populated in the additional_metadata field of the\n  // ClaudeCodeInternalEvent proto. Includes but is not limited to information\n  // that differs by event type.\n  additional: Record<string, unknown>\n}\n\n/**\n * Convert metadata to 1P event logging format (snake_case fields).\n *\n * The /api/event_logging/batch endpoint expects snake_case field names\n * for environment and core metadata.\n *\n * @param metadata - Core event metadata\n * @param additionalMetadata - Additional metadata to include\n * @returns Metadata formatted for 1P event logging\n */\nexport function to1PEventFormat(\n  metadata: EventMetadata,\n  userMetadata: CoreUserData,\n  additionalMetadata: Record<string, unknown> = {},\n): FirstPartyEventLoggingMetadata {\n  const {\n    envContext,\n    processMetrics,\n    rh,\n    kairosActive,\n    skillMode,\n    observerMode,\n    ...coreFields\n  } = metadata\n\n  // Convert envContext to snake_case.\n  // IMPORTANT: env is typed as the proto-generated EnvironmentMetadata so that\n  // adding a field here that the proto doesn't define is a compile error. The\n  // generated toJSON() serializer silently drops unknown keys \u2014 a hand-written\n  // parallel type previously let #11318, #13924, #19448, and coworker_type all\n  // ship fields that never reached BQ.\n  // Adding a field? Update the monorepo proto first (go/cc-logging):\n  //   event_schemas/.../claude_code/v1/claude_code_internal_event.proto\n  // then run `bun run generate:proto` here.\n  const env: EnvironmentMetadata = {\n    platform: envContext.platform,\n    platform_raw: envContext.platformRaw,\n    arch: envContext.arch,\n    node_version: envContext.nodeVersion,\n    terminal: envContext.terminal || 'unknown',\n    package_managers: envContext.packageManagers,\n    runtimes: envContext.runtimes,\n    is_running_with_bun: envContext.isRunningWithBun,\n    is_ci: envContext.isCi,\n    is_claubbit: envContext.isClaubbit,\n    is_claude_code_remote: envContext.isClaudeCodeRemote,\n    is_local_agent_mode: envContext.isLocalAgentMode,\n    is_conductor: envContext.isConductor,\n    is_github_action: envContext.isGithubAction,\n    is_claude_code_action: envContext.isClaudeCodeAction,\n    is_claude_ai_auth: envContext.isClaudeAiAuth,\n    version: envContext.version,\n    build_time: envContext.buildTime,\n    deployment_environment: envContext.deploymentEnvironment,\n  }\n\n  // Add optional env fields\n  if (envContext.remoteEnvironmentType) {\n    env.remote_environment_type = envContext.remoteEnvironmentType\n  }\n  if (feature('COWORKER_TYPE_TELEMETRY') && envContext.coworkerType) {\n    env.coworker_type = envContext.coworkerType\n  }\n  if (envContext.claudeCodeContainerId) {\n    env.claude_code_container_id = envContext.claudeCodeContainerId\n  }\n  if (envContext.claudeCodeRemoteSessionId) {\n    env.claude_code_remote_session_id = envContext.claudeCodeRemoteSessionId\n  }\n  if (envContext.tags) {\n    env.tags = envContext.tags\n      .split(',')\n      .map(t => t.trim())\n      .filter(Boolean)\n  }\n  if (envContext.githubEventName) {\n    env.github_event_name = envContext.githubEventName\n  }\n  if (envContext.githubActionsRunnerEnvironment) {\n    env.github_actions_runner_environment =\n      envContext.githubActionsRunnerEnvironment\n  }\n  if (envContext.githubActionsRunnerOs) {\n    env.github_actions_runner_os = envContext.githubActionsRunnerOs\n  }\n  if (envContext.githubActionRef) {\n    env.github_action_ref = envContext.githubActionRef\n  }\n  if (envContext.wslVersion) {\n    env.wsl_version = envContext.wslVersion\n  }\n  if (envContext.linuxDistroId) {\n    env.linux_distro_id = envContext.linuxDistroId\n  }\n  if (envContext.linuxDistroVersion) {\n    env.linux_distro_version = envContext.linuxDistroVersion\n  }\n  if (envContext.linuxKernel) {\n    env.linux_kernel = envContext.linuxKernel\n  }\n  if (envContext.vcs) {\n    env.vcs = envContext.vcs\n  }\n  if (envContext.versionBase) {\n    env.version_base = envContext.versionBase\n  }\n\n  // Convert core fields to snake_case\n  const core: FirstPartyEventLoggingCoreMetadata = {\n    session_id: coreFields.sessionId,\n    model: coreFields.model,\n    user_type: coreFields.userType,\n    is_interactive: coreFields.isInteractive === 'true',\n    client_type: coreFields.clientType,\n  }\n\n  // Add other core fields\n  if (coreFields.betas) {\n    core.betas = coreFields.betas\n  }\n  if (coreFields.entrypoint) {\n    core.entrypoint = coreFields.entrypoint\n  }\n  if (coreFields.agentSdkVersion) {\n    core.agent_sdk_version = coreFields.agentSdkVersion\n  }\n  if (coreFields.sweBenchRunId) {\n    core.swe_bench_run_id = coreFields.sweBenchRunId\n  }\n  if (coreFields.sweBenchInstanceId) {\n    core.swe_bench_instance_id = coreFields.sweBenchInstanceId\n  }\n  if (coreFields.sweBenchTaskId) {\n    core.swe_bench_task_id = coreFields.sweBenchTaskId\n  }\n  // Swarm/team agent identification\n  if (coreFields.agentId) {\n    core.agent_id = coreFields.agentId\n  }\n  if (coreFields.parentSessionId) {\n    core.parent_session_id = coreFields.parentSessionId\n  }\n  if (coreFields.agentType) {\n    core.agent_type = coreFields.agentType\n  }\n  if (coreFields.teamName) {\n    core.team_name = coreFields.teamName\n  }\n\n  // Map userMetadata to output fields.\n  // Based on src/utils/user.ts getUser(), but with fields present in other\n  // parts of ClaudeCodeInternalEvent deduplicated.\n  // Convert camelCase GitHubActionsMetadata to snake_case for 1P API\n  // Note: github_actions_metadata is placed inside env (EnvironmentMetadata)\n  // rather than at the top level of ClaudeCodeInternalEvent\n  if (userMetadata.githubActionsMetadata) {\n    const ghMeta = userMetadata.githubActionsMetadata\n    env.github_actions_metadata = {\n      actor_id: ghMeta.actorId,\n      repository_id: ghMeta.repositoryId,\n      repository_owner_id: ghMeta.repositoryOwnerId,\n    }\n  }\n\n  let auth: PublicApiAuth | undefined\n  if (userMetadata.accountUuid || userMetadata.organizationUuid) {\n    auth = {\n      account_uuid: userMetadata.accountUuid,\n      organization_uuid: userMetadata.organizationUuid,\n    }\n  }\n\n  return {\n    env,\n    ...(processMetrics && {\n      process: Buffer.from(jsonStringify(processMetrics)).toString('base64'),\n    }),\n    ...(auth && { auth }),\n    core,\n    additional: {\n      ...(rh && { rh }),\n      ...(kairosActive && { is_assistant_mode: true }),\n      ...(skillMode && { skill_mode: skillMode }),\n      ...(observerMode && { observer_mode: observerMode }),\n      ...additionalMetadata,\n    },\n  }\n}\n", "import type { HrTime } from '@opentelemetry/api'\nimport { type ExportResult, ExportResultCode } from '@opentelemetry/core'\nimport type {\n  LogRecordExporter,\n  ReadableLogRecord,\n} from '@opentelemetry/sdk-logs'\nimport axios from 'axios'\nimport { randomUUID } from 'crypto'\nimport { appendFile, mkdir, readdir, unlink, writeFile } from 'fs/promises'\nimport * as path from 'path'\nimport type { CoreUserData } from 'src/utils/user.js'\nimport {\n  getIsNonInteractiveSession,\n  getSessionId,\n} from '../../bootstrap/state.js'\nimport { ClaudeCodeInternalEvent } from '../../types/generated/events_mono/claude_code/v1/claude_code_internal_event.js'\nimport { GrowthbookExperimentEvent } from '../../types/generated/events_mono/growthbook/v1/growthbook_experiment_event.js'\nimport {\n  getClaudeAIOAuthTokens,\n  hasProfileScope,\n  isClaudeAISubscriber,\n} from '../../utils/auth.js'\nimport { checkHasTrustDialogAccepted } from '../../utils/config.js'\nimport { logForDebugging } from '../../utils/debug.js'\nimport { getClaudeConfigHomeDir } from '../../utils/envUtils.js'\nimport { errorMessage, isFsInaccessible, toError } from '../../utils/errors.js'\nimport { getAuthHeaders } from '../../utils/http.js'\nimport { readJSONLFile } from '../../utils/json.js'\nimport { logError } from '../../utils/log.js'\nimport { sleep } from '../../utils/sleep.js'\nimport { jsonStringify } from '../../utils/slowOperations.js'\nimport { getClaudeCodeUserAgent } from '../../utils/userAgent.js'\nimport { isOAuthTokenExpired } from '../oauth/client.js'\nimport { stripProtoFields } from './index.js'\nimport { type EventMetadata, to1PEventFormat } from './metadata.js'\n\n// Unique ID for this process run - used to isolate failed event files between runs\nconst BATCH_UUID = randomUUID()\n\n// File prefix for failed event storage\nconst FILE_PREFIX = '1p_failed_events.'\n\n// Storage directory for failed events - evaluated at runtime to respect CLAUDE_CONFIG_DIR in tests\nfunction getStorageDir(): string {\n  return path.join(getClaudeConfigHomeDir(), 'telemetry')\n}\n\n// API envelope - event_data is the JSON output from proto toJSON()\ntype FirstPartyEventLoggingEvent = {\n  event_type: 'ClaudeCodeInternalEvent' | 'GrowthbookExperimentEvent'\n  event_data: unknown\n}\n\ntype FirstPartyEventLoggingPayload = {\n  events: FirstPartyEventLoggingEvent[]\n}\n\n/**\n * Exporter for 1st-party event logging to /api/event_logging/batch.\n *\n * Export cycles are controlled by OpenTelemetry's BatchLogRecordProcessor, which\n * triggers export() when either:\n * - Time interval elapses (default: 5 seconds via scheduledDelayMillis)\n * - Batch size is reached (default: 200 events via maxExportBatchSize)\n *\n * This exporter adds resilience on top:\n * - Append-only log for failed events (concurrency-safe)\n * - Quadratic backoff retry for failed events, dropped after maxAttempts\n * - Immediate retry of queued events when any export succeeds (endpoint is healthy)\n * - Chunking large event sets into smaller batches\n * - Auth fallback: retries without auth on 401 errors\n */\nexport class FirstPartyEventLoggingExporter implements LogRecordExporter {\n  private readonly endpoint: string\n  private readonly timeout: number\n  private readonly maxBatchSize: number\n  private readonly skipAuth: boolean\n  private readonly batchDelayMs: number\n  private readonly baseBackoffDelayMs: number\n  private readonly maxBackoffDelayMs: number\n  private readonly maxAttempts: number\n  private readonly isKilled: () => boolean\n  private pendingExports: Promise<void>[] = []\n  private isShutdown = false\n  private readonly schedule: (\n    fn: () => Promise<void>,\n    delayMs: number,\n  ) => () => void\n  private cancelBackoff: (() => void) | null = null\n  private attempts = 0\n  private isRetrying = false\n  private lastExportErrorContext: string | undefined\n\n  constructor(\n    options: {\n      timeout?: number\n      maxBatchSize?: number\n      skipAuth?: boolean\n      batchDelayMs?: number\n      baseBackoffDelayMs?: number\n      maxBackoffDelayMs?: number\n      maxAttempts?: number\n      path?: string\n      baseUrl?: string\n      // Injected killswitch probe. Checked per-POST so that disabling the\n      // firstParty sink also stops backoff retries (not just new emits).\n      // Passed in rather than imported to avoid a cycle with firstPartyEventLogger.ts.\n      isKilled?: () => boolean\n      schedule?: (fn: () => Promise<void>, delayMs: number) => () => void\n    } = {},\n  ) {\n    // Default: prod, except when ANTHROPIC_BASE_URL is explicitly staging.\n    // Overridable via tengu_1p_event_batch_config.baseUrl.\n    const baseUrl =\n      options.baseUrl ||\n      (process.env.ANTHROPIC_BASE_URL === 'https://api-staging.anthropic.com'\n        ? 'https://api-staging.anthropic.com'\n        : 'https://api.anthropic.com')\n\n    this.endpoint = `${baseUrl}${options.path || '/api/event_logging/batch'}`\n\n    this.timeout = options.timeout || 10000\n    this.maxBatchSize = options.maxBatchSize || 200\n    this.skipAuth = options.skipAuth ?? false\n    this.batchDelayMs = options.batchDelayMs || 100\n    this.baseBackoffDelayMs = options.baseBackoffDelayMs || 500\n    this.maxBackoffDelayMs = options.maxBackoffDelayMs || 30000\n    this.maxAttempts = options.maxAttempts ?? 8\n    this.isKilled = options.isKilled ?? (() => false)\n    this.schedule =\n      options.schedule ??\n      ((fn, ms) => {\n        const t = setTimeout(fn, ms)\n        return () => clearTimeout(t)\n      })\n\n    // Retry any failed events from previous runs of this session (in background)\n    void this.retryPreviousBatches()\n  }\n\n  // Expose for testing\n  async getQueuedEventCount(): Promise<number> {\n    return (await this.loadEventsFromCurrentBatch()).length\n  }\n\n  // --- Storage helpers ---\n\n  private getCurrentBatchFilePath(): string {\n    return path.join(\n      getStorageDir(),\n      `${FILE_PREFIX}${getSessionId()}.${BATCH_UUID}.json`,\n    )\n  }\n\n  private async loadEventsFromFile(\n    filePath: string,\n  ): Promise<FirstPartyEventLoggingEvent[]> {\n    try {\n      return await readJSONLFile<FirstPartyEventLoggingEvent>(filePath)\n    } catch {\n      return []\n    }\n  }\n\n  private async loadEventsFromCurrentBatch(): Promise<\n    FirstPartyEventLoggingEvent[]\n  > {\n    return this.loadEventsFromFile(this.getCurrentBatchFilePath())\n  }\n\n  private async saveEventsToFile(\n    filePath: string,\n    events: FirstPartyEventLoggingEvent[],\n  ): Promise<void> {\n    try {\n      if (events.length === 0) {\n        try {\n          await unlink(filePath)\n        } catch {\n          // File doesn't exist, nothing to delete\n        }\n      } else {\n        // Ensure storage directory exists\n        await mkdir(getStorageDir(), { recursive: true })\n        // Write as JSON lines (one event per line)\n        const content = events.map(e => jsonStringify(e)).join('\\n') + '\\n'\n        await writeFile(filePath, content, 'utf8')\n      }\n    } catch (error) {\n      logError(error)\n    }\n  }\n\n  private async appendEventsToFile(\n    filePath: string,\n    events: FirstPartyEventLoggingEvent[],\n  ): Promise<void> {\n    if (events.length === 0) return\n    try {\n      // Ensure storage directory exists\n      await mkdir(getStorageDir(), { recursive: true })\n      // Append as JSON lines (one event per line) - atomic on most filesystems\n      const content = events.map(e => jsonStringify(e)).join('\\n') + '\\n'\n      await appendFile(filePath, content, 'utf8')\n    } catch (error) {\n      logError(error)\n    }\n  }\n\n  private async deleteFile(filePath: string): Promise<void> {\n    try {\n      await unlink(filePath)\n    } catch {\n      // File doesn't exist or can't be deleted, ignore\n    }\n  }\n\n  // --- Previous batch retry (startup) ---\n\n  private async retryPreviousBatches(): Promise<void> {\n    try {\n      const prefix = `${FILE_PREFIX}${getSessionId()}.`\n      let files: string[]\n      try {\n        files = (await readdir(getStorageDir()))\n          .filter((f: string) => f.startsWith(prefix) && f.endsWith('.json'))\n          .filter((f: string) => !f.includes(BATCH_UUID)) // Exclude current batch\n      } catch (e) {\n        if (isFsInaccessible(e)) return\n        throw e\n      }\n\n      for (const file of files) {\n        const filePath = path.join(getStorageDir(), file)\n        void this.retryFileInBackground(filePath)\n      }\n    } catch (error) {\n      logError(error)\n    }\n  }\n\n  private async retryFileInBackground(filePath: string): Promise<void> {\n    if (this.attempts >= this.maxAttempts) {\n      await this.deleteFile(filePath)\n      return\n    }\n\n    const events = await this.loadEventsFromFile(filePath)\n    if (events.length === 0) {\n      await this.deleteFile(filePath)\n      return\n    }\n\n    if (process.env.USER_TYPE === 'ant') {\n      logForDebugging(\n        `1P event logging: retrying ${events.length} events from previous batch`,\n      )\n    }\n\n    const failedEvents = await this.sendEventsInBatches(events)\n    if (failedEvents.length === 0) {\n      await this.deleteFile(filePath)\n      if (process.env.USER_TYPE === 'ant') {\n        logForDebugging('1P event logging: previous batch retry succeeded')\n      }\n    } else {\n      // Save only the failed events back (not all original events)\n      await this.saveEventsToFile(filePath, failedEvents)\n      if (process.env.USER_TYPE === 'ant') {\n        logForDebugging(\n          `1P event logging: previous batch retry failed, ${failedEvents.length} events remain`,\n        )\n      }\n    }\n  }\n\n  async export(\n    logs: ReadableLogRecord[],\n    resultCallback: (result: ExportResult) => void,\n  ): Promise<void> {\n    if (this.isShutdown) {\n      if (process.env.USER_TYPE === 'ant') {\n        logForDebugging(\n          '1P event logging export failed: Exporter has been shutdown',\n        )\n      }\n      resultCallback({\n        code: ExportResultCode.FAILED,\n        error: new Error('Exporter has been shutdown'),\n      })\n      return\n    }\n\n    const exportPromise = this.doExport(logs, resultCallback)\n    this.pendingExports.push(exportPromise)\n\n    // Clean up completed exports\n    void exportPromise.finally(() => {\n      const index = this.pendingExports.indexOf(exportPromise)\n      if (index > -1) {\n        void this.pendingExports.splice(index, 1)\n      }\n    })\n  }\n\n  private async doExport(\n    logs: ReadableLogRecord[],\n    resultCallback: (result: ExportResult) => void,\n  ): Promise<void> {\n    try {\n      // Filter for event logs only (by scope name)\n      const eventLogs = logs.filter(\n        log =>\n          log.instrumentationScope?.name === 'com.anthropic.claude_code.events',\n      )\n\n      if (eventLogs.length === 0) {\n        resultCallback({ code: ExportResultCode.SUCCESS })\n        return\n      }\n\n      // Transform new logs (failed events are retried independently via backoff)\n      const events = this.transformLogsToEvents(eventLogs).events\n\n      if (events.length === 0) {\n        resultCallback({ code: ExportResultCode.SUCCESS })\n        return\n      }\n\n      if (this.attempts >= this.maxAttempts) {\n        resultCallback({\n          code: ExportResultCode.FAILED,\n          error: new Error(\n            `Dropped ${events.length} events: max attempts (${this.maxAttempts}) reached`,\n          ),\n        })\n        return\n      }\n\n      // Send events\n      const failedEvents = await this.sendEventsInBatches(events)\n      this.attempts++\n\n      if (failedEvents.length > 0) {\n        await this.queueFailedEvents(failedEvents)\n        this.scheduleBackoffRetry()\n        const context = this.lastExportErrorContext\n          ? ` (${this.lastExportErrorContext})`\n          : ''\n        resultCallback({\n          code: ExportResultCode.FAILED,\n          error: new Error(\n            `Failed to export ${failedEvents.length} events${context}`,\n          ),\n        })\n        return\n      }\n\n      // Success - reset backoff and immediately retry any queued events\n      this.resetBackoff()\n      if ((await this.getQueuedEventCount()) > 0 && !this.isRetrying) {\n        void this.retryFailedEvents()\n      }\n      resultCallback({ code: ExportResultCode.SUCCESS })\n    } catch (error) {\n      if (process.env.USER_TYPE === 'ant') {\n        logForDebugging(\n          `1P event logging export failed: ${errorMessage(error)}`,\n        )\n      }\n      logError(error)\n      resultCallback({\n        code: ExportResultCode.FAILED,\n        error: toError(error),\n      })\n    }\n  }\n\n  private async sendEventsInBatches(\n    events: FirstPartyEventLoggingEvent[],\n  ): Promise<FirstPartyEventLoggingEvent[]> {\n    // Chunk events into batches\n    const batches: FirstPartyEventLoggingEvent[][] = []\n    for (let i = 0; i < events.length; i += this.maxBatchSize) {\n      batches.push(events.slice(i, i + this.maxBatchSize))\n    }\n\n    if (process.env.USER_TYPE === 'ant') {\n      logForDebugging(\n        `1P event logging: exporting ${events.length} events in ${batches.length} batch(es)`,\n      )\n    }\n\n    // Send each batch with delay between them. On first failure, assume the\n    // endpoint is down and short-circuit: queue the failed batch plus all\n    // remaining unsent batches without POSTing them. The backoff retry will\n    // probe again with a single batch next tick.\n    const failedBatchEvents: FirstPartyEventLoggingEvent[] = []\n    let lastErrorContext: string | undefined\n    for (let i = 0; i < batches.length; i++) {\n      const batch = batches[i]!\n      try {\n        await this.sendBatchWithRetry({ events: batch })\n      } catch (error) {\n        lastErrorContext = getAxiosErrorContext(error)\n        for (let j = i; j < batches.length; j++) {\n          failedBatchEvents.push(...batches[j]!)\n        }\n        if (process.env.USER_TYPE === 'ant') {\n          const skipped = batches.length - 1 - i\n          logForDebugging(\n            `1P event logging: batch ${i + 1}/${batches.length} failed (${lastErrorContext}); short-circuiting ${skipped} remaining batch(es)`,\n          )\n        }\n        break\n      }\n\n      if (i < batches.length - 1 && this.batchDelayMs > 0) {\n        await sleep(this.batchDelayMs)\n      }\n    }\n\n    if (failedBatchEvents.length > 0 && lastErrorContext) {\n      this.lastExportErrorContext = lastErrorContext\n    }\n\n    return failedBatchEvents\n  }\n\n  private async queueFailedEvents(\n    events: FirstPartyEventLoggingEvent[],\n  ): Promise<void> {\n    const filePath = this.getCurrentBatchFilePath()\n\n    // Append-only: just add new events to file (atomic on most filesystems)\n    await this.appendEventsToFile(filePath, events)\n\n    const context = this.lastExportErrorContext\n      ? ` (${this.lastExportErrorContext})`\n      : ''\n    const message = `1P event logging: ${events.length} events failed to export${context}`\n    logError(new Error(message))\n  }\n\n  private scheduleBackoffRetry(): void {\n    // Don't schedule if already retrying or shutdown\n    if (this.cancelBackoff || this.isRetrying || this.isShutdown) {\n      return\n    }\n\n    // Quadratic backoff (matching Statsig SDK): base * attempts\u00B2\n    const delay = Math.min(\n      this.baseBackoffDelayMs * this.attempts * this.attempts,\n      this.maxBackoffDelayMs,\n    )\n\n    if (process.env.USER_TYPE === 'ant') {\n      logForDebugging(\n        `1P event logging: scheduling backoff retry in ${delay}ms (attempt ${this.attempts})`,\n      )\n    }\n\n    this.cancelBackoff = this.schedule(async () => {\n      this.cancelBackoff = null\n      await this.retryFailedEvents()\n    }, delay)\n  }\n\n  private async retryFailedEvents(): Promise<void> {\n    const filePath = this.getCurrentBatchFilePath()\n\n    // Keep retrying while there are events and endpoint is healthy\n    while (!this.isShutdown) {\n      const events = await this.loadEventsFromFile(filePath)\n      if (events.length === 0) break\n\n      if (this.attempts >= this.maxAttempts) {\n        if (process.env.USER_TYPE === 'ant') {\n          logForDebugging(\n            `1P event logging: max attempts (${this.maxAttempts}) reached, dropping ${events.length} events`,\n          )\n        }\n        await this.deleteFile(filePath)\n        this.resetBackoff()\n        return\n      }\n\n      this.isRetrying = true\n\n      // Clear file before retry (we have events in memory now)\n      await this.deleteFile(filePath)\n\n      if (process.env.USER_TYPE === 'ant') {\n        logForDebugging(\n          `1P event logging: retrying ${events.length} failed events (attempt ${this.attempts + 1})`,\n        )\n      }\n\n      const failedEvents = await this.sendEventsInBatches(events)\n      this.attempts++\n\n      this.isRetrying = false\n\n      if (failedEvents.length > 0) {\n        // Write failures back to disk\n        await this.saveEventsToFile(filePath, failedEvents)\n        this.scheduleBackoffRetry()\n        return // Failed - wait for backoff\n      }\n\n      // Success - reset backoff and continue loop to drain any newly queued events\n      this.resetBackoff()\n      if (process.env.USER_TYPE === 'ant') {\n        logForDebugging('1P event logging: backoff retry succeeded')\n      }\n    }\n  }\n\n  private resetBackoff(): void {\n    this.attempts = 0\n    if (this.cancelBackoff) {\n      this.cancelBackoff()\n      this.cancelBackoff = null\n    }\n  }\n\n  private async sendBatchWithRetry(\n    payload: FirstPartyEventLoggingPayload,\n  ): Promise<void> {\n    if (this.isKilled()) {\n      // Throw so the caller short-circuits remaining batches and queues\n      // everything to disk. Zero network traffic while killed; the backoff\n      // timer keeps ticking and will resume POSTs as soon as the GrowthBook\n      // cache picks up the cleared flag.\n      throw new Error('firstParty sink killswitch active')\n    }\n\n    const baseHeaders: Record<string, string> = {\n      'Content-Type': 'application/json',\n      'User-Agent': getClaudeCodeUserAgent(),\n      'x-service-name': 'claude-code',\n    }\n\n    // Skip auth if trust hasn't been established yet\n    // This prevents executing apiKeyHelper commands before the trust dialog\n    // Non-interactive sessions implicitly have workspace trust\n    const hasTrust =\n      checkHasTrustDialogAccepted() || getIsNonInteractiveSession()\n    if (process.env.USER_TYPE === 'ant' && !hasTrust) {\n      logForDebugging('1P event logging: Trust not accepted')\n    }\n\n    // Skip auth when the OAuth token is expired or lacks user:profile\n    // scope (service key sessions). Falls through to unauthenticated send.\n    let shouldSkipAuth = this.skipAuth || !hasTrust\n    if (!shouldSkipAuth && isClaudeAISubscriber()) {\n      const tokens = getClaudeAIOAuthTokens()\n      if (!hasProfileScope()) {\n        shouldSkipAuth = true\n      } else if (tokens && isOAuthTokenExpired(tokens.expiresAt)) {\n        shouldSkipAuth = true\n        if (process.env.USER_TYPE === 'ant') {\n          logForDebugging(\n            '1P event logging: OAuth token expired, skipping auth to avoid 401',\n          )\n        }\n      }\n    }\n\n    // Try with auth headers first (unless trust not established or token is known to be expired)\n    const authResult = shouldSkipAuth\n      ? { headers: {}, error: 'trust not established or Oauth token expired' }\n      : getAuthHeaders()\n    const useAuth = !authResult.error\n\n    if (!useAuth && process.env.USER_TYPE === 'ant') {\n      logForDebugging(\n        `1P event logging: auth not available, sending without auth`,\n      )\n    }\n\n    const headers = useAuth\n      ? { ...baseHeaders, ...authResult.headers }\n      : baseHeaders\n\n    try {\n      const response = await axios.post(this.endpoint, payload, {\n        timeout: this.timeout,\n        headers,\n      })\n      this.logSuccess(payload.events.length, useAuth, response.data)\n      return\n    } catch (error) {\n      // Handle 401 by retrying without auth\n      if (\n        useAuth &&\n        axios.isAxiosError(error) &&\n        error.response?.status === 401\n      ) {\n        if (process.env.USER_TYPE === 'ant') {\n          logForDebugging(\n            '1P event logging: 401 auth error, retrying without auth',\n          )\n        }\n        const response = await axios.post(this.endpoint, payload, {\n          timeout: this.timeout,\n          headers: baseHeaders,\n        })\n        this.logSuccess(payload.events.length, false, response.data)\n        return\n      }\n\n      throw error\n    }\n  }\n\n  private logSuccess(\n    eventCount: number,\n    withAuth: boolean,\n    responseData: unknown,\n  ): void {\n    if (process.env.USER_TYPE === 'ant') {\n      logForDebugging(\n        `1P event logging: ${eventCount} events exported successfully${withAuth ? ' (with auth)' : ' (without auth)'}`,\n      )\n      logForDebugging(`API Response: ${jsonStringify(responseData, null, 2)}`)\n    }\n  }\n\n  private hrTimeToDate(hrTime: HrTime): Date {\n    const [seconds, nanoseconds] = hrTime\n    return new Date(seconds * 1000 + nanoseconds / 1000000)\n  }\n\n  private transformLogsToEvents(\n    logs: ReadableLogRecord[],\n  ): FirstPartyEventLoggingPayload {\n    const events: FirstPartyEventLoggingEvent[] = []\n\n    for (const log of logs) {\n      const attributes = log.attributes || {}\n\n      // Check if this is a GrowthBook experiment event\n      if (attributes.event_type === 'GrowthbookExperimentEvent') {\n        const timestamp = this.hrTimeToDate(log.hrTime)\n        const account_uuid = attributes.account_uuid as string | undefined\n        const organization_uuid = attributes.organization_uuid as\n          | string\n          | undefined\n        events.push({\n          event_type: 'GrowthbookExperimentEvent',\n          event_data: GrowthbookExperimentEvent.toJSON({\n            event_id: attributes.event_id as string,\n            timestamp,\n            experiment_id: attributes.experiment_id as string,\n            variation_id: attributes.variation_id as number,\n            environment: attributes.environment as string,\n            user_attributes: attributes.user_attributes as string,\n            experiment_metadata: attributes.experiment_metadata as string,\n            device_id: attributes.device_id as string,\n            session_id: attributes.session_id as string,\n            auth:\n              account_uuid || organization_uuid\n                ? { account_uuid, organization_uuid }\n                : undefined,\n          }),\n        })\n        continue\n      }\n\n      // Extract event name\n      const eventName =\n        (attributes.event_name as string) || (log.body as string) || 'unknown'\n\n      // Extract metadata objects directly (no JSON parsing needed)\n      const coreMetadata = attributes.core_metadata as EventMetadata | undefined\n      const userMetadata = attributes.user_metadata as CoreUserData\n      const eventMetadata = (attributes.event_metadata || {}) as Record<\n        string,\n        unknown\n      >\n\n      if (!coreMetadata) {\n        // Emit partial event if core metadata is missing\n        if (process.env.USER_TYPE === 'ant') {\n          logForDebugging(\n            `1P event logging: core_metadata missing for event ${eventName}`,\n          )\n        }\n        events.push({\n          event_type: 'ClaudeCodeInternalEvent',\n          event_data: ClaudeCodeInternalEvent.toJSON({\n            event_id: attributes.event_id as string | undefined,\n            event_name: eventName,\n            client_timestamp: this.hrTimeToDate(log.hrTime),\n            session_id: getSessionId(),\n            additional_metadata: Buffer.from(\n              jsonStringify({\n                transform_error: 'core_metadata attribute is missing',\n              }),\n            ).toString('base64'),\n          }),\n        })\n        continue\n      }\n\n      // Transform to 1P format\n      const formatted = to1PEventFormat(\n        coreMetadata,\n        userMetadata,\n        eventMetadata,\n      )\n\n      // _PROTO_* keys are PII-tagged values meant only for privileged BQ\n      // columns. Hoist known keys to proto fields, then defensively strip any\n      // remaining _PROTO_* so an unrecognized future key can't silently land\n      // in the general-access additional_metadata blob. sink.ts applies the\n      // same strip before Datadog; this closes the 1P side.\n      const {\n        _PROTO_skill_name,\n        _PROTO_plugin_name,\n        _PROTO_marketplace_name,\n        ...rest\n      } = formatted.additional\n      const additionalMetadata = stripProtoFields(rest)\n\n      events.push({\n        event_type: 'ClaudeCodeInternalEvent',\n        event_data: ClaudeCodeInternalEvent.toJSON({\n          event_id: attributes.event_id as string | undefined,\n          event_name: eventName,\n          client_timestamp: this.hrTimeToDate(log.hrTime),\n          device_id: attributes.user_id as string | undefined,\n          email: userMetadata?.email,\n          auth: formatted.auth,\n          ...formatted.core,\n          env: formatted.env,\n          process: formatted.process,\n          skill_name:\n            typeof _PROTO_skill_name === 'string'\n              ? _PROTO_skill_name\n              : undefined,\n          plugin_name:\n            typeof _PROTO_plugin_name === 'string'\n              ? _PROTO_plugin_name\n              : undefined,\n          marketplace_name:\n            typeof _PROTO_marketplace_name === 'string'\n              ? _PROTO_marketplace_name\n              : undefined,\n          additional_metadata:\n            Object.keys(additionalMetadata).length > 0\n              ? Buffer.from(jsonStringify(additionalMetadata)).toString(\n                  'base64',\n                )\n              : undefined,\n        }),\n      })\n    }\n\n    return { events }\n  }\n\n  async shutdown(): Promise<void> {\n    this.isShutdown = true\n    this.resetBackoff()\n    await this.forceFlush()\n    if (process.env.USER_TYPE === 'ant') {\n      logForDebugging('1P event logging exporter shutdown complete')\n    }\n  }\n\n  async forceFlush(): Promise<void> {\n    await Promise.all(this.pendingExports)\n    if (process.env.USER_TYPE === 'ant') {\n      logForDebugging('1P event logging exporter flush complete')\n    }\n  }\n}\n\nfunction getAxiosErrorContext(error: unknown): string {\n  if (!axios.isAxiosError(error)) {\n    return errorMessage(error)\n  }\n\n  const parts: string[] = []\n\n  const requestId = error.response?.headers?.['request-id']\n  if (requestId) {\n    parts.push(`request-id=${requestId}`)\n  }\n\n  if (error.response?.status) {\n    parts.push(`status=${error.response.status}`)\n  }\n\n  if (error.code) {\n    parts.push(`code=${error.code}`)\n  }\n\n  if (error.message) {\n    parts.push(error.message)\n  }\n\n  return parts.join(', ')\n}\n", "import { getDynamicConfig_CACHED_MAY_BE_STALE } from './growthbook.js'\n\n// Mangled name: per-sink analytics killswitch\nconst SINK_KILLSWITCH_CONFIG_NAME = 'tengu_frond_boric'\n\nexport type SinkName = 'datadog' | 'firstParty'\n\n/**\n * GrowthBook JSON config that disables individual analytics sinks.\n * Shape: { datadog?: boolean, firstParty?: boolean }\n * A value of true for a key stops all dispatch to that sink.\n * Default {} (nothing killed). Fail-open: missing/malformed config = sink stays on.\n *\n * NOTE: Must NOT be called from inside is1PEventLoggingEnabled() -\n * growthbook.ts:isGrowthBookEnabled() calls that, so a lookup here would recurse.\n * Call at per-event dispatch sites instead.\n */\nexport function isSinkKilled(sink: SinkName): boolean {\n  const config = getDynamicConfig_CACHED_MAY_BE_STALE<\n    Partial<Record<SinkName, boolean>>\n  >(SINK_KILLSWITCH_CONFIG_NAME, {})\n  // getFeatureValue_CACHED_MAY_BE_STALE guards on `!== undefined`, so a\n  // cached JSON null leaks through instead of falling back to {}.\n  return config?.[sink] === true\n}\n", "import type { AnyValueMap, Logger, logs } from '@opentelemetry/api-logs'\nimport { resourceFromAttributes } from '@opentelemetry/resources'\nimport {\n  BatchLogRecordProcessor,\n  LoggerProvider,\n} from '@opentelemetry/sdk-logs'\nimport {\n  ATTR_SERVICE_NAME,\n  ATTR_SERVICE_VERSION,\n} from '@opentelemetry/semantic-conventions'\nimport { randomUUID } from 'crypto'\nimport { isEqual } from 'lodash-es'\nimport { getOrCreateUserID } from '../../utils/config.js'\nimport { logForDebugging } from '../../utils/debug.js'\nimport { logError } from '../../utils/log.js'\nimport { getPlatform, getWslVersion } from '../../utils/platform.js'\nimport { jsonStringify } from '../../utils/slowOperations.js'\nimport { profileCheckpoint } from '../../utils/startupProfiler.js'\nimport { getCoreUserData } from '../../utils/user.js'\nimport { isAnalyticsDisabled } from './config.js'\nimport { FirstPartyEventLoggingExporter } from './firstPartyEventLoggingExporter.js'\nimport type { GrowthBookUserAttributes } from './growthbook.js'\nimport { getDynamicConfig_CACHED_MAY_BE_STALE } from './growthbook.js'\nimport { getEventMetadata } from './metadata.js'\nimport { isSinkKilled } from './sinkKillswitch.js'\n\n/**\n * Configuration for sampling individual event types.\n * Each event name maps to an object containing sample_rate (0-1).\n * Events not in the config are logged at 100% rate.\n */\nexport type EventSamplingConfig = {\n  [eventName: string]: {\n    sample_rate: number\n  }\n}\n\nconst EVENT_SAMPLING_CONFIG_NAME = 'tengu_event_sampling_config'\n/**\n * Get the event sampling configuration from GrowthBook.\n * Uses cached value if available, updates cache in background.\n */\nexport function getEventSamplingConfig(): EventSamplingConfig {\n  return getDynamicConfig_CACHED_MAY_BE_STALE<EventSamplingConfig>(\n    EVENT_SAMPLING_CONFIG_NAME,\n    {},\n  )\n}\n\n/**\n * Determine if an event should be sampled based on its sample rate.\n * Returns the sample rate if sampled, null if not sampled.\n *\n * @param eventName - Name of the event to check\n * @returns The sample_rate if event should be logged, null if it should be dropped\n */\nexport function shouldSampleEvent(eventName: string): number | null {\n  const config = getEventSamplingConfig()\n  const eventConfig = config[eventName]\n\n  // If no config for this event, log at 100% rate (no sampling)\n  if (!eventConfig) {\n    return null\n  }\n\n  const sampleRate = eventConfig.sample_rate\n\n  // Validate sample rate is in valid range\n  if (typeof sampleRate !== 'number' || sampleRate < 0 || sampleRate > 1) {\n    return null\n  }\n\n  // Sample rate of 1 means log everything (no need to add metadata)\n  if (sampleRate >= 1) {\n    return null\n  }\n\n  // Sample rate of 0 means drop everything\n  if (sampleRate <= 0) {\n    return 0\n  }\n\n  // Randomly decide whether to sample this event\n  return Math.random() < sampleRate ? sampleRate : 0\n}\n\nconst BATCH_CONFIG_NAME = 'tengu_1p_event_batch_config'\ntype BatchConfig = {\n  scheduledDelayMillis?: number\n  maxExportBatchSize?: number\n  maxQueueSize?: number\n  skipAuth?: boolean\n  maxAttempts?: number\n  path?: string\n  baseUrl?: string\n}\nfunction getBatchConfig(): BatchConfig {\n  return getDynamicConfig_CACHED_MAY_BE_STALE<BatchConfig>(\n    BATCH_CONFIG_NAME,\n    {},\n  )\n}\n\n// Module-local state for event logging (not exposed globally)\nlet firstPartyEventLogger: ReturnType<typeof logs.getLogger> | null = null\nlet firstPartyEventLoggerProvider: LoggerProvider | null = null\n// Last batch config used to construct the provider \u2014 used by\n// reinitialize1PEventLoggingIfConfigChanged to decide whether a rebuild is\n// needed when GrowthBook refreshes.\nlet lastBatchConfig: BatchConfig | null = null\n/**\n * Flush and shutdown the 1P event logger.\n * This should be called as the final step before process exit to ensure\n * all events (including late ones from API responses) are exported.\n */\nexport async function shutdown1PEventLogging(): Promise<void> {\n  if (!firstPartyEventLoggerProvider) {\n    return\n  }\n  try {\n    await firstPartyEventLoggerProvider.shutdown()\n    if (process.env.USER_TYPE === 'ant') {\n      logForDebugging('1P event logging: final shutdown complete')\n    }\n  } catch {\n    // Ignore shutdown errors\n  }\n}\n\n/**\n * Check if 1P event logging is enabled.\n * Respects the same opt-outs as other analytics sinks:\n * - Test environment\n * - Third-party cloud providers (Bedrock/Vertex)\n * - Global telemetry opt-outs\n * - Non-essential traffic disabled\n *\n * Note: Unlike BigQuery metrics, event logging does NOT check organization-level\n * metrics opt-out via API. It follows the same pattern as Statsig event logging.\n */\nexport function is1PEventLoggingEnabled(): boolean {\n  // Respect standard analytics opt-outs\n  return !isAnalyticsDisabled()\n}\n\n/**\n * Log a 1st-party event for internal analytics (async version).\n * Events are batched and exported to /api/event_logging/batch\n *\n * This enriches the event with core metadata (model, session, env context, etc.)\n * at log time, similar to logEventToStatsig.\n *\n * @param eventName - Name of the event (e.g., 'tengu_api_query')\n * @param metadata - Additional metadata for the event (intentionally no strings, to avoid accidentally logging code/filepaths)\n */\nasync function logEventTo1PAsync(\n  firstPartyEventLogger: Logger,\n  eventName: string,\n  metadata: Record<string, number | boolean | undefined> = {},\n): Promise<void> {\n  try {\n    // Enrich with core metadata at log time (similar to Statsig pattern)\n    const coreMetadata = await getEventMetadata({\n      model: metadata.model,\n      betas: metadata.betas,\n    })\n\n    // Build attributes - OTel supports nested objects natively via AnyValueMap\n    // Cast through unknown since our nested objects are structurally compatible\n    // with AnyValue but TS doesn't recognize it due to missing index signatures\n    const attributes = {\n      event_name: eventName,\n      event_id: randomUUID(),\n      // Pass objects directly - no JSON serialization needed\n      core_metadata: coreMetadata,\n      user_metadata: getCoreUserData(true),\n      event_metadata: metadata,\n    } as unknown as AnyValueMap\n\n    // Add user_id if available\n    const userId = getOrCreateUserID()\n    if (userId) {\n      attributes.user_id = userId\n    }\n\n    // Debug logging when debug mode is enabled\n    if (process.env.USER_TYPE === 'ant') {\n      logForDebugging(\n        `[ANT-ONLY] 1P event: ${eventName} ${jsonStringify(metadata, null, 0)}`,\n      )\n    }\n\n    // Emit log record\n    firstPartyEventLogger.emit({\n      body: eventName,\n      attributes,\n    })\n  } catch (e) {\n    if (process.env.NODE_ENV === 'development') {\n      throw e\n    }\n    if (process.env.USER_TYPE === 'ant') {\n      logError(e as Error)\n    }\n    // swallow\n  }\n}\n\n/**\n * Log a 1st-party event for internal analytics.\n * Events are batched and exported to /api/event_logging/batch\n *\n * @param eventName - Name of the event (e.g., 'tengu_api_query')\n * @param metadata - Additional metadata for the event (intentionally no strings, to avoid accidentally logging code/filepaths)\n */\nexport function logEventTo1P(\n  eventName: string,\n  metadata: Record<string, number | boolean | undefined> = {},\n): void {\n  if (!is1PEventLoggingEnabled()) {\n    return\n  }\n\n  if (!firstPartyEventLogger || isSinkKilled('firstParty')) {\n    return\n  }\n\n  // Fire and forget - don't block on metadata enrichment\n  void logEventTo1PAsync(firstPartyEventLogger, eventName, metadata)\n}\n\n/**\n * GrowthBook experiment event data for logging\n */\nexport type GrowthBookExperimentData = {\n  experimentId: string\n  variationId: number\n  userAttributes?: GrowthBookUserAttributes\n  experimentMetadata?: Record<string, unknown>\n}\n\n// api.anthropic.com only serves the \"production\" GrowthBook environment\n// (see starling/starling/cli/cli.py DEFAULT_ENVIRONMENTS). Staging and\n// development environments are not exported to the prod API.\nfunction getEnvironmentForGrowthBook(): string {\n  return 'production'\n}\n\n/**\n * Log a GrowthBook experiment assignment event to 1P.\n * Events are batched and exported to /api/event_logging/batch\n *\n * @param data - GrowthBook experiment assignment data\n */\nexport function logGrowthBookExperimentTo1P(\n  data: GrowthBookExperimentData,\n): void {\n  if (!is1PEventLoggingEnabled()) {\n    return\n  }\n\n  if (!firstPartyEventLogger || isSinkKilled('firstParty')) {\n    return\n  }\n\n  const userId = getOrCreateUserID()\n  const { accountUuid, organizationUuid } = getCoreUserData(true)\n\n  // Build attributes for GrowthbookExperimentEvent\n  const attributes = {\n    event_type: 'GrowthbookExperimentEvent',\n    event_id: randomUUID(),\n    experiment_id: data.experimentId,\n    variation_id: data.variationId,\n    ...(userId && { device_id: userId }),\n    ...(accountUuid && { account_uuid: accountUuid }),\n    ...(organizationUuid && { organization_uuid: organizationUuid }),\n    ...(data.userAttributes && {\n      session_id: data.userAttributes.sessionId,\n      user_attributes: jsonStringify(data.userAttributes),\n    }),\n    ...(data.experimentMetadata && {\n      experiment_metadata: jsonStringify(data.experimentMetadata),\n    }),\n    environment: getEnvironmentForGrowthBook(),\n  }\n\n  if (process.env.USER_TYPE === 'ant') {\n    logForDebugging(\n      `[ANT-ONLY] 1P GrowthBook experiment: ${data.experimentId} variation=${data.variationId}`,\n    )\n  }\n\n  firstPartyEventLogger.emit({\n    body: 'growthbook_experiment',\n    attributes,\n  })\n}\n\nconst DEFAULT_LOGS_EXPORT_INTERVAL_MS = 10000\nconst DEFAULT_MAX_EXPORT_BATCH_SIZE = 200\nconst DEFAULT_MAX_QUEUE_SIZE = 8192\n\n/**\n * Initialize 1P event logging infrastructure.\n * This creates a separate LoggerProvider for internal event logging,\n * independent of customer OTLP telemetry.\n *\n * This uses its own minimal resource configuration with just the attributes\n * we need for internal analytics (service name, version, platform info).\n */\nexport function initialize1PEventLogging(): void {\n  profileCheckpoint('1p_event_logging_start')\n  const enabled = is1PEventLoggingEnabled()\n\n  if (!enabled) {\n    if (process.env.USER_TYPE === 'ant') {\n      logForDebugging('1P event logging not enabled')\n    }\n    return\n  }\n\n  // Fetch batch processor configuration from GrowthBook dynamic config\n  // Uses cached value if available, refreshes in background\n  const batchConfig = getBatchConfig()\n  lastBatchConfig = batchConfig\n  profileCheckpoint('1p_event_after_growthbook_config')\n\n  const scheduledDelayMillis =\n    batchConfig.scheduledDelayMillis ||\n    parseInt(\n      process.env.OTEL_LOGS_EXPORT_INTERVAL ||\n        DEFAULT_LOGS_EXPORT_INTERVAL_MS.toString(),\n    )\n\n  const maxExportBatchSize =\n    batchConfig.maxExportBatchSize || DEFAULT_MAX_EXPORT_BATCH_SIZE\n\n  const maxQueueSize = batchConfig.maxQueueSize || DEFAULT_MAX_QUEUE_SIZE\n\n  // Build our own resource for 1P event logging with minimal attributes\n  const platform = getPlatform()\n  const attributes: Record<string, string> = {\n    [ATTR_SERVICE_NAME]: 'claude-code',\n    [ATTR_SERVICE_VERSION]: MACRO.VERSION,\n  }\n\n  // Add WSL-specific attributes if running on WSL\n  if (platform === 'wsl') {\n    const wslVersion = getWslVersion()\n    if (wslVersion) {\n      attributes['wsl.version'] = wslVersion\n    }\n  }\n\n  const resource = resourceFromAttributes(attributes)\n\n  // Create a new LoggerProvider with the EventLoggingExporter\n  // NOTE: This is kept separate from customer telemetry logs to ensure\n  // internal events don't leak to customer endpoints and vice versa.\n  // We don't register this globally - it's only used for internal event logging.\n  const eventLoggingExporter = new FirstPartyEventLoggingExporter({\n    maxBatchSize: maxExportBatchSize,\n    skipAuth: batchConfig.skipAuth,\n    maxAttempts: batchConfig.maxAttempts,\n    path: batchConfig.path,\n    baseUrl: batchConfig.baseUrl,\n    isKilled: () => isSinkKilled('firstParty'),\n  })\n  firstPartyEventLoggerProvider = new LoggerProvider({\n    resource,\n    processors: [\n      new BatchLogRecordProcessor(eventLoggingExporter, {\n        scheduledDelayMillis,\n        maxExportBatchSize,\n        maxQueueSize,\n      }),\n    ],\n  })\n\n  // Initialize event logger from our internal provider (NOT from global API)\n  // IMPORTANT: We must get the logger from our local provider, not logs.getLogger()\n  // because logs.getLogger() returns a logger from the global provider, which is\n  // separate and used for customer telemetry.\n  firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger(\n    'com.anthropic.claude_code.events',\n    MACRO.VERSION,\n  )\n}\n\n/**\n * Rebuild the 1P event logging pipeline if the batch config changed.\n * Register this with onGrowthBookRefresh so long-running sessions pick up\n * changes to batch size, delay, endpoint, etc.\n *\n * Event-loss safety:\n * 1. Null the logger first \u2014 concurrent logEventTo1P() calls hit the\n *    !firstPartyEventLogger guard and bail during the swap window. This drops\n *    a handful of events but prevents emitting to a draining provider.\n * 2. forceFlush() drains the old BatchLogRecordProcessor buffer to the\n *    exporter. Export failures go to disk at getCurrentBatchFilePath() which\n *    is keyed by module-level BATCH_UUID + sessionId \u2014 unchanged across\n *    reinit \u2014 so the NEW exporter's disk-backed retry picks them up.\n * 3. Swap to new provider/logger; old provider shutdown runs in background\n *    (buffer already drained, just cleanup).\n */\nexport async function reinitialize1PEventLoggingIfConfigChanged(): Promise<void> {\n  if (!is1PEventLoggingEnabled() || !firstPartyEventLoggerProvider) {\n    return\n  }\n\n  const newConfig = getBatchConfig()\n\n  if (isEqual(newConfig, lastBatchConfig)) {\n    return\n  }\n\n  if (process.env.USER_TYPE === 'ant') {\n    logForDebugging(\n      `1P event logging: ${BATCH_CONFIG_NAME} changed, reinitializing`,\n    )\n  }\n\n  const oldProvider = firstPartyEventLoggerProvider\n  const oldLogger = firstPartyEventLogger\n  firstPartyEventLogger = null\n\n  try {\n    await oldProvider.forceFlush()\n  } catch {\n    // Export failures are already on disk; new exporter will retry them.\n  }\n\n  firstPartyEventLoggerProvider = null\n  try {\n    initialize1PEventLogging()\n  } catch (e) {\n    // Restore so the next GrowthBook refresh can retry. oldProvider was\n    // only forceFlush()'d, not shut down \u2014 it's still functional. Without\n    // this, both stay null and the !firstPartyEventLoggerProvider gate at\n    // the top makes recovery impossible.\n    firstPartyEventLoggerProvider = oldProvider\n    firstPartyEventLogger = oldLogger\n    logError(e)\n    return\n  }\n\n  void oldProvider.shutdown().catch(() => {})\n}\n", "import { GrowthBook } from '@growthbook/growthbook'\nimport { isEqual, memoize } from 'lodash-es'\nimport {\n  getIsNonInteractiveSession,\n  getSessionTrustAccepted,\n} from '../../bootstrap/state.js'\nimport { getGrowthBookClientKey } from '../../constants/keys.js'\nimport {\n  checkHasTrustDialogAccepted,\n  getGlobalConfig,\n  saveGlobalConfig,\n} from '../../utils/config.js'\nimport { logForDebugging } from '../../utils/debug.js'\nimport { toError } from '../../utils/errors.js'\nimport { getAuthHeaders } from '../../utils/http.js'\nimport { logError } from '../../utils/log.js'\nimport { createSignal } from '../../utils/signal.js'\nimport { jsonStringify } from '../../utils/slowOperations.js'\nimport {\n  type GitHubActionsMetadata,\n  getUserForGrowthBook,\n} from '../../utils/user.js'\nimport {\n  is1PEventLoggingEnabled,\n  logGrowthBookExperimentTo1P,\n} from './firstPartyEventLogger.js'\n\n/**\n * User attributes sent to GrowthBook for targeting.\n * Uses UUID suffix (not Uuid) to align with GrowthBook conventions.\n */\nexport type GrowthBookUserAttributes = {\n  id: string\n  sessionId: string\n  deviceID: string\n  platform: 'win32' | 'darwin' | 'linux'\n  apiBaseUrlHost?: string\n  organizationUUID?: string\n  accountUUID?: string\n  userType?: string\n  subscriptionType?: string\n  rateLimitTier?: string\n  firstTokenTime?: number\n  email?: string\n  appVersion?: string\n  github?: GitHubActionsMetadata\n}\n\n/**\n * Malformed feature response from API that uses \"value\" instead of \"defaultValue\".\n * This is a workaround until the API is fixed.\n */\ntype MalformedFeatureDefinition = {\n  value?: unknown\n  defaultValue?: unknown\n  [key: string]: unknown\n}\n\nlet client: GrowthBook | null = null\n\n// Named handler refs so resetGrowthBook can remove them to prevent accumulation\nlet currentBeforeExitHandler: (() => void) | null = null\nlet currentExitHandler: (() => void) | null = null\n\n// Track whether auth was available when the client was created\n// This allows us to detect when we need to recreate with fresh auth headers\nlet clientCreatedWithAuth = false\n\n// Store experiment data from payload for logging exposures later\ntype StoredExperimentData = {\n  experimentId: string\n  variationId: number\n  inExperiment?: boolean\n  hashAttribute?: string\n  hashValue?: string\n}\nconst experimentDataByFeature = new Map<string, StoredExperimentData>()\n\n// Cache for remote eval feature values - workaround for SDK not respecting remoteEval response\n// The SDK's setForcedFeatures also doesn't work reliably with remoteEval\nconst remoteEvalFeatureValues = new Map<string, unknown>()\n\n// Track features accessed before init that need exposure logging\nconst pendingExposures = new Set<string>()\n\n// Track features that have already had their exposure logged this session (dedup)\n// This prevents firing duplicate exposure events when getFeatureValue_CACHED_MAY_BE_STALE\n// is called repeatedly in hot paths (e.g., isAutoMemoryEnabled in render loops)\nconst loggedExposures = new Set<string>()\n\n// Track re-initialization promise for security gate checks\n// When GrowthBook is re-initializing (e.g., after auth change), security gate checks\n// should wait for init to complete to avoid returning stale values\nlet reinitializingPromise: Promise<unknown> | null = null\n\n// Listeners notified when GrowthBook feature values refresh (initial init or\n// periodic refresh). Use for systems that bake feature values into long-lived\n// objects at construction time (e.g. firstPartyEventLogger reads\n// tengu_1p_event_batch_config once and builds a LoggerProvider with it) and\n// need to rebuild when config changes. Per-call readers like\n// getEventSamplingConfig / isSinkKilled don't need this \u2014 they're already\n// reactive.\n//\n// NOT cleared by resetGrowthBook \u2014 subscribers register once (typically in\n// init.ts) and must survive auth-change resets.\ntype GrowthBookRefreshListener = () => void | Promise<void>\nconst refreshed = createSignal()\n\n/** Call a listener with sync-throw and async-rejection both routed to logError. */\nfunction callSafe(listener: GrowthBookRefreshListener): void {\n  try {\n    // Promise.resolve() normalizes sync returns and Promises so both\n    // sync throws (caught by outer try) and async rejections (caught\n    // by .catch) hit logError. Without the .catch, an async listener\n    // that rejects becomes an unhandled rejection \u2014 the try/catch\n    // only sees the Promise, not its eventual rejection.\n    void Promise.resolve(listener()).catch(e => {\n      logError(e)\n    })\n  } catch (e) {\n    logError(e)\n  }\n}\n\n/**\n * Register a callback to fire when GrowthBook feature values refresh.\n * Returns an unsubscribe function.\n *\n * If init has already completed with features by the time this is called\n * (remoteEvalFeatureValues is populated), the listener fires once on the\n * next microtask. This catch-up handles the race where GB's network response\n * lands before the REPL's useEffect commits \u2014 on external builds with fast\n * networks and MCP-heavy configs, init can finish in ~100ms while REPL mount\n * takes ~600ms (see #20951 external-build trace at 30.540 vs 31.046).\n *\n * Change detection is on the subscriber: the callback fires on every refresh;\n * use isEqual against your last-seen config to decide whether to act.\n */\nexport function onGrowthBookRefresh(\n  listener: GrowthBookRefreshListener,\n): () => void {\n  let subscribed = true\n  const unsubscribe = refreshed.subscribe(() => callSafe(listener))\n  if (remoteEvalFeatureValues.size > 0) {\n    queueMicrotask(() => {\n      // Re-check: listener may have been removed, or resetGrowthBook may have\n      // cleared the Map, between registration and this microtask running.\n      if (subscribed && remoteEvalFeatureValues.size > 0) {\n        callSafe(listener)\n      }\n    })\n  }\n  return () => {\n    subscribed = false\n    unsubscribe()\n  }\n}\n\n/**\n * Parse env var overrides for GrowthBook features.\n * Set CLAUDE_INTERNAL_FC_OVERRIDES to a JSON object mapping feature keys to values\n * to bypass remote eval and disk cache. Useful for eval harnesses that need to\n * test specific feature flag configurations. Only active when USER_TYPE is 'ant'.\n *\n * Example: CLAUDE_INTERNAL_FC_OVERRIDES='{\"my_feature\": true, \"my_config\": {\"key\": \"val\"}}'\n */\nlet envOverrides: Record<string, unknown> | null = null\nlet envOverridesParsed = false\n\nfunction getEnvOverrides(): Record<string, unknown> | null {\n  if (!envOverridesParsed) {\n    envOverridesParsed = true\n    if (process.env.USER_TYPE === 'ant') {\n      const raw = process.env.CLAUDE_INTERNAL_FC_OVERRIDES\n      if (raw) {\n        try {\n          envOverrides = JSON.parse(raw) as Record<string, unknown>\n          logForDebugging(\n            `GrowthBook: Using env var overrides for ${Object.keys(envOverrides!).length} features: ${Object.keys(envOverrides!).join(', ')}`,\n          )\n        } catch {\n          logError(\n            new Error(\n              `GrowthBook: Failed to parse CLAUDE_INTERNAL_FC_OVERRIDES: ${raw}`,\n            ),\n          )\n        }\n      }\n    }\n  }\n  return envOverrides\n}\n\n/**\n * Check if a feature has an env-var override (CLAUDE_INTERNAL_FC_OVERRIDES).\n * When true, _CACHED_MAY_BE_STALE will return the override without touching\n * disk or network \u2014 callers can skip awaiting init for that feature.\n */\nexport function hasGrowthBookEnvOverride(feature: string): boolean {\n  const overrides = getEnvOverrides()\n  return overrides !== null && feature in overrides\n}\n\n/**\n * Local config overrides set via /config Gates tab (ant-only). Checked after\n * env-var overrides \u2014 env wins so eval harnesses remain deterministic. Unlike\n * getEnvOverrides this is not memoized: the user can change overrides at\n * runtime, and getGlobalConfig() is already memory-cached (pointer-chase)\n * until the next saveGlobalConfig() invalidates it.\n */\nfunction getConfigOverrides(): Record<string, unknown> | undefined {\n  if (process.env.USER_TYPE !== 'ant') return undefined\n  try {\n    return getGlobalConfig().growthBookOverrides\n  } catch {\n    // getGlobalConfig() throws before configReadingAllowed is set (early\n    // main.tsx startup path). Same degrade as the disk-cache fallback below.\n    return undefined\n  }\n}\n\n/**\n * Enumerate all known GrowthBook features and their current resolved values\n * (not including overrides). In-memory payload first, disk cache fallback \u2014\n * same priority as the getters. Used by the /config Gates tab.\n */\nexport function getAllGrowthBookFeatures(): Record<string, unknown> {\n  if (remoteEvalFeatureValues.size > 0) {\n    return Object.fromEntries(remoteEvalFeatureValues)\n  }\n  return getGlobalConfig().cachedGrowthBookFeatures ?? {}\n}\n\nexport function getGrowthBookConfigOverrides(): Record<string, unknown> {\n  return getConfigOverrides() ?? {}\n}\n\n/**\n * Set or clear a single config override. Pass undefined to clear.\n * Fires onGrowthBookRefresh listeners so systems that bake gate values into\n * long-lived objects (useMainLoopModel, useSkillsChange, etc.) rebuild \u2014\n * otherwise overriding e.g. tengu_ant_model_override wouldn't actually\n * change the model until the next periodic refresh.\n */\nexport function setGrowthBookConfigOverride(\n  feature: string,\n  value: unknown,\n): void {\n  if (process.env.USER_TYPE !== 'ant') return\n  try {\n    saveGlobalConfig(c => {\n      const current = c.growthBookOverrides ?? {}\n      if (value === undefined) {\n        if (!(feature in current)) return c\n        const { [feature]: _, ...rest } = current\n        if (Object.keys(rest).length === 0) {\n          const { growthBookOverrides: __, ...configWithout } = c\n          return configWithout\n        }\n        return { ...c, growthBookOverrides: rest }\n      }\n      if (isEqual(current[feature], value)) return c\n      return { ...c, growthBookOverrides: { ...current, [feature]: value } }\n    })\n    // Subscribers do their own change detection (see onGrowthBookRefresh docs),\n    // so firing on a no-op write is fine.\n    refreshed.emit()\n  } catch (e) {\n    logError(e)\n  }\n}\n\nexport function clearGrowthBookConfigOverrides(): void {\n  if (process.env.USER_TYPE !== 'ant') return\n  try {\n    saveGlobalConfig(c => {\n      if (\n        !c.growthBookOverrides ||\n        Object.keys(c.growthBookOverrides).length === 0\n      ) {\n        return c\n      }\n      const { growthBookOverrides: _, ...rest } = c\n      return rest\n    })\n    refreshed.emit()\n  } catch (e) {\n    logError(e)\n  }\n}\n\n/**\n * Log experiment exposure for a feature if it has experiment data.\n * Deduplicates within a session - each feature is logged at most once.\n */\nfunction logExposureForFeature(feature: string): void {\n  // Skip if already logged this session (dedup)\n  if (loggedExposures.has(feature)) {\n    return\n  }\n\n  const expData = experimentDataByFeature.get(feature)\n  if (expData) {\n    loggedExposures.add(feature)\n    logGrowthBookExperimentTo1P({\n      experimentId: expData.experimentId,\n      variationId: expData.variationId,\n      userAttributes: getUserAttributes(),\n      experimentMetadata: {\n        feature_id: feature,\n      },\n    })\n  }\n}\n\n/**\n * Process a remote eval payload from the GrowthBook server and populate\n * local caches. Called after both initial client.init() and after\n * client.refreshFeatures() so that _BLOCKS_ON_INIT callers see fresh values\n * across the process lifetime, not just init-time snapshots.\n *\n * Without this running on refresh, remoteEvalFeatureValues freezes at its\n * init-time snapshot and getDynamicConfig_BLOCKS_ON_INIT returns stale values\n * for the entire process lifetime \u2014 which broke the tengu_max_version_config\n * kill switch for long-running sessions.\n */\nasync function processRemoteEvalPayload(\n  gbClient: GrowthBook,\n): Promise<boolean> {\n  // WORKAROUND: Transform remote eval response format\n  // The API returns { \"value\": ... } but SDK expects { \"defaultValue\": ... }\n  // TODO: Remove this once the API is fixed to return correct format\n  const payload = gbClient.getPayload()\n  // Empty object is truthy \u2014 without the length check, `{features: {}}`\n  // (transient server bug, truncated response) would pass, clear the maps\n  // below, return true, and syncRemoteEvalToDisk would wholesale-write `{}`\n  // to disk: total flag blackout for every process sharing ~/.claude.json.\n  if (!payload?.features || Object.keys(payload.features).length === 0) {\n    return false\n  }\n\n  // Clear before rebuild so features removed between refreshes don't\n  // leave stale ghost entries that short-circuit getFeatureValueInternal.\n  experimentDataByFeature.clear()\n\n  const transformedFeatures: Record<string, MalformedFeatureDefinition> = {}\n  for (const [key, feature] of Object.entries(payload.features)) {\n    const f = feature as MalformedFeatureDefinition\n    if ('value' in f && !('defaultValue' in f)) {\n      transformedFeatures[key] = {\n        ...f,\n        defaultValue: f.value,\n      }\n    } else {\n      transformedFeatures[key] = f\n    }\n\n    // Store experiment data for later logging when feature is accessed\n    if (f.source === 'experiment' && f.experimentResult) {\n      const expResult = f.experimentResult as {\n        variationId?: number\n      }\n      const exp = f.experiment as { key?: string } | undefined\n      if (exp?.key && expResult.variationId !== undefined) {\n        experimentDataByFeature.set(key, {\n          experimentId: exp.key,\n          variationId: expResult.variationId,\n        })\n      }\n    }\n  }\n  // Re-set the payload with transformed features\n  await gbClient.setPayload({\n    ...payload,\n    features: transformedFeatures,\n  })\n\n  // WORKAROUND: Cache the evaluated values directly from remote eval response.\n  // The SDK's evalFeature() tries to re-evaluate rules locally, ignoring the\n  // pre-evaluated 'value' from remoteEval. setForcedFeatures also doesn't work\n  // reliably. So we cache values ourselves and use them in getFeatureValueInternal.\n  remoteEvalFeatureValues.clear()\n  for (const [key, feature] of Object.entries(transformedFeatures)) {\n    // Under remoteEval:true the server pre-evaluates. Whether the answer\n    // lands in `value` (current API) or `defaultValue` (post-TODO API shape),\n    // it's the authoritative value for this user. Guarding on both keeps\n    // syncRemoteEvalToDisk correct across a partial or full API migration.\n    const v = 'value' in feature ? feature.value : feature.defaultValue\n    if (v !== undefined) {\n      remoteEvalFeatureValues.set(key, v)\n    }\n  }\n  return true\n}\n\n/**\n * Write the complete remoteEvalFeatureValues map to disk. Called exactly\n * once per successful processRemoteEvalPayload \u2014 never from a failure path,\n * so init-timeout poisoning is structurally impossible (the .catch() at init\n * never reaches here).\n *\n * Wholesale replace (not merge): features deleted server-side are dropped\n * from disk on the next successful payload. Ant builds \u2287 external, so\n * switching builds is safe \u2014 the write is always a complete answer for this\n * process's SDK key.\n */\nfunction syncRemoteEvalToDisk(): void {\n  const fresh = Object.fromEntries(remoteEvalFeatureValues)\n  const config = getGlobalConfig()\n  if (isEqual(config.cachedGrowthBookFeatures, fresh)) {\n    return\n  }\n  saveGlobalConfig(current => ({\n    ...current,\n    cachedGrowthBookFeatures: fresh,\n  }))\n}\n\n/**\n * Check if GrowthBook operations should be enabled\n */\nfunction isGrowthBookEnabled(): boolean {\n  // GrowthBook depends on 1P event logging.\n  return is1PEventLoggingEnabled()\n}\n\n/**\n * Hostname of ANTHROPIC_BASE_URL when it points at a non-Anthropic proxy.\n *\n * Enterprise-proxy deployments (Epic, Marble, etc.) typically use\n * apiKeyHelper auth, which means isAnthropicAuthEnabled() returns false and\n * organizationUUID/accountUUID/email are all absent from GrowthBook\n * attributes. Without this, there's no stable attribute to target them on\n * \u2014 only per-device IDs. See src/utils/auth.ts isAnthropicAuthEnabled().\n *\n * Returns undefined for unset/default (api.anthropic.com) so the attribute\n * is absent for direct-API users. Hostname only \u2014 no path/query/creds.\n */\nexport function getApiBaseUrlHost(): string | undefined {\n  const baseUrl = process.env.ANTHROPIC_BASE_URL\n  if (!baseUrl) return undefined\n  try {\n    const host = new URL(baseUrl).host\n    if (host === 'api.anthropic.com') return undefined\n    return host\n  } catch {\n    return undefined\n  }\n}\n\n/**\n * Get user attributes for GrowthBook from CoreUserData\n */\nfunction getUserAttributes(): GrowthBookUserAttributes {\n  const user = getUserForGrowthBook()\n\n  // For ants, always try to include email from OAuth config even if ANTHROPIC_API_KEY is set.\n  // This ensures GrowthBook targeting by email works regardless of auth method.\n  let email = user.email\n  if (!email && process.env.USER_TYPE === 'ant') {\n    email = getGlobalConfig().oauthAccount?.emailAddress\n  }\n\n  const apiBaseUrlHost = getApiBaseUrlHost()\n\n  const attributes = {\n    id: user.deviceId,\n    sessionId: user.sessionId,\n    deviceID: user.deviceId,\n    platform: user.platform,\n    ...(apiBaseUrlHost && { apiBaseUrlHost }),\n    ...(user.organizationUuid && { organizationUUID: user.organizationUuid }),\n    ...(user.accountUuid && { accountUUID: user.accountUuid }),\n    ...(user.userType && { userType: user.userType }),\n    ...(user.subscriptionType && { subscriptionType: user.subscriptionType }),\n    ...(user.rateLimitTier && { rateLimitTier: user.rateLimitTier }),\n    ...(user.firstTokenTime && { firstTokenTime: user.firstTokenTime }),\n    ...(email && { email }),\n    ...(user.appVersion && { appVersion: user.appVersion }),\n    ...(user.githubActionsMetadata && {\n      githubActionsMetadata: user.githubActionsMetadata,\n    }),\n  }\n  return attributes\n}\n\n/**\n * Get or create the GrowthBook client instance\n */\nconst getGrowthBookClient = memoize(\n  (): { client: GrowthBook; initialized: Promise<void> } | null => {\n    if (!isGrowthBookEnabled()) {\n      return null\n    }\n\n    const attributes = getUserAttributes()\n    const clientKey = getGrowthBookClientKey()\n    if (process.env.USER_TYPE === 'ant') {\n      logForDebugging(\n        `GrowthBook: Creating client with clientKey=${clientKey}, attributes: ${jsonStringify(attributes)}`,\n      )\n    }\n    const baseUrl =\n      process.env.USER_TYPE === 'ant'\n        ? process.env.CLAUDE_CODE_GB_BASE_URL || 'https://api.anthropic.com/'\n        : 'https://api.anthropic.com/'\n\n    // Skip auth if trust hasn't been established yet\n    // This prevents executing apiKeyHelper commands before the trust dialog\n    // Non-interactive sessions implicitly have workspace trust\n    // getSessionTrustAccepted() covers the case where the TrustDialog auto-resolved\n    // without persisting trust for the specific CWD (e.g., home directory) \u2014\n    // showSetupScreens() sets this after the trust dialog flow completes.\n    const hasTrust =\n      checkHasTrustDialogAccepted() ||\n      getSessionTrustAccepted() ||\n      getIsNonInteractiveSession()\n    const authHeaders = hasTrust\n      ? getAuthHeaders()\n      : { headers: {}, error: 'trust not established' }\n    const hasAuth = !authHeaders.error\n    clientCreatedWithAuth = hasAuth\n\n    // Capture in local variable so the init callback operates on THIS client,\n    // not a later client if reinitialization happens before init completes\n    const thisClient = new GrowthBook({\n      apiHost: baseUrl,\n      clientKey,\n      attributes,\n      remoteEval: true,\n      // Re-fetch when user ID or org changes (org change = login to different org)\n      cacheKeyAttributes: ['id', 'organizationUUID'],\n      // Add auth headers if available\n      ...(authHeaders.error\n        ? {}\n        : { apiHostRequestHeaders: authHeaders.headers }),\n      // Debug logging for Ants\n      ...(process.env.USER_TYPE === 'ant'\n        ? {\n            log: (msg: string, ctx: Record<string, unknown>) => {\n              logForDebugging(`GrowthBook: ${msg} ${jsonStringify(ctx)}`)\n            },\n          }\n        : {}),\n    })\n    client = thisClient\n\n    if (!hasAuth) {\n      // No auth available yet \u2014 skip HTTP init, rely on disk-cached values.\n      // initializeGrowthBook() will reset and re-create with auth when available.\n      return { client: thisClient, initialized: Promise.resolve() }\n    }\n\n    const initialized = thisClient\n      .init({ timeout: 5000 })\n      .then(async result => {\n        // Guard: if this client was replaced by a newer one, skip processing\n        if (client !== thisClient) {\n          if (process.env.USER_TYPE === 'ant') {\n            logForDebugging(\n              'GrowthBook: Skipping init callback for replaced client',\n            )\n          }\n          return\n        }\n\n        if (process.env.USER_TYPE === 'ant') {\n          logForDebugging(\n            `GrowthBook initialized successfully, source: ${result.source}, success: ${result.success}`,\n          )\n        }\n\n        const hadFeatures = await processRemoteEvalPayload(thisClient)\n        // Re-check: processRemoteEvalPayload yields at `await setPayload`.\n        // Microtask-only today (no encryption, no sticky-bucket service), but\n        // the guard at the top of this callback runs before that await;\n        // this runs after.\n        if (client !== thisClient) return\n\n        if (hadFeatures) {\n          for (const feature of pendingExposures) {\n            logExposureForFeature(feature)\n          }\n          pendingExposures.clear()\n          syncRemoteEvalToDisk()\n          // Notify subscribers: remoteEvalFeatureValues is populated and\n          // disk is freshly synced. _CACHED_MAY_BE_STALE reads memory first\n          // (#22295), so subscribers see fresh values immediately.\n          refreshed.emit()\n        }\n\n        // Log what features were loaded\n        if (process.env.USER_TYPE === 'ant') {\n          const features = thisClient.getFeatures()\n          if (features) {\n            const featureKeys = Object.keys(features)\n            logForDebugging(\n              `GrowthBook loaded ${featureKeys.length} features: ${featureKeys.slice(0, 10).join(', ')}${featureKeys.length > 10 ? '...' : ''}`,\n            )\n          }\n        }\n      })\n      .catch(error => {\n        if (process.env.USER_TYPE === 'ant') {\n          logError(toError(error))\n        }\n      })\n\n    // Register cleanup handlers for graceful shutdown (named refs so resetGrowthBook can remove them)\n    currentBeforeExitHandler = () => client?.destroy()\n    currentExitHandler = () => client?.destroy()\n    process.on('beforeExit', currentBeforeExitHandler)\n    process.on('exit', currentExitHandler)\n\n    return { client: thisClient, initialized }\n  },\n)\n\n/**\n * Initialize GrowthBook client (blocks until ready)\n */\nexport const initializeGrowthBook = memoize(\n  async (): Promise<GrowthBook | null> => {\n    let clientWrapper = getGrowthBookClient()\n    if (!clientWrapper) {\n      return null\n    }\n\n    // Check if auth has become available since the client was created\n    // If so, we need to recreate the client with fresh auth headers\n    // Only check if trust is established to avoid triggering apiKeyHelper before trust dialog\n    if (!clientCreatedWithAuth) {\n      const hasTrust =\n        checkHasTrustDialogAccepted() ||\n        getSessionTrustAccepted() ||\n        getIsNonInteractiveSession()\n      if (hasTrust) {\n        const currentAuth = getAuthHeaders()\n        if (!currentAuth.error) {\n          if (process.env.USER_TYPE === 'ant') {\n            logForDebugging(\n              'GrowthBook: Auth became available after client creation, reinitializing',\n            )\n          }\n          // Use resetGrowthBook to properly destroy old client and stop periodic refresh\n          // This prevents double-init where old client's init promise continues running\n          resetGrowthBook()\n          clientWrapper = getGrowthBookClient()\n          if (!clientWrapper) {\n            return null\n          }\n        }\n      }\n    }\n\n    await clientWrapper.initialized\n\n    // Set up periodic refresh after successful initialization\n    // This is called here (not separately) so it's always re-established after any reinit\n    setupPeriodicGrowthBookRefresh()\n\n    return clientWrapper.client\n  },\n)\n\n/**\n * Get a feature value with a default fallback - blocks until initialized.\n * @internal Used by both deprecated and cached functions.\n */\nasync function getFeatureValueInternal<T>(\n  feature: string,\n  defaultValue: T,\n  logExposure: boolean,\n): Promise<T> {\n  // Check env var overrides first (for eval harnesses)\n  const overrides = getEnvOverrides()\n  if (overrides && feature in overrides) {\n    return overrides[feature] as T\n  }\n  const configOverrides = getConfigOverrides()\n  if (configOverrides && feature in configOverrides) {\n    return configOverrides[feature] as T\n  }\n\n  if (!isGrowthBookEnabled()) {\n    return defaultValue\n  }\n\n  const growthBookClient = await initializeGrowthBook()\n  if (!growthBookClient) {\n    return defaultValue\n  }\n\n  // Use cached remote eval values if available (workaround for SDK bug)\n  let result: T\n  if (remoteEvalFeatureValues.has(feature)) {\n    result = remoteEvalFeatureValues.get(feature) as T\n  } else {\n    result = growthBookClient.getFeatureValue(feature, defaultValue) as T\n  }\n\n  // Log experiment exposure using stored experiment data\n  if (logExposure) {\n    logExposureForFeature(feature)\n  }\n\n  if (process.env.USER_TYPE === 'ant') {\n    logForDebugging(\n      `GrowthBook: getFeatureValue(\"${feature}\") = ${jsonStringify(result)}`,\n    )\n  }\n  return result\n}\n\n/**\n * @deprecated Use getFeatureValue_CACHED_MAY_BE_STALE instead, which is non-blocking.\n * This function blocks on GrowthBook initialization which can slow down startup.\n */\nexport async function getFeatureValue_DEPRECATED<T>(\n  feature: string,\n  defaultValue: T,\n): Promise<T> {\n  return getFeatureValueInternal(feature, defaultValue, true)\n}\n\n/**\n * Get a feature value from disk cache immediately. Pure read \u2014 disk is\n * populated by syncRemoteEvalToDisk on every successful payload (init +\n * periodic refresh), not by this function.\n *\n * This is the preferred method for startup-critical paths and sync contexts.\n * The value may be stale if the cache was written by a previous process.\n */\nexport function getFeatureValue_CACHED_MAY_BE_STALE<T>(\n  feature: string,\n  defaultValue: T,\n): T {\n  // Check env var overrides first (for eval harnesses)\n  const overrides = getEnvOverrides()\n  if (overrides && feature in overrides) {\n    return overrides[feature] as T\n  }\n  const configOverrides = getConfigOverrides()\n  if (configOverrides && feature in configOverrides) {\n    return configOverrides[feature] as T\n  }\n\n  if (!isGrowthBookEnabled()) {\n    return defaultValue\n  }\n\n  // Log experiment exposure if data is available, otherwise defer until after init\n  if (experimentDataByFeature.has(feature)) {\n    logExposureForFeature(feature)\n  } else {\n    pendingExposures.add(feature)\n  }\n\n  // In-memory payload is authoritative once processRemoteEvalPayload has run.\n  // Disk is also fresh by then (syncRemoteEvalToDisk runs synchronously inside\n  // init), so this is correctness-equivalent to the disk read below \u2014 but it\n  // skips the config JSON parse and is what onGrowthBookRefresh subscribers\n  // depend on to read fresh values the instant they're notified.\n  if (remoteEvalFeatureValues.has(feature)) {\n    return remoteEvalFeatureValues.get(feature) as T\n  }\n\n  // Fall back to disk cache (survives across process restarts)\n  try {\n    const cached = getGlobalConfig().cachedGrowthBookFeatures?.[feature]\n    return cached !== undefined ? (cached as T) : defaultValue\n  } catch {\n    return defaultValue\n  }\n}\n\n/**\n * @deprecated Disk cache is now synced on every successful payload load\n * (init + 20min/6h periodic refresh). The per-feature TTL never fetched\n * fresh data from the server \u2014 it only re-wrote in-memory state to disk,\n * which is now redundant. Use getFeatureValue_CACHED_MAY_BE_STALE directly.\n */\nexport function getFeatureValue_CACHED_WITH_REFRESH<T>(\n  feature: string,\n  defaultValue: T,\n  _refreshIntervalMs: number,\n): T {\n  return getFeatureValue_CACHED_MAY_BE_STALE(feature, defaultValue)\n}\n\n/**\n * Check a Statsig feature gate value via GrowthBook, with fallback to Statsig cache.\n *\n * **MIGRATION ONLY**: This function is for migrating existing Statsig gates to GrowthBook.\n * For new features, use `getFeatureValue_CACHED_MAY_BE_STALE()` instead.\n *\n * - Checks GrowthBook disk cache first\n * - Falls back to Statsig's cachedStatsigGates during migration\n * - The value may be stale if the cache hasn't been updated recently\n *\n * @deprecated Use getFeatureValue_CACHED_MAY_BE_STALE() for new code. This function\n * exists only to support migration of existing Statsig gates.\n */\nexport function checkStatsigFeatureGate_CACHED_MAY_BE_STALE(\n  gate: string,\n): boolean {\n  // Check env var overrides first (for eval harnesses)\n  const overrides = getEnvOverrides()\n  if (overrides && gate in overrides) {\n    return Boolean(overrides[gate])\n  }\n  const configOverrides = getConfigOverrides()\n  if (configOverrides && gate in configOverrides) {\n    return Boolean(configOverrides[gate])\n  }\n\n  if (!isGrowthBookEnabled()) {\n    return false\n  }\n\n  // Log experiment exposure if data is available, otherwise defer until after init\n  if (experimentDataByFeature.has(gate)) {\n    logExposureForFeature(gate)\n  } else {\n    pendingExposures.add(gate)\n  }\n\n  // Return cached value immediately from disk\n  // First check GrowthBook cache, then fall back to Statsig cache for migration\n  const config = getGlobalConfig()\n  const gbCached = config.cachedGrowthBookFeatures?.[gate]\n  if (gbCached !== undefined) {\n    return Boolean(gbCached)\n  }\n  // Fallback to Statsig cache for migration period\n  return config.cachedStatsigGates?.[gate] ?? false\n}\n\n/**\n * Check a security restriction gate, waiting for re-init if in progress.\n *\n * Use this for security-critical gates where we need fresh values after auth changes.\n *\n * Behavior:\n * - If GrowthBook is re-initializing (e.g., after login), waits for it to complete\n * - Otherwise, returns cached value immediately (Statsig cache first, then GrowthBook)\n *\n * Statsig cache is checked first as a safety measure for security-related checks:\n * if the Statsig cache indicates the gate is enabled, we honor it.\n */\nexport async function checkSecurityRestrictionGate(\n  gate: string,\n): Promise<boolean> {\n  // Check env var overrides first (for eval harnesses)\n  const overrides = getEnvOverrides()\n  if (overrides && gate in overrides) {\n    return Boolean(overrides[gate])\n  }\n  const configOverrides = getConfigOverrides()\n  if (configOverrides && gate in configOverrides) {\n    return Boolean(configOverrides[gate])\n  }\n\n  if (!isGrowthBookEnabled()) {\n    return false\n  }\n\n  // If re-initialization is in progress, wait for it to complete\n  // This ensures we get fresh values after auth changes\n  if (reinitializingPromise) {\n    await reinitializingPromise\n  }\n\n  // Check Statsig cache first - it may have correct value from previous logged-in session\n  const config = getGlobalConfig()\n  const statsigCached = config.cachedStatsigGates?.[gate]\n  if (statsigCached !== undefined) {\n    return Boolean(statsigCached)\n  }\n\n  // Then check GrowthBook cache\n  const gbCached = config.cachedGrowthBookFeatures?.[gate]\n  if (gbCached !== undefined) {\n    return Boolean(gbCached)\n  }\n\n  // No cache - return false (don't block on init for uncached gates)\n  return false\n}\n\n/**\n * Check a boolean entitlement gate with fallback-to-blocking semantics.\n *\n * Fast path: if the disk cache already says `true`, return it immediately.\n * Slow path: if disk says `false`/missing, await GrowthBook init and fetch the\n * fresh server value (max ~5s). Disk is populated by syncRemoteEvalToDisk\n * inside init, so by the time the slow path returns, disk already has the\n * fresh value \u2014 no write needed here.\n *\n * Use for user-invoked features (e.g. /remote-control) that are gated on\n * subscription/org, where a stale `false` would unfairly block access but a\n * stale `true` is acceptable (the server is the real gatekeeper).\n */\nexport async function checkGate_CACHED_OR_BLOCKING(\n  gate: string,\n): Promise<boolean> {\n  // Check env var overrides first (for eval harnesses)\n  const overrides = getEnvOverrides()\n  if (overrides && gate in overrides) {\n    return Boolean(overrides[gate])\n  }\n  const configOverrides = getConfigOverrides()\n  if (configOverrides && gate in configOverrides) {\n    return Boolean(configOverrides[gate])\n  }\n\n  if (!isGrowthBookEnabled()) {\n    return false\n  }\n\n  // Fast path: disk cache already says true \u2014 trust it\n  const cached = getGlobalConfig().cachedGrowthBookFeatures?.[gate]\n  if (cached === true) {\n    // Log experiment exposure if data is available, otherwise defer\n    if (experimentDataByFeature.has(gate)) {\n      logExposureForFeature(gate)\n    } else {\n      pendingExposures.add(gate)\n    }\n    return true\n  }\n\n  // Slow path: disk says false/missing \u2014 may be stale, fetch fresh\n  return getFeatureValueInternal(gate, false, true)\n}\n\n/**\n * Refresh GrowthBook after auth changes (login/logout).\n *\n * NOTE: This must destroy and recreate the client because GrowthBook's\n * apiHostRequestHeaders cannot be updated after client creation.\n */\nexport function refreshGrowthBookAfterAuthChange(): void {\n  if (!isGrowthBookEnabled()) {\n    return\n  }\n\n  try {\n    // Reset the client completely to get fresh auth headers\n    // This is necessary because apiHostRequestHeaders can't be updated after creation\n    resetGrowthBook()\n\n    // resetGrowthBook cleared remoteEvalFeatureValues. If re-init below\n    // times out (hadFeatures=false) or short-circuits on !hasAuth (logout),\n    // the init-callback notify never fires \u2014 subscribers stay synced to the\n    // previous account's memoized state. Notify here so they re-read now\n    // (falls to disk cache). If re-init succeeds, they'll notify again with\n    // fresh values; if not, at least they're synced to the post-reset state.\n    refreshed.emit()\n\n    // Reinitialize with fresh auth headers and attributes\n    // Track this promise so security gate checks can wait for it.\n    // .catch before .finally: initializeGrowthBook can reject if its sync\n    // helpers throw (getGrowthBookClient, getAuthHeaders, resetGrowthBook \u2014\n    // clientWrapper.initialized itself has its own .catch so never rejects),\n    // and .finally re-settles with the original rejection \u2014 the sync\n    // try/catch below cannot catch async rejections.\n    reinitializingPromise = initializeGrowthBook()\n      .catch(error => {\n        logError(toError(error))\n        return null\n      })\n      .finally(() => {\n        reinitializingPromise = null\n      })\n  } catch (error) {\n    if (process.env.NODE_ENV === 'development') {\n      throw error\n    }\n    logError(toError(error))\n  }\n}\n\n/**\n * Reset GrowthBook client state (primarily for testing)\n */\nexport function resetGrowthBook(): void {\n  stopPeriodicGrowthBookRefresh()\n  // Remove process handlers before destroying client to prevent accumulation\n  if (currentBeforeExitHandler) {\n    process.off('beforeExit', currentBeforeExitHandler)\n    currentBeforeExitHandler = null\n  }\n  if (currentExitHandler) {\n    process.off('exit', currentExitHandler)\n    currentExitHandler = null\n  }\n  client?.destroy()\n  client = null\n  clientCreatedWithAuth = false\n  reinitializingPromise = null\n  experimentDataByFeature.clear()\n  pendingExposures.clear()\n  loggedExposures.clear()\n  remoteEvalFeatureValues.clear()\n  getGrowthBookClient.cache?.clear?.()\n  initializeGrowthBook.cache?.clear?.()\n  envOverrides = null\n  envOverridesParsed = false\n}\n\n// Periodic refresh interval (matches Statsig's 6-hour interval)\nconst GROWTHBOOK_REFRESH_INTERVAL_MS =\n  process.env.USER_TYPE !== 'ant'\n    ? 6 * 60 * 60 * 1000 // 6 hours\n    : 20 * 60 * 1000 // 20 min (for ants)\nlet refreshInterval: ReturnType<typeof setInterval> | null = null\nlet beforeExitListener: (() => void) | null = null\n\n/**\n * Light refresh - re-fetch features from server without recreating client.\n * Use this for periodic refresh when auth headers haven't changed.\n *\n * Unlike refreshGrowthBookAfterAuthChange() which destroys and recreates the client,\n * this preserves client state and just fetches fresh feature values.\n */\nexport async function refreshGrowthBookFeatures(): Promise<void> {\n  if (!isGrowthBookEnabled()) {\n    return\n  }\n\n  try {\n    const growthBookClient = await initializeGrowthBook()\n    if (!growthBookClient) {\n      return\n    }\n\n    await growthBookClient.refreshFeatures()\n\n    // Guard: if this client was replaced during the in-flight refresh\n    // (e.g. refreshGrowthBookAfterAuthChange ran), skip processing the\n    // stale payload. Mirrors the init-callback guard above.\n    if (growthBookClient !== client) {\n      if (process.env.USER_TYPE === 'ant') {\n        logForDebugging(\n          'GrowthBook: Skipping refresh processing for replaced client',\n        )\n      }\n      return\n    }\n\n    // Rebuild remoteEvalFeatureValues from the refreshed payload so that\n    // _BLOCKS_ON_INIT callers (e.g. getMaxVersion for the auto-update kill\n    // switch) see fresh values, not the stale init-time snapshot.\n    const hadFeatures = await processRemoteEvalPayload(growthBookClient)\n    // Same re-check as init path: covers the setPayload yield inside\n    // processRemoteEvalPayload (the guard above only covers refreshFeatures).\n    if (growthBookClient !== client) return\n\n    if (process.env.USER_TYPE === 'ant') {\n      logForDebugging('GrowthBook: Light refresh completed')\n    }\n\n    // Gate on hadFeatures: if the payload was empty/malformed,\n    // remoteEvalFeatureValues wasn't rebuilt \u2014 skip both the no-op disk\n    // write and the spurious subscriber churn (clearCommandMemoizationCaches\n    // + getCommands + 4\u00D7 model re-renders).\n    if (hadFeatures) {\n      syncRemoteEvalToDisk()\n      refreshed.emit()\n    }\n  } catch (error) {\n    if (process.env.NODE_ENV === 'development') {\n      throw error\n    }\n    logError(toError(error))\n  }\n}\n\n/**\n * Set up periodic refresh of GrowthBook features.\n * Uses light refresh (refreshGrowthBookFeatures) to re-fetch without recreating client.\n *\n * Call this after initialization for long-running sessions to ensure\n * feature values stay fresh. Matches Statsig's 6-hour refresh interval.\n */\nexport function setupPeriodicGrowthBookRefresh(): void {\n  if (!isGrowthBookEnabled()) {\n    return\n  }\n\n  // Clear any existing interval to avoid duplicates\n  if (refreshInterval) {\n    clearInterval(refreshInterval)\n  }\n\n  refreshInterval = setInterval(() => {\n    void refreshGrowthBookFeatures()\n  }, GROWTHBOOK_REFRESH_INTERVAL_MS)\n  // Allow process to exit naturally - this timer shouldn't keep the process alive\n  refreshInterval.unref?.()\n\n  // Register cleanup listener only once\n  if (!beforeExitListener) {\n    beforeExitListener = () => {\n      stopPeriodicGrowthBookRefresh()\n    }\n    process.once('beforeExit', beforeExitListener)\n  }\n}\n\n/**\n * Stop periodic refresh (for testing or cleanup)\n */\nexport function stopPeriodicGrowthBookRefresh(): void {\n  if (refreshInterval) {\n    clearInterval(refreshInterval)\n    refreshInterval = null\n  }\n  if (beforeExitListener) {\n    process.removeListener('beforeExit', beforeExitListener)\n    beforeExitListener = null\n  }\n}\n\n// ============================================================================\n// Dynamic Config Functions\n// These are semantic wrappers around feature functions for Statsig API parity.\n// In GrowthBook, dynamic configs are just features with object values.\n// ============================================================================\n\n/**\n * Get a dynamic config value - blocks until GrowthBook is initialized.\n * Prefer getFeatureValue_CACHED_MAY_BE_STALE for startup-critical paths.\n */\nexport async function getDynamicConfig_BLOCKS_ON_INIT<T>(\n  configName: string,\n  defaultValue: T,\n): Promise<T> {\n  return getFeatureValue_DEPRECATED(configName, defaultValue)\n}\n\n/**\n * Get a dynamic config value from disk cache immediately. Pure read \u2014 see\n * getFeatureValue_CACHED_MAY_BE_STALE.\n * This is the preferred method for startup-critical paths and sync contexts.\n *\n * In GrowthBook, dynamic configs are just features with object values.\n */\nexport function getDynamicConfig_CACHED_MAY_BE_STALE<T>(\n  configName: string,\n  defaultValue: T,\n): T {\n  return getFeatureValue_CACHED_MAY_BE_STALE(configName, defaultValue)\n}\n", "import memoize from 'lodash-es/memoize.js'\nimport { homedir } from 'os'\nimport { isAbsolute, join, normalize, sep } from 'path'\nimport {\n  getIsNonInteractiveSession,\n  getProjectRoot,\n} from '../bootstrap/state.js'\nimport { getFeatureValue_CACHED_MAY_BE_STALE } from '../services/analytics/growthbook.js'\nimport {\n  getClaudeConfigHomeDir,\n  isEnvDefinedFalsy,\n  isEnvTruthy,\n} from '../utils/envUtils.js'\nimport { findCanonicalGitRoot } from '../utils/git.js'\nimport { sanitizePath } from '../utils/path.js'\nimport {\n  getInitialSettings,\n  getSettingsForSource,\n} from '../utils/settings/settings.js'\n\n/**\n * Whether auto-memory features are enabled (memdir, agent memory, past session search).\n * Enabled by default. Priority chain (first defined wins):\n *   1. CLAUDE_CODE_DISABLE_AUTO_MEMORY env var (1/true \u2192 OFF, 0/false \u2192 ON)\n *   2. CLAUDE_CODE_SIMPLE (--bare) \u2192 OFF\n *   3. CCR without persistent storage \u2192 OFF (no CLAUDE_CODE_REMOTE_MEMORY_DIR)\n *   4. autoMemoryEnabled in settings.json (supports project-level opt-out)\n *   5. Default: enabled\n */\nexport function isAutoMemoryEnabled(): boolean {\n  const envVal = process.env.CLAUDE_CODE_DISABLE_AUTO_MEMORY\n  if (isEnvTruthy(envVal)) {\n    return false\n  }\n  if (isEnvDefinedFalsy(envVal)) {\n    return true\n  }\n  // --bare / SIMPLE: prompts.ts already drops the memory section from the\n  // system prompt via its SIMPLE early-return; this gate stops the other half\n  // (extractMemories turn-end fork, autoDream, /remember, /dream, team sync).\n  if (isEnvTruthy(process.env.CLAUDE_CODE_SIMPLE)) {\n    return false\n  }\n  if (\n    isEnvTruthy(process.env.CLAUDE_CODE_REMOTE) &&\n    !process.env.CLAUDE_CODE_REMOTE_MEMORY_DIR\n  ) {\n    return false\n  }\n  const settings = getInitialSettings()\n  if (settings.autoMemoryEnabled !== undefined) {\n    return settings.autoMemoryEnabled\n  }\n  return true\n}\n\n/**\n * Master switch for the self-learning loop: turn-end memory capture\n * (extractMemories) + background consolidation (autoDream). Off by default,\n * and requires auto-memory to be enabled. Read by isExtractModeActive()\n * (capture side) and by autoDream's config.ts (consolidation side).\n */\nexport function isSelfLearningEnabled(): boolean {\n  if (!isAutoMemoryEnabled()) {\n    return false\n  }\n  return getInitialSettings().selfLearningEnabled === true\n}\n\n/**\n * Whether the extract-memories background agent will run this session.\n *\n * The main agent's prompt always has full save instructions regardless of\n * this gate \u2014 when the main agent writes memories, the background agent\n * skips that range (hasMemoryWritesSince in extractMemories.ts); when it\n * doesn't, the background agent catches anything missed.\n *\n * Callers must also gate on feature('EXTRACT_MEMORIES') \u2014 that check cannot\n * live inside this helper because feature() only tree-shakes when used\n * directly in an `if` condition.\n */\nexport function isExtractModeActive(): boolean {\n  if (!isSelfLearningEnabled()) {\n    return false\n  }\n  return (\n    !getIsNonInteractiveSession() ||\n    getFeatureValue_CACHED_MAY_BE_STALE('tengu_slate_thimble', false)\n  )\n}\n\n/**\n * Returns the base directory for persistent memory storage.\n * Resolution order:\n *   1. CLAUDE_CODE_REMOTE_MEMORY_DIR env var (explicit override, set in CCR)\n *   2. ~/.claude (default config home)\n */\nexport function getMemoryBaseDir(): string {\n  if (process.env.CLAUDE_CODE_REMOTE_MEMORY_DIR) {\n    return process.env.CLAUDE_CODE_REMOTE_MEMORY_DIR\n  }\n  return getClaudeConfigHomeDir()\n}\n\nconst AUTO_MEM_DIRNAME = 'memory'\nconst AUTO_MEM_ENTRYPOINT_NAME = 'MEMORY.md'\n\n/**\n * Subdirectory under the auto-memory dir where the self-learning loop stages\n * proposed memories for human review. Excluded from recall (scanMemoryFiles)\n * so staged proposals are NEVER used until the user approves them via the\n * /learned command. Approval moves the file up to the top level.\n */\nexport const LEARNED_SUBDIR = 'learned'\n\n/**\n * Normalize and validate a candidate auto-memory directory path.\n *\n * SECURITY: Rejects paths that would be dangerous as a read-allowlist root\n * or that normalize() doesn't fully resolve:\n * - relative (!isAbsolute): \"../foo\" \u2014 would be interpreted relative to CWD\n * - root/near-root (length < 3): \"/\" \u2192 \"\" after strip; \"/a\" too short\n * - Windows drive-root (C: regex): \"C:\\\" \u2192 \"C:\" after strip\n * - UNC paths (\\\\server\\share): network paths \u2014 opaque trust boundary\n * - null byte: survives normalize(), can truncate in syscalls\n *\n * Returns the normalized path with exactly one trailing separator,\n * or undefined if the path is unset/empty/rejected.\n */\nfunction validateMemoryPath(\n  raw: string | undefined,\n  expandTilde: boolean,\n): string | undefined {\n  if (!raw) {\n    return undefined\n  }\n  let candidate = raw\n  // Settings.json paths support ~/ expansion (user-friendly). The env var\n  // override does not (it's set programmatically by Cowork/SDK, which should\n  // always pass absolute paths). Bare \"~\", \"~/\", \"~/.\", \"~/..\", etc. are NOT\n  // expanded \u2014 they would make isAutoMemPath() match all of $HOME or its\n  // parent (same class of danger as \"/\" or \"C:\\\").\n  if (\n    expandTilde &&\n    (candidate.startsWith('~/') || candidate.startsWith('~\\\\'))\n  ) {\n    const rest = candidate.slice(2)\n    // Reject trivial remainders that would expand to $HOME or an ancestor.\n    // normalize('') = '.', normalize('.') = '.', normalize('foo/..') = '.',\n    // normalize('..') = '..', normalize('foo/../..') = '..'\n    const restNorm = normalize(rest || '.')\n    if (restNorm === '.' || restNorm === '..') {\n      return undefined\n    }\n    candidate = join(homedir(), rest)\n  }\n  // normalize() may preserve a trailing separator; strip before adding\n  // exactly one to match the trailing-sep contract of getAutoMemPath()\n  const normalized = normalize(candidate).replace(/[/\\\\]+$/, '')\n  if (\n    !isAbsolute(normalized) ||\n    normalized.length < 3 ||\n    /^[A-Za-z]:$/.test(normalized) ||\n    normalized.startsWith('\\\\\\\\') ||\n    normalized.startsWith('//') ||\n    normalized.includes('\\0')\n  ) {\n    return undefined\n  }\n  return (normalized + sep).normalize('NFC')\n}\n\n/**\n * Direct override for the full auto-memory directory path via env var.\n * When set, getAutoMemPath()/getAutoMemEntrypoint() return this path directly\n * instead of computing `{base}/projects/{sanitized-cwd}/memory/`.\n *\n * Used by Cowork to redirect memory to a space-scoped mount where the\n * per-session cwd (which contains the VM process name) would otherwise\n * produce a different project-key for every session.\n */\nfunction getAutoMemPathOverride(): string | undefined {\n  return validateMemoryPath(\n    process.env.CLAUDE_COWORK_MEMORY_PATH_OVERRIDE,\n    false,\n  )\n}\n\n/**\n * Settings.json override for the full auto-memory directory path.\n * Supports ~/ expansion for user convenience.\n *\n * SECURITY: projectSettings (.claude/settings.json committed to the repo) is\n * intentionally excluded \u2014 a malicious repo could otherwise set\n * autoMemoryDirectory: \"~/.ssh\" and gain silent write access to sensitive\n * directories via the filesystem.ts write carve-out (which fires when\n * isAutoMemPath() matches and hasAutoMemPathOverride() is false). This follows\n * the same pattern as hasSkipDangerousModePermissionPrompt() etc.\n */\nfunction getAutoMemPathSetting(): string | undefined {\n  const dir =\n    getSettingsForSource('policySettings')?.autoMemoryDirectory ??\n    getSettingsForSource('flagSettings')?.autoMemoryDirectory ??\n    getSettingsForSource('localSettings')?.autoMemoryDirectory ??\n    getSettingsForSource('userSettings')?.autoMemoryDirectory\n  return validateMemoryPath(dir, true)\n}\n\n/**\n * Check if CLAUDE_COWORK_MEMORY_PATH_OVERRIDE is set to a valid override.\n * Use this as a signal that the SDK caller has explicitly opted into\n * the auto-memory mechanics \u2014 e.g. to decide whether to inject the\n * memory prompt when a custom system prompt replaces the default.\n */\nexport function hasAutoMemPathOverride(): boolean {\n  return getAutoMemPathOverride() !== undefined\n}\n\n/**\n * Returns the canonical git repo root if available, otherwise falls back to\n * the stable project root. Uses findCanonicalGitRoot so all worktrees of the\n * same repo share one auto-memory directory (anthropics/claude-code#24382).\n */\nfunction getAutoMemBase(): string {\n  return findCanonicalGitRoot(getProjectRoot()) ?? getProjectRoot()\n}\n\n/**\n * Returns the auto-memory directory path.\n *\n * Resolution order:\n *   1. CLAUDE_COWORK_MEMORY_PATH_OVERRIDE env var (full-path override, used by Cowork)\n *   2. autoMemoryDirectory in settings.json (trusted sources only: policy/local/user)\n *   3. <memoryBase>/projects/<sanitized-git-root>/memory/\n *      where memoryBase is resolved by getMemoryBaseDir()\n *\n * Memoized: render-path callers (collapseReadSearchGroups \u2192 isAutoManagedMemoryFile)\n * fire per tool-use message per Messages re-render; each miss costs\n * getSettingsForSource \u00D7 4 \u2192 parseSettingsFile (realpathSync + readFileSync).\n * Keyed on projectRoot so tests that change its mock mid-block recompute;\n * env vars / settings.json / CLAUDE_CONFIG_DIR are session-stable in\n * production and covered by per-test cache.clear.\n */\nexport const getAutoMemPath = memoize(\n  (): string => {\n    const override = getAutoMemPathOverride() ?? getAutoMemPathSetting()\n    if (override) {\n      return override\n    }\n    const projectsDir = join(getMemoryBaseDir(), 'projects')\n    return (\n      join(projectsDir, sanitizePath(getAutoMemBase()), AUTO_MEM_DIRNAME) + sep\n    ).normalize('NFC')\n  },\n  () => getProjectRoot(),\n)\n\n/**\n * Returns the daily log file path for the given date (defaults to today).\n * Shape: <autoMemPath>/logs/YYYY/MM/YYYY-MM-DD.md\n *\n * Used by assistant mode (feature('KAIROS')): rather than maintaining\n * MEMORY.md as a live index, the agent appends to a date-named log file\n * as it works. A separate nightly /dream skill distills these logs into\n * topic files + MEMORY.md.\n */\nexport function getAutoMemDailyLogPath(date: Date = new Date()): string {\n  const yyyy = date.getFullYear().toString()\n  const mm = (date.getMonth() + 1).toString().padStart(2, '0')\n  const dd = date.getDate().toString().padStart(2, '0')\n  return join(getAutoMemPath(), 'logs', yyyy, mm, `${yyyy}-${mm}-${dd}.md`)\n}\n\n/**\n * Returns the auto-memory entrypoint (MEMORY.md inside the auto-memory dir).\n * Follows the same resolution order as getAutoMemPath().\n */\nexport function getAutoMemEntrypoint(): string {\n  return join(getAutoMemPath(), AUTO_MEM_ENTRYPOINT_NAME)\n}\n\n/**\n * Returns the self-learning staging directory (<autoMemPath>/learned/).\n * Proposed memories live here until the user promotes them via /learned.\n */\nexport function getAutoMemLearnedPath(): string {\n  return join(getAutoMemPath(), LEARNED_SUBDIR)\n}\n\n/**\n * Check if an absolute path is within the auto-memory directory.\n *\n * When CLAUDE_COWORK_MEMORY_PATH_OVERRIDE is set, this matches against the\n * env-var override directory. Note that a true return here does NOT imply\n * write permission in that case \u2014 the filesystem.ts write carve-out is gated\n * on !hasAutoMemPathOverride() (it exists to bypass DANGEROUS_DIRECTORIES).\n *\n * The settings.json autoMemoryDirectory DOES get the write carve-out: it's the\n * user's explicit choice from a trusted settings source (projectSettings is\n * excluded \u2014 see getAutoMemPathSetting), and hasAutoMemPathOverride() remains\n * false for it.\n */\nexport function isAutoMemPath(absolutePath: string): boolean {\n  // SECURITY: Normalize to prevent path traversal bypasses via .. segments\n  const normalizedPath = normalize(absolutePath)\n  return normalizedPath.startsWith(getAutoMemPath())\n}\n", "// These constants are in a separate file to avoid circular dependency issues.\n// Do NOT add imports to this file - it must remain dependency-free.\n\nexport const NOTIFICATION_CHANNELS = [\n  'auto',\n  'iterm2',\n  'iterm2_with_bell',\n  'terminal_bell',\n  'kitty',\n  'ghostty',\n  'notifications_disabled',\n] as const\n\n// Valid editor modes (excludes deprecated 'emacs' which is auto-migrated to 'normal')\nexport const EDITOR_MODES = ['normal', 'vim'] as const\n\n// Valid teammate modes for spawning\n// 'tmux' = traditional tmux-based teammates\n// 'in-process' = in-process teammates running in same process\n// 'auto' = automatically choose based on context (default)\nexport const TEAMMATE_MODES = ['auto', 'tmux', 'in-process'] as const\n", "import { lstat, realpath } from 'fs/promises'\nimport { dirname, join, resolve, sep } from 'path'\nimport { getFeatureValue_CACHED_MAY_BE_STALE } from '../services/analytics/growthbook.js'\nimport { getErrnoCode } from '../utils/errors.js'\nimport { getAutoMemPath, isAutoMemoryEnabled } from './paths.js'\n\n/**\n * Error thrown when a path validation detects a traversal or injection attempt.\n */\nexport class PathTraversalError extends Error {\n  constructor(message: string) {\n    super(message)\n    this.name = 'PathTraversalError'\n  }\n}\n\n/**\n * Sanitize a file path key by rejecting dangerous patterns.\n * Checks for null bytes, URL-encoded traversals, and other injection vectors.\n * Returns the sanitized string or throws PathTraversalError.\n */\nfunction sanitizePathKey(key: string): string {\n  // Null bytes can truncate paths in C-based syscalls\n  if (key.includes('\\0')) {\n    throw new PathTraversalError(`Null byte in path key: \"${key}\"`)\n  }\n  // URL-encoded traversals (e.g. %2e%2e%2f = ../)\n  let decoded: string\n  try {\n    decoded = decodeURIComponent(key)\n  } catch {\n    // Malformed percent-encoding (e.g. %ZZ, lone %) \u2014 not valid URL-encoding,\n    // so no URL-encoded traversal is possible\n    decoded = key\n  }\n  if (decoded !== key && (decoded.includes('..') || decoded.includes('/'))) {\n    throw new PathTraversalError(`URL-encoded traversal in path key: \"${key}\"`)\n  }\n  // Unicode normalization attacks: fullwidth \uFF0E\uFF0E\uFF0F (U+FF0E U+FF0F) normalize\n  // to ASCII ../ under NFKC. While path.resolve/fs.writeFile treat these as\n  // literal bytes (not separators), downstream layers or filesystems may\n  // normalize \u2014 reject for defense-in-depth (PSR M22187 vector 4).\n  const normalized = key.normalize('NFKC')\n  if (\n    normalized !== key &&\n    (normalized.includes('..') ||\n      normalized.includes('/') ||\n      normalized.includes('\\\\') ||\n      normalized.includes('\\0'))\n  ) {\n    throw new PathTraversalError(\n      `Unicode-normalized traversal in path key: \"${key}\"`,\n    )\n  }\n  // Reject backslashes (Windows path separator used as traversal vector)\n  if (key.includes('\\\\')) {\n    throw new PathTraversalError(`Backslash in path key: \"${key}\"`)\n  }\n  // Reject absolute paths\n  if (key.startsWith('/')) {\n    throw new PathTraversalError(`Absolute path key: \"${key}\"`)\n  }\n  return key\n}\n\n/**\n * Whether team memory features are enabled.\n * Team memory is a subdirectory of auto memory, so it requires auto memory\n * to be enabled. This keeps all team-memory consumers (prompt, content\n * injection, sync watcher, file detection) consistent when auto memory is\n * disabled via env var or settings.\n */\nexport function isTeamMemoryEnabled(): boolean {\n  if (!isAutoMemoryEnabled()) {\n    return false\n  }\n  return getFeatureValue_CACHED_MAY_BE_STALE('tengu_herring_clock', false)\n}\n\n/**\n * Returns the team memory path: <memoryBase>/projects/<sanitized-project-root>/memory/team/\n * Lives as a subdirectory of the auto-memory directory, scoped per-project.\n */\nexport function getTeamMemPath(): string {\n  return (join(getAutoMemPath(), 'team') + sep).normalize('NFC')\n}\n\n/**\n * Returns the team memory entrypoint: <memoryBase>/projects/<sanitized-project-root>/memory/team/MEMORY.md\n * Lives as a subdirectory of the auto-memory directory, scoped per-project.\n */\nexport function getTeamMemEntrypoint(): string {\n  return join(getAutoMemPath(), 'team', 'MEMORY.md')\n}\n\n/**\n * Resolve symlinks for the deepest existing ancestor of a path.\n * The target file may not exist yet (we may be about to create it), so we\n * walk up the directory tree until realpath() succeeds, then rejoin the\n * non-existing tail onto the resolved ancestor.\n *\n * SECURITY (PSR M22186): path.resolve() does NOT resolve symlinks. An attacker\n * who can place a symlink inside teamDir pointing outside (e.g. to\n * ~/.ssh/authorized_keys) would pass a resolve()-based containment check.\n * Using realpath() on the deepest existing ancestor ensures we compare the\n * actual filesystem location, not the symbolic path.\n *\n */\nasync function realpathDeepestExisting(absolutePath: string): Promise<string> {\n  const tail: string[] = []\n  let current = absolutePath\n  // Walk up until realpath succeeds. ENOENT means this segment doesn't exist\n  // yet; pop it onto the tail and try the parent. ENOTDIR means a non-directory\n  // component sits in the middle of the path; pop and retry so we can realpath\n  // the ancestor to detect symlink escapes.\n  // Loop terminates when we reach the filesystem root (dirname('/') === '/').\n  for (\n    let parent = dirname(current);\n    current !== parent;\n    parent = dirname(current)\n  ) {\n    try {\n      const realCurrent = await realpath(current)\n      // Rejoin the non-existing tail in reverse order (deepest popped first)\n      return tail.length === 0\n        ? realCurrent\n        : join(realCurrent, ...tail.reverse())\n    } catch (e: unknown) {\n      const code = getErrnoCode(e)\n      if (code === 'ENOENT') {\n        // Could be truly non-existent (safe to walk up) OR a dangling symlink\n        // whose target doesn't exist. Dangling symlinks are an attack vector:\n        // writeFile would follow the link and create the target outside teamDir.\n        // lstat distinguishes: it succeeds for dangling symlinks (the link entry\n        // itself exists), fails with ENOENT for truly non-existent paths.\n        try {\n          const st = await lstat(current)\n          if (st.isSymbolicLink()) {\n            throw new PathTraversalError(\n              `Dangling symlink detected (target does not exist): \"${current}\"`,\n            )\n          }\n          // lstat succeeded but isn't a symlink \u2014 ENOENT from realpath was\n          // caused by a dangling symlink in an ancestor. Walk up to find it.\n        } catch (lstatErr: unknown) {\n          if (lstatErr instanceof PathTraversalError) {\n            throw lstatErr\n          }\n          // lstat also failed (truly non-existent or inaccessible) \u2014 safe to walk up.\n        }\n      } else if (code === 'ELOOP') {\n        // Symlink loop \u2014 corrupted or malicious filesystem state.\n        throw new PathTraversalError(\n          `Symlink loop detected in path: \"${current}\"`,\n        )\n      } else if (code !== 'ENOTDIR' && code !== 'ENAMETOOLONG') {\n        // EACCES, EIO, etc. \u2014 cannot verify containment. Fail closed by wrapping\n        // as PathTraversalError so the caller can skip this entry gracefully\n        // instead of aborting the entire batch.\n        throw new PathTraversalError(\n          `Cannot verify path containment (${code}): \"${current}\"`,\n        )\n      }\n      tail.push(current.slice(parent.length + sep.length))\n      current = parent\n    }\n  }\n  // Reached filesystem root without finding an existing ancestor (rare \u2014\n  // root normally exists). Fall back to the input; containment check will reject.\n  return absolutePath\n}\n\n/**\n * Check whether a real (symlink-resolved) path is within the real team\n * memory directory. Both sides are realpath'd so the comparison is between\n * canonical filesystem locations.\n *\n * If teamDir does not exist, returns true (skips the check). This is safe:\n * a symlink escape requires a pre-existing symlink inside teamDir, which\n * requires teamDir to exist. If there's no directory, there's no symlink,\n * and the first-pass string-level containment check is sufficient.\n */\nasync function isRealPathWithinTeamDir(\n  realCandidate: string,\n): Promise<boolean> {\n  let realTeamDir: string\n  try {\n    // getTeamMemPath() includes a trailing separator; strip it because\n    // realpath() rejects trailing separators on some platforms.\n    realTeamDir = await realpath(getTeamMemPath().replace(/[/\\\\]+$/, ''))\n  } catch (e: unknown) {\n    const code = getErrnoCode(e)\n    if (code === 'ENOENT' || code === 'ENOTDIR') {\n      // Team dir doesn't exist \u2014 symlink escape impossible, skip check.\n      return true\n    }\n    // Unexpected error (EACCES, EIO) \u2014 fail closed.\n    return false\n  }\n  if (realCandidate === realTeamDir) {\n    return true\n  }\n  // Prefix-attack protection: require separator after the prefix so that\n  // \"/foo/team-evil\" doesn't match \"/foo/team\".\n  return realCandidate.startsWith(realTeamDir + sep)\n}\n\n/**\n * Check if a resolved absolute path is within the team memory directory.\n * Uses path.resolve() to convert relative paths and eliminate traversal segments.\n * Does NOT resolve symlinks \u2014 for write validation use validateTeamMemWritePath()\n * or validateTeamMemKey() which include symlink resolution.\n */\nexport function isTeamMemPath(filePath: string): boolean {\n  // SECURITY: resolve() converts to absolute and eliminates .. segments,\n  // preventing path traversal attacks (e.g. \"team/../../etc/passwd\")\n  const resolvedPath = resolve(filePath)\n  const teamDir = getTeamMemPath()\n  return resolvedPath.startsWith(teamDir)\n}\n\n/**\n * Validate that an absolute file path is safe for writing to the team memory directory.\n * Returns the resolved absolute path if valid.\n * Throws PathTraversalError if the path contains injection vectors, escapes the\n * directory via .. segments, or escapes via a symlink (PSR M22186).\n */\nexport async function validateTeamMemWritePath(\n  filePath: string,\n): Promise<string> {\n  if (filePath.includes('\\0')) {\n    throw new PathTraversalError(`Null byte in path: \"${filePath}\"`)\n  }\n  // First pass: normalize .. segments and check string-level containment.\n  // This is a fast rejection for obvious traversal attempts before we touch\n  // the filesystem.\n  const resolvedPath = resolve(filePath)\n  const teamDir = getTeamMemPath()\n  // Prefix attack protection: teamDir already ends with sep (from getTeamMemPath),\n  // so \"team-evil/\" won't match \"team/\"\n  if (!resolvedPath.startsWith(teamDir)) {\n    throw new PathTraversalError(\n      `Path escapes team memory directory: \"${filePath}\"`,\n    )\n  }\n  // Second pass: resolve symlinks on the deepest existing ancestor and verify\n  // the real path is still within the real team dir. This catches symlink-based\n  // escapes that path.resolve() alone cannot detect.\n  const realPath = await realpathDeepestExisting(resolvedPath)\n  if (!(await isRealPathWithinTeamDir(realPath))) {\n    throw new PathTraversalError(\n      `Path escapes team memory directory via symlink: \"${filePath}\"`,\n    )\n  }\n  return resolvedPath\n}\n\n/**\n * Validate a relative path key from the server against the team memory directory.\n * Sanitizes the key, joins with the team dir, resolves symlinks on the deepest\n * existing ancestor, and verifies containment against the real team dir.\n * Returns the resolved absolute path.\n * Throws PathTraversalError if the key is malicious (PSR M22186).\n */\nexport async function validateTeamMemKey(relativeKey: string): Promise<string> {\n  sanitizePathKey(relativeKey)\n  const teamDir = getTeamMemPath()\n  const fullPath = join(teamDir, relativeKey)\n  // First pass: normalize .. segments and check string-level containment.\n  const resolvedPath = resolve(fullPath)\n  if (!resolvedPath.startsWith(teamDir)) {\n    throw new PathTraversalError(\n      `Key escapes team memory directory: \"${relativeKey}\"`,\n    )\n  }\n  // Second pass: resolve symlinks and verify real containment.\n  const realPath = await realpathDeepestExisting(resolvedPath)\n  if (!(await isRealPathWithinTeamDir(realPath))) {\n    throw new PathTraversalError(\n      `Key escapes team memory directory via symlink: \"${relativeKey}\"`,\n    )\n  }\n  return resolvedPath\n}\n\n/**\n * Check if a file path is within the team memory directory\n * and team memory is enabled.\n */\nexport function isTeamMemFile(filePath: string): boolean {\n  return isTeamMemoryEnabled() && isTeamMemPath(filePath)\n}\n", "/**\n * Semver comparison utilities that use Bun.semver when available\n * and fall back to the npm `semver` package in Node.js environments.\n *\n * Bun.semver.order() is ~20x faster than npm semver comparisons.\n * The npm semver fallback always uses { loose: true }.\n */\n\nlet _npmSemver: typeof import('semver') | undefined\n\nfunction getNpmSemver(): typeof import('semver') {\n  if (!_npmSemver) {\n    // eslint-disable-next-line @typescript-eslint/no-require-imports\n    _npmSemver = require('semver') as typeof import('semver')\n  }\n  return _npmSemver\n}\n\nexport function gt(a: string, b: string): boolean {\n  if (typeof Bun !== 'undefined') {\n    return Bun.semver.order(a, b) === 1\n  }\n  return getNpmSemver().gt(a, b, { loose: true })\n}\n\nexport function gte(a: string, b: string): boolean {\n  if (typeof Bun !== 'undefined') {\n    return Bun.semver.order(a, b) >= 0\n  }\n  return getNpmSemver().gte(a, b, { loose: true })\n}\n\nexport function lt(a: string, b: string): boolean {\n  if (typeof Bun !== 'undefined') {\n    return Bun.semver.order(a, b) === -1\n  }\n  return getNpmSemver().lt(a, b, { loose: true })\n}\n\nexport function lte(a: string, b: string): boolean {\n  if (typeof Bun !== 'undefined') {\n    return Bun.semver.order(a, b) <= 0\n  }\n  return getNpmSemver().lte(a, b, { loose: true })\n}\n\nexport function satisfies(version: string, range: string): boolean {\n  if (typeof Bun !== 'undefined') {\n    return Bun.semver.satisfies(version, range)\n  }\n  return getNpmSemver().satisfies(version, range, { loose: true })\n}\n\nexport function order(a: string, b: string): -1 | 0 | 1 {\n  if (typeof Bun !== 'undefined') {\n    return Bun.semver.order(a, b)\n  }\n  return getNpmSemver().compare(a, b, { loose: true })\n}\n", "import { feature } from 'bun:bundle'\nimport {\n  checkGate_CACHED_OR_BLOCKING,\n  getDynamicConfig_CACHED_MAY_BE_STALE,\n  getFeatureValue_CACHED_MAY_BE_STALE,\n} from '../services/analytics/growthbook.js'\n// Namespace import breaks the bridgeEnabled \u2192 auth \u2192 config \u2192 bridgeEnabled\n// cycle \u2014 authModule.foo is a live binding, so by the time the helpers below\n// call it, auth.js is fully loaded. Previously used require() for the same\n// deferral, but require() hits a CJS cache that diverges from the ESM\n// namespace after mock.module() (daemon/auth.test.ts), breaking spyOn.\nimport * as authModule from '../utils/auth.js'\nimport { isEnvTruthy } from '../utils/envUtils.js'\nimport { lt } from '../utils/semver.js'\n\n/**\n * Runtime check for bridge mode entitlement.\n *\n * Remote Control requires a claude.ai subscription (the bridge auths to CCR\n * with the claude.ai OAuth token). isTauAISubscriber() excludes\n * Bedrock/Vertex/Foundry, apiKeyHelper/gateway deployments, env-var API keys,\n * and Console API logins \u2014 none of which have the OAuth token CCR needs.\n * See github.com/deshaw/anthropic-issues/issues/24.\n *\n * The `feature('BRIDGE_MODE')` guard ensures the GrowthBook string literal\n * is only referenced when bridge mode is enabled at build time.\n */\nexport function isBridgeEnabled(): boolean {\n  // Positive ternary pattern \u2014 see docs/feature-gating.md.\n  // Negative pattern (if (!feature(...)) return) does not eliminate\n  // inline string literals from external builds.\n  return feature('BRIDGE_MODE')\n    ? isClaudeAISubscriber() &&\n        getFeatureValue_CACHED_MAY_BE_STALE('tengu_ccr_bridge', false)\n    : false\n}\n\n/**\n * Blocking entitlement check for Remote Control.\n *\n * Returns cached `true` immediately (fast path). If the disk cache says\n * `false` or is missing, awaits GrowthBook init and fetches the fresh\n * server value (slow path, max ~5s), then writes it to disk.\n *\n * Use at entitlement gates where a stale `false` would unfairly block access.\n * For user-facing error paths, prefer `getBridgeDisabledReason()` which gives\n * a specific diagnostic. For render-body UI visibility checks, use\n * `isBridgeEnabled()` instead.\n */\nexport async function isBridgeEnabledBlocking(): Promise<boolean> {\n  return feature('BRIDGE_MODE')\n    ? isClaudeAISubscriber() &&\n        (await checkGate_CACHED_OR_BLOCKING('tengu_ccr_bridge'))\n    : false\n}\n\n/**\n * Diagnostic message for why Remote Control is unavailable, or null if\n * it's enabled. Call this instead of a bare `isBridgeEnabledBlocking()`\n * check when you need to show the user an actionable error.\n *\n * The GrowthBook gate targets on organizationUUID, which comes from\n * config.oauthAccount \u2014 populated by /api/oauth/profile during login.\n * That endpoint requires the user:profile scope. Tokens without it\n * (setup-token, CLAUDE_CODE_OAUTH_TOKEN env var, or pre-scope-expansion\n * logins) leave oauthAccount unpopulated, so the gate falls back to\n * false and users see a dead-end \"not enabled\" message with no hint\n * that re-login would fix it. See CC-1165 / gh-33105.\n */\nexport async function getBridgeDisabledReason(): Promise<string | null> {\n  if (feature('BRIDGE_MODE')) {\n    if (!isClaudeAISubscriber()) {\n      return 'Remote Control requires a claude.ai subscription. Run `tau auth login` to sign in with your claude.ai account.'\n    }\n    if (!hasProfileScope()) {\n      return 'Remote Control requires a full-scope login token. Long-lived tokens (from `tau setup-token` or CLAUDE_CODE_OAUTH_TOKEN) are limited to inference-only for security reasons. Run `tau auth login` to use Remote Control.'\n    }\n    if (!getOauthAccountInfo()?.organizationUuid) {\n      return 'Unable to determine your organization for Remote Control eligibility. Run `tau auth login` to refresh your account information.'\n    }\n    if (!(await checkGate_CACHED_OR_BLOCKING('tengu_ccr_bridge'))) {\n      return 'Remote Control is not yet enabled for your account.'\n    }\n    return null\n  }\n  return 'Remote Control is not available in this build.'\n}\n\n// try/catch: main.tsx:5698 calls isBridgeEnabled() while defining the Commander\n// program, before enableConfigs() runs. isTauAISubscriber() \u2192 getGlobalConfig()\n// throws \"Config accessed before allowed\" there. Pre-config, no OAuth token can\n// exist anyway \u2014 false is correct. Same swallow getFeatureValue_CACHED_MAY_BE_STALE\n// already does at growthbook.ts:775-780.\nfunction isClaudeAISubscriber(): boolean {\n  try {\n    return authModule.isClaudeAISubscriber()\n  } catch {\n    return false\n  }\n}\nfunction hasProfileScope(): boolean {\n  try {\n    return authModule.hasProfileScope()\n  } catch {\n    return false\n  }\n}\nfunction getOauthAccountInfo(): ReturnType<\n  typeof authModule.getOauthAccountInfo\n> {\n  try {\n    return authModule.getOauthAccountInfo()\n  } catch {\n    return undefined\n  }\n}\n\n/**\n * Runtime check for the env-less (v2) REPL bridge path.\n * Returns true when the GrowthBook flag `tengu_bridge_repl_v2` is enabled.\n *\n * This gates which implementation initReplBridge uses \u2014 NOT whether bridge\n * is available at all (see isBridgeEnabled above). Daemon/print paths stay\n * on the env-based implementation regardless of this gate.\n */\nexport function isEnvLessBridgeEnabled(): boolean {\n  return feature('BRIDGE_MODE')\n    ? getFeatureValue_CACHED_MAY_BE_STALE('tengu_bridge_repl_v2', false)\n    : false\n}\n\n/**\n * Kill-switch for the `cse_*` \u2192 `session_*` client-side retag shim.\n *\n * The shim exists because compat/convert.go:27 validates TagSession and the\n * claude.ai frontend routes on `session_*`, while v2 worker endpoints hand out\n * `cse_*`. Once the server tags by environment_kind and the frontend accepts\n * `cse_*` directly, flip this to false to make toCompatSessionId a no-op.\n * Defaults to true \u2014 the shim stays active until explicitly disabled.\n */\nexport function isCseShimEnabled(): boolean {\n  return feature('BRIDGE_MODE')\n    ? getFeatureValue_CACHED_MAY_BE_STALE(\n        'tengu_bridge_repl_v2_cse_shim_enabled',\n        true,\n      )\n    : true\n}\n\n/**\n * Returns an error message if the current CLI version is below the\n * minimum required for the v1 (env-based) Remote Control path, or null if the\n * version is fine. The v2 (env-less) path uses checkEnvLessBridgeMinVersion()\n * in envLessBridgeConfig.ts instead \u2014 the two implementations have independent\n * version floors.\n *\n * Uses cached (non-blocking) GrowthBook config. If GrowthBook hasn't\n * loaded yet, the default '0.0.0' means the check passes \u2014 a safe fallback.\n */\nexport function checkBridgeMinVersion(): string | null {\n  // Positive pattern \u2014 see docs/feature-gating.md.\n  // Negative pattern (if (!feature(...)) return) does not eliminate\n  // inline string literals from external builds.\n  if (feature('BRIDGE_MODE')) {\n    const config = getDynamicConfig_CACHED_MAY_BE_STALE<{\n      minVersion: string\n    }>('tengu_bridge_min_version', { minVersion: '0.0.0' })\n    if (config.minVersion && lt(MACRO.VERSION, config.minVersion)) {\n      return `Your version of Tau (${MACRO.VERSION}) is too old for Remote Control.\\nVersion ${config.minVersion} or higher is required. Run \\`tau update\\` to update.`\n    }\n  }\n  return null\n}\n\n/**\n * Default for remoteControlAtStartup when the user hasn't explicitly set it.\n * When the CCR_AUTO_CONNECT build flag is present (ant-only) and the\n * tengu_cobalt_harbor GrowthBook gate is on, all sessions connect to CCR by\n * default \u2014 the user can still opt out by setting remoteControlAtStartup=false\n * in config (explicit settings always win over this default).\n *\n * Defined here rather than in config.ts to avoid a direct\n * config.ts \u2192 growthbook.ts import cycle (growthbook.ts \u2192 user.ts \u2192 config.ts).\n */\nexport function getCcrAutoConnectDefault(): boolean {\n  return feature('CCR_AUTO_CONNECT')\n    ? getFeatureValue_CACHED_MAY_BE_STALE('tengu_cobalt_harbor', false)\n    : false\n}\n\n/**\n * Opt-in CCR mirror mode \u2014 every local session spawns an outbound-only\n * Remote Control session that receives forwarded events. Separate from\n * getCcrAutoConnectDefault (bidirectional Remote Control). Env var wins for\n * local opt-in; GrowthBook controls rollout.\n */\nexport function isCcrMirrorEnabled(): boolean {\n  return feature('CCR_MIRROR')\n    ? isEnvTruthy(process.env.CLAUDE_CODE_CCR_MIRROR) ||\n        getFeatureValue_CACHED_MAY_BE_STALE('tengu_ccr_mirror', false)\n    : false\n}\n", "import { feature } from 'bun:bundle'\r\nimport { randomBytes } from 'crypto'\r\nimport { unwatchFile, watchFile } from 'fs'\r\nimport memoize from 'lodash-es/memoize.js'\r\nimport pickBy from 'lodash-es/pickBy.js'\r\nimport { basename, dirname, join, resolve } from 'path'\r\nimport { getOriginalCwd, getSessionTrustAccepted } from '../bootstrap/state.js'\r\nimport { getAutoMemEntrypoint } from '../memdir/paths.js'\r\nimport { logEvent } from '../services/analytics/index.js'\r\nimport type { McpServerConfig } from '../services/mcp/types.js'\r\nimport type {\r\n  BillingType,\r\n  ReferralEligibilityResponse,\r\n} from '../services/oauth/types.js'\r\nimport { getCwd } from '../utils/cwd.js'\r\nimport { registerCleanup } from './cleanupRegistry.js'\r\nimport { logForDebugging } from './debug.js'\r\nimport { logForDiagnosticsNoPII } from './diagLogs.js'\r\nimport { getGlobalClaudeFile } from './env.js'\r\nimport { getClaudeConfigHomeDir, isEnvTruthy } from './envUtils.js'\r\nimport { ConfigParseError, getErrnoCode } from './errors.js'\r\nimport { writeFileSyncAndFlush_DEPRECATED } from './file.js'\r\nimport { getFsImplementation } from './fsOperations.js'\r\nimport { findCanonicalGitRoot } from './git.js'\r\nimport { safeParseJSON } from './json.js'\r\nimport { stripBOM } from './jsonRead.js'\r\nimport * as lockfile from './lockfile.js'\r\nimport { logError } from './log.js'\r\nimport type { MemoryType } from './memory/types.js'\r\nimport { normalizePathForConfigKey } from './path.js'\r\nimport { getEssentialTrafficOnlyReason } from './privacyLevel.js'\r\nimport { getManagedFilePath } from './settings/managedPath.js'\r\nimport type { ThemeSetting } from './theme.js'\r\n\r\n/* eslint-disable @typescript-eslint/no-require-imports */\r\nconst teamMemPaths = feature('TEAMMEM')\r\n  ? (require('../memdir/teamMemPaths.js') as typeof import('../memdir/teamMemPaths.js'))\r\n  : null\r\nconst ccrAutoConnect = feature('CCR_AUTO_CONNECT')\r\n  ? (require('../bridge/bridgeEnabled.js') as typeof import('../bridge/bridgeEnabled.js'))\r\n  : null\r\n\r\n/* eslint-enable @typescript-eslint/no-require-imports */\r\nimport type { ImageDimensions } from './imageResizer.js'\r\nimport type { ModelOption } from './model/modelOptions.js'\r\nimport { jsonParse, jsonStringify } from './slowOperations.js'\r\n\r\n// Re-entrancy guard: prevents getConfig \u2192 logEvent \u2192 getGlobalConfig \u2192 getConfig\r\n// infinite recursion when the config file is corrupted. logEvent's sampling check\r\n// reads GrowthBook features from the global config, which calls getConfig again.\r\nlet insideGetConfig = false\r\n\r\n// Image dimension info for coordinate mapping (only set when image was resized)\r\nexport type PastedContent = {\r\n  id: number // Sequential numeric ID\r\n  type: 'text' | 'image'\r\n  content: string\r\n  mediaType?: string // e.g., 'image/png', 'image/jpeg'\r\n  filename?: string // Display name for images in attachment slot\r\n  dimensions?: ImageDimensions\r\n  sourcePath?: string // Original file path for images dragged onto the terminal\r\n}\r\n\r\nexport interface SerializedStructuredHistoryEntry {\r\n  display: string\r\n  pastedContents?: Record<number, PastedContent>\r\n  pastedText?: string\r\n}\r\nexport interface HistoryEntry {\r\n  display: string\r\n  pastedContents: Record<number, PastedContent>\r\n}\r\n\r\nexport type ReleaseChannel = 'stable' | 'latest'\r\n\r\nexport type ProjectConfig = {\r\n  allowedTools: string[]\r\n  mcpContextUris: string[]\r\n  mcpServers?: Record<string, McpServerConfig>\r\n  lastAPIDuration?: number\r\n  lastAPIDurationWithoutRetries?: number\r\n  lastToolDuration?: number\r\n  lastCost?: number\r\n  lastDuration?: number\r\n  lastLinesAdded?: number\r\n  lastLinesRemoved?: number\r\n  lastTotalInputTokens?: number\r\n  lastTotalOutputTokens?: number\r\n  lastTotalCacheCreationInputTokens?: number\r\n  lastTotalCacheReadInputTokens?: number\r\n  lastTotalWebSearchRequests?: number\r\n  lastFpsAverage?: number\r\n  lastFpsLow1Pct?: number\r\n  lastSessionId?: string\r\n  lastModelUsage?: Record<\r\n    string,\r\n    {\r\n      inputTokens: number\r\n      outputTokens: number\r\n      cacheReadInputTokens: number\r\n      cacheCreationInputTokens: number\r\n      webSearchRequests: number\r\n      costUSD: number\r\n    }\r\n  >\r\n  lastSessionMetrics?: Record<string, number>\r\n  exampleFiles?: string[]\r\n  exampleFilesGeneratedAt?: number\r\n\r\n  // Trust dialog settings\r\n  hasTrustDialogAccepted?: boolean\r\n\r\n  hasCompletedProjectOnboarding?: boolean\r\n  projectOnboardingSeenCount: number\r\n  hasClaudeMdExternalIncludesApproved?: boolean\r\n  hasClaudeMdExternalIncludesWarningShown?: boolean\r\n  // MCP server approval fields - migrated to settings but kept for backward compatibility\r\n  enabledMcpjsonServers?: string[]\r\n  disabledMcpjsonServers?: string[]\r\n  enableAllProjectMcpServers?: boolean\r\n  // List of disabled MCP servers (all scopes) - used for enable/disable toggle\r\n  disabledMcpServers?: string[]\r\n  // Opt-in list for built-in MCP servers that default to disabled\r\n  enabledMcpServers?: string[]\r\n  // Worktree session management\r\n  activeWorktreeSession?: {\r\n    originalCwd: string\r\n    worktreePath: string\r\n    worktreeName: string\r\n    originalBranch?: string\r\n    sessionId: string\r\n    hookBased?: boolean\r\n  }\r\n  /** Spawn mode for `claude remote-control` multi-session. Set by first-run dialog or `w` toggle. */\r\n  remoteControlSpawnMode?: 'same-dir' | 'worktree'\r\n}\r\n\r\nconst DEFAULT_PROJECT_CONFIG: ProjectConfig = {\r\n  allowedTools: [],\r\n  mcpContextUris: [],\r\n  mcpServers: {},\r\n  enabledMcpjsonServers: [],\r\n  disabledMcpjsonServers: [],\r\n  hasTrustDialogAccepted: false,\r\n  projectOnboardingSeenCount: 0,\r\n  hasClaudeMdExternalIncludesApproved: false,\r\n  hasClaudeMdExternalIncludesWarningShown: false,\r\n}\r\n\r\nexport type InstallMethod = 'local' | 'native' | 'global' | 'unknown'\r\n\r\nexport {\r\n  EDITOR_MODES,\r\n  NOTIFICATION_CHANNELS,\r\n} from './configConstants.js'\r\n\r\nimport type { EDITOR_MODES, NOTIFICATION_CHANNELS } from './configConstants.js'\r\n\r\nexport type NotificationChannel = (typeof NOTIFICATION_CHANNELS)[number]\r\n\r\nexport type AccountInfo = {\r\n  accountUuid: string\r\n  emailAddress: string\r\n  organizationUuid?: string\r\n  organizationName?: string | null // added 4/23/2025, not populated for existing users\r\n  organizationRole?: string | null\r\n  workspaceRole?: string | null\r\n  // Populated by /api/oauth/profile\r\n  displayName?: string\r\n  hasExtraUsageEnabled?: boolean\r\n  billingType?: BillingType | null\r\n  accountCreatedAt?: string\r\n  subscriptionCreatedAt?: string\r\n}\r\n\r\n// TODO: 'emacs' is kept for backward compatibility - remove after a few releases\r\nexport type EditorMode = 'emacs' | (typeof EDITOR_MODES)[number]\r\n\r\nexport type DiffTool = 'terminal' | 'auto'\r\n\r\nexport type OutputStyle = string\r\n\r\nexport type GlobalConfig = {\r\n  /**\r\n   * The currently active AI provider. When set, overrides environment-variable-based\r\n   * provider detection. Persists across sessions.\r\n   */\r\n  activeProvider?: string\r\n  /**\r\n   * @deprecated Use settings.apiKeyHelper instead.\r\n   */\r\n  apiKeyHelper?: string\r\n  projects?: Record<string, ProjectConfig>\r\n  numStartups: number\r\n  installMethod?: InstallMethod\r\n  autoUpdates?: boolean\r\n  // Flag to distinguish protection-based disabling from user preference\r\n  autoUpdatesProtectedForNative?: boolean\r\n  // Session count when Doctor was last shown\r\n  doctorShownAtSession?: number\r\n  userID?: string\r\n  theme: ThemeSetting\r\n  hasCompletedOnboarding?: boolean\r\n  // Tracks the last version that reset onboarding, used with MIN_VERSION_REQUIRING_ONBOARDING_RESET\r\n  lastOnboardingVersion?: string\r\n  // Tracks the last version for which release notes were seen, used for managing release notes\r\n  lastReleaseNotesSeen?: string\r\n  // Timestamp when changelog was last fetched (content stored in ~/.claude/cache/changelog.md)\r\n  changelogLastFetched?: number\r\n  // @deprecated - Migrated to ~/.claude/cache/changelog.md. Keep for migration support.\r\n  cachedChangelog?: string\r\n  mcpServers?: Record<string, McpServerConfig>\r\n  // claude.ai MCP connectors that have successfully connected at least once.\r\n  // Used to gate \"connector unavailable\" / \"needs auth\" startup notifications:\r\n  // a connector the user has actually used is worth flagging when it breaks,\r\n  // but an org-configured connector that's been needs-auth since day one is\r\n  // something the user has demonstrably ignored and shouldn't nag about.\r\n  claudeAiMcpEverConnected?: string[]\r\n  preferredNotifChannel: NotificationChannel\r\n  /**\r\n   * @deprecated. Use the Notification hook instead (docs/hooks.md).\r\n   */\r\n  customNotifyCommand?: string\r\n  verbose: boolean\r\n  customApiKeyResponses?: {\r\n    approved?: string[]\r\n    rejected?: string[]\r\n  }\r\n  /**\r\n   * One-time bash setup acknowledgement. Recorded after the user responds\r\n   * to the first-launch BashSetupDialog (whether they approved an install,\r\n   * declined, or already had a usable bash). We never re-prompt once this\r\n   * is set; users who want to re-trigger can clear the field manually or\r\n   * via env var (CLAUDEX_BASH_SETUP_RESET=1).\r\n   */\r\n  bashSetupResponse?: {\r\n    decision: 'satisfied' | 'installed' | 'declined' | 'manual'\r\n    /** ISO timestamp for diagnostics. */\r\n    at: string\r\n    /** Bash source detected at the time, for debugging only. */\r\n    source?: string\r\n  }\r\n  primaryApiKey?: string // Primary API key for the user when no environment variable is set, set via oauth (TODO: rename)\r\n  hasAcknowledgedCostThreshold?: boolean\r\n  hasSeenUndercoverAutoNotice?: boolean // ant-only: whether the one-time auto-undercover explainer has been shown\r\n  hasSeenUltraplanTerms?: boolean // ant-only: whether the one-time CCR terms notice has been shown in the ultraplan launch dialog\r\n  hasResetAutoModeOptInForDefaultOffer?: boolean // ant-only: one-shot migration guard, re-prompts churned auto-mode users\r\n  oauthAccount?: AccountInfo\r\n  iterm2KeyBindingInstalled?: boolean // Legacy - keeping for backward compatibility\r\n  editorMode?: EditorMode\r\n  bypassPermissionsModeAccepted?: boolean\r\n  hasUsedBackslashReturn?: boolean\r\n  autoCompactEnabled: boolean // Controls whether auto-compact is enabled\r\n  showTurnDuration: boolean // Controls whether to show turn duration message (e.g., \"Cooked for 1m 6s\")\r\n  /**\r\n   * @deprecated Use settings.env instead.\r\n   */\r\n  env: { [key: string]: string } // Environment variables to set for the CLI\r\n  hasSeenTasksHint?: boolean // Whether the user has seen the tasks hint\r\n  hasUsedStash?: boolean // Whether the user has used the stash feature (Ctrl+S)\r\n  hasUsedBackgroundTask?: boolean // Whether the user has backgrounded a task (Ctrl+B)\r\n  queuedCommandUpHintCount?: number // Counter for how many times the user has seen the queued command up hint\r\n  diffTool?: DiffTool // Which tool to use for displaying diffs (terminal or vscode)\r\n\r\n  // Terminal setup state tracking\r\n  iterm2SetupInProgress?: boolean\r\n  iterm2BackupPath?: string // Path to the backup file for iTerm2 preferences\r\n  appleTerminalBackupPath?: string // Path to the backup file for Terminal.app preferences\r\n  appleTerminalSetupInProgress?: boolean // Whether Terminal.app setup is currently in progress\r\n\r\n  // Key binding setup tracking\r\n  shiftEnterKeyBindingInstalled?: boolean // Whether Shift+Enter key binding is installed (for iTerm2 or VSCode)\r\n  optionAsMetaKeyInstalled?: boolean // Whether Option as Meta key is installed (for Terminal.app)\r\n\r\n  // IDE configurations\r\n  autoConnectIde?: boolean // Whether to automatically connect to IDE on startup if exactly one valid IDE is available\r\n  autoInstallIdeExtension?: boolean // Whether to automatically install IDE extensions when running from within an IDE\r\n\r\n  // IDE dialogs\r\n  hasIdeOnboardingBeenShown?: Record<string, boolean> // Map of terminal name to whether IDE onboarding has been shown\r\n  ideHintShownCount?: number // Number of times the /ide command hint has been shown\r\n  hasIdeAutoConnectDialogBeenShown?: boolean // Whether the auto-connect IDE dialog has been shown\r\n\r\n  tipsHistory: {\r\n    [tipId: string]: number // Key is tipId, value is the numStartups when tip was last shown\r\n  }\r\n\r\n  // /buddy companion soul \u2014 bones regenerated from userId on read. See src/buddy/.\r\n  companion?: import('../buddy/types.js').StoredCompanion\r\n  companionMuted?: boolean\r\n\r\n  // Feedback survey tracking\r\n  feedbackSurveyState?: {\r\n    lastShownTime?: number\r\n  }\r\n\r\n  // Transcript share prompt tracking (\"Don't ask again\")\r\n  transcriptShareDismissed?: boolean\r\n\r\n  // Memory usage tracking\r\n  memoryUsageCount: number // Number of times user has added to memory\r\n\r\n  // Sonnet-1M configs\r\n  hasShownS1MWelcomeV2?: Record<string, boolean> // Whether the Sonnet-1M v2 welcome message has been shown per org\r\n  // Cache of Sonnet-1M subscriber access per org - key is org ID\r\n  // hasAccess means \"hasAccessAsDefault\" but the old name is kept for backward\r\n  // compatibility.\r\n  s1mAccessCache?: Record<\r\n    string,\r\n    { hasAccess: boolean; hasAccessNotAsDefault?: boolean; timestamp: number }\r\n  >\r\n  // Cache of Sonnet-1M PayG access per org - key is org ID\r\n  // hasAccess means \"hasAccessAsDefault\" but the old name is kept for backward\r\n  // compatibility.\r\n  s1mNonSubscriberAccessCache?: Record<\r\n    string,\r\n    { hasAccess: boolean; hasAccessNotAsDefault?: boolean; timestamp: number }\r\n  >\r\n\r\n  // Guest passes eligibility cache per org - key is org ID\r\n  passesEligibilityCache?: Record<\r\n    string,\r\n    ReferralEligibilityResponse & { timestamp: number }\r\n  >\r\n\r\n  // Grove config cache per account - key is account UUID\r\n  groveConfigCache?: Record<\r\n    string,\r\n    { grove_enabled: boolean; timestamp: number }\r\n  >\r\n\r\n  // Guest passes upsell tracking\r\n  passesUpsellSeenCount?: number // Number of times the guest passes upsell has been shown\r\n  hasVisitedPasses?: boolean // Whether the user has visited /passes command\r\n  passesLastSeenRemaining?: number // Last seen remaining_passes count \u2014 reset upsell when it increases\r\n\r\n  // Overage credit grant upsell tracking (keyed by org UUID \u2014 multi-org users).\r\n  // Inlined shape (not import()) because config.ts is in the SDK build surface\r\n  // and the SDK bundler can't resolve CLI service modules.\r\n  overageCreditGrantCache?: Record<\r\n    string,\r\n    {\r\n      info: {\r\n        available: boolean\r\n        eligible: boolean\r\n        granted: boolean\r\n        amount_minor_units: number | null\r\n        currency: string | null\r\n      }\r\n      timestamp: number\r\n    }\r\n  >\r\n  overageCreditUpsellSeenCount?: number // Number of times the overage credit upsell has been shown\r\n  hasVisitedExtraUsage?: boolean // Whether the user has visited /extra-usage \u2014 hides credit upsells\r\n\r\n  // Voice mode notice tracking\r\n  voiceNoticeSeenCount?: number // Number of times the voice-mode-available notice has been shown\r\n  voiceLangHintShownCount?: number // Number of times the /voice dictation-language hint has been shown\r\n  voiceLangHintLastLanguage?: string // Resolved STT language code when the hint was last shown \u2014 reset count when it changes\r\n  voiceFooterHintSeenCount?: number // Number of sessions the \"hold X to speak\" footer hint has been shown\r\n\r\n  // Opus 1M merge notice tracking\r\n  opus1mMergeNoticeSeenCount?: number // Number of times the opus-1m-merge notice has been shown\r\n\r\n  // Experiment enrollment notice tracking (keyed by experiment id)\r\n  experimentNoticesSeenCount?: Record<string, number>\r\n\r\n  // OpusPlan experiment config\r\n  hasShownOpusPlanWelcome?: Record<string, boolean> // Whether the OpusPlan welcome message has been shown per org\r\n\r\n  // Queue usage tracking\r\n  promptQueueUseCount: number // Number of times use has used the prompt queue\r\n\r\n  // Btw usage tracking\r\n  btwUseCount: number // Number of times user has used /btw\r\n\r\n  // Plan mode usage tracking\r\n  lastPlanModeUse?: number // Timestamp of last plan mode usage\r\n\r\n  // Subscription notice tracking\r\n  subscriptionNoticeCount?: number // Number of times the subscription notice has been shown\r\n  hasAvailableSubscription?: boolean // Cached result of whether user has a subscription available\r\n  subscriptionUpsellShownCount?: number // Number of times the subscription upsell has been shown (deprecated)\r\n  recommendedSubscription?: string // Cached config value from Statsig (deprecated)\r\n\r\n  // Todo feature configuration\r\n  todoFeatureEnabled: boolean // Whether the todo feature is enabled\r\n  showExpandedTodos?: boolean // Whether to show todos expanded, even when empty\r\n  showSpinnerTree?: boolean // Whether to show the teammate spinner tree instead of pills\r\n\r\n  // First start time tracking\r\n  firstStartTime?: string // ISO timestamp when Tau was first started on this machine\r\n\r\n  messageIdleNotifThresholdMs: number // How long the user has to have been idle to get a notification that Claude is done generating\r\n\r\n  githubActionSetupCount?: number // Number of times the user has set up the GitHub Action\r\n  slackAppInstallCount?: number // Number of times the user has clicked to install the Slack app\r\n\r\n  // File checkpointing configuration\r\n  fileCheckpointingEnabled: boolean\r\n\r\n  // Terminal progress bar configuration (OSC 9;4)\r\n  terminalProgressBarEnabled: boolean\r\n\r\n  // Terminal tab status indicator (OSC 21337). When on, emits a colored\r\n  // dot + status text to the tab sidebar and drops the spinner prefix\r\n  // from the title (the dot makes it redundant).\r\n  showStatusInTerminalTab?: boolean\r\n\r\n  // Push-notification toggles (set via /config). Default off \u2014 explicit opt-in required.\r\n  taskCompleteNotifEnabled?: boolean\r\n  inputNeededNotifEnabled?: boolean\r\n  agentPushNotifEnabled?: boolean\r\n\r\n  // Tau usage tracking\r\n  claudeCodeFirstTokenDate?: string // ISO timestamp of the user's first Tau OAuth token\r\n\r\n  // Model switch callout tracking (ant-only)\r\n  modelSwitchCalloutDismissed?: boolean // Whether user chose \"Don't show again\"\r\n  modelSwitchCalloutLastShown?: number // Timestamp of last shown (don't show for 24h)\r\n  modelSwitchCalloutVersion?: string\r\n\r\n  // Effort callout tracking - shown once for Opus 4.6 users\r\n  effortCalloutDismissed?: boolean // v1 - legacy, read to suppress v2 for Pro users who already saw it\r\n  effortCalloutV2Dismissed?: boolean\r\n\r\n  // Remote callout tracking - shown once before first bridge enable\r\n  remoteDialogSeen?: boolean\r\n\r\n  // Cross-process backoff for initReplBridge's oauth_expired_unrefreshable skip.\r\n  // `expiresAt` is the dedup key \u2014 content-addressed, self-clears when /login\r\n  // replaces the token. `failCount` caps false positives: transient refresh\r\n  // failures (auth server 5xx, lock errors) get 3 retries before backoff kicks\r\n  // in, mirroring useReplBridge's MAX_CONSECUTIVE_INIT_FAILURES. Dead-token\r\n  // accounts cap at 3 config writes; healthy+transient-blip self-heals in ~210s.\r\n  bridgeOauthDeadExpiresAt?: number\r\n  bridgeOauthDeadFailCount?: number\r\n\r\n  // Desktop upsell startup dialog tracking\r\n  desktopUpsellSeenCount?: number // Total showings (max 3)\r\n  desktopUpsellDismissed?: boolean // \"Don't ask again\" picked\r\n\r\n  // Idle-return dialog tracking\r\n  idleReturnDismissed?: boolean // \"Don't ask again\" picked\r\n\r\n  // Opus 4.5 Pro migration tracking\r\n  opusProMigrationComplete?: boolean\r\n  opusProMigrationTimestamp?: number\r\n\r\n  // Sonnet 4.5 1m migration tracking\r\n  sonnet1m45MigrationComplete?: boolean\r\n\r\n  // Opus 4.0/4.1 \u2192 current Opus migration (shows one-time notif)\r\n  legacyOpusMigrationTimestamp?: number\r\n\r\n  // Sonnet 4.5 \u2192 4.6 migration (pro/max/team premium)\r\n  sonnet45To46MigrationTimestamp?: number\r\n\r\n  // Cached statsig gate values\r\n  cachedStatsigGates: {\r\n    [gateName: string]: boolean\r\n  }\r\n\r\n  // Cached statsig dynamic configs\r\n  cachedDynamicConfigs?: { [configName: string]: unknown }\r\n\r\n  // Cached GrowthBook feature values\r\n  cachedGrowthBookFeatures?: { [featureName: string]: unknown }\r\n\r\n  // Local GrowthBook overrides (ant-only, set via /config Gates tab).\r\n  // Checked after env-var overrides but before the real resolved value.\r\n  growthBookOverrides?: { [featureName: string]: unknown }\r\n\r\n  // Emergency tip tracking - stores the last shown tip to prevent re-showing\r\n  lastShownEmergencyTip?: string\r\n\r\n  // File picker gitignore behavior\r\n  respectGitignore: boolean // Whether file picker should respect .gitignore files (default: true). Note: .ignore files are always respected\r\n\r\n  // Copy command behavior\r\n  copyFullResponse: boolean // Whether /copy always copies the full response instead of showing the picker\r\n\r\n  // Fullscreen in-app text selection behavior\r\n  copyOnSelect?: boolean // Auto-copy to clipboard on mouse-up (undefined \u2192 true; lets cmd+c \"work\" via no-op)\r\n\r\n  // GitHub repo path mapping for teleport directory switching\r\n  // Key: \"owner/repo\" (lowercase), Value: array of absolute paths where repo is cloned\r\n  githubRepoPaths?: Record<string, string[]>\r\n\r\n  // Terminal emulator to launch for claude-cli:// deep links. Captured from\r\n  // TERM_PROGRAM during interactive sessions since the deep link handler runs\r\n  // headless (LaunchServices/xdg) with no TERM_PROGRAM set.\r\n  deepLinkTerminal?: string\r\n\r\n  // iTerm2 it2 CLI setup\r\n  iterm2It2SetupComplete?: boolean // Whether it2 setup has been verified\r\n  preferTmuxOverIterm2?: boolean // User preference to always use tmux over iTerm2 split panes\r\n\r\n  // Skill usage tracking for autocomplete ranking\r\n  skillUsage?: Record<string, { usageCount: number; lastUsedAt: number }>\r\n  // Official marketplace auto-install tracking\r\n  officialMarketplaceAutoInstallAttempted?: boolean // Whether auto-install was attempted\r\n  officialMarketplaceAutoInstalled?: boolean // Whether auto-install succeeded\r\n  officialMarketplaceAutoInstallFailReason?:\r\n    | 'policy_blocked'\r\n    | 'git_unavailable'\r\n    | 'gcs_unavailable'\r\n    | 'unknown' // Reason for failure if applicable\r\n  officialMarketplaceAutoInstallRetryCount?: number // Number of retry attempts\r\n  officialMarketplaceAutoInstallLastAttemptTime?: number // Timestamp of last attempt\r\n  officialMarketplaceAutoInstallNextRetryTime?: number // Earliest time to retry again\r\n\r\n  // Claude in Chrome settings\r\n  hasCompletedClaudeInChromeOnboarding?: boolean // Whether Claude in Chrome onboarding has been shown\r\n  claudeInChromeDefaultEnabled?: boolean // Whether Claude in Chrome is enabled by default (undefined means platform default)\r\n  cachedChromeExtensionInstalled?: boolean // Cached result of whether Chrome extension is installed\r\n\r\n  // Chrome extension pairing state (persisted across sessions)\r\n  chromeExtension?: {\r\n    pairedDeviceId?: string\r\n    pairedDeviceName?: string\r\n  }\r\n\r\n  // LSP plugin recommendation preferences\r\n  lspRecommendationDisabled?: boolean // Disable all LSP plugin recommendations\r\n  lspRecommendationNeverPlugins?: string[] // Plugin IDs to never suggest\r\n  lspRecommendationIgnoredCount?: number // Track ignored recommendations (stops after 5)\r\n\r\n  // Tau hint protocol state (<claude-code-hint /> tags from CLIs/SDKs).\r\n  // Nested by hint type so future types (docs, mcp, ...) slot in without new\r\n  // top-level keys.\r\n  claudeCodeHints?: {\r\n    // Plugin IDs the user has already been prompted for. Show-once semantics:\r\n    // recorded regardless of yes/no response, never re-prompted. Capped at\r\n    // 100 entries to bound config growth \u2014 past that, hints stop entirely.\r\n    plugin?: string[]\r\n    // User chose \"don't show plugin installation hints again\" from the dialog.\r\n    disabled?: boolean\r\n  }\r\n\r\n  // Permission explainer configuration\r\n  permissionExplainerEnabled?: boolean // Enable Haiku-generated explanations for permission requests (default: true)\r\n\r\n  // Teammate spawn mode: 'auto' | 'tmux' | 'in-process'\r\n  teammateMode?: 'auto' | 'tmux' | 'in-process' // How to spawn teammates (default: 'auto')\r\n  // Model for new teammates when the tool call doesn't pass one.\r\n  // undefined = hardcoded Opus (backward-compat); null = leader's model; string = model alias/ID.\r\n  teammateDefaultModel?: string | null\r\n\r\n  // PR status footer configuration (feature-flagged via GrowthBook)\r\n  prStatusFooterEnabled?: boolean // Show PR review status in footer (default: true)\r\n\r\n  // Tmux live panel visibility (ant-only, toggled via Enter on tmux pill)\r\n  tungstenPanelVisible?: boolean\r\n\r\n  // Cached org-level fast mode status from the API.\r\n  // Used to detect cross-session changes and notify users.\r\n  penguinModeOrgEnabled?: boolean\r\n\r\n  // Epoch ms when background refreshes last ran (fast mode, quota, passes, client data).\r\n  // Used with tengu_cicada_nap_ms to throttle API calls\r\n  startupPrefetchedAt?: number\r\n\r\n  // Run Remote Control at startup (requires BRIDGE_MODE)\r\n  // undefined = use default (see getRemoteControlAtStartup() for precedence)\r\n  remoteControlAtStartup?: boolean\r\n\r\n  // Cached extra usage disabled reason from the last API response\r\n  // undefined = no cache, null = extra usage enabled, string = disabled reason.\r\n  cachedExtraUsageDisabledReason?: string | null\r\n\r\n  // Auto permissions notification tracking (ant-only)\r\n  autoPermissionsNotificationCount?: number // Number of times the auto permissions notification has been shown\r\n\r\n  // Speculation configuration (ant-only)\r\n  speculationEnabled?: boolean // Whether speculation is enabled (default: true)\r\n\r\n\r\n  // Client data for server-side experiments (fetched during bootstrap).\r\n  clientDataCache?: Record<string, unknown> | null\r\n\r\n  // Additional model options for the model picker (fetched during bootstrap).\r\n  additionalModelOptionsCache?: ModelOption[]\r\n\r\n  // Disk cache for /api/claude_code/organizations/metrics_enabled.\r\n  // Org-level settings change rarely; persisting across processes avoids a\r\n  // cold API call on every `claude -p` invocation.\r\n  metricsStatusCache?: {\r\n    enabled: boolean\r\n    timestamp: number\r\n  }\r\n\r\n  // Version of the last-applied migration set. When equal to\r\n  // CURRENT_MIGRATION_VERSION, runMigrations() skips all sync migrations\r\n  // (avoiding 11\u00D7 saveGlobalConfig lock+re-read on every startup).\r\n  migrationVersion?: number\r\n\r\n  // /surf phase router \u2014 user-picked provider+model per work phase. Set by\r\n  // the /surf wizard on first run and updated by re-running /surf config.\r\n  // Persisted so picks survive restarts. Keyed by phase (planning/building/\r\n  // reviewing/thinking/subagent/longContext/background); value holds\r\n  // provider id + model id + optional provider-native effort/reasoning level\r\n  // that the phase detector will switch into when that phase fires.\r\n  //\r\n  // Partial so older 4-phase configs still parse cleanly \u2014 any missing\r\n  // phase is treated as \"don't route this phase\" (surf keeps the current\r\n  // model). This preserves the surf-off-is-zero-change guarantee even\r\n  // after the enum expansion.\r\n  surfPhaseTargets?: Partial<\r\n    Record<\r\n      | 'planning'\r\n      | 'building'\r\n      | 'reviewing'\r\n      | 'thinking'\r\n      | 'subagent'\r\n      | 'longContext'\r\n      | 'background',\r\n      { provider: string; model: string; effort?: string | number }\r\n    >\r\n  >\r\n\r\n  // Whether /fallback should automatically continue on the configured chain\r\n  // when the active model fails with an API/auth/quota/server-side error.\r\n  fallbackEnabled?: boolean\r\n\r\n  // Ordered fallback chain used by /fallback. When fallbackEnabled is true and\r\n  // the active model fails with an eligible provider-side error, Tau\r\n  // continues with these targets in priority order.\r\n  fallbackTargets?: Array<{\r\n    provider: string\r\n    model: string\r\n    effort?: string | number\r\n  }>\r\n\r\n  // Legacy persisted /team-mode toggle. Current sessions keep activation\n  // process-local so every fresh CLI session starts with team mode off.\n  teamModeEnabled?: boolean\n\r\n  // Configured roster for /team-mode. Each fixed role can be bound to a\r\n  // provider+model pair; inactive roles are skipped by the orchestrator.\r\n  teamModeRoles?: Array<{\r\n    role: string\r\n    provider: string\r\n    model: string\r\n    effort?: string | number\r\n    active?: boolean\r\n  }>\r\n\r\n  // Shared \"any-worker\" fallback for /team-mode. When teamModeFallbackEnabled\r\n  // is true AND a worker spawn fails with an eligible error (auth, quota,\r\n  // 4xx, 5xx, network), AgentTool retries once on this provider+model. One\r\n  // shared backup catches failures from every role.\r\n  teamModeFallbackEnabled?: boolean\r\n  teamModeFallbackWorker?: {\r\n    provider: string\r\n    model: string\r\n    effort?: string | number\r\n  }\r\n}\r\n\r\n/**\r\n * Factory for a fresh default GlobalConfig. Used instead of deep-cloning a\r\n * shared constant \u2014 the nested containers (arrays, records) are all empty, so\r\n * a factory gives fresh refs at zero clone cost.\r\n */\r\nfunction createDefaultGlobalConfig(): GlobalConfig {\r\n  return {\r\n    numStartups: 0,\r\n    installMethod: undefined,\r\n    autoUpdates: undefined,\r\n    theme: 'dark',\r\n    preferredNotifChannel: 'auto',\r\n    verbose: false,\r\n    editorMode: 'normal',\r\n    autoCompactEnabled: true,\r\n    showTurnDuration: true,\r\n    hasSeenTasksHint: false,\r\n    hasUsedStash: false,\r\n    hasUsedBackgroundTask: false,\r\n    queuedCommandUpHintCount: 0,\r\n    diffTool: 'auto',\r\n    customApiKeyResponses: {\r\n      approved: [],\r\n      rejected: [],\r\n    },\r\n    env: {},\r\n    tipsHistory: {},\r\n    memoryUsageCount: 0,\r\n    promptQueueUseCount: 0,\r\n    btwUseCount: 0,\r\n    todoFeatureEnabled: true,\r\n    showExpandedTodos: false,\r\n    messageIdleNotifThresholdMs: 60000,\r\n    autoConnectIde: false,\r\n    autoInstallIdeExtension: true,\r\n    fileCheckpointingEnabled: true,\r\n    terminalProgressBarEnabled: true,\r\n    cachedStatsigGates: {},\r\n    cachedDynamicConfigs: {},\r\n    cachedGrowthBookFeatures: {},\r\n    respectGitignore: true,\r\n    copyFullResponse: false,\r\n  }\r\n}\r\n\r\nexport const DEFAULT_GLOBAL_CONFIG: GlobalConfig = createDefaultGlobalConfig()\r\n\r\nexport const GLOBAL_CONFIG_KEYS = [\r\n  'activeProvider',\r\n  'apiKeyHelper',\r\n  'installMethod',\r\n  'autoUpdates',\r\n  'autoUpdatesProtectedForNative',\r\n  'theme',\r\n  'verbose',\r\n  'preferredNotifChannel',\r\n  'shiftEnterKeyBindingInstalled',\r\n  'editorMode',\r\n  'hasUsedBackslashReturn',\r\n  'autoCompactEnabled',\r\n  'showTurnDuration',\r\n  'diffTool',\r\n  'env',\r\n  'tipsHistory',\r\n  'todoFeatureEnabled',\r\n  'showExpandedTodos',\r\n  'messageIdleNotifThresholdMs',\r\n  'autoConnectIde',\r\n  'autoInstallIdeExtension',\r\n  'fileCheckpointingEnabled',\r\n  'terminalProgressBarEnabled',\r\n  'showStatusInTerminalTab',\r\n  'taskCompleteNotifEnabled',\r\n  'inputNeededNotifEnabled',\r\n  'agentPushNotifEnabled',\r\n  'respectGitignore',\r\n  'claudeInChromeDefaultEnabled',\r\n  'hasCompletedClaudeInChromeOnboarding',\r\n  'lspRecommendationDisabled',\r\n  'lspRecommendationNeverPlugins',\r\n  'lspRecommendationIgnoredCount',\r\n  'copyFullResponse',\r\n  'copyOnSelect',\r\n  'permissionExplainerEnabled',\r\n  'prStatusFooterEnabled',\r\n  'remoteControlAtStartup',\r\n  'remoteDialogSeen',\r\n  'surfPhaseTargets',\r\n  'fallbackEnabled',\r\n  'fallbackTargets',\r\n  'teamModeEnabled',\r\n  'teamModeRoles',\r\n  'teamModeFallbackEnabled',\r\n  'teamModeFallbackWorker',\r\n] as const\r\n\r\nexport type GlobalConfigKey = (typeof GLOBAL_CONFIG_KEYS)[number]\r\n\r\nexport function isGlobalConfigKey(key: string): key is GlobalConfigKey {\r\n  return GLOBAL_CONFIG_KEYS.includes(key as GlobalConfigKey)\r\n}\r\n\r\nexport const PROJECT_CONFIG_KEYS = [\r\n  'allowedTools',\r\n  'hasTrustDialogAccepted',\r\n  'hasCompletedProjectOnboarding',\r\n] as const\r\n\r\nexport type ProjectConfigKey = (typeof PROJECT_CONFIG_KEYS)[number]\r\n\r\n/**\r\n * Check if the user has already accepted the trust dialog for the cwd.\r\n *\r\n * This function traverses parent directories to check if a parent directory\r\n * had approval. Accepting trust for a directory implies trust for child\r\n * directories.\r\n *\r\n * @returns Whether the trust dialog has been accepted (i.e. \"should not be shown\")\r\n */\r\nlet _trustAccepted = false\r\n\r\nexport function resetTrustDialogAcceptedCacheForTesting(): void {\r\n  _trustAccepted = false\r\n}\r\n\r\nexport function checkHasTrustDialogAccepted(): boolean {\r\n  // Trust only transitions false\u2192true during a session (never the reverse),\r\n  // so once true we can latch it. false is not cached \u2014 it gets re-checked\r\n  // on every call so that trust dialog acceptance is picked up mid-session.\r\n  // (lodash memoize doesn't fit here because it would also cache false.)\r\n  return (_trustAccepted ||= computeTrustDialogAccepted())\r\n}\r\n\r\nfunction computeTrustDialogAccepted(): boolean {\r\n  // Check session-level trust (for home directory case where trust is not persisted)\r\n  // When running from home dir, trust dialog is shown but acceptance is stored\r\n  // in memory only. This allows hooks and other features to work during the session.\r\n  if (getSessionTrustAccepted()) {\r\n    return true\r\n  }\r\n\r\n  const config = getGlobalConfig()\r\n\r\n  // Always check where trust would be saved (git root or original cwd)\r\n  // This is the primary location where trust is persisted by saveCurrentProjectConfig\r\n  const projectPath = getProjectPathForConfig()\r\n  const projectConfig = config.projects?.[projectPath]\r\n  if (projectConfig?.hasTrustDialogAccepted) {\r\n    return true\r\n  }\r\n\r\n  // Now check from current working directory and its parents\r\n  // Normalize paths for consistent JSON key lookup\r\n  let currentPath = normalizePathForConfigKey(getCwd())\r\n\r\n  // Traverse all parent directories\r\n  while (true) {\r\n    const pathConfig = config.projects?.[currentPath]\r\n    if (pathConfig?.hasTrustDialogAccepted) {\r\n      return true\r\n    }\r\n\r\n    const parentPath = normalizePathForConfigKey(resolve(currentPath, '..'))\r\n    // Stop if we've reached the root (when parent is same as current)\r\n    if (parentPath === currentPath) {\r\n      break\r\n    }\r\n    currentPath = parentPath\r\n  }\r\n\r\n  return false\r\n}\r\n\r\n/**\r\n * Check trust for an arbitrary directory (not the session cwd).\r\n * Walks up from `dir`, returning true if any ancestor has trust persisted.\r\n * Unlike checkHasTrustDialogAccepted, this does NOT consult session trust or\r\n * the memoized project path \u2014 use when the target dir differs from cwd (e.g.\r\n * /assistant installing into a user-typed path).\r\n */\r\nexport function isPathTrusted(dir: string): boolean {\r\n  const config = getGlobalConfig()\r\n  let currentPath = normalizePathForConfigKey(resolve(dir))\r\n  while (true) {\r\n    if (config.projects?.[currentPath]?.hasTrustDialogAccepted) return true\r\n    const parentPath = normalizePathForConfigKey(resolve(currentPath, '..'))\r\n    if (parentPath === currentPath) return false\r\n    currentPath = parentPath\r\n  }\r\n}\r\n\r\n// We have to put this test code here because Jest doesn't support mocking ES modules :O\r\nconst TEST_GLOBAL_CONFIG_FOR_TESTING: GlobalConfig = {\r\n  ...DEFAULT_GLOBAL_CONFIG,\r\n  autoUpdates: false,\r\n}\r\nconst TEST_PROJECT_CONFIG_FOR_TESTING: ProjectConfig = {\r\n  ...DEFAULT_PROJECT_CONFIG,\r\n}\r\n\r\nexport function isProjectConfigKey(key: string): key is ProjectConfigKey {\r\n  return PROJECT_CONFIG_KEYS.includes(key as ProjectConfigKey)\r\n}\r\n\r\n/**\r\n * Detect whether writing `fresh` would lose auth/onboarding state that the\r\n * in-memory cache still has. This happens when `getConfig` hits a corrupted\r\n * or truncated file mid-write (from another process or a non-atomic fallback)\r\n * and returns DEFAULT_GLOBAL_CONFIG. Writing that back would permanently\r\n * wipe auth. See GH #3117.\r\n */\r\nfunction wouldLoseAuthState(fresh: {\r\n  oauthAccount?: unknown\r\n  hasCompletedOnboarding?: boolean\r\n}): boolean {\r\n  const cached = globalConfigCache.config\r\n  if (!cached) return false\r\n  const lostOauth =\r\n    cached.oauthAccount !== undefined && fresh.oauthAccount === undefined\r\n  const lostOnboarding =\r\n    cached.hasCompletedOnboarding === true &&\r\n    fresh.hasCompletedOnboarding !== true\r\n  return lostOauth || lostOnboarding\r\n}\r\n\r\nexport function saveGlobalConfig(\r\n  updater: (currentConfig: GlobalConfig) => GlobalConfig,\r\n): void {\r\n  if (process.env.NODE_ENV === 'test') {\r\n    const config = updater(TEST_GLOBAL_CONFIG_FOR_TESTING)\r\n    // Skip if no changes (same reference returned)\r\n    if (config === TEST_GLOBAL_CONFIG_FOR_TESTING) {\r\n      return\r\n    }\r\n    Object.assign(TEST_GLOBAL_CONFIG_FOR_TESTING, config)\r\n    return\r\n  }\r\n\r\n  let written: GlobalConfig | null = null\r\n  try {\r\n    const didWrite = saveConfigWithLock(\r\n      getGlobalClaudeFile(),\r\n      createDefaultGlobalConfig,\r\n      current => {\r\n        const config = updater(current)\r\n        // Skip if no changes (same reference returned)\r\n        if (config === current) {\r\n          return current\r\n        }\r\n        written = {\r\n          ...config,\r\n          projects: removeProjectHistory(current.projects),\r\n        }\r\n        return written\r\n      },\r\n    )\r\n    // Only write-through if we actually wrote. If the auth-loss guard\r\n    // tripped (or the updater made no changes), the file is untouched and\r\n    // the cache is still valid -- touching it would corrupt the guard.\r\n    if (didWrite && written) {\r\n      writeThroughGlobalConfigCache(written)\r\n    }\r\n  } catch (error) {\r\n    logForDebugging(`Failed to save config with lock: ${error}`, {\r\n      level: 'error',\r\n    })\r\n    // Fall back to non-locked version on error. This fallback is a race\r\n    // window: if another process is mid-write (or the file got truncated),\r\n    // getConfig returns defaults. Refuse to write those over a good cached\r\n    // config to avoid wiping auth. See GH #3117.\r\n    const currentConfig = getConfig(\r\n      getGlobalClaudeFile(),\r\n      createDefaultGlobalConfig,\r\n    )\r\n    if (wouldLoseAuthState(currentConfig)) {\r\n      logForDebugging(\r\n        'saveGlobalConfig fallback: re-read config is missing auth that cache has; refusing to write. See GH #3117.',\r\n        { level: 'error' },\r\n      )\r\n      logEvent('tengu_config_auth_loss_prevented', {})\r\n      return\r\n    }\r\n    const config = updater(currentConfig)\r\n    // Skip if no changes (same reference returned)\r\n    if (config === currentConfig) {\r\n      return\r\n    }\r\n    written = {\r\n      ...config,\r\n      projects: removeProjectHistory(currentConfig.projects),\r\n    }\r\n    saveConfig(getGlobalClaudeFile(), written, DEFAULT_GLOBAL_CONFIG)\r\n    writeThroughGlobalConfigCache(written)\r\n  }\r\n}\r\n\r\n// Cache for global config\r\nlet globalConfigCache: { config: GlobalConfig | null; mtime: number } = {\r\n  config: null,\r\n  mtime: 0,\r\n}\r\n\r\n// Tracking for config file operations (telemetry)\r\nlet lastReadFileStats: { mtime: number; size: number } | null = null\r\nlet configCacheHits = 0\r\nlet configCacheMisses = 0\r\n// Session-total count of actual disk writes to the global config file.\r\n// Exposed for ant-only dev diagnostics (see inc-4552) so anomalous write\r\n// rates surface in the UI before they corrupt ~/.claude.json.\r\nlet globalConfigWriteCount = 0\r\n\r\nexport function getGlobalConfigWriteCount(): number {\r\n  return globalConfigWriteCount\r\n}\r\n\r\nexport const CONFIG_WRITE_DISPLAY_THRESHOLD = 20\r\n\r\nfunction reportConfigCacheStats(): void {\r\n  const total = configCacheHits + configCacheMisses\r\n  if (total > 0) {\r\n    logEvent('tengu_config_cache_stats', {\r\n      cache_hits: configCacheHits,\r\n      cache_misses: configCacheMisses,\r\n      hit_rate: configCacheHits / total,\r\n    })\r\n  }\r\n  configCacheHits = 0\r\n  configCacheMisses = 0\r\n}\r\n\r\n// Register cleanup to report cache stats at session end\r\n// eslint-disable-next-line custom-rules/no-top-level-side-effects\r\nregisterCleanup(async () => {\r\n  reportConfigCacheStats()\r\n})\r\n\r\n/**\r\n * Migrates old autoUpdaterStatus to new installMethod and autoUpdates fields\r\n * @internal\r\n */\r\nfunction migrateConfigFields(config: GlobalConfig): GlobalConfig {\r\n  // Already migrated\r\n  if (config.installMethod !== undefined) {\r\n    return config\r\n  }\r\n\r\n  // autoUpdaterStatus is removed from the type but may exist in old configs\r\n  const legacy = config as GlobalConfig & {\r\n    autoUpdaterStatus?:\r\n      | 'migrated'\r\n      | 'installed'\r\n      | 'disabled'\r\n      | 'enabled'\r\n      | 'no_permissions'\r\n      | 'not_configured'\r\n  }\r\n\r\n  // Determine install method and auto-update preference from old field\r\n  let installMethod: InstallMethod = 'unknown'\r\n  let autoUpdates = config.autoUpdates ?? true // Default to enabled unless explicitly disabled\r\n\r\n  switch (legacy.autoUpdaterStatus) {\r\n    case 'migrated':\r\n      installMethod = 'local'\r\n      break\r\n    case 'installed':\r\n      installMethod = 'native'\r\n      break\r\n    case 'disabled':\r\n      // When disabled, we don't know the install method\r\n      autoUpdates = false\r\n      break\r\n    case 'enabled':\r\n    case 'no_permissions':\r\n    case 'not_configured':\r\n      // These imply global installation\r\n      installMethod = 'global'\r\n      break\r\n    case undefined:\r\n      // No old status, keep defaults\r\n      break\r\n  }\r\n\r\n  return {\r\n    ...config,\r\n    installMethod,\r\n    autoUpdates,\r\n  }\r\n}\r\n\r\n/**\r\n * Removes history field from projects (migrated to history.jsonl)\r\n * @internal\r\n */\r\nfunction removeProjectHistory(\r\n  projects: Record<string, ProjectConfig> | undefined,\r\n): Record<string, ProjectConfig> | undefined {\r\n  if (!projects) {\r\n    return projects\r\n  }\r\n\r\n  const cleanedProjects: Record<string, ProjectConfig> = {}\r\n  let needsCleaning = false\r\n\r\n  for (const [path, projectConfig] of Object.entries(projects)) {\r\n    // history is removed from the type but may exist in old configs\r\n    const legacy = projectConfig as ProjectConfig & { history?: unknown }\r\n    if (legacy.history !== undefined) {\r\n      needsCleaning = true\r\n      const { history, ...cleanedConfig } = legacy\r\n      cleanedProjects[path] = cleanedConfig\r\n    } else {\r\n      cleanedProjects[path] = projectConfig\r\n    }\r\n  }\r\n\r\n  return needsCleaning ? cleanedProjects : projects\r\n}\r\n\r\n// fs.watchFile poll interval for detecting writes from other instances (ms)\r\nconst CONFIG_FRESHNESS_POLL_MS = 1000\r\nlet freshnessWatcherStarted = false\r\n\r\n// fs.watchFile polls stat on the libuv threadpool and only calls us when mtime\r\n// changed \u2014 a stalled stat never blocks the main thread.\r\nfunction startGlobalConfigFreshnessWatcher(): void {\r\n  if (freshnessWatcherStarted || process.env.NODE_ENV === 'test') return\r\n  freshnessWatcherStarted = true\r\n  const file = getGlobalClaudeFile()\r\n  watchFile(\r\n    file,\r\n    { interval: CONFIG_FRESHNESS_POLL_MS, persistent: false },\r\n    curr => {\r\n      // Our own writes fire this too \u2014 the write-through's Date.now()\r\n      // overshoot makes cache.mtime > file mtime, so we skip the re-read.\r\n      // Bun/Node also fire with curr.mtimeMs=0 when the file doesn't exist\r\n      // (initial callback or deletion) \u2014 the <= handles that too.\r\n      if (curr.mtimeMs <= globalConfigCache.mtime) return\r\n      void getFsImplementation()\r\n        .readFile(file, { encoding: 'utf-8' })\r\n        .then(content => {\r\n          // A write-through may have advanced the cache while we were reading;\r\n          // don't regress to the stale snapshot watchFile stat'd.\r\n          if (curr.mtimeMs <= globalConfigCache.mtime) return\r\n          const parsed = safeParseJSON(stripBOM(content))\r\n          if (parsed === null || typeof parsed !== 'object') return\r\n          globalConfigCache = {\r\n            config: migrateConfigFields({\r\n              ...createDefaultGlobalConfig(),\r\n              ...(parsed as Partial<GlobalConfig>),\r\n            }),\r\n            mtime: curr.mtimeMs,\r\n          }\r\n          lastReadFileStats = { mtime: curr.mtimeMs, size: curr.size }\r\n        })\r\n        .catch(() => {})\r\n    },\r\n  )\r\n  registerCleanup(async () => {\r\n    unwatchFile(file)\r\n    freshnessWatcherStarted = false\r\n  })\r\n}\r\n\r\n// Write-through: what we just wrote IS the new config. cache.mtime overshoots\r\n// the file's real mtime (Date.now() is recorded after the write) so the\r\n// freshness watcher skips re-reading our own write on its next tick.\r\nfunction writeThroughGlobalConfigCache(config: GlobalConfig): void {\r\n  globalConfigCache = { config, mtime: Date.now() }\r\n  lastReadFileStats = null\r\n}\r\n\r\nexport function getGlobalConfig(): GlobalConfig {\r\n  if (process.env.NODE_ENV === 'test') {\r\n    return TEST_GLOBAL_CONFIG_FOR_TESTING\r\n  }\r\n\r\n  // Fast path: pure memory read. After startup, this always hits \u2014 our own\r\n  // writes go write-through and other instances' writes are picked up by the\r\n  // background freshness watcher (never blocks this path).\r\n  if (globalConfigCache.config) {\r\n    configCacheHits++\r\n    return globalConfigCache.config\r\n  }\r\n\r\n  // Slow path: startup load. Sync I/O here is acceptable because it runs\r\n  // exactly once, before any UI is rendered. Stat before read so any race\r\n  // self-corrects (old mtime + new content \u2192 watcher re-reads next tick).\r\n  configCacheMisses++\r\n  try {\r\n    let stats: { mtimeMs: number; size: number } | null = null\r\n    try {\r\n      stats = getFsImplementation().statSync(getGlobalClaudeFile())\r\n    } catch {\r\n      // File doesn't exist\r\n    }\r\n    const config = migrateConfigFields(\r\n      getConfig(getGlobalClaudeFile(), createDefaultGlobalConfig),\r\n    )\r\n    globalConfigCache = {\r\n      config,\r\n      mtime: stats?.mtimeMs ?? Date.now(),\r\n    }\r\n    lastReadFileStats = stats\r\n      ? { mtime: stats.mtimeMs, size: stats.size }\r\n      : null\r\n    startGlobalConfigFreshnessWatcher()\r\n    return config\r\n  } catch {\r\n    // If anything goes wrong, fall back to uncached behavior\r\n    return migrateConfigFields(\r\n      getConfig(getGlobalClaudeFile(), createDefaultGlobalConfig),\r\n    )\r\n  }\r\n}\r\n\r\n/**\r\n * Returns the effective value of remoteControlAtStartup. Precedence:\r\n *   1. User's explicit config value (always wins \u2014 honors opt-out)\r\n *   2. CCR auto-connect default (ant-only build, GrowthBook-gated)\r\n *   3. false (Remote Control must be explicitly opted into)\r\n */\r\nexport function getRemoteControlAtStartup(): boolean {\r\n  const explicit = getGlobalConfig().remoteControlAtStartup\r\n  if (explicit !== undefined) return explicit\r\n  if (feature('CCR_AUTO_CONNECT')) {\r\n    if (ccrAutoConnect?.getCcrAutoConnectDefault()) return true\r\n  }\r\n  return false\r\n}\r\n\r\nexport function getCustomApiKeyStatus(\r\n  truncatedApiKey: string,\r\n): 'approved' | 'rejected' | 'new' {\r\n  const config = getGlobalConfig()\r\n  if (config.customApiKeyResponses?.approved?.includes(truncatedApiKey)) {\r\n    return 'approved'\r\n  }\r\n  if (config.customApiKeyResponses?.rejected?.includes(truncatedApiKey)) {\r\n    return 'rejected'\r\n  }\r\n  return 'new'\r\n}\r\n\r\nfunction saveConfig<A extends object>(\r\n  file: string,\r\n  config: A,\r\n  defaultConfig: A,\r\n): void {\r\n  // Ensure the directory exists before writing the config file\r\n  const dir = dirname(file)\r\n  const fs = getFsImplementation()\r\n  // mkdirSync is already recursive in FsOperations implementation\r\n  fs.mkdirSync(dir)\r\n\r\n  // Filter out any values that match the defaults\r\n  const filteredConfig = pickBy(\r\n    config,\r\n    (value, key) =>\r\n      jsonStringify(value) !== jsonStringify(defaultConfig[key as keyof A]),\r\n  )\r\n  // Write config file with secure permissions - mode only applies to new files\r\n  writeFileSyncAndFlush_DEPRECATED(\r\n    file,\r\n    jsonStringify(filteredConfig, null, 2),\r\n    {\r\n      encoding: 'utf-8',\r\n      mode: 0o600,\r\n    },\r\n  )\r\n  if (file === getGlobalClaudeFile()) {\r\n    globalConfigWriteCount++\r\n  }\r\n}\r\n\r\n/**\r\n * Returns true if a write was performed; false if the write was skipped\r\n * (no changes, or auth-loss guard tripped). Callers use this to decide\r\n * whether to invalidate the cache -- invalidating after a skipped write\r\n * destroys the good cached state the auth-loss guard depends on.\r\n */\r\nfunction saveConfigWithLock<A extends object>(\r\n  file: string,\r\n  createDefault: () => A,\r\n  mergeFn: (current: A) => A,\r\n): boolean {\r\n  const defaultConfig = createDefault()\r\n  const dir = dirname(file)\r\n  const fs = getFsImplementation()\r\n\r\n  // Ensure directory exists (mkdirSync is already recursive in FsOperations)\r\n  fs.mkdirSync(dir)\r\n\r\n  let release\r\n  try {\r\n    const lockFilePath = `${file}.lock`\r\n    const startTime = Date.now()\r\n    release = lockfile.lockSync(file, {\r\n      lockfilePath: lockFilePath,\r\n      onCompromised: err => {\r\n        // Default onCompromised throws from a setTimeout callback, which\r\n        // becomes an unhandled exception. Log instead -- the lock being\r\n        // stolen (e.g. after a 10s event-loop stall) is recoverable.\r\n        logForDebugging(`Config lock compromised: ${err}`, { level: 'error' })\r\n      },\r\n    })\r\n    const lockTime = Date.now() - startTime\r\n    if (lockTime > 100) {\r\n      logForDebugging(\r\n        'Lock acquisition took longer than expected - another Claude instance may be running',\r\n      )\r\n      logEvent('tengu_config_lock_contention', {\r\n        lock_time_ms: lockTime,\r\n      })\r\n    }\r\n\r\n    // Check for stale write - file changed since we last read it\r\n    // Only check for global config file since lastReadFileStats tracks that specific file\r\n    if (lastReadFileStats && file === getGlobalClaudeFile()) {\r\n      try {\r\n        const currentStats = fs.statSync(file)\r\n        if (\r\n          currentStats.mtimeMs !== lastReadFileStats.mtime ||\r\n          currentStats.size !== lastReadFileStats.size\r\n        ) {\r\n          logEvent('tengu_config_stale_write', {\r\n            read_mtime: lastReadFileStats.mtime,\r\n            write_mtime: currentStats.mtimeMs,\r\n            read_size: lastReadFileStats.size,\r\n            write_size: currentStats.size,\r\n          })\r\n        }\r\n      } catch (e) {\r\n        const code = getErrnoCode(e)\r\n        if (code !== 'ENOENT') {\r\n          throw e\r\n        }\r\n        // File doesn't exist yet, no stale check needed\r\n      }\r\n    }\r\n\r\n    // Re-read the current config to get latest state. If the file is\r\n    // momentarily corrupted (concurrent writes, kill-during-write), this\r\n    // returns defaults -- we must not write those back over good config.\r\n    const currentConfig = getConfig(file, createDefault)\r\n    if (file === getGlobalClaudeFile() && wouldLoseAuthState(currentConfig)) {\r\n      logForDebugging(\r\n        'saveConfigWithLock: re-read config is missing auth that cache has; refusing to write to avoid wiping ~/.claude.json. See GH #3117.',\r\n        { level: 'error' },\r\n      )\r\n      logEvent('tengu_config_auth_loss_prevented', {})\r\n      return false\r\n    }\r\n\r\n    // Apply the merge function to get the updated config\r\n    const mergedConfig = mergeFn(currentConfig)\r\n\r\n    // Skip write if no changes (same reference returned)\r\n    if (mergedConfig === currentConfig) {\r\n      return false\r\n    }\r\n\r\n    // Filter out any values that match the defaults\r\n    const filteredConfig = pickBy(\r\n      mergedConfig,\r\n      (value, key) =>\r\n        jsonStringify(value) !== jsonStringify(defaultConfig[key as keyof A]),\r\n    )\r\n\r\n    // Create timestamped backup of existing config before writing\r\n    // We keep multiple backups to prevent data loss if a reset/corrupted config\r\n    // overwrites a good backup. Backups are stored in ~/.claude/backups/ to\r\n    // keep the home directory clean.\r\n    try {\r\n      const fileBase = basename(file)\r\n      const backupDir = getConfigBackupDir()\r\n\r\n      // Ensure backup directory exists\r\n      try {\r\n        fs.mkdirSync(backupDir)\r\n      } catch (mkdirErr) {\r\n        const mkdirCode = getErrnoCode(mkdirErr)\r\n        if (mkdirCode !== 'EEXIST') {\r\n          throw mkdirErr\r\n        }\r\n      }\r\n\r\n      // Check existing backups first -- skip creating a new one if a recent\r\n      // backup already exists. During startup, many saveGlobalConfig calls fire\r\n      // within milliseconds of each other; without this check, each call\r\n      // creates a new backup file that accumulates on disk.\r\n      const MIN_BACKUP_INTERVAL_MS = 60_000\r\n      const existingBackups = fs\r\n        .readdirStringSync(backupDir)\r\n        .filter(f => f.startsWith(`${fileBase}.backup.`))\r\n        .sort()\r\n        .reverse() // Most recent first (timestamps sort lexicographically)\r\n\r\n      const mostRecentBackup = existingBackups[0]\r\n      const mostRecentTimestamp = mostRecentBackup\r\n        ? Number(mostRecentBackup.split('.backup.').pop())\r\n        : 0\r\n      const shouldCreateBackup =\r\n        Number.isNaN(mostRecentTimestamp) ||\r\n        Date.now() - mostRecentTimestamp >= MIN_BACKUP_INTERVAL_MS\r\n\r\n      if (shouldCreateBackup) {\r\n        const backupPath = join(backupDir, `${fileBase}.backup.${Date.now()}`)\r\n        fs.copyFileSync(file, backupPath)\r\n      }\r\n\r\n      // Clean up old backups, keeping only the 5 most recent\r\n      const MAX_BACKUPS = 5\r\n      // Re-read if we just created one; otherwise reuse the list\r\n      const backupsForCleanup = shouldCreateBackup\r\n        ? fs\r\n            .readdirStringSync(backupDir)\r\n            .filter(f => f.startsWith(`${fileBase}.backup.`))\r\n            .sort()\r\n            .reverse()\r\n        : existingBackups\r\n\r\n      for (const oldBackup of backupsForCleanup.slice(MAX_BACKUPS)) {\r\n        try {\r\n          fs.unlinkSync(join(backupDir, oldBackup))\r\n        } catch {\r\n          // Ignore cleanup errors\r\n        }\r\n      }\r\n    } catch (e) {\r\n      const code = getErrnoCode(e)\r\n      if (code !== 'ENOENT') {\r\n        logForDebugging(`Failed to backup config: ${e}`, {\r\n          level: 'error',\r\n        })\r\n      }\r\n      // No file to backup or backup failed, continue with write\r\n    }\r\n\r\n    // Write config file with secure permissions - mode only applies to new files\r\n    writeFileSyncAndFlush_DEPRECATED(\r\n      file,\r\n      jsonStringify(filteredConfig, null, 2),\r\n      {\r\n        encoding: 'utf-8',\r\n        mode: 0o600,\r\n      },\r\n    )\r\n    if (file === getGlobalClaudeFile()) {\r\n      globalConfigWriteCount++\r\n    }\r\n    return true\r\n  } finally {\r\n    if (release) {\r\n      release()\r\n    }\r\n  }\r\n}\r\n\r\n// Flag to track if config reading is allowed\r\nlet configReadingAllowed = false\r\n\r\nexport function enableConfigs(): void {\r\n  if (configReadingAllowed) {\r\n    // Ensure this is idempotent\r\n    return\r\n  }\r\n\r\n  const startTime = Date.now()\r\n  logForDiagnosticsNoPII('info', 'enable_configs_started')\r\n\r\n  // Any reads to configuration before this flag is set show an console warning\r\n  // to prevent us from adding config reading during module initialization\r\n  configReadingAllowed = true\r\n  // We only check the global config because currently all the configs share a file\r\n  getConfig(\r\n    getGlobalClaudeFile(),\r\n    createDefaultGlobalConfig,\r\n    true /* throw on invalid */,\r\n  )\r\n\r\n  logForDiagnosticsNoPII('info', 'enable_configs_completed', {\r\n    duration_ms: Date.now() - startTime,\r\n  })\r\n}\r\n\r\n/**\r\n * Returns the directory where config backup files are stored.\r\n * Uses ~/.claude/backups/ to keep the home directory clean.\r\n */\r\nfunction getConfigBackupDir(): string {\r\n  return join(getClaudeConfigHomeDir(), 'backups')\r\n}\r\n\r\n/**\r\n * Find the most recent backup file for a given config file.\r\n * Checks ~/.claude/backups/ first, then falls back to the legacy location\r\n * (next to the config file) for backwards compatibility.\r\n * Returns the full path to the most recent backup, or null if none exist.\r\n */\r\nfunction findMostRecentBackup(file: string): string | null {\r\n  const fs = getFsImplementation()\r\n  const fileBase = basename(file)\r\n  const backupDir = getConfigBackupDir()\r\n\r\n  // Check the new backup directory first\r\n  try {\r\n    const backups = fs\r\n      .readdirStringSync(backupDir)\r\n      .filter(f => f.startsWith(`${fileBase}.backup.`))\r\n      .sort()\r\n\r\n    const mostRecent = backups.at(-1) // Timestamps sort lexicographically\r\n    if (mostRecent) {\r\n      return join(backupDir, mostRecent)\r\n    }\r\n  } catch {\r\n    // Backup dir doesn't exist yet\r\n  }\r\n\r\n  // Fall back to legacy location (next to the config file)\r\n  const fileDir = dirname(file)\r\n\r\n  try {\r\n    const backups = fs\r\n      .readdirStringSync(fileDir)\r\n      .filter(f => f.startsWith(`${fileBase}.backup.`))\r\n      .sort()\r\n\r\n    const mostRecent = backups.at(-1) // Timestamps sort lexicographically\r\n    if (mostRecent) {\r\n      return join(fileDir, mostRecent)\r\n    }\r\n\r\n    // Check for legacy backup file (no timestamp)\r\n    const legacyBackup = `${file}.backup`\r\n    try {\r\n      fs.statSync(legacyBackup)\r\n      return legacyBackup\r\n    } catch {\r\n      // Legacy backup doesn't exist\r\n    }\r\n  } catch {\r\n    // Ignore errors reading directory\r\n  }\r\n\r\n  return null\r\n}\r\n\r\nfunction getConfig<A>(\r\n  file: string,\r\n  createDefault: () => A,\r\n  throwOnInvalid?: boolean,\r\n): A {\r\n  // Log a warning if config is accessed before it's allowed\r\n  if (!configReadingAllowed && process.env.NODE_ENV !== 'test') {\r\n    throw new Error('Config accessed before allowed.')\r\n  }\r\n\r\n  const fs = getFsImplementation()\r\n\r\n  try {\r\n    const fileContent = fs.readFileSync(file, {\r\n      encoding: 'utf-8',\r\n    })\r\n    try {\r\n      // Strip BOM before parsing - PowerShell 5.x adds BOM to UTF-8 files\r\n      const parsedConfig = jsonParse(stripBOM(fileContent))\r\n      return {\r\n        ...createDefault(),\r\n        ...parsedConfig,\r\n      }\r\n    } catch (error) {\r\n      // Throw a ConfigParseError with the file path and default config\r\n      const errorMessage =\r\n        error instanceof Error ? error.message : String(error)\r\n      throw new ConfigParseError(errorMessage, file, createDefault())\r\n    }\r\n  } catch (error) {\r\n    // Handle file not found - check for backup and return default\r\n    const errCode = getErrnoCode(error)\r\n    if (errCode === 'ENOENT') {\r\n      const backupPath = findMostRecentBackup(file)\r\n      if (backupPath) {\r\n        process.stderr.write(\r\n          `\\nClaude configuration file not found at: ${file}\\n` +\r\n            `A backup file exists at: ${backupPath}\\n` +\r\n            `You can manually restore it by running: cp \"${backupPath}\" \"${file}\"\\n\\n`,\r\n        )\r\n      }\r\n      return createDefault()\r\n    }\r\n\r\n    // Re-throw ConfigParseError if throwOnInvalid is true\r\n    if (error instanceof ConfigParseError && throwOnInvalid) {\r\n      throw error\r\n    }\r\n\r\n    // Log config parse errors so users know what happened\r\n    if (error instanceof ConfigParseError) {\r\n      logForDebugging(\r\n        `Config file corrupted, resetting to defaults: ${error.message}`,\r\n        { level: 'error' },\r\n      )\r\n\r\n      // Guard: logEvent \u2192 shouldSampleEvent \u2192 getGlobalConfig \u2192 getConfig\r\n      // causes infinite recursion when the config file is corrupted, because\r\n      // the sampling check reads a GrowthBook feature from global config.\r\n      // Only log analytics on the outermost call.\r\n      if (!insideGetConfig) {\r\n        insideGetConfig = true\r\n        try {\r\n          // Log the error for monitoring\r\n          logError(error)\r\n\r\n          // Log analytics event for config corruption\r\n          let hasBackup = false\r\n          try {\r\n            fs.statSync(`${file}.backup`)\r\n            hasBackup = true\r\n          } catch {\r\n            // No backup\r\n          }\r\n          logEvent('tengu_config_parse_error', {\r\n            has_backup: hasBackup,\r\n          })\r\n        } finally {\r\n          insideGetConfig = false\r\n        }\r\n      }\r\n\r\n      process.stderr.write(\r\n        `\\nClaude configuration file at ${file} is corrupted: ${error.message}\\n`,\r\n      )\r\n\r\n      // Try to backup the corrupted config file (only if not already backed up)\r\n      const fileBase = basename(file)\r\n      const corruptedBackupDir = getConfigBackupDir()\r\n\r\n      // Ensure backup directory exists\r\n      try {\r\n        fs.mkdirSync(corruptedBackupDir)\r\n      } catch (mkdirErr) {\r\n        const mkdirCode = getErrnoCode(mkdirErr)\r\n        if (mkdirCode !== 'EEXIST') {\r\n          throw mkdirErr\r\n        }\r\n      }\r\n\r\n      const existingCorruptedBackups = fs\r\n        .readdirStringSync(corruptedBackupDir)\r\n        .filter(f => f.startsWith(`${fileBase}.corrupted.`))\r\n\r\n      let corruptedBackupPath: string | undefined\r\n      let alreadyBackedUp = false\r\n\r\n      // Check if current corrupted content matches any existing backup\r\n      const currentContent = fs.readFileSync(file, { encoding: 'utf-8' })\r\n      for (const backup of existingCorruptedBackups) {\r\n        try {\r\n          const backupContent = fs.readFileSync(\r\n            join(corruptedBackupDir, backup),\r\n            { encoding: 'utf-8' },\r\n          )\r\n          if (currentContent === backupContent) {\r\n            alreadyBackedUp = true\r\n            break\r\n          }\r\n        } catch {\r\n          // Ignore read errors on backups\r\n        }\r\n      }\r\n\r\n      if (!alreadyBackedUp) {\r\n        corruptedBackupPath = join(\r\n          corruptedBackupDir,\r\n          `${fileBase}.corrupted.${Date.now()}`,\r\n        )\r\n        try {\r\n          fs.copyFileSync(file, corruptedBackupPath)\r\n          logForDebugging(\r\n            `Corrupted config backed up to: ${corruptedBackupPath}`,\r\n            {\r\n              level: 'error',\r\n            },\r\n          )\r\n        } catch {\r\n          // Ignore backup errors\r\n        }\r\n      }\r\n\r\n      // Notify user about corrupted config and available backup\r\n      const backupPath = findMostRecentBackup(file)\r\n      if (corruptedBackupPath) {\r\n        process.stderr.write(\r\n          `The corrupted file has been backed up to: ${corruptedBackupPath}\\n`,\r\n        )\r\n      } else if (alreadyBackedUp) {\r\n        process.stderr.write(`The corrupted file has already been backed up.\\n`)\r\n      }\r\n\r\n      if (backupPath) {\r\n        process.stderr.write(\r\n          `A backup file exists at: ${backupPath}\\n` +\r\n            `You can manually restore it by running: cp \"${backupPath}\" \"${file}\"\\n\\n`,\r\n        )\r\n      } else {\r\n        process.stderr.write(`\\n`)\r\n      }\r\n    }\r\n\r\n    return createDefault()\r\n  }\r\n}\r\n\r\n// Memoized function to get the project path for config lookup\r\nexport const getProjectPathForConfig = memoize((): string => {\r\n  const originalCwd = getOriginalCwd()\r\n  const gitRoot = findCanonicalGitRoot(originalCwd)\r\n\r\n  if (gitRoot) {\r\n    // Normalize for consistent JSON keys (forward slashes on all platforms)\r\n    // This ensures paths like C:\\Users\\... and C:/Users/... map to the same key\r\n    return normalizePathForConfigKey(gitRoot)\r\n  }\r\n\r\n  // Not in a git repo\r\n  return normalizePathForConfigKey(resolve(originalCwd))\r\n})\r\n\r\nexport function getCurrentProjectConfig(): ProjectConfig {\r\n  if (process.env.NODE_ENV === 'test') {\r\n    return TEST_PROJECT_CONFIG_FOR_TESTING\r\n  }\r\n\r\n  const absolutePath = getProjectPathForConfig()\r\n  const config = getGlobalConfig()\r\n\r\n  if (!config.projects) {\r\n    return DEFAULT_PROJECT_CONFIG\r\n  }\r\n\r\n  const projectConfig = config.projects[absolutePath] ?? DEFAULT_PROJECT_CONFIG\r\n  // Not sure how this became a string\r\n  // TODO: Fix upstream\r\n  if (typeof projectConfig.allowedTools === 'string') {\r\n    projectConfig.allowedTools =\r\n      (safeParseJSON(projectConfig.allowedTools) as string[]) ?? []\r\n  }\r\n\r\n  return projectConfig\r\n}\r\n\r\nexport function saveCurrentProjectConfig(\r\n  updater: (currentConfig: ProjectConfig) => ProjectConfig,\r\n): void {\r\n  if (process.env.NODE_ENV === 'test') {\r\n    const config = updater(TEST_PROJECT_CONFIG_FOR_TESTING)\r\n    // Skip if no changes (same reference returned)\r\n    if (config === TEST_PROJECT_CONFIG_FOR_TESTING) {\r\n      return\r\n    }\r\n    Object.assign(TEST_PROJECT_CONFIG_FOR_TESTING, config)\r\n    return\r\n  }\r\n  const absolutePath = getProjectPathForConfig()\r\n\r\n  let written: GlobalConfig | null = null\r\n  try {\r\n    const didWrite = saveConfigWithLock(\r\n      getGlobalClaudeFile(),\r\n      createDefaultGlobalConfig,\r\n      current => {\r\n        const currentProjectConfig =\r\n          current.projects?.[absolutePath] ?? DEFAULT_PROJECT_CONFIG\r\n        const newProjectConfig = updater(currentProjectConfig)\r\n        // Skip if no changes (same reference returned)\r\n        if (newProjectConfig === currentProjectConfig) {\r\n          return current\r\n        }\r\n        written = {\r\n          ...current,\r\n          projects: {\r\n            ...current.projects,\r\n            [absolutePath]: newProjectConfig,\r\n          },\r\n        }\r\n        return written\r\n      },\r\n    )\r\n    if (didWrite && written) {\r\n      writeThroughGlobalConfigCache(written)\r\n    }\r\n  } catch (error) {\r\n    logForDebugging(`Failed to save config with lock: ${error}`, {\r\n      level: 'error',\r\n    })\r\n\r\n    // Same race window as saveGlobalConfig's fallback -- refuse to write\r\n    // defaults over good cached config. See GH #3117.\r\n    const config = getConfig(getGlobalClaudeFile(), createDefaultGlobalConfig)\r\n    if (wouldLoseAuthState(config)) {\r\n      logForDebugging(\r\n        'saveCurrentProjectConfig fallback: re-read config is missing auth that cache has; refusing to write. See GH #3117.',\r\n        { level: 'error' },\r\n      )\r\n      logEvent('tengu_config_auth_loss_prevented', {})\r\n      return\r\n    }\r\n    const currentProjectConfig =\r\n      config.projects?.[absolutePath] ?? DEFAULT_PROJECT_CONFIG\r\n    const newProjectConfig = updater(currentProjectConfig)\r\n    // Skip if no changes (same reference returned)\r\n    if (newProjectConfig === currentProjectConfig) {\r\n      return\r\n    }\r\n    written = {\r\n      ...config,\r\n      projects: {\r\n        ...config.projects,\r\n        [absolutePath]: newProjectConfig,\r\n      },\r\n    }\r\n    saveConfig(getGlobalClaudeFile(), written, DEFAULT_GLOBAL_CONFIG)\r\n    writeThroughGlobalConfigCache(written)\r\n  }\r\n}\r\n\r\nexport function isAutoUpdaterDisabled(): boolean {\r\n  return getAutoUpdaterDisabledReason() !== null\r\n}\r\n\r\n/**\r\n * Returns true if plugin autoupdate should be skipped.\r\n * This checks if the auto-updater is disabled AND the FORCE_AUTOUPDATE_PLUGINS\r\n * env var is not set to 'true'. The env var allows forcing plugin autoupdate\r\n * even when the auto-updater is otherwise disabled.\r\n */\r\nexport function shouldSkipPluginAutoupdate(): boolean {\r\n  return (\r\n    isAutoUpdaterDisabled() &&\r\n    !isEnvTruthy(process.env.FORCE_AUTOUPDATE_PLUGINS)\r\n  )\r\n}\r\n\r\nexport type AutoUpdaterDisabledReason =\r\n  | { type: 'development' }\r\n  | { type: 'env'; envVar: string }\r\n  | { type: 'config' }\r\n\r\nexport function formatAutoUpdaterDisabledReason(\r\n  reason: AutoUpdaterDisabledReason,\r\n): string {\r\n  switch (reason.type) {\r\n    case 'development':\r\n      return 'development build'\r\n    case 'env':\r\n      return `${reason.envVar} set`\r\n    case 'config':\r\n      return 'config'\r\n  }\r\n}\r\n\r\nexport function getAutoUpdaterDisabledReason(): AutoUpdaterDisabledReason | null {\r\n  if (process.env.NODE_ENV === 'development') {\r\n    return { type: 'development' }\r\n  }\r\n  if (isEnvTruthy(process.env.DISABLE_AUTOUPDATER)) {\r\n    return { type: 'env', envVar: 'DISABLE_AUTOUPDATER' }\r\n  }\r\n  const essentialTrafficEnvVar = getEssentialTrafficOnlyReason()\r\n  if (essentialTrafficEnvVar) {\r\n    return { type: 'env', envVar: essentialTrafficEnvVar }\r\n  }\r\n  const config = getGlobalConfig()\r\n  if (\r\n    config.autoUpdates === false &&\r\n    (config.installMethod !== 'native' ||\r\n      config.autoUpdatesProtectedForNative !== true)\r\n  ) {\r\n    return { type: 'config' }\r\n  }\r\n  return null\r\n}\r\n\r\nexport function getOrCreateUserID(): string {\r\n  const config = getGlobalConfig()\r\n  if (config.userID) {\r\n    return config.userID\r\n  }\r\n\r\n  const userID = randomBytes(32).toString('hex')\r\n  saveGlobalConfig(current => ({ ...current, userID }))\r\n  return userID\r\n}\r\n\r\nexport function recordFirstStartTime(): void {\r\n  const config = getGlobalConfig()\r\n  if (!config.firstStartTime) {\r\n    const firstStartTime = new Date().toISOString()\r\n    saveGlobalConfig(current => ({\r\n      ...current,\r\n      firstStartTime: current.firstStartTime ?? firstStartTime,\r\n    }))\r\n  }\r\n}\r\n\r\nexport function getMemoryPath(memoryType: MemoryType): string {\r\n  const cwd = getOriginalCwd()\r\n\r\n  switch (memoryType) {\r\n    case 'User':\r\n      return join(getClaudeConfigHomeDir(), 'CLAUDE.md')\r\n    case 'Local':\r\n      return join(cwd, 'CLAUDE.local.md')\r\n    case 'Project':\r\n      return join(cwd, 'CLAUDE.md')\r\n    case 'Managed':\r\n      return join(getManagedFilePath(), 'CLAUDE.md')\r\n    case 'AutoMem':\r\n      return getAutoMemEntrypoint()\r\n  }\r\n  // TeamMem is only a valid MemoryType when feature('TEAMMEM') is true\r\n  if (feature('TEAMMEM')) {\r\n    return teamMemPaths!.getTeamMemEntrypoint()\r\n  }\r\n  return '' // unreachable in external builds where TeamMem is not in MemoryType\r\n}\r\n\r\nexport function getManagedClaudeRulesDir(): string {\r\n  return join(getManagedFilePath(), '.claude', 'rules')\r\n}\r\n\r\nexport function getUserClaudeRulesDir(): string {\r\n  return join(getClaudeConfigHomeDir(), 'rules')\r\n}\r\n\r\n// Exported for testing only\r\nexport const _getConfigForTesting = getConfig\r\nexport const _wouldLoseAuthStateForTesting = wouldLoseAuthState\r\nexport function _setGlobalConfigCacheForTesting(\r\n  config: GlobalConfig | null,\r\n): void {\r\n  globalConfigCache.config = config\r\n  globalConfigCache.mtime = config ? Date.now() : 0\r\n}\r\n", "import { spawn } from 'child_process'\nimport { createServer, type IncomingMessage, type ServerResponse } from 'http'\nimport { enableConfigs } from '../utils/config.js'\nimport { getTauOfficeDashboardHtml } from './dashboardHtml.js'\nimport { readTauOfficeState } from './state.js'\n\nexport type TauOfficeServerOptions = {\n  host: string\n  port: number\n  open: boolean\n}\n\ntype ParsedArgs = TauOfficeServerOptions & {\n  help: boolean\n  json: boolean\n}\n\nconst DEFAULT_PORT = 8787\nconst DEFAULT_HOST = '127.0.0.1'\n\nexport async function tauOfficeMain(\n  argv: string[] = process.argv.slice(2),\n): Promise<void> {\n  const options = parseArgs(argv)\n\n  if (options.help) {\n    printHelp()\n    return\n  }\n\n  enableConfigs()\n\n  if (options.json) {\n    console.log(JSON.stringify(readTauOfficeState(), null, 2))\n    return\n  }\n\n  const { server, url } = await startTauOfficeServer(options)\n  console.log(`Tau Office listening at ${url}`)\n  console.log(`Runtime state: ${readTauOfficeState().runtimePath}`)\n  console.log('Press Ctrl+C to stop.')\n\n  if (options.open) {\n    openInBrowser(url)\n  }\n\n  const close = () => {\n    server.close(() => {\n      process.exit(0)\n    })\n  }\n\n  process.once('SIGINT', close)\n  process.once('SIGTERM', close)\n}\n\nexport async function startTauOfficeServer(\n  options: TauOfficeServerOptions,\n): Promise<{ server: ReturnType<typeof createServer>; url: string }> {\n  let nextPort = options.port\n  const fixedPort = options.port === 0\n\n  for (let attempt = 0; attempt < 30; attempt++) {\n    const server = createServer(handleRequest)\n    const port = fixedPort ? 0 : nextPort\n\n    try {\n      const actualPort = await listen(server, options.host, port)\n      return {\n        server,\n        url: `http://${displayHost(options.host)}:${actualPort}`,\n      }\n    } catch (error) {\n      server.close()\n      if (fixedPort || !isAddressInUse(error)) {\n        throw error\n      }\n      nextPort += 1\n    }\n  }\n\n  throw new Error(`No open port found starting at ${options.port}`)\n}\n\nfunction handleRequest(req: IncomingMessage, res: ServerResponse): void {\n  const url = new URL(req.url ?? '/', 'http://tau-office.local')\n\n  if (req.method !== 'GET') {\n    writeText(res, 405, 'Method not allowed')\n    return\n  }\n\n  if (url.pathname === '/' || url.pathname === '/index.html') {\n    writeHtml(res, getTauOfficeDashboardHtml())\n    return\n  }\n\n  if (url.pathname === '/api/state') {\n    writeJson(res, readTauOfficeState())\n    return\n  }\n\n  if (url.pathname === '/healthz') {\n    writeJson(res, { ok: true })\n    return\n  }\n\n  writeText(res, 404, 'Not found')\n}\n\nfunction listen(\n  server: ReturnType<typeof createServer>,\n  host: string,\n  port: number,\n): Promise<number> {\n  return new Promise((resolve, reject) => {\n    const onError = (error: Error) => {\n      server.off('listening', onListening)\n      reject(error)\n    }\n    const onListening = () => {\n      server.off('error', onError)\n      const address = server.address()\n      if (address === null || typeof address === 'string') {\n        reject(new Error('Tau Office server did not expose a TCP address'))\n        return\n      }\n      resolve(address.port)\n    }\n\n    server.once('error', onError)\n    server.once('listening', onListening)\n    server.listen(port, host)\n  })\n}\n\nfunction writeHtml(res: ServerResponse, html: string): void {\n  res.writeHead(200, {\n    'content-type': 'text/html; charset=utf-8',\n    'cache-control': 'no-store',\n  })\n  res.end(html)\n}\n\nfunction writeJson(res: ServerResponse, value: unknown): void {\n  res.writeHead(200, {\n    'content-type': 'application/json; charset=utf-8',\n    'cache-control': 'no-store',\n  })\n  res.end(`${JSON.stringify(value, null, 2)}\\n`)\n}\n\nfunction writeText(res: ServerResponse, status: number, value: string): void {\n  res.writeHead(status, {\n    'content-type': 'text/plain; charset=utf-8',\n    'cache-control': 'no-store',\n  })\n  res.end(`${value}\\n`)\n}\n\nfunction parseArgs(argv: string[]): ParsedArgs {\n  const parsed: ParsedArgs = {\n    host: DEFAULT_HOST,\n    port: DEFAULT_PORT,\n    open: process.stdout.isTTY === true && process.env.CI !== 'true',\n    help: false,\n    json: false,\n  }\n\n  for (let index = 0; index < argv.length; index++) {\n    const arg = argv[index]!\n\n    if (arg === '--help' || arg === '-h') {\n      parsed.help = true\n      continue\n    }\n    if (arg === '--json') {\n      parsed.json = true\n      parsed.open = false\n      continue\n    }\n    if (arg === '--open') {\n      parsed.open = true\n      continue\n    }\n    if (arg === '--no-open') {\n      parsed.open = false\n      continue\n    }\n    if (arg === '--host') {\n      parsed.host = readOptionValue(argv, ++index, '--host')\n      continue\n    }\n    if (arg.startsWith('--host=')) {\n      parsed.host = arg.slice('--host='.length)\n      continue\n    }\n    if (arg === '--port') {\n      parsed.port = parsePort(readOptionValue(argv, ++index, '--port'))\n      continue\n    }\n    if (arg.startsWith('--port=')) {\n      parsed.port = parsePort(arg.slice('--port='.length))\n      continue\n    }\n\n    throw new Error(`Unknown Tau Office option: ${arg}`)\n  }\n\n  return parsed\n}\n\nfunction readOptionValue(\n  argv: string[],\n  index: number,\n  flag: string,\n): string {\n  const value = argv[index]\n  if (!value || value.startsWith('-')) {\n    throw new Error(`${flag} requires a value`)\n  }\n  return value\n}\n\nfunction parsePort(value: string): number {\n  const port = Number.parseInt(value, 10)\n  if (!Number.isInteger(port) || port < 0 || port > 65535) {\n    throw new Error(`Invalid Tau Office port: ${value}`)\n  }\n  return port\n}\n\nfunction displayHost(host: string): string {\n  if (host === '0.0.0.0' || host === '::') {\n    return '127.0.0.1'\n  }\n  return host.includes(':') ? `[${host}]` : host\n}\n\nfunction isAddressInUse(error: unknown): boolean {\n  return (\n    typeof error === 'object' &&\n    error !== null &&\n    'code' in error &&\n    (error as { code?: string }).code === 'EADDRINUSE'\n  )\n}\n\nfunction openInBrowser(url: string): void {\n  const platform = process.platform\n  const command =\n    platform === 'win32' ? 'cmd' : platform === 'darwin' ? 'open' : 'xdg-open'\n  const args =\n    platform === 'win32' ? ['/c', 'start', '', url] : [url]\n\n  const child = spawn(command, args, {\n    detached: true,\n    stdio: 'ignore',\n    windowsHide: true,\n  })\n  child.unref()\n}\n\nfunction printHelp(): void {\n  console.log(`Tau Office\n\nUsage:\n  tau-office [options]\n\nOptions:\n  --host <host>   Host to bind. Default: ${DEFAULT_HOST}\n  --port <port>   Port to bind. Default: ${DEFAULT_PORT}\n  --open          Open the dashboard in the default browser.\n  --no-open       Start the server without opening a browser.\n  --json          Print the office state and exit.\n  -h, --help      Show this help.\n`)\n}\n", "export function getTauOfficeDashboardHtml(): string {\n  return String.raw`<!doctype html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n  <title>Tau Office</title>\n  <style>\n    :root {\n      color-scheme: light;\n      --ink: #202027;\n      --ink-soft: #4b4553;\n      --paper: #fff6df;\n      --paper-deep: #f3deaf;\n      --floor: #d9c68f;\n      --floor-line: #bda875;\n      --coral: #ff6f61;\n      --mint: #67d98b;\n      --sky: #6fd3ff;\n      --lemon: #ffd166;\n      --lilac: #c49cff;\n      --peach: #ff9f6e;\n      --shadow: #3c2f2f;\n      --panel: #fff9ea;\n      --panel-2: #ffeec5;\n      --danger: #e94f5f;\n      --ok: #2f9d63;\n      --warn: #bf7d24;\n      --blue: #3474e0;\n      font-family: \"Segoe UI\", \"Trebuchet MS\", system-ui, sans-serif;\n      font-size: 15px;\n    }\n\n    * {\n      box-sizing: border-box;\n    }\n\n    body {\n      margin: 0;\n      min-height: 100vh;\n      background:\n        linear-gradient(90deg, rgba(255,255,255,.24) 1px, transparent 1px) 0 0 / 24px 24px,\n        linear-gradient(0deg, rgba(255,255,255,.18) 1px, transparent 1px) 0 0 / 24px 24px,\n        var(--paper-deep);\n      color: var(--ink);\n      overflow: hidden;\n    }\n\n    button,\n    input {\n      font: inherit;\n    }\n\n    .shell {\n      display: grid;\n      grid-template-columns: minmax(260px, 320px) minmax(520px, 1fr) minmax(280px, 360px);\n      gap: 12px;\n      height: 100vh;\n      padding: 12px;\n    }\n\n    .panel {\n      background: var(--panel);\n      border: 3px solid var(--ink);\n      box-shadow:\n        inset 0 0 0 3px #ffffff,\n        inset 0 0 0 6px var(--panel-2),\n        6px 6px 0 var(--shadow);\n      min-height: 0;\n      overflow: hidden;\n    }\n\n    .left-panel,\n    .right-panel {\n      display: flex;\n      flex-direction: column;\n    }\n\n    .panel-head {\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      gap: 12px;\n      min-height: 56px;\n      padding: 12px 14px;\n      border-bottom: 3px solid var(--ink);\n      background: var(--panel-2);\n    }\n\n    .panel-title {\n      margin: 0;\n      font-size: 15px;\n      letter-spacing: 0;\n      text-transform: uppercase;\n    }\n\n    .pill {\n      display: inline-flex;\n      align-items: center;\n      gap: 6px;\n      min-height: 28px;\n      padding: 3px 8px;\n      border: 2px solid var(--ink);\n      background: #ffffff;\n      box-shadow: 3px 3px 0 rgba(32,32,39,.24);\n      font-size: 12px;\n      font-weight: 800;\n      white-space: nowrap;\n    }\n\n    .status-dot {\n      width: 10px;\n      height: 10px;\n      border: 2px solid var(--ink);\n      background: var(--warn);\n    }\n\n    .status-dot.live,\n    .status-running .status-dot,\n    .status-queued .status-dot {\n      background: var(--mint);\n    }\n\n    .status-dot.off,\n    .status-unconfigured .status-dot,\n    .status-inactive .status-dot {\n      background: #b6a994;\n    }\n\n    .status-dot.bad,\n    .status-failed .status-dot,\n    .status-cancelled .status-dot,\n    .status-interrupted .status-dot {\n      background: var(--danger);\n    }\n\n    .command-card {\n      margin: 14px;\n      padding: 14px;\n      border: 3px solid var(--ink);\n      background: #fffdf5;\n      box-shadow: 4px 4px 0 rgba(32,32,39,.28);\n    }\n\n    .kicker {\n      margin: 0 0 8px;\n      color: var(--ink-soft);\n      font-size: 11px;\n      font-weight: 900;\n      text-transform: uppercase;\n    }\n\n    .worker-name {\n      margin: 0;\n      font-size: 19px;\n      line-height: 1.2;\n    }\n\n    .provider-lockup {\n      display: grid;\n      grid-template-columns: 54px 1fr;\n      gap: 10px;\n      align-items: center;\n      margin-top: 12px;\n    }\n\n    .provider-chip {\n      display: grid;\n      place-items: center;\n      width: 54px;\n      height: 54px;\n      border: 3px solid var(--ink);\n      background: var(--sky);\n      box-shadow: 4px 4px 0 var(--shadow);\n      color: var(--ink);\n      font-weight: 950;\n      text-transform: uppercase;\n    }\n\n    .meta-line {\n      margin: 0;\n      color: var(--ink-soft);\n      font-size: 12px;\n      line-height: 1.35;\n      overflow-wrap: anywhere;\n    }\n\n    .metric-grid {\n      display: grid;\n      grid-template-columns: repeat(2, minmax(0, 1fr));\n      gap: 8px;\n      padding: 0 14px 14px;\n    }\n\n    .metric {\n      border: 2px solid var(--ink);\n      background: #fffdf5;\n      padding: 10px;\n      min-height: 74px;\n    }\n\n    .metric strong {\n      display: block;\n      font-size: 22px;\n      line-height: 1;\n    }\n\n    .metric span {\n      display: block;\n      margin-top: 6px;\n      color: var(--ink-soft);\n      font-size: 11px;\n      font-weight: 800;\n      text-transform: uppercase;\n    }\n\n    .floor-panel {\n      position: relative;\n      display: grid;\n      grid-template-rows: auto minmax(0, 1fr) auto;\n      min-width: 0;\n    }\n\n    .topbar {\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      gap: 12px;\n      padding: 12px 14px;\n      border-bottom: 3px solid var(--ink);\n      background: #ffeead;\n    }\n\n    .brand {\n      display: flex;\n      align-items: center;\n      gap: 10px;\n      min-width: 0;\n    }\n\n    .brand-mark {\n      position: relative;\n      width: 36px;\n      height: 36px;\n      border: 3px solid var(--ink);\n      background: var(--coral);\n      box-shadow: 4px 4px 0 var(--shadow);\n      flex: 0 0 auto;\n    }\n\n    .brand-mark:before,\n    .brand-mark:after {\n      content: \"\";\n      position: absolute;\n      background: var(--ink);\n    }\n\n    .brand-mark:before {\n      left: 7px;\n      right: 7px;\n      top: 15px;\n      height: 3px;\n    }\n\n    .brand-mark:after {\n      top: 7px;\n      bottom: 7px;\n      left: 15px;\n      width: 3px;\n    }\n\n    .brand h1 {\n      margin: 0;\n      font-size: 20px;\n      line-height: 1.05;\n      text-transform: uppercase;\n    }\n\n    .brand p {\n      margin: 3px 0 0;\n      color: var(--ink-soft);\n      font-size: 12px;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      white-space: nowrap;\n    }\n\n    .toolbar {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      flex-wrap: wrap;\n      justify-content: flex-end;\n    }\n\n    .floor-wrap {\n      min-height: 0;\n      padding: 12px;\n      background: #f8e7b8;\n    }\n\n    #officeFloor {\n      display: block;\n      width: 100%;\n      height: 100%;\n      min-height: 420px;\n      border: 3px solid var(--ink);\n      background: var(--floor);\n      box-shadow: inset 0 0 0 4px rgba(255,255,255,.45);\n    }\n\n    .dock {\n      display: grid;\n      grid-template-columns: repeat(9, minmax(86px, 1fr));\n      gap: 8px;\n      padding: 10px 12px 12px;\n      border-top: 3px solid var(--ink);\n      background: var(--panel-2);\n      overflow-x: auto;\n    }\n\n    .mini-worker {\n      min-width: 86px;\n      border: 2px solid var(--ink);\n      background: #fffdf5;\n      padding: 8px;\n      box-shadow: 3px 3px 0 rgba(32,32,39,.22);\n    }\n\n    .mini-worker strong {\n      display: block;\n      font-size: 11px;\n      line-height: 1.2;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      white-space: nowrap;\n    }\n\n    .mini-worker span {\n      display: block;\n      margin-top: 5px;\n      color: var(--ink-soft);\n      font-size: 10px;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      white-space: nowrap;\n    }\n\n    .scroll-area {\n      min-height: 0;\n      overflow: auto;\n      padding: 14px;\n    }\n\n    .list {\n      display: grid;\n      gap: 10px;\n    }\n\n    .event,\n    .run {\n      border: 2px solid var(--ink);\n      background: #fffdf5;\n      padding: 10px;\n      box-shadow: 3px 3px 0 rgba(32,32,39,.18);\n    }\n\n    .event.warn,\n    .run.failed,\n    .run.cancelled,\n    .run.interrupted {\n      background: #ffe1df;\n    }\n\n    .event.info,\n    .run.completed {\n      background: #e9ffe9;\n    }\n\n    .run.running,\n    .run.queued {\n      background: #e5f8ff;\n    }\n\n    .row {\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      gap: 8px;\n    }\n\n    .row strong {\n      min-width: 0;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      white-space: nowrap;\n      font-size: 13px;\n    }\n\n    .time {\n      color: var(--ink-soft);\n      font-size: 11px;\n      white-space: nowrap;\n    }\n\n    .body-text {\n      margin: 8px 0 0;\n      color: var(--ink-soft);\n      font-size: 12px;\n      line-height: 1.35;\n      overflow-wrap: anywhere;\n    }\n\n    .empty {\n      display: grid;\n      place-items: center;\n      min-height: 120px;\n      border: 2px dashed var(--ink);\n      color: var(--ink-soft);\n      background: rgba(255,255,255,.45);\n      font-weight: 800;\n      text-align: center;\n      padding: 18px;\n    }\n\n    .svg-label {\n      font-family: \"Segoe UI\", system-ui, sans-serif;\n      font-weight: 900;\n      letter-spacing: 0;\n      fill: var(--ink);\n    }\n\n    .avatar-body {\n      transition: transform .25s ease;\n    }\n\n    .desk-running .avatar-body,\n    .desk-queued .avatar-body {\n      animation: bob .85s steps(2, end) infinite;\n    }\n\n    .desk-failed .avatar-body,\n    .desk-cancelled .avatar-body,\n    .desk-interrupted .avatar-body {\n      transform: translateY(3px);\n    }\n\n    @keyframes bob {\n      0%, 100% { transform: translateY(0); }\n      50% { transform: translateY(-4px); }\n    }\n\n    @media (max-width: 1180px) {\n      body {\n        overflow: auto;\n      }\n\n      .shell {\n        height: auto;\n        min-height: 100vh;\n        grid-template-columns: 1fr;\n      }\n\n      #officeFloor {\n        min-height: 520px;\n      }\n\n      .dock {\n        grid-template-columns: repeat(3, minmax(120px, 1fr));\n      }\n    }\n\n    @media (max-width: 640px) {\n      body {\n        overflow-x: hidden;\n      }\n\n      .shell {\n        padding: 8px;\n        gap: 8px;\n      }\n\n      .panel {\n        box-shadow:\n          inset 0 0 0 3px #ffffff,\n          inset 0 0 0 6px var(--panel-2),\n          4px 4px 0 var(--shadow);\n      }\n\n      .topbar,\n      .panel-head {\n        align-items: flex-start;\n        flex-direction: column;\n      }\n\n      .toolbar {\n        justify-content: flex-start;\n      }\n\n      .metric-grid {\n        grid-template-columns: 1fr;\n      }\n\n      .row {\n        align-items: flex-start;\n        flex-direction: column;\n      }\n\n      .pill {\n        max-width: 100%;\n        white-space: normal;\n      }\n\n      .dock {\n        grid-template-columns: repeat(2, minmax(120px, 1fr));\n      }\n    }\n  </style>\n</head>\n<body>\n  <div class=\"shell\">\n    <aside class=\"panel left-panel\">\n      <div class=\"panel-head\">\n        <h2 class=\"panel-title\">Command Center</h2>\n        <span class=\"pill\" id=\"runtimeBadge\"><span class=\"status-dot off\"></span><span>Loading</span></span>\n      </div>\n      <section class=\"command-card\" id=\"orchestratorCard\"></section>\n      <section class=\"metric-grid\">\n        <div class=\"metric\"><strong id=\"metricConfigured\">0</strong><span>Configured desks</span></div>\n        <div class=\"metric\"><strong id=\"metricActive\">0</strong><span>Active desks</span></div>\n        <div class=\"metric\"><strong id=\"metricRuns\">0</strong><span>Live runs</span></div>\n        <div class=\"metric\"><strong id=\"metricDone\">0</strong><span>Completed</span></div>\n      </section>\n      <div class=\"scroll-area\">\n        <div class=\"list\" id=\"workerList\"></div>\n      </div>\n    </aside>\n\n    <main class=\"panel floor-panel\">\n      <header class=\"topbar\">\n        <div class=\"brand\">\n          <span class=\"brand-mark\" aria-hidden=\"true\"></span>\n          <div>\n            <h1>Tau Office</h1>\n            <p id=\"runtimePath\">Team-mode runtime</p>\n          </div>\n        </div>\n        <div class=\"toolbar\">\n          <span class=\"pill\" id=\"teamName\">team-mode</span>\n          <span class=\"pill\" id=\"updatedAt\">Waiting</span>\n        </div>\n      </header>\n      <section class=\"floor-wrap\">\n        <svg id=\"officeFloor\" viewBox=\"0 0 1120 720\" role=\"img\" aria-label=\"Tau Office floor\"></svg>\n      </section>\n      <section class=\"dock\" id=\"workerDock\"></section>\n    </main>\n\n    <aside class=\"panel right-panel\">\n      <div class=\"panel-head\">\n        <h2 class=\"panel-title\">Activity</h2>\n        <span class=\"pill\" id=\"fallbackBadge\">Fallback off</span>\n      </div>\n      <div class=\"scroll-area\">\n        <h3 class=\"kicker\">Recent Runs</h3>\n        <div class=\"list\" id=\"recentRuns\"></div>\n        <h3 class=\"kicker\" style=\"margin-top:18px\">Mission Log</h3>\n        <div class=\"list\" id=\"missionLog\"></div>\n      </div>\n    </aside>\n  </div>\n\n  <script>\n    const floor = document.getElementById('officeFloor');\n    const positions = [\n      [86, 108], [410, 108], [734, 108],\n      [86, 314], [410, 314], [734, 314],\n      [86, 520], [410, 520], [734, 520]\n    ];\n\n    const stationIcons = {\n      orchestrator: 'CC',\n      architect: 'BP',\n      implementer: 'BD',\n      reviewer: 'RV',\n      verifier: 'QA',\n      devops: 'DP',\n      docs: 'DS',\n      'dependency-manager': 'PK',\n      explorer: 'MP'\n    };\n\n    let lastState = null;\n\n    function escapeHtml(value) {\n      return String(value ?? '')\n        .replace(/&/g, '&amp;')\n        .replace(/</g, '&lt;')\n        .replace(/>/g, '&gt;')\n        .replace(/\"/g, '&quot;')\n        .replace(/'/g, '&#39;');\n    }\n\n    function initials(value) {\n      const words = String(value || 'AI').replace(/[^a-z0-9 ]/gi, ' ').trim().split(/\\s+/);\n      return words.slice(0, 2).map(word => word[0] || '').join('').toUpperCase() || 'AI';\n    }\n\n    function fmtTime(value) {\n      if (!value) return 'Never';\n      const date = new Date(value);\n      if (Number.isNaN(date.getTime())) return String(value);\n      return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' });\n    }\n\n    function fmtAge(value) {\n      if (!value) return '';\n      const date = new Date(value);\n      if (Number.isNaN(date.getTime())) return '';\n      const seconds = Math.max(0, Math.round((Date.now() - date.getTime()) / 1000));\n      if (seconds < 60) return seconds + 's ago';\n      const minutes = Math.round(seconds / 60);\n      if (minutes < 60) return minutes + 'm ago';\n      return Math.round(minutes / 60) + 'h ago';\n    }\n\n    function statusClass(status) {\n      return 'status-' + String(status || 'idle');\n    }\n\n    function render(state) {\n      lastState = state;\n      renderTop(state);\n      renderOrchestrator(state.orchestrator);\n      renderMetrics(state);\n      renderWorkers(state.workers || []);\n      renderFloor(state.workers || []);\n      renderDock(state.workers || []);\n      renderActivity(state);\n    }\n\n    function renderTop(state) {\n      const runtimeBadge = document.getElementById('runtimeBadge');\n      runtimeBadge.innerHTML =\n        '<span class=\"status-dot ' + (state.enabled ? 'live' : 'off') + '\"></span>' +\n        '<span>' + (state.enabled ? 'Team mode live' : (state.runtimeExists ? 'Team mode idle' : 'No runtime')) + '</span>';\n\n      document.getElementById('teamName').textContent = state.teamName || 'team-mode';\n      document.getElementById('updatedAt').textContent = 'Updated ' + fmtTime(state.updatedAt || state.generatedAt);\n      document.getElementById('runtimePath').textContent = state.runtimePath || 'Team-mode runtime';\n\n      const fb = state.fallback || { enabled: false };\n      document.getElementById('fallbackBadge').textContent = fb.enabled\n        ? 'Fallback ' + (fb.providerLabel || fb.provider || 'on')\n        : 'Fallback off';\n    }\n\n    function renderOrchestrator(worker) {\n      const el = document.getElementById('orchestratorCard');\n      if (!worker || !worker.configured) {\n        el.innerHTML =\n          '<p class=\"kicker\">Manager Desk</p>' +\n          '<h3 class=\"worker-name\">Unconfigured</h3>' +\n          '<p class=\"body-text\">The orchestrator seat is empty.</p>';\n        return;\n      }\n      el.className = 'command-card ' + statusClass(worker.status);\n      el.innerHTML =\n        '<p class=\"kicker\">' + escapeHtml(worker.station) + '</p>' +\n        '<h3 class=\"worker-name\">' + escapeHtml(worker.label) + '</h3>' +\n        '<div class=\"provider-lockup\">' +\n          '<div class=\"provider-chip\" style=\"background:' + escapeHtml(worker.accent) + '\">' + escapeHtml(initials(worker.providerLabel)) + '</div>' +\n          '<div>' +\n            '<p class=\"meta-line\"><strong>' + escapeHtml(worker.providerLabel || 'No provider') + '</strong></p>' +\n            '<p class=\"meta-line\">' + escapeHtml(worker.modelLabel || worker.model || 'No model') + '</p>' +\n            '<p class=\"meta-line\">' + escapeHtml(worker.statusLabel) + '</p>' +\n          '</div>' +\n        '</div>' +\n        (worker.activeRun\n          ? '<p class=\"body-text\">' + escapeHtml(worker.activeRun.description || worker.activeRun.promptPreview || 'Active worker run') + '</p>'\n          : '');\n    }\n\n    function renderMetrics(state) {\n      document.getElementById('metricConfigured').textContent = String(state.configuredWorkerCount || 0);\n      document.getElementById('metricActive').textContent = String(state.activeWorkerCount || 0);\n      document.getElementById('metricRuns').textContent = String(state.activeRunCount || 0);\n      document.getElementById('metricDone').textContent = String((state.runCounts && state.runCounts.completed) || 0);\n    }\n\n    function renderWorkers(workers) {\n      const list = document.getElementById('workerList');\n      list.innerHTML = workers.map(worker =>\n        '<article class=\"run ' + escapeHtml(worker.status) + '\">' +\n          '<div class=\"row\">' +\n            '<strong>' + escapeHtml(worker.label) + '</strong>' +\n            '<span class=\"pill ' + statusClass(worker.status) + '\"><span class=\"status-dot\"></span>' + escapeHtml(worker.statusLabel) + '</span>' +\n          '</div>' +\n          '<p class=\"body-text\">' + escapeHtml(worker.providerLabel || 'No provider') + ' / ' + escapeHtml(worker.modelLabel || worker.model || 'No model') + '</p>' +\n        '</article>'\n      ).join('');\n    }\n\n    function renderFloor(workers) {\n      const grid = [];\n      for (let x = 0; x <= 1120; x += 56) {\n        grid.push('<line x1=\"' + x + '\" y1=\"0\" x2=\"' + x + '\" y2=\"720\" stroke=\"#bda875\" stroke-width=\"2\" opacity=\".45\"/>');\n      }\n      for (let y = 0; y <= 720; y += 56) {\n        grid.push('<line x1=\"0\" y1=\"' + y + '\" x2=\"1120\" y2=\"' + y + '\" stroke=\"#bda875\" stroke-width=\"2\" opacity=\".45\"/>');\n      }\n\n      const furniture =\n        '<rect x=\"20\" y=\"20\" width=\"1080\" height=\"680\" fill=\"none\" stroke=\"#202027\" stroke-width=\"6\"/>' +\n        '<rect x=\"24\" y=\"24\" width=\"1072\" height=\"52\" fill=\"#ffeead\" stroke=\"#202027\" stroke-width=\"4\"/>' +\n        '<text x=\"44\" y=\"58\" class=\"svg-label\" font-size=\"24\">PROVIDER FLOOR</text>' +\n        '<rect x=\"940\" y=\"28\" width=\"72\" height=\"40\" fill=\"#67d98b\" stroke=\"#202027\" stroke-width=\"4\"/>' +\n        '<rect x=\"1020\" y=\"28\" width=\"58\" height=\"40\" fill=\"#ff6f61\" stroke=\"#202027\" stroke-width=\"4\"/>' +\n        '<rect x=\"32\" y=\"584\" width=\"54\" height=\"92\" fill=\"#fff9ea\" stroke=\"#202027\" stroke-width=\"4\"/>' +\n        '<text x=\"43\" y=\"632\" class=\"svg-label\" font-size=\"10\" transform=\"rotate(-90 43 632)\">MAILBOX</text>' +\n        '<rect x=\"1014\" y=\"584\" width=\"62\" height=\"92\" fill=\"#fff9ea\" stroke=\"#202027\" stroke-width=\"4\"/>' +\n        '<text x=\"1052\" y=\"642\" class=\"svg-label\" font-size=\"10\" transform=\"rotate(-90 1052 642)\">OUTPUTS</text>';\n\n      const desks = workers.map((worker, index) => deskSvg(worker, positions[index] || [80, 80], index)).join('');\n      floor.innerHTML =\n        '<defs>' +\n          '<filter id=\"hardShadow\" x=\"-10%\" y=\"-10%\" width=\"120%\" height=\"120%\">' +\n            '<feDropShadow dx=\"5\" dy=\"5\" stdDeviation=\"0\" flood-color=\"#3c2f2f\" flood-opacity=\"1\"/>' +\n          '</filter>' +\n        '</defs>' +\n        grid.join('') +\n        furniture +\n        desks;\n    }\n\n    function deskSvg(worker, position, index) {\n      const x = position[0];\n      const y = position[1];\n      const status = worker.status || 'idle';\n      const provider = worker.providerLabel || 'No provider';\n      const label = worker.label || worker.role;\n      const badge = stationIcons[worker.role] || String(index + 1);\n      const color = worker.accent || '#6fd3ff';\n      const screen = status === 'running' || status === 'queued' ? '#67d98b' : status === 'failed' ? '#e94f5f' : '#d6ecff';\n      const text = worker.activeRun\n        ? (worker.activeRun.description || worker.activeRun.promptPreview || 'Active run')\n        : worker.statusLabel;\n\n      return '' +\n        '<g class=\"desk-' + escapeHtml(status) + '\" transform=\"translate(' + x + ' ' + y + ')\" filter=\"url(#hardShadow)\">' +\n          '<rect x=\"0\" y=\"62\" width=\"216\" height=\"126\" fill=\"#fff9ea\" stroke=\"#202027\" stroke-width=\"5\"/>' +\n          '<rect x=\"15\" y=\"78\" width=\"186\" height=\"30\" fill=\"' + escapeHtml(screen) + '\" stroke=\"#202027\" stroke-width=\"4\"/>' +\n          '<rect x=\"18\" y=\"122\" width=\"48\" height=\"38\" fill=\"' + escapeHtml(color) + '\" stroke=\"#202027\" stroke-width=\"4\"/>' +\n          '<rect x=\"78\" y=\"122\" width=\"72\" height=\"16\" fill=\"#ffd166\" stroke=\"#202027\" stroke-width=\"4\"/>' +\n          '<text x=\"85\" y=\"135\" class=\"svg-label\" font-size=\"10\">' + escapeHtml(badge) + '</text>' +\n          '<text x=\"16\" y=\"174\" class=\"svg-label\" font-size=\"14\">' + escapeHtml(label).slice(0, 18) + '</text>' +\n          '<text x=\"16\" y=\"184\" class=\"svg-label\" font-size=\"9\" fill=\"#4b4553\">' + escapeHtml(provider).slice(0, 28) + '</text>' +\n          '<g class=\"avatar-body\" transform=\"translate(112 0)\">' +\n            '<rect x=\"20\" y=\"0\" width=\"44\" height=\"44\" fill=\"' + escapeHtml(color) + '\" stroke=\"#202027\" stroke-width=\"5\"/>' +\n            '<rect x=\"30\" y=\"13\" width=\"7\" height=\"7\" fill=\"#202027\"/>' +\n            '<rect x=\"50\" y=\"13\" width=\"7\" height=\"7\" fill=\"#202027\"/>' +\n            '<rect x=\"36\" y=\"30\" width=\"18\" height=\"5\" fill=\"#202027\"/>' +\n            '<rect x=\"26\" y=\"44\" width=\"36\" height=\"30\" fill=\"#ffffff\" stroke=\"#202027\" stroke-width=\"5\"/>' +\n          '</g>' +\n          '<foreignObject x=\"0\" y=\"4\" width=\"104\" height=\"46\">' +\n            '<div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"font:800 10px Segoe UI,sans-serif;line-height:1.2;color:#202027;background:#fffdf5;border:3px solid #202027;padding:4px;overflow:hidden;height:46px\">' +\n              escapeHtml(text).slice(0, 44) +\n            '</div>' +\n          '</foreignObject>' +\n        '</g>';\n    }\n\n    function renderDock(workers) {\n      document.getElementById('workerDock').innerHTML = workers.map(worker =>\n        '<div class=\"mini-worker ' + statusClass(worker.status) + '\">' +\n          '<strong>' + escapeHtml(worker.label) + '</strong>' +\n          '<span>' + escapeHtml(worker.providerLabel || 'No provider') + '</span>' +\n          '<span>' + escapeHtml(worker.statusLabel) + '</span>' +\n        '</div>'\n      ).join('');\n    }\n\n    function renderActivity(state) {\n      const runs = state.recentRuns || [];\n      const log = state.missionLog || [];\n      document.getElementById('recentRuns').innerHTML = runs.length\n        ? runs.map(run =>\n            '<article class=\"run ' + escapeHtml(run.status) + '\">' +\n              '<div class=\"row\"><strong>' + escapeHtml(run.role) + '</strong><span class=\"time\">' + fmtAge(run.updatedAt) + '</span></div>' +\n              '<p class=\"body-text\">' + escapeHtml(run.providerLabel) + ' / ' + escapeHtml(run.modelLabel) + '</p>' +\n              '<p class=\"body-text\">' + escapeHtml(run.error || run.resultPreview || run.description || run.promptPreview || run.status) + '</p>' +\n            '</article>'\n          ).join('')\n        : '<div class=\"empty\">No worker runs yet.</div>';\n\n      document.getElementById('missionLog').innerHTML = log.length\n        ? log.map(entry =>\n            '<article class=\"event ' + escapeHtml(entry.level) + '\">' +\n              '<div class=\"row\"><strong>' + escapeHtml(entry.event) + '</strong><span class=\"time\">' + fmtAge(entry.at) + '</span></div>' +\n              '<p class=\"body-text\">' + escapeHtml([entry.role, entry.detail].filter(Boolean).join(' - ') || entry.runId || 'Runtime event') + '</p>' +\n            '</article>'\n          ).join('')\n        : '<div class=\"empty\">No mission log entries yet.</div>';\n    }\n\n    async function refresh() {\n      try {\n        const response = await fetch('/api/state', { cache: 'no-store' });\n        if (!response.ok) throw new Error('state request failed');\n        render(await response.json());\n      } catch (error) {\n        const runtimeBadge = document.getElementById('runtimeBadge');\n        runtimeBadge.innerHTML = '<span class=\"status-dot bad\"></span><span>Disconnected</span>';\n        if (!lastState) {\n          floor.innerHTML = '<text x=\"60\" y=\"100\" class=\"svg-label\" font-size=\"24\">Tau Office server disconnected</text>';\n        }\n      }\n    }\n\n    refresh();\n    setInterval(refresh, 1500);\n  </script>\n</body>\n</html>`;\n}\n", "import {\n  PROVIDER_DISPLAY_NAMES,\n  type APIProvider,\n} from '../utils/model/providers.js'\nimport {\n  getTeamModeRoleSlots,\n  TEAM_MODE_ROLE_IDS,\n  TEAM_MODE_ROLE_META,\n  type TeamModeRoleId,\n} from '../utils/teamMode/state.js'\nimport {\n  getTeamModeRuntimePath,\n  readTeamModeRuntimeState,\n  summarizeTeamModeRuntime,\n  type TeamModeRunRecord,\n  type TeamModeRunStatus,\n  type TeamModeRuntimeRole,\n  type TeamModeRuntimeState,\n} from '../utils/teamMode/runtime.js'\n\nexport type TauOfficeWorkerStatus =\n  | 'unconfigured'\n  | 'inactive'\n  | 'idle'\n  | 'queued'\n  | 'running'\n  | 'completed'\n  | 'failed'\n  | 'cancelled'\n  | 'interrupted'\n\nexport type TauOfficeRunSummary = {\n  id: string\n  role: string\n  provider: string\n  providerLabel: string\n  model: string\n  modelLabel: string\n  status: TeamModeRunStatus\n  description?: string\n  promptPreview?: string\n  resultPreview?: string\n  error?: string\n  runInBackground?: boolean\n  startedAt: string\n  updatedAt: string\n  completedAt?: string\n}\n\nexport type TauOfficeWorker = {\n  role: TeamModeRoleId\n  label: string\n  description: string\n  station: string\n  provider?: APIProvider | string\n  providerLabel?: string\n  model?: string\n  modelLabel?: string\n  effort?: string | number\n  active: boolean\n  configured: boolean\n  status: TauOfficeWorkerStatus\n  statusLabel: string\n  accent: string\n  latestRun?: TauOfficeRunSummary\n  activeRun?: TauOfficeRunSummary\n  latestOutcome?: {\n    runId: string\n    status: string\n    at: string\n    summary?: string\n  }\n}\n\nexport type TauOfficeState = {\n  schemaVersion: 1\n  generatedAt: string\n  runtimePath: string\n  runtimeExists: boolean\n  runtimeId?: string\n  teamName: string\n  enabled: boolean\n  updatedAt?: string\n  workers: TauOfficeWorker[]\n  orchestrator?: TauOfficeWorker\n  fallback: {\n    enabled: boolean\n    provider?: string\n    providerLabel?: string\n    model?: string\n    modelLabel?: string\n    effort?: string | number\n  }\n  runCounts: Record<TeamModeRunStatus, number>\n  activeRunCount: number\n  configuredWorkerCount: number\n  activeWorkerCount: number\n  recentRuns: TauOfficeRunSummary[]\n  missionLog: Array<{\n    id: string\n    at: string\n    level: 'info' | 'warn' | 'error'\n    event: string\n    role?: string\n    runId?: string\n    detail?: string\n  }>\n}\n\nconst STATUS_LABELS: Record<TauOfficeWorkerStatus, string> = {\n  unconfigured: 'Open seat',\n  inactive: 'Off shift',\n  idle: 'At desk',\n  queued: 'Queued',\n  running: 'Working',\n  completed: 'Done',\n  failed: 'Blocked',\n  cancelled: 'Cancelled',\n  interrupted: 'Interrupted',\n}\n\nconst ROLE_ACCENTS: Record<TeamModeRoleId, string> = {\n  orchestrator: '#ff6f61',\n  architect: '#6fd3ff',\n  implementer: '#67d98b',\n  reviewer: '#ffd166',\n  verifier: '#c49cff',\n  devops: '#ff9f6e',\n  docs: '#7ddbd0',\n  'dependency-manager': '#f07fb6',\n  explorer: '#9cc8ff',\n}\n\nconst ROLE_STATIONS: Record<TeamModeRoleId, string> = {\n  orchestrator: 'Command center',\n  architect: 'Blueprint desk',\n  implementer: 'Build bench',\n  reviewer: 'Review bay',\n  verifier: 'QA lab',\n  devops: 'Deploy nook',\n  docs: 'Docs shelf',\n  'dependency-manager': 'Package room',\n  explorer: 'Map table',\n}\n\nconst ACTIVE_RUN_STATUSES = new Set<TeamModeRunStatus>(['queued', 'running'])\n\nexport function readTauOfficeState(): TauOfficeState {\n  const runtime = readTeamModeRuntimeState()\n  const summary = summarizeTeamModeRuntime(runtime)\n  const slots = getTeamModeRoleSlots()\n  const runtimeRoles = new Map<string, TeamModeRuntimeRole>()\n\n  for (const role of runtime?.roles ?? []) {\n    runtimeRoles.set(role.role, role)\n  }\n\n  const runsByRole = groupRunsByRole(runtime?.runs ?? [])\n  const outcomesByRole = new Map<string, NonNullable<TeamModeRuntimeState['outcomes']>[number]>()\n\n  for (const outcome of runtime?.outcomes ?? []) {\n    outcomesByRole.set(outcome.role, outcome)\n  }\n\n  const workers: TauOfficeWorker[] = slots.map(slot => {\n    const runtimeRole = runtimeRoles.get(slot.meta.id)\n    const configured = slot.binding ?? normalizeRuntimeRole(slot.meta.id, runtimeRole)\n    const roleRuns = runsByRole.get(slot.meta.id) ?? []\n    const latestRun = roleRuns.at(-1)\n    const activeRun = [...roleRuns]\n      .reverse()\n      .find(run => ACTIVE_RUN_STATUSES.has(run.status))\n    const latestOutcome = outcomesByRole.get(slot.meta.id)\n    const active = configured?.active ?? false\n    const status = getWorkerStatus({\n      configured: configured !== null,\n      active,\n      activeRun,\n      latestRun,\n    })\n\n    return {\n      role: slot.meta.id,\n      label: slot.meta.label,\n      description: slot.meta.description,\n      station: ROLE_STATIONS[slot.meta.id],\n      provider: configured?.provider,\n      providerLabel: configured?.provider\n        ? formatProviderLabel(configured.provider)\n        : undefined,\n      model: configured?.model,\n      modelLabel: configured?.provider && configured.model\n        ? formatModelLabel(configured.provider, configured.model)\n        : configured?.model,\n      effort: configured?.effort,\n      active,\n      configured: configured !== null,\n      status,\n      statusLabel: STATUS_LABELS[status],\n      accent: ROLE_ACCENTS[slot.meta.id],\n      latestRun: latestRun ? formatRun(latestRun) : undefined,\n      activeRun: activeRun ? formatRun(activeRun) : undefined,\n      latestOutcome: latestOutcome\n        ? {\n            runId: latestOutcome.runId,\n            status: latestOutcome.status,\n            at: latestOutcome.at,\n            summary: latestOutcome.summary,\n          }\n        : undefined,\n    }\n  })\n\n  const fallbackProvider = runtime?.fallback.provider\n  const fallbackModel = runtime?.fallback.model\n\n  return {\n    schemaVersion: 1,\n    generatedAt: new Date().toISOString(),\n    runtimePath: getTeamModeRuntimePath(),\n    runtimeExists: runtime !== null,\n    runtimeId: runtime?.runtimeId,\n    teamName: runtime?.teamName ?? 'team-mode',\n    enabled: runtime?.enabled ?? false,\n    updatedAt: runtime?.updatedAt,\n    workers,\n    orchestrator: workers.find(worker => worker.role === 'orchestrator'),\n    fallback: {\n      enabled: runtime?.fallback.enabled ?? false,\n      provider: fallbackProvider,\n      providerLabel: fallbackProvider\n        ? formatProviderLabel(fallbackProvider)\n        : undefined,\n      model: fallbackModel,\n      modelLabel: fallbackProvider && fallbackModel\n        ? formatModelLabel(fallbackProvider, fallbackModel)\n        : fallbackModel,\n      effort: runtime?.fallback.effort,\n    },\n    runCounts: summary.runCounts,\n    activeRunCount:\n      summary.runCounts.queued + summary.runCounts.running,\n    configuredWorkerCount: workers.filter(worker => worker.configured).length,\n    activeWorkerCount: workers.filter(worker => worker.active).length,\n    recentRuns: (runtime?.runs ?? []).slice(-12).reverse().map(formatRun),\n    missionLog: (runtime?.missionLog ?? []).slice(-18).reverse().map(entry => ({\n      id: entry.id,\n      at: entry.at,\n      level: entry.level,\n      event: entry.event,\n      role: entry.role,\n      runId: entry.runId,\n      detail: entry.detail,\n    })),\n  }\n}\n\nfunction normalizeRuntimeRole(\n  role: TeamModeRoleId,\n  runtimeRole: TeamModeRuntimeRole | undefined,\n): {\n  role: TeamModeRoleId\n  provider: string\n  model: string\n  effort?: string | number\n  active: boolean\n} | null {\n  if (!runtimeRole?.provider || !runtimeRole.model) {\n    return null\n  }\n\n  return {\n    role,\n    provider: runtimeRole.provider,\n    model: runtimeRole.model,\n    effort: runtimeRole.effort,\n    active: runtimeRole.active,\n  }\n}\n\nfunction groupRunsByRole(\n  runs: TeamModeRunRecord[],\n): Map<string, TeamModeRunRecord[]> {\n  const grouped = new Map<string, TeamModeRunRecord[]>()\n  for (const run of runs) {\n    const group = grouped.get(run.role) ?? []\n    group.push(run)\n    grouped.set(run.role, group)\n  }\n  return grouped\n}\n\nfunction getWorkerStatus(input: {\n  configured: boolean\n  active: boolean\n  activeRun?: TeamModeRunRecord\n  latestRun?: TeamModeRunRecord\n}): TauOfficeWorkerStatus {\n  if (!input.configured) return 'unconfigured'\n  if (!input.active) return 'inactive'\n  if (input.activeRun) return input.activeRun.status\n\n  switch (input.latestRun?.status) {\n    case 'failed':\n      return 'failed'\n    case 'cancelled':\n      return 'cancelled'\n    case 'interrupted':\n      return 'interrupted'\n    case 'completed':\n      return 'completed'\n    default:\n      return 'idle'\n  }\n}\n\nfunction formatRun(run: TeamModeRunRecord): TauOfficeRunSummary {\n  return {\n    id: run.id,\n    role: run.role,\n    provider: run.provider,\n    providerLabel: formatProviderLabel(run.provider),\n    model: run.model,\n    modelLabel: formatModelLabel(run.provider, run.model),\n    status: run.status,\n    description: run.description,\n    promptPreview: run.promptPreview,\n    resultPreview: run.resultPreview,\n    error: run.error,\n    runInBackground: run.runInBackground,\n    startedAt: run.startedAt,\n    updatedAt: run.updatedAt,\n    completedAt: run.completedAt,\n  }\n}\n\nfunction formatProviderLabel(provider: string): string {\n  return (\n    PROVIDER_DISPLAY_NAMES[provider as APIProvider] ??\n    toTitleCase(provider.replace(/[-_]/g, ' '))\n  )\n}\n\nfunction formatModelLabel(provider: string, model: string): string {\n  void provider\n  return model\n}\n\nfunction toTitleCase(value: string): string {\n  return value\n    .split(/\\s+/)\n    .filter(Boolean)\n    .map(part => `${part.slice(0, 1).toUpperCase()}${part.slice(1)}`)\n    .join(' ')\n}\n\nexport function getTauOfficeRoleOrder(): readonly TeamModeRoleId[] {\n  return TEAM_MODE_ROLE_IDS\n}\n\nexport function getTauOfficeRoleLabel(role: string): string {\n  return TEAM_MODE_ROLE_META[role as TeamModeRoleId]?.label ?? toTitleCase(role)\n}\n", "import { randomUUID } from 'crypto'\nimport {\n  existsSync,\n  mkdirSync,\n  readFileSync,\n  rmSync,\n  writeFileSync,\n} from 'fs'\nimport { join } from 'path'\nimport { getClaudeConfigHomeDir } from '../envUtils.js'\nimport { errorMessage } from '../errors.js'\nimport type { TeamModeFallbackWorker, TeamModeRole } from './state.js'\n\nexport const TEAM_MODE_RUNTIME_SCHEMA_VERSION = 1 as const\n\nconst MAX_RUNS = 200\nconst MAX_MISSION_LOG_ENTRIES = 300\nconst MAX_OUTCOMES = 200\nconst MAX_TEXT_LENGTH = 1_200\n\nexport type TeamModeRunStatus =\n  | 'queued'\n  | 'running'\n  | 'completed'\n  | 'failed'\n  | 'cancelled'\n  | 'interrupted'\n\nexport type TeamModeRuntimeRole = {\n  role: string\n  provider: string\n  model: string\n  effort?: string | number\n  active: boolean\n}\n\nexport type TeamModeRuntimeFallback = {\n  enabled: boolean\n  provider?: string\n  model?: string\n  effort?: string | number\n}\n\nexport type TeamModeRunRecord = {\n  id: string\n  role: string\n  provider: string\n  model: string\n  teamName?: string\n  description?: string\n  promptPreview?: string\n  runInBackground?: boolean\n  status: TeamModeRunStatus\n  startedAt: string\n  updatedAt: string\n  completedAt?: string\n  error?: string\n  resultPreview?: string\n}\n\nexport type TeamModeMissionLogEntry = {\n  id: string\n  at: string\n  level: 'info' | 'warn' | 'error'\n  event: string\n  runId?: string\n  role?: string\n  detail?: string\n}\n\nexport type TeamModeOutcomeRecord = {\n  runId: string\n  role: string\n  status: Extract<\n    TeamModeRunStatus,\n    'completed' | 'failed' | 'cancelled' | 'interrupted'\n  >\n  at: string\n  summary?: string\n}\n\nexport type TeamModeRuntimeState = {\n  schemaVersion: typeof TEAM_MODE_RUNTIME_SCHEMA_VERSION\n  runtimeId: string\n  teamName: string\n  createdAt: string\n  updatedAt: string\n  enabled: boolean\n  roles: TeamModeRuntimeRole[]\n  fallback: TeamModeRuntimeFallback\n  runs: TeamModeRunRecord[]\n  missionLog: TeamModeMissionLogEntry[]\n  outcomes: TeamModeOutcomeRecord[]\n}\n\nexport type TeamModeRuntimeSummary = {\n  exists: boolean\n  enabled: boolean\n  runtimeId?: string\n  teamName?: string\n  updatedAt?: string\n  roleCount: number\n  activeRoleCount: number\n  fallbackEnabled: boolean\n  runCounts: Record<TeamModeRunStatus, number>\n  latestRun?: TeamModeRunRecord\n  latestLog?: TeamModeMissionLogEntry\n}\n\nexport type TeamModeRuntimeConfigInput = {\n  roles?: TeamModeRole[]\n  fallback?: TeamModeFallbackWorker | null\n  fallbackEnabled?: boolean\n  enabled?: boolean\n  event?: string\n  teamName?: string\n}\n\nexport type TeamModeRunStartInput = {\n  role: string\n  provider: string\n  model: string\n  teamName?: string\n  description?: string\n  prompt?: string\n  runInBackground?: boolean\n}\n\nexport type TeamModeRunFinishInput = {\n  resultPreview?: string\n  status?: Extract<TeamModeRunStatus, 'completed' | 'cancelled' | 'interrupted'>\n}\n\nconst EMPTY_RUN_COUNTS: Record<TeamModeRunStatus, number> = {\n  queued: 0,\n  running: 0,\n  completed: 0,\n  failed: 0,\n  cancelled: 0,\n  interrupted: 0,\n}\n\nexport function getTeamModeRuntimeDir(): string {\n  return join(getClaudeConfigHomeDir(), 'team-mode')\n}\n\nexport function getTeamModeRuntimePath(): string {\n  return join(getTeamModeRuntimeDir(), 'current.json')\n}\n\nexport function readTeamModeRuntimeState(): TeamModeRuntimeState | null {\n  const path = getTeamModeRuntimePath()\n\n  try {\n    if (!existsSync(path)) {\n      return null\n    }\n    const raw = readFileSync(path, { encoding: 'utf-8' })\n    return normalizeRuntimeState(JSON.parse(raw))\n  } catch (error) {\n    logRuntimeFailure('read', error)\n    return null\n  }\n}\n\nexport function syncTeamModeRuntimeConfig(\n  input: TeamModeRuntimeConfigInput,\n): TeamModeRuntimeState | null {\n  return updateRuntimeState(state => {\n    const now = new Date().toISOString()\n    const next =\n      state ??\n      createRuntimeState({\n        enabled: input.enabled,\n        teamName: input.teamName,\n        roles: input.roles,\n        fallback: input.fallback,\n        fallbackEnabled: input.fallbackEnabled,\n      })\n\n    next.updatedAt = now\n    if (input.teamName !== undefined && input.teamName.trim()) {\n      next.teamName = sanitizeShortText(input.teamName)\n    }\n    if (input.enabled !== undefined) {\n      next.enabled = input.enabled\n    }\n    if (input.roles !== undefined) {\n      next.roles = normalizeRoles(input.roles)\n    }\n    if (\n      input.fallback !== undefined ||\n      input.fallbackEnabled !== undefined\n    ) {\n      next.fallback = normalizeFallback(\n        input.fallback,\n        input.fallbackEnabled,\n        next.fallback,\n      )\n    }\n    if (input.event) {\n      appendMissionLog(next, {\n        level: 'info',\n        event: input.event,\n      })\n    }\n    trimRuntimeState(next)\n    return next\n  })\n}\n\nexport function setTeamModeRuntimeEnabled(\n  input: Omit<TeamModeRuntimeConfigInput, 'enabled'> & { enabled: boolean },\n): TeamModeRuntimeState | null {\n  return syncTeamModeRuntimeConfig({\n    ...input,\n    event: input.event ?? (input.enabled ? 'team-mode enabled' : 'team-mode disabled'),\n  })\n}\n\nexport function clearTeamModeRuntimeState(): void {\n  try {\n    rmSync(getTeamModeRuntimePath(), { force: true })\n  } catch (error) {\n    logRuntimeFailure('clear', error)\n  }\n}\n\nexport function startTeamModeRun(\n  input: TeamModeRunStartInput,\n): TeamModeRunRecord | null {\n  let created: TeamModeRunRecord | null = null\n  updateRuntimeState(state => {\n    const now = new Date().toISOString()\n    const next = state ?? createRuntimeState({ enabled: true })\n    next.enabled = true\n    next.updatedAt = now\n    const record: TeamModeRunRecord = {\n      id: newRuntimeId('tmrun'),\n      role: sanitizeShortText(input.role || 'unknown'),\n      provider: sanitizeShortText(input.provider),\n      model: sanitizeShortText(input.model),\n      teamName: input.teamName\n        ? sanitizeShortText(input.teamName)\n        : undefined,\n      description: input.description\n        ? truncateText(input.description)\n        : undefined,\n      promptPreview: input.prompt ? truncateText(input.prompt) : undefined,\n      runInBackground: input.runInBackground,\n      status: 'running',\n      startedAt: now,\n      updatedAt: now,\n    }\n    created = record\n    next.runs.push(record)\n    appendMissionLog(next, {\n      level: 'info',\n      event: 'worker run started',\n      runId: record.id,\n      role: record.role,\n      detail: `${record.provider}/${record.model}`,\n    })\n    trimRuntimeState(next)\n    return next\n  })\n  return created\n}\n\nexport function completeTeamModeRun(\n  runId: string,\n  input: TeamModeRunFinishInput = {},\n): void {\n  const status = input.status ?? 'completed'\n  updateExistingRun(runId, run => {\n    const now = new Date().toISOString()\n    run.status = status\n    run.completedAt = now\n    run.updatedAt = now\n    if (input.resultPreview) {\n      run.resultPreview = truncateText(input.resultPreview)\n    }\n    return {\n      level: 'info',\n      event: `worker run ${status}`,\n      detail: run.resultPreview,\n    }\n  })\n}\n\nexport function failTeamModeRun(runId: string, error: unknown): void {\n  updateExistingRun(runId, run => {\n    const now = new Date().toISOString()\n    run.status = 'failed'\n    run.completedAt = now\n    run.updatedAt = now\n    run.error = truncateText(errorMessage(error))\n    return {\n      level: 'error',\n      event: 'worker run failed',\n      detail: run.error,\n    }\n  })\n}\n\nexport function summarizeTeamModeRuntime(\n  state: TeamModeRuntimeState | null = readTeamModeRuntimeState(),\n): TeamModeRuntimeSummary {\n  if (state === null) {\n    return {\n      exists: false,\n      enabled: false,\n      roleCount: 0,\n      activeRoleCount: 0,\n      fallbackEnabled: false,\n      runCounts: { ...EMPTY_RUN_COUNTS },\n    }\n  }\n\n  const runCounts = { ...EMPTY_RUN_COUNTS }\n  for (const run of state.runs) {\n    runCounts[run.status]++\n  }\n\n  return {\n    exists: true,\n    enabled: state.enabled,\n    runtimeId: state.runtimeId,\n    teamName: state.teamName,\n    updatedAt: state.updatedAt,\n    roleCount: state.roles.length,\n    activeRoleCount: state.roles.filter(role => role.active).length,\n    fallbackEnabled: state.fallback.enabled,\n    runCounts,\n    latestRun: state.runs.at(-1),\n    latestLog: state.missionLog.at(-1),\n  }\n}\n\nfunction updateExistingRun(\n  runId: string,\n  update: (run: TeamModeRunRecord) => {\n    level: TeamModeMissionLogEntry['level']\n    event: string\n    detail?: string\n  },\n): void {\n  updateRuntimeState(state => {\n    if (state === null) {\n      return null\n    }\n    const run = state.runs.find(candidate => candidate.id === runId)\n    if (!run) {\n      return state\n    }\n    const log = update(run)\n    state.updatedAt = run.updatedAt\n    appendMissionLog(state, {\n      ...log,\n      runId,\n      role: run.role,\n    })\n    if (run.status !== 'running' && run.status !== 'queued') {\n      state.outcomes.push({\n        runId,\n        role: run.role,\n        status: run.status,\n        at: run.completedAt ?? run.updatedAt,\n        summary: run.resultPreview ?? run.error,\n      })\n    }\n    trimRuntimeState(state)\n    return state\n  })\n}\n\nfunction updateRuntimeState(\n  update: (\n    state: TeamModeRuntimeState | null,\n  ) => TeamModeRuntimeState | null,\n): TeamModeRuntimeState | null {\n  try {\n    const next = update(readTeamModeRuntimeState())\n    if (next === null) {\n      return null\n    }\n    writeTeamModeRuntimeState(next)\n    return next\n  } catch (error) {\n    logRuntimeFailure('update', error)\n    return null\n  }\n}\n\nfunction writeTeamModeRuntimeState(state: TeamModeRuntimeState): void {\n  mkdirSync(getTeamModeRuntimeDir(), { recursive: true, mode: 0o700 })\n  writeFileSync(\n    getTeamModeRuntimePath(),\n    `${JSON.stringify(state, null, 2)}\\n`,\n    {\n      encoding: 'utf-8',\n    },\n  )\n}\n\nfunction createRuntimeState(\n  input: {\n    enabled?: boolean\n    teamName?: string\n    roles?: TeamModeRole[]\n    fallback?: TeamModeFallbackWorker | null\n    fallbackEnabled?: boolean\n  } = {},\n): TeamModeRuntimeState {\n  const now = new Date().toISOString()\n  return {\n    schemaVersion: TEAM_MODE_RUNTIME_SCHEMA_VERSION,\n    runtimeId: newRuntimeId('tmrt'),\n    teamName: input.teamName?.trim()\n      ? sanitizeShortText(input.teamName)\n      : 'team-mode',\n    createdAt: now,\n    updatedAt: now,\n    enabled: input.enabled === true,\n    roles: normalizeRoles(input.roles ?? []),\n    fallback: normalizeFallback(\n      input.fallback,\n      input.fallbackEnabled,\n      { enabled: false },\n    ),\n    runs: [],\n    missionLog: [],\n    outcomes: [],\n  }\n}\n\nfunction normalizeRuntimeState(raw: unknown): TeamModeRuntimeState | null {\n  if (!isRecord(raw)) {\n    return null\n  }\n  const now = new Date().toISOString()\n  return {\n    schemaVersion: TEAM_MODE_RUNTIME_SCHEMA_VERSION,\n    runtimeId:\n      typeof raw.runtimeId === 'string' && raw.runtimeId.trim()\n        ? sanitizeShortText(raw.runtimeId)\n        : newRuntimeId('tmrt'),\n    teamName:\n      typeof raw.teamName === 'string' && raw.teamName.trim()\n        ? sanitizeShortText(raw.teamName)\n        : 'team-mode',\n    createdAt:\n      typeof raw.createdAt === 'string' && raw.createdAt.trim()\n        ? raw.createdAt\n        : now,\n    updatedAt:\n      typeof raw.updatedAt === 'string' && raw.updatedAt.trim()\n        ? raw.updatedAt\n        : now,\n    enabled: raw.enabled === true,\n    roles: Array.isArray(raw.roles)\n      ? raw.roles.flatMap(normalizeRuntimeRole)\n      : [],\n    fallback: normalizeRuntimeFallback(raw.fallback),\n    runs: Array.isArray(raw.runs)\n      ? raw.runs.flatMap(normalizeRunRecord).slice(-MAX_RUNS)\n      : [],\n    missionLog: Array.isArray(raw.missionLog)\n      ? raw.missionLog\n          .flatMap(normalizeMissionLogEntry)\n          .slice(-MAX_MISSION_LOG_ENTRIES)\n      : [],\n    outcomes: Array.isArray(raw.outcomes)\n      ? raw.outcomes.flatMap(normalizeOutcomeRecord).slice(-MAX_OUTCOMES)\n      : [],\n  }\n}\n\nfunction normalizeRoles(roles: TeamModeRole[]): TeamModeRuntimeRole[] {\n  return roles.map(role => ({\n    role: role.role,\n    provider: role.provider,\n    model: sanitizeShortText(role.model),\n    effort: role.effort,\n    active: role.active,\n  }))\n}\n\nfunction normalizeRuntimeRole(raw: unknown): TeamModeRuntimeRole[] {\n  if (\n    !isRecord(raw) ||\n    typeof raw.role !== 'string' ||\n    typeof raw.provider !== 'string' ||\n    typeof raw.model !== 'string' ||\n    !raw.role.trim() ||\n    !raw.provider.trim() ||\n    !raw.model.trim()\n  ) {\n    return []\n  }\n  return [{\n    role: raw.role,\n    provider: raw.provider,\n    model: sanitizeShortText(raw.model),\n    effort: normalizeEffort(raw.effort),\n    active: raw.active !== false,\n  }]\n}\n\nfunction normalizeFallback(\n  fallback: TeamModeFallbackWorker | null | undefined,\n  fallbackEnabled: boolean | undefined,\n  previous: TeamModeRuntimeFallback,\n): TeamModeRuntimeFallback {\n  if (fallback === undefined) {\n    return {\n      ...previous,\n      enabled: fallbackEnabled ?? previous.enabled,\n    }\n  }\n  if (fallback === null) {\n    return { enabled: false }\n  }\n  return {\n    enabled: fallbackEnabled ?? true,\n    provider: fallback.provider,\n    model: sanitizeShortText(fallback.model),\n    effort: fallback.effort,\n  }\n}\n\nfunction normalizeRuntimeFallback(raw: unknown): TeamModeRuntimeFallback {\n  if (!isRecord(raw)) {\n    return { enabled: false }\n  }\n  if (\n    typeof raw.provider === 'string' &&\n    raw.provider.trim() &&\n    typeof raw.model === 'string' &&\n    raw.model.trim()\n  ) {\n    return {\n      enabled: raw.enabled === true,\n      provider: raw.provider,\n      model: sanitizeShortText(raw.model),\n      effort: normalizeEffort(raw.effort),\n    }\n  }\n  return { enabled: raw.enabled === true }\n}\n\nfunction normalizeRunRecord(raw: unknown): TeamModeRunRecord[] {\n  if (\n    !isRecord(raw) ||\n    typeof raw.id !== 'string' ||\n    typeof raw.role !== 'string' ||\n    typeof raw.provider !== 'string' ||\n    typeof raw.model !== 'string' ||\n    !isRunStatus(raw.status) ||\n    typeof raw.startedAt !== 'string' ||\n    typeof raw.updatedAt !== 'string'\n  ) {\n    return []\n  }\n\n  return [{\n    id: sanitizeShortText(raw.id),\n    role: sanitizeShortText(raw.role),\n    provider: sanitizeShortText(raw.provider),\n    model: sanitizeShortText(raw.model),\n    teamName:\n      typeof raw.teamName === 'string'\n        ? sanitizeShortText(raw.teamName)\n        : undefined,\n    description:\n      typeof raw.description === 'string'\n        ? truncateText(raw.description)\n        : undefined,\n    promptPreview:\n      typeof raw.promptPreview === 'string'\n        ? truncateText(raw.promptPreview)\n        : undefined,\n    runInBackground:\n      typeof raw.runInBackground === 'boolean'\n        ? raw.runInBackground\n        : undefined,\n    status: raw.status,\n    startedAt: raw.startedAt,\n    updatedAt: raw.updatedAt,\n    completedAt:\n      typeof raw.completedAt === 'string' ? raw.completedAt : undefined,\n    error:\n      typeof raw.error === 'string' ? truncateText(raw.error) : undefined,\n    resultPreview:\n      typeof raw.resultPreview === 'string'\n        ? truncateText(raw.resultPreview)\n        : undefined,\n  }]\n}\n\nfunction normalizeMissionLogEntry(raw: unknown): TeamModeMissionLogEntry[] {\n  if (\n    !isRecord(raw) ||\n    typeof raw.id !== 'string' ||\n    typeof raw.at !== 'string' ||\n    !isMissionLogLevel(raw.level) ||\n    typeof raw.event !== 'string'\n  ) {\n    return []\n  }\n  return [{\n    id: sanitizeShortText(raw.id),\n    at: raw.at,\n    level: raw.level,\n    event: sanitizeShortText(raw.event),\n    runId:\n      typeof raw.runId === 'string' ? sanitizeShortText(raw.runId) : undefined,\n    role:\n      typeof raw.role === 'string' ? sanitizeShortText(raw.role) : undefined,\n    detail:\n      typeof raw.detail === 'string' ? truncateText(raw.detail) : undefined,\n  }]\n}\n\nfunction normalizeOutcomeRecord(raw: unknown): TeamModeOutcomeRecord[] {\n  if (\n    !isRecord(raw) ||\n    typeof raw.runId !== 'string' ||\n    typeof raw.role !== 'string' ||\n    !isFinishedRunStatus(raw.status) ||\n    typeof raw.at !== 'string'\n  ) {\n    return []\n  }\n  return [{\n    runId: sanitizeShortText(raw.runId),\n    role: sanitizeShortText(raw.role),\n    status: raw.status,\n    at: raw.at,\n    summary:\n      typeof raw.summary === 'string' ? truncateText(raw.summary) : undefined,\n  }]\n}\n\nfunction appendMissionLog(\n  state: TeamModeRuntimeState,\n  entry: Omit<TeamModeMissionLogEntry, 'id' | 'at'>,\n): void {\n  state.missionLog.push({\n    id: newRuntimeId('tmlog'),\n    at: new Date().toISOString(),\n    ...entry,\n    detail: entry.detail ? truncateText(entry.detail) : undefined,\n  })\n}\n\nfunction trimRuntimeState(state: TeamModeRuntimeState): void {\n  state.runs = state.runs.slice(-MAX_RUNS)\n  state.missionLog = state.missionLog.slice(-MAX_MISSION_LOG_ENTRIES)\n  state.outcomes = state.outcomes.slice(-MAX_OUTCOMES)\n}\n\nfunction newRuntimeId(prefix: string): string {\n  try {\n    return `${prefix}_${randomUUID()}`\n  } catch {\n    return `${prefix}_${Date.now().toString(36)}_${Math.random()\n      .toString(36)\n      .slice(2, 10)}`\n  }\n}\n\nfunction truncateText(value: string): string {\n  const normalized = value.replace(/\\s+/g, ' ').trim()\n  return normalized.length > MAX_TEXT_LENGTH\n    ? `${normalized.slice(0, MAX_TEXT_LENGTH - 3)}...`\n    : normalized\n}\n\nfunction sanitizeShortText(value: string): string {\n  return truncateText(value).slice(0, 240)\n}\n\nfunction normalizeEffort(value: unknown): string | number | undefined {\n  return typeof value === 'string' || typeof value === 'number'\n    ? value\n    : undefined\n}\n\nfunction isRunStatus(value: unknown): value is TeamModeRunStatus {\n  return (\n    value === 'queued' ||\n    value === 'running' ||\n    value === 'completed' ||\n    value === 'failed' ||\n    value === 'cancelled' ||\n    value === 'interrupted'\n  )\n}\n\nfunction isFinishedRunStatus(\n  value: unknown,\n): value is TeamModeOutcomeRecord['status'] {\n  return (\n    value === 'completed' ||\n    value === 'failed' ||\n    value === 'cancelled' ||\n    value === 'interrupted'\n  )\n}\n\nfunction isMissionLogLevel(\n  value: unknown,\n): value is TeamModeMissionLogEntry['level'] {\n  return value === 'info' || value === 'warn' || value === 'error'\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n  return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction logRuntimeFailure(action: string, error: unknown): void {\n  // Runtime bookkeeping should never break team-mode execution. Keep this\n  // local and dependency-light so tests and worker spawns do not pull in the\n  // broader bootstrap/debug stack.\n  void action\n  void error\n}\n", "import { tauOfficeMain } from '../office/server.js'\n\nvoid tauOfficeMain().catch(error => {\n  const message =\n    error instanceof Error ? error.message : String(error)\n  console.error(`Tau Office failed: ${message}`)\n  process.exitCode = 1\n})\n"],
  "mappings": "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AAA;;;ACrFA,IAAM,IACA,MACA,KACA,MACA,MACA,OACA,MACA,QACA,SACA,UACA,KACA,IACA,KACA,KACA,IACA,KACAE,OACA,SACA,SACA,OACA,IACA,OACA,IACA,KACA,MACA,KACA,OACA,MACA,MACA,KACA,MACA,QACA,KACA,KACA,MACA,MACA,MACA,QACA,KACA,KACA,KACA,IACA,KACA,MACA,KACA,IACA,MACA,IACA,OACA,MACAC,KACA,MACAC,KACAC,MACAC,KACA,OACAC,KACA,MACAC,KAIAC,cACK,sBAELC,cACKC,yBASA,iCASA,4BASA,gCASA,mCASA,gCASA,0BASEC,sBACT,qBACA,iBACO,kBACA,oBASA,qBAQA,mCASA,oCAQA,cASA,uBACA,kBACA,MACP,0BACA,0BACA,gBACA,aACO,aACA;AAxLX,IAAAC,kBAAA;AAAA;AA2DA;AACA,IAAAC;AACA;AA7DA,IAAM,KAAK;AACX,IAAM,OAAO;AACb,IAAM,MAAM;AACZ,IAAM,OAAO;AACb,IAAM,OAAO;AACb,IAAM,QAAQ;AACd,IAAM,OAAO;AACb,IAAM,SAAS;AACf,IAAM,UAAU;AAChB,IAAM,WAAW;AACjB,IAAM,MAAM;AACZ,IAAM,KAAK;AACX,IAAM,MAAM;AACZ,IAAM,MAAM;AACZ,IAAM,KAAK;AACX,IAAM,MAAM;AACZ,IAAMZ,QAAO;AACb,IAAM,UAAU;AAChB,IAAM,UAAU;AAChB,IAAM,QAAQ;AACd,IAAM,KAAK;AACX,IAAM,QAAQ;AACd,IAAM,KAAK;AACX,IAAM,MAAM;AACZ,IAAM,OAAO;AACb,IAAM,MAAM;AACZ,IAAM,QAAQ;AACd,IAAM,OAAO;AACb,IAAM,OAAO;AACb,IAAM,MAAM;AACZ,IAAM,OAAO;AACb,IAAM,SAAS;AACf,IAAM,MAAM;AACZ,IAAM,MAAM;AACZ,IAAM,OAAO;AACb,IAAM,OAAO;AACb,IAAM,OAAO;AACb,IAAM,SAAS;AACf,IAAM,MAAM;AACZ,IAAM,MAAM;AACZ,IAAM,MAAM;AACZ,IAAM,KAAK;AACX,IAAM,MAAM;AACZ,IAAM,OAAO;AACb,IAAM,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,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,aAAY,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,0BAAyB,CAAC,IAAG,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,0BAAyB,CAAC,IAAG,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,0BAAyB,CAAC,IAAG,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,0BAAyB,CAAC,IAAG,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,0BAAyB,CAAC,IAAG,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,0BAAyB,CAAC,IAAG,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,SAAS,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,YAAY,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,0BAAyB,CAAC,IAAG,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,YAAY,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,0BAAyB,CAAC,IAAG,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,0BAAyB,CAAC,IAAG,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,YAAY,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,YAAY,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,YAAY,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,aAAY,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,KAAI,GAAG,GAAE,OAAO,GAAE,CAAC,CAAC,KAAK,GAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,GAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAS,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAG,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,KAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,OAAO,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,MAAK,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS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AAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,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AC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,KAAI,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,KAAI,KAAI,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,KAAI,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,KAAI,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,KAAI,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,KAAI,KAAI,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,KA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AAG,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,IAAG,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,IAAG,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,IAAG,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,IAAG,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,IAAG,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,IAAG,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,IAAG,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,IAAG,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,IAAG,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,IAAG,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,IAAG,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,YAAY,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,0BAAyB,CAAC,IAAG,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,IAAI,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,MAAK,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,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,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,MAAK,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,MAAK,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,MAAK,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,MAAK,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,MAAK,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,MAAK,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,MAAK,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,MAAK,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,MAAK,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,MAAK,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,MAAK,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,MAAK,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,MAAK,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,MAAK,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,OAAM,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,MAAM,IAAK,GAAE,UAAS,CAAC,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,OAAM,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,IAAG,IAAG,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,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CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAG,IAAG,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,IAAG,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,MAAM,IAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,MAAM,IAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAI,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,MAAK,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,M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C,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,MAAK,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAS,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,0BAAyB,CAAC,IAAG,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,MAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,YAAY,GAAE,CAAC,CAAC,OAAM,KAAK,GAAE,OAAO,GAAE,CAAC,CAAC,OAAM,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,OAAO,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,OAAO,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,OAAO,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,OAAO,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,OAAO,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,OAAO,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAS,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,QAAO,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,QAAO,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,QAAO,QAAO,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,QAAO,QAAO,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,QAAO,QAAO,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,QAAO,QAAO,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,QAAO,QAAO,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,QAAO,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,QAAO,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,QAAO,QAAO,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,QAAO,QAAO,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,QAAO,QAAO,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,QAAO,QAAO,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,MAAO,IAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAG,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,EAAE,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,OAAO,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,OAAO,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,OAAO,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,OAAO,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,OAAO,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,OAAO,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,OAAO,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,OAAO,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAI,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,G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,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,OAAM,OAAM,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,OAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAQ,CAAC,GAAE,KAAK,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,OAAO,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,OAAO,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,OAAO,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,OAAO,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,IAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,OAAO,KAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,GAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,UAAS,CAAC,MAAM,CAAC,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,SAAS,GAAE,CAAC,CAAC,OAAO,MAAM,GAAE,YAAY,GAAE,CAAC,CAAC,QAAO,MAAM,GAAE,YAAY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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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",
  "names": ["path", "state", "r", "operation", "op", "isEnvTruthy", "memoize", "f", "e", "m", "i", "_", "data", "fs", "resolvedPath", "_", "e", "path", "data", "data", "memoize", "join", "path", "error", "i", "isEnvTruthy", "i", "memoize", "error", "resolve", "error", "resolvedPath", "i", "fs", "readFileSync", "join", "readFileSync", "data", "n", "dirname", "data", "fs", "fs", "error", "memoize", "error", "_", "f", "cache", "e", "memoize", "path", "paths", "cwd", "p", "dirname", "join", "resolve", "path", "fsWriteFileSync", "dirname", "isAbsolute", "join", "normalize", "relative", "resolve", "sep", "fs", "resolvedPath", "error", "e", "_", "SECONDS_IN_MINUTE", "MS_IN_SECOND", "resolve", "error", "readdir", "readFile", "join", "resolve", "cwd", "root", "c", "path", "p", "execa", "result", "readFileSync", "realpathSync", "statSync", "memoize", "basename", "dirname", "join", "resolve", "sep", "root", "stat", "path", "cwd", "appendFile", "mkdir", "readFile", "homedir", "dirname", "join", "cwd", "e", "error", "e", "safeParseJSON", "b", "performance", "path", "memoize", "join", "findExecutable", "memoize", "homedir", "join", "findExecutable", "z", "z", "z", "z", "path", "data", "p", "o", "init_constants", "init_constants", "init_prompt", "i", "j", "BRIEF_TOOL_NAME", "init_constants", "n", "z", "j", "count", "i", "z", "init_types", "data", "init_types", "m", "error", "path", "data", "init_types", "init_constants", "init_constants", "init_types", "init_constants", "dirname", "join", "resolve", "z", "d", "settings", "e", "error", "path", "resolvedPath", "readFileSync", "data", "fileSettings", "init_settings", "init_types", "memoize", "error", "memoize", "error", "HttpApiKeyAuthLocation", "resolveDefaultRuntimeConfig", "SMITHY_CONTEXT_KEY", "require_dist_cjs", "getHttpHandlerExtensionConfiguration", "resolveHttpHandlerRuntimeConfig", "HttpRequest", "HttpResponse", "require_dist_cjs", "c", "require_dist_cjs", "i", "require_dist_cjs", "abortError", "logger", "error", "resolve", "path", "e", "disableConcurrentStreams", "streamCollector", "feature", "require_dist_cjs", "error", "require_dist_cjs", "DEFAULT_MAX_ATTEMPTS", "DEFAULT_RETRY_MODE", "resolve", "Retry", "i", "b", "r", "count", "error", "feature", "feature", "require_dist_cjs", "ProviderError", "logger", "error", "memoize", "require_dist_cjs", "client", "accountId", "readFile", "path", "require_dist_cjs", "path", "readFile", "data", "map", "k", "require_dist_cjs", "e", "logger", "require_dist_cjs", "require_dist_cjs", "parseUrl", "require_dist_cjs", "resolve", "i", "buffer", "logger", "env", "EndpointMode", "refreshInterval", "e", "maxRetries", "profile", "error", "d", "b", "e", "p", "i", "c", "r", "f", "resolve", "g", "n", "op", "m", "o", "error", "k", "a", "j", "l", "q", "v", "state", "env", "path", "__assign", "k2", "logger", "require_dist_cjs", "a", "b", "entry", "require_dist_cjs", "getSmithyContext", "normalizeProvider", "n", "i", "o", "error", "e", "k", "import_util_middleware", "n", "i", "o", "list", "i", "i", "ns", "struct", "k", "z", "k", "r", "k", "date", "year", "time", "require_dist_cjs", "randomUUID", "i", "LazyJsonString", "RFC3339_WITH_OFFSET", "IMF_FIXDATE", "RFC_850_DATE", "ASC_TIME", "date", "year", "i", "z", "i", "generateIdempotencyToken", "require_dist_cjs", "require_dist_cjs", "fromBase64", "require_dist_cjs", "fromUtf8", "toUint8Array", "data", "toUtf8", "toBase64", "require_dist_cjs", "fromBase64", "toBase64", "k", "e", "error", "cursor", "i", "logger", "size", "logger", "size", "data", "resolve", "bytes", "require_dist_cjs", "resolve", "path", "body", "abortError", "streamCollector", "require_dist_cjs", "i", "sdkStreamMixin", "sdkStreamMixin", "e", "require_dist_cjs", "sdkStreamMixin", "Uint8ArrayBlobAdapter", "k", "c", "member", "struct", "import_protocol_http", "k", "member", "EventStreamSerde", "import_protocol_http", "import_util_stream", "payload", "path", "data", "member", "list", "import_protocol_http", "payload", "resolvedPath", "import_protocol_http", "path", "import_util_utf8", "data", "format", "import_util_utf8", "data", "import_util_base64", "format", "generateIdempotencyToken", "require_dist_cjs", "data", "member", "logger", "operation", "op", "createAggregatedClient", "commands", "Client", "command", "decorateServiceException", "k", "loadConfigsForDefaultMode", "emitWarningIfUnsupportedVersion", "getDefaultExtensionConfiguration", "resolveDefaultRuntimeConfig", "getValueFromTextNode", "NoOpLogger", "map", "filter", "date", "k", "logger", "e", "i", "e", "resolve", "relative", "e", "require_dist_cjs", "import_protocol_http", "import_protocol_http", "error", "import_protocol_http", "env", "import_types", "getSmithyContext", "map", "import_util_middleware", "import_protocol_http", "import_util_middleware", "error", "client", "path", "cursor", "init_requestBuilder", "setFeature", "feature", "init_setFeature", "import_protocol_http", "import_types", "import_protocol_http", "isIdentityExpired", "getSmithyContext", "setFeature", "init_requestBuilder", "init_setFeature", "env", "require_dist_cjs", "data", "HEADER_VALUE_TYPE", "i", "value", "serialized", "time", "path", "SignatureV4", "payload", "init_httpAuthSchemes", "require_dist_cjs", "resolveHostHeaderConfig", "getHostHeaderPlugin", "require_dist_cjs", "logger", "error", "getLoggerPlugin", "InvokeStore", "h", "nonEmptyString", "require_dist_cjs", "getRecursionDetectionPlugin", "k", "require_dist_cjs", "BinaryDecisionDiagram", "bdd", "root", "EndpointCache", "i", "customEndpointFunctions", "path", "hostname", "protocol", "k", "error", "c", "decideEndpoint", "nodes", "logger", "require_dist_cjs", "partition", "accountId", "partitions", "partitionsInfo", "awsEndpointFunctions", "toEndpointV1", "require_dist_cjs", "client", "resolveUserAgentConfig", "logger", "getUserAgentPlugin", "require_dist_cjs", "require_dist_cjs", "NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS", "env", "NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS", "NODE_REGION_CONFIG_OPTIONS", "NODE_REGION_CONFIG_FILE_OPTIONS", "resolveRegionConfig", "require_dist_cjs", "error", "getContentLengthPlugin", "env", "endpointUrl", "require_dist_cjs", "error", "e", "findHeader", "k", "deserializerMiddlewareOption", "serializerMiddlewareOption", "require_dist_cjs", "path", "toEndpointV1", "resolveParams", "getEndpointPlugin", "resolveEndpointConfig", "require_dist_cjs", "error", "e", "resolve", "NODE_MAX_ATTEMPT_CONFIG_OPTIONS", "env", "resolveRetryConfig", "NODE_RETRY_MODE_CONFIG_OPTIONS", "logger", "h", "date", "getRetryPlugin", "import_util_middleware", "init_httpAuthSchemes", "require_dist_cjs", "dirname", "cwd", "p", "sanitizedVersion", "createDefaultUserAgentProvider", "NODE_APP_ID_CONFIG_OPTIONS", "env", "require_dist_cjs", "crypto", "Hash", "require_dist_cjs", "calculateBodyLength", "require_dist_cjs", "env", "resolveDefaultsModeConfig", "e", "data", "b", "i", "a", "data", "list", "n", "map", "import_util_utf8", "dataView", "USE_BUFFER", "n", "b", "i", "import_util_utf8", "payload", "e", "date", "data", "sanitizeErrorCode", "import_util_base64", "generateIdempotencyToken", "i", "k", "data", "import_util_middleware", "errorTypeRegistries", "e", "operation", "path", "ErrorCtor", "member", "init_cbor", "m", "e", "d", "error", "Error", "i", "k", "init_cbor", "errorTypeRegistries", "member", "k", "import_smithy_client", "import_util_utf8", "e", "k", "data", "import_util_base64", "data", "k", "format", "import_util_base64", "k", "format", "generateIdempotencyToken", "errorTypeRegistries", "member", "errorTypeRegistries", "errorTypeRegistries", "errorTypeRegistries", "member", "import_smithy_client", "e", "n", "i", "t", "s", "r", "o", "a", "h", "l", "p", "b", "c", "g", "d", "f", "m", "j", "k", "F", "z", "q", "u", "lt", "x", "N", "parseXML", "require_dist_cjs", "XmlText", "XmlNode", "nodes", "c", "import_smithy_client", "import_util_utf8", "buffer", "value", "e", "import_smithy_client", "import_util_base64", "generateIdempotencyToken", "format", "member", "i", "k", "bytes", "member", "data", "import_xml_builder", "import_smithy_client", "e", "data", "import_xml_builder", "import_smithy_client", "import_util_base64", "k", "container", "struct", "map", "format", "generateIdempotencyToken", "member", "protocols_exports", "init_protocols", "import_util_endpoints", "import_smithy_client", "__ServiceException", "init_errors", "init_errors", "import_smithy_client", "import_url_parser", "import_util_base64", "import_util_utf8", "init_httpAuthSchemes", "init_protocols", "import_smithy_client", "import_util_retry", "getRuntimeConfig", "init_httpAuthSchemes", "loadNodeConfig", "RequestHandler", "stsRegionDefaultResolver", "require_dist_cjs", "stsRegionDefaultResolver", "getAwsRegionExtensionConfiguration", "resolveAwsRegionExtensionConfiguration", "k", "import_protocol_http", "import_smithy_client", "import_config_resolver", "import_middleware_retry", "import_smithy_client", "__Client", "getRuntimeConfig", "import_middleware_endpoint", "import_smithy_client", "$Command", "o", "import_smithy_client", "$Command", "__Client", "init_errors", "require_dist_cjs", "client", "logger", "SSOOIDCClient", "CreateTokenCommand", "writeFile", "e", "error", "createAwsAuthSigv4HttpAuthOption", "createSmithyApiNoAuthHttpAuthOption", "import_util_middleware", "resolveHttpAuthSchemeConfig", "init_httpAuthSchemeProvider", "init_httpAuthSchemes", "resolveClientEndpointParameters", "commonParams", "init_EndpointParameters", "import_util_endpoints", "k", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "_data", "root", "r", "nodes", "bdd", "init_bdd", "import_util_endpoints", "cache", "defaultEndpointResolver", "init_endpointResolver", "init_bdd", "bdd", "import_smithy_client", "__ServiceException", "InvalidRequestException", "init_errors", "_IRE", "_aT", "_c", "_e", "_h", "_hE", "_s", "n0", "_s_registry", "n0_registry", "InvalidRequestException$", "errorTypeRegistries", "init_schemas_0", "init_errors", "InvalidRequestException", "import_smithy_client", "import_url_parser", "import_util_base64", "import_util_utf8", "getRuntimeConfig", "init_runtimeConfig_shared", "init_httpAuthSchemes", "init_protocols", "init_httpAuthSchemeProvider", "init_endpointResolver", "init_schemas_0", "defaultEndpointResolver", "errorTypeRegistries", "import_util_user_agent_node", "import_config_resolver", "import_hash_node", "import_middleware_retry", "import_node_config_provider", "import_node_http_handler", "import_smithy_client", "import_util_body_length_node", "import_util_defaults_mode_node", "import_util_retry", "getRuntimeConfig", "init_runtimeConfig", "init_httpAuthSchemes", "init_runtimeConfig_shared", "loadNodeConfig", "RequestHandler", "getHttpAuthExtensionConfiguration", "resolveHttpAuthRuntimeConfig", "init_httpAuthExtensionConfiguration", "import_region_config_resolver", "import_protocol_http", "import_smithy_client", "resolveRuntimeExtensions", "init_runtimeExtensions", "init_httpAuthExtensionConfiguration", "getHttpAuthExtensionConfiguration", "resolveHttpAuthRuntimeConfig", "import_middleware_host_header", "import_middleware_logger", "import_middleware_recursion_detection", "import_middleware_user_agent", "import_config_resolver", "import_middleware_content_length", "import_middleware_endpoint", "import_middleware_retry", "import_smithy_client", "init_httpAuthSchemeProvider", "init_EndpointParameters", "init_runtimeConfig", "init_runtimeExtensions", "__Client", "getRuntimeConfig", "resolveClientEndpointParameters", "resolveHttpAuthSchemeConfig", "resolveRuntimeExtensions", "import_middleware_endpoint", "import_smithy_client", "init_EndpointParameters", "init_schemas_0", "$Command", "commonParams", "o", "import_smithy_client", "commands", "init_commands", "init_models_0", "$Command", "InvalidRequestException", "InvalidRequestException$", "__Client", "errorTypeRegistries", "init_commands", "init_schemas_0", "init_errors", "init_models_0", "require_dist_cjs", "client", "logger", "e", "SSOClient", "GetRoleCredentialsCommand", "accountId", "createAwsAuthSigv4HttpAuthOption", "createSmithyApiNoAuthHttpAuthOption", "import_util_middleware", "resolveHttpAuthSchemeConfig", "init_httpAuthSchemeProvider", "init_httpAuthSchemes", "resolveClientEndpointParameters", "commonParams", "init_EndpointParameters", "import_util_endpoints", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "_data", "root", "r", "nodes", "bdd", "init_bdd", "import_util_endpoints", "cache", "defaultEndpointResolver", "init_endpointResolver", "init_bdd", "bdd", "import_smithy_client", "__ServiceException", "AccessDeniedException", "InternalServerException", "init_errors", "_ADE", "_AT", "_ISE", "_RT", "_TMRE", "_aKI", "_aT", "_c", "_cI", "_cV", "_co", "_e", "_eI", "_gT", "_h", "_hE", "_iT", "_m", "_rT", "_rU", "_s", "_sAK", "_sT", "_se", "_tT", "n0", "_s_registry", "n0_registry", "AccessDeniedException$", "InternalServerException$", "errorTypeRegistries", "RefreshToken", "init_schemas_0", "init_errors", "AccessDeniedException", "InternalServerException", "import_smithy_client", "import_url_parser", "import_util_base64", "import_util_utf8", "getRuntimeConfig", "init_runtimeConfig_shared", "init_httpAuthSchemes", "init_protocols", "init_httpAuthSchemeProvider", "init_endpointResolver", "init_schemas_0", "defaultEndpointResolver", "errorTypeRegistries", "import_util_user_agent_node", "import_config_resolver", "import_hash_node", "import_middleware_retry", "import_node_config_provider", "import_node_http_handler", "import_smithy_client", "import_util_body_length_node", "import_util_defaults_mode_node", "import_util_retry", "getRuntimeConfig", "init_runtimeConfig", "init_httpAuthSchemes", "init_runtimeConfig_shared", "loadNodeConfig", "RequestHandler", "getHttpAuthExtensionConfiguration", "resolveHttpAuthRuntimeConfig", "init_httpAuthExtensionConfiguration", "import_region_config_resolver", "import_protocol_http", "import_smithy_client", "resolveRuntimeExtensions", "init_runtimeExtensions", "init_httpAuthExtensionConfiguration", "getHttpAuthExtensionConfiguration", "resolveHttpAuthRuntimeConfig", "import_middleware_host_header", "import_middleware_logger", "import_middleware_recursion_detection", "import_middleware_user_agent", "import_config_resolver", "import_middleware_content_length", "import_middleware_endpoint", "import_middleware_retry", "import_smithy_client", "init_httpAuthSchemeProvider", "init_EndpointParameters", "init_runtimeConfig", "init_runtimeExtensions", "__Client", "getRuntimeConfig", "resolveClientEndpointParameters", "resolveHttpAuthSchemeConfig", "resolveRuntimeExtensions", "import_middleware_endpoint", "import_smithy_client", "init_EndpointParameters", "init_schemas_0", "$Command", "commonParams", "o", "import_smithy_client", "commands", "init_commands", "init_enums", "init_models_0", "$Command", "AccessDeniedException", "AccessDeniedException$", "InternalServerException", "InternalServerException$", "__Client", "errorTypeRegistries", "init_commands", "init_schemas_0", "init_enums", "init_errors", "init_models_0", "require_dist_cjs", "client", "SigninClient", "CreateOAuth2TokenCommand", "logger", "isH2", "requestHandler", "error", "k", "r", "i", "payload", "require_dist_cjs", "accountId", "require_dist_cjs", "client", "e", "data", "cache", "error", "env", "defaultErrorHandler", "defaultSuccessHandler", "collectBody", "require_dist_cjs", "SignatureV4MultiRegion", "import_util_endpoints", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "_data", "root", "r", "nodes", "bdd", "init_bdd", "import_util_endpoints", "cache", "defaultEndpointResolver", "init_endpointResolver", "init_bdd", "bdd", "createAwsAuthSigv4HttpAuthOption", "createSmithyApiNoAuthHttpAuthOption", "import_middleware_endpoint", "import_util_middleware", "resolveHttpAuthSchemeConfig", "init_httpAuthSchemeProvider", "init_httpAuthSchemes", "init_endpointResolver", "defaultEndpointResolver", "name", "resolveClientEndpointParameters", "commonParams", "init_EndpointParameters", "import_smithy_client", "__ServiceException", "ExpiredTokenException", "init_errors", "_ETE", "_c", "_e", "_hE", "_m", "_s", "n0", "_s_registry", "n0_registry", "ExpiredTokenException$", "errorTypeRegistries", "init_schemas_0", "init_errors", "ExpiredTokenException", "import_signature_v4_multi_region", "import_smithy_client", "import_url_parser", "import_util_base64", "import_util_utf8", "getRuntimeConfig", "init_runtimeConfig_shared", "init_httpAuthSchemes", "init_protocols", "init_httpAuthSchemeProvider", "init_endpointResolver", "init_schemas_0", "defaultEndpointResolver", "errorTypeRegistries", "import_util_user_agent_node", "import_config_resolver", "import_hash_node", "import_middleware_retry", "import_node_config_provider", "import_node_http_handler", "import_smithy_client", "import_util_body_length_node", "import_util_defaults_mode_node", "import_util_retry", "getRuntimeConfig", "init_runtimeConfig", "init_httpAuthSchemes", "init_runtimeConfig_shared", "loadNodeConfig", "RequestHandler", "getHttpAuthExtensionConfiguration", "resolveHttpAuthRuntimeConfig", "init_httpAuthExtensionConfiguration", "import_region_config_resolver", "import_protocol_http", "import_smithy_client", "resolveRuntimeExtensions", "init_runtimeExtensions", "init_httpAuthExtensionConfiguration", "getHttpAuthExtensionConfiguration", "resolveHttpAuthRuntimeConfig", "import_middleware_host_header", "import_middleware_logger", "import_middleware_recursion_detection", "import_middleware_user_agent", "import_config_resolver", "import_middleware_content_length", "import_middleware_endpoint", "import_middleware_retry", "import_smithy_client", "init_httpAuthSchemeProvider", "init_EndpointParameters", "init_runtimeConfig", "init_runtimeExtensions", "__Client", "getRuntimeConfig", "resolveClientEndpointParameters", "resolveHttpAuthSchemeConfig", "resolveRuntimeExtensions", "import_middleware_endpoint", "import_smithy_client", "init_EndpointParameters", "init_schemas_0", "$Command", "commonParams", "o", "import_middleware_endpoint", "import_smithy_client", "init_EndpointParameters", "init_schemas_0", "$Command", "commonParams", "o", "import_smithy_client", "commands", "init_commands", "init_models_0", "import_region_config_resolver", "STSClient", "logger", "accountId", "getDefaultRoleAssumer", "getDefaultRoleAssumerWithWebIdentity", "ExpiredTokenException", "ExpiredTokenException$", "__Client", "errorTypeRegistries", "getDefaultRoleAssumer", "getDefaultRoleAssumerWithWebIdentity", "init_commands", "init_schemas_0", "init_errors", "init_models_0", "require_dist_cjs", "client", "data", "accountId", "logger", "error", "__createBinding", "o", "m", "k", "k2", "__setModuleDefault", "__importStar", "ownKeys", "i", "getDefaultRoleAssumerWithWebIdentity", "require_dist_cjs", "k", "require_dist_cjs", "client", "logger", "resolveProfileData", "getDefaultRoleAssumer", "data", "require_dist_cjs", "c", "memoize", "env", "memoize", "p", "client", "error", "existsSync", "readFileSync", "homedir", "join", "platform", "code", "randomUUID", "resolve", "payload", "data", "reloadKiroLaneAuth", "reloadCopilotLaneAuth", "reloadCursorLaneAuth", "reloadClineLaneAuth", "reloadKiloLaneAuth", "r", "root", "state", "q", "client", "error", "cache", "c", "b", "i", "state", "textFromContent", "c", "b", "data", "m", "crypto", "existsSync", "mkdirSync", "readFileSync", "homedir", "dirname", "join", "m", "randomUUID", "readdirSync", "data", "isRecord", "cwd", "error", "n", "m", "k", "last", "c", "c", "payload", "event", "homedir", "join", "randomUUID", "existsSync", "mkdirSync", "readFileSync", "writeFileSync", "cache", "f", "arch", "e", "r", "entitled", "b", "data", "c", "i", "p", "h", "a", "n", "payload", "event", "createHash", "p", "data", "env", "persisted", "c", "h", "m", "_sleep", "r", "volatile", "CORE_TOOL_NAMES", "init_config", "ac", "response", "i", "geminiChunks", "anthropicEvents", "data", "p", "k", "data", "m", "g", "m", "data", "i", "data", "promisify", "init_config", "data", "m", "createHash", "memoize", "year", "init_common", "init_prompt", "init_common", "nonEmptyString", "i", "label", "list", "init_prompt", "root", "d", "m", "e", "readFileSync", "writeFileSync", "mkdirSync", "existsSync", "chmodSync", "renameSync", "join", "homedir", "m", "a", "i", "k", "payload", "event", "ANTIGRAVITY_MODELS", "createHash", "randomBytes", "createServer", "readFileSync", "writeFileSync", "mkdirSync", "existsSync", "renameSync", "chmodSync", "join", "homedir", "platform", "URL", "resolve", "state", "error", "p", "data", "e", "STORAGE_FILE", "STORAGE_DIR", "eligible", "a", "b", "createServer", "randomBytes", "createHash", "p", "id", "secret", "state", "_startCallbackServer", "clearCodeAssistCache", "reloadGeminiLaneAuth", "error", "parseGeminiApiSSE", "antigravitySessionHeaders", "payload", "event", "error", "resolve", "t", "a", "refreshAccessToken", "refreshGeminiOAuth", "loadProviderKey", "response", "headers", "i", "data", "url", "m", "k", "flattenComposition", "buildStrictParamsSummary", "normalizeSchemaTypeForSummary", "summarizeSchemaNode", "randomUUID", "uncachedInputTokens", "map", "b", "r", "DYNAMIC_BOUNDARY", "m", "cache", "e", "init_prompt", "init_prompt", "path", "i", "_byNativeName", "init_tools", "init_prompt", "e", "arch", "payload", "path", "fs", "crypto", "b", "getNetworkErrorCode", "error", "d", "isRetryableTransport", "RETRYABLE_NETWORK_CODES", "parseRetryAfter", "retryWithBackoff", "INITIAL_DELAY_MS", "DEFAULT_MAX_ATTEMPTS", "resolve", "MAX_DELAY_MS", "init_api", "m", "map", "r", "b", "a", "init_loop", "init_tools", "init_api", "open", "init_prompt", "init_loop", "init_tools", "init_prompt", "init_api", "r", "init_tools", "init_prompt", "stat", "p", "m", "m", "d", "normalizeGlmModelId", "GLM_MODELS", "k", "k", "finalizePendingToolCalls", "dedupeToolCalls", "m", "m", "m", "k", "f", "m", "m", "applyOpenAIReasoningEffort", "m", "applyOpenAIReasoningEffort", "m", "existsSync", "mkdirSync", "readFileSync", "writeFileSync", "homedir", "dirname", "join", "m", "load", "_loaded", "STORE_PATH", "k", "_cache", "randomUUID", "isClaudeModel", "m", "isReasoningCapable", "existsSync", "mkdirSync", "readFileSync", "writeFileSync", "homedir", "dirname", "join", "load", "path", "_cache", "m", "m", "m", "m", "c", "m", "i", "b", "m", "tag", "i", "o", "c", "r", "root", "error", "data", "k", "bag", "p", "init_loop", "init_tools", "payload", "stopReason", "init_prompt", "p", "init_loop", "init_tools", "init_prompt", "_ensureIndexed", "list", "init_tools", "init_prompt", "k", "refreshAccessToken", "payload", "init_oauth", "readFile", "writeFile", "mkdir", "join", "homedir", "existsSync", "_singleton", "init_oauth", "refreshAccessToken", "parseRetryAfter", "PROMPT_TOO_LONG_ERROR_MESSAGE", "init_api", "init_oauth", "data", "e", "randomUUID", "buildToolUseIdToNativeMap", "map", "b", "r", "init_loop", "init_tools", "init_api", "m", "init_prompt", "init_loop", "init_tools", "init_prompt", "init_api", "init_oauth", "init_loop", "m", "init_loop", "cursor", "payload", "m", "payload", "i", "randomUUID", "payload", "i", "init_prompt", "randomUUID", "state", "payload", "assembleSystemFromParts", "fs", "path", "MAX_TURNS", "init_loop", "refreshKiroOAuth", "data", "error", "b", "c", "m", "init_loop", "data", "tag", "_decoder", "payload", "error", "i", "b", "_asRecord", "i", "label", "_ensureIndexed", "_byNativeName", "_byImplId", "cwd", "init_tools", "init_prompt", "path", "_convertMessages", "map", "a", "b", "init_request", "init_tools", "createHash", "randomUUID", "existsSync", "readFileSync", "join", "h", "i", "a", "b", "c", "arch", "init_catalog", "state", "_emitErrorText", "_blankUsage", "i", "map", "variant", "error", "init_loop", "init_request", "init_catalog", "init_tools", "b", "init_loop", "init_catalog", "init_request", "payload", "tag", "blankUsage", "init_loop", "error", "refreshed", "init_cline", "init_loop", "init_catalog", "m", "i", "asRecord", "firstDefined", "nonEmptyString", "askUserHeader", "askUserOptions", "i", "label", "resolveReasoningEffort", "n", "blankUsage", "emitErrorTurn", "init_loop", "init_catalog", "payload", "m", "error", "feature", "init_loop", "init_cline", "normalizeOllamaApiKey", "normalizeLmStudioApiKey", "p", "refreshGeminiOAuth", "geminiApi", "kiroLane", "openaiCompatLane", "cursorLane", "clineLane", "kiloLane", "geminiLane", "homedir", "join", "readFileSync", "writeFileSync", "mkdirSync", "existsSync", "CONFIG_DIR", "CACHE_TTL_MS", "data", "reloadCopilotLaneAuth", "reloadClineLaneAuth", "reloadKiroLaneAuth", "reloadKiloLaneAuth", "reloadCursorLaneAuth", "reloadGeminiLaneAuth", "reloadOpenAICompatProviderAuth", "normalizeCommandCodeBaseUrl", "c", "AsyncLocalStorage", "init_client", "readFileSync", "memoize", "z", "init_client", "path", "init_config", "axios", "init_config", "init_settings", "init_settings", "init_settings", "init_catalog", "r", "init_state", "init_config", "p", "init_config", "error", "init_settings", "init_config", "axios", "init_config", "axios", "init_client", "init_config", "mkdirSync", "writeFileSync", "path", "error", "createHash", "execa", "STSClient", "error", "memoize", "m", "memoize", "init_betas", "init_settings", "b", "data", "execaSync", "_e", "data", "chmodSync", "join", "data", "e", "resolve", "signal", "onAbort", "isArray", "isPlainObject", "setProperty", "getProperty", "clone", "i", "c", "i", "n", "d", "a", "b", "i", "normalize", "i", "error", "e", "l", "c", "i", "n", "path", "res", "parsePort", "e", "URL", "i", "require_lib", "Blob", "a", "i", "e", "error", "resolve", "clone", "map", "Headers", "k", "URL", "Request", "isDomainOrSubdomain", "isSameProtocol", "fetch", "abort", "abortAndFinalize", "__importDefault", "_a", "error", "_c", "data", "getConfig", "resolve", "_a", "i", "state", "n", "i", "i", "i", "state", "__importDefault", "fetch", "__classPrivateFieldGet", "data", "resolve", "e", "_c", "_Gaxios_applyRequestInterceptors", "_Gaxios_applyResponseInterceptors", "_Gaxios_prepareRequest", "proxy", "_e", "HttpsProxyAgent", "_a", "_Gaxios_getProxyAgent", "__classPrivateFieldSet", "__importStar", "__exportStar", "clone", "BigNumber", "b", "c", "e", "i", "p", "n", "a", "k", "j", "d", "r", "m", "compare", "q", "format", "g2", "d2", "n0", "z", "l", "require_stringify", "JSON", "f", "n", "a", "c", "i", "k", "v", "require_parse", "error", "m", "c", "number", "string", "i", "array", "object", "k", "value", "_a", "process", "__importStar", "LogSeverity", "namespace", "_a", "logger", "e", "__exportStar", "logger", "metadataAccessor", "_a", "r2", "r", "e", "__exportStar", "i", "len", "len2", "count", "data", "require_crypto", "crypto", "count", "data", "require_crypto", "e", "require_package", "e", "Buffer", "Buffer", "o", "require_util", "__classPrivateFieldGet", "state", "f", "get", "_a", "o", "LRUCache", "_LRUCache_moveToEnd", "_LRUCache_evict", "_a", "_c", "_e", "env", "payload", "CodeChallengeMethod", "CertificateFormat", "ClientAuthentication", "crypto", "r", "e", "p", "_a", "data", "headers", "r2", "format", "payload", "data", "e", "payload", "GCPEnv", "env", "e", "Buffer", "data", "Buffer", "a", "b", "c", "i", "Buffer", "crypto", "fromBase64", "toBase64", "i", "timingSafeEqual", "a", "b", "Buffer", "Buffer", "payload", "e", "Buffer", "e", "payload", "require_src", "__classPrivateFieldGet", "state", "f", "__classPrivateFieldSet", "fs", "path", "readFile", "GOOGLE_TOKEN_URL", "_a", "_GoogleToken_getTokenAsync", "_GoogleToken_getTokenAsyncInner", "_GoogleToken_ensureEmail", "_GoogleToken_revokeTokenAsync", "_GoogleToken_configure", "_GoogleToken_requestToken", "payload", "r", "e", "payload", "resolve", "data", "r", "resolve", "data", "e", "resolve", "data", "client", "_a", "_c", "_e", "error", "_a", "data", "_a", "_c", "error", "__classPrivateFieldGet", "state", "f", "__classPrivateFieldSet", "_a", "r", "e", "_BaseExternalAccountClient_internalRefreshAccessTokenAsync", "_a", "_c", "fs", "readFile", "realpath", "lstat", "crypto", "__classPrivateFieldGet", "state", "f", "_DefaultAwsSecurityCredentialsSupplier_getImdsV2SessionToken", "_DefaultAwsSecurityCredentialsSupplier_getAwsRoleName", "_DefaultAwsSecurityCredentialsSupplier_retrieveAwsSecurityCredentials", "_DefaultAwsSecurityCredentialsSupplier_regionFromEnv_get", "_DefaultAwsSecurityCredentialsSupplier_securityCredentialsFromEnv_get", "__classPrivateFieldGet", "state", "f", "_a", "fs", "resolve", "data", "error", "_a", "i", "_a", "error", "_a", "r", "e", "__classPrivateFieldGet", "state", "f", "__classPrivateFieldSet", "fs", "path", "client", "r", "e", "_a", "_c", "resolve", "data", "crypto", "_GoogleAuth_prepareAndCacheClient", "_GoogleAuth_determineClient", "r", "e", "_a", "a", "require_src", "exec", "execa", "memoize", "apiKeyFromFd", "error", "resolve", "data", "e", "client", "readFileSync", "existsSync", "join", "homedir", "normalizeCommandCodeBaseUrl", "normalizeLmStudioBaseUrl", "init_client", "init_betas", "init_config", "init_settings", "refreshed", "AsyncLocalStorage", "axios", "execa", "memoize", "init_config", "init_auth", "init_auth", "init_auth", "script", "result", "stat", "memoize", "commands", "axios", "AsyncLocalStorage", "AsyncLocalStorage", "init_common", "memoize", "init_betas", "axios", "randomUUID", "init_config", "init_client", "sink", "randomUUID", "isEqual", "data", "logForDebugging", "init_config", "isEqual", "memoize", "logForDebugging", "feature", "payload", "f", "jsonStringify", "error", "init_config", "memoize", "homedir", "isAbsolute", "join", "normalize", "sep", "init_settings", "realpath", "dirname", "join", "resolve", "sep", "e", "resolvedPath", "a", "b", "isClaudeAISubscriber", "hasProfileScope", "getOauthAccountInfo", "randomBytes", "unwatchFile", "watchFile", "memoize", "basename", "dirname", "join", "resolve", "error", "path", "fs", "e", "f", "errorMessage", "init_config", "init_config", "createServer", "init_state", "randomUUID", "existsSync", "mkdirSync", "readFileSync", "rmSync", "writeFileSync", "join", "path", "error", "state", "isRecord", "isRecord", "isRecord", "randomUUID", "isRecord", "error", "normalizeRuntimeRole", "createServer", "error", "resolve", "platform", "error"]
}
