From 314b6267d6840c7d2f2ba0a5872ac5727b5fe257 Mon Sep 17 00:00:00 2001 From: waleed Date: Thu, 2 Apr 2026 17:52:40 -0700 Subject: [PATCH 1/7] feat(blocks): add Credential block --- .../content/docs/en/blocks/credential.mdx | 106 +++++++++++++++++ apps/docs/content/docs/en/blocks/meta.json | 1 + .../credential-selector.tsx | 110 +++++++++++++++--- apps/sim/blocks/blocks/credential.ts | 71 +++++++++++ apps/sim/blocks/registry.ts | 2 + apps/sim/components/icons.tsx | 23 ++++ apps/sim/executor/constants.ts | 2 + .../handlers/credential/credential-handler.ts | 51 ++++++++ apps/sim/executor/handlers/registry.ts | 2 + .../hooks/queries/oauth/oauth-credentials.ts | 12 +- 10 files changed, 364 insertions(+), 16 deletions(-) create mode 100644 apps/docs/content/docs/en/blocks/credential.mdx create mode 100644 apps/sim/blocks/blocks/credential.ts create mode 100644 apps/sim/executor/handlers/credential/credential-handler.ts diff --git a/apps/docs/content/docs/en/blocks/credential.mdx b/apps/docs/content/docs/en/blocks/credential.mdx new file mode 100644 index 00000000000..2ba8530b381 --- /dev/null +++ b/apps/docs/content/docs/en/blocks/credential.mdx @@ -0,0 +1,106 @@ +--- +title: Credential +--- + +import { Callout } from 'fumadocs-ui/components/callout' +import { Tab, Tabs } from 'fumadocs-ui/components/tabs' +import { Image } from '@/components/ui/image' +import { FAQ } from '@/components/ui/faq' + +The Credential block selects a stored credential once and passes its ID to any downstream block that requires authentication. The credential is resolved securely at execution time — no secrets are exposed in the workflow state or logs. + +
+ Credential Block +
+ + + The Credential block outputs a credential **ID reference**, not the secret itself. Downstream blocks receive the ID and resolve it securely during their own execution. + + +## Configuration Options + +### Credential + +Select a credential from your workspace. The dropdown shows all credential types you have access to, grouped by category: + +- **OAuth** — Connected accounts (Google, GitHub, Slack, etc.) +- **Environment Variables** — Workspace or personal environment variable references +- **Service Accounts** — Google service account JSON keys + +In advanced mode, paste a credential ID directly. You can copy a credential ID from your workspace's Credentials settings page. + +## Outputs + +| Output | Type | Description | +|---|---|---| +| `credentialId` | `string` | The credential ID — pipe this into other blocks' credential fields | +| `displayName` | `string` | Human-readable name (e.g. "waleed@company.com") | +| `type` | `string` | `oauth` \| `env_workspace` \| `env_personal` \| `service_account` | +| `providerId` | `string` | OAuth provider (e.g. `google`, `github`), empty for non-OAuth types | + +## Example Use Cases + +**Shared credential across multiple blocks** — Define once, use everywhere +``` +Credential (Google) → Gmail (Send) & Google Drive (Upload) & Google Calendar (Create) +``` + +**Environment switching** — Swap credentials without touching downstream blocks +``` +Condition (env === 'prod') → Credential (Prod API Key) or Credential (Dev API Key) + → API Block (credentialId = ) +``` + +**Multi-account workflows** — Route to different credentials based on logic +``` +Agent (Determine account) → Condition → Credential A or Credential B → Slack (Post) +``` + +## How to wire a Credential block + +1. Drop a **Credential** block and select your credential from the picker +2. In the downstream block, switch to **advanced mode** on its credential field +3. Enter `` as the value + + + + In the Gmail block's credential field (advanced mode): + ``` + + ``` + + + In an API block's Authorization header: + ``` + Bearer + ``` + Note: for API blocks, this passes the credential ID — use this pattern only when the downstream API route resolves credentials internally. + + + In the Slack block's credential field (advanced mode): + ``` + + ``` + + + +## Best Practices + +- **Define once, reference many times**: When five blocks use the same Google account, use one Credential block and wire all five to `` instead of selecting the account five times +- **Outputs are safe to log**: The `credentialId` output is a UUID reference, not a secret. It is safe to inspect in execution logs +- **Use for environment switching**: Pair with a Condition block to route to a production or staging credential based on a workflow variable +- **Advanced mode is required**: Downstream blocks must be in advanced mode on their credential field to accept a dynamic reference + + in your Function block's code. Note that the function will receive the raw UUID string — if you need the resolved token, the downstream block must handle the resolution (as integration blocks do). The Function block does not automatically resolve credential IDs." }, + { question: "What happens if the credential is deleted?", answer: "The block will throw an error at execution time: 'Credential not found or access denied'. Update the Credential block to select a valid credential before re-running." }, +]} /> diff --git a/apps/docs/content/docs/en/blocks/meta.json b/apps/docs/content/docs/en/blocks/meta.json index 6be14a79666..225d3ff8fb5 100644 --- a/apps/docs/content/docs/en/blocks/meta.json +++ b/apps/docs/content/docs/en/blocks/meta.json @@ -4,6 +4,7 @@ "agent", "api", "condition", + "credential", "evaluator", "function", "guardrails", diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/credential-selector.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/credential-selector.tsx index 296bb357929..0e02e3e318f 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/credential-selector.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/credential-selector.tsx @@ -1,7 +1,7 @@ 'use client' import { createElement, useCallback, useMemo, useState } from 'react' -import { ExternalLink, Users } from 'lucide-react' +import { ExternalLink, KeyRound, Users } from 'lucide-react' import { useParams } from 'next/navigation' import { Button, Combobox } from '@/components/emcn/components' import { getSubscriptionAccessState } from '@/lib/billing/client' @@ -22,7 +22,11 @@ import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/c import type { SubBlockConfig } from '@/blocks/types' import { CREDENTIAL_SET } from '@/executor/constants' import { useCredentialSets } from '@/hooks/queries/credential-sets' -import { useWorkspaceCredential } from '@/hooks/queries/credentials' +import { + useWorkspaceCredential, + useWorkspaceCredentials, + type WorkspaceCredential, +} from '@/hooks/queries/credentials' import { useOAuthCredentials } from '@/hooks/queries/oauth/oauth-credentials' import { useOrganizations } from '@/hooks/queries/organization' import { useSubscriptionData } from '@/hooks/queries/subscription' @@ -31,6 +35,13 @@ import { useWorkflowRegistry } from '@/stores/workflows/registry/store' const isBillingEnabled = isTruthy(getEnv('NEXT_PUBLIC_BILLING_ENABLED')) +const TYPE_SECTION_LABELS: Record = { + oauth: 'OAuth', + env_workspace: 'Environment Variables', + env_personal: 'Personal Variables', + service_account: 'Service Accounts', +} as const + interface CredentialSelectorProps { blockId: string subBlock: SubBlockConfig @@ -60,6 +71,7 @@ export function CredentialSelector({ const requiredScopes = subBlock.requiredScopes || [] const label = subBlock.placeholder || 'Select credential' const serviceId = subBlock.serviceId || '' + const isAllCredentials = !serviceId const supportsCredentialSets = subBlock.supportsCredentialSets || false const { data: organizationsData } = useOrganizations() @@ -101,14 +113,22 @@ export function CredentialSelector({ const { data: rawCredentials = [], - isFetching: credentialsLoading, + isFetching: oauthCredentialsLoading, refetch: refetchCredentials, } = useOAuthCredentials(effectiveProviderId, { - enabled: Boolean(effectiveProviderId), + enabled: !isAllCredentials && Boolean(effectiveProviderId), workspaceId, workflowId: activeWorkflowId || undefined, }) + const { + data: allWorkspaceCredentials = [], + isFetching: allCredentialsLoading, + refetch: refetchAllCredentials, + } = useWorkspaceCredentials({ workspaceId, enabled: isAllCredentials }) + + const credentialsLoading = isAllCredentials ? allCredentialsLoading : oauthCredentialsLoading + const credentials = useMemo( () => isTriggerMode @@ -122,9 +142,17 @@ export function CredentialSelector({ [credentials, selectedId] ) + const selectedAllCredential = useMemo( + () => + isAllCredentials ? (allWorkspaceCredentials.find((c) => c.id === selectedId) ?? null) : null, + [isAllCredentials, allWorkspaceCredentials, selectedId] + ) + const isServiceAccount = useMemo( - () => selectedCredential?.type === 'service_account', - [selectedCredential] + () => + selectedCredential?.type === 'service_account' || + selectedAllCredential?.type === 'service_account', + [selectedCredential, selectedAllCredential] ) const selectedCredentialSet = useMemo( @@ -134,28 +162,36 @@ export function CredentialSelector({ const { data: inaccessibleCredential } = useWorkspaceCredential( selectedId || undefined, - Boolean(selectedId) && !selectedCredential && !credentialsLoading && Boolean(workspaceId) + Boolean(selectedId) && + !selectedCredential && + !selectedAllCredential && + !credentialsLoading && + Boolean(workspaceId) ) const inaccessibleCredentialName = inaccessibleCredential?.displayName ?? null const resolvedLabel = useMemo(() => { if (selectedCredentialSet) return selectedCredentialSet.name + if (selectedAllCredential) return selectedAllCredential.displayName if (selectedCredential) return selectedCredential.name if (inaccessibleCredentialName) return inaccessibleCredentialName return '' - }, [selectedCredentialSet, selectedCredential, inaccessibleCredentialName]) + }, [selectedCredentialSet, selectedAllCredential, selectedCredential, inaccessibleCredentialName]) const displayValue = isEditing ? editingValue : resolvedLabel - useCredentialRefreshTriggers(refetchCredentials, effectiveProviderId, workspaceId) + const refetch = useCallback( + () => (isAllCredentials ? refetchAllCredentials() : refetchCredentials()), + [isAllCredentials, refetchAllCredentials, refetchCredentials] + ) + + useCredentialRefreshTriggers(refetch, effectiveProviderId, workspaceId) const handleOpenChange = useCallback( (isOpen: boolean) => { - if (isOpen) { - void refetchCredentials() - } + if (isOpen) void refetch() }, - [refetchCredentials] + [refetch] ) const hasSelection = Boolean(selectedCredential) @@ -218,6 +254,25 @@ export function CredentialSelector({ }, []) const { comboboxOptions, comboboxGroups } = useMemo(() => { + if (isAllCredentials) { + const grouped = allWorkspaceCredentials.reduce>( + (acc, cred) => { + const section = TYPE_SECTION_LABELS[cred.type] ?? cred.type + acc[section] = acc[section] ?? [] + acc[section].push(cred) + return acc + }, + {} + ) + + const groups = Object.entries(grouped).map(([section, creds]) => ({ + section, + items: creds.map((cred) => ({ label: cred.displayName, value: cred.id })), + })) + + return { comboboxOptions: [], comboboxGroups: groups.length > 0 ? groups : undefined } + } + const pollingProviderId = getPollingProviderFromOAuth(effectiveProviderId) // Handle both old ('gmail') and new ('google-email') provider IDs for backwards compatibility const matchesProvider = (csProviderId: string | null) => { @@ -281,6 +336,8 @@ export function CredentialSelector({ return { comboboxOptions: options, comboboxGroups: undefined } }, [ + isAllCredentials, + allWorkspaceCredentials, credentials, provider, effectiveProviderId, @@ -306,6 +363,17 @@ export function CredentialSelector({ ) } + if (isAllCredentials && selectedAllCredential) { + return ( +
+
+ +
+ {displayValue} +
+ ) + } + return (
@@ -320,6 +388,8 @@ export function CredentialSelector({ selectedCredentialProvider, isCredentialSetSelected, selectedCredentialSet, + isAllCredentials, + selectedAllCredential, isServiceAccount, ]) @@ -339,7 +409,9 @@ export function CredentialSelector({ } } - const matchedCred = credentials.find((c) => c.id === value) + const matchedCred = (isAllCredentials ? allWorkspaceCredentials : credentials).find( + (c) => c.id === value + ) if (matchedCred) { handleSelect(value) return @@ -348,7 +420,15 @@ export function CredentialSelector({ setIsEditing(true) setEditingValue(value) }, - [credentials, credentialSets, handleAddCredential, handleSelect, handleCredentialSetSelect] + [ + isAllCredentials, + allWorkspaceCredentials, + credentials, + credentialSets, + handleAddCredential, + handleSelect, + handleCredentialSetSelect, + ] ) return ( diff --git a/apps/sim/blocks/blocks/credential.ts b/apps/sim/blocks/blocks/credential.ts new file mode 100644 index 00000000000..ccf50610774 --- /dev/null +++ b/apps/sim/blocks/blocks/credential.ts @@ -0,0 +1,71 @@ +import { CredentialIcon } from '@/components/icons' +import type { BlockConfig } from '@/blocks/types' + +interface CredentialBlockOutput { + success: boolean + output: { + credentialId: string + displayName: string + type: string + providerId: string + } +} + +export const CredentialBlock: BlockConfig = { + type: 'credential', + name: 'Credential', + description: 'Reference a stored credential', + longDescription: + 'Select a stored credential once and pipe its ID into any downstream block that requires authentication. The credential is resolved securely at execution time — no secrets are exposed in the workflow.', + bestPractices: ` + - Use this block to define a credential once and reference in multiple downstream blocks instead of repeating credential IDs. + - Pipe into a downstream block's credential field (advanced mode) to share one credential across many blocks. + - The output is a credential ID reference, not a secret value — it is safe to log and inspect. + - To switch credentials across environments, replace the single Credential block rather than updating every downstream block. + `, + docsLink: 'https://docs.sim.ai/blocks/credential', + bgColor: '#6366F1', + icon: CredentialIcon, + category: 'blocks', + subBlocks: [ + { + id: 'credential', + title: 'Credential', + type: 'oauth-input', + required: true, + mode: 'basic', + placeholder: 'Select a credential', + canonicalParamId: 'credentialId', + }, + { + id: 'manualCredential', + title: 'Credential ID', + type: 'short-input', + required: true, + mode: 'advanced', + placeholder: 'Enter credential ID', + canonicalParamId: 'credentialId', + }, + ], + tools: { + access: [], + }, + inputs: { + credentialId: { type: 'string', description: 'The credential ID to resolve' }, + }, + outputs: { + credentialId: { + type: 'string', + description: "Credential ID — pipe into other blocks' credential fields", + }, + displayName: { type: 'string', description: 'Human-readable name of the credential' }, + type: { + type: 'string', + description: 'Credential type: oauth | env_workspace | env_personal | service_account', + }, + providerId: { + type: 'string', + description: 'OAuth provider ID (e.g. google, github), empty for non-OAuth credentials', + }, + }, +} diff --git a/apps/sim/blocks/registry.ts b/apps/sim/blocks/registry.ts index da08d87ec38..091408b7e99 100644 --- a/apps/sim/blocks/registry.ts +++ b/apps/sim/blocks/registry.ts @@ -26,6 +26,7 @@ import { ClerkBlock } from '@/blocks/blocks/clerk' import { CloudflareBlock } from '@/blocks/blocks/cloudflare' import { ConditionBlock } from '@/blocks/blocks/condition' import { ConfluenceBlock, ConfluenceV2Block } from '@/blocks/blocks/confluence' +import { CredentialBlock } from '@/blocks/blocks/credential' import { CursorBlock, CursorV2Block } from '@/blocks/blocks/cursor' import { DatabricksBlock } from '@/blocks/blocks/databricks' import { DatadogBlock } from '@/blocks/blocks/datadog' @@ -243,6 +244,7 @@ export const registry: Record = { clay: ClayBlock, clerk: ClerkBlock, condition: ConditionBlock, + credential: CredentialBlock, confluence: ConfluenceBlock, confluence_v2: ConfluenceV2Block, cursor: CursorBlock, diff --git a/apps/sim/components/icons.tsx b/apps/sim/components/icons.tsx index 8adfadbf9a4..49dda618ccb 100644 --- a/apps/sim/components/icons.tsx +++ b/apps/sim/components/icons.tsx @@ -124,6 +124,29 @@ export function ConditionalIcon(props: SVGProps) { ) } +export function CredentialIcon(props: SVGProps) { + return ( + + + + + + + ) +} + export function NoteIcon(props: SVGProps) { return ( + ): Promise { + const credentialId = typeof inputs.credentialId === 'string' ? inputs.credentialId.trim() : '' + + if (!credentialId) { + throw new Error('No credential selected') + } + + const record = await db.query.credential.findFirst({ + where: and(eq(credential.id, credentialId), eq(credential.workspaceId, ctx.workspaceId!)), + columns: { + id: true, + displayName: true, + type: true, + providerId: true, + }, + }) + + if (!record) { + throw new Error(`Credential not found: ${credentialId}`) + } + + logger.info('Credential block resolved', { credentialId: record.id, type: record.type }) + + return { + credentialId: record.id, + displayName: record.displayName, + type: record.type, + providerId: record.providerId ?? '', + } + } +} diff --git a/apps/sim/executor/handlers/registry.ts b/apps/sim/executor/handlers/registry.ts index 751ef4720c4..f2b3c292025 100644 --- a/apps/sim/executor/handlers/registry.ts +++ b/apps/sim/executor/handlers/registry.ts @@ -8,6 +8,7 @@ import { AgentBlockHandler } from '@/executor/handlers/agent/agent-handler' import { ApiBlockHandler } from '@/executor/handlers/api/api-handler' import { ConditionBlockHandler } from '@/executor/handlers/condition/condition-handler' +import { CredentialBlockHandler } from '@/executor/handlers/credential/credential-handler' import { EvaluatorBlockHandler } from '@/executor/handlers/evaluator/evaluator-handler' import { FunctionBlockHandler } from '@/executor/handlers/function/function-handler' import { GenericBlockHandler } from '@/executor/handlers/generic/generic-handler' @@ -42,6 +43,7 @@ export function createBlockHandlers(): BlockHandler[] { new WorkflowBlockHandler(), new WaitBlockHandler(), new EvaluatorBlockHandler(), + new CredentialBlockHandler(), new GenericBlockHandler(), ] } diff --git a/apps/sim/hooks/queries/oauth/oauth-credentials.ts b/apps/sim/hooks/queries/oauth/oauth-credentials.ts index 0b106bfda07..4302d2f4432 100644 --- a/apps/sim/hooks/queries/oauth/oauth-credentials.ts +++ b/apps/sim/hooks/queries/oauth/oauth-credentials.ts @@ -2,6 +2,7 @@ import { useQuery } from '@tanstack/react-query' import type { Credential } from '@/lib/oauth' import { CREDENTIAL_SET } from '@/executor/constants' import { useCredentialSetDetail } from '@/hooks/queries/credential-sets' +import { useWorkspaceCredential } from '@/hooks/queries/credentials' import { fetchJson } from '@/hooks/selectors/helpers' interface CredentialListResponse { @@ -163,17 +164,26 @@ export function useCredentialName( shouldFetchDetail ) + // Fallback for credential blocks that have no serviceId/providerId — look up by ID directly + const { data: workspaceCredential, isFetching: workspaceCredentialLoading } = + useWorkspaceCredential(!providerId && !isCredentialSet ? credentialId : undefined) + const detailCredential = foreignCredentials[0] const hasForeignMeta = foreignCredentials.length > 0 const displayName = - credentialSetData?.name ?? selectedCredential?.name ?? detailCredential?.name ?? null + credentialSetData?.name ?? + selectedCredential?.name ?? + detailCredential?.name ?? + workspaceCredential?.displayName ?? + null return { displayName, isLoading: credentialsLoading || foreignLoading || + workspaceCredentialLoading || (isCredentialSet && credentialSetLoading && !credentialSetData), hasForeignMeta, } From 547bb290687d997526bf9ce8d336472d9f5f2b61 Mon Sep 17 00:00:00 2001 From: waleed Date: Thu, 2 Apr 2026 18:03:17 -0700 Subject: [PATCH 2/7] fix(blocks): explicit workspaceId guard in credential handler, clarify hasOAuthSelection --- .../components/credential-selector/credential-selector.tsx | 6 +++--- apps/sim/executor/handlers/credential/credential-handler.ts | 6 +++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/credential-selector.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/credential-selector.tsx index 0e02e3e318f..f942abeb71c 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/credential-selector.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/credential-selector.tsx @@ -194,13 +194,13 @@ export function CredentialSelector({ [refetch] ) - const hasSelection = Boolean(selectedCredential) - const missingRequiredScopes = hasSelection + const hasOAuthSelection = Boolean(selectedCredential) + const missingRequiredScopes = hasOAuthSelection ? getMissingRequiredScopes(selectedCredential!, requiredScopes || []) : [] const needsUpdate = - hasSelection && + hasOAuthSelection && !isServiceAccount && missingRequiredScopes.length > 0 && !effectiveDisabled && diff --git a/apps/sim/executor/handlers/credential/credential-handler.ts b/apps/sim/executor/handlers/credential/credential-handler.ts index dfcd88e88bd..4839f60299a 100644 --- a/apps/sim/executor/handlers/credential/credential-handler.ts +++ b/apps/sim/executor/handlers/credential/credential-handler.ts @@ -25,8 +25,12 @@ export class CredentialBlockHandler implements BlockHandler { throw new Error('No credential selected') } + if (!ctx.workspaceId) { + throw new Error('workspaceId is required for credential resolution') + } + const record = await db.query.credential.findFirst({ - where: and(eq(credential.id, credentialId), eq(credential.workspaceId, ctx.workspaceId!)), + where: and(eq(credential.id, credentialId), eq(credential.workspaceId, ctx.workspaceId)), columns: { id: true, displayName: true, From acec88008c56a50c5caf37cc9384aef4565228b5 Mon Sep 17 00:00:00 2001 From: waleed Date: Thu, 2 Apr 2026 19:32:11 -0700 Subject: [PATCH 3/7] feat(credential): add list operation with type/provider filters --- .../content/docs/en/blocks/credential.mdx | 104 ++++++++++++-- .../public/static/blocks/credential-loop.png | Bin 0 -> 63227 bytes apps/docs/public/static/blocks/credential.png | Bin 0 -> 16837 bytes .../components/combobox/combobox.tsx | 13 +- .../components/dropdown/dropdown.tsx | 13 +- apps/sim/blocks/blocks/credential.ts | 129 ++++++++++++++++-- apps/sim/blocks/types.ts | 6 +- .../handlers/credential/credential-handler.ts | 77 ++++++++++- apps/sim/hooks/queries/credentials.ts | 2 +- .../webflow/collection_item_changed.ts | 8 +- .../webflow/collection_item_created.ts | 8 +- .../webflow/collection_item_deleted.ts | 8 +- apps/sim/triggers/webflow/form_submission.ts | 4 +- 13 files changed, 305 insertions(+), 67 deletions(-) create mode 100644 apps/docs/public/static/blocks/credential-loop.png create mode 100644 apps/docs/public/static/blocks/credential.png diff --git a/apps/docs/content/docs/en/blocks/credential.mdx b/apps/docs/content/docs/en/blocks/credential.mdx index 2ba8530b381..0d6398aee8f 100644 --- a/apps/docs/content/docs/en/blocks/credential.mdx +++ b/apps/docs/content/docs/en/blocks/credential.mdx @@ -7,25 +7,32 @@ import { Tab, Tabs } from 'fumadocs-ui/components/tabs' import { Image } from '@/components/ui/image' import { FAQ } from '@/components/ui/faq' -The Credential block selects a stored credential once and passes its ID to any downstream block that requires authentication. The credential is resolved securely at execution time — no secrets are exposed in the workflow state or logs. +The Credential block has two operations: **Select Credential** picks a single stored credential and outputs its ID reference for downstream blocks; **List Credentials** returns all credentials in the workspace (optionally filtered by type) as an array for iteration.
Credential Block
- The Credential block outputs a credential **ID reference**, not the secret itself. Downstream blocks receive the ID and resolve it securely during their own execution. + The Credential block outputs credential **ID references**, not secrets. Downstream blocks receive the ID and resolve it securely during their own execution. ## Configuration Options -### Credential +### Operation + +| Value | Description | +|---|---| +| **Select Credential** | Pick one credential and output its reference — use this to wire a single credential into downstream blocks | +| **List Credentials** | Return all workspace credentials as an array — use this with a ForEach loop | + +### Credential (Select operation) Select a credential from your workspace. The dropdown shows all credential types you have access to, grouped by category: @@ -35,20 +42,61 @@ Select a credential from your workspace. The dropdown shows all credential types In advanced mode, paste a credential ID directly. You can copy a credential ID from your workspace's Credentials settings page. +### Type Filter (List operation) + +Filter the returned credentials by type. Defaults to **All**. + +| Value | Description | +|---|---| +| **All** | Return all credential types | +| **OAuth** | Connected OAuth accounts only | +| **Env Variables (Workspace)** | Workspace environment variables only | +| **Env Variables (Personal)** | Personal environment variables only | +| **Service Accounts** | Google service account keys only | + +### Provider (List operation, OAuth only) + +Further filter OAuth credentials by provider. Select one or more providers from the dropdown — only providers you have credentials for will appear. Leave empty to return all OAuth providers. + +| Example | Returns | +|---|---| +| Gmail | Gmail credentials only | +| Slack | Slack credentials only | +| Gmail + Slack | Gmail and Slack credentials | + ## Outputs -| Output | Type | Description | -|---|---|---| -| `credentialId` | `string` | The credential ID — pipe this into other blocks' credential fields | -| `displayName` | `string` | Human-readable name (e.g. "waleed@company.com") | -| `type` | `string` | `oauth` \| `env_workspace` \| `env_personal` \| `service_account` | -| `providerId` | `string` | OAuth provider (e.g. `google`, `github`), empty for non-OAuth types | + + + | Output | Type | Description | + |---|---|---| + | `credentialId` | `string` | The credential ID — pipe this into other blocks' credential fields | + | `displayName` | `string` | Human-readable name (e.g. "waleed@company.com") | + | `type` | `string` | `oauth` \| `env_workspace` \| `env_personal` \| `service_account` | + | `providerId` | `string` | OAuth provider (e.g. `google`, `github`), empty for non-OAuth types | + + + | Output | Type | Description | + |---|---|---| + | `credentials` | `json` | Array of credential objects (see shape below) | + | `count` | `number` | Number of credentials returned | + + Each object in the `credentials` array: + + | Field | Type | Description | + |---|---|---| + | `credentialId` | `string` | The credential ID | + | `displayName` | `string` | Human-readable name | + | `type` | `string` | Credential type | + | `providerId` | `string` | OAuth provider ID, empty for non-OAuth | + + ## Example Use Cases **Shared credential across multiple blocks** — Define once, use everywhere ``` -Credential (Google) → Gmail (Send) & Google Drive (Upload) & Google Calendar (Create) +Credential (Select, Google) → Gmail (Send) & Google Drive (Upload) & Google Calendar (Create) ``` **Environment switching** — Swap credentials without touching downstream blocks @@ -62,8 +110,25 @@ Condition (env === 'prod') → Credential (Prod API Key) or Credential (Dev API Agent (Determine account) → Condition → Credential A or Credential B → Slack (Post) ``` +**Iterate over all Gmail accounts** +``` +Credential (List, OAuth, Provider: Gmail) → ForEach Loop → Gmail (Send) using +``` + +
+ Credential List wired into a ForEach Loop +
+ ## How to wire a Credential block +### Select Credential + 1. Drop a **Credential** block and select your credential from the picker 2. In the downstream block, switch to **advanced mode** on its credential field 3. Enter `` as the value @@ -90,17 +155,28 @@ Agent (Determine account) → Condition → Credential A or Credential B → Sla +### List Credentials + +1. Drop a **Credential** block, set Operation to **List Credentials** +2. Optionally set a **Type Filter** (e.g. OAuth only) +3. Optionally select one or more **Providers** to narrow results (only your connected providers appear) +4. Wire `` into a **ForEach Loop** as the items source +5. Inside the loop, reference `` in downstream blocks' credential fields + ## Best Practices - **Define once, reference many times**: When five blocks use the same Google account, use one Credential block and wire all five to `` instead of selecting the account five times - **Outputs are safe to log**: The `credentialId` output is a UUID reference, not a secret. It is safe to inspect in execution logs - **Use for environment switching**: Pair with a Condition block to route to a production or staging credential based on a workflow variable - **Advanced mode is required**: Downstream blocks must be in advanced mode on their credential field to accept a dynamic reference +- **Use List + ForEach for fan-out**: When you need to run the same action across all accounts of a type, List Credentials feeds naturally into a ForEach loop +- **Narrow by provider**: Use the Provider multiselect to filter to specific services — only providers you have credentials for are shown in your Function block's code. Note that the function will receive the raw UUID string — if you need the resolved token, the downstream block must handle the resolution (as integration blocks do). The Function block does not automatically resolve credential IDs." }, - { question: "What happens if the credential is deleted?", answer: "The block will throw an error at execution time: 'Credential not found or access denied'. Update the Credential block to select a valid credential before re-running." }, + { question: "What happens if the credential is deleted?", answer: "The Select operation will throw an error at execution time: 'Credential not found'. The List operation will simply omit the deleted credential from the results. Update the Credential block to select a valid credential before re-running." }, ]} /> diff --git a/apps/docs/public/static/blocks/credential-loop.png b/apps/docs/public/static/blocks/credential-loop.png new file mode 100644 index 0000000000000000000000000000000000000000..8211be8be097c23793c550524cde114435525d1b GIT binary patch literal 63227 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ⅇksdHApxT3wflSZ&H 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 literal 0 HcmV?d00001 diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/combobox/combobox.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/combobox/combobox.tsx index ade784ccab2..4641e9ba6ed 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/combobox/combobox.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/combobox/combobox.tsx @@ -59,14 +59,10 @@ interface ComboBoxProps { /** Configuration for the sub-block */ config: SubBlockConfig /** Async function to fetch options dynamically */ - fetchOptions?: ( - blockId: string, - subBlockId: string - ) => Promise> + fetchOptions?: (blockId: string) => Promise> /** Async function to fetch a single option's label by ID (for hydration) */ fetchOptionById?: ( blockId: string, - subBlockId: string, optionId: string ) => Promise<{ label: string; id: string } | null> /** Field dependencies that trigger option refetch when changed */ @@ -135,7 +131,7 @@ export const ComboBox = memo(function ComboBox({ setIsLoadingOptions(true) setFetchError(null) try { - const options = await fetchOptions(blockId, subBlockId) + const options = await fetchOptions(blockId) setFetchedOptions(options) } catch (error) { const errorMessage = error instanceof Error ? error.message : 'Failed to fetch options' @@ -144,7 +140,7 @@ export const ComboBox = memo(function ComboBox({ } finally { setIsLoadingOptions(false) } - }, [fetchOptions, blockId, subBlockId, isPreview, disabled]) + }, [fetchOptions, blockId, isPreview, disabled]) // Determine the active value based on mode (preview vs. controlled vs. store) const value = isPreview ? previewValue : propValue !== undefined ? propValue : storeValue @@ -363,7 +359,7 @@ export const ComboBox = memo(function ComboBox({ let isActive = true // Fetch the hydrated option - fetchOptionById(blockId, subBlockId, valueToHydrate) + fetchOptionById(blockId, valueToHydrate) .then((option) => { if (isActive) setHydratedOption(option) }) @@ -378,7 +374,6 @@ export const ComboBox = memo(function ComboBox({ fetchOptionById, value, blockId, - subBlockId, isPreview, disabled, fetchedOptions, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/dropdown/dropdown.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/dropdown/dropdown.tsx index 207cd2e6308..4abb1110183 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/dropdown/dropdown.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/dropdown/dropdown.tsx @@ -52,14 +52,10 @@ interface DropdownProps { /** Enable multi-select mode */ multiSelect?: boolean /** Async function to fetch options dynamically */ - fetchOptions?: ( - blockId: string, - subBlockId: string - ) => Promise> + fetchOptions?: (blockId: string) => Promise> /** Async function to fetch a single option's label by ID (for hydration) */ fetchOptionById?: ( blockId: string, - subBlockId: string, optionId: string ) => Promise<{ label: string; id: string } | null> /** Field dependencies that trigger option refetch when changed */ @@ -160,7 +156,7 @@ export const Dropdown = memo(function Dropdown({ setIsLoadingOptions(true) setFetchError(null) try { - const options = await fetchOptions(blockId, subBlockId) + const options = await fetchOptions(blockId) setFetchedOptions(options) } catch (error) { const errorMessage = error instanceof Error ? error.message : 'Failed to fetch options' @@ -169,7 +165,7 @@ export const Dropdown = memo(function Dropdown({ } finally { setIsLoadingOptions(false) } - }, [fetchOptions, blockId, subBlockId, isPreview, disabled]) + }, [fetchOptions, blockId, isPreview, disabled]) /** * Handles combobox open state changes to trigger option fetching @@ -430,7 +426,7 @@ export const Dropdown = memo(function Dropdown({ let isActive = true // Fetch the hydrated option - fetchOptionById(blockId, subBlockId, valueToHydrate) + fetchOptionById(blockId, valueToHydrate) .then((option) => { if (isActive) setHydratedOption(option) }) @@ -446,7 +442,6 @@ export const Dropdown = memo(function Dropdown({ singleValue, multiSelect, blockId, - subBlockId, isPreview, disabled, fetchedOptions, diff --git a/apps/sim/blocks/blocks/credential.ts b/apps/sim/blocks/blocks/credential.ts index ccf50610774..725c30c151f 100644 --- a/apps/sim/blocks/blocks/credential.ts +++ b/apps/sim/blocks/blocks/credential.ts @@ -1,5 +1,9 @@ import { CredentialIcon } from '@/components/icons' +import { getServiceConfigByProviderId } from '@/lib/oauth/utils' +import { getQueryClient } from '@/app/_shell/providers/get-query-client' import type { BlockConfig } from '@/blocks/types' +import { fetchWorkspaceCredentialList, workspaceCredentialKeys } from '@/hooks/queries/credentials' +import { useWorkflowRegistry } from '@/stores/workflows/registry/store' interface CredentialBlockOutput { success: boolean @@ -8,19 +12,28 @@ interface CredentialBlockOutput { displayName: string type: string providerId: string + credentials: Array<{ + credentialId: string + displayName: string + type: string + providerId: string + }> + count: number } } export const CredentialBlock: BlockConfig = { type: 'credential', name: 'Credential', - description: 'Reference a stored credential', + description: 'Select or list stored credentials', longDescription: - 'Select a stored credential once and pipe its ID into any downstream block that requires authentication. The credential is resolved securely at execution time — no secrets are exposed in the workflow.', + 'Select a stored credential once and pipe its ID into any downstream block that requires authentication, or list all credentials in the workspace for iteration. No secrets are ever exposed — only credential IDs and metadata.', bestPractices: ` - - Use this block to define a credential once and reference in multiple downstream blocks instead of repeating credential IDs. - - Pipe into a downstream block's credential field (advanced mode) to share one credential across many blocks. - - The output is a credential ID reference, not a secret value — it is safe to log and inspect. + - Use "Select Credential" to define a credential once and reference in multiple downstream blocks instead of repeating credential IDs. + - Use "List Credentials" with a ForEach loop to iterate over all credentials of a given type (e.g. all OAuth accounts). + - Use the Type Filter in "List Credentials" to narrow results to a specific credential type. + - Use the Provider filter to further narrow OAuth results to specific services (e.g. Gmail, Slack). + - The outputs are credential ID references, not secret values — they are safe to log and inspect. - To switch credentials across environments, replace the single Credential block rather than updating every downstream block. `, docsLink: 'https://docs.sim.ai/blocks/credential', @@ -28,44 +41,142 @@ export const CredentialBlock: BlockConfig = { icon: CredentialIcon, category: 'blocks', subBlocks: [ + { + id: 'operation', + title: 'Operation', + type: 'dropdown', + options: [ + { label: 'Select Credential', id: 'select' }, + { label: 'List Credentials', id: 'list' }, + ], + value: () => 'select', + }, + { + id: 'typeFilter', + title: 'Type Filter', + type: 'dropdown', + options: [ + { label: 'All', id: 'all' }, + { label: 'OAuth', id: 'oauth' }, + { label: 'Env Variables (Workspace)', id: 'env_workspace' }, + { label: 'Env Variables (Personal)', id: 'env_personal' }, + { label: 'Service Accounts', id: 'service_account' }, + ], + value: () => 'all', + condition: { field: 'operation', value: 'list' }, + }, + { + id: 'providerFilter', + title: 'Provider', + type: 'dropdown', + multiSelect: true, + options: [], + fetchOptions: async () => { + const workspaceId = useWorkflowRegistry.getState().hydration.workspaceId + if (!workspaceId) return [] + + const credentials = await getQueryClient().fetchQuery({ + queryKey: workspaceCredentialKeys.list(workspaceId), + queryFn: () => fetchWorkspaceCredentialList(workspaceId), + staleTime: 60 * 1000, + }) + + const seen = new Set() + const options: Array<{ label: string; id: string }> = [] + + for (const cred of credentials) { + if (cred.type === 'oauth' && cred.providerId && !seen.has(cred.providerId)) { + seen.add(cred.providerId) + const serviceConfig = getServiceConfigByProviderId(cred.providerId) + options.push({ label: serviceConfig?.name ?? cred.providerId, id: cred.providerId }) + } + } + + return options.sort((a, b) => a.label.localeCompare(b.label)) + }, + fetchOptionById: async (_blockId: string, optionId: string) => { + const serviceConfig = getServiceConfigByProviderId(optionId) + const label = serviceConfig?.name ?? optionId + return { label, id: optionId } + }, + condition: { + field: 'operation', + value: 'list', + and: { field: 'typeFilter', value: 'oauth' }, + }, + }, { id: 'credential', title: 'Credential', type: 'oauth-input', - required: true, + required: { field: 'operation', value: 'select' }, mode: 'basic', placeholder: 'Select a credential', canonicalParamId: 'credentialId', + condition: { field: 'operation', value: 'select' }, }, { id: 'manualCredential', title: 'Credential ID', type: 'short-input', - required: true, + required: { field: 'operation', value: 'select' }, mode: 'advanced', placeholder: 'Enter credential ID', canonicalParamId: 'credentialId', + condition: { field: 'operation', value: 'select' }, }, ], tools: { access: [], }, inputs: { - credentialId: { type: 'string', description: 'The credential ID to resolve' }, + operation: { type: 'string', description: "'select' or 'list'" }, + credentialId: { + type: 'string', + description: 'The credential ID to resolve (select operation)', + }, + typeFilter: { + type: 'string', + description: + "Type filter for list operation: 'all' | 'oauth' | 'env_workspace' | 'env_personal' | 'service_account'", + }, + providerFilter: { + type: 'json', + description: + 'Array of OAuth provider IDs to filter by (e.g. ["google-email", "slack"]). Only applies when typeFilter is oauth.', + }, }, outputs: { credentialId: { type: 'string', description: "Credential ID — pipe into other blocks' credential fields", + condition: { field: 'operation', value: 'select' }, + }, + displayName: { + type: 'string', + description: 'Human-readable name of the credential', + condition: { field: 'operation', value: 'select' }, }, - displayName: { type: 'string', description: 'Human-readable name of the credential' }, type: { type: 'string', description: 'Credential type: oauth | env_workspace | env_personal | service_account', + condition: { field: 'operation', value: 'select' }, }, providerId: { type: 'string', description: 'OAuth provider ID (e.g. google, github), empty for non-OAuth credentials', + condition: { field: 'operation', value: 'select' }, + }, + credentials: { + type: 'json', + description: + 'Array of credential objects, each with credentialId, displayName, type, and providerId', + condition: { field: 'operation', value: 'list' }, + }, + count: { + type: 'number', + description: 'Number of credentials returned', + condition: { field: 'operation', value: 'list' }, }, }, } diff --git a/apps/sim/blocks/types.ts b/apps/sim/blocks/types.ts index 052bc47f363..d6969cc9c23 100644 --- a/apps/sim/blocks/types.ts +++ b/apps/sim/blocks/types.ts @@ -421,15 +421,11 @@ export interface SubBlockConfig { triggerId?: string // Dropdown/Combobox: Function to fetch options dynamically // Works with both 'dropdown' (select-only) and 'combobox' (editable with expression support) - fetchOptions?: ( - blockId: string, - subBlockId: string - ) => Promise> + fetchOptions?: (blockId: string) => Promise> // Dropdown/Combobox: Function to fetch a single option's label by ID (for hydration) // Called when component mounts with a stored value to display the correct label before options load fetchOptionById?: ( blockId: string, - subBlockId: string, optionId: string ) => Promise<{ label: string; id: string } | null> } diff --git a/apps/sim/executor/handlers/credential/credential-handler.ts b/apps/sim/executor/handlers/credential/credential-handler.ts index 4839f60299a..49570dae767 100644 --- a/apps/sim/executor/handlers/credential/credential-handler.ts +++ b/apps/sim/executor/handlers/credential/credential-handler.ts @@ -1,7 +1,7 @@ import { db } from '@sim/db' import { credential } from '@sim/db/schema' import { createLogger } from '@sim/logger' -import { and, eq } from 'drizzle-orm' +import { and, asc, eq, inArray } from 'drizzle-orm' import type { BlockOutput } from '@/blocks/types' import { BlockType } from '@/executor/constants' import type { BlockHandler, ExecutionContext } from '@/executor/types' @@ -18,6 +18,23 @@ export class CredentialBlockHandler implements BlockHandler { ctx: ExecutionContext, _block: SerializedBlock, inputs: Record + ): Promise { + if (!ctx.workspaceId) { + throw new Error('workspaceId is required for credential resolution') + } + + const operation = typeof inputs.operation === 'string' ? inputs.operation : 'select' + + if (operation === 'list') { + return this.listCredentials(ctx.workspaceId, inputs) + } + + return this.selectCredential(ctx.workspaceId, inputs) + } + + private async selectCredential( + workspaceId: string, + inputs: Record ): Promise { const credentialId = typeof inputs.credentialId === 'string' ? inputs.credentialId.trim() : '' @@ -25,12 +42,8 @@ export class CredentialBlockHandler implements BlockHandler { throw new Error('No credential selected') } - if (!ctx.workspaceId) { - throw new Error('workspaceId is required for credential resolution') - } - const record = await db.query.credential.findFirst({ - where: and(eq(credential.id, credentialId), eq(credential.workspaceId, ctx.workspaceId)), + where: and(eq(credential.id, credentialId), eq(credential.workspaceId, workspaceId)), columns: { id: true, displayName: true, @@ -52,4 +65,56 @@ export class CredentialBlockHandler implements BlockHandler { providerId: record.providerId ?? '', } } + + private async listCredentials( + workspaceId: string, + inputs: Record + ): Promise { + const typeFilter = typeof inputs.typeFilter === 'string' ? inputs.typeFilter : 'all' + const providerFilter = + typeFilter === 'oauth' && Array.isArray(inputs.providerFilter) + ? (inputs.providerFilter as string[]).filter(Boolean) + : [] + + const conditions = [eq(credential.workspaceId, workspaceId)] + + if (typeFilter !== 'all') { + conditions.push( + eq(credential.type, typeFilter as (typeof credential.type)['enumValues'][number]) + ) + } + + if (providerFilter.length > 0) { + conditions.push(inArray(credential.providerId, providerFilter)) + } + + const records = await db.query.credential.findMany({ + where: and(...conditions), + columns: { + id: true, + displayName: true, + type: true, + providerId: true, + }, + orderBy: [asc(credential.displayName)], + }) + + const credentials = records.map((r) => ({ + credentialId: r.id, + displayName: r.displayName, + type: r.type, + providerId: r.providerId ?? '', + })) + + logger.info('Credential block listed credentials', { + count: credentials.length, + typeFilter, + providerFilter: providerFilter.length > 0 ? providerFilter : undefined, + }) + + return { + credentials, + count: credentials.length, + } + } } diff --git a/apps/sim/hooks/queries/credentials.ts b/apps/sim/hooks/queries/credentials.ts index 9b9b35a5f7a..5859970ea08 100644 --- a/apps/sim/hooks/queries/credentials.ts +++ b/apps/sim/hooks/queries/credentials.ts @@ -73,7 +73,7 @@ export const workspaceCredentialKeys = { * Fetch workspace credential list from API. * Used by the prefetch function for hover-based cache warming. */ -async function fetchWorkspaceCredentialList( +export async function fetchWorkspaceCredentialList( workspaceId: string, signal?: AbortSignal ): Promise { diff --git a/apps/sim/triggers/webflow/collection_item_changed.ts b/apps/sim/triggers/webflow/collection_item_changed.ts index e0c43fd36ca..976b58c8f53 100644 --- a/apps/sim/triggers/webflow/collection_item_changed.ts +++ b/apps/sim/triggers/webflow/collection_item_changed.ts @@ -42,7 +42,7 @@ export const webflowCollectionItemChangedTrigger: TriggerConfig = { field: 'selectedTriggerId', value: 'webflow_collection_item_changed', }, - fetchOptions: async (blockId: string, _subBlockId: string) => { + fetchOptions: async (blockId: string) => { const credentialId = useSubBlockStore.getState().getValue(blockId, 'triggerCredentials') as | string | null @@ -71,7 +71,7 @@ export const webflowCollectionItemChangedTrigger: TriggerConfig = { throw error } }, - fetchOptionById: async (blockId: string, _subBlockId: string, optionId: string) => { + fetchOptionById: async (blockId: string, optionId: string) => { const credentialId = useSubBlockStore.getState().getValue(blockId, 'triggerCredentials') as | string | null @@ -108,7 +108,7 @@ export const webflowCollectionItemChangedTrigger: TriggerConfig = { field: 'selectedTriggerId', value: 'webflow_collection_item_changed', }, - fetchOptions: async (blockId: string, _subBlockId: string) => { + fetchOptions: async (blockId: string) => { const credentialId = useSubBlockStore.getState().getValue(blockId, 'triggerCredentials') as | string | null @@ -140,7 +140,7 @@ export const webflowCollectionItemChangedTrigger: TriggerConfig = { throw error } }, - fetchOptionById: async (blockId: string, _subBlockId: string, optionId: string) => { + fetchOptionById: async (blockId: string, optionId: string) => { const credentialId = useSubBlockStore.getState().getValue(blockId, 'triggerCredentials') as | string | null diff --git a/apps/sim/triggers/webflow/collection_item_created.ts b/apps/sim/triggers/webflow/collection_item_created.ts index 3c2c6cee4be..4494b08108a 100644 --- a/apps/sim/triggers/webflow/collection_item_created.ts +++ b/apps/sim/triggers/webflow/collection_item_created.ts @@ -56,7 +56,7 @@ export const webflowCollectionItemCreatedTrigger: TriggerConfig = { field: 'selectedTriggerId', value: 'webflow_collection_item_created', }, - fetchOptions: async (blockId: string, _subBlockId: string) => { + fetchOptions: async (blockId: string) => { const credentialId = useSubBlockStore.getState().getValue(blockId, 'triggerCredentials') as | string | null @@ -85,7 +85,7 @@ export const webflowCollectionItemCreatedTrigger: TriggerConfig = { throw error } }, - fetchOptionById: async (blockId: string, _subBlockId: string, optionId: string) => { + fetchOptionById: async (blockId: string, optionId: string) => { const credentialId = useSubBlockStore.getState().getValue(blockId, 'triggerCredentials') as | string | null @@ -122,7 +122,7 @@ export const webflowCollectionItemCreatedTrigger: TriggerConfig = { field: 'selectedTriggerId', value: 'webflow_collection_item_created', }, - fetchOptions: async (blockId: string, _subBlockId: string) => { + fetchOptions: async (blockId: string) => { const credentialId = useSubBlockStore.getState().getValue(blockId, 'triggerCredentials') as | string | null @@ -154,7 +154,7 @@ export const webflowCollectionItemCreatedTrigger: TriggerConfig = { throw error } }, - fetchOptionById: async (blockId: string, _subBlockId: string, optionId: string) => { + fetchOptionById: async (blockId: string, optionId: string) => { const credentialId = useSubBlockStore.getState().getValue(blockId, 'triggerCredentials') as | string | null diff --git a/apps/sim/triggers/webflow/collection_item_deleted.ts b/apps/sim/triggers/webflow/collection_item_deleted.ts index 80011af97dd..e4e3d1f033f 100644 --- a/apps/sim/triggers/webflow/collection_item_deleted.ts +++ b/apps/sim/triggers/webflow/collection_item_deleted.ts @@ -42,7 +42,7 @@ export const webflowCollectionItemDeletedTrigger: TriggerConfig = { field: 'selectedTriggerId', value: 'webflow_collection_item_deleted', }, - fetchOptions: async (blockId: string, _subBlockId: string) => { + fetchOptions: async (blockId: string) => { const credentialId = useSubBlockStore.getState().getValue(blockId, 'triggerCredentials') as | string | null @@ -71,7 +71,7 @@ export const webflowCollectionItemDeletedTrigger: TriggerConfig = { throw error } }, - fetchOptionById: async (blockId: string, _subBlockId: string, optionId: string) => { + fetchOptionById: async (blockId: string, optionId: string) => { const credentialId = useSubBlockStore.getState().getValue(blockId, 'triggerCredentials') as | string | null @@ -108,7 +108,7 @@ export const webflowCollectionItemDeletedTrigger: TriggerConfig = { field: 'selectedTriggerId', value: 'webflow_collection_item_deleted', }, - fetchOptions: async (blockId: string, _subBlockId: string) => { + fetchOptions: async (blockId: string) => { const credentialId = useSubBlockStore.getState().getValue(blockId, 'triggerCredentials') as | string | null @@ -140,7 +140,7 @@ export const webflowCollectionItemDeletedTrigger: TriggerConfig = { throw error } }, - fetchOptionById: async (blockId: string, _subBlockId: string, optionId: string) => { + fetchOptionById: async (blockId: string, optionId: string) => { const credentialId = useSubBlockStore.getState().getValue(blockId, 'triggerCredentials') as | string | null diff --git a/apps/sim/triggers/webflow/form_submission.ts b/apps/sim/triggers/webflow/form_submission.ts index 2d698daa05b..3ea3494696c 100644 --- a/apps/sim/triggers/webflow/form_submission.ts +++ b/apps/sim/triggers/webflow/form_submission.ts @@ -42,7 +42,7 @@ export const webflowFormSubmissionTrigger: TriggerConfig = { field: 'selectedTriggerId', value: 'webflow_form_submission', }, - fetchOptions: async (blockId: string, _subBlockId: string) => { + fetchOptions: async (blockId: string) => { const credentialId = useSubBlockStore.getState().getValue(blockId, 'triggerCredentials') as | string | null @@ -71,7 +71,7 @@ export const webflowFormSubmissionTrigger: TriggerConfig = { throw error } }, - fetchOptionById: async (blockId: string, _subBlockId: string, optionId: string) => { + fetchOptionById: async (blockId: string, optionId: string) => { const credentialId = useSubBlockStore.getState().getValue(blockId, 'triggerCredentials') as | string | null From 4c0f6668d9dd7b5bfa3faa7dd436c2b9d1a25ace Mon Sep 17 00:00:00 2001 From: waleed Date: Thu, 2 Apr 2026 19:44:32 -0700 Subject: [PATCH 4/7] feat(credential): restrict to OAuth only, remove env vars and service accounts --- .../content/docs/en/blocks/credential.mdx | 74 ++++++------------- .../credential-selector.tsx | 32 +------- apps/sim/blocks/blocks/credential.ts | 51 +++---------- .../handlers/credential/credential-handler.ts | 31 +++----- apps/sim/triggers/gmail/poller.ts | 2 +- apps/sim/triggers/imap/poller.ts | 2 +- apps/sim/triggers/outlook/poller.ts | 2 +- 7 files changed, 49 insertions(+), 145 deletions(-) diff --git a/apps/docs/content/docs/en/blocks/credential.mdx b/apps/docs/content/docs/en/blocks/credential.mdx index 0d6398aee8f..06b8cb5bec1 100644 --- a/apps/docs/content/docs/en/blocks/credential.mdx +++ b/apps/docs/content/docs/en/blocks/credential.mdx @@ -7,7 +7,7 @@ import { Tab, Tabs } from 'fumadocs-ui/components/tabs' import { Image } from '@/components/ui/image' import { FAQ } from '@/components/ui/faq' -The Credential block has two operations: **Select Credential** picks a single stored credential and outputs its ID reference for downstream blocks; **List Credentials** returns all credentials in the workspace (optionally filtered by type) as an array for iteration. +The Credential block has two operations: **Select Credential** picks a single OAuth credential and outputs its ID reference for downstream blocks; **List Credentials** returns all OAuth credentials in the workspace (optionally filtered by provider) as an array for iteration.
- The Credential block outputs credential **ID references**, not secrets. Downstream blocks receive the ID and resolve it securely during their own execution. + The Credential block outputs credential **ID references**, not secrets. Downstream blocks receive the ID and resolve the actual OAuth token securely during their own execution. ## Configuration Options @@ -29,34 +29,18 @@ The Credential block has two operations: **Select Credential** picks a single st | Value | Description | |---|---| -| **Select Credential** | Pick one credential and output its reference — use this to wire a single credential into downstream blocks | -| **List Credentials** | Return all workspace credentials as an array — use this with a ForEach loop | +| **Select Credential** | Pick one OAuth credential and output its reference — use this to wire a single credential into downstream blocks | +| **List Credentials** | Return all OAuth credentials in the workspace as an array — use this with a ForEach loop | ### Credential (Select operation) -Select a credential from your workspace. The dropdown shows all credential types you have access to, grouped by category: - -- **OAuth** — Connected accounts (Google, GitHub, Slack, etc.) -- **Environment Variables** — Workspace or personal environment variable references -- **Service Accounts** — Google service account JSON keys +Select an OAuth credential from your workspace. The dropdown shows all connected OAuth accounts (Google, GitHub, Slack, etc.). In advanced mode, paste a credential ID directly. You can copy a credential ID from your workspace's Credentials settings page. -### Type Filter (List operation) - -Filter the returned credentials by type. Defaults to **All**. +### Provider (List operation) -| Value | Description | -|---|---| -| **All** | Return all credential types | -| **OAuth** | Connected OAuth accounts only | -| **Env Variables (Workspace)** | Workspace environment variables only | -| **Env Variables (Personal)** | Personal environment variables only | -| **Service Accounts** | Google service account keys only | - -### Provider (List operation, OAuth only) - -Further filter OAuth credentials by provider. Select one or more providers from the dropdown — only providers you have credentials for will appear. Leave empty to return all OAuth providers. +Filter the returned OAuth credentials by provider. Select one or more providers from the dropdown — only providers you have credentials for will appear. Leave empty to return all OAuth credentials. | Example | Returns | |---|---| @@ -72,13 +56,12 @@ Further filter OAuth credentials by provider. Select one or more providers from |---|---|---| | `credentialId` | `string` | The credential ID — pipe this into other blocks' credential fields | | `displayName` | `string` | Human-readable name (e.g. "waleed@company.com") | - | `type` | `string` | `oauth` \| `env_workspace` \| `env_personal` \| `service_account` | - | `providerId` | `string` | OAuth provider (e.g. `google`, `github`), empty for non-OAuth types | + | `providerId` | `string` | OAuth provider ID (e.g. `google-email`, `slack`) | | Output | Type | Description | |---|---|---| - | `credentials` | `json` | Array of credential objects (see shape below) | + | `credentials` | `json` | Array of OAuth credential objects (see shape below) | | `count` | `number` | Number of credentials returned | Each object in the `credentials` array: @@ -87,8 +70,7 @@ Further filter OAuth credentials by provider. Select one or more providers from |---|---|---| | `credentialId` | `string` | The credential ID | | `displayName` | `string` | Human-readable name | - | `type` | `string` | Credential type | - | `providerId` | `string` | OAuth provider ID, empty for non-OAuth | + | `providerId` | `string` | OAuth provider ID | @@ -99,12 +81,6 @@ Further filter OAuth credentials by provider. Select one or more providers from Credential (Select, Google) → Gmail (Send) & Google Drive (Upload) & Google Calendar (Create) ``` -**Environment switching** — Swap credentials without touching downstream blocks -``` -Condition (env === 'prod') → Credential (Prod API Key) or Credential (Dev API Key) - → API Block (credentialId = ) -``` - **Multi-account workflows** — Route to different credentials based on logic ``` Agent (Determine account) → Condition → Credential A or Credential B → Slack (Post) @@ -112,7 +88,7 @@ Agent (Determine account) → Condition → Credential A or Credential B → Sla **Iterate over all Gmail accounts** ``` -Credential (List, OAuth, Provider: Gmail) → ForEach Loop → Gmail (Send) using +Credential (List, Provider: Gmail) → ForEach Loop → Gmail (Send) using ```
@@ -129,24 +105,17 @@ Credential (List, OAuth, Provider: Gmail) → ForEach Loop → Gmail (Send) usin ### Select Credential -1. Drop a **Credential** block and select your credential from the picker +1. Drop a **Credential** block and select your OAuth credential from the picker 2. In the downstream block, switch to **advanced mode** on its credential field 3. Enter `` as the value - + In the Gmail block's credential field (advanced mode): ``` ``` - - In an API block's Authorization header: - ``` - Bearer - ``` - Note: for API blocks, this passes the credential ID — use this pattern only when the downstream API route resolves credentials internally. - In the Slack block's credential field (advanced mode): ``` @@ -158,25 +127,24 @@ Credential (List, OAuth, Provider: Gmail) → ForEach Loop → Gmail (Send) usin ### List Credentials 1. Drop a **Credential** block, set Operation to **List Credentials** -2. Optionally set a **Type Filter** (e.g. OAuth only) -3. Optionally select one or more **Providers** to narrow results (only your connected providers appear) -4. Wire `` into a **ForEach Loop** as the items source -5. Inside the loop, reference `` in downstream blocks' credential fields +2. Optionally select one or more **Providers** to narrow results (only your connected providers appear) +3. Wire `` into a **ForEach Loop** as the items source +4. Inside the loop, reference `` in downstream blocks' credential fields ## Best Practices - **Define once, reference many times**: When five blocks use the same Google account, use one Credential block and wire all five to `` instead of selecting the account five times - **Outputs are safe to log**: The `credentialId` output is a UUID reference, not a secret. It is safe to inspect in execution logs -- **Use for environment switching**: Pair with a Condition block to route to a production or staging credential based on a workflow variable +- **Use for environment switching**: Pair with a Condition block to route to a production or staging OAuth credential based on a workflow variable - **Advanced mode is required**: Downstream blocks must be in advanced mode on their credential field to accept a dynamic reference -- **Use List + ForEach for fan-out**: When you need to run the same action across all accounts of a type, List Credentials feeds naturally into a ForEach loop +- **Use List + ForEach for fan-out**: When you need to run the same action across all accounts of a provider, List Credentials feeds naturally into a ForEach loop - **Narrow by provider**: Use the Provider multiselect to filter to specific services — only providers you have credentials for are shown in your Function block's code. Note that the function will receive the raw UUID string — if you need the resolved token, the downstream block must handle the resolution (as integration blocks do). The Function block does not automatically resolve credential IDs." }, { question: "What happens if the credential is deleted?", answer: "The Select operation will throw an error at execution time: 'Credential not found'. The List operation will simply omit the deleted credential from the results. Update the Credential block to select a valid credential before re-running." }, ]} /> diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/credential-selector.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/credential-selector.tsx index f942abeb71c..0333c030d25 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/credential-selector.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/credential-selector.tsx @@ -22,11 +22,7 @@ import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/c import type { SubBlockConfig } from '@/blocks/types' import { CREDENTIAL_SET } from '@/executor/constants' import { useCredentialSets } from '@/hooks/queries/credential-sets' -import { - useWorkspaceCredential, - useWorkspaceCredentials, - type WorkspaceCredential, -} from '@/hooks/queries/credentials' +import { useWorkspaceCredential, useWorkspaceCredentials } from '@/hooks/queries/credentials' import { useOAuthCredentials } from '@/hooks/queries/oauth/oauth-credentials' import { useOrganizations } from '@/hooks/queries/organization' import { useSubscriptionData } from '@/hooks/queries/subscription' @@ -35,13 +31,6 @@ import { useWorkflowRegistry } from '@/stores/workflows/registry/store' const isBillingEnabled = isTruthy(getEnv('NEXT_PUBLIC_BILLING_ENABLED')) -const TYPE_SECTION_LABELS: Record = { - oauth: 'OAuth', - env_workspace: 'Environment Variables', - env_personal: 'Personal Variables', - service_account: 'Service Accounts', -} as const - interface CredentialSelectorProps { blockId: string subBlock: SubBlockConfig @@ -255,22 +244,9 @@ export function CredentialSelector({ const { comboboxOptions, comboboxGroups } = useMemo(() => { if (isAllCredentials) { - const grouped = allWorkspaceCredentials.reduce>( - (acc, cred) => { - const section = TYPE_SECTION_LABELS[cred.type] ?? cred.type - acc[section] = acc[section] ?? [] - acc[section].push(cred) - return acc - }, - {} - ) - - const groups = Object.entries(grouped).map(([section, creds]) => ({ - section, - items: creds.map((cred) => ({ label: cred.displayName, value: cred.id })), - })) - - return { comboboxOptions: [], comboboxGroups: groups.length > 0 ? groups : undefined } + const oauthCredentials = allWorkspaceCredentials.filter((c) => c.type === 'oauth') + const options = oauthCredentials.map((cred) => ({ label: cred.displayName, value: cred.id })) + return { comboboxOptions: options, comboboxGroups: undefined } } const pollingProviderId = getPollingProviderFromOAuth(effectiveProviderId) diff --git a/apps/sim/blocks/blocks/credential.ts b/apps/sim/blocks/blocks/credential.ts index 725c30c151f..ec1408ac8ee 100644 --- a/apps/sim/blocks/blocks/credential.ts +++ b/apps/sim/blocks/blocks/credential.ts @@ -10,12 +10,10 @@ interface CredentialBlockOutput { output: { credentialId: string displayName: string - type: string providerId: string credentials: Array<{ credentialId: string displayName: string - type: string providerId: string }> count: number @@ -25,14 +23,13 @@ interface CredentialBlockOutput { export const CredentialBlock: BlockConfig = { type: 'credential', name: 'Credential', - description: 'Select or list stored credentials', + description: 'Select or list OAuth credentials', longDescription: - 'Select a stored credential once and pipe its ID into any downstream block that requires authentication, or list all credentials in the workspace for iteration. No secrets are ever exposed — only credential IDs and metadata.', + 'Select an OAuth credential once and pipe its ID into any downstream block that requires authentication, or list all OAuth credentials in the workspace for iteration. No secrets are ever exposed — only credential IDs and metadata.', bestPractices: ` - - Use "Select Credential" to define a credential once and reference in multiple downstream blocks instead of repeating credential IDs. - - Use "List Credentials" with a ForEach loop to iterate over all credentials of a given type (e.g. all OAuth accounts). - - Use the Type Filter in "List Credentials" to narrow results to a specific credential type. - - Use the Provider filter to further narrow OAuth results to specific services (e.g. Gmail, Slack). + - Use "Select Credential" to define an OAuth credential once and reference in multiple downstream blocks instead of repeating credential IDs. + - Use "List Credentials" with a ForEach loop to iterate over all OAuth accounts (e.g. all Gmail accounts). + - Use the Provider filter to narrow results to specific services (e.g. Gmail, Slack). - The outputs are credential ID references, not secret values — they are safe to log and inspect. - To switch credentials across environments, replace the single Credential block rather than updating every downstream block. `, @@ -51,26 +48,13 @@ export const CredentialBlock: BlockConfig = { ], value: () => 'select', }, - { - id: 'typeFilter', - title: 'Type Filter', - type: 'dropdown', - options: [ - { label: 'All', id: 'all' }, - { label: 'OAuth', id: 'oauth' }, - { label: 'Env Variables (Workspace)', id: 'env_workspace' }, - { label: 'Env Variables (Personal)', id: 'env_personal' }, - { label: 'Service Accounts', id: 'service_account' }, - ], - value: () => 'all', - condition: { field: 'operation', value: 'list' }, - }, { id: 'providerFilter', title: 'Provider', type: 'dropdown', multiSelect: true, options: [], + condition: { field: 'operation', value: 'list' }, fetchOptions: async () => { const workspaceId = useWorkflowRegistry.getState().hydration.workspaceId if (!workspaceId) return [] @@ -99,11 +83,6 @@ export const CredentialBlock: BlockConfig = { const label = serviceConfig?.name ?? optionId return { label, id: optionId } }, - condition: { - field: 'operation', - value: 'list', - and: { field: 'typeFilter', value: 'oauth' }, - }, }, { id: 'credential', @@ -133,17 +112,12 @@ export const CredentialBlock: BlockConfig = { operation: { type: 'string', description: "'select' or 'list'" }, credentialId: { type: 'string', - description: 'The credential ID to resolve (select operation)', - }, - typeFilter: { - type: 'string', - description: - "Type filter for list operation: 'all' | 'oauth' | 'env_workspace' | 'env_personal' | 'service_account'", + description: 'The OAuth credential ID to resolve (select operation)', }, providerFilter: { type: 'json', description: - 'Array of OAuth provider IDs to filter by (e.g. ["google-email", "slack"]). Only applies when typeFilter is oauth.', + 'Array of OAuth provider IDs to filter by (e.g. ["google-email", "slack"]). Leave empty to return all OAuth credentials.', }, }, outputs: { @@ -157,20 +131,15 @@ export const CredentialBlock: BlockConfig = { description: 'Human-readable name of the credential', condition: { field: 'operation', value: 'select' }, }, - type: { - type: 'string', - description: 'Credential type: oauth | env_workspace | env_personal | service_account', - condition: { field: 'operation', value: 'select' }, - }, providerId: { type: 'string', - description: 'OAuth provider ID (e.g. google, github), empty for non-OAuth credentials', + description: 'OAuth provider ID (e.g. google-email, slack)', condition: { field: 'operation', value: 'select' }, }, credentials: { type: 'json', description: - 'Array of credential objects, each with credentialId, displayName, type, and providerId', + 'Array of OAuth credential objects, each with credentialId, displayName, and providerId', condition: { field: 'operation', value: 'list' }, }, count: { diff --git a/apps/sim/executor/handlers/credential/credential-handler.ts b/apps/sim/executor/handlers/credential/credential-handler.ts index 49570dae767..2619ae5bd07 100644 --- a/apps/sim/executor/handlers/credential/credential-handler.ts +++ b/apps/sim/executor/handlers/credential/credential-handler.ts @@ -43,11 +43,14 @@ export class CredentialBlockHandler implements BlockHandler { } const record = await db.query.credential.findFirst({ - where: and(eq(credential.id, credentialId), eq(credential.workspaceId, workspaceId)), + where: and( + eq(credential.id, credentialId), + eq(credential.workspaceId, workspaceId), + eq(credential.type, 'oauth') + ), columns: { id: true, displayName: true, - type: true, providerId: true, }, }) @@ -56,12 +59,11 @@ export class CredentialBlockHandler implements BlockHandler { throw new Error(`Credential not found: ${credentialId}`) } - logger.info('Credential block resolved', { credentialId: record.id, type: record.type }) + logger.info('Credential block resolved', { credentialId: record.id }) return { credentialId: record.id, displayName: record.displayName, - type: record.type, providerId: record.providerId ?? '', } } @@ -70,19 +72,11 @@ export class CredentialBlockHandler implements BlockHandler { workspaceId: string, inputs: Record ): Promise { - const typeFilter = typeof inputs.typeFilter === 'string' ? inputs.typeFilter : 'all' - const providerFilter = - typeFilter === 'oauth' && Array.isArray(inputs.providerFilter) - ? (inputs.providerFilter as string[]).filter(Boolean) - : [] - - const conditions = [eq(credential.workspaceId, workspaceId)] - - if (typeFilter !== 'all') { - conditions.push( - eq(credential.type, typeFilter as (typeof credential.type)['enumValues'][number]) - ) - } + const providerFilter = Array.isArray(inputs.providerFilter) + ? (inputs.providerFilter as string[]).filter(Boolean) + : [] + + const conditions = [eq(credential.workspaceId, workspaceId), eq(credential.type, 'oauth')] if (providerFilter.length > 0) { conditions.push(inArray(credential.providerId, providerFilter)) @@ -93,7 +87,6 @@ export class CredentialBlockHandler implements BlockHandler { columns: { id: true, displayName: true, - type: true, providerId: true, }, orderBy: [asc(credential.displayName)], @@ -102,13 +95,11 @@ export class CredentialBlockHandler implements BlockHandler { const credentials = records.map((r) => ({ credentialId: r.id, displayName: r.displayName, - type: r.type, providerId: r.providerId ?? '', })) logger.info('Credential block listed credentials', { count: credentials.length, - typeFilter, providerFilter: providerFilter.length > 0 ? providerFilter : undefined, }) diff --git a/apps/sim/triggers/gmail/poller.ts b/apps/sim/triggers/gmail/poller.ts index ada550c5f34..772e254b93d 100644 --- a/apps/sim/triggers/gmail/poller.ts +++ b/apps/sim/triggers/gmail/poller.ts @@ -53,7 +53,7 @@ export const gmailPollingTrigger: TriggerConfig = { description: 'Choose which Gmail labels to monitor. Leave empty to monitor all emails.', required: false, options: [], // Will be populated dynamically from user's Gmail labels - fetchOptions: async (blockId: string, subBlockId: string) => { + fetchOptions: async (blockId: string) => { const credentialId = useSubBlockStore.getState().getValue(blockId, 'triggerCredentials') as | string | null diff --git a/apps/sim/triggers/imap/poller.ts b/apps/sim/triggers/imap/poller.ts index e4279236f0d..ca4cfd18ab5 100644 --- a/apps/sim/triggers/imap/poller.ts +++ b/apps/sim/triggers/imap/poller.ts @@ -75,7 +75,7 @@ export const imapPollingTrigger: TriggerConfig = { 'Choose which mailbox/folder(s) to monitor for new emails. Leave empty to monitor INBOX.', required: false, options: [], - fetchOptions: async (blockId: string, _subBlockId: string) => { + fetchOptions: async (blockId: string) => { const store = useSubBlockStore.getState() const host = store.getValue(blockId, 'host') as string | null const port = store.getValue(blockId, 'port') as string | null diff --git a/apps/sim/triggers/outlook/poller.ts b/apps/sim/triggers/outlook/poller.ts index bd22d2d13bc..a4af3961576 100644 --- a/apps/sim/triggers/outlook/poller.ts +++ b/apps/sim/triggers/outlook/poller.ts @@ -47,7 +47,7 @@ export const outlookPollingTrigger: TriggerConfig = { description: 'Choose which Outlook folders to monitor. Leave empty to monitor all emails.', required: false, options: [], // Will be populated dynamically - fetchOptions: async (blockId: string, subBlockId: string) => { + fetchOptions: async (blockId: string) => { const credentialId = useSubBlockStore.getState().getValue(blockId, 'triggerCredentials') as | string | null From 20fa02f5569d000d400d94a481b6bbdd2a77de10 Mon Sep 17 00:00:00 2001 From: waleed Date: Thu, 2 Apr 2026 20:08:40 -0700 Subject: [PATCH 5/7] docs(credential): update screenshots --- .../public/static/blocks/credential-loop.png | Bin 63227 -> 64300 bytes apps/docs/public/static/blocks/credential.png | Bin 16837 -> 12753 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/docs/public/static/blocks/credential-loop.png b/apps/docs/public/static/blocks/credential-loop.png index 8211be8be097c23793c550524cde114435525d1b..1da2f8f50887c63a3ba3bee14200dd5caeb1cb7f 100644 GIT binary patch literal 64300 zcmeFZXH-*L*EWoRD1wR=0V(Q1R7#{v$Ad>y1Pf9_#}FW)_b#Gfq1XWFAcrP|780bR zR0&ByAaqb5^dh|m-nBjDzMuO&@%esyvfr))D3;4}3dr~65xgZ#p!~3oAAM9@3xqCS{qu2 zC@~18TmdIvg4IKhry(MS&pb^XbBXE?we528wufyWt-bP8C8KPH_6(`MuOYiRempl} zs_c=?N_>f>L#6={V}-fF#cvb# z;Y#utmrgov7qVX)R$Yu*EZ#RpRI7H`)6ShFZE9u1#H4Kxrd$`Hf89z`li>pRyq95D zhz$cX__PcBaDyMPGOvOe_JDs6gP$wOjDLN*2cFFI*Jmbn=)%j|YS*uWf3+>05eR!1 zYX{e8WtnrJt4^DH`mXw#H{~rI?8MCPJ6IsZJnbBzCJc(6^5CN#!qr^B(++L#BJZhm z`o|UW;4}1V*lB?um$;&oPU~yl7Ep6=MhM7=T@<@`T6v#BpN;?h%Rd_`!k|b0x2gDJo`3unOtkVoMcChqro4}-PUR5;gDS)IE0^zi z?wao36K||jBKy_jtmO4;r}qE4m!s76vg*qVzb(Dr`-Jh~evaSJ(a)dh&+4>fpK~t| z&|50gJ$mIf^Sx(J^f}mw0u_%QEe#N4=Y|rUUfm?$9F31b()^JmWuLr?6+<%L*;6|P zs7}rJOHP{SnD=rBs6JrW#rU5e0{3&AkhM2zj+I6+89H777uaf;egFFLjw#%j0{`DG z|1TXZRa7rf36C*;0X$3p)c4;P2O1u|h{YYBi&Z}I&!hO`%9b(4PZZ^<-SYo9(!Y9B z72UTNj+)P%ko@a6|L|D582!Wq&@+o*+x_Pg|Cd(n?;hm;-#xJXegjOrbZ3?2P4$aY zY8K-yDXlFn3gUH5k;0Y}U(yQD-Gy2uy6^z`4x7l0n`Vn+4xC3KdX!}Py?n12C%L7L ziItzV*bZtNo`{=`;POzWWVvr9TqfM{Xic>rs(q@N@e_-hWeeqz6|*A7c9=8OgdB{h zudmm~+3Mt&RFu|i^k>~RHRTUt+5haAux{h2kFzWk*%q2c^tpeso-El$KsNkm>0M( z6>_O={oh7$Jw9S++%mF%d(+66k;;YX=twh}(DWHb&*|s6rtjmPv2OlEx$xn7DZN2~ z9Sxq=O=qAganj^RyIaOpJv|dty{Dix!&^yY|X!%do6S;JZXC=!)becEPAFdI%zSDPsS9PBBmK=3Wpj@^bnH$w zIf_|AAJc3>%$E-86yY>>y~AoGd>JhocHPuR-HiGUA-TTfhPr2u2}6~z zfupZs6{5O%`nb!S#yAT^j(&boR+uzTyOu*zJk}5{%=KaPW+y(p*j;NDE`u@`?{^&& zwP;IdXh=>8n{Pb0eKcZwoP^ivw%#P7`>or>uFzZZ_IIj+`k18(iPzFhT@C@8y$BDI zEs;a_)a^rElW9J+-!TnuBA!Pi@OaS1ZdrcM)U*icR94Xyg&&GAnIC)W)j6#B(OeC^ z{fW0Jhg`a`v9>AX-+J^*cvzkGSi?IZWW#trUSy1&Pbue%>*D6to{WZ6m2DRh@5yfO z*Cr*mLc8pZwrHP~yjYQ&Ofh+$1=3MKbtAj;^7aUwNV zt2gO`smp6F`CB`*Gnz86Cn1%KA^KQbw`t#=%ha`YINuYSVkHjpW@AC!CAIE(Sf6XZ0{KcW(&K2F;^C@8+0aQa3;rE8BtlqEH>VfF-cjO zPWzK`Qtpb>-NYn?o-SH~dX(T3m(e*T&cPGUlM?l;c6qp(s5d;u@UqHj(OX=!R3Q6Z z?EMEZ->fS2J~c;e7HUz5)jFqcFEgSjwGSJt>YiL5w&-p~BF#u^ZK()~ZQ9&&5RY)2 zxNUSgSDfZ$RFtMi&%1J1qC|1IUZqH4l=(L+L2II4NwcG}kW4gNqGzp`xMy?zTiR;I zjV^iD#Y5Eff=HKas-J5(mW}Gg?}x}S`kgU#0Sfh035k@H`b3fe$Q)j;L%?5GYrZTS#rlR+-ldr^DA?)79OPvcT4)6{*#V$LX z#-wf5$EbvfS9r8mnPmYTSKGts5~R6*S-g<~%SH9t;#6|aeNin^IJSYF{fFjSZz zDW^v?>?#lFib}O0DQTM9YFq2eW-9CE867k5_&%-~`>?09Ybcr5ax{tGVIN$tZjH$U zt(+GtbC!2?y09`~LR%RtT{9_i#-p$N5k_+R`?b)1)KsBE$E#yhr7Dp)8Z2Wpp`z#% zdPY#6NcU7Q=FDWy79|^bmGj^a z*PZ>^J-t*>GQO-}_KH{3q_mx>XoN%W<7Bt~D3<*;)(bu9ipA2giPz)EwF$s8iZ8-6 zzb!n|(Udghf5MKGz1n?AulvLqC%S9;Koz$4{)VttV>0 zx4$OD)w4hHdEDfFo<1X3^l=jjzsr5gDcP32M-n+-hj*8)>mz0Sed>$h7|O9Aq1<)2 z;=oeV7upM4hka3r3*xn2@E5L&tM_dPXY%Ir6gpq)wI8P&{Ur0V8o9RqX1q^lv$bV^ z8s~0G0;Xr-uG_L(!al>r_^8V$|Lxv@op&PU@se;Mz7qIs&$u9R(W^vJ%y)z=z!21KS~$#^reD5 zMXC+!6x7r6;1OJ!^5Kw}kv+8oGIz7J%MTn|yAOp)@tQo<{EJ=FY~}+8&Op0-U}U+B>aX=fZN{Y07q{(*WaUkS_dxm zDo_ahlh{!O?#24erxYZ!*iCxFy%$vdB~8P!CHXQBM%W8eZUs*R*@mvlOx}UO42RMx zdHFAd3Tub>8Qv+X{j$L#Z53;!aG3$SZ!hb}-)zydf@o0k_{esinJUl*b!6=e7 z5%nKgfmPqSzM@;dQb%iy$>eY0u!e43uDvXx4FfOLDVVrRP8NHF_ZOqT$k3fVGrvHm z;rhB911v?Qr77{0T5xSkidt$)N=jrZPo;459+E-!%x;Wm-d#JIO}A`shfx0dV)65* z>N9+Cvx=4HZL%x3-AdFoubYcS#z|i4Wiy21d*|2<59B`Q`$UQI#M5~?hCq8(S3&d) zWp_LXB?B)U%@1`vHgMGV^iOgS)#Q!ck1!np5lb)VhVP&`=!^re`%SY|kj~owaf|n+ zs$GV()oTaojqt~uW&XO$9Q8i~`(gC|FV7hF`>N;O*XV60kcpY@4nD}wcjjv7li=W< zrx<9zvT=%q{`UO%a%ZoFQNq#8gt;EA1J|VKuXEreXQQLE8U-8-^#FIWSYM!a3{LD! znfv+qg`Sj?2;R?g+-0=+DZ6Q8;CVByZ-HKeVX<_Lt0jZcvOe_u<*D~N*%r%_9ezF0 zxh9I6aWp)Ruj-UJE@pm{&64m8p?DZkS%u!fSE&DDib8iJ0*v=`vMpwZja{>+~= zI(yN+??a)hW0G6)9$37Fz?gGmQ#G*i1I?TE?Q|37K;H6;1knAesu@28&@Nuw-E716lVPiNu#LDVt#(;PyjAe9@ADY+E3oZ& z&o{AH`}BzAbXS4XT*Yd=^5(QQ-l1}Rl+UJ2h`ZaZ)410tYUQOm-_yG1oF3~EYQgMJ zIjh#{oXAS6wUT7TwsKnSkz1}Mm@v0b$KmKh>xRVuP83eR8B;hr+Xe1%rV8o5oNZdC z3%Aq3&sA>DE>Ct}P8I^st(27|O3zNrf_B$O@bmL;echvBrfY*H#!5T2Y0B26MVlCQ zcg(D^!OAaQ4dXtRk?3t34^lXB^G}b)Z+6AfnqIgsjC}5|bVq7!bu}nctZ=Y^b%Il` zT`|t99K!^6sBq(&TJALEuUaQM#1_MF%F*&k99{)k*HM4l1*^;T5 zfZpDL<8cm^UaW9f>G-=7O5U#Vj-OZyEb5+hxsa7CC)=}LUdH_T|KMquCnqOQ2Nk|N zqh3#29W;H2WhZLMPy8;y&V(bVm<} zL>s#sw0Cwk$n>I*z`Qo(WrQ z&J@E|FI5F7uYbN3mA}nqy7ntPqw7{O9Gvj>1#(a6?Wghmft}@}(je8Ln!-unw`%ye zIZSDjdc$619}`wM4-d~U@0_RlG``pV<*sQ6OIVw@6<}EEy7n!kVZMQ%zj(kKHL{X? zIp{Pw?@r^~fXbNE{b zfB2m5n8N&0+pTDqPTDK1s^p`bW(v`uCQ|U3%hd@kWc;0|p#*Wut1)-tPa*4MkX%*M z2-tG~NadDO?8<~x20e$v3ane-EywoRWF$0IG&w1*bXmTXiF~!{`9FE30jq1vG z-T7TxE>rnNE1Fld7Z)% zUX#_*&PYUvO908b8R)|l^xWK-%Fg;-K@g`P9!g3P3y|HYyowuUiK`-HUU7>nC3#+h&Xn)# zV@dpb_1#=B4qkagh-v-(!YkX`Z0kun-Jl^pu&$^HpsWx81;^Ttg9 zCbGyarR8>Szf5L~I-l2lRznvV6zNyLwzz?#E@PxH&WiEh1g~Yszr`9zDiVg-j*FZN zv>@HI%f8>wt_`bP8)_5`8eGoxh zI*hy+PfoYP+~-J;aqydh59gN6UXV0e?M5b@Q1ud4?O5AAaS1t)>6-CK|k$g zlCsi*cO+MFB&}jT5sQ`-AnUO-8aRg<}INT}osT$mg(~tuYmi{Ma)4D%#4W z#b!yubO*bkWHq@PBNx79@)@~W`E@tUT6r@DnRuR{H#TkjSQXmK`1{jB^ujZlQdQD9 z;w$WpPSHJlo@NHyvH-@u%eo=KKt%XSUL$gaM>^A%JEMv0Hai=gRZ+tj96T#YgAJ)4 zV~6-`fbC9-zYO1>mg+P%O=RCYMouyJlB=k{F(zV$qUT} zFH72I>qUzD-Qi`!q?q?1C!MbuY{*9IlUk%S!qafC&aQ`2*pESuK04-|Y`?2^H)#Vv z?P8UYG07NQf%ppbRU;u9=1|%0x7yEHwb7B+B&l1qMTM!8ZYX_yzywiD7?xqL!NQTl zwKmQ~>CQLeV{3zpiL143w^WRy*hn#j>$KI_&hqqiLz%sxBPOD!*uNBup-K@%PtS z7x-PuoXZPc?fI-r5;VTp1FtBE_U)fC(IXMe=AN5wS#(z}Gzp(cg2(zb#T4->X!^KYz+bEMjXRx~iPHMOZiINql#2%XjpWj#s5a;@iu1 zq_-r&SBo(iF8rvZ7x0nf25@|t^q7E@k~K^CBf5KnEl_K3yR_z^0C(|Ot$VtU=~<9K zORTEcm^_M-LpfmAQi=9xeFr=o3X{UVOY&UvMf_bY7249_PkvvS_|K6q5@}o~+|x$f zT+-2mmRx6lv8p)oRpMCLijIw4Uu5OTLMa%#f!8P+VG5rM3kwtXUK-b(8Z9iB+s^I5 zxnZIL+1^b~WhhP+$WI-%ODXc`H*&}4Y4{8`abYB_n#b>Px?Ht} zySa2z4bLS2hkg zt6#3sZF4p-gx~)|xfw|NlZ$sx`fM`x&~>XnI#CS(r}|1mne9z_t_tM5$Ms8`5$&C; z5pORvyd1v6lCHY5CI$j@(ogaV>GS!H-#%q#XJ>z|%|EFN((cvWY{%cW_8>~OJs#%c zcKWr?(8mzkLsi8-qPPZPON`}9!yh0X{mgUz!7wHq;=sFKz0ON7clg8La=@w^@2OS) z`Bko0!HL5q=tj>p{z%L6!yn|k@pACf&j+E2YT*LF1oBNgT_*X*O{(R=a=NMd{zC8E z{=>kK%#Sb$ckYJJbpbz`PXQwL|MY|*d;Ov#n^c49wq1L})El9?UX}NP3%uy%}mSTLKkbG}T3kRo(r+JKBY_BAe6bdEyP9R5+m4)(? zDv{q5L1>^~VDVdDzz*$4t`j8+KMu)!Kv;AEl4zWexPJ|eCCa3c55WY43MA zJE&7it?y<2c>*CfZ+sMRdq|A`_-G_msaQAX0<58t^RV=7D@ZQUjBG28c65~)QX zxcPutx04s5yCaoETPV{VKIwV0k;&3Q?d;c~(6)ik2OaOb@Oi$3?3c?vHRBNA;}tNt zIiNRCwTyA7JD(AM7y?E#Zc921)j~Uia=P(_Os^-%aqmT)S6cfTq@h}*E6Bf>!&=X* zKUq3@g*cXD)wluBnbLk2*_F%YQ}xF^l;|3xPGEd%Y+B(PN5YLrj+Ls2>29H4Mnfqg zvV*=ZBBqt)Xj6}VH-y*M_;0ZqVOno5rZjug073;1ACo-ea{j9bSGsP~bT@W5FMx(x zzl3OdR+M=8Rs}Py$2X0p=byLs{3Ws6ElM6mxS_aTi1~{4?me6s)RT?3Oo= zY2d^>&gba~G1`_T0H~N^YYWtCR2Q*5My6H%0and#?}SHiOTS+)zo8HBeyI^@#iihm zMnr=x*K;TnmnSupBOxXWrNENKMi>wPgZxV=)0 z=pN*({Qj6oycsKXUgC=JpUh9XR)S$-op+acNS$4AzwTrOfRlvh07jw`OYXIJ4kS97 zvZ7=QB3A*~Z`OrS0D#1dl5oHW8*&0$HHCafRtu1h*~YgTay`z+o&J_UXC64lT>@`( zmD;QOJI=i?M5%qE@Ot!#i}-NqZ=2mV$$K&jmpj3< zi*btW{s+T#hun;Z6f`Vpc>^*-4BP18!Sz93YV_F)dxUN!_VtA{RfZ4zHv){Kfj5$4 zIZ-7QDV(Ob$?jx#peik>IiQf!VH7NnjCZWM*oUS6jN~^PRPb9sMb9QI(uBS0{oc zo|RoHaLZx--E*;LiTezN{kyFQuV#|GMq|W*oj6yp>&yP$4yj>heruHdU3!e}?qs?P zotJmKNH)k_?qy#Go}_mtPetLaigV$4zV_afNfqTnWOhhtsbtU>)+1+&6ppwp5@jO* zINkvCjInWKftB~!xz7M{Stt@1OW+^_Jg*&>E>Y{S)H|{XAT*$gz04rF#Y-!6>_oGC|gd za`BqXJ{3wF&kx_nymw1Opr)gVy?uXz%|@PX@4)2K7q~B_Kee^4OhzcY2<@VN*F_e) zzdxgiHN=Khih;C00yrm;S%CIb&OVzul4%eacBpWLB^>d{M@=V=&ek$}!0L+R`t}RA zyi-Ki)^}{#@lu(`IdYIYPP;WITmAd~Xof)B!+;fR>u=$tqg+3fg6t*m z^lfq=y`A!B_*M$ZeoJE{=^q%-a5+Bd4l>gj_n$s#JQ&1sJl0x259J@^cdY(*BRT~} z#1gCh^AWW?pyvxgR&j(;E#$z=Q>!ANWebc2xeuio^M#%i@peBWP++{DJut}&MTq*< z5}%aV-^qSsyZ$eoP7_#vu@8^FMttGXH-vU)vfd3Z3_c;@E8%n{)y>NJB!E1&Q_NMqZ5iK~dd*n=#A8RvRD_j%CC<-(csJmpU$@&!K1P=jICtMY~FW zp9Y8W`T8G{45O05W+P*~tHIWSURCHV-=QPKvEt(S_%TJHN+^KZFWbk#zuDDrqeD>^ z`6&^ccuw7jXt%CypMk~1OS2z_EuaGmWJzlu5BhUNn|Ry!M7xDD1acqC%xm?Zq8~#a z+^wZBQ*?>8)Mi=t>=?vR{$^}!Ts|M>5X!EPb#?V!`~FSbe`^im4!1^StDfp)>(v!B z@bS!fcb3VgEt3Pbv5&GK+QNkvKVN$P^Q%T=iF^AtAQgCp5X@0@eVAcPRH3dP@M>296R zDFP~e=K(;(n34!9;c}yIwa)ZA6GRI>pN*?E@tHZc=cJ=*OiJuWhqR*3?ax99M(=5W zCkXGz){Cx|^(bG#19Afip;jnP%ljim|1 z^{;)cU>G3Lh<_{VU}7J&8iTc}w~DjVRrVMq$O3}avrgFL5Jbv=sC>)_A_+3^o!c#% z!BO6kF(1}X)mS_R@E&06XOdPsGU@nORn2|PrWaMf5viTn8B12c%0Sz<%kh46wNYbvS=UEp z)^}%GA8Cwi0>a|Rwu&PHEfD}Cpp9E`@B8PVmLpRzQ0<_S)Y+SFTl%Q+;@-nyvh~-6 z5{{~D&qoXc%FL^LtqvxJ)o=iO=iR*2VT1EQ6ez3mpMP#z3m9MHPh=zR55m;R?7Z;e ziWxiV8&qzI6-K)kr4oIRgsk2E9-<<$3uO|}!0Qou{q@swsHz<@!mEq&Z*>*ANz(D1}2K@IRI;S*H9hDx& zySq!l?Ql9b6Xd0#EO_!fhL?O%DhaHy5wZLC5@tsP>yR#wjpZ0nFK{KT)e2bvWq=b% z@}xT_(VHc{^AMp9n8SN6*ZTUNfCzmf4B(HOM2r*%o%6D#iWvwSzRW(5m){27w8+OF zwP$fXcip$6DW_*8YTGW4#{PsK>^F*-IsYz3+BEK|n)9(f` zh+80AyFg&sncLZRPz2FDN*b3klh^U~AOM%j!O&3K$GPdn8{hNxzd=RiHTpc_id!-Wwz@U@rvN>kPNiPzDJ~P(Q5?Rtm+O#bC5S}@6p+a ze>7ey1krMIp!EMw`%*o&H{SKj_4!@^q=3!hfae944fWB0 zSIv!27u&@seHwVdmpo~7b1VT?NQzns*xo$p5r6>rV8}chDY?11Qcj)59(BMam+87_ zM2Q$oVSx+bu+{|bDE65jy|q+L+6SN>#oY3RCYjCeB#%nT1IlY(PXNtEbDS&;I)|h} zupxZj){r>L2}q0@cI`RI5r;0keiCr|1>Vb(y1j(_Wu(fcL3V?)?xecPM(bNCo4WwK zJU2>C;^#E=b=m@u0xEY0Kt~D(6u(!0i3W+YI;pt=h?Zg_#_GYTa|Gty`uqmZL6t4X z@-d}38>|W{0T2U>3CFu2bY*L89wNw#ytViMvn@$3@-A0UP{QIAY)N#JwT+u!bFidm z(UnVS)Qtezl&K})tDTz8XVeOtt~V7r089iFNOAxU&=Zor@Ogd>)W=$B#?e5i09#&+ z_oa^ASO)+PU#~-z-+k5CU8M9ldv1QaeWt=xAdv}&Fl^^2G)q2LV;g zm#3hky^+HUKt9jdt$}jh+r$hEJ+xw_2UQX5G6;?(gHK({2kfg4NWx_q$XRq3W^OM; zviW}x;?L<=iyPb;ZH!6fvLBVGi6qOto`Dd|A?Z9XqM_tHey@?2YpVe}tGFKPnHr!L z;aY$H#^~3zAKW;kx>EPAq(;G;#vlP*;%fO=-2sJZj&A=n7zD~p^hUw$4HAXR$jY0w znzH@(Y$PCT{_w`=JcQ2_^xBt6^J6bRP$lmj3GFaCtjN?U63LazRWw?usN3BssTT^| z#hc&h>dXWAjx`!&MZS{McH#PJB;(om;?#VL+QCRi$%tD(DKpv}a|Eb4v+lv>0=9^g=a(+d4n^RG?k( zt5Bv&-oxHE>no&gy&fpLl@w?aG>_vO4f>bFk-2LI<32W3iFBw6h86p-1$ zewNZ_VKgZfev+D`0ZoY{Aeu`_->k-)a9dkDW0mE%s28w)f!^h4VQ_PD7pkUBht zphKsTm+JL^ULFFYnxZV5Ys!ilXEkHnPZsH3*a3U} zIZ!)REm1wHHjO6;qj3&=AYRr>dj=rdjcdt=Kdg*Wr+lzZcJzg<-iBWxEzalHLJbtS z!;h3GluxPjQ7)9DmE1!{Phi>!28F-?z8mJnit?NUK8r?Vic$?ut+xdsieR=C~_ z_Ftl5rUUi~xhI>E82}1D1rXt$$hK0W;>t>8JaAHPW$X;^G4{Cee6Ey2h(XfCVgqEq zi|<)TEzfe0@1%D6&6|dIvj2J)fDJY^>X7~GdV1!dnjE`ZVr_aRS-K&KY%wz~-yOZe z7-Q?+F3ZSV3In;|hJM1^;pDafra&bSM231~Ow{+Y8_G zoha){Z?1mC1f?K?pQ%ic{OJu(RD;NJm+#_!x(GOgcLdIYJC-?&-TdhdS@Hph#W3ir zMo+lGqYd^jLfpC~In3*NClDm47Vlmd)7kE`&D#s_ZF35xH-qEifnJNFk@-4bdn|wF zKCPM@&Ac#nuX15b*C#EdA}E|bDC2#@3}6D{ej7_Cq;2o9b4mQ35!-P9%(b_X0J4Y# zWYSP4zjgH_hFku#Cjg_2*mvJi90=n1?6jea#)Tn{JhFW1r?LI*HV7Z6^ppR2NM_0k zIPx00wIC8aV|v?*fQh9$B$4QEcnB8K1Ea5e zvG|i~K-d=vMxQrg98J$u zewb_QaRAXS&9r&_?1s!6H$X6^w~(vx)A(Bxm_BM_WkT_%qxXYU7Q$YgfJLuChBJ$x^2o41ZyPJ(o9OnP_H{Fbdhpr6w!gI(hJv3us}=tt9mljn z-|FRsUj(Yd&CQU#wvZoi zSf>m2L0WY3?mupE8_HP!XJ9{U`TyvQo$zElqaGd#sVT%j`Ne`a*=OL$a6`nLR4pRf z_&7wiYtUAKh;<&sF!^m`?rB4Sm_H7k=c$#INXtmF{|fe{rS4viOyj^rTGs8d1K#vY z!LJ0KiBSAeMF1onM=XE{_Iba1zo?eteC>yg$?Rc4nAi0T?^k0=t0iPnw^g8_?E>Oq zc{daFNQr8{j%qkc*SPCy<|2h^lPqv->HDQ+kkOYGh1X4%Eq z0RdOrKEH?1vCm{v){#&O6nnGm=e}oE1f?2IUoY>ehaR_Z4q`i#!aP1bVs)xLq@Hu^ zVIm+f=b=mtLaa@u^hmKv6Sc30-dcuF;850Y83GeIt;g5T;^^0GS;GaQsdm=ZPeAN0 zS_xojDZQ;P(UnJ`bTO1yK}KRJ9)v6LZWMzb2@$9?gi=z(=#(Ci`Hs5u^mtBam~ul* zrA6(NLr}rc2e5F2G3W&@-@nxiwR|qdc4&h;#yv{^1lR+bJ`1g~(0B%-l^f2+p$~%~I(%m% zZ|51C*arbnoUAt)FsYsNY$~s+GISl(kQh#vw~-FH9lE7Be}(l0viWVRZZy!-Cm&(7 z!n-qGr(5fsJjU$2J}3f(-W1dlq|bry0Z=q^dj$l0u)tA}IvsU$bDOW1tt?>9pGxSm zPzUuDm#o%eK8}ohemx9CMdrREXZX+KBwYJ|%E+SW&3UIOOmThs8ClU&QxNeD3L(z9 zNpukzq^9m?#+oCe#z1w_%UxE%AG~IlCfYQ5K^7=Wm$@c33an||^n7)T zBqP@~s|jme>c5i^5cuCn4G|`L5jk*}g>aAZ)RP;4+A#h^U{~@Ov|GIdWGn=BGCQy2 zFT~rj8p=t_Da%_j7XFqU-O}S7Bf^(*brtflxUNpI+*3kz66n|7lmbge~2;vbonSTak zPD~fd07Jqr!A|_r(zSfeYW%Dkp`_%EbJ|FAXA~9al&rVknmh54lcfn;UW)`DQV|jH zS~8h*`x0`^>Iv;J%s+)WFYOhKd9SMmV2t}MTn^J+TI0ZYxmYSdUPQ_FAx_XTC6a;cTTSU#%Dy(Vod&eXxGUaNH5RW zcF^}LQ{;sNe=>tS)3k4to!6*cn+tq!A*$GQ!}k~~hqZC?RMpj1Z-o{5F|xei3j%di z@~X?zUZdleqI-$2$TGwilF`LPgB;lbPfLTzRluJ(Z2{R^1XS)w?auPj@}VjWu4_#L z--h7oH!Af2Wh2zSc!c*SR-syu_!_ME0bltHXd%l*%7B#ac9b;9AVqFUGN?2DjyI?X z%XQ1*r;V!%u5I;=fr6=8dmxmf8e~Fp7O0L9Q)*1R2=e&G7;MSCd8q8Fks1^MiaiRq zzJoeUy(oDS*GIWT$TJ$-Dl<(hdH|OZe#5LByw6Jvmm&e_cebWF&rnpX4$@mb)nq;9 z0Z=m-g-jSdTnte%UL74Bbvk;+$JWc+M7XT2zRJ5#cR_rn#_hL+RsU&Ae&L42^>iSy z^dir&J5+5i=QV)0iVcNIlFnU5Df6$yyO2KD%%{s%oKN%|dg=)K4Fqq{HPWGo2F@WMNe& zj#^g0!jLOgNiI=n>UvH|ks~SDt|U*=4yP;B0Hld4m|q`M2ZPXFw(mATlm9VFHLGSr zU+a?pI?n(g3M^3P=61s~hUr}VCk&qk!d}?2aoo?-lVcz~nZ~ryt-kru*~VRvopjm@H~*4XmeCm-3tsmpYL7wMPCMKE0X9OAmX`1(#N@etS>J|K}l2f4y%-mOg)4k16>c| zR{(IlKc-*mYSWygqN1Cl-)hhQ7&EhQ>Ccdk{g=QyWhc4eCl}IBR5U!_^Cdql^3NH% zXtvvGXBjC@?ToH{m35F^pNR>i=+*Vd8BD2&R_7N=l8FGfqDX{Sbu4;pi`=5W~^W#AjCi6|BB8?PDVs$KODz>I_@^K|VgUv(wzEE40qRP3L>J2G{C5C+lHS zcIyGpda4Llf!&zy`|Blv_MC-U+X|$iy63%^F#%vk?=K55bvC#4Y<8bTV}ccMhc;h) zn{0e}#`3kM%=uF&mLs2@hIuj>fwCSx&PLM{SzBKkfi%zp#H=&hQFkIdRD+~p7tz^D z78$bsg2DEc#$1H*DpQ_C`zjF@(F9}VJn$mIErSU%A-1aHFZBewW8l_K@W#f*=uUvX zlJBpfa$5=F7M*9FHJ5KXgg5vvm=>T{w3&>Wz5`Qf@e3q9!u%kf<76R!ZjjOr^s6a_;#}#^pUPEs3aWg6PF}zfsA}QGx#IGyi(y70`J_ znkEwjMM7kW?_)jsLo5f9+#@gpo(7>kw8k#;#(dB5fI%+d<^Z$0#C+e|qlpOF^Zr5w+$sXYrQZ+lXZ-k89Dv@y*C_h|y08kDKvgd^*O=KI8N7cgiYkK^>lMD}KZk_Ij-Zx2# zm!smWHvHym1smS?fNsbi@ z2J{(#(gs~st8z4QJuL}!R8I1){eFnays^IPx4@67LiM$&112Qzjo64QHP6yr_P3G2-BX;mo+JJJFLQnQeOTr2au7Gl&vWB%Kra6f0L*xHmB3)) z_R}Bq%RQaElu@QDHIO^XFW9}ndGolml8a0G_#MRgt}s8p&TRWY;=xNzuov>#WQx{W`On5 zta@y~4+ugVY&a7zka05OI^pbk#M$-5+oxLYnoXPR=qi)ex_483e%Z;%X|}aCApfm| zs;=f}tYRC5p(vfd-K^SvCowL*v+7X~>i*vReM>8hbeia(96j z@_pAA3gf@4@>V(J!CEd_7@;McI-Skx+I^b#aR4cfVbwdOzdK>N0X#yQMs)ob^|^Dy z1Fj962Que*ME*AERWOhJF4<49;GH~>21~kCF9AT=B8i!% zCBJ}r1%I}$V0%|QEfZjCIfjZ9A&hk z4F$kkErEaoqbji@8mC?`?mtt1^ofop8AWtp3((!Dgb=_VBg@>IV~D#jN!da@&aeMw zDI8M%*9iiMSRHVxI3ECJL%rXjJN4jWzrc3u+jO~$q{zA3(JN}x{WS-JGt%6nc?e;BhWt%yf z-V-G?yTn(#8tRiZW$dt8(!7}+KCgm(DtAUleG2PRkoS&cSGrzKPGNJ?;WYyq2TRMP zt{}^`C&uqm%+&%ibDvTPiBESg&V`q__;XIt$OHzg^pAH>jq@{xfxVDkR(?*V+qpB7 zU&5k>r9&#nVmy@NJ99Z=RaNgeymZ#aM1HoSW(O|xNOusn2I zrP2`%PS`>3<@a{#4*joBjw$nR!kbGMn>-hKB8ugvX9r%Rzkg2hQ=Hr*UB8mIc~>g5 zFNcV_1f1t5%4DUAAEgXaEO!P!u!5;@rX3TuYB&;Md{{DZqHJ(`A~MkC4YZUjp{lg6 z=HlB=u$EijkjqVPqsiWi>9mDK@m2c(-Iaa$SO4~Uf4JC4)^_Q<^p@?^{Pg~z_*QP6UYo8m;;~#+!s9M5IhYPakNUK2d@u94RfzLi9W>&m z?SS_~`yTD+X_yyE2_8_mdyM(Yv;A!6-o49AerLwnp3TX&!V)!w^SJXdS5IW`v)ybm z`42K5!1giTRSRihe011wU_I&Llohrc{V9EiH1>LWx*7P%N^IO?zfrjigSB)6_!Z{8 z_~S3xB6Vb?VJMNYQzAO=-{H`1NjiB>M!F$=bKqI+oW3eWy=ZA?D;?cZGp|xmW!fun z`}FRmRf+6EAK9AERtW8rlxVSp`6PvTn=-pO$}--gx85khq?t(4_p73ty zOM#u;P4}`aaS@e`?~9eXx4jFI-g}0Iat7vi7AU4@M0Q89QWo59W~3Nh7k!IazRR}d zTyNo5q{Fp7TiwNcY(*%E8NS#yg&$f}H%@rJC&?^~e6JpPq_@H?6|+9?23K-=YLAuxON12}zyewa%J~>RO3(VYJ(1d)d?CSV4q&4^Vt}3OklJ-Y@DaPceEN9um~L;lq4$2`{?v^?bfs=J^Wqj1;d#$n{XUnsAQQ?uVnpMvZ0JR zo%=Lbo%T9+m6Vr~U1hnfsBzMzELv2tS1DptZ{h~-rb$Q7O8%E)*}b{M>-eQq9}zE# ztZu<|A%(Bgo1&k6i1us4k{Z1glCfvAUhiSt*+PjQ1M!6(b0+XIcZ^+s zsr0RI&D7mzZWp{;jri7s6IE8epNPS*+12oj8OEdL9!FuR8fvelL@{-s}bYU zc&Ck!KYRRPWgLx`yJ$Xl(xSG{dsXkU@7_s^lYaf`6)15kTeJKAgn@Cd07rtVk?(nJ z0c^NzG=h3u-LNOIA3s~%8ki87l4Ul9r()4*oaG|MS-~CSj#q=tQ0wxdn4w*~#x3?U zd8z2mD4gy9&kemaXMz~T`D-@5pUq#CX7*%t%NmyNhGomNk5y>Zuokhy?z{)-N@^PO0Wg!|pAnX!?1b^hF{>4j814vg($RvI?v(Ov=PcRkc#`Hc9TY zMx4va_pU(RMl|_XGk4UY^Twx=-m6FsV>L=^2nF+%B`Z1Q>lv%bw&&@5jNhC8od+%Zhxol^f zWs2Fv@RD4K#mdT3h}6^lkv^fvSOwZM`1LA|Zp;(v{IwrzR_#koo}3pO8naN%x-Xgg zy^P)d3#Vz3>@k()c(2T^`5V()mu`qU=y3{i$&d+MCAQJ6W1e?UE)J_a91_uZ?DJLX zcF*a(EPFjL7Z8 z;X_yx5ki7|q!8w6@2%VKSZYe^t=TfQruhxa=fbQrG`GPi@&3$aQ|F3M^1Oh0Oa>63Ch6yNiSpuCW~_qKA;>lglNi8!6fqycN@ z_K7*`?^j-bb2TVRDHK?%czsB7zuIi>sSVaQVkM%h9Af0?LBUR9SRNsU#pofX=~Ny= zS-(>;Tkj~=#IZy0>k!|~s=XV}4ozf}gKJ`p_Hp>mc5@23CY`GyVvVDtD?a9{Cz69)% zz4rd7L)w>1Cd0GV5!cyElLGde%uhN`r4A2x6UJ_a7(6RyG`Rd(xa*bWSx0pE?8W|g zccX(GewM)ju-+mB&16wzbB9f9$l-Pau5SmJ{ydLQAa*cx>P2SE-^f*dOPU;i+mZQl zZprkp&YY-@?2NTPq2tgij{h9%e??vSg!b*+N3ySkk#zEA^(n*QUy0Wn=p62KyBj+; zFs9ht(`9B5i#BdLm17>vqSqz7=w-OxQN=1Y9i818Y(Sd#a>LTw^|9wubu8Q7mCKx= zlP-&P4RvC}zxeoWn5Ckh;Sd#LQ@$8l_cpU-=&+!|;?-&Kv60<)3q_j~C)&>IM@CtQ z<-ZN%aqx1pdsR$cWazmjC6+al;x_)7QnMWOJ)4h_zs1S9;EiqS5Ju3eYMbt>WRrji zBF48!-YJhh-gR@2b(fKh`JHGokz(#mu&g;#_OaF3zM3V(YZg`UhxOrdqht7?GF=<@ z;>P-unf-X7yY5+5Opi8c9u(YdS8vh(qWRX+ovlbp>$e>$C~EtGKmJ@FoHer6bN2q* z4DQBdv&A{z0EWmMsjdXu;;2_;T_QRoXQloVa{i1vwEqm=l^We#S0fk3d_t|EW%0HS5hwXZYN4ypDaHa-lnF&%j2O-v{~cN+i=6`jW0Cb zO8ao8MJXoZ6Ln@M;ab~;fZ9EA)E=>J+c6aS$R||AC1+3GXc4EmNgVLZFt`A|+Wk5_ zh6JCY`i?9u%j?n6&4KI2k_%HiokxcUqprDf)ng3PuUmB$TrXg8sXuU$Ot$^JJjzg+ z34#^_VSbll0~NcD6C3jZ!3T%jvWJaRGi#>^?A^PY28a${hi|p2eI9M5EQDth7Bogm z%xoiTT{Fju8TFYROf13%BTc)WhD^N*Rjjyc8{m4A8$vy!Q?O=>lhZ5CaPiLBkRc9f zXhh~W#7Y?k?&9bkNL7usX-QRE9KO@TYVZE-WiQBR>?b=5@+P|qyS{|T#hs{me?6%_ zTCA|#d!-ZT4t9V~Nc8l8+@B6G<}ckoG(#)myQr2Fz#@oN`u!zOnW6HW2Pu9EX z2h*v&q$c45SPO^Zg(qvqTXO=Qww5Lg)MlNuEt8+$i|_kl&{bxiRJgIVi!{fmi+;C* z!62Gbozk6y`Xhxu%Cdxbv{-W4=PhT7cyHY~27y;a$1gqW&6lh(y1LDH{?YYEM)NB0 zaM`xC)PIeNZ#zGdLT$|G-Cf_xC{gW}X>2FOOxG*M@BGsCDM_>mGpe&VJklfW`xK3J z3T>Tm!<^C$z%T?7mUP6tSTjf+W?i)sDg5JGmb*tVZfg02-cvQG{_yz=#$CDMGS4$? zwaQKS90a~$eg1rWxEGMb?8N*n7RVvwXS; zUBp}A$38hshR^eri1N?O%Nv-*3$Ivpm_`m`hytw6sUmZTl5NIeKAHLowaVpw%AbD@Bw;^PAieR64tN_vx$H&Mpl z^F=DI6;*UbXV0A|Jn+o+b0J%|uWyHMx2{!s1W)J7zAw0P{fQ6z zpM1vdL!d%WOK7#0{jkE=4vlrUgY*};vS8iMPCxJ;qf@Gnl)rVWRK&hhxGNSqVdgwM zJSjEQ%V8O@ne~S@R^fs05$@V%qEoFZdAjnQZ&}Z}n9#(IqD5+lrBKeuuJoofYW+*)2}Zm|9Ld_@cVj!M4UF#m;nIV}tb;*rQHDpY&CB z`7&<}j$%#LI%|oPstv1KmrHLVUXp=2A|VIG-I!sHLo6 zG!pWUIB;#h`X-x|jEXZ3_im_k_R3)IwP$AVT_jr6`)7)l%y$&*aT@u<{!>mJ+c@!5 z=vvuv$!!b-Dr5EmPgTXCDDF{0CUuRcr0|%Rg6xTDwSCm+8U&yue-s@R^&K8#HcoK; z`niWvdh_~(JNB5D@0H7O>e3)pNm=UD1}(|eEn9cK-+d7p#A?Ql^S2pga{%TqA#K^V z%SAuD*0cE(2_?)zwnffeM%Pjg{e}1)o3qDhf0T*q2y@yoLN-%6&|Nezh zS@qFWNJ4Iy$fq2kkT*RY%$=sOg#juQ>4KiWlJ! z-|F8y0A+_Chm>1BIE@v}?$U*P=OLTO;l?PAy%`Q z4Ev%BP8fwD3`fYf%Yh|+&wUE%J_8y=mw4ah0}Sg%-zKcD-Mw>%Zqa3eLYUHsC&x;< z=Jxq+$YezOez*H7a+6j({wJsX`HFidEFFCnn)`xx(WIrId|P77!;M;Y$?uc(Zax*Y zZU$u3!hn)tnV@k}-OT-P1=IF%Wn_EQ48o-YB%~$Qn_emkJY2*l1 zt!EAS`lOp$#oe?F@Sa1?gVQmF_Ae(~b@Vm$96MIB`mJsY&Jx}1ltminZA%3$OApP0 z_;tC#OrV-h#>&!2yaSjpWx;l@^C#=h3m*kZ^lf7<12S5eZWhElPrfW!int^P?9$Ni z&Ct!B3SYVl+mcCavv0c@QYGmmD&MB!&3`{Z&=Oa&rNYEgs}Z$=0h+YP>d!b;>5&sh3$E;tvR$GdKn zweIG=Q;-j>kFR}=cB6teXxw3!G;bQ4flCZ1X1kW>Cs;^4RnBtz+D%zkJ)2JpmQaO! zpV6D(%ZJ_2yLCFUz+!uc9T__SbU1qLruom)Dt@=`p5skmKO#&OPadT&l1QKZD!eQG zne45Zk1t3438>ut@8l;SHjQGtcO=Bc@^W}=Y>a_iqM#5~Ujc$boEC0)mh z64zTw2W|*o^R||lE}cE6t6wnQN)2GgIwqaF0$PR^H$s2jF@Ac!Jv3nUzjiz7BBW58 zD_N?mh}I_WLW>QOFPEM)DXpswMfVp(sYJ)w(6db5s6z5371*?jm)tO8R_=LX`7D(> zBV=|px@o-2b*j6=H2>|}x36y$-R)2Gud;8GRO!yLV`YfYtMKuj=o6G_%=k#AiED^1 zW17?5_;&CP9`;XQU=z-f^GTO@k4co*l1p-FvaT$KFK_Q*=`+JSOhpJr|RZW%)HNs{gS!VW01m( zE-$aleZDnSJ=q<4KQdnNEXD1TlLomZW68)_sN2yeCV0JfVzz;KI%#FCX}SyY%$8L9 z!Cax@Y??VeS#pBE!*bB+ASSS+ zvEyQ^fY92iuokdQi5WFT)bg^uSnS(acQ@0!fD{jt7z}C)Y*Cdu=`At32$_%#*sUiJ zjEbA zqR|YuD2-DJq75na=a%`k{j_JJZB<)&=wcwX^m@#C8qww`Ybxn&hx@!Tq8cDVjbeR>9b*0VLqhMbWAOnU_= zPjDk@vP;*@BwQ*PzuR~ihdpE$BMC;`p5U3#nSfr;{KzBprZX-c)#4A)rP=w|o=(%9 z(lmWN4s&v}&K}d2G3d5k+gl^+iarC`16j zMNypTB}u_G`_@xLq=v9`4kA@z$Lr-P6w7(vHH(Abi8dB&qJtlnWE3zg#ESHcwm``v zmS2j`G3eJ7|`@U3u6$|$EGK-a1& zKt|tP`kf(YrVm=bg7Fi$AxC=DZWGV3WTIImg5~*64mS^Q=Vx`pYm{B+FODDDr?)3R z!Jc$*T{_K>c!yEQ_TJ}yGus(i8-eE2Z;TxnTK_OQSCP4^H~iU$P>$=*CE>WbL{ zwFB^03r@Fo^Zl#(q3|bN8TD?w?>Q-5&G~WQeuhL&gYJ>M_EN5?_1=rjoucI5h1%Wk z={K|3)dvS$&-2)k*~fC;zBm7Yn6%kD^S#l+s_`Mha$5+^XdU9@$~hubkF;qTSM-zD z(M7{iwusr+*Poj)bg`#r8dfx9pciw|WeXv410F5AOP&M;=x8rk>F8@GPPE3A-_d!j zgVSR$H)>QoYmE8I%YH?%YKQIUMNB=fy7$M^HB2rn60&f!)YFjuTL?*(lLd>GitaGx zc(=e#MTKG8G!Jjl>+4rBp4(WwDa(pg&4MPS?Y=g+%=Xu8&SFQFjvTS}SZQnqI#DAU zi*@mJ+{R#`_OtKz>+zD1LqF&nbj_S4(bpU~T;GQY-sf)Em&a!iJUmv3MoTX||3>-p zmTqM(&v$q$LznzP!YcNSJ1!gquY06`0gE87Au+Z#?Ftpr8>_SHSHnY4!lcg_3T=)P z>-bpk7d5%1Pr{+ua#r|w9=yGb=iGbs3i~eNnCU?)JzLy^geVakgHiR$+CP?8XUUTg ziF&dnG+UaP9;ym1f0ov4a(w8MfQ~GWvUU5ErXlJ+Wz-`27hrr1*Ds;F_8L!7TwZ$V z%R12~(2J?Oz#j9kJGk3nZ79MNA+?RHmKBy5??Bq4RH^QJuni6q{n1mikTdUm(A|%H zjLMHIZ!ECYrLUJi2yPk);VJY9{}a<`kBWLb^1a$GA$c1pYc(*zIqwHP3QNo zU$$&+0TOJNaOPKFJ$0W7)-}0_X|E~+XYCZycr@ZQI6}IwaN{pd%vZb7vLxUvi-LqL z$NpNOrYROL69(J06NZO;Dc{)^F_?JFL;NfF`;qEvu_Vw&v+9U51&`3M_9`-&Y_DT$H`z1e(hi8Kl0mn{|B@u_P@hxUR=p{Y!WD0BDzxMi|A}SUOW(s zkM2nQLhMj`MvrYUWvKD0Vi0S8rY0RJOU+(1E(|DP5F4BX_ZfQ_Or{E4=tCV^PfBLxd9g?xTn(Gw^1_d|7WbgVsN{{l-!RruE*yA~w#YP*m@f&n;EA(K| zbRot3!J7TQoSV<-{HG7t8 zCo-2^es3W-_onbs2Q$5^zE$Nl6WdIuh1{8n7zCoo^I*T1qbyK-G)J;zeJk(QldDh% z30PByi9LnA4mI(Cq8@4H91ifWWu=r`>n6CuDZKz&23ZhQK3e$f`W8OgD(>Y?*oj6O zp@m%>^E(K4?B|0 zFkyDnHx1yOVOdVLE~*XVEqvt`Sbh+z6_?#rz}Jzo(Rs$Q=1It~Jo=PI)#2r{)oT)d z0dw|!uM9FB>E59r+5Un3sIF)t9 zfAZobH|LNGnMDp3VWKjbW7So81W%t5P25erumQH;DS-(NOC}5n=Gj^(EmpU!SvE^ovfZ`dC~!O z_eO`?k<+J7AMca6=EcQJi=>Jd>t}k5A>_n;k#Om{dhLx=`bP`DtMF^sXXO&*QcWZY1d zQ=8Y{k2RUOxb~sm%JSvHpO^AK@m}5sb?Skmk4?>}US-vCb=svaD5Z}%e2kVib@T2n zGS_rNw?F#x+sotVUuGHFN$DuMf2qxUng6_@gETbFiCSG9`>{F@OfTR{zxy2jvd81^ zZnioTjRJHR&(y56W+Cg5)%du+*oSm=iM_a2tWavIv!L>+j&Dp?PX{B^g7+f*0vIi~ z4?K6;@1bzhRp#08^5@edM2q>p@ZA29TXI;F1L_+-O{>|BbG^bxV|qYDk^I7)?xjEy5%=~2{(zhH)rj`PU?y(ocK}~ny0y=^<%T}Cx;sW z_8l^p;+B%pQJxQ4#aBzI8Sm^?YRR0B^bL_cjkKcUM2zFPv+lRQ{EY1#sJFVAL*vi{ zscc@L)~fq<5$%bvS9VT#{M=$(>NjXXzsWZH!R~se{prHija<#cIbGo=Z+`gvrA~h> zfaOll!Mdw))#Eg_8p1575)MbllL3UMtOuSbkA`!pg(5z`^?KM3R?9 zefr~6Cx`t)jx#^z!`v-tp}=!L%XV%XfTn^wnd<`A1@xsqY7#%@zf;+!zx3^)h0oi; zK~wwc<~IAfVY#clq6~kPG>WIT0bDY>KJ)6uTaNT)&v!)#REL`oRjez|BUBzEN z8Qwjn4tUFs($SdT*Gs?rG__(=C1p+QCG!9I$#7lVIQTxw{fZ-@zdc)i`9fwJu-B(5 z4xRj;!1Q11DZhh>+ZaJEJ|BC-$S9_|W}lXz221QS#Z9=Kh*gG%%=go-nQPS9{>EFEV%@zO8D0kXaApMuy3k!-CAnW3+F+n;q9v;$D+-$bg54 zSk45RqV_8pIn|v%mzm3R^ZLf_GG>v#zf&{qL7mlo1D#=eNEfPC`6Xx|JC`j^2vh6W za)}~s_mxglOUu43%UJK1Z)mn-#}4ja{{HyLW`BajXI{@RXz*Bchw0B{vCCZ8glpe% zYNsBRKiF0o&ZVKe+#(aB2HLa!=K{V@^eb0N{PkbixB2+&$NT$T|GvO~*&#S@xIZ^} ze)-*h*(Jrhx!R-Xh24HzO#NdAZYO?Y`{lm=c{^qZb z>EXr}%UiJg+>t---hZ!^pBZ2FzrFYOb#sBkkfAf~oxm?o<=?CEk5`pCCO<>?Z?5dG zwUrm3yF7B0(~aj40s#3u824oO?6?a5v18R>1ZoGI{a3~%Zp=4v(C6y_G|>()Y{hk> z%gZ}lrh9v$MD1;$1c-y=PDc3=Af5&=KXDR-i63)SGer;FnyGYyj+7w)kM{6}DD*m` zC0#QnyNl201imN6f~2mGl8aF;0lTF<0{a9C`i}(w+0~bCta~Y|sy-qu^_F=72Gm1^ znSX^~Dymq<$^7qoo0}Wf8hOn0UWj4&t(zr-PnC@lj^{_ilT!eWXPqE`-cL$@FD(aU zJoQ_hU?Dv1UB>P`=xfU=N>%hUKU+$Uxxxxq3E6{-r#WABO-&bQ&rb>nG-Q=8+eFKF zxwU()lxVJbfQD2h`&Iu9fVtYClBGhIE{80)A?=|RcQPI{+B#65NZZP3R-tBSiu#mU z8c=owU7tg+ZOa10Ca{=YdOOiFVPMCK7D&k^wwKPWo2b&tLW#? ztvA3m%&KC28E@=V%}fElZp0;V&;gwzG$r_KQNDQbePa#5u&@(uLcBSLT2O_&st~_7 z1B04T$`#g@$DJKv(0O`?Y2YncfNsJmq{rF|I|^7PbP?L>Q8dCtUFJd|OKVN$Eimz7 zZ(;oRxPbdCAfHoEWIAvlrtj=Fj=_NGPo+-<%jd3gHL`WT^+(cE@!91!6z=erv@#mR zxtqx0HIhhWYYSc2=;0vkB~bTMp*KKuouDAazJx>TU2mfORTBHS3si1I$ANPZm+%AL z=un>aR5i|M;p4wxt#Y%7!_q_$CL z7<}|q;XZ?|Lf}UWGN{-vns0;x7ka{TfjVYV<2emh%qJs>_(uVKvVeIJu(2dJ!0g(= zy!IOOb{^FO59#CvDDZPZYTE@Z#24dkAXR>j^-DpVB6*RiY7fKF0N?_{GrP2=KeTO~1YzHb^r#E?y58Fz#ePW|G(_?jN6@ z#+g4pvSiKO&+bs#B)dAJu+o2<(WnJwu(CGSmj|;Y31tvR))T8_$KO2y&)Rnq+=gy2 zOk*K_W3>ju6WD_b`}deRm;_<})>{E;pbfN*Ctl?00#QU~2-+oL_1pB*Va()wp>3Oh z;Als)Fx{&F6|}t4**!>IrkCT*$-y#9gU?tIS*SSS>&^_0gf&!T1*%c!{mS^JI zHz#(P%=6ou&2$3ydE=z16UpG_EdkWw3~nzGO$~Lx`5AOlRXJ?Ci(Z{H$mdo!u4H9M zCEXahEcP-ZcaG#fJvCffy4dSwyeSO=xByrFwGVr}zE-mspHez|g<-Zc%UEgxP7^M6 zRR+GsjGbDTW*%r2hx)$&YY?K?BBq*WyEFJDw}TbqbqL(AXieWKrAQalt{&(`<7BsP z(_af)Tb_5e=e3=p@m>^4$Lky!w&A&+1^A$K;!TA&h5@;>11+6EzZPESBnzDsaLMfF zMw{qxx6;lnr?rJ-;mcR2Tk#PkCO|?gq_r(EH+b7K*irc^n=jONjaxYdN*zP)M29A` zrH^{=Gng}IR-r>-dA+pHnwPz6E!@0iYtc^I$)pDcNZaY+m4i}wi;-E8;KTVIsU{Lr zIP8y>SJ8$yYOmvP;F9*`}A-+$VgLwN!!Gb528J*q~Za2>u%p&WWdja z++3FGQWfH#Nz#y?*6sP;&)8nHYBr`$ z5=R=2v>|G>(f5ay)frasd)XQ_7NQUY-erV-Wi*(5l=wXs>d*#UV3^3`_t~m3BMTwO ziz*7(j|^EQvGIBUm@JSs)}|HDB4|QIl=?Kb_l5T)mDB0?DVyHnOZdWQk-0Ml%yBu@Ig%lA(%<^hm@ z#RM{rtQ|e~5)w1lUThix0#&BLybV_TT8~)*SGK?C#`E7-6HqpH`D1Lm5(>vCwrj2C3d(b74#608OM2*Lr3Pvd*T`InRrl)Bk6PBSv+TuW+ z@lR)S6F1V}GEnUJirR@!Q)Am|bdZTIC`kS;in*KNGD?;=&roi;TQj9l)+=Ztq(Ln{ zdD$?Dd7|H2P# z4RWwY?4GpjEvsCpTiZWR<@RFJskfDi&c$1;)-z2jdV!Onq!p0quM!ogrJuIWQdrAY zdr8ABD@e#wA#Y-?I_J>|7Ni$bre;&=^JRoY(RcmeW9EAA`)37$>Xtv7MmC{xZP(Sx z_RmLc09z=D)WJ0u!+fpP_I$RIZ*PC2q`r)Su2>E?T8rHrE-I z$z*3079rqP9%VPi^ZJ#B&g5CoLK`0UZB z=*Xbjn?ot_Lh5Gv@u?y%NhJmu-*G}dt2_`zb_DM?5mv1 zOS<``d$z%~iU%x7I>ssK69LEMz(K3K&(BfJ{aWk(i9OugH-jCHbv<`>#pc?Wwu&80 zF0EGlzkm8)@Iz9^ZCdunqA{yQRNyN}&r%NgD%_4)AAnf^Uve*oX|Nn{(Y71|PvOTr zd^-9bytV%5O-h@OVrsmXh9V+`E*1D%6El5{HogKO!sRSGGU-!5Um(n;`I!AQNy)cC zUoPpCixp-$gU*UGfHH8iX^hlTZyfZkERw3?JR1;!LtJ=~Ly9 z(g*hyW3JQM=g+d#pUqgj^z!3Jz~_n+{pXkCPMMzzuw=^D-kODA_VGL1J)v_J%BA%k zR~w$6t|~}k=M;9gb!>`x&vx9aGyi%e-hy-sT>VLlnZ4N|vdh-}-tnyrEbEmb+4uks zUvN+D=EdaDOrI%4dqY|kLn`*`nHQgUf2v2#1!s;lu!tOs7~qor;Et;kDET-=nh+>~!2pPw zI511$@=G5$iC(=joM~dZ-T#$C3ewEdb0zb5Y1v`d z%T39ML>~?I+FcxrW8!$j!YuZ8ot(Vip-=J+U#ui{ezAN2S8x^R6xi)rv29?s7M+;& zC~4C$(6VFAy@l0Y%xn0fO`zHJdWGBN;GkoT7nsEK^wBYpGhZZ@h`lKib!Um{zSID z9xxuaH|Akjrt^quRyyF%l0_e`)I}Mh6@qrL3BUi7#&j1yG7y9?tbNo{%-xPpG+Z-t zaP&sL5xzqO^Sj~PRVe$Zxh_z!d`6I-1OzZ(1Bd+gsXsQE-5d}Op`7%fwSOMi6;28* zy!TT5dZEEI70{@oZenl!+=SV;w^?*s;VW>-ZA7B-qHMnd)5yu5CrAA1+wF#VmJe-} zHmmkrOt8~J(u*kBy?jy5!KPF$6M(yhK`a{tU5+63SGFsE4X;n5ug(xqVb zC{#;WqTuh+M~OWEhV3KlRo69j8R4Ewl* z+6G5qkqR5HV|S600QY!XYXqKczsqaC%>wG~#kG6|E^jpT`BK|o3E&CP zJ#~Ze^u?`gD37XuhbH^&-z7{yjxmh5j4B#eQpjGe)RE)UVc_7IiGlthAs8NK`7AAR+`di@Np>|8C8m>i!upC$%+numKoJYH8EIW~H| zrd^#s*~A$zm!0?&AQwaI9pO!!E^(a5{q}WnzP_~_(dbFubwIqaAo~l!xP*c3sNCYAenlDF`u?DA`>s;Ue4JKg~N zhSCq)h-)LUH#GAdfS%iZI=4%gH5g33^PnYd$C$X2JvI+P@M%2J6`Q7h4LNtLLP%O9 z-$AF!JL8d%{MwRcl7v3yHeXSiypP-T?TeEl^TU4V-I_Izw1q$B^v>2|fdkR5ihLec zStjSpx%%b&#FsX$VMkRJ;gI|*uCX@^@=bx-XcS(~xvAkg`zJvYgh*$+%}GIa^Aase zM^uDoNyQ>*;6%70>+o{)-rz+&{uOk4XETGbr|I|^Nu#E|ivF7!RjuY6KY*Iu$~fQ@ zdTjWnVIN|@rUZShrJ9fEUH&|$chH{*c?S;Esv9Fq_xbc=)5=Gh@^xvAwS=_o)<I5!LP$jPNYnCpLqQ|X z!`_eY;>nV9ChZn4Um(UfFKhOohLL=ijfml+VrkXd~B@;Dz}J6&@RRl@lHXsK|4ow%X%$UBom2sq8@ z^{cf04^TI#a8uQGmg$MQjzj+kk}ZF5$K#GDr5xelA1CnJ%Lz2KPqDKV;7$Sck!NaP zB+S*>5poE6HvjgIpZa^Z(_R%bL3~mccl)_S-wbFH_l3{Ff(Ed8w**QKKewO;@nz*e zB=4*j>$3x*;&wZW&A-Q;zv=p!-d| zt$dvAS+yTYHO@~So@7KF@N!W6z+dU2v2kI>Wt|;hy#QT{vIDt8L?Yonejf{q6%Exk zJSb}SJh~69rfuq60kW$$BDTi{z`Z;e;LyHG1c=w>$b|=|CVgSpLOTrpGDGE*gC!^h zYJR&e_ickLKOVk+-1}o!Xw9~g{uqJ(yv@XbyWWzL%*cAcin16}4hjNh?KMay?E$+I z1(VFz_lxB5x@19M$+!fA`rt+g+oK}jVXRvMTABkCijL=}EvNtu6+np<=}+)kqw#!@ z#svzH$+T=C?CE3_{)qVheJy2Pi=CsVlO|#O(wSLAENvv)iiRa#$RO-)MgqQeZKJG@ zNTF)ltP%MHS0Jq|z?@B*Owvfl7PN}SIrD&eIL)t_)?(3{ z7U~2m@_e3KS}4c>jD;?|F3pD){wT(BPKn4ObYChFyanu%zG5p99Sd z{hCJ{TU^)f0?X9^j?vZBEXF8yQKJ>yW&VFYQ~${W)Dg(f%KZ|~wLkI#$cEMX=YZH< z03Y8XTsjTl=N9j_(u`WwhuW}XEd|Two!1fEZ|^;}pC3|AZ=Kc$P;;+9@!(!}>fqotF96iKbKbD^wh01RXqKf)miGwSIWG>t z02&s^XGqNCaTb9;cHRUqc(n}gYX8Un`|(e2LTo^bZLP-t*pEAq(74?QAY@9RgDLwd zGe7#rTiy9Rp7#SnvehB?`}YSMr6thC0KN9*tOlTX*`XR1rh268F4zVH7KFzI$F5L)kO7djap~j~j(0}reOBS?j z^+^fJ{O?%H<^LLfxJRWLWu{KMqBr~r65bX0E&n6oQe-KbKO1QA1MHs>yv2(ALG@R9RXqhQW zPftHBgD?HQQ^#_g*3p1Qc;4XPApZ(p0&SRYJs`V*7Aq2V=FGN zkwJ78oNZmlN;b@BkRB!5G`?jx{ig_RP)~kCAYF$*5+NP)&IstJYIqg;c1!{r$U*xm zPkDibRiC!Lkuq(|^ty4wm4^6&AVK|>3XTFzOGWD8s_jaH=0|>R0&%*zkP^{F@2lR-CRf8594 zAHv(Y9t$F_5r^rWo5U}kJLm68Z9lDL6?Q2Pwpq(=pCw~nbjCHdZ;n8Q#kN;ntO3qn z!NdlwBL|1wlZ;#j++Mzf0l9dO&pV*wNGt>M@Vm7G;9yFGJKd=)Sa!{KW6eEroIUp6 zd-7Z{5I-GxkGaIYYncY2dbm}E2nNsKg?(<{U39um@>Q=RXiy9QakgLmo^AK$&h%kX zUoaalHk$wj;iVjr7fkHRq}O1dYY72Tz@?G`waoM76!zoWiQ#j)JR>1M^NN*nw=}9e z^V=s7bssL^+>JvhEivJa=?GIF*3qZ_Ikg_GUuaneO@BtzPr=15I-7$qUZ>2{)iC#{ zlbqpI_aE^-2(j$`0m5j|)wZ!SKknc!flMCUu-Xj}0yk9EG)!%vPbO1^rB(So;9#qh ze3=;(R*~#F;tF@AJ%xN$Jp}Qtw+M0>W)_1eTLR5+w1XFXe z4I~CjZnt&Ycjf#HRlhz`I6EM+S#Ehd?6TRrqu9FX@I+(c?Pvvb9hfA?9y@-#6OOgX zPg-iOtZ4uZ#CM%l2#tewFfA~*H2P-DLL~159KU9-y9NZ_E&{Yxlsi!he52OBz3Y4V}qiydL;N>dooQWj|Sb(^*M*d1)W;07K9OgVr*4=ElZ}b&z1b|3uVD3xVHGEwJyR z@akq!5uCJ^T^VTp%qId3^`S@G_U=&NfzQ~FjWX>zn%%L|@2$@Rp;tWu| znGC9Bru!-?V&TZrDRHxBc?`BIK{5bXnNQ^I#l1P2KrV-Qcl%QWm`UZ|WxEO;+s0opsgD^2)V))+g9zUTQgx z^}2jH2+XBwfUs;^dl+>RCdCHDf(>zac=+(JQ!7geS%ou)&Gvi)4mV(OBu(5l=Kb(Mi#IG@(ZhC#2w zQqXAKlI@OuM9ea2^9&jD@T@p`^k|WV2t?5`IY>1|;sV#3mkYsQ9BEW&-(~sX!-uI0 z_h~)%N8+EiYncg`ys+STjF-2!vB|Ja0)n9^bbc4(4#HHyg!@m9D3Q!^bVfZ~ZQ7hH z6Q>72{YGKBw$N9xUfL{4wq9lu=c3=vbq^7fCvg$(gp?taxYsPO+o~gwFPSDpW@2hh5;9_edAg&)<>z(Ol{O#5Jm>x6MW$@4 z)`b`$Gc;3em1eqI;J!S!M(w ziQ=E1Xd{ElFf@^ri)6M&@79ZSWJ^)6o(@J_q78I2i*Iz^VQ01(cVIiWc-p3MKirmX z$1YDfZ(yScY)`kZH7kQm#y9~jM$i4su!B;Ig4th6D$_eK{=Csz$46GoZoQ~0n3TU#k_V-o z|2U%Nx40tLaYST=YsjTMVa-q^lQyjzyhV=1$PpKvijF*iatyFc_>R+w&4a*`qcoej z3v{lzD?j zTT?}aFB#nO>GJp>e<86RmuFt~HlwBtm4v6yNNkdNLqKD34q2X`bnhc!Ft@=QhRvZP zH<{=A*fs;STIC_%?dEbb>{wslSVW%bt*>_(I3z!r4h1N*6m?5X=eq;c#C~u&oDL%cpm)KH_VwEZFM@LNs+jx8VQiwPW2%Y zr&k^n{6b&;_1GC;;mRwRF-^KPohWpcHbGU;(Fhs5U%+TIV1a>SSj)K?X+^beS7$~F zE7U>lF(A|?oH_`#iyhFaZm?q6u7Y=qoLf~UZwm$rPXRwRQbpW~LTHvrnPkgw#mHLh zp%QeY121a7tsVvXXE{MaPHSemqs4S>R;=LVBP{p|k<6y5H=AvvXBXi*i7DYtGEBaa zTr2Rtf1CO3E{d0$^UlT5rYeTX=w~F~^`+G7<=5)VJYi6G(Wa2xbLcrAdR<}0yda3& z>${(7#I1`u=}%@PB^D|;sH-2J0Pu8d{X!|!RRYdvXX5zrpgZ4sPrX~|R9Dwk97$U2 zH1%B@ircoKX;>@07%b%9>Wisflu6BI55EZw(}j2J4&Tup=M&WFM`yK;oF2_nRwOHX zHjQLsFKb*Vk&}_XBsQ@6I|f$}krq6>*S@`6T>hq2Nwy9OI1f83+!DPih-Utz5h>xE zQulNc7&cNSZVKBcg7v*G;jd5}tK-j5`cjtk(M;`VidoTK>09Qb#dl~RQtm$RrOu)! z+T82LuMgGtkObS)maZ^gbD4hPJ@KYssPAHed5*KDuDuFWuMA%Zi`tHE6EIzbhGGot zV%d(k{^fi2yFfzH8dxRhgqt{i?VCmAzX=*(&(TCm{&g)e#-sp*2{>eQ9b8tP7jba}IPr>UJFg?NkuZ~uqeeht z0E+VXEu;qYz1M0z(Fth%3j&)$&H2=JzmN6HJzwHJjfJ#c;F3uU`1fLJ3>EJQp( zm2>AQSF&KrkP$TBg;WyjAqbX|6?|xM3`V zfQ`ahBPF2%EFVlDH~8lSlG@1xY{;fgy^&t)g953n43j-H~@0v(mbo8sdSQt!`vQy6Y{aX;8NI@!M ze8i{!f*R93jhy*rWdYZ-|6hAo9uIZ?|1;Zc zjvTv$PL*1=Ry-DwBNH84sg$eSD#zxW6mkqhQK{IKP_D9@!jNNT+@|fYDnz-)9Yv-= z7={`AULUs_?f1XmKjW_tWXN%?Hc(6MUHr@7xoh-r(Xh3k|3E;N73Gkq#wc$dB-m_8EVnC-EL<-Sr^pM8SBxEtykw?^K)17J$VzP zY={McH$`PFr%@#du|o$AoYfKd-ng$}SSsTEWNrT|Beea^w);i0?S?D8ZVy+dr?}tL zOmfsLvwnyPyGq)sUoKp;TTO!eU9rgJW0-X16@r3nDD9M2(69&Wp}EKayt&9ofi+r4 zKCf$|H+T>P7**-sh%Lz-8yv-TKTOiq`8>L3*IWDUGvx+l!YQ=_&{6-p-pzvfgw(SP zYw#;XNR69Kd-8)gRH2+{wvtUza#zq5Br=OW*~E|A zptl=6Xu+_g?HLs7+Ro8$;Ppgdo7Z?Y*EZgKCz~)L7@-+n-FJ5cTmEAAo4$vu)D&v= z(6^)*K8|Un95pJbWD~ZG_a&dGKBbAuUGe(*_xxuN_|E;dvwwXR=nE^c zqzE<$Cd~hXNwsVBssqLYf1dF)6Qt83uZYUrmJ(ysKI_IpBo8UhSMkdTs&L=j#pE~G z2|a)^)Yi}!23r?wHGdhv^GEUk0V2{og8B_9#`3fVaysJY+K{*C7|@h`T$SA7dyW_@ z8J__urUDMI=Fu*lT7xR;CjBsv{*J*7kA{+bhd5f}Q_)HMHF)nRdi5a{C3P-5Wp|R} z17ug-S8ddLhOU&jab>Z1l0OD3VO3u94tHsX7KfvECIUH?Nf8AM{DprGBraGThdb*v zBBd+CTVIWEG&g3>9)#U-;9-}E8m;=q(k5w`K~!6pBXxZ9<0fDI+K&|B#67B#U0mW* z3lQ^w^*kHncf4pE6aIpI7ty|*F zCrfV_m`3MqW$&%|B3?O9y~B_)mS3!<0`htVOM{dME-Mb$XeK=Ad%u6XZQ1j8=c{4_ z7o!yu$A5Z^;1;*;*7GT5%9^19S5;?Ze#Tx((I5Q&D{)Tq56phx?AyrT@=2ZQNW#Qs z+Vl^&&QHrO{BFW!8cF8nd=?9EPOv(iIq~CzC!Di^GrU6jj{?mJ>6jlh$MMUc|FU5U z6~NTj0@A7IkAgr6v%e2&wK`DO16+o$^>Wr1f=#-A*Zz6v(L&KfHIGKrxG2Hceq!I z|90@;OA$T6op%7tu{7>^NlE^Q*>_vD#o0T|SA_kK1cxC6A1l7N#v81fTQM0QvAr;%qVYBJ90-74h-U{(aR`3nGH8zn?H zuCGuDADL)L$NYYq-KkkTOw)hy+QT+zW@?ZB)P-sSs>qJUqxmY(Cl!tka#B2Q^hRhO zB%g_pY-ijk9>x|kk&?1D#p6;Cb{>L+9SMT7DNs8`f>gQBpzV`h7e_}Qvx_a#nCY9& z&TyH#a7|cxjj*hHjqs3lko>SZJ1RET2_T+bYo$KGc&Ee+hI5Plc{ew=L3i>vZfghh zc%vij^o~GVPj#3Nnx(8qHoGyI2&V5gfLe7K?YeU@8msZBdw7{%!X zvP4B}i_Y!HMb?3@xkeb5Lx{j%5s$ikdliF~=uu9j)AP#+qK6XJaHg?QhR1R*bLZoA z7wcB5IA=#kM+f%F#^FJUg>|i%y{$Dhx9&3V<`nfH*$YEUmZ+@Tzk8Pf$9Z{_4t_~f znPHNXuW#X6s3ZtjoxB%l@fLVhR(5^d+q2i$3(c7Zk-9s;R_LqE=q3`0m33rnql`@p7%r zs3(3CLGlls9Sg}3#++4!(hMr%t+G0WoZ~a{qAM#;TtcFxJ697K<&=yP5D;);(g251 zE$cEnBa1G`FimrK*Cs*bS$3GHh{ zD^VSh<1GINd`#Oo<>Cxa8tj=$H)OJGVs9IC0;wkD=I#)$=-Ge_;gZ0&d1nh*s(DJ9 z2H&l=Blhg6a9B9&XXZ4rN(Z$ryn6j3E%@FPIaQ zI+LHozRW?@I;dY7uv% zanGW~Pk!!k&3&VNd1fx$FWi?t*Dm6kj`KZ$h5LnTU2`1}u8+331k#K<1wb^YR_s3zbR_ z5#!J3Kju%K&Gmgc+?p7=)??Tt9f2B5+Qq+#DUg1$Ft?k`GmHH4DA(QQE$%~CX=O`N zlCP>5J3X*_dc)&;MJ0D`Z!Dqw%6LGjb*g>d;t*pE#l z?B}MVmC;fx1JmQjqu5oeX0Z*Q4p`xEcgr;U-4bild}uT$?}5>@=JJqPljbZWX>-Z7 zF_Wu(%5Ua1Cbh3AbgW8(`stISshQa|qTba1fP_|QJdEEVef;>)y}!0db@Wni;rJ2z z*<0~8>Qm~xj%<{lejogFsFm$EKK7vMj|%pI29xpArWO{?kR1;<(wCY^+vCmom-{Vo zVMaaDWY@cQ)k!Ck)h4LM?jto8fO?o>NZ2osNi8bsndI|&gVt`crAy~Td*WlptKM-# z2gP72V34(y-_F1(P75se>*|3iMotd4cQyM*%E1Mf{B_lT&AP}xHs6QT|Pz;vMZeRdxm z@N4?u$9@AM^GO0i(KLC3jpGSH3?xd-?Ibqp;5C%n(Pd64iQg~mBt4*A_ zUmkx9bEJZJWTM%!=XB9Tgk8h)iGnIys!>B@qa)I3rlDb{8I`ABbXrstNrB~-zj`vq zQxz2zo!rilV1J4Xxp?abJbUqAX4fN&h zjRlUdK#omzuDv&=xTETc+E+2Itnp$Mg)HQ+SFJd!P~HFDZ?w7#Y8=l(WzONR-Thvk_kks?ErkOka1fD45>cgpdJ zNLs=rv$;HcdWXlN4{MFE=!5C7CDv-a*>PeP%|qEGb{twH)5rWSWcUuZObo5x8D|HF z0HqEfF(o~x*F`PC3jxGH=<>!XeaDyns5d%?haI(1C*EE^%PrhcZ}l|C zFb^n03rJUK%(Ja`i(A&YXZQv*BC#+W-AX3en6A_}CvF(>vfa=R%l^b(LX^$vOQEl?b0 zy*8z871nk$XS~R?V7lb29O-gfLcgSX<^)B^!t(-z<7srn%nsl{^m1h8Ti$FuYc}j;_y5!lekRcY7%$5anGc09;MuaoBMX-ngCooiEB)9 zupzk?_e|`AYjJbk60YyYb#S>+fN#AfxS^8&DW23f@#|nps*wGa{Y&6y|DMCU)3mJu F{ts{nKXm{A literal 63227 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ⅇksdHApxT3wflSZ&H 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 literal 16837 zcmeHubyQW~);1tWhjd6vry|{{G$9blE#189AisO> z_kI7re|+OQ2E()WT6@LZYppq-=b1ZPMd>*v8Yvna92};sjMPgwI0SS!ICy20``}Ki z-+Lx-VQ3{OsUj;WNu}cKU~Xk=1_#IZ5fUXRfA0lOh%!ZaIy?a@D=XpabR4=iL!(DF zQB;ViHbIg06`rWcN9B`@L5Nq_i^@1H{onDkQGyz&m^I(TNsyvbhme-I;6d=((Om|3 z!xD{%zikf_KW%_R%eKq=$?s_fQHI3~(2U}%o7drDtUc-r>mCltOj3t`gE2eVt=`{~>4-aG2j_@#WEbeIs6r*_;A}?4!~U54 zF^vcs6&00`v#GhjOQ~mfkAo{=8cSDKM*$8FcXxMo_owU*&K4X``1$!c9&>VVa_Pvi zjXd?s7JTQkQs_PhCAnwuf%uowuEqDl-1Hz6xu_q}3449b=^d$)iF31)(A4$W)#c89 z1$T)0k*cuXjo)TbQgpFieK9u%0!{!NA{87wiYfIVRj(V5B-}rDp2L-W3jqaUusdRm z@NE)|6mAlC#Q~bXNbepLql$$yrpCt>q`s>x#_EW9`w(atM-HwGCn5~`PcKx2U+=?u zgO#Ju1!$tQw<`VZ0S*xdUH9HU^jc z>HG}}6(J3RUW_pmi|0A4n22IT8DH?2vdbjNvqWr?bA9=f<^QqzjVGm0p z^v1Kfqz@X+vT7vC> zP7p;b-2kB?!;5d<2rNJPk{ zZMx5CTiS9Ta^-5`;`b(m#x6geO-K88$9qLdY+`UW1)fWZ1sVNWY-bM@r+8Jk2kaQ) z5d4liN>e2&QV9KTm1km37zMA2IA_tzzT=6p;x}P3kBCu(3=O?B#%GQ)x(B9|hGHp@ z75b?3-{r>Q6i5wd1cRmU2spXV5xEp~hgrB;Fj!c@Ic#)h!K!ECiW2h9asmY&W#kdU zwTR4&!~z+4naU|ouF5?oD|1n`Z{P2ODO2DMHmaOR6_z5RJY{3OX^5X|kmj(N$@~&W zdp+9rsz}>Zp3py8bJs{qv3x=E_9%YC1o}`QW7nyYm)Fs*dGBWd6`(Z6B&+U;XU*Am zS$$VVA}VbDwzp%|RR~%9);kD+BYAPsp2TLhuCKpZt7IYkh(y42#$fpUw&0fCxhSLu z%5&BE+&YQ8^VY$LDS(xNHmH)sTWApZg9j^z^3~7F#SP6~%<8Hl@A;2>ndXvM>P#+Q zQZ49>na5}wFd|>k@ms+>$H97g2a=Ps z_qCS_oAk+gQG7x-5-sCSzZLt-rO`!|+Bg;Vl09H6Fp3DltF(unP%XW!Z6r^%;3_IE zp=a!;LL%k^r`8pdz>io^tWrX@nut?{A9b#RJo}tXIIv|;k8t+2#+*5)$zGCGYG!{j zl*0Pud$;YA!tMor%IT)xe&Hrx4$PNyUtj?@vmq4dGo!O9RB4?;Wt>4;8o_M^Cdec+ zDpwfD?NBBy-jl8J*Ww@Go}m9M>(`OZ%3|A(cQ+&9wbc|9-TzE5RXuGlIBgV0UIhm5tbe{ru>fjl=r+tNy0za~togqwxY~ znGmi7U1wQiYdgt{wJ(udSqb|2rJ}yAV>%9YWDX5wz8BjyJXS-QhqFGRV8ndj)ss8? zN=lh~@w~E9!@wZv4VS)ZjIBiE=#NNrj)p<3hdzcqZ#tr=C1;$@m-|F-&IXRJFLuLL zVoIRfQ&knd$CI6AC6rYk1DGmjJ$}Eh9(}cGtVYPLYYBEufm<9F-!C|Kh1Gs&0WD$i zMe}B%;xy0kto!`ruK&%2bwVdRFmeOxV~hv8$Gtk+1AIkQn8Jl2c4eN|e&5VmF?lOB z^gY|LgdVFiA}Y&?%k$1S2J5;0ly2#RTwf9D*c$nt^%~6hH)3nQC2aPHrZwNU!gaBL zLgMkz&RD}5sNn(^=>se>zE0;*Rn;GLV2#zfTdRLq6DGW^l? z@sVQj_4;tm^asJ6H36pDCNpGm*C;%~H2>?`3*GUX!;R72>Pd4wR=M$FJ?O=J+CiL# zzEx`|W(B3+Y0I-nif!KUjm@Tu9h+6CyZ)LNRh2eXBG@j{if{uGFL;#?<6@qRONftE zT3wq9q&W95jb+IbY4k@Buxx=BRo#4ZwcA}gMCr2^cy&JBT%FFxcd=EW=Ow(ou`Y1> zy7A{TvP9j@DWb}3#pJ1-`dxe9^Ft?-!xrDfIUDkK!Y4DsT+h-{HL?$+}ip*sBU;gQ| zySX~4skWQ08*pek%VyK5{=qYC`*e81@8Wn{b^q#5C*}5x%Rp7)Q;TfddADi1?Yhlk zm$&t&LOs)xsDf;c6=OgQjeee@6S9`J z1S9KItFuK4S1*275!`L4nDrU%>kg1*gR*63Wo3;udb@ic{(Qb&+KS~O-Jsw~;npO|9RRO$`o($dSKzt9ofP2q97=p)~XjTyUQ zUaqyMagtbAeeE&fV)%4AYhJ+p zLrgg_(;j;N5cv3cl9VCEF(~=TlcitOJT_yj?r%bIX=OMQLm$N6kXWP`p|5Z_%BnGh z(f5!dCMkXXhp%pcW|Cb`vzmDnsn2gG`fzO{1J;w~c zVH0Tgqm1>$sa5H)W6L$E>C2ew^Ccz@Y~jNw-~Da|9`hfcmIlN7wVuj0SWO__%_o%F zIfJmm1dC*7rYY^E{rK#jeCOp=Y&+P^fp{1L&0lHx5BG9dR+q1~vK11eStZdQkG6rB z%i?_34mgby2Ss-OzRxI0?iS~K_t+4Z70K=EgwK{@luQw8SonS>r!H0`HlVK`@Aq=# z*hZr~=6AqN#i9K6DLOrZk_$=w=49GIw0C=0`_Z)u|VZwLhdaA673l-^_V-&P9N` zw>4sC0IX!RJ+6dh$hBrB_Qn?BT-{&O7M!s!&AF`?JeL>cD}swyBu%6UUoP0 zQGXYN@X$3B11wK+3$MfHf5Dlt0?}& zsqMjYHO&MnRSH=LN#ixKmiOYrD&G$Vgm+)*|G=-nQP3GZ(LSL1fuA|qsN2d_V^|z0!w@y)ow>X00;Sp;8I~{ft$$hX>>(()6-8LBOcU@Y$YuJI zxs1@&R&*>=>DkR#rvcJ!EY8Y{?Dz!5OG!qvYD17$BYvRS{n|$?ry^gomkCAS2 zDe@z?GVzq1#XlxdXGkYr|B3YHD+%t2*Pzu<-TT6eN?1ge0oP?)?bTP8LCe;)lxRgL zLthrdhFuK{P`jQ57`?GI-55OHrH`B5D_EH{wKc|FPaOe9t@Qjh@OZpf0YsyUA%cl%WLHp z+<+O8F}OdZp$AcSHpu41eWYzSG!QZ9h2FwV!qoq^FWW<%J8+0CkPNP?zQXVl><8geGtGH}=@`Tn^ff*8>D<^{NJHKjm8yZC_7zMy+3GS4dJpx(O_SRAbA2$2 zPLHUW3mo<*DtWc7IEiBxOdeJKisrr1Zzfo1cwqdAnBt?#%UaS8U6xjbPqU34!GO~d zq8#pU{Z~6F4}MDlJu}s%OI!H9?vjY3S%@u-%3cDKvpRov^^nimnboUmMo6fH;{F&; zVCX%34^8NDctu>^A0JG~T-DLxnq9}%p_852Y1FX%V)%^X5qt$U>g{peu6Td;X>R<_ zlUPaS>qs)yKCVrq);~R&ea%*r*(j?e(=|~}*GJ=Kd5@^l(`-BU0TPU&EY@=A3)7q^ z9_VU|yta+6`r)&4y42cg*S=43#u@|*AH5U+Vtn|1;IWibrR00-GRu}au@+LZ=+>6r zgqznYU4dj_;P}FMLk9ds8yn%n;NqgstCyE@c4q2DK7Of3K2<|8#4se$gtA0R7F%*Y zQswgi{XtD`M~ltHXZ?m#n`HjqX&+O&hq7X9&nuB1vBiA9rRQkUHB);QJvqrctMl;; zH%v#hM&;x@3Gorf8$6E#q;6WDjWRj*WG3T^3eUDrRc{(VTb<=}^qaoXD>l&NnDC?g zMeUa6YSjTINPn!&3E~aF@pif2msD>qWcpP4iaEcrj^|Iof!%M#8%w>qSGu*Ob)IJO z&5kX67k)#S)jnFr+BEk8vqpu0plw3Cl}aK`u;KgQO^ARS>gD4z!err1>CHhWQJc}a zNN)R~+764aUh0W#>=yv3UnTUVow&U}cy#YC;2{F$X_zXItJ14m(n(G_jl9K?aER8y zVn@ESRWF!5VOE4Oj5uUqloMP81TfeJ@E?9CU5cTbCm(om!6qA=l+L5Rj~xal&BGl-`6P7w=**{(>g9Eftmb@YA{na=G^JCv|oH1 zE57Hw7s9tq1c+q-(2O>V5R3hntYmZsEzmen=2F~U55mX@d-$HPJG=3N=05V`jKbVM%#KOGj)QDs zXMZWzKpFw-`{6mQEBMrnQ@dHzVSR*A#kAEwCZzhB!`T=aGNj+n_NkDu(ug2EF*bpz9jW~ zP!hXJRatmcTJv{!o$T0QlJQh(RhUn1j20ZI8MoWs z?1hO=ICYX+lr$b|w?jSWK3{aVAXC~twdk*0?oH6Bt<;^a1YH-W)H&Yda~9GlOq8N* zO2s+TQUzutPkal!r|LXm5-B{hdNS`npX#|n;*O^*ixYz_(CpIB-w9xiAuNWh7w^p6 zfYc@7=3tAQrbE_;=sZ*Fx2u!M0o>t%Y^Vty{CH~D5`@(4tM2*K@EhE;=PK0h_j}%c zEl0Jil#R^wv7%%>fWfK((93%02K+N$h9fASlILiQE$1+x1gP0yb1*})sT{lSq~V~y z0^o<_{tFOlKrE+z^&8s`8(w)(Dgj64C{i|A@Zk`^B#4B#vMYe>{#yWU*8|w?yVF>` zUEa&?_EVauw!eBp*%o-+>Vo1r=B#_#^=?Iq$pU=(KIqEBC`uas3Xn9RB|6cO*|c`UN%%`5?C zbVO1*04TFl4>@1Y(MZzJ#WnqXunLWf=M5xR@3 zU4IABtHT)Yo8xJRX*^{iqmy~}=A*Trt#xkO*26iHo;9>hjorzQUDs4RC4( z`L?nNP+$Rg5tkAX?3=oFLY;|p@!&$6gyQOQpR7$PeUAmCWKsVnc^Zz+QlnPeo>(UO z44Q;2sh+)s*4b;YI!4d8COQS&HY~m5F2Fpu0n&ACeS|C2eAees2)HozqK#U?b_AUiZ~XH^DU3QKrw*IV~oYal#{r+i))WbdEepSqmfoeowOL(z(QBv zd7oiOc^rW^03Y=>%Hy4%rQdFWn714dRby2qdzzReYuyHRtUs9^e6g8vcizWke6KJc z)=A<0qw!|<=6V;c)fM@nV}Q%q<~iTZ z^#QN~CbuRlw%_y4l_FDk06DcG@(DOr-;oVyG8-l^%w12P@BR@<`LD*M@~>l6Q*@lo&YMLN_!gZ&UhG!%7h|Lc}Z zPfDdbQ}x!EWC^0u$y9S9%K(jy7C9BC zQEr8|exxUen~qyVsy`glNYuSweg)1HxADj!Ih>8U+ROc3sMyB@F=NT`bOD8MR1T%! z<+Bsq&zz`RkHzx>6rhm}SP=z3A-M;mC(&Ez#zkIGfL;0vXzp7VDDuvZV18MCx_pr;fa2jAJ{l{i@xHS>)hX6xeG zxM*H4zb-|~&-k|suHA=hm37uFV3L1HPO$f>vs$-O5)Xa!?42Vo+U!F}D|S+c6JRfG zfRU=|JvT#XGtwEpvlM^*K2nRJ>_Ij%$*5@)qsZf={G~3>9~^(|EbY2$F4YUj5PV#; zeU)6L2$w1m0;jMGB=*gOb1xf9rkUh2BKy~02;+a` z`SL3$4?2i>5i?G_7BP~hWF*8>8HLMio&|nh8ui1qor>=ssa;P}|CTALR05*}Y%Hq2 zC_q#$iHlSD~%IX%(x`)Q(@}!9M)OgtC(2I3oHtQN$=SuGg5|Q$k1@~Os;^&sH_B)rStR6 zZnbQN0YEFy?=&mdo`B?bs-Z$xo(Wu9<)#w|$?jfh}kcP~8~AI@zM#kHAp_07F9 zO^QzF#^PVX8K3OE+D_YnY_Bott)yM6W24?jT{Se!D&8j2_i3S5OkHYFO6=*X?lTZI z(yzDew61^sLG)ECV|nxCG6$0+k5^KHq4jX}dn>-@g|5OIc?QF@SNtsRQzwGs(KUQE zf|M^w;|JY`(rg~z^vv~MoC2CeaAA9R<030VLEe%SQ^)WR!{FoVoNpwje}4TMsj^jb zeH49W;!_tXdOgvs*d!+=L$!9F!@YdKKy{I;Q_%8SmVwW{h%AK&O^zk94e*D*1+aw! zyHqo%kv!>4*OfEuP3Zi&MDl%n83+`vkH!s>v-hm@8y1O7_n8?}sVzyLCM>`7dz^ND zsZU-bAas?mDh90=;0}L|xtoi3@>$jHdMw!?Yf<|qJ;hESozlx|qdVtiq|S}3S?7@9TJkU%GS{ex~PmYO(9m?F}o^^t&j`6CG=nF-3&E)D1NzY|GagmNMKwKlu2mWlV*4a5bGx3R?HyQHd0f-1sH~keP`AMJNlua(mu8(spZSey_9qlpQAB*=f;V1z*y}Cf)|BDm z!rQ%qS;Pp5QkfkS!Sv!~vu@LLVVOY}Bk*~4qaA2F!>j2`kB7WFxMrw~76qpb1=^9< z1T+Q>>ol>l<^4-O-6t;~5fb)3b|p9RA`PeaoTk;k0o`ZqD*2^8aS0`}j?x@_Y%r*1 zF)A;KIQM8(_(6*+uJZPD(E*Ni{i2KM=<)_ueuyY3=}V}-=Q6>n^uC1Da8+5IWV-k) zf84n@y_cN->Blhg06^Of%(4z!tv%ZcPT(?6yKbX#_jPP|8K|XQt+C?p>{=ZfeC$2^ zUSE}tpmMDd$IoC-{ly4pJEKQNI+mDf<4~XbC22m&Q(pEYnLW{)15u{#C9@Y8ult8{ zWM#jFX;V7_d7@qu0g1tS%4iTjDtDU`vZ76)`IL(5p0v25xN6v!fN>rBTDq_NXZi^0 z^kq0)s7OUAYvY)I$YZlt^G!~&4K+~7`c{5&GsH~mt(3^0P`6TI>R8R9)Q-|Q50_}v zP7=If$w=?_lUvLaNVXElP*^S4eb2j`k#j(l>feGn&^^2wM#|MoV~KWp#O`NTf;w*4 zw7y%=)9L@50Dn6qXopvGmIf$WA1ZSi5VX0K9}JUHQt%n3C)XF{JXU;k2>-q=F*|Y+ zJ>wA%hr&wR-fNzFQT{I#`7xkBsiKUux;0v~g%UT^5q3g92EhJE+(n&)xu zD;SRTP!D5!QHYiAqh34fdos&ZhUoQOJv~dnVN`k@pM@&WX)&CEUisO@?4Zndlk|Dz zk9>XRb^RmVEDq#30;dNf+;rk>$|*!NB9#6V*A@B@3Yb*M?JzbIS3qU#%Ww@nwMR^N zI~Hjvn`!AG-umFY$@1ru_COEug@Yny4bj)XYtMflB{i{;QKt3#C#XHIN?ybp8C%Sq zWNevK@0qXI>$D*wq(q=YCDJ{%{Cb-59GahJ|J6(2rs4m)`Olw zMouUUFHFuNBEHT1lhhpTN6fgq^2KD(6(@PgDV%3atiRcKWHGsKS_4XVY?^>IDj_9D z6qDjP&!~8i4AjjGA|uLkT5BnQuqabz)7hRo+OOI7;nRw`yFpL06bj(8w%Ru_>4{N+5 zVZ4+B;5xnhP%RYHo{bxhyh}pX2x#pXfgsrksc>>(L&d&6918m!#R1wG)n&8cFIjc$5`s zS25>YI`dl=6jhglML+I$eP*EpI0kmDk+n~3H8Vpn`bIv1y~tU_*l)(EQ)_dq2yo(7 z>LMRr12XR#h09@XCZ5B<9_Y?zEU!~o=mtxN@M+&*!iNX7VhR2Te{GnBj6wWM<*Nh0gEOX6DEEW(*dg3*tXp%_jQM%R~TAO@+) z`a0iyu_NdWG61#!My>&2{>&X$!jXTzs-0M@SCE7@wcmZjQ1 zJu%TuX%$B%Uuu)4DQ&&^*u12mm>1ld(*yTQSNaWs+F@Z31pvmOxFH!Laf%0t|@LI(}psfZ&>M zGb`m2SRv#M8-rQBp*+q@GON<4 zUih?(rf5pBOxV!3H85fbOZ3t)A?f*GZ@lbrQuE6Fj+2m3fOx+#v|QF)Bp-k5rM z$^#PEtY+S?{%z3CU`8;D0eOQEHLmcv|DSdu!39UaKruvOMj+aaoRNF2Ww87G202QK z&H}#z?&&`41ZyaMF;K?5?N%PfaYXdt_B}m( zdjCXnHoMhVvFd|`YQrt&7zBXij zX1!{kDh{GyV|i^!@$3WWW1}EE`iL)JvVoU4gTgr=T%2W;&)jW}w zKWhwrPCX>JM>Xz8KfHAx3Dr7VoaX{qdzO9qY)GCXi&phv;D?h%DM@VYadC-n$cpFp zhV(8XL;zRH1=!)sFLyF&?7kZHNRgJgOr50eiTSld%}-Fvx{I%{XF;K z{Xk}%3Bb7KM@7&&!SwKl+Ii6e8%&o!pHo8eLb1rL1-D8iLmoA#44z(H>^2)1HP5Gi zMeeg!5i|0N`W){tR{0E*uB&n_W~-+8s>u7ue`!ZU%w&*j`z4HK|0EU0i;B7I*-oIL z2@*}OR+yVNe3lmWDyTTga}ytMDrR9Q#i$w5!IUsKgg88q3B~_KGjkBH9^sfvS_OLc zt0fqktjFF=G3)*H2!+dy<3+~!W7Q;8CI0q4>$T~ck^?EmcyW2YUM?inY(r_gn1UA- zxUh`98hVL34RI^(!;AnK&j;-Fhn!?L%O1QBGmIXLzUY+8R2#2IufpZBdwHZz0a$N2 z65|(>B9C7-6J@j)(7su+%C((%)@giuDjSAcWMJtbZ8Q+5WKttyVq0R~D|$Ovsin&B zu(DeWp>2gQdaQoae;IwMX0pFIsWE%E$4g zP?0hKcVQY?K8!LOTiP#d!QJzS?TC&}PJ7 z!j%0@wl(6kgpD&G$4mhEMUNEqe%7!True~n@EP*S0R_y*`O>LG69@M{%y?xGj^E;G z^G;8BqE;#7FejZD9unZE{bgPss)58H>mftcwVc+cW&rt?6si^1{|XX=6iiyNtQWV9 z%aUJU{^E6FzjOtqtB87@g{J-%P`UP%#Uwx1g{iL+nI0GvoNFK$XP`_sRJTbyNF`Md z0xFma8*p9L3q3lzxqi`6xiMi%gpnsPM2mBbcDox}P6Xkp9-EasX$or=)zxUGP>X4t5Oh)W?du?_vMnSB9ZfCBu-}d=>Nx^Aso73(<<-7o-PFjk>Q;Rg%f4pt zIh4B<=cxXQ-y7CGBG9@L)Ppem zc(G=`t3spJtv-Gbu_W_385^<4uHW{BBablYouHYjbX9Z+1g|3T;H?jz&kk0n-#mD< z!9msk@YWI_146TlMDGvzSGR3#GHz?Nj)=Ip2TUmsFvxCSZ2C(uez^zj41sOm0Vj!{ zhNh}|JD4{}z@n^4dB@DPAO&q&NpO2f2I zHh7WUbTyC9siTHRB!#f;yzfaB_?%{{Cyqrg38o4HPZw9HTiww4jwD8*^{>l%LkYUM zoGN_A{VHc3Vw zDjpzZ7^)#I=;LT=WtC^O@>=Q}kYWmbFOJ;?#gQkIxNWw8=u_1l!%*+Tb+HIjx`vem z`{ME{=Y|fBr#){q_dpNaE(#IKfrGr0Dt!<{XWbYy`FJ9+S6B=vp@kem^%*VeLn)RZ z#KK;#FBvT_zB>Kh3dR<3r1|2$J2w?uS=ta2?s4ySFO^Y)EEOI_bx-M|!?f;-sCAik zMpMrAM~IDxvvm-cZd$CNZ6KIb0A*(Cm5yB;jZpbA)K4hw_61T=AnviYeSumx#*PF1xS0}2vEg%5TSAlP~J3m|}I4%Pj z^MwDf&NObfVYQd(lqAR%F+do-4tJ0sd-{bJsSt=QT>1GtSY zs9vK`IWdw#qb-UODHyESYeW>scQ`!KcY6M!3>bRnt1tbx28Ihn0oevLuN7b1UGjnN zwc5%?bD!Rwc@ki+p%|&+-(D_-eOoeP*^hZr3&W%AfAQ!W?!YkfA63{yZ10cw@x7O| zEHY4ZazBl0F-qvFq27+TvR^`Wl12wCwvGzjuhvyX+Rco59f-Dt1PFx{DlEh{ym&<) zh>vX|t8_?fVdG>}LZG9g%f4}W6+a!ZuimcJ?e&r+lscj`qqn#B0lM@AJFMk5@nT<| zz1Iz_V=xW@pP(_a-n`2y(JcF(w@$B^WI8kO40b9U1qSQ{vS<`nDl}`UQua50>VHtC zqEJ-U#7-JIh|Rlhk^bbi+D9?4v0&*8@$7VtWyDjIWhxj&Q5jeu1B9OFVG#Abhdf|p zkW?`cN+`Bs%g3|k9juau;YqRLTd}Omf2On>A_`r2Lt{sqj|7jh6cVuG{ho}M$8VO0 z!^5Q~b`po*=WbxF&oQ;w8S8>$REWdiH^h3-`p?;UaA_W{L4w6~Vo!@Nx z1pH>l`{$!~Zu3dBgZ>9&%K2ab From ce0079658fdc04d0ef8eeda13cdd0fd17b7c3505 Mon Sep 17 00:00:00 2001 From: waleed Date: Thu, 2 Apr 2026 22:35:10 -0700 Subject: [PATCH 6/7] fix(credential): remove stale isServiceAccount dep from overlayContent memo --- .../components/credential-selector/credential-selector.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/credential-selector.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/credential-selector.tsx index 0333c030d25..6e271b4f810 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/credential-selector.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/credential-selector.tsx @@ -366,7 +366,6 @@ export function CredentialSelector({ selectedCredentialSet, isAllCredentials, selectedAllCredential, - isServiceAccount, ]) const handleComboboxChange = useCallback( From aaa9a6eb585b5ffdc625a83c3d978850f20d53f8 Mon Sep 17 00:00:00 2001 From: waleed Date: Thu, 2 Apr 2026 22:56:52 -0700 Subject: [PATCH 7/7] fix(credential): filter to oauth-only in handleComboboxChange matchedCred lookup --- .../components/credential-selector/credential-selector.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/credential-selector.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/credential-selector.tsx index 6e271b4f810..ecfb61ba3d8 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/credential-selector.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/credential-selector.tsx @@ -384,9 +384,9 @@ export function CredentialSelector({ } } - const matchedCred = (isAllCredentials ? allWorkspaceCredentials : credentials).find( - (c) => c.id === value - ) + const matchedCred = ( + isAllCredentials ? allWorkspaceCredentials.filter((c) => c.type === 'oauth') : credentials + ).find((c) => c.id === value) if (matchedCred) { handleSelect(value) return