{"version":3,"file":"index.mjs","names":["isClient","createClient","BaseClient"],"sources":["../src/constants.ts","../src/utils/connection-string.ts","../src/utils/query-string.ts","../src/utils/resource-id.ts","../src/utils/resource-meta.ts","../src/domains/base.ts","../src/domains/project/module.ts","../src/domains/project-repository/utils.ts","../src/domains/project-repository/module.ts","../src/domains/project-repository-artifact/module.ts","../src/domains/project-repository-artifact-label/module.ts","../src/domains/project-webhook-policy/module.ts","../src/domains/robot/constants.ts","../src/domains/robot/module.ts","../src/domains/robot/utils.ts","../src/module.ts","../src/instance.ts","../src/index.ts"],"sourcesContent":["/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport enum HeaderName {\n    LOCATION = 'location',\n    IS_RESOURCE_NAME = 'X-Is-Resource-Name',\n    TOTAL_COUNT = 'X-Total-Count',\n}\n","/*\n * Copyright (c) 2022-2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { splitConnectionString } from 'hapic';\nimport type { ConnectionOptions } from '../config';\nimport { ConnectionStringParseError } from '../error';\n\nconst FORMAT_HINT = 'Harbor connection string must be in the following format: user:password@host';\n\nexport function parseConnectionString(connectionString: string): ConnectionOptions {\n    const { credentials, host } = splitConnectionString(connectionString, { message: FORMAT_HINT });\n\n    const authParts = credentials.split(':');\n    if (authParts.length !== 2) {\n        throw new ConnectionStringParseError(FORMAT_HINT);\n    }\n\n    return {\n        host,\n        user: authParts[0],\n        password: authParts[1],\n    };\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { isObject } from 'smob';\n\nexport function buildQueryString(\n    input?: Record<string, any>,\n    withQuestionMark = true,\n) {\n    if (typeof input === 'undefined') {\n        return '';\n    }\n\n    const searchParams = new URLSearchParams();\n\n    const keys = Object.keys(input);\n    for (const key of keys) {\n        const value = input[key];\n        if (isObject(value)) {\n            const childKeys = Object.keys(value);\n            if (childKeys.length > 0) {\n                const childSearchParams = new URLSearchParams();\n                for (const childKey of childKeys) {\n                    childSearchParams.append(\n                        childKey,\n                        `${encodeURIComponent(value[childKey])}`,\n                    );\n                }\n\n                searchParams.append(key, childSearchParams.toString());\n            }\n        } else if (Array.isArray(value)) {\n            searchParams.append(key, `${value.join(',')}`);\n        } else {\n            searchParams.append(key, `${value}`);\n        }\n    }\n\n    const queryString = searchParams.toString();\n    if (queryString.length > 0 && withQuestionMark) {\n        return `?${queryString}`;\n    }\n\n    return '';\n}\n","/*\n * Copyright (c) 2023-2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Response } from 'hapic';\nimport { HeaderName } from '../constants';\n\nexport function extractResourceIDOfResponse(response: Pick<Response, 'headers'>) {\n    if (\n        response &&\n        response.headers &&\n        response.headers.has(HeaderName.LOCATION)\n    ) {\n        const value = response.headers.get(HeaderName.LOCATION);\n        if (value) {\n            const id = Number.parseInt(value.substring(value.lastIndexOf('/') + 1), 10);\n            if (!Number.isNaN(id)) {\n                return id;\n            }\n        }\n    }\n\n    return undefined;\n}\n","/*\n * Copyright (c) 2023-2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Response } from 'hapic';\nimport { HeaderName } from '../constants';\n\ntype Meta = {\n    total?: number\n};\nexport function extractResourceMetaOfResponse(response: Response) : Meta {\n    const meta : Meta = {};\n\n    if (\n        response.headers &&\n        response.headers.has(HeaderName.TOTAL_COUNT)\n    ) {\n        const total = Number.parseInt(response.headers.get(HeaderName.TOTAL_COUNT) || '0', 10);\n        if (!Number.isNaN(total)) {\n            meta.total = total;\n        }\n    }\n\n    return meta;\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createClient, isClient } from 'hapic';\nimport type { IClient, RequestBaseOptions } from 'hapic';\nimport type { BaseAPIContext } from './type';\n\nexport abstract class BaseAPI {\n    protected client!: IClient;\n\n    // -----------------------------------------------------------------------------------\n\n    protected constructor(context?: BaseAPIContext) {\n        context = context || {};\n\n        this.setClient(context.client);\n    }\n\n    // -----------------------------------------------------------------------------------\n\n    setClient(input?: IClient | RequestBaseOptions) {\n        if (isClient(input)) {\n            this.client = input;\n        } else {\n            this.client = createClient(input);\n        }\n    }\n}\n","/*\n * Copyright (c) 2022-2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { HeaderName } from '../../constants';\nimport {\n    buildQueryString,\n    extractResourceIDOfResponse,\n    extractResourceMetaOfResponse,\n} from '../../utils';\nimport { BaseAPI } from '../base';\nimport type { BaseAPIContext, ResourceCollectionResponse } from '../type';\nimport type {\n    Project,\n    ProjectCreatePayload,\n    ProjectCreateResponse,\n    ProjectGetManyOptions,\n    ProjectUpdatePayload,\n} from './type';\n\nexport class ProjectAPI extends BaseAPI {\n    constructor(context: BaseAPIContext) {\n        super(context);\n    }\n\n    async create(data: ProjectCreatePayload) : Promise<ProjectCreateResponse> {\n        const response = await this.client\n            .post('projects', data);\n\n        return { id: extractResourceIDOfResponse(response) };\n    }\n\n    async delete(\n        id: string | number,\n        isProjectName = false,\n    ) : Promise<void> {\n        const headers: Record<string, any> = {};\n\n        if (isProjectName) {\n            headers[HeaderName.IS_RESOURCE_NAME] = true;\n        }\n\n        await this.client\n            .delete(`projects/${id}`, { headers });\n    }\n\n    async update(\n        id: number | string,\n        data: ProjectUpdatePayload,\n        isProjectName = false,\n    ) : Promise<void> {\n        const headers: Record<string, any> = {};\n\n        if (isProjectName) {\n            headers[HeaderName.IS_RESOURCE_NAME] = true;\n        }\n\n        await this.client\n            .put(`projects/${id}`, data, { headers });\n    }\n\n    async getMany(options?: ProjectGetManyOptions) : Promise<ResourceCollectionResponse<Project>> {\n        options = options || {};\n        const response = await this.client\n            .get(`projects${buildQueryString(options.query)}`);\n\n        return {\n            data: response.data,\n            meta: extractResourceMetaOfResponse(response),\n        };\n    }\n\n    async getAll(options?: ProjectGetManyOptions) : Promise<ResourceCollectionResponse<Project>> {\n        options = options || {};\n        options.query = options.query || {};\n\n        if (!options.query.page_size) {\n            options.query.page_size = 50;\n        }\n\n        if (!options.query.page) {\n            options.query.page = 1;\n        }\n\n        const response = await this.getMany(options);\n        if (response.data.length === options.query.page_size) {\n            options.query.page++;\n\n            const next = await this.getAll(options);\n\n            response.data.push(...next.data);\n        }\n\n        return response;\n    }\n\n    async getOne(\n        id: string | number,\n        isProjectName = false,\n    ): Promise<Project> {\n        const headers: Record<string, any> = {};\n\n        if (isProjectName) {\n            headers[HeaderName.IS_RESOURCE_NAME] = true;\n        }\n\n        const { data } = await this.client\n            .get(`projects/${id}`, { headers });\n\n        return data;\n    }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ProjectRepositoryLongNameRepresentation } from './type';\n\nexport function parseLongProjectRepositoryName(name: string) : ProjectRepositoryLongNameRepresentation {\n    const index = name.indexOf('/');\n    if (index === -1) {\n        throw new Error('The project repository name could not parsed.');\n    }\n\n    const projectName = name.substring(0, index);\n    let repositoryName = name.substring(projectName.length + 1);\n\n    let artifactDigest : string | undefined;\n    if (repositoryName.includes('@')) {\n        const index = repositoryName.indexOf('@');\n        artifactDigest = repositoryName.substring(index + 1);\n        repositoryName = repositoryName.substring(0, index);\n    }\n\n    let artifactTag : string | undefined;\n    if (repositoryName.includes(':')) {\n        const index = repositoryName.indexOf(':');\n        artifactTag = repositoryName.substring(index + 1);\n        repositoryName = repositoryName.substring(0, index);\n    }\n\n    return {\n        projectName,\n        repositoryName,\n        ...(artifactDigest ? { artifactDigest } : {}),\n        ...(artifactTag ? { artifactTag } : {}),\n    };\n}\n\nexport function buildProjectRepositoryLongName(\n    representation: ProjectRepositoryLongNameRepresentation,\n) : string {\n    const str = `${representation.projectName}/${representation.repositoryName}`;\n\n    if (representation.artifactTag) {\n        return `${str}:${representation.artifactTag}`;\n    }\n    if (representation.artifactDigest) {\n        return `${str}@${representation.artifactDigest}`;\n    }\n\n    return str;\n}\n","/*\n * Copyright (c) 2022-2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { buildQueryString, extractResourceMetaOfResponse } from '../../utils';\nimport { BaseAPI } from '../base';\nimport type { BaseAPIContext, ResourceCollectionResponse } from '../type';\nimport type {\n    ProjectRepository,\n    ProjectRepositoryDeleteContext,\n    ProjectRepositoryFindOneContext,\n    ProjectRepositoryGetManyContext,\n    ProjectRepositoryGetOneContext,\n    ProjectRepositoryUpdateContext,\n} from './type';\nimport { parseLongProjectRepositoryName } from './utils';\n\nexport class ProjectRepositoryAPI extends BaseAPI {\n    constructor(context: BaseAPIContext) {\n        super(context);\n    }\n\n    async findOne(projectRepositoryName: string): Promise<ProjectRepository | undefined>;\n\n    async findOne(context: ProjectRepositoryFindOneContext): Promise<ProjectRepository | undefined>;\n\n    async findOne(input: string | ProjectRepositoryFindOneContext): Promise<ProjectRepository | undefined> {\n        let context : ProjectRepositoryDeleteContext;\n        if (typeof input === 'string') {\n            context = parseLongProjectRepositoryName(input);\n        } else {\n            context = input;\n        }\n\n        const { data } = await this.getMany({\n            projectName: context.projectName,\n            query: {\n                q: { name: `~${context.repositoryName}` },\n                page_size: 1,\n            },\n        });\n\n        return data.shift();\n    }\n\n    async getOne(projectRepositoryName: string) : Promise<ProjectRepository>;\n\n    async getOne(context: ProjectRepositoryGetOneContext) : Promise<ProjectRepository>;\n\n    async getOne(input: string | ProjectRepositoryGetOneContext) : Promise<ProjectRepository> {\n        let context : ProjectRepositoryGetOneContext;\n        if (typeof input === 'string') {\n            context = parseLongProjectRepositoryName(input);\n        } else {\n            context = input;\n        }\n\n        const { data } : { data: ProjectRepository } = await this.client.get(\n            `projects/${context.projectName}/repositories/${context.repositoryName}`,\n        );\n\n        const parsed = parseLongProjectRepositoryName(data.name);\n\n        return {\n            ...data,\n            name_short: parsed.repositoryName,\n            project_name: parsed.projectName,\n        };\n    }\n\n    async getMany(context: ProjectRepositoryGetManyContext): Promise<ResourceCollectionResponse<ProjectRepository>> {\n        const result = await this.client\n            .get(`projects/${context.projectName}/repositories${buildQueryString(context.query)}`);\n\n        return {\n            data: result.data\n                .map((item: ProjectRepository) => {\n                    const parsed = parseLongProjectRepositoryName(item.name);\n\n                    return {\n                        ...item,\n                        name_short: parsed.repositoryName,\n                        project_name: parsed.projectName,\n                    };\n                }),\n            meta: extractResourceMetaOfResponse(result),\n        };\n    }\n\n    async getAll(context: ProjectRepositoryGetManyContext) : Promise<ResourceCollectionResponse<ProjectRepository>> {\n        context.query = context.query || {};\n\n        if (!context.query.page_size) {\n            context.query.page_size = 50;\n        }\n\n        if (!context.query.page) {\n            context.query.page = 1;\n        }\n\n        const response = await this.getMany(context);\n        if (response.data.length === context.query.page_size) {\n            context.query.page++;\n\n            const next = await this.getAll(context);\n\n            response.data.push(...next.data);\n        }\n\n        return response;\n    }\n\n    async update(context: ProjectRepositoryUpdateContext) : Promise<void> {\n        await this.client\n            .put(`projects/${context.projectName}/repositories/${context.repositoryName}`, context.data);\n    }\n\n    async delete(projectRepositoryName: string) : Promise<void>;\n\n    async delete(context: ProjectRepositoryDeleteContext) : Promise<void>;\n\n    async delete(input: string | ProjectRepositoryDeleteContext) : Promise<void> {\n        let context : ProjectRepositoryDeleteContext;\n        if (typeof input === 'string') {\n            context = parseLongProjectRepositoryName(input);\n        } else {\n            context = input;\n        }\n\n        await this.client\n            .delete(`projects/${context.projectName}/repositories/${context.repositoryName}`);\n    }\n}\n","/*\n * Copyright (c) 2022-2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { buildQueryString } from '../../utils';\nimport { BaseAPI } from '../base';\nimport { buildProjectRepositoryLongName } from '../project-repository';\nimport type { BaseAPIContext } from '../type';\nimport type {\n    ProjectArtifact,\n    ProjectArtifactCopyElement,\n    ProjectArtifactDeleteContext,\n    ProjectArtifactGetManyContext,\n} from './type';\n\nexport class ProjectRepositoryArtifactAPI extends BaseAPI {\n    constructor(context: BaseAPIContext) {\n        super(context);\n    }\n\n    async getMany(context: ProjectArtifactGetManyContext) : Promise<ProjectArtifact[]> {\n        const { data } = await this.client\n            .get(`projects/${context.projectName}/repositories/${context.repositoryName}/artifacts${buildQueryString(context.query)}`);\n\n        return data;\n    }\n\n    async copy(destination: ProjectArtifactCopyElement, source: string | ProjectArtifactCopyElement) : Promise<void> {\n        let from : string;\n        if (typeof source === 'string') {\n            from = source;\n        } else {\n            if (!source.artifactTag && !source.artifactDigest) {\n                source.artifactTag = 'latest';\n            }\n\n            from = buildProjectRepositoryLongName(source);\n        }\n\n        await this.client\n            .post(\n                `projects/${destination.projectName}/repositories/${destination.repositoryName}/artifacts?` +\n                `from=${from}`,\n            );\n    }\n\n    async delete(context: ProjectArtifactDeleteContext) {\n        await this.client\n            .delete(`projects/${context.projectName}/repositories/${context.repositoryName}/artifacts/${context.tagOrDigest || 'latest'}`);\n    }\n}\n","/*\n * Copyright (c) 2022-2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BaseAPI } from '../base';\nimport type { BaseAPIContext } from '../type';\nimport type {\n    ProjectArtifactLabelCreateContext,\n    ProjectArtifactLabelDeleteContext,\n} from './type';\n\nexport class ProjectRepositoryArtifactLabelAPI extends BaseAPI {\n    constructor(context: BaseAPIContext) {\n        super(context);\n    }\n\n    async create(options: ProjectArtifactLabelCreateContext) : Promise<void> {\n        await this.client\n            .post(\n                `projects/${options.projectName}/repositories/${options.repositoryName}` +\n                `/artifacts/${options.tagOrDigest || 'latest'}/labels`,\n                { id: options.labelId },\n            );\n    }\n\n    async delete(options: ProjectArtifactLabelDeleteContext) {\n        await this.client\n            .delete(`projects/${options.projectName}/repositories/${options.repositoryName}` +\n                `/artifacts/${options.tagOrDigest || 'latest'}/labels/${options.labelId}`);\n    }\n}\n","/*\n * Copyright (c) 2022-2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { merge } from 'smob';\nimport { HeaderName } from '../../constants';\nimport { buildQueryString, extractResourceIDOfResponse, extractResourceMetaOfResponse } from '../../utils';\nimport { BaseAPI } from '../base';\nimport type { BaseAPIContext, ResourceCollectionResponse } from '../type';\nimport type {\n    ProjectWebhookEventType,\n    ProjectWebhookPolicy,\n    ProjectWebhookPolicyCreateContext,\n    ProjectWebhookPolicyCreateResponse,\n    ProjectWebhookPolicyDeleteByNameContext,\n    ProjectWebhookPolicyDeleteContext,\n    ProjectWebhookPolicyFindOneContext,\n    ProjectWebhookPolicyGetManyContext,\n    ProjectWebhookPolicyGetOneContext,\n    ProjectWebhookPolicyUpdateContext,\n} from './type';\n\nexport class ProjectWebhookPolicyAPI extends BaseAPI {\n    constructor(context: BaseAPIContext) {\n        super(context);\n    }\n\n    async create(context: ProjectWebhookPolicyCreateContext) : Promise<ProjectWebhookPolicyCreateResponse> {\n        const headers: Record<string, any> = {};\n\n        if (context.isProjectName) {\n            headers[HeaderName.IS_RESOURCE_NAME] = true;\n        }\n\n        const response = await this.client\n            .post(\n                `projects/${context.projectIdOrName}/webhook/policies`,\n                this.extendPayload(context.data),\n                { headers },\n            );\n\n        return { id: extractResourceIDOfResponse(response) };\n    }\n\n    async getMany(context: ProjectWebhookPolicyGetManyContext) : Promise<ResourceCollectionResponse<ProjectWebhookPolicy>> {\n        const headers: Record<string, any> = {};\n\n        if (context.isProjectName) {\n            headers[HeaderName.IS_RESOURCE_NAME] = true;\n        }\n\n        const response = await this.client\n            .get(\n                `projects/${context.projectIdOrName}/webhook/policies${buildQueryString(context.query)}`,\n                { headers },\n            );\n\n        return {\n            data: response.data,\n            meta: extractResourceMetaOfResponse(response),\n        };\n    }\n\n    async getOne(\n        context: ProjectWebhookPolicyGetOneContext,\n    ) : Promise<ProjectWebhookPolicy> {\n        const headers: Record<string, any> = {};\n\n        if (context.isProjectName) {\n            headers[HeaderName.IS_RESOURCE_NAME] = true;\n        }\n\n        const response = await this.client\n            .get(\n                `projects/${context.projectIdOrName}/webhook/policies/${context.id}`,\n                { headers },\n            );\n\n        return response.data;\n    }\n\n    async findOne(context: ProjectWebhookPolicyFindOneContext): Promise<ProjectWebhookPolicy | undefined> {\n        const response = await this.getMany({\n            projectIdOrName: context.projectIdOrName,\n            isProjectName: context.isProjectName,\n            query: {\n                q: { name: context.name },\n                page_size: 1,\n            },\n        });\n\n        return response.data.pop();\n    }\n\n    async update(context: ProjectWebhookPolicyUpdateContext): Promise<void> {\n        const headers: Record<string, any> = {};\n\n        if (context.isProjectName) {\n            headers[HeaderName.IS_RESOURCE_NAME] = true;\n        }\n\n        await this.client.put(\n            `projects/${context.projectIdOrName}/webhook/policies/${context.id}`,\n            this.extendPayload({\n                ...context.data,\n                id: context.id,\n            }),\n            { headers },\n        );\n    }\n\n    async deleteByName(context: ProjectWebhookPolicyDeleteByNameContext) {\n        const webhook = await this.findOne(context);\n        if (webhook) {\n            await this.delete({\n                isProjectName: false,\n                projectIdOrName: webhook.project_id as number,\n                id: webhook.id,\n            });\n        }\n    }\n\n    async delete(context: ProjectWebhookPolicyDeleteContext) : Promise<any> {\n        const headers: Record<string, any> = {};\n\n        if (context.isProjectName) {\n            headers[HeaderName.IS_RESOURCE_NAME] = true;\n        }\n\n        await this.client\n            .delete(`projects/${context.projectIdOrName}/webhook/policies/${context.id}`, { headers });\n    }\n\n    protected extendPayload(data: Partial<ProjectWebhookPolicy>) : Partial<ProjectWebhookPolicy> {\n        data.name = data.name || (Math.random() + 1).toString(36).substring(7);\n\n        if (typeof data.enabled === 'undefined') {\n            data.enabled = true;\n        }\n\n        if (typeof data.targets === 'undefined') {\n            data.targets = [];\n        }\n\n        if (typeof data.event_types === 'undefined') {\n            data.event_types = ['PUSH_ARTIFACT'];\n        } else {\n            data.event_types = merge(['PUSH_ARTIFACT'] satisfies ProjectWebhookEventType[], data.event_types);\n        }\n\n        return data;\n    }\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport enum RobotPermissionResource {\n    ARTIFACT = 'artifact',\n    ARTIFACT_LABEL = 'artifact-label',\n    IMMUTABLE_TAG = 'immutable-tag',\n    LABEL = 'label',\n    LOG = 'log',\n    METADATA = 'metadata',\n    NOTIFICATION_POLICY = 'notification-policy',\n    PREHEAT_POLICY = 'preheat-policy',\n    PROJECT = 'project',\n    REPOSITORY = 'repository',\n    SCAN = 'scan',\n    TAG = 'tag',\n}\n\nexport enum RobotPermissionAction {\n    CREATE = 'create',\n    DELETE = 'delete',\n    READ = 'read',\n    UPDATE = 'update',\n    PULL = 'pull',\n    PUSH = 'push',\n    LIST = 'list',\n    STOP = 'stop',\n}\n","/*\n * Copyright (c) 2022-2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { merge } from 'smob';\nimport { buildQueryString, extractResourceMetaOfResponse } from '../../utils';\nimport { BaseAPI } from '../base';\nimport type { BaseAPIContext, ResourceCollectionResponse } from '../type';\nimport type {\n    Robot,\n    RobotCreatePayload,\n    RobotGetManyContext,\n    RobotUpdatePayload,\n    RobotUpdateSecretResponse,\n} from './type';\n\nexport class RobotAPI extends BaseAPI {\n    constructor(context: BaseAPIContext) {\n        super(context);\n    }\n\n    async create(data: RobotCreatePayload) : Promise<Robot> {\n        const response = await this.client\n            .post('robots', this.extendPayload(data));\n\n        return merge(response.data, data);\n    }\n\n    async getMany(context: RobotGetManyContext) : Promise<ResourceCollectionResponse<Robot>> {\n        const response = await this.client.get(`robots${buildQueryString(context.query)}`);\n\n        return {\n            data: response.data,\n            meta: extractResourceMetaOfResponse(response),\n        };\n    }\n\n    async getOne(id: number) : Promise<Robot> {\n        const response = await this.client.get(`robots/${id}`);\n\n        return response.data;\n    }\n\n    /**\n     * Update harbor project robot account.\n     * If no \"secret\" provided, a new secret is generated.\n     *\n     * @param id\n     * @param secret\n     */\n    async updateSecret(\n        id: string | number,\n        secret?: string,\n    ): Promise<RobotUpdateSecretResponse> {\n        const payload: Record<string, any> = { ...(secret ? { secret } : {}) };\n\n        const { data }: { data: Robot } = await this.client\n            .patch(`robots/${id}`, payload);\n\n        if (typeof payload.secret !== 'undefined') {\n            data.secret = payload.secret;\n        }\n\n        return data as RobotUpdateSecretResponse;\n    }\n\n    async update(\n        id: number,\n        data: RobotUpdatePayload,\n    ): Promise<void> {\n        await this.client\n            .put(`robots/${id}`, this.extendPayload({ ...data, id }));\n    }\n\n    async delete(id: Robot['id']): Promise<void> {\n        await this.client\n            .delete(`robots/${id}`);\n    }\n\n    extendPayload<T extends Record<string, any>>(data: T) : T {\n        return merge((data || {}), {\n            description: '',\n            duration: -1,\n            level: 'system',\n            editable: true,\n            disable: false,\n            permissions: [],\n        } satisfies Partial<Robot>) as T;\n    }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { RobotPermissionAction, RobotPermissionResource } from './constants';\nimport type { RobotPermission } from './type';\n\n/**\n * Create robot permission to access all resources.\n *\n * @param namespace (e.g. * or project name)\n */\nexport function buildRobotPermissionForAllResources(\n    namespace: string,\n) : RobotPermission {\n    return {\n        access: [\n            { resource: RobotPermissionResource.ARTIFACT, action: RobotPermissionAction.CREATE },\n            { resource: RobotPermissionResource.ARTIFACT, action: RobotPermissionAction.DELETE },\n            { resource: RobotPermissionResource.ARTIFACT, action: RobotPermissionAction.LIST },\n            { resource: RobotPermissionResource.ARTIFACT, action: RobotPermissionAction.READ },\n\n            { resource: RobotPermissionResource.ARTIFACT_LABEL, action: RobotPermissionAction.CREATE },\n            { resource: RobotPermissionResource.ARTIFACT_LABEL, action: RobotPermissionAction.DELETE },\n\n            { resource: RobotPermissionResource.IMMUTABLE_TAG, action: RobotPermissionAction.CREATE },\n            { resource: RobotPermissionResource.IMMUTABLE_TAG, action: RobotPermissionAction.DELETE },\n            { resource: RobotPermissionResource.IMMUTABLE_TAG, action: RobotPermissionAction.LIST },\n            { resource: RobotPermissionResource.IMMUTABLE_TAG, action: RobotPermissionAction.UPDATE },\n\n            { resource: RobotPermissionResource.REPOSITORY, action: RobotPermissionAction.LIST },\n            { resource: RobotPermissionResource.REPOSITORY, action: RobotPermissionAction.PULL },\n            { resource: RobotPermissionResource.REPOSITORY, action: RobotPermissionAction.PUSH },\n            { resource: RobotPermissionResource.REPOSITORY, action: RobotPermissionAction.UPDATE },\n            { resource: RobotPermissionResource.REPOSITORY, action: RobotPermissionAction.DELETE },\n\n            { resource: RobotPermissionResource.TAG, action: RobotPermissionAction.CREATE },\n            { resource: RobotPermissionResource.TAG, action: RobotPermissionAction.DELETE },\n            { resource: RobotPermissionResource.TAG, action: RobotPermissionAction.LIST },\n\n            { resource: RobotPermissionResource.SCAN, action: RobotPermissionAction.READ },\n            { resource: RobotPermissionResource.SCAN, action: RobotPermissionAction.STOP },\n            { resource: RobotPermissionResource.SCAN, action: RobotPermissionAction.CREATE },\n\n            { resource: RobotPermissionResource.LABEL, action: RobotPermissionAction.CREATE },\n            { resource: RobotPermissionResource.LABEL, action: RobotPermissionAction.DELETE },\n            { resource: RobotPermissionResource.LABEL, action: RobotPermissionAction.LIST },\n            { resource: RobotPermissionResource.LABEL, action: RobotPermissionAction.READ },\n            { resource: RobotPermissionResource.LABEL, action: RobotPermissionAction.UPDATE },\n\n            { resource: RobotPermissionResource.METADATA, action: RobotPermissionAction.CREATE },\n            { resource: RobotPermissionResource.METADATA, action: RobotPermissionAction.DELETE },\n            { resource: RobotPermissionResource.METADATA, action: RobotPermissionAction.LIST },\n            { resource: RobotPermissionResource.METADATA, action: RobotPermissionAction.READ },\n            { resource: RobotPermissionResource.METADATA, action: RobotPermissionAction.UPDATE },\n\n            { resource: RobotPermissionResource.LOG, action: RobotPermissionAction.LIST },\n\n            { resource: RobotPermissionResource.NOTIFICATION_POLICY, action: RobotPermissionAction.CREATE },\n            { resource: RobotPermissionResource.NOTIFICATION_POLICY, action: RobotPermissionAction.DELETE },\n            { resource: RobotPermissionResource.NOTIFICATION_POLICY, action: RobotPermissionAction.LIST },\n            { resource: RobotPermissionResource.NOTIFICATION_POLICY, action: RobotPermissionAction.READ },\n            { resource: RobotPermissionResource.NOTIFICATION_POLICY, action: RobotPermissionAction.UPDATE },\n\n            { resource: RobotPermissionResource.PREHEAT_POLICY, action: RobotPermissionAction.CREATE },\n            { resource: RobotPermissionResource.PREHEAT_POLICY, action: RobotPermissionAction.DELETE },\n            { resource: RobotPermissionResource.PREHEAT_POLICY, action: RobotPermissionAction.LIST },\n            { resource: RobotPermissionResource.PREHEAT_POLICY, action: RobotPermissionAction.READ },\n            { resource: RobotPermissionResource.PREHEAT_POLICY, action: RobotPermissionAction.UPDATE },\n\n            { resource: RobotPermissionResource.PROJECT, action: RobotPermissionAction.DELETE },\n            { resource: RobotPermissionResource.PROJECT, action: RobotPermissionAction.READ },\n            { resource: RobotPermissionResource.PROJECT, action: RobotPermissionAction.UPDATE },\n        ],\n        kind: 'project',\n        namespace,\n    };\n}\n","/*\n * Copyright (c) 2021-2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { Client as BaseClient, markInstanceof, resolveConnectionOptions } from 'hapic';\nimport type { ConfigInput } from './config';\nimport {\n    ProjectAPI,\n    ProjectRepositoryAPI,\n    ProjectRepositoryArtifactAPI,\n    ProjectRepositoryArtifactLabelAPI,\n    ProjectWebhookPolicyAPI,\n    RobotAPI,\n} from './domains';\nimport type { SearchResult } from './type';\nimport { parseConnectionString } from './utils';\n\nexport const HARBOR_CLIENT_INSTANCE = Symbol.for('@hapic/harbor/HarborClient');\n\nexport class HarborClient extends BaseClient {\n    public readonly project: ProjectAPI;\n\n    public readonly projectRepositoryArtifact: ProjectRepositoryArtifactAPI;\n\n    public readonly projectRepositoryArtifactLabel : ProjectRepositoryArtifactLabelAPI;\n\n    public readonly projectRepository: ProjectRepositoryAPI;\n\n    public readonly projectWebhookPolicy: ProjectWebhookPolicyAPI;\n\n    public readonly robot : RobotAPI;\n\n    // -----------------------------------------------------------------------------------\n\n    constructor(input: ConfigInput = {}) {\n        super(input.request);\n\n        markInstanceof(this, HARBOR_CLIENT_INSTANCE);\n\n        this.project = new ProjectAPI({ client: this });\n        this.projectRepository = new ProjectRepositoryAPI({ client: this });\n        this.projectRepositoryArtifact = new ProjectRepositoryArtifactAPI({ client: this });\n        this.projectRepositoryArtifactLabel = new ProjectRepositoryArtifactLabelAPI({ client: this });\n        this.projectWebhookPolicy = new ProjectWebhookPolicyAPI({ client: this });\n        this.robot = new RobotAPI({ client: this });\n\n        this.applyConfig(input);\n    }\n\n    // -----------------------------------------------------------------------------------\n\n    applyConfig(input: ConfigInput = {}) {\n        const connectionOptions = resolveConnectionOptions(input, parseConnectionString);\n\n        if (connectionOptions) {\n            this.setBaseURL(connectionOptions.host);\n\n            this.setAuthorizationHeader({\n                type: 'Basic',\n                username: connectionOptions.user,\n                password: connectionOptions.password,\n            });\n        }\n    }\n\n    // -----------------------------------------------------------------------------------\n\n    async search(q: string): Promise<SearchResult> {\n        const { data } = await this\n            .get(`search?q=${q}`);\n\n        return data;\n    }\n}\n","/*\n * Copyright (c) 2022-2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createClientRegistry } from 'hapic';\nimport type { ConfigInput } from './config';\nimport { HARBOR_CLIENT_INSTANCE, HarborClient } from './module';\n\nexport const {\n    hasClient,\n    setClient,\n    useClient,\n    unsetClient,\n    createClient,\n    isClient,\n} = createClientRegistry<HarborClient, ConfigInput>({\n    create: (input) => new HarborClient(input),\n    id: HARBOR_CLIENT_INSTANCE,\n});\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createClient } from './instance';\n\nexport * from './constants';\nexport * from './client';\nexport * from './config';\nexport * from './instance';\nexport * from './domains';\nexport * from './error';\nexport * from './module';\nexport * from './type';\nexport * from './utils';\n\nconst client = createClient();\nexport default client;\n"],"mappings":";;;AAOA,IAAY,aAAL,yBAAA,YAAA;CACH,WAAA,cAAA;CACA,WAAA,sBAAA;CACA,WAAA,iBAAA;;AACJ,EAAA,CAAA,CAAA;;;ACAA,MAAM,cAAc;AAEpB,SAAgB,sBAAsB,kBAA6C;CAC/E,MAAM,EAAE,aAAa,SAAS,sBAAsB,kBAAkB,EAAE,SAAS,YAAY,CAAC;CAE9F,MAAM,YAAY,YAAY,MAAM,GAAG;CACvC,IAAI,UAAU,WAAW,GACrB,MAAM,IAAI,2BAA2B,WAAW;CAGpD,OAAO;EACH;EACA,MAAM,UAAU;EAChB,UAAU,UAAU;CACxB;AACJ;;;ACjBA,SAAgB,iBACZ,OACA,mBAAmB,MACrB;CACE,IAAI,OAAO,UAAU,aACjB,OAAO;CAGX,MAAM,eAAe,IAAI,gBAAgB;CAEzC,MAAM,OAAO,OAAO,KAAK,KAAK;CAC9B,KAAK,MAAM,OAAO,MAAM;EACpB,MAAM,QAAQ,MAAM;EACpB,IAAI,SAAS,KAAK,GAAG;GACjB,MAAM,YAAY,OAAO,KAAK,KAAK;GACnC,IAAI,UAAU,SAAS,GAAG;IACtB,MAAM,oBAAoB,IAAI,gBAAgB;IAC9C,KAAK,MAAM,YAAY,WACnB,kBAAkB,OACd,UACA,GAAG,mBAAmB,MAAM,SAAS,GACzC;IAGJ,aAAa,OAAO,KAAK,kBAAkB,SAAS,CAAC;GACzD;EACJ,OAAO,IAAI,MAAM,QAAQ,KAAK,GAC1B,aAAa,OAAO,KAAK,GAAG,MAAM,KAAK,GAAG,GAAG;OAE7C,aAAa,OAAO,KAAK,GAAG,OAAO;CAE3C;CAEA,MAAM,cAAc,aAAa,SAAS;CAC1C,IAAI,YAAY,SAAS,KAAK,kBAC1B,OAAO,IAAI;CAGf,OAAO;AACX;;;ACtCA,SAAgB,4BAA4B,UAAqC;CAC7E,IACI,YACA,SAAS,WACT,SAAS,QAAQ,IAAA,UAAuB,GAC1C;EACE,MAAM,QAAQ,SAAS,QAAQ,IAAA,UAAuB;EACtD,IAAI,OAAO;GACP,MAAM,KAAK,OAAO,SAAS,MAAM,UAAU,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE;GAC1E,IAAI,CAAC,OAAO,MAAM,EAAE,GAChB,OAAO;EAEf;CACJ;AAGJ;;;ACbA,SAAgB,8BAA8B,UAA2B;CACrE,MAAM,OAAc,CAAC;CAErB,IACI,SAAS,WACT,SAAS,QAAQ,IAAA,eAA0B,GAC7C;EACE,MAAM,QAAQ,OAAO,SAAS,SAAS,QAAQ,IAAA,eAA0B,KAAK,KAAK,EAAE;EACrF,IAAI,CAAC,OAAO,MAAM,KAAK,GACnB,KAAK,QAAQ;CAErB;CAEA,OAAO;AACX;;;AChBA,IAAsB,UAAtB,MAA8B;CAC1B;CAIA,YAAsB,SAA0B;EAC5C,UAAU,WAAW,CAAC;EAEtB,KAAK,UAAU,QAAQ,MAAM;CACjC;CAIA,UAAU,OAAsC;EAC5C,IAAIA,WAAS,KAAK,GACd,KAAK,SAAS;OAEd,KAAK,SAASC,eAAa,KAAK;CAExC;AACJ;;;ACRA,IAAa,aAAb,cAAgC,QAAQ;CACpC,YAAY,SAAyB;EACjC,MAAM,OAAO;CACjB;CAEA,MAAM,OAAO,MAA6D;EAItE,OAAO,EAAE,IAAI,4BAA4B,MAHlB,KAAK,OACvB,KAAK,YAAY,IAAI,CAEuB,EAAE;CACvD;CAEA,MAAM,OACF,IACA,gBAAgB,OACF;EACd,MAAM,UAA+B,CAAC;EAEtC,IAAI,eACA,QAAA,wBAAuC;EAG3C,MAAM,KAAK,OACN,OAAO,YAAY,MAAM,EAAE,QAAQ,CAAC;CAC7C;CAEA,MAAM,OACF,IACA,MACA,gBAAgB,OACF;EACd,MAAM,UAA+B,CAAC;EAEtC,IAAI,eACA,QAAA,wBAAuC;EAG3C,MAAM,KAAK,OACN,IAAI,YAAY,MAAM,MAAM,EAAE,QAAQ,CAAC;CAChD;CAEA,MAAM,QAAQ,SAAgF;EAC1F,UAAU,WAAW,CAAC;EACtB,MAAM,WAAW,MAAM,KAAK,OACvB,IAAI,WAAW,iBAAiB,QAAQ,KAAK,GAAG;EAErD,OAAO;GACH,MAAM,SAAS;GACf,MAAM,8BAA8B,QAAQ;EAChD;CACJ;CAEA,MAAM,OAAO,SAAgF;EACzF,UAAU,WAAW,CAAC;EACtB,QAAQ,QAAQ,QAAQ,SAAS,CAAC;EAElC,IAAI,CAAC,QAAQ,MAAM,WACf,QAAQ,MAAM,YAAY;EAG9B,IAAI,CAAC,QAAQ,MAAM,MACf,QAAQ,MAAM,OAAO;EAGzB,MAAM,WAAW,MAAM,KAAK,QAAQ,OAAO;EAC3C,IAAI,SAAS,KAAK,WAAW,QAAQ,MAAM,WAAW;GAClD,QAAQ,MAAM;GAEd,MAAM,OAAO,MAAM,KAAK,OAAO,OAAO;GAEtC,SAAS,KAAK,KAAK,GAAG,KAAK,IAAI;EACnC;EAEA,OAAO;CACX;CAEA,MAAM,OACF,IACA,gBAAgB,OACA;EAChB,MAAM,UAA+B,CAAC;EAEtC,IAAI,eACA,QAAA,wBAAuC;EAG3C,MAAM,EAAE,SAAS,MAAM,KAAK,OACvB,IAAI,YAAY,MAAM,EAAE,QAAQ,CAAC;EAEtC,OAAO;CACX;AACJ;;;ACzGA,SAAgB,+BAA+B,MAAwD;CACnG,MAAM,QAAQ,KAAK,QAAQ,GAAG;CAC9B,IAAI,UAAU,IACV,MAAM,IAAI,MAAM,+CAA+C;CAGnE,MAAM,cAAc,KAAK,UAAU,GAAG,KAAK;CAC3C,IAAI,iBAAiB,KAAK,UAAU,YAAY,SAAS,CAAC;CAE1D,IAAI;CACJ,IAAI,eAAe,SAAS,GAAG,GAAG;EAC9B,MAAM,QAAQ,eAAe,QAAQ,GAAG;EACxC,iBAAiB,eAAe,UAAU,QAAQ,CAAC;EACnD,iBAAiB,eAAe,UAAU,GAAG,KAAK;CACtD;CAEA,IAAI;CACJ,IAAI,eAAe,SAAS,GAAG,GAAG;EAC9B,MAAM,QAAQ,eAAe,QAAQ,GAAG;EACxC,cAAc,eAAe,UAAU,QAAQ,CAAC;EAChD,iBAAiB,eAAe,UAAU,GAAG,KAAK;CACtD;CAEA,OAAO;EACH;EACA;EACA,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;EAC3C,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;CACzC;AACJ;AAEA,SAAgB,+BACZ,gBACO;CACP,MAAM,MAAM,GAAG,eAAe,YAAY,GAAG,eAAe;CAE5D,IAAI,eAAe,aACf,OAAO,GAAG,IAAI,GAAG,eAAe;CAEpC,IAAI,eAAe,gBACf,OAAO,GAAG,IAAI,GAAG,eAAe;CAGpC,OAAO;AACX;;;ACjCA,IAAa,uBAAb,cAA0C,QAAQ;CAC9C,YAAY,SAAyB;EACjC,MAAM,OAAO;CACjB;CAMA,MAAM,QAAQ,OAAyF;EACnG,IAAI;EACJ,IAAI,OAAO,UAAU,UACjB,UAAU,+BAA+B,KAAK;OAE9C,UAAU;EAGd,MAAM,EAAE,SAAS,MAAM,KAAK,QAAQ;GAChC,aAAa,QAAQ;GACrB,OAAO;IACH,GAAG,EAAE,MAAM,IAAI,QAAQ,iBAAiB;IACxC,WAAW;GACf;EACJ,CAAC;EAED,OAAO,KAAK,MAAM;CACtB;CAMA,MAAM,OAAO,OAA6E;EACtF,IAAI;EACJ,IAAI,OAAO,UAAU,UACjB,UAAU,+BAA+B,KAAK;OAE9C,UAAU;EAGd,MAAM,EAAE,SAAuC,MAAM,KAAK,OAAO,IAC7D,YAAY,QAAQ,YAAY,gBAAgB,QAAQ,gBAC5D;EAEA,MAAM,SAAS,+BAA+B,KAAK,IAAI;EAEvD,OAAO;GACH,GAAG;GACH,YAAY,OAAO;GACnB,cAAc,OAAO;EACzB;CACJ;CAEA,MAAM,QAAQ,SAAkG;EAC5G,MAAM,SAAS,MAAM,KAAK,OACrB,IAAI,YAAY,QAAQ,YAAY,eAAe,iBAAiB,QAAQ,KAAK,GAAG;EAEzF,OAAO;GACH,MAAM,OAAO,KACR,KAAK,SAA4B;IAC9B,MAAM,SAAS,+BAA+B,KAAK,IAAI;IAEvD,OAAO;KACH,GAAG;KACH,YAAY,OAAO;KACnB,cAAc,OAAO;IACzB;GACJ,CAAC;GACL,MAAM,8BAA8B,MAAM;EAC9C;CACJ;CAEA,MAAM,OAAO,SAAmG;EAC5G,QAAQ,QAAQ,QAAQ,SAAS,CAAC;EAElC,IAAI,CAAC,QAAQ,MAAM,WACf,QAAQ,MAAM,YAAY;EAG9B,IAAI,CAAC,QAAQ,MAAM,MACf,QAAQ,MAAM,OAAO;EAGzB,MAAM,WAAW,MAAM,KAAK,QAAQ,OAAO;EAC3C,IAAI,SAAS,KAAK,WAAW,QAAQ,MAAM,WAAW;GAClD,QAAQ,MAAM;GAEd,MAAM,OAAO,MAAM,KAAK,OAAO,OAAO;GAEtC,SAAS,KAAK,KAAK,GAAG,KAAK,IAAI;EACnC;EAEA,OAAO;CACX;CAEA,MAAM,OAAO,SAAyD;EAClE,MAAM,KAAK,OACN,IAAI,YAAY,QAAQ,YAAY,gBAAgB,QAAQ,kBAAkB,QAAQ,IAAI;CACnG;CAMA,MAAM,OAAO,OAAgE;EACzE,IAAI;EACJ,IAAI,OAAO,UAAU,UACjB,UAAU,+BAA+B,KAAK;OAE9C,UAAU;EAGd,MAAM,KAAK,OACN,OAAO,YAAY,QAAQ,YAAY,gBAAgB,QAAQ,gBAAgB;CACxF;AACJ;;;ACrHA,IAAa,+BAAb,cAAkD,QAAQ;CACtD,YAAY,SAAyB;EACjC,MAAM,OAAO;CACjB;CAEA,MAAM,QAAQ,SAAqE;EAC/E,MAAM,EAAE,SAAS,MAAM,KAAK,OACvB,IAAI,YAAY,QAAQ,YAAY,gBAAgB,QAAQ,eAAe,YAAY,iBAAiB,QAAQ,KAAK,GAAG;EAE7H,OAAO;CACX;CAEA,MAAM,KAAK,aAAyC,QAA6D;EAC7G,IAAI;EACJ,IAAI,OAAO,WAAW,UAClB,OAAO;OACJ;GACH,IAAI,CAAC,OAAO,eAAe,CAAC,OAAO,gBAC/B,OAAO,cAAc;GAGzB,OAAO,+BAA+B,MAAM;EAChD;EAEA,MAAM,KAAK,OACN,KACG,YAAY,YAAY,YAAY,gBAAgB,YAAY,eAAe,kBACvE,MACZ;CACR;CAEA,MAAM,OAAO,SAAuC;EAChD,MAAM,KAAK,OACN,OAAO,YAAY,QAAQ,YAAY,gBAAgB,QAAQ,eAAe,aAAa,QAAQ,eAAe,UAAU;CACrI;AACJ;;;ACvCA,IAAa,oCAAb,cAAuD,QAAQ;CAC3D,YAAY,SAAyB;EACjC,MAAM,OAAO;CACjB;CAEA,MAAM,OAAO,SAA4D;EACrE,MAAM,KAAK,OACN,KACG,YAAY,QAAQ,YAAY,gBAAgB,QAAQ,eAAA,aAC1C,QAAQ,eAAe,SAAS,UAC9C,EAAE,IAAI,QAAQ,QAAQ,CAC1B;CACR;CAEA,MAAM,OAAO,SAA4C;EACrD,MAAM,KAAK,OACN,OAAO,YAAY,QAAQ,YAAY,gBAAgB,QAAQ,eAAA,aAC9C,QAAQ,eAAe,SAAS,UAAU,QAAQ,SAAS;CACrF;AACJ;;;ACRA,IAAa,0BAAb,cAA6C,QAAQ;CACjD,YAAY,SAAyB;EACjC,MAAM,OAAO;CACjB;CAEA,MAAM,OAAO,SAA0F;EACnG,MAAM,UAA+B,CAAC;EAEtC,IAAI,QAAQ,eACR,QAAA,wBAAuC;EAU3C,OAAO,EAAE,IAAI,4BAA4B,MAPlB,KAAK,OACvB,KACG,YAAY,QAAQ,gBAAgB,oBACpC,KAAK,cAAc,QAAQ,IAAI,GAC/B,EAAE,QAAQ,CACd,CAE6C,EAAE;CACvD;CAEA,MAAM,QAAQ,SAAyG;EACnH,MAAM,UAA+B,CAAC;EAEtC,IAAI,QAAQ,eACR,QAAA,wBAAuC;EAG3C,MAAM,WAAW,MAAM,KAAK,OACvB,IACG,YAAY,QAAQ,gBAAgB,mBAAmB,iBAAiB,QAAQ,KAAK,KACrF,EAAE,QAAQ,CACd;EAEJ,OAAO;GACH,MAAM,SAAS;GACf,MAAM,8BAA8B,QAAQ;EAChD;CACJ;CAEA,MAAM,OACF,SAC8B;EAC9B,MAAM,UAA+B,CAAC;EAEtC,IAAI,QAAQ,eACR,QAAA,wBAAuC;EAS3C,QAAO,MANgB,KAAK,OACvB,IACG,YAAY,QAAQ,gBAAgB,oBAAoB,QAAQ,MAChE,EAAE,QAAQ,CACd,EAAA,CAEY;CACpB;CAEA,MAAM,QAAQ,SAAwF;EAUlG,QAAO,MATgB,KAAK,QAAQ;GAChC,iBAAiB,QAAQ;GACzB,eAAe,QAAQ;GACvB,OAAO;IACH,GAAG,EAAE,MAAM,QAAQ,KAAK;IACxB,WAAW;GACf;EACJ,CAAC,EAAA,CAEe,KAAK,IAAI;CAC7B;CAEA,MAAM,OAAO,SAA2D;EACpE,MAAM,UAA+B,CAAC;EAEtC,IAAI,QAAQ,eACR,QAAA,wBAAuC;EAG3C,MAAM,KAAK,OAAO,IACd,YAAY,QAAQ,gBAAgB,oBAAoB,QAAQ,MAChE,KAAK,cAAc;GACf,GAAG,QAAQ;GACX,IAAI,QAAQ;EAChB,CAAC,GACD,EAAE,QAAQ,CACd;CACJ;CAEA,MAAM,aAAa,SAAkD;EACjE,MAAM,UAAU,MAAM,KAAK,QAAQ,OAAO;EAC1C,IAAI,SACA,MAAM,KAAK,OAAO;GACd,eAAe;GACf,iBAAiB,QAAQ;GACzB,IAAI,QAAQ;EAChB,CAAC;CAET;CAEA,MAAM,OAAO,SAA2D;EACpE,MAAM,UAA+B,CAAC;EAEtC,IAAI,QAAQ,eACR,QAAA,wBAAuC;EAG3C,MAAM,KAAK,OACN,OAAO,YAAY,QAAQ,gBAAgB,oBAAoB,QAAQ,MAAM,EAAE,QAAQ,CAAC;CACjG;CAEA,cAAwB,MAAqE;EACzF,KAAK,OAAO,KAAK,SAAS,KAAK,OAAO,IAAI,EAAA,CAAG,SAAS,EAAE,CAAC,CAAC,UAAU,CAAC;EAErE,IAAI,OAAO,KAAK,YAAY,aACxB,KAAK,UAAU;EAGnB,IAAI,OAAO,KAAK,YAAY,aACxB,KAAK,UAAU,CAAC;EAGpB,IAAI,OAAO,KAAK,gBAAgB,aAC5B,KAAK,cAAc,CAAC,eAAe;OAEnC,KAAK,cAAc,MAAM,CAAC,eAAe,GAAuC,KAAK,WAAW;EAGpG,OAAO;CACX;AACJ;;;ACpJA,IAAY,0BAAL,yBAAA,yBAAA;CACH,wBAAA,cAAA;CACA,wBAAA,oBAAA;CACA,wBAAA,mBAAA;CACA,wBAAA,WAAA;CACA,wBAAA,SAAA;CACA,wBAAA,cAAA;CACA,wBAAA,yBAAA;CACA,wBAAA,oBAAA;CACA,wBAAA,aAAA;CACA,wBAAA,gBAAA;CACA,wBAAA,UAAA;CACA,wBAAA,SAAA;;AACJ,EAAA,CAAA,CAAA;AAEA,IAAY,wBAAL,yBAAA,uBAAA;CACH,sBAAA,YAAA;CACA,sBAAA,YAAA;CACA,sBAAA,UAAA;CACA,sBAAA,YAAA;CACA,sBAAA,UAAA;CACA,sBAAA,UAAA;CACA,sBAAA,UAAA;CACA,sBAAA,UAAA;;AACJ,EAAA,CAAA,CAAA;;;ACZA,IAAa,WAAb,cAA8B,QAAQ;CAClC,YAAY,SAAyB;EACjC,MAAM,OAAO;CACjB;CAEA,MAAM,OAAO,MAA2C;EAIpD,OAAO,OAAM,MAHU,KAAK,OACvB,KAAK,UAAU,KAAK,cAAc,IAAI,CAAC,EAAA,CAEtB,MAAM,IAAI;CACpC;CAEA,MAAM,QAAQ,SAA2E;EACrF,MAAM,WAAW,MAAM,KAAK,OAAO,IAAI,SAAS,iBAAiB,QAAQ,KAAK,GAAG;EAEjF,OAAO;GACH,MAAM,SAAS;GACf,MAAM,8BAA8B,QAAQ;EAChD;CACJ;CAEA,MAAM,OAAO,IAA6B;EAGtC,QAAO,MAFgB,KAAK,OAAO,IAAI,UAAU,IAAI,EAAA,CAErC;CACpB;;;;;;;;CASA,MAAM,aACF,IACA,QACkC;EAClC,MAAM,UAA+B,EAAE,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC,EAAG;EAErE,MAAM,EAAE,SAA0B,MAAM,KAAK,OACxC,MAAM,UAAU,MAAM,OAAO;EAElC,IAAI,OAAO,QAAQ,WAAW,aAC1B,KAAK,SAAS,QAAQ;EAG1B,OAAO;CACX;CAEA,MAAM,OACF,IACA,MACa;EACb,MAAM,KAAK,OACN,IAAI,UAAU,MAAM,KAAK,cAAc;GAAE,GAAG;GAAM;EAAG,CAAC,CAAC;CAChE;CAEA,MAAM,OAAO,IAAgC;EACzC,MAAM,KAAK,OACN,OAAO,UAAU,IAAI;CAC9B;CAEA,cAA6C,MAAa;EACtD,OAAO,MAAO,QAAQ,CAAC,GAAI;GACvB,aAAa;GACb,UAAU;GACV,OAAO;GACP,UAAU;GACV,SAAS;GACT,aAAa,CAAC;EAClB,CAA0B;CAC9B;AACJ;;;;;;;;AC7EA,SAAgB,oCACZ,WACgB;CAChB,OAAO;EACH,QAAQ;GACJ;IAAE,UAAA;IAA4C,QAAA;GAAqC;GACnF;IAAE,UAAA;IAA4C,QAAA;GAAqC;GACnF;IAAE,UAAA;IAA4C,QAAA;GAAmC;GACjF;IAAE,UAAA;IAA4C,QAAA;GAAmC;GAEjF;IAAE,UAAA;IAAkD,QAAA;GAAqC;GACzF;IAAE,UAAA;IAAkD,QAAA;GAAqC;GAEzF;IAAE,UAAA;IAAiD,QAAA;GAAqC;GACxF;IAAE,UAAA;IAAiD,QAAA;GAAqC;GACxF;IAAE,UAAA;IAAiD,QAAA;GAAmC;GACtF;IAAE,UAAA;IAAiD,QAAA;GAAqC;GAExF;IAAE,UAAA;IAA8C,QAAA;GAAmC;GACnF;IAAE,UAAA;IAA8C,QAAA;GAAmC;GACnF;IAAE,UAAA;IAA8C,QAAA;GAAmC;GACnF;IAAE,UAAA;IAA8C,QAAA;GAAqC;GACrF;IAAE,UAAA;IAA8C,QAAA;GAAqC;GAErF;IAAE,UAAA;IAAuC,QAAA;GAAqC;GAC9E;IAAE,UAAA;IAAuC,QAAA;GAAqC;GAC9E;IAAE,UAAA;IAAuC,QAAA;GAAmC;GAE5E;IAAE,UAAA;IAAwC,QAAA;GAAmC;GAC7E;IAAE,UAAA;IAAwC,QAAA;GAAmC;GAC7E;IAAE,UAAA;IAAwC,QAAA;GAAqC;GAE/E;IAAE,UAAA;IAAyC,QAAA;GAAqC;GAChF;IAAE,UAAA;IAAyC,QAAA;GAAqC;GAChF;IAAE,UAAA;IAAyC,QAAA;GAAmC;GAC9E;IAAE,UAAA;IAAyC,QAAA;GAAmC;GAC9E;IAAE,UAAA;IAAyC,QAAA;GAAqC;GAEhF;IAAE,UAAA;IAA4C,QAAA;GAAqC;GACnF;IAAE,UAAA;IAA4C,QAAA;GAAqC;GACnF;IAAE,UAAA;IAA4C,QAAA;GAAmC;GACjF;IAAE,UAAA;IAA4C,QAAA;GAAmC;GACjF;IAAE,UAAA;IAA4C,QAAA;GAAqC;GAEnF;IAAE,UAAA;IAAuC,QAAA;GAAmC;GAE5E;IAAE,UAAA;IAAuD,QAAA;GAAqC;GAC9F;IAAE,UAAA;IAAuD,QAAA;GAAqC;GAC9F;IAAE,UAAA;IAAuD,QAAA;GAAmC;GAC5F;IAAE,UAAA;IAAuD,QAAA;GAAmC;GAC5F;IAAE,UAAA;IAAuD,QAAA;GAAqC;GAE9F;IAAE,UAAA;IAAkD,QAAA;GAAqC;GACzF;IAAE,UAAA;IAAkD,QAAA;GAAqC;GACzF;IAAE,UAAA;IAAkD,QAAA;GAAmC;GACvF;IAAE,UAAA;IAAkD,QAAA;GAAmC;GACvF;IAAE,UAAA;IAAkD,QAAA;GAAqC;GAEzF;IAAE,UAAA;IAA2C,QAAA;GAAqC;GAClF;IAAE,UAAA;IAA2C,QAAA;GAAmC;GAChF;IAAE,UAAA;IAA2C,QAAA;GAAqC;EACtF;EACA,MAAM;EACN;CACJ;AACJ;;;AC5DA,MAAa,yBAAyB,OAAO,IAAI,4BAA4B;AAE7E,IAAa,eAAb,cAAkCC,OAAW;CACzC;CAEA;CAEA;CAEA;CAEA;CAEA;CAIA,YAAY,QAAqB,CAAC,GAAG;EACjC,MAAM,MAAM,OAAO;EAEnB,eAAe,MAAM,sBAAsB;EAE3C,KAAK,UAAU,IAAI,WAAW,EAAE,QAAQ,KAAK,CAAC;EAC9C,KAAK,oBAAoB,IAAI,qBAAqB,EAAE,QAAQ,KAAK,CAAC;EAClE,KAAK,4BAA4B,IAAI,6BAA6B,EAAE,QAAQ,KAAK,CAAC;EAClF,KAAK,iCAAiC,IAAI,kCAAkC,EAAE,QAAQ,KAAK,CAAC;EAC5F,KAAK,uBAAuB,IAAI,wBAAwB,EAAE,QAAQ,KAAK,CAAC;EACxE,KAAK,QAAQ,IAAI,SAAS,EAAE,QAAQ,KAAK,CAAC;EAE1C,KAAK,YAAY,KAAK;CAC1B;CAIA,YAAY,QAAqB,CAAC,GAAG;EACjC,MAAM,oBAAoB,yBAAyB,OAAO,qBAAqB;EAE/E,IAAI,mBAAmB;GACnB,KAAK,WAAW,kBAAkB,IAAI;GAEtC,KAAK,uBAAuB;IACxB,MAAM;IACN,UAAU,kBAAkB;IAC5B,UAAU,kBAAkB;GAChC,CAAC;EACL;CACJ;CAIA,MAAM,OAAO,GAAkC;EAC3C,MAAM,EAAE,SAAS,MAAM,KAClB,IAAI,YAAY,GAAG;EAExB,OAAO;CACX;AACJ;;;ACjEA,MAAa,EACT,WACA,WACA,WACA,aACA,cACA,aACA,qBAAgD;CAChD,SAAS,UAAU,IAAI,aAAa,KAAK;CACzC,IAAI;AACR,CAAC;;;ACFD,MAAM,SAAS,aAAa"}