{"version":3,"sources":["../../client/index.ts"],"sourcesContent":["import {\n    assertActionMethodBodyContract,\n    assertActionPath,\n    assertFlatScalarQuery,\n    createDTIHmacSha256,\n    createDTISignPayload,\n    DTI_DEFAULT_SIGN_HEADER_NAMES,\n    DTIError,\n    parseDTISignTimestamp,\n    resolveActionMethod,\n    resolveDTISignHeaderNames,\n} from \"@napp/dti-core\";\nimport type { ActionParam, ActionResult, DTIAction, DTISignHeaderNames, TContentType, TMethod, TResponseType } from \"@napp/dti-core\";\nimport type { z } from \"zod\";\n\ntype TActionSchema = z.ZodType;\ntype TAnyAction = DTIAction<any, any, any, any, any>;\ntype InferActionSchema<TSchema> = TSchema extends TActionSchema ? z.infer<TSchema> : void;\ntype InferClientResult<RSchema, ResponseType extends TResponseType> =\n    ResponseType extends \"text\"\n        ? string\n        : ResponseType extends \"file\"\n            ? Blob\n            : InferActionSchema<RSchema>;\n\nexport type DTIClientParam<TAction extends TAnyAction> =\n    TAction extends DTIAction<infer _RSchema, infer QSchema, infer BSchema, infer _ResponseType, infer PSchema>\n    ? ActionParam<InferActionSchema<QSchema>, InferActionSchema<BSchema>, InferActionSchema<PSchema>>\n    : never;\n\nexport type DTIClientResult<TAction extends TAnyAction> =\n    TAction extends DTIAction<infer RSchema, infer _QSchema, infer _BSchema, infer ResponseType, infer _PSchema>\n    ? InferClientResult<RSchema, ResponseType>\n    : never;\n\nexport type DTIClientAuthParam<TAction extends TAnyAction = TAnyAction> = {\n    action: TAction;\n    param: DTIClientParam<TAction>;\n};\n\nexport type DTIClientAuth<TAction extends TAnyAction = TAnyAction> = (\n    param: DTIClientAuthParam<TAction>,\n) => HeadersInit | undefined | Promise<HeadersInit | undefined>;\n\nexport type DTIClientSignParam<TAction extends TAnyAction = TAnyAction> = {\n    action: TAction;\n    param: DTIClientParam<TAction>;\n};\n\nexport type DTIClientSignSecret<TAction extends TAnyAction = TAnyAction> =\n    | string\n    | ((param: DTIClientSignParam<TAction>) => string | Promise<string>);\n\nexport type DTIClientSign<TAction extends TAnyAction = TAnyAction> = {\n    keyId: string;\n    secret: DTIClientSignSecret<TAction>;\n    timestamp?: () => string | Date | Promise<string | Date>;\n    nonce?: () => string | Promise<string>;\n    headerNames?: Partial<DTISignHeaderNames>;\n};\n\nexport type DTIClientOptions = RequestInit & {\n    auth?: DTIClientAuth;\n    fetcher?: typeof fetch;\n    sign?: DTIClientSign;\n};\n\nexport type DTIClientCallOptions<TAction extends TAnyAction = TAnyAction> = RequestInit & {\n    auth?: DTIClientAuth<TAction>;\n    sign?: DTIClientSign<TAction> | false;\n};\n\nexport type DTIClientDetailedResult<TAction extends TAnyAction> = {\n    result: DTIClientResult<TAction>;\n    response: Response;\n};\n\ntype TApiSuccess = {\n    success: true;\n    data: unknown;\n};\n\ntype TApiFailure = {\n    success: false;\n    message?: string;\n    code?: string;\n    details?: Record<string, unknown>;\n};\n\ntype TApiResponse = TApiSuccess | TApiFailure;\n\nexport class DTIClient {\n    private readonly fetcher: typeof fetch;\n    private readonly options: DTIClientOptions;\n    private readonly globalSignHeaderNames: Readonly<DTISignHeaderNames> | undefined;\n\n    constructor(\n        private readonly baseUrl: string,\n        options?: DTIClientOptions | typeof fetch,\n    ) {\n        if (typeof options === \"function\") {\n            this.fetcher = options;\n            this.options = {};\n            this.globalSignHeaderNames = undefined;\n            return;\n        }\n\n        this.fetcher = options?.fetcher || fetch;\n        this.options = options || {};\n        this.globalSignHeaderNames = options?.sign\n            ? resolveDTISignHeaderNames(options.sign.headerNames)\n            : undefined;\n    }\n\n\n\n    async call<TAction extends TAnyAction>(\n        action: TAction,\n        param: DTIClientParam<TAction>,\n        options?: DTIClientCallOptions<TAction>,\n    ): Promise<DTIClientResult<TAction>> {\n        const detailed = await this.callDetailed(action, param, options);\n\n        return detailed.result;\n    }\n\n    async callDetailed<TAction extends TAnyAction>(\n        action: TAction,\n        param: DTIClientParam<TAction>,\n        options?: DTIClientCallOptions<TAction>,\n    ): Promise<DTIClientDetailedResult<TAction>> {\n        assertActionPath(action.path);\n        assertActionMethodBodyContract(action.method, action.body);\n        const method = resolveActionMethod(action);\n        const validParam = this.parseParam(action, param);\n\n        if (action.validateParam && !action.validateParam(validParam)) {\n            throw new DTIError(\"Invalid action param\", { code: \"DTI_PARAM_VALIDATE_ERROR\" });\n        }\n\n        const { data, response } = await this.callApi(\n            this.createUrl(action.path, validParam),\n            method,\n            action.contentType || \"json\",\n            action.responseType || \"json\",\n            validParam.body,\n            action,\n            validParam,\n            options,\n        );\n\n        const result = this.parseResult(action, data);\n\n        if (action.validateResult && !this.validateResult(action.validateResult, result)) {\n            throw new DTIError(\"Invalid action result\", { code: \"DTI_RESULT_VALIDATE_ERROR\" });\n        }\n\n        return {\n            result,\n            response,\n        };\n    }\n\n    private parseParam<TAction extends TAnyAction>(\n        action: TAction,\n        param: DTIClientParam<TAction>,\n    ): DTIClientParam<TAction> {\n        const parsedParam = {} as DTIClientParam<TAction>;\n\n        if (action.params) {\n            const parsedPathParams = action.params.safeParse(param.params);\n            if (!parsedPathParams.success) {\n                throw new DTIError(\"Invalid action path params\", { code: \"DTI_PATH_PARAMS_VALIDATE_ERROR\" });\n            }\n            parsedParam.params = parsedPathParams.data;\n        }\n\n        if (action.query) {\n            assertFlatScalarQuery(param.query);\n            const parsedQuery = action.query.safeParse(param.query);\n            if (!parsedQuery.success) {\n                throw new DTIError(\"Invalid action query\", { code: \"DTI_QUERY_VALIDATE_ERROR\" });\n            }\n            assertFlatScalarQuery(parsedQuery.data);\n            parsedParam.query = parsedQuery.data;\n        }\n\n        if (action.body) {\n            const parsedBody = action.body.safeParse(param.body);\n            if (!parsedBody.success) {\n                throw new DTIError(\"Invalid action body\", { code: \"DTI_BODY_VALIDATE_ERROR\" });\n            }\n            parsedParam.body = parsedBody.data;\n        }\n\n        return parsedParam;\n    }\n\n    private validateResult<TResult>(\n        validate: (param: ActionResult<TResult>) => boolean,\n        result: TResult,\n    ): boolean {\n        return validate({ result } as ActionResult<TResult>);\n    }\n\n    private parseResult<TAction extends TAnyAction>(\n        action: TAction,\n        data: unknown,\n    ): DTIClientResult<TAction> {\n        const responseType = action.responseType || \"json\";\n        if (responseType !== \"json\") {\n            return data as DTIClientResult<TAction>;\n        }\n\n        if (!action.result) {\n            return undefined as DTIClientResult<TAction>;\n        }\n\n        const parsedResult = action.result.safeParse(data);\n        if (!parsedResult.success) {\n            throw new DTIError(\"Invalid action result\", { code: \"DTI_RESULT_PARSE_ERROR\" });\n        }\n\n        return parsedResult.data as DTIClientResult<TAction>;\n    }\n\n    private async callApi<TAction extends TAnyAction>(\n        url: string,\n        method: TMethod,\n        contentType: TContentType,\n        responseType: TResponseType,\n        body: unknown | undefined,\n        action: TAction,\n        param: DTIClientParam<TAction>,\n        options?: DTIClientCallOptions<TAction>,\n    ): Promise<{ data: unknown; response: Response }> {\n        try {\n            const requestBody = this.createBody(contentType, body);\n            const headers = await this.createHeaders(url, method, contentType, body, action, param, options);\n            const requestInit = this.createRequestInit(method, requestBody, headers, options);\n\n            const response = await this.fetcher(this.baseUrl + url, requestInit);\n\n            if (!response.ok) {\n                throw await this.createResponseError(response);\n            }\n\n            if (response.status === 204 || response.status === 205) {\n                return {\n                    data: undefined,\n                    response,\n                };\n            }\n\n            if (responseType === \"text\") {\n                return {\n                    data: await response.text(),\n                    response,\n                };\n            }\n\n            if (responseType === \"file\") {\n                return {\n                    data: await response.blob(),\n                    response,\n                };\n            }\n\n            const result = await response.json() as TApiResponse;\n\n            if (result && typeof result === \"object\" && \"success\" in result) {\n                if (result.success === true) {\n                    return {\n                        data: result.data,\n                        response,\n                    };\n                }\n                throw this.createApiError(result.message || \"API error\", result.code || \"API_ERROR\", result.details);\n            }\n\n            throw new DTIError(\"API not supported format\", { code: \"API_FORMAT_ERROR\" });\n        } catch (error) {\n            if (error instanceof DTIError) {\n                throw error;\n            }\n            throw new DTIError(\"Network error\", { code: \"NETWORK_ERROR\" });\n        }\n    }\n\n    private async createResponseError(response: Response): Promise<DTIError> {\n        try {\n            const result = await response.json() as TApiFailure;\n            if (result && typeof result === \"object\" && result.success === false) {\n                return this.createApiError(\n                    result.message || response.statusText || \"API error\",\n                    result.code || \"API_ERROR\",\n                    result.details,\n                    response.status,\n                );\n            }\n        } catch {\n            // Ignore non-JSON error body and fall back to HTTP status.\n        }\n\n        return new DTIError(response.statusText || \"API server error\", {\n            code: \"API_SERVER_ERROR\",\n            status: response.status,\n        });\n    }\n\n    private createApiError(\n        message: string,\n        code: string,\n        details?: Record<string, unknown>,\n        status?: number,\n    ): DTIError {\n        const options: { code: string; details?: Record<string, unknown>; status?: number } = { code };\n        if (details) {\n            options.details = details;\n        }\n        if (status) {\n            options.status = status;\n        }\n\n        return new DTIError(message, options);\n    }\n\n    private createUrl(path: string, param: { params?: unknown; query?: unknown }): string {\n        const resolvedPath = this.resolvePathParams(path, param.params);\n        const query = param.query;\n        if (query === undefined) {\n            return resolvedPath;\n        }\n        assertFlatScalarQuery(query);\n\n        const search = new URLSearchParams();\n        for (const [key, value] of Object.entries(query)) {\n            if (value !== undefined) {\n                search.append(key, String(value));\n            }\n        }\n\n        const queryString = search.toString();\n        if (!queryString) {\n            return resolvedPath;\n        }\n\n        return resolvedPath.includes(\"?\") ? `${resolvedPath}&${queryString}` : `${resolvedPath}?${queryString}`;\n    }\n\n    private resolvePathParams(path: string, params: unknown): string {\n        const values = params && typeof params === \"object\"\n            ? params as Record<string, unknown>\n            : {};\n\n        return path.split(\"/\").map((segment) => {\n            const match = /^:([A-Za-z_][A-Za-z0-9_]*)$/.exec(segment);\n            if (!match) {\n                return segment;\n            }\n\n            const paramName = match[1] as string;\n            const value = values[paramName];\n            const valueType = typeof value;\n            const isScalar = valueType === \"string\"\n                || valueType === \"number\"\n                || valueType === \"boolean\"\n                || valueType === \"bigint\";\n\n            if (!Object.prototype.hasOwnProperty.call(values, paramName)\n                || value === null\n                || value === undefined\n                || !isScalar\n                || (valueType === \"number\" && !Number.isFinite(value))) {\n                throw new DTIError(`Invalid action path param: ${paramName}`, {\n                    code: \"DTI_PATH_PARAMS_VALIDATE_ERROR\",\n                    details: { paramName },\n                });\n            }\n\n            return encodeURIComponent(String(value));\n        }).join(\"/\");\n    }\n\n    private appendFormValue(search: URLSearchParams, key: string, value: unknown): void {\n        if (value === undefined || value === null) {\n            return;\n        }\n\n        if (Array.isArray(value)) {\n            for (const item of value) {\n                this.appendFormValue(search, key, item);\n            }\n            return;\n        }\n\n        if (typeof value === \"object\") {\n            search.append(key, JSON.stringify(value));\n            return;\n        }\n\n        search.append(key, String(value));\n    }\n\n    private createRequestInit<TAction extends TAnyAction>(\n        method: TMethod,\n        body: BodyInit | undefined,\n        headers: HeadersInit,\n        options?: DTIClientCallOptions<TAction>,\n    ): RequestInit {\n        const {\n            auth: _globalAuth,\n            body: _globalBody,\n            fetcher: _globalFetcher,\n            headers: _globalHeaders,\n            method: _globalMethod,\n            sign: _globalSign,\n            ...globalFetchOptions\n        } = this.options;\n        const {\n            auth: _callAuth,\n            body: _callBody,\n            headers: _callHeaders,\n            method: _callMethod,\n            sign: _callSign,\n            ...callFetchOptions\n        } = options || {};\n\n        const requestInit: RequestInit = {\n            ...globalFetchOptions,\n            ...callFetchOptions,\n            method,\n            headers,\n        };\n\n        if (body !== undefined) {\n            requestInit.body = body;\n        }\n\n        return requestInit;\n    }\n\n    private async createHeaders<TAction extends TAnyAction>(\n        url: string,\n        method: TMethod,\n        contentType: TContentType,\n        body: unknown,\n        action: TAction,\n        param: DTIClientParam<TAction>,\n        options?: DTIClientCallOptions<TAction>,\n    ): Promise<HeadersInit> {\n        const headers = new Headers();\n\n        this.appendHeaders(headers, this.options.headers);\n        this.appendHeaders(headers, await this.resolveAuthHeaders(this.options.auth, action, param));\n        this.appendHeaders(headers, options?.headers);\n        this.appendHeaders(headers, await this.resolveAuthHeaders(options?.auth, action, param));\n        this.appendHeaders(headers, await this.createSignHeaders(url, method, action, param, options));\n\n        if (contentType === \"form\" && this.isFormData(body)) {\n            return headers;\n        }\n\n        if (!headers.has(\"Content-Type\")) {\n            headers.set(\"Content-Type\", this.getContentType(contentType));\n        }\n\n        return headers;\n    }\n\n    private async createSignHeaders<TAction extends TAnyAction>(\n        url: string,\n        method: TMethod,\n        action: TAction,\n        param: DTIClientParam<TAction>,\n        options?: DTIClientCallOptions<TAction>,\n    ): Promise<HeadersInit | undefined> {\n        const sign = options?.sign === false\n            ? undefined\n            : options?.sign ?? this.options.sign;\n        if (!sign) {\n            return undefined;\n        }\n        const headerNames = options?.sign !== undefined && options.sign !== false\n            ? resolveDTISignHeaderNames(options.sign.headerNames)\n            : this.globalSignHeaderNames ?? DTI_DEFAULT_SIGN_HEADER_NAMES;\n\n        if (!action.signature) {\n            throw new DTIError(\"Action signature is required\", { code: \"DTI_SIGNATURE_REQUIRED\" });\n        }\n\n        const timestamp = this.normalizeTimestamp(sign.timestamp ? await sign.timestamp() : new Date());\n        const nonce = sign.nonce ? await sign.nonce() : this.createNonce();\n        const actionSignature = action.signature(param);\n        const signPayload = createDTISignPayload({\n            method,\n            pathWithQuery: url,\n            timestamp,\n            nonce,\n            actionSignature,\n        });\n        const secret = await this.resolveSignSecret(sign, action, param);\n        const signature = await createDTIHmacSha256(secret, signPayload);\n\n        return {\n            [headerNames.keyId]: sign.keyId,\n            [headerNames.timestamp]: timestamp,\n            [headerNames.nonce]: nonce,\n            [headerNames.signature]: signature,\n        };\n    }\n\n    private async resolveSignSecret<TAction extends TAnyAction>(\n        sign: DTIClientSign<TAction> | DTIClientSign,\n        action: TAction,\n        param: DTIClientParam<TAction>,\n    ): Promise<string> {\n        if (typeof sign.secret === \"function\") {\n            return await sign.secret({ action, param });\n        }\n\n        return sign.secret;\n    }\n\n    private normalizeTimestamp(timestamp: string | Date): string {\n        let normalizedTimestamp: string;\n        try {\n            normalizedTimestamp = timestamp instanceof Date ? timestamp.toISOString() : timestamp;\n        } catch {\n            throw new DTIError(\"Request signature timestamp is invalid\", {\n                code: \"DTI_SIGNATURE_TIMESTAMP_INVALID\",\n            });\n        }\n\n        if (typeof normalizedTimestamp !== \"string\" || parseDTISignTimestamp(normalizedTimestamp) === undefined) {\n            throw new DTIError(\"Request signature timestamp is invalid\", {\n                code: \"DTI_SIGNATURE_TIMESTAMP_INVALID\",\n            });\n        }\n\n        return normalizedTimestamp;\n    }\n\n    private createNonce(): string {\n        const crypto = globalThis.crypto;\n        if (crypto?.randomUUID) {\n            return crypto.randomUUID();\n        }\n\n        if (crypto?.getRandomValues) {\n            const bytes = new Uint8Array(16);\n            crypto.getRandomValues(bytes);\n\n            return Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n        }\n\n        return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n    }\n\n    private async resolveAuthHeaders<TAction extends TAnyAction>(\n        auth: DTIClientAuth<TAction> | DTIClientAuth | undefined,\n        action: TAction,\n        param: DTIClientParam<TAction>,\n    ): Promise<HeadersInit | undefined> {\n        if (!auth) {\n            return undefined;\n        }\n\n        return await auth({ action, param });\n    }\n\n    private appendHeaders(headers: Headers, source?: HeadersInit): void {\n        if (!source) {\n            return;\n        }\n\n        new Headers(source).forEach((value, key) => {\n            headers.set(key, value);\n        });\n    }\n\n    private getContentType(contentType: TContentType): string {\n        switch (contentType) {\n            case \"form\":\n                return \"application/x-www-form-urlencoded\";\n            case \"text\":\n                return \"text/plain\";\n            case \"json\":\n            default:\n                return \"application/json\";\n        }\n    }\n\n    private createBody(contentType: TContentType, body: unknown): BodyInit | undefined {\n        if (body === undefined || body === null) {\n            return undefined;\n        }\n\n        switch (contentType) {\n            case \"form\":\n                return this.createFormBody(body);\n            case \"text\":\n                return typeof body === \"string\" ? body : String(body);\n            case \"json\":\n            default:\n                return JSON.stringify(body);\n        }\n    }\n\n    private createFormBody(body: unknown): BodyInit {\n        if (this.isFormData(body) || body instanceof URLSearchParams) {\n            return body;\n        }\n\n        if (body === null || typeof body !== \"object\") {\n            return String(body);\n        }\n\n        const form = new URLSearchParams();\n        for (const [key, value] of Object.entries(body)) {\n            this.appendFormValue(form, key, value);\n        }\n\n        return form;\n    }\n\n    private isFormData(value: unknown): value is FormData {\n        return typeof FormData !== \"undefined\" && value instanceof FormData;\n    }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAWO;AAgFA,IAAM,YAAN,MAAgB;AAAA,EAKnB,YACqB,SACjB,SACF;AAFmB;AALrB,wBAAiB;AACjB,wBAAiB;AACjB,wBAAiB;AAMb,QAAI,OAAO,YAAY,YAAY;AAC/B,WAAK,UAAU;AACf,WAAK,UAAU,CAAC;AAChB,WAAK,wBAAwB;AAC7B;AAAA,IACJ;AAEA,SAAK,UAAU,SAAS,WAAW;AACnC,SAAK,UAAU,WAAW,CAAC;AAC3B,SAAK,wBAAwB,SAAS,WAChC,2CAA0B,QAAQ,KAAK,WAAW,IAClD;AAAA,EACV;AAAA,EAIA,MAAM,KACF,QACA,OACA,SACiC;AACjC,UAAM,WAAW,MAAM,KAAK,aAAa,QAAQ,OAAO,OAAO;AAE/D,WAAO,SAAS;AAAA,EACpB;AAAA,EAEA,MAAM,aACF,QACA,OACA,SACyC;AACzC,0CAAiB,OAAO,IAAI;AAC5B,wDAA+B,OAAO,QAAQ,OAAO,IAAI;AACzD,UAAM,aAAS,qCAAoB,MAAM;AACzC,UAAM,aAAa,KAAK,WAAW,QAAQ,KAAK;AAEhD,QAAI,OAAO,iBAAiB,CAAC,OAAO,cAAc,UAAU,GAAG;AAC3D,YAAM,IAAI,yBAAS,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAAA,IACnF;AAEA,UAAM,EAAE,MAAM,SAAS,IAAI,MAAM,KAAK;AAAA,MAClC,KAAK,UAAU,OAAO,MAAM,UAAU;AAAA,MACtC;AAAA,MACA,OAAO,eAAe;AAAA,MACtB,OAAO,gBAAgB;AAAA,MACvB,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAEA,UAAM,SAAS,KAAK,YAAY,QAAQ,IAAI;AAE5C,QAAI,OAAO,kBAAkB,CAAC,KAAK,eAAe,OAAO,gBAAgB,MAAM,GAAG;AAC9E,YAAM,IAAI,yBAAS,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAAA,IACrF;AAEA,WAAO;AAAA,MACH;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAAA,EAEQ,WACJ,QACA,OACuB;AACvB,UAAM,cAAc,CAAC;AAErB,QAAI,OAAO,QAAQ;AACf,YAAM,mBAAmB,OAAO,OAAO,UAAU,MAAM,MAAM;AAC7D,UAAI,CAAC,iBAAiB,SAAS;AAC3B,cAAM,IAAI,yBAAS,8BAA8B,EAAE,MAAM,iCAAiC,CAAC;AAAA,MAC/F;AACA,kBAAY,SAAS,iBAAiB;AAAA,IAC1C;AAEA,QAAI,OAAO,OAAO;AACd,iDAAsB,MAAM,KAAK;AACjC,YAAM,cAAc,OAAO,MAAM,UAAU,MAAM,KAAK;AACtD,UAAI,CAAC,YAAY,SAAS;AACtB,cAAM,IAAI,yBAAS,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAAA,MACnF;AACA,iDAAsB,YAAY,IAAI;AACtC,kBAAY,QAAQ,YAAY;AAAA,IACpC;AAEA,QAAI,OAAO,MAAM;AACb,YAAM,aAAa,OAAO,KAAK,UAAU,MAAM,IAAI;AACnD,UAAI,CAAC,WAAW,SAAS;AACrB,cAAM,IAAI,yBAAS,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAAA,MACjF;AACA,kBAAY,OAAO,WAAW;AAAA,IAClC;AAEA,WAAO;AAAA,EACX;AAAA,EAEQ,eACJ,UACA,QACO;AACP,WAAO,SAAS,EAAE,OAAO,CAA0B;AAAA,EACvD;AAAA,EAEQ,YACJ,QACA,MACwB;AACxB,UAAM,eAAe,OAAO,gBAAgB;AAC5C,QAAI,iBAAiB,QAAQ;AACzB,aAAO;AAAA,IACX;AAEA,QAAI,CAAC,OAAO,QAAQ;AAChB,aAAO;AAAA,IACX;AAEA,UAAM,eAAe,OAAO,OAAO,UAAU,IAAI;AACjD,QAAI,CAAC,aAAa,SAAS;AACvB,YAAM,IAAI,yBAAS,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAAA,IAClF;AAEA,WAAO,aAAa;AAAA,EACxB;AAAA,EAEA,MAAc,QACV,KACA,QACA,aACA,cACA,MACA,QACA,OACA,SAC8C;AAC9C,QAAI;AACA,YAAM,cAAc,KAAK,WAAW,aAAa,IAAI;AACrD,YAAM,UAAU,MAAM,KAAK,cAAc,KAAK,QAAQ,aAAa,MAAM,QAAQ,OAAO,OAAO;AAC/F,YAAM,cAAc,KAAK,kBAAkB,QAAQ,aAAa,SAAS,OAAO;AAEhF,YAAM,WAAW,MAAM,KAAK,QAAQ,KAAK,UAAU,KAAK,WAAW;AAEnE,UAAI,CAAC,SAAS,IAAI;AACd,cAAM,MAAM,KAAK,oBAAoB,QAAQ;AAAA,MACjD;AAEA,UAAI,SAAS,WAAW,OAAO,SAAS,WAAW,KAAK;AACpD,eAAO;AAAA,UACH,MAAM;AAAA,UACN;AAAA,QACJ;AAAA,MACJ;AAEA,UAAI,iBAAiB,QAAQ;AACzB,eAAO;AAAA,UACH,MAAM,MAAM,SAAS,KAAK;AAAA,UAC1B;AAAA,QACJ;AAAA,MACJ;AAEA,UAAI,iBAAiB,QAAQ;AACzB,eAAO;AAAA,UACH,MAAM,MAAM,SAAS,KAAK;AAAA,UAC1B;AAAA,QACJ;AAAA,MACJ;AAEA,YAAM,SAAS,MAAM,SAAS,KAAK;AAEnC,UAAI,UAAU,OAAO,WAAW,YAAY,aAAa,QAAQ;AAC7D,YAAI,OAAO,YAAY,MAAM;AACzB,iBAAO;AAAA,YACH,MAAM,OAAO;AAAA,YACb;AAAA,UACJ;AAAA,QACJ;AACA,cAAM,KAAK,eAAe,OAAO,WAAW,aAAa,OAAO,QAAQ,aAAa,OAAO,OAAO;AAAA,MACvG;AAEA,YAAM,IAAI,yBAAS,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AAAA,IAC/E,SAAS,OAAO;AACZ,UAAI,iBAAiB,0BAAU;AAC3B,cAAM;AAAA,MACV;AACA,YAAM,IAAI,yBAAS,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAAA,IACjE;AAAA,EACJ;AAAA,EAEA,MAAc,oBAAoB,UAAuC;AACrE,QAAI;AACA,YAAM,SAAS,MAAM,SAAS,KAAK;AACnC,UAAI,UAAU,OAAO,WAAW,YAAY,OAAO,YAAY,OAAO;AAClE,eAAO,KAAK;AAAA,UACR,OAAO,WAAW,SAAS,cAAc;AAAA,UACzC,OAAO,QAAQ;AAAA,UACf,OAAO;AAAA,UACP,SAAS;AAAA,QACb;AAAA,MACJ;AAAA,IACJ,QAAQ;AAAA,IAER;AAEA,WAAO,IAAI,yBAAS,SAAS,cAAc,oBAAoB;AAAA,MAC3D,MAAM;AAAA,MACN,QAAQ,SAAS;AAAA,IACrB,CAAC;AAAA,EACL;AAAA,EAEQ,eACJ,SACA,MACA,SACA,QACQ;AACR,UAAM,UAAgF,EAAE,KAAK;AAC7F,QAAI,SAAS;AACT,cAAQ,UAAU;AAAA,IACtB;AACA,QAAI,QAAQ;AACR,cAAQ,SAAS;AAAA,IACrB;AAEA,WAAO,IAAI,yBAAS,SAAS,OAAO;AAAA,EACxC;AAAA,EAEQ,UAAU,MAAc,OAAsD;AAClF,UAAM,eAAe,KAAK,kBAAkB,MAAM,MAAM,MAAM;AAC9D,UAAM,QAAQ,MAAM;AACpB,QAAI,UAAU,QAAW;AACrB,aAAO;AAAA,IACX;AACA,+CAAsB,KAAK;AAE3B,UAAM,SAAS,IAAI,gBAAgB;AACnC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC9C,UAAI,UAAU,QAAW;AACrB,eAAO,OAAO,KAAK,OAAO,KAAK,CAAC;AAAA,MACpC;AAAA,IACJ;AAEA,UAAM,cAAc,OAAO,SAAS;AACpC,QAAI,CAAC,aAAa;AACd,aAAO;AAAA,IACX;AAEA,WAAO,aAAa,SAAS,GAAG,IAAI,GAAG,YAAY,IAAI,WAAW,KAAK,GAAG,YAAY,IAAI,WAAW;AAAA,EACzG;AAAA,EAEQ,kBAAkB,MAAc,QAAyB;AAC7D,UAAM,SAAS,UAAU,OAAO,WAAW,WACrC,SACA,CAAC;AAEP,WAAO,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,YAAY;AACpC,YAAM,QAAQ,8BAA8B,KAAK,OAAO;AACxD,UAAI,CAAC,OAAO;AACR,eAAO;AAAA,MACX;AAEA,YAAM,YAAY,MAAM,CAAC;AACzB,YAAM,QAAQ,OAAO,SAAS;AAC9B,YAAM,YAAY,OAAO;AACzB,YAAM,WAAW,cAAc,YACxB,cAAc,YACd,cAAc,aACd,cAAc;AAErB,UAAI,CAAC,OAAO,UAAU,eAAe,KAAK,QAAQ,SAAS,KACpD,UAAU,QACV,UAAU,UACV,CAAC,YACA,cAAc,YAAY,CAAC,OAAO,SAAS,KAAK,GAAI;AACxD,cAAM,IAAI,yBAAS,8BAA8B,SAAS,IAAI;AAAA,UAC1D,MAAM;AAAA,UACN,SAAS,EAAE,UAAU;AAAA,QACzB,CAAC;AAAA,MACL;AAEA,aAAO,mBAAmB,OAAO,KAAK,CAAC;AAAA,IAC3C,CAAC,EAAE,KAAK,GAAG;AAAA,EACf;AAAA,EAEQ,gBAAgB,QAAyB,KAAa,OAAsB;AAChF,QAAI,UAAU,UAAa,UAAU,MAAM;AACvC;AAAA,IACJ;AAEA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACtB,iBAAW,QAAQ,OAAO;AACtB,aAAK,gBAAgB,QAAQ,KAAK,IAAI;AAAA,MAC1C;AACA;AAAA,IACJ;AAEA,QAAI,OAAO,UAAU,UAAU;AAC3B,aAAO,OAAO,KAAK,KAAK,UAAU,KAAK,CAAC;AACxC;AAAA,IACJ;AAEA,WAAO,OAAO,KAAK,OAAO,KAAK,CAAC;AAAA,EACpC;AAAA,EAEQ,kBACJ,QACA,MACA,SACA,SACW;AACX,UAAM;AAAA,MACF,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,GAAG;AAAA,IACP,IAAI,KAAK;AACT,UAAM;AAAA,MACF,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,GAAG;AAAA,IACP,IAAI,WAAW,CAAC;AAEhB,UAAM,cAA2B;AAAA,MAC7B,GAAG;AAAA,MACH,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACJ;AAEA,QAAI,SAAS,QAAW;AACpB,kBAAY,OAAO;AAAA,IACvB;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,MAAc,cACV,KACA,QACA,aACA,MACA,QACA,OACA,SACoB;AACpB,UAAM,UAAU,IAAI,QAAQ;AAE5B,SAAK,cAAc,SAAS,KAAK,QAAQ,OAAO;AAChD,SAAK,cAAc,SAAS,MAAM,KAAK,mBAAmB,KAAK,QAAQ,MAAM,QAAQ,KAAK,CAAC;AAC3F,SAAK,cAAc,SAAS,SAAS,OAAO;AAC5C,SAAK,cAAc,SAAS,MAAM,KAAK,mBAAmB,SAAS,MAAM,QAAQ,KAAK,CAAC;AACvF,SAAK,cAAc,SAAS,MAAM,KAAK,kBAAkB,KAAK,QAAQ,QAAQ,OAAO,OAAO,CAAC;AAE7F,QAAI,gBAAgB,UAAU,KAAK,WAAW,IAAI,GAAG;AACjD,aAAO;AAAA,IACX;AAEA,QAAI,CAAC,QAAQ,IAAI,cAAc,GAAG;AAC9B,cAAQ,IAAI,gBAAgB,KAAK,eAAe,WAAW,CAAC;AAAA,IAChE;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,MAAc,kBACV,KACA,QACA,QACA,OACA,SACgC;AAChC,UAAM,OAAO,SAAS,SAAS,QACzB,SACA,SAAS,QAAQ,KAAK,QAAQ;AACpC,QAAI,CAAC,MAAM;AACP,aAAO;AAAA,IACX;AACA,UAAM,cAAc,SAAS,SAAS,UAAa,QAAQ,SAAS,YAC9D,2CAA0B,QAAQ,KAAK,WAAW,IAClD,KAAK,yBAAyB;AAEpC,QAAI,CAAC,OAAO,WAAW;AACnB,YAAM,IAAI,yBAAS,gCAAgC,EAAE,MAAM,yBAAyB,CAAC;AAAA,IACzF;AAEA,UAAM,YAAY,KAAK,mBAAmB,KAAK,YAAY,MAAM,KAAK,UAAU,IAAI,oBAAI,KAAK,CAAC;AAC9F,UAAM,QAAQ,KAAK,QAAQ,MAAM,KAAK,MAAM,IAAI,KAAK,YAAY;AACjE,UAAM,kBAAkB,OAAO,UAAU,KAAK;AAC9C,UAAM,kBAAc,sCAAqB;AAAA,MACrC;AAAA,MACA,eAAe;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,IACJ,CAAC;AACD,UAAM,SAAS,MAAM,KAAK,kBAAkB,MAAM,QAAQ,KAAK;AAC/D,UAAM,YAAY,UAAM,qCAAoB,QAAQ,WAAW;AAE/D,WAAO;AAAA,MACH,CAAC,YAAY,KAAK,GAAG,KAAK;AAAA,MAC1B,CAAC,YAAY,SAAS,GAAG;AAAA,MACzB,CAAC,YAAY,KAAK,GAAG;AAAA,MACrB,CAAC,YAAY,SAAS,GAAG;AAAA,IAC7B;AAAA,EACJ;AAAA,EAEA,MAAc,kBACV,MACA,QACA,OACe;AACf,QAAI,OAAO,KAAK,WAAW,YAAY;AACnC,aAAO,MAAM,KAAK,OAAO,EAAE,QAAQ,MAAM,CAAC;AAAA,IAC9C;AAEA,WAAO,KAAK;AAAA,EAChB;AAAA,EAEQ,mBAAmB,WAAkC;AACzD,QAAI;AACJ,QAAI;AACA,4BAAsB,qBAAqB,OAAO,UAAU,YAAY,IAAI;AAAA,IAChF,QAAQ;AACJ,YAAM,IAAI,yBAAS,0CAA0C;AAAA,QACzD,MAAM;AAAA,MACV,CAAC;AAAA,IACL;AAEA,QAAI,OAAO,wBAAwB,gBAAY,uCAAsB,mBAAmB,MAAM,QAAW;AACrG,YAAM,IAAI,yBAAS,0CAA0C;AAAA,QACzD,MAAM;AAAA,MACV,CAAC;AAAA,IACL;AAEA,WAAO;AAAA,EACX;AAAA,EAEQ,cAAsB;AAC1B,UAAM,SAAS,WAAW;AAC1B,QAAI,QAAQ,YAAY;AACpB,aAAO,OAAO,WAAW;AAAA,IAC7B;AAEA,QAAI,QAAQ,iBAAiB;AACzB,YAAM,QAAQ,IAAI,WAAW,EAAE;AAC/B,aAAO,gBAAgB,KAAK;AAE5B,aAAO,MAAM,KAAK,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AAAA,IAClF;AAEA,WAAO,GAAG,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AAAA,EAC/D;AAAA,EAEA,MAAc,mBACV,MACA,QACA,OACgC;AAChC,QAAI,CAAC,MAAM;AACP,aAAO;AAAA,IACX;AAEA,WAAO,MAAM,KAAK,EAAE,QAAQ,MAAM,CAAC;AAAA,EACvC;AAAA,EAEQ,cAAc,SAAkB,QAA4B;AAChE,QAAI,CAAC,QAAQ;AACT;AAAA,IACJ;AAEA,QAAI,QAAQ,MAAM,EAAE,QAAQ,CAAC,OAAO,QAAQ;AACxC,cAAQ,IAAI,KAAK,KAAK;AAAA,IAC1B,CAAC;AAAA,EACL;AAAA,EAEQ,eAAe,aAAmC;AACtD,YAAQ,aAAa;AAAA,MACjB,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AAAA,MACL;AACI,eAAO;AAAA,IACf;AAAA,EACJ;AAAA,EAEQ,WAAW,aAA2B,MAAqC;AAC/E,QAAI,SAAS,UAAa,SAAS,MAAM;AACrC,aAAO;AAAA,IACX;AAEA,YAAQ,aAAa;AAAA,MACjB,KAAK;AACD,eAAO,KAAK,eAAe,IAAI;AAAA,MACnC,KAAK;AACD,eAAO,OAAO,SAAS,WAAW,OAAO,OAAO,IAAI;AAAA,MACxD,KAAK;AAAA,MACL;AACI,eAAO,KAAK,UAAU,IAAI;AAAA,IAClC;AAAA,EACJ;AAAA,EAEQ,eAAe,MAAyB;AAC5C,QAAI,KAAK,WAAW,IAAI,KAAK,gBAAgB,iBAAiB;AAC1D,aAAO;AAAA,IACX;AAEA,QAAI,SAAS,QAAQ,OAAO,SAAS,UAAU;AAC3C,aAAO,OAAO,IAAI;AAAA,IACtB;AAEA,UAAM,OAAO,IAAI,gBAAgB;AACjC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC7C,WAAK,gBAAgB,MAAM,KAAK,KAAK;AAAA,IACzC;AAEA,WAAO;AAAA,EACX;AAAA,EAEQ,WAAW,OAAmC;AAClD,WAAO,OAAO,aAAa,eAAe,iBAAiB;AAAA,EAC/D;AACJ;","names":[]}