From c9a380dd5d0163dbb388a210072125e5bdcaf677 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 23 Jul 2026 22:07:14 +0000 Subject: [PATCH 01/28] docs: update Slack app guidance Co-authored-by: miguelangaranocurrents --- ai/overview.md | 11 +-- .../lifecycle-notifications.md | 6 +- .../data-privacy/access-to-customer-data.md | 3 +- resources/integrations/slack/README.md | 11 ++- resources/integrations/slack/slack-app.md | 99 ++++++++++++++----- resources/integrations/slack/slack-webhook.md | 23 ++++- 6 files changed, 112 insertions(+), 41 deletions(-) diff --git a/ai/overview.md b/ai/overview.md index 6bc1a7b6..f82504d6 100644 --- a/ai/overview.md +++ b/ai/overview.md @@ -33,6 +33,7 @@ Every entry point below delivers this same context - they differ in where you ar | [MCP Server](mcp-server.md) | Any MCP-capable agent | Agents querying runs, tests, and analytics on demand; autonomous troubleshooting | | [IDE Extension](ide-extension.md) | VS Code, Cursor, compatible forks | Debugging CI failures without leaving the editor | | [Fix with AI](overview.md#fix-with-ai-from-the-dashboard) | Currents dashboard | Handing a failure to an agent while triaging a run | +| [Slack Fix with AI](../resources/integrations/slack/slack-app.md#fix-with-ai) | Slack | Handing a failed-test notification to an agent from a team channel | | [Playwright Skill](agent-skill-playwright-best-practices.md) | Claude Code, Cursor, other agents | Teaching agents how to write and fix Playwright tests correctly | | [n8n](../resources/integrations/n8n.md) | n8n workflows | Automated triage, notifications, and agent pipelines without code | @@ -84,6 +85,10 @@ You can copy the prompt to your clipboard for any agent, or open it directly in This is the bridge from investigation to action: whoever is looking at the failing run - not necessarily the person with the repo open - can package the failure with its full context and route it to an agent in one click. +### Fix with AI from Slack + +Failed-test notifications from the [Slack App](../resources/integrations/slack/slack-app.md#fix-with-ai) include a **Fix with AI** button. The modal can open the failure in Cursor or GitHub Copilot, provide a copyable prompt for Claude, Codex, Zed, Conductor, and other tools, and link to the Currents MCP installation. This lets anyone monitoring a team channel route a failure to an agent without first opening the Currents dashboard. + ### Playwright Skill Context tells an agent _what_ failed; the [Playwright Best Practices skill](agent-skill-playwright-best-practices.md) tells it _how_ to fix it well. It's an [Agent Skill](https://agentskills.io/home) - an open standard supported by Claude Code, Cursor, VS Code, and others - that packages expert Playwright knowledge: locator strategy, web-first assertions, debugging flaky tests, CI configuration, and more. @@ -106,12 +111,6 @@ The [n8n integration](../resources/integrations/n8n.md) connects Currents to mor Combined with [HTTP webhooks](../resources/integrations/http-webhooks.md) as a trigger, this covers the fully autonomous end of the spectrum - no editor, no dashboard, just test results flowing into whatever process you define. -## Coming up - -### Slack - -**Fix with AI** is coming to the [Slack integration](../resources/integrations/slack/): failed-test notifications will include a Fix with AI button that opens one-click deep links to AI coding tools, plus a copyable prompt for everything else - prefilled with the same enriched failure context and MCP identifiers as the dashboard and IDE actions. A failure lands in your team channel, and anyone in the thread can route it to an agent without opening the dashboard first. - ## Combining entry points These methods compose - most teams end up using several: diff --git a/guides/currents-actions/lifecycle-notifications.md b/guides/currents-actions/lifecycle-notifications.md index 754156c3..b6745733 100644 --- a/guides/currents-actions/lifecycle-notifications.md +++ b/guides/currents-actions/lifecycle-notifications.md @@ -8,7 +8,7 @@ Action lifecycle notifications inform teams when actions are created, disabled, This provides visibility into changes and upcoming expirations without requiring visiting the dashboard. Teams receive timely updates, allowing them to respond before a forgotten quarantine leads to unexpected test failures. -Notification settings are configured entirely in the dashboard. The REST API can create and manage actions, but notification routing is configured per project in the **Action > Settings** page. +Notification settings are configured entirely in the dashboard. The REST API can create and manage actions, but notification routing is configured per project under **Actions > Settings**.

Navigate to Action Settings

@@ -23,7 +23,7 @@ Enabling Slack notifications requires two steps: 1. **Connect Slack to the organization** following the [#installation](../../resources/integrations/slack/slack-app.md#installation "mention"). {% hint style="info" %} -Note that this OAuth flow requires an organization administrator. +A **Currents organization administrator** must connect, re-authenticate, or disconnect the integration. A **Slack administrator** must authorize the app; the exact required Slack role depends on whether the account uses a single workspace or Enterprise Grid. Currents organization members can view the installation and project configuration. {% endhint %}

Missing Slack App installation

@@ -37,7 +37,7 @@ Connecting Slack under Integrations alone does not enable notifications — they

Slack channel configuration

-Once Slack is connected, anyone with **Actions Admin** access can configure the channel and events. If the Slack option is unavailable, an organization administrator must complete the Integrations setup first. +Once Slack is connected, anyone with **Actions Admin** access can configure the channel and events. If the Slack option is unavailable, a Currents organization administrator must complete the Integrations setup first. #### Email diff --git a/resources/data-privacy/access-to-customer-data.md b/resources/data-privacy/access-to-customer-data.md index 3d1c80cd..a79d8c23 100644 --- a/resources/data-privacy/access-to-customer-data.md +++ b/resources/data-privacy/access-to-customer-data.md @@ -52,4 +52,5 @@ We collect diverse data from our users' test suites, which are strictly limited * **GitHub**: No access to data or repos source code; we post comments and status check updates for Pull Requests. The integration application is listed here: [https://github.com/apps/currents-bot](https://github.com/apps/currents-bot), and the list of permissions appears as part of the setup. * **GitLab**: We list repositories and projects, refresh oAuth tokens, post notes and status check updates to Merge Requests, fetching Merge Request details. * **BitBucket**: No access to data; we only post status check updates for Pull Requests. -* **Microsoft Teams, Slack**: No access to data, just posting messages within the restrictions of the platform's rules. +* **Microsoft Teams**: We post messages within the restrictions of the platform's rules. +* **Slack**: The Slack App lists accessible channels; reads workspace, user, email, and user-group metadata; posts messages and thread replies; sends direct installation and re-authentication messages; and processes supported Slack interactions and message metadata. Access is limited by the OAuth permissions approved during installation and Slack channel-membership rules. diff --git a/resources/integrations/slack/README.md b/resources/integrations/slack/README.md index 741e5760..15ffadac 100644 --- a/resources/integrations/slack/README.md +++ b/resources/integrations/slack/README.md @@ -20,14 +20,19 @@ There are two versions of Slack integration available: The Slack App integration provides a rich, feature-complete experience for test notifications: * ✅ Organization-level installation with per-project configuration -* ✅ Multiple destinations (up to 10 channels per project) +* ✅ Multiple destinations (the dashboard shows your organization's limit; the default is 10) * ✅ Run-level notifications with thread-based grouping -* ✅ Individual test failure notifications +* ✅ Individual failed or flaky test notifications +* ✅ Fix with AI from failed-test messages * ✅ Advanced filtering by tags, branches, and commit messages * ✅ Annotation-based mentions (users, groups, emails) * ✅ UI-based mention rules configuration * ✅ Improved security with OAuth 2.0 +Run and individual-test notifications support Playwright and Cypress recordings. Annotation-based mentions use Playwright's `notify:slack` annotations. + +The Slack App also delivers independently configured [Action lifecycle notifications](../../../guides/currents-actions/lifecycle-notifications.md) for actions that are created, disabled, re-enabled, archived, expiring, or expired. Connecting Slack under **Integrations** does not enable these notifications; configure them under **Actions > Settings**. + ## [Slack Webhook](slack-webhook.md) Integration (Legacy) The webhook-based integration provides basic notification functionality: @@ -39,3 +44,5 @@ The webhook-based integration provides basic notification functionality: * ❌ No individual test notifications * ❌ No annotation-based mentions * ❌ Limited to single channel per integration + +Already using incoming webhooks? Follow the [migration guidance](slack-webhook.md#migrate-to-the-slack-app) to move notification settings without unintentionally sending duplicate messages. diff --git a/resources/integrations/slack/slack-app.md b/resources/integrations/slack/slack-app.md index 25c4c9ad..89576b7f 100644 --- a/resources/integrations/slack/slack-app.md +++ b/resources/integrations/slack/slack-app.md @@ -1,24 +1,34 @@ --- -description: Slack App integration for Currents - Playwright test notifications and alerts +description: Slack App integration for Currents - Playwright and Cypress test notifications and alerts --- # Slack App -Integrate Slack with Currents to receive real-time Playwright test notifications and failure alerts directly in your team's channels. The Slack App helps engineering teams stay informed about test results without leaving their workflow. +Integrate Slack with Currents to receive real-time Playwright and Cypress test notifications and failure alerts directly in your team's channels. The Slack App helps engineering teams stay informed about test results without leaving their workflow. ## Use Cases -- **Instant failure alerts**: Get notified immediately when Playwright tests fail, allowing your team to respond quickly before issues reach production. +- **Instant failure alerts**: Get notified immediately when Playwright or Cypress tests fail, allowing your team to respond quickly before issues reach production. - **Flaky test detection**: Receive Slack alerts when tests exhibit flaky behavior, helping maintain test suite reliability. - **Team routing**: Automatically mention the right team members based on which tests failed - route checkout failures to the payments team, API failures to backend engineers. - **Release gating**: Send notifications to release managers when smoke tests or critical tests fail on main or release branches. -- **On-call escalation**: Page on-call engineers when critical Playwright tests fail in production environments. +- **On-call escalation**: Page on-call engineers when critical tests fail in production environments. The integration supports organization-level installation, per-project configuration, multiple notification destinations, and advanced filtering options. -## Requirements +Run and individual-test notifications support Playwright and Cypress recordings. Annotation-based mentions use Playwright's `notify:slack` annotations. -Before installing the Currents Slack App, the installation must be performed by a user with the correct administrator permissions in Slack. The required role depends on how the Slack account is structured: +## Requirements and permissions + +Currents and Slack permissions are separate: + +| Role | Access | +| --- | --- | +| **Currents organization administrator** | Connect, re-authenticate, disconnect, and change the Slack App settings in Currents | +| **Slack administrator** | Authorize the Currents app in Slack; the exact role depends on whether Slack uses a single workspace or Enterprise Grid | +| **Currents organization member** | View the installation and project configuration | + +A Currents organization administrator starts the connection from Currents. The Slack authorization step must be completed by a user with the correct Slack administrator permissions: | Slack setup | Who must install the app | | ---------------------------------------------- | ----------------------------------------------------------------------------------------- | @@ -55,7 +65,7 @@ The Slack App integration is installed at the organization level and can be conf 3. You'll be redirected to Slack to authorize the Currents app 4. Click **Allow** to install the application in your Slack workspace -
+
Slack authorization page showing the Currents app permissions and Allow button

Review and authorize the Currents app in Slack.

After installation, you'll receive a welcome message in Slack confirming the connection. @@ -74,11 +84,26 @@ After connecting Slack to your organization: You can enable or disable Slack notifications for each project independently without affecting the organization-level installation. -
+
Slack project integration settings with the Enable Notifications control

Enable Slack notifications independently for each project.

+ +## Installation Status and Recovery + +The Slack integration page reports installation and configuration issues and provides the appropriate recovery action. + +| Status | Recommended action | +| --- | --- | +| **Credentials expired** | Select **Re-authenticate** | +| **Installation archived** | Re-authenticate or reinstall | +| **Installed but not configured** | Enable notifications and save the project settings | +| **Project notifications disabled** | Enable the project-level toggle | +| **Destination has no channel** | Select or manually enter a channel | +| **All destinations disabled** | Enable at least one destination | + +Re-authenticating normally preserves the existing project configuration. If Slack continues returning `account_inactive`, [disconnect](#disconnect-slack) the integration and reinstall it using the required Slack administrator role. ## Notification Destinations -Each project can have up to **10 notification destinations**, allowing you to send notifications to different Slack channels based on your needs. +The dashboard shows the destination limit for your organization; the default is **10**. Destinations let you send notifications to different Slack channels based on your needs. ### Adding a Destination @@ -91,6 +116,12 @@ Each project can have up to **10 notification destinations**, allowing you to se **Manual Channel Entry:** For organizations with many channels, you can manually enter the Channel ID and Channel Name instead of selecting from the dropdown. This is useful when Slack's API limitations prevent listing all channels. {% endhint %} +### Public and Private Channels + +The channel picker can return public channels and private channels that are visible to the Currents Slack App, even if the dashboard label says **Slack Channel (Public Only)**. + +The Currents app must be invited to a private channel before it can post there. If an accessible channel does not appear in search, select **Manual Input** and enter its Channel ID and Channel Name. + ### Managing Destinations Each destination can be: @@ -113,7 +144,7 @@ Message threading is enabled by default for new destinations. Disable it if your Run notifications provide a summary of the entire test run. These are sent when a run completes and can use Slack threads to organize related messages. -
+
Threaded Slack run notification with project, commit, branch, and grouped test results

A run summary and its detailed results grouped in a Slack thread.

### How Threading Works @@ -134,8 +165,9 @@ Configure when run notifications are sent: | Mode | Description | | ----------------------- | ------------------------------------------------------- | | **Always send** | Send notifications for every run, regardless of outcome | -| **Only on failures** | Send notifications only when there are failed tests | -| **Only on flaky tests** | Send notifications only when flaky tests are detected | +| **Only when there are failures** | Send notifications only when there are failed tests | +| **Only when there are failed or flaky tests** | Send notifications when failed or flaky tests are detected | +| **Only when all tests are passing** | Send notifications only when all tests pass | ### Additional Run Events @@ -162,13 +194,13 @@ Or to notify only for main branch runs: - Set **Git Branch** `matches`: `main` -
+
Run notification settings with lifecycle events, result mode, and a main branch filter

Configure run-result delivery and optional conditions for each destination.

## Individual Test Notifications -Individual test notifications send a dedicated message for each failed or flaky test, providing detailed information about specific failures. +Individual test notifications provide detailed information about failed or flaky tests. -
+
Failed-test Slack message with test details, retry attempts, error output, and a user mention

An individual failed-test notification with retry and error details.

### Enabling Individual Test Notifications @@ -215,9 +247,22 @@ Individual test notifications include: - Direct link to the test in Currents dashboard - Mentioned users (if configured) +Messages display up to five test results. When more tests require attention, the message includes the number of omitted tests, mentions collected from the omitted tests, and a **View in Currents** button. + +### Fix with AI + +Failed-test messages include a **Fix with AI** button. It opens a modal where you can: + +- Open the failure context directly in Cursor +- Open it in GitHub Copilot +- Copy a prompt for Claude, Codex, Zed, Conductor, or another AI tool +- Install the [Currents MCP server](../../../ai/mcp-server.md) so an agent can retrieve additional test and run context + +See [AI-powered test troubleshooting](../../../ai/overview.md) for other Fix with AI entry points. + ## Annotation-Based Mentions -The Slack App integration supports mentioning users directly in notifications based on test annotations. When a test fails, the configured users or groups are notified in the Slack message. +The Slack App integration supports mentioning users directly in notifications based on Playwright test annotations. When a test fails, the configured users or groups are notified in the Slack message. ### Enabling Annotation Mentions @@ -252,7 +297,7 @@ See [Playwright Annotations](../../../guides/playwright-annotations.md#annotatio In addition to code annotations, you can configure mention rules directly in the Currents UI. This allows you to set up notification routing without modifying your test code. -
+
Slack mention rule matching smoke tests on the main branch and routing notifications to users and groups

Route matching test notifications with UI-based mention rules.

### Creating Mention Rules @@ -288,15 +333,15 @@ Mention rules support the following filters: ## Mention Formats -Both [Annotation-Based Mentions](#annotation-based-mentions) and [UI-Based Mention Rules](#ui-based-mention-rules) support the following formats for specifying users and groups to mention: +Use the following formats for specifying users and groups to mention: + +| Target | Format | Example | +| --- | --- | --- | +| **User** | Email address or `user:UXXXXXXX` | `andrew@currents.dev` or `user:U01RWNBFGER` | +| **User group** | `@group-handle` or `team:SXXXXXXX` | `@engineering-team` or `team:S07JCUP81EG` | +| **Annotation with multiple targets** | Comma-separated values | `user:U01RWNBFGER, team:S07JCUP81EG, miguel@currents.dev` | -| Format | Description | Example Value | -| --------------------- | ------------------------------------------- | --------------------------------------------------------- | -| **User Email** | Email address associated with Slack account | `andrew@currents.dev` | -| **User ID** | Slack user ID | `user:U01RWNBFGER` | -| **User Group (Team)** | Slack user group ID | `team:S07JCUP81EG` | -| **Slack Handle** | Slack username or group handle | `@engineering-team` | -| **Multiple Mentions** | Comma-separated combination of formats | `user:U01RWNBFGER, team:S07JCUP81EG, miguel@currents.dev` | +Raw `UXXXXXXX` and `SXXXXXXX` IDs are not supported: use the `user:` or `team:` prefix. Comma-separated values apply to the Playwright `notify:slack` annotation; in UI-based mention rules, add users and groups through their corresponding fields. {% hint style="info" %} **Finding Slack IDs:** See [Slack's documentation](https://slack.com/help/articles/360057541954-Get-user-and-group-IDs) for instructions on finding user and group IDs. @@ -326,7 +371,7 @@ This removes the organization-level Slack installation and disables notification ### Can I send notifications to multiple channels? -Yes, each project supports up to 10 destinations. Each destination can target a different Slack channel with its own configuration. +Yes. The dashboard shows the destination limit for your organization; the default is 10. Each destination can target a different Slack channel with its own configuration. ### Why am I not receiving notifications? @@ -334,7 +379,7 @@ Check the following: 1. **Project-level toggle** - Ensure "Enable Notifications" is turned on 2. **Destination toggle** - Ensure the specific destination is enabled -3. **Notification mode** - If set to "Only on failures", passing runs won't trigger notifications +3. **Notification mode** - Confirm the selected run-result mode matches the outcome you expect 4. **Filters** - Check if any tag or branch filters are excluding your runs 5. **Mention rules** - Ensure conditions match your test properties 6. **Installation permissions** - If notifications stopped entirely, the Slack token may have been invalidated (`account_inactive`). See [Why did notifications stop with an `account_inactive` error?](#why-did-notifications-stop-with-an-account_inactive-error) diff --git a/resources/integrations/slack/slack-webhook.md b/resources/integrations/slack/slack-webhook.md index 4b0896fe..4acdfdcd 100644 --- a/resources/integrations/slack/slack-webhook.md +++ b/resources/integrations/slack/slack-webhook.md @@ -18,19 +18,24 @@ In order to enable Slack integration and share Playwright test results to Slack - Navigate to **Manage Project > Integrations** - Add Slack integration and provide the details: + - **Label** - a descriptive name for this integration. - **Slack Webhook URL -** Incoming Webhook URL, e.g. `https://hooks.slack.com/services/XXX/YYY/ZZZ`. Read more about [Slack Incoming Webhooks](https://api.slack.com/messaging/webhooks). - **Failed Runs Only** - enabling the toggle would only send results for failed runs. + - **Single Notification for All Groups** - combine results from a run's groups into one notification. - **Events (Optional)** - specify events that will trigger the integration and send the results. Leaving this field blank activates all the events. - **Branch Name Filter (Optional)** - if specified, only send notifications for runs with branch names matching the pattern. Please note, that you must provide the branch name within the [run-details.md](../../../dashboard/runs/run-details.md "mention") to activate filtering. + - **Tags Filter (Optional)** - only send notifications for runs whose tags match the configured pattern. + - **Test Your Tags Filter** - verify the tag pattern before saving it. + - **Remove** - delete the webhook integration. - Click **Save** to preserve the changes -
+
Legacy Slack webhook configuration fields in Currents

Configure the webhook URL, events, grouping, branch, and tag filters.

### Grouping Slack messages Enabling the **Single Notification for All Groups** toggle ensures that only one notification is sent per run, regardless of how many groups it includes. -
+
Single Notification for All Groups setting for a legacy Slack webhook

Combine known run groups into a single Slack notification.

Note: You may still receive multiple notifications if one group finishes before the others were discovered. For example, if one group completes before the other groups are scheduled or detected, a notification may be sent early.
@@ -73,6 +78,20 @@ Triggered when a run gets cancelled. If a run contains multiple groups, the noti ![Example of Slack notification for Run Canceled event ](../../../.gitbook/assets/cypress-run-canceled-slack.png) +### Migrate to the Slack App + +To replace a legacy webhook: + +1. [Connect the Slack App](slack-app.md#installation). +2. Add a destination for each channel used by a webhook. +3. Recreate the failed-run, lifecycle-event, branch, and tag settings for each destination. +4. Verify delivery using a test run. +5. Delete the legacy webhook. + +{% hint style="warning" %} +Keeping both integrations enabled for the same channel and events can produce duplicate notifications. +{% endhint %} + ### Disabling Slack integration To disable Slack integration, simply delete the integration from the list of integrations. From b60ea13e034f50865041f763204c6e108bd2907b Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 23 Jul 2026 22:31:05 +0000 Subject: [PATCH 02/28] docs: keep Slack integration docs framework-agnostic Co-authored-by: miguelangaranocurrents --- resources/integrations/slack/README.md | 7 ++--- resources/integrations/slack/slack-app.md | 33 +++++------------------ 2 files changed, 9 insertions(+), 31 deletions(-) diff --git a/resources/integrations/slack/README.md b/resources/integrations/slack/README.md index 15ffadac..410f3cc0 100644 --- a/resources/integrations/slack/README.md +++ b/resources/integrations/slack/README.md @@ -1,13 +1,12 @@ --- description: >- - Integrating Slack with Currents dashboard for Playwright and Cypress test - notifications + Integrating Slack with Currents dashboard for test notifications icon: slack --- # Slack -Currents integration with Slack allows posting test results of your Playwright or Cypress tests directly into Slack channels, helping your team stay informed about test outcomes without leaving Slack. +Currents integration with Slack allows posting test results directly into Slack channels, helping your team stay informed about test outcomes without leaving Slack. There are two versions of Slack integration available: @@ -29,8 +28,6 @@ The Slack App integration provides a rich, feature-complete experience for test * ✅ UI-based mention rules configuration * ✅ Improved security with OAuth 2.0 -Run and individual-test notifications support Playwright and Cypress recordings. Annotation-based mentions use Playwright's `notify:slack` annotations. - The Slack App also delivers independently configured [Action lifecycle notifications](../../../guides/currents-actions/lifecycle-notifications.md) for actions that are created, disabled, re-enabled, archived, expiring, or expired. Connecting Slack under **Integrations** does not enable these notifications; configure them under **Actions > Settings**. ## [Slack Webhook](slack-webhook.md) Integration (Legacy) diff --git a/resources/integrations/slack/slack-app.md b/resources/integrations/slack/slack-app.md index 89576b7f..9b7c1058 100644 --- a/resources/integrations/slack/slack-app.md +++ b/resources/integrations/slack/slack-app.md @@ -1,14 +1,14 @@ --- -description: Slack App integration for Currents - Playwright and Cypress test notifications and alerts +description: Slack App integration for Currents - test notifications and alerts --- # Slack App -Integrate Slack with Currents to receive real-time Playwright and Cypress test notifications and failure alerts directly in your team's channels. The Slack App helps engineering teams stay informed about test results without leaving their workflow. +Integrate Slack with Currents to receive real-time test notifications and failure alerts directly in your team's channels. The Slack App helps engineering teams stay informed about test results without leaving their workflow. ## Use Cases -- **Instant failure alerts**: Get notified immediately when Playwright or Cypress tests fail, allowing your team to respond quickly before issues reach production. +- **Instant failure alerts**: Get notified immediately when tests fail, allowing your team to respond quickly before issues reach production. - **Flaky test detection**: Receive Slack alerts when tests exhibit flaky behavior, helping maintain test suite reliability. - **Team routing**: Automatically mention the right team members based on which tests failed - route checkout failures to the payments team, API failures to backend engineers. - **Release gating**: Send notifications to release managers when smoke tests or critical tests fail on main or release branches. @@ -16,8 +16,6 @@ Integrate Slack with Currents to receive real-time Playwright and Cypress test n The integration supports organization-level installation, per-project configuration, multiple notification destinations, and advanced filtering options. -Run and individual-test notifications support Playwright and Cypress recordings. Annotation-based mentions use Playwright's `notify:slack` annotations. - ## Requirements and permissions Currents and Slack permissions are separate: @@ -262,7 +260,7 @@ See [AI-powered test troubleshooting](../../../ai/overview.md) for other Fix wit ## Annotation-Based Mentions -The Slack App integration supports mentioning users directly in notifications based on Playwright test annotations. When a test fails, the configured users or groups are notified in the Slack message. +The Slack App integration supports mentioning users directly in notifications based on test annotations. When a test fails, the configured users or groups are notified in the Slack message. ### Enabling Annotation Mentions @@ -270,27 +268,10 @@ The Slack App integration supports mentioning users directly in notifications ba 2. Toggle **Enable** to activate annotation-based mentions 3. Notifications will now include mentions based on test annotations -Add annotations to your tests to trigger Slack mentions using the `notify:slack` annotation type. See [Mention Formats](#mention-formats) for supported formats. - -#### Example - -```typescript -test( - "critical test", - { - annotation: { - type: "notify:slack", - description: "@engineering-team, miguel@currents.dev", - }, - }, - async ({ page }) => { - // test code - } -); -``` +Add annotations to your tests to trigger Slack mentions. See [Mention Formats](#mention-formats) for supported formats. {% hint style="info" %} -See [Playwright Annotations](../../../guides/playwright-annotations.md#annotation-slack-notifications) for more details on using annotations, including how to combine `notify:slack` with other annotation types like `owner`. +See [Annotation-based Slack mentions](../../../guides/playwright-annotations.md#annotation-slack-notifications) for setup examples. {% endhint %} ## UI-Based Mention Rules @@ -341,7 +322,7 @@ Use the following formats for specifying users and groups to mention: | **User group** | `@group-handle` or `team:SXXXXXXX` | `@engineering-team` or `team:S07JCUP81EG` | | **Annotation with multiple targets** | Comma-separated values | `user:U01RWNBFGER, team:S07JCUP81EG, miguel@currents.dev` | -Raw `UXXXXXXX` and `SXXXXXXX` IDs are not supported: use the `user:` or `team:` prefix. Comma-separated values apply to the Playwright `notify:slack` annotation; in UI-based mention rules, add users and groups through their corresponding fields. +Raw `UXXXXXXX` and `SXXXXXXX` IDs are not supported: use the `user:` or `team:` prefix. Comma-separated values apply to annotation-based mentions; in UI-based mention rules, add users and groups through their corresponding fields. {% hint style="info" %} **Finding Slack IDs:** See [Slack's documentation](https://slack.com/help/articles/360057541954-Get-user-and-group-IDs) for instructions on finding user and group IDs. From 42d2359ad0055153cb12b66a630b67ee55784f0c Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 23 Jul 2026 22:42:16 +0000 Subject: [PATCH 03/28] docs: align Enterprise Grid warning with Org Owner/Admin roles Co-authored-by: miguelangaranocurrents --- resources/integrations/slack/slack-app.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/integrations/slack/slack-app.md b/resources/integrations/slack/slack-app.md index 9b7c1058..6d1915e6 100644 --- a/resources/integrations/slack/slack-app.md +++ b/resources/integrations/slack/slack-app.md @@ -34,7 +34,7 @@ A Currents organization administrator starts the connection from Currents. The S | **Enterprise Grid (multiple workspaces / org)** | An **Org Owner** or **Org Admin** (workspace-level admins are not sufficient on their own) | {% hint style="warning" %} -**The app must be installed by an Org Admin when the Slack account belongs to an Enterprise Grid organization.** +**When the Slack account belongs to an Enterprise Grid organization, the app must be installed by an Org Owner or Org Admin.** If a workspace-level admin installs the app while the workspace is part of a larger Slack organization, the installation may appear to succeed and Currents will store the access token, but Slack can later invalidate that token. When this happens, Currents receives an [`account_inactive`](https://docs.slack.dev/reference/methods/admin.apps.uninstall/#errors) error from the Slack API and notifications silently stop working. From 1194b282591f67d1f08638d743373dfd013c2e49 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 23 Jul 2026 22:43:36 +0000 Subject: [PATCH 04/28] docs: map legacy webhook events in Slack App migration step Co-authored-by: miguelangaranocurrents --- resources/integrations/slack/slack-webhook.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/resources/integrations/slack/slack-webhook.md b/resources/integrations/slack/slack-webhook.md index 4acdfdcd..39935417 100644 --- a/resources/integrations/slack/slack-webhook.md +++ b/resources/integrations/slack/slack-webhook.md @@ -84,7 +84,14 @@ To replace a legacy webhook: 1. [Connect the Slack App](slack-app.md#installation). 2. Add a destination for each channel used by a webhook. -3. Recreate the failed-run, lifecycle-event, branch, and tag settings for each destination. +3. For each destination, recreate the failed-run, lifecycle-event, branch, and tag settings: + - **Failed Runs Only** → set the [run-result notification mode](slack-app.md#notification-modes) (for example, **Only when there are failures**). + - **Events (Optional)** → map each selected event to the destination's run notification settings: + - **Run Finish** → enable run notifications and configure the run-result notification mode. + - **Run Timeout** → enable **Run Timeout** under [Additional Run Events](slack-app.md#additional-run-events). + - **Run Canceled** → enable **Run Canceled** under [Additional Run Events](slack-app.md#additional-run-events). + - **Run Start** → no Slack App equivalent. + - **Branch Name Filter** and **Tags Filter** → recreate as [run notification filters](slack-app.md#filtering-run-notifications). 4. Verify delivery using a test run. 5. Delete the legacy webhook. From 101116415f57cabf39c96643990bee260bf66189 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 23 Jul 2026 22:53:09 +0000 Subject: [PATCH 05/28] docs: revert unrelated Actions settings navigation change Co-authored-by: miguelangaranocurrents --- guides/currents-actions/lifecycle-notifications.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/currents-actions/lifecycle-notifications.md b/guides/currents-actions/lifecycle-notifications.md index b6745733..1f080f2b 100644 --- a/guides/currents-actions/lifecycle-notifications.md +++ b/guides/currents-actions/lifecycle-notifications.md @@ -8,7 +8,7 @@ Action lifecycle notifications inform teams when actions are created, disabled, This provides visibility into changes and upcoming expirations without requiring visiting the dashboard. Teams receive timely updates, allowing them to respond before a forgotten quarantine leads to unexpected test failures. -Notification settings are configured entirely in the dashboard. The REST API can create and manage actions, but notification routing is configured per project under **Actions > Settings**. +Notification settings are configured entirely in the dashboard. The REST API can create and manage actions, but notification routing is configured per project in the **Action > Settings** page.

Navigate to Action Settings

From b2b62a6d9e2590dee41236c336d33c3256595e6a Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 24 Jul 2026 03:06:46 +0000 Subject: [PATCH 06/28] docs: remove organization member Slack permissions note Co-authored-by: miguelangaranocurrents --- guides/currents-actions/lifecycle-notifications.md | 2 +- resources/integrations/slack/slack-app.md | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/guides/currents-actions/lifecycle-notifications.md b/guides/currents-actions/lifecycle-notifications.md index 1f080f2b..6a38f2c8 100644 --- a/guides/currents-actions/lifecycle-notifications.md +++ b/guides/currents-actions/lifecycle-notifications.md @@ -23,7 +23,7 @@ Enabling Slack notifications requires two steps: 1. **Connect Slack to the organization** following the [#installation](../../resources/integrations/slack/slack-app.md#installation "mention"). {% hint style="info" %} -A **Currents organization administrator** must connect, re-authenticate, or disconnect the integration. A **Slack administrator** must authorize the app; the exact required Slack role depends on whether the account uses a single workspace or Enterprise Grid. Currents organization members can view the installation and project configuration. +A **Currents organization administrator** must connect, re-authenticate, or disconnect the integration. A **Slack administrator** must authorize the app; the exact required Slack role depends on whether the account uses a single workspace or Enterprise Grid. {% endhint %}

Missing Slack App installation

diff --git a/resources/integrations/slack/slack-app.md b/resources/integrations/slack/slack-app.md index 6d1915e6..133c94b1 100644 --- a/resources/integrations/slack/slack-app.md +++ b/resources/integrations/slack/slack-app.md @@ -24,7 +24,6 @@ Currents and Slack permissions are separate: | --- | --- | | **Currents organization administrator** | Connect, re-authenticate, disconnect, and change the Slack App settings in Currents | | **Slack administrator** | Authorize the Currents app in Slack; the exact role depends on whether Slack uses a single workspace or Enterprise Grid | -| **Currents organization member** | View the installation and project configuration | A Currents organization administrator starts the connection from Currents. The Slack authorization step must be completed by a user with the correct Slack administrator permissions: From 42eec32b8e45fc7fc7938d234192f5d12deb0056 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 24 Jul 2026 03:11:52 +0000 Subject: [PATCH 07/28] docs: revert Slack webhook documentation changes Co-authored-by: miguelangaranocurrents --- resources/integrations/slack/README.md | 2 -- resources/integrations/slack/slack-webhook.md | 30 ++----------------- 2 files changed, 2 insertions(+), 30 deletions(-) diff --git a/resources/integrations/slack/README.md b/resources/integrations/slack/README.md index 410f3cc0..2ec900dd 100644 --- a/resources/integrations/slack/README.md +++ b/resources/integrations/slack/README.md @@ -41,5 +41,3 @@ The webhook-based integration provides basic notification functionality: * ❌ No individual test notifications * ❌ No annotation-based mentions * ❌ Limited to single channel per integration - -Already using incoming webhooks? Follow the [migration guidance](slack-webhook.md#migrate-to-the-slack-app) to move notification settings without unintentionally sending duplicate messages. diff --git a/resources/integrations/slack/slack-webhook.md b/resources/integrations/slack/slack-webhook.md index 39935417..4b0896fe 100644 --- a/resources/integrations/slack/slack-webhook.md +++ b/resources/integrations/slack/slack-webhook.md @@ -18,24 +18,19 @@ In order to enable Slack integration and share Playwright test results to Slack - Navigate to **Manage Project > Integrations** - Add Slack integration and provide the details: - - **Label** - a descriptive name for this integration. - **Slack Webhook URL -** Incoming Webhook URL, e.g. `https://hooks.slack.com/services/XXX/YYY/ZZZ`. Read more about [Slack Incoming Webhooks](https://api.slack.com/messaging/webhooks). - **Failed Runs Only** - enabling the toggle would only send results for failed runs. - - **Single Notification for All Groups** - combine results from a run's groups into one notification. - **Events (Optional)** - specify events that will trigger the integration and send the results. Leaving this field blank activates all the events. - **Branch Name Filter (Optional)** - if specified, only send notifications for runs with branch names matching the pattern. Please note, that you must provide the branch name within the [run-details.md](../../../dashboard/runs/run-details.md "mention") to activate filtering. - - **Tags Filter (Optional)** - only send notifications for runs whose tags match the configured pattern. - - **Test Your Tags Filter** - verify the tag pattern before saving it. - - **Remove** - delete the webhook integration. - Click **Save** to preserve the changes -
Legacy Slack webhook configuration fields in Currents

Configure the webhook URL, events, grouping, branch, and tag filters.

+
### Grouping Slack messages Enabling the **Single Notification for All Groups** toggle ensures that only one notification is sent per run, regardless of how many groups it includes. -
Single Notification for All Groups setting for a legacy Slack webhook

Combine known run groups into a single Slack notification.

+
Note: You may still receive multiple notifications if one group finishes before the others were discovered. For example, if one group completes before the other groups are scheduled or detected, a notification may be sent early.
@@ -78,27 +73,6 @@ Triggered when a run gets cancelled. If a run contains multiple groups, the noti ![Example of Slack notification for Run Canceled event ](../../../.gitbook/assets/cypress-run-canceled-slack.png) -### Migrate to the Slack App - -To replace a legacy webhook: - -1. [Connect the Slack App](slack-app.md#installation). -2. Add a destination for each channel used by a webhook. -3. For each destination, recreate the failed-run, lifecycle-event, branch, and tag settings: - - **Failed Runs Only** → set the [run-result notification mode](slack-app.md#notification-modes) (for example, **Only when there are failures**). - - **Events (Optional)** → map each selected event to the destination's run notification settings: - - **Run Finish** → enable run notifications and configure the run-result notification mode. - - **Run Timeout** → enable **Run Timeout** under [Additional Run Events](slack-app.md#additional-run-events). - - **Run Canceled** → enable **Run Canceled** under [Additional Run Events](slack-app.md#additional-run-events). - - **Run Start** → no Slack App equivalent. - - **Branch Name Filter** and **Tags Filter** → recreate as [run notification filters](slack-app.md#filtering-run-notifications). -4. Verify delivery using a test run. -5. Delete the legacy webhook. - -{% hint style="warning" %} -Keeping both integrations enabled for the same channel and events can produce duplicate notifications. -{% endhint %} - ### Disabling Slack integration To disable Slack integration, simply delete the integration from the list of integrations. From 9c2762cd628b397e0c4c21965058173f8dc65bbe Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 24 Jul 2026 03:51:01 +0000 Subject: [PATCH 08/28] docs: restore Playwright Annotations hint in Slack app guide Co-authored-by: miguelangaranocurrents --- resources/integrations/slack/slack-app.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/integrations/slack/slack-app.md b/resources/integrations/slack/slack-app.md index 133c94b1..3769ba70 100644 --- a/resources/integrations/slack/slack-app.md +++ b/resources/integrations/slack/slack-app.md @@ -270,7 +270,7 @@ The Slack App integration supports mentioning users directly in notifications ba Add annotations to your tests to trigger Slack mentions. See [Mention Formats](#mention-formats) for supported formats. {% hint style="info" %} -See [Annotation-based Slack mentions](../../../guides/playwright-annotations.md#annotation-slack-notifications) for setup examples. +See [Playwright Annotations](../../../guides/playwright-annotations.md#annotation-slack-notifications) for more details on using annotations, including how to combine `notify:slack` with other annotation types like `owner`. {% endhint %} ## UI-Based Mention Rules From 74de8b981892ce19b6d2c89da78d535ac507fb09 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 24 Jul 2026 03:51:35 +0000 Subject: [PATCH 09/28] docs: restore annotation code example in Slack app guide Co-authored-by: miguelangaranocurrents --- resources/integrations/slack/slack-app.md | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/resources/integrations/slack/slack-app.md b/resources/integrations/slack/slack-app.md index 3769ba70..5eb41392 100644 --- a/resources/integrations/slack/slack-app.md +++ b/resources/integrations/slack/slack-app.md @@ -267,7 +267,24 @@ The Slack App integration supports mentioning users directly in notifications ba 2. Toggle **Enable** to activate annotation-based mentions 3. Notifications will now include mentions based on test annotations -Add annotations to your tests to trigger Slack mentions. See [Mention Formats](#mention-formats) for supported formats. +Add annotations to your tests to trigger Slack mentions using the `notify:slack` annotation type. See [Mention Formats](#mention-formats) for supported formats. + +#### Example + +```typescript +test( + "critical test", + { + annotation: { + type: "notify:slack", + description: "@engineering-team, miguel@currents.dev", + }, + }, + async ({ page }) => { + // test code + } +); +``` {% hint style="info" %} See [Playwright Annotations](../../../guides/playwright-annotations.md#annotation-slack-notifications) for more details on using annotations, including how to combine `notify:slack` with other annotation types like `owner`. From 6d27bf51642dfb031ffbc1ea2dfa5deff07c5d01 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 24 Jul 2026 03:53:15 +0000 Subject: [PATCH 10/28] docs: restore original Mention Formats table in Slack app guide Co-authored-by: miguelangaranocurrents --- resources/integrations/slack/slack-app.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/resources/integrations/slack/slack-app.md b/resources/integrations/slack/slack-app.md index 5eb41392..9c32a057 100644 --- a/resources/integrations/slack/slack-app.md +++ b/resources/integrations/slack/slack-app.md @@ -330,15 +330,15 @@ Mention rules support the following filters: ## Mention Formats -Use the following formats for specifying users and groups to mention: - -| Target | Format | Example | -| --- | --- | --- | -| **User** | Email address or `user:UXXXXXXX` | `andrew@currents.dev` or `user:U01RWNBFGER` | -| **User group** | `@group-handle` or `team:SXXXXXXX` | `@engineering-team` or `team:S07JCUP81EG` | -| **Annotation with multiple targets** | Comma-separated values | `user:U01RWNBFGER, team:S07JCUP81EG, miguel@currents.dev` | - -Raw `UXXXXXXX` and `SXXXXXXX` IDs are not supported: use the `user:` or `team:` prefix. Comma-separated values apply to annotation-based mentions; in UI-based mention rules, add users and groups through their corresponding fields. +Both [Annotation-Based Mentions](#annotation-based-mentions) and [UI-Based Mention Rules](#ui-based-mention-rules) support the following formats for specifying users and groups to mention: + +| Format | Description | Example Value | +| --------------------- | ------------------------------------------- | --------------------------------------------------------- | +| **User Email** | Email address associated with Slack account | `andrew@currents.dev` | +| **User ID** | Slack user ID | `user:U01RWNBFGER` | +| **User Group (Team)** | Slack user group ID | `team:S07JCUP81EG` | +| **Slack Handle** | Slack username or group handle | `@engineering-team` | +| **Multiple Mentions** | Comma-separated combination of formats | `user:U01RWNBFGER, team:S07JCUP81EG, miguel@currents.dev` | {% hint style="info" %} **Finding Slack IDs:** See [Slack's documentation](https://slack.com/help/articles/360057541954-Get-user-and-group-IDs) for instructions on finding user and group IDs. From a5df17650311aa4a878162558eefa4a23dc12bf5 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 24 Jul 2026 03:57:14 +0000 Subject: [PATCH 11/28] docs: use third person in Slack PR documentation changes Co-authored-by: miguelangaranocurrents --- .../data-privacy/access-to-customer-data.md | 2 +- resources/integrations/slack/README.md | 6 +++--- resources/integrations/slack/slack-app.md | 16 ++++++++-------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/resources/data-privacy/access-to-customer-data.md b/resources/data-privacy/access-to-customer-data.md index a79d8c23..4f3377b0 100644 --- a/resources/data-privacy/access-to-customer-data.md +++ b/resources/data-privacy/access-to-customer-data.md @@ -52,5 +52,5 @@ We collect diverse data from our users' test suites, which are strictly limited * **GitHub**: No access to data or repos source code; we post comments and status check updates for Pull Requests. The integration application is listed here: [https://github.com/apps/currents-bot](https://github.com/apps/currents-bot), and the list of permissions appears as part of the setup. * **GitLab**: We list repositories and projects, refresh oAuth tokens, post notes and status check updates to Merge Requests, fetching Merge Request details. * **BitBucket**: No access to data; we only post status check updates for Pull Requests. -* **Microsoft Teams**: We post messages within the restrictions of the platform's rules. +* **Microsoft Teams**: Currents posts messages within the restrictions of the platform's rules. * **Slack**: The Slack App lists accessible channels; reads workspace, user, email, and user-group metadata; posts messages and thread replies; sends direct installation and re-authentication messages; and processes supported Slack interactions and message metadata. Access is limited by the OAuth permissions approved during installation and Slack channel-membership rules. diff --git a/resources/integrations/slack/README.md b/resources/integrations/slack/README.md index 2ec900dd..1ab4e246 100644 --- a/resources/integrations/slack/README.md +++ b/resources/integrations/slack/README.md @@ -6,12 +6,12 @@ icon: slack # Slack -Currents integration with Slack allows posting test results directly into Slack channels, helping your team stay informed about test outcomes without leaving Slack. +Currents integration with Slack allows posting test results directly into Slack channels, helping teams stay informed about test outcomes without leaving Slack. There are two versions of Slack integration available: {% hint style="info" %} -**Recommendation:** We recommend using the Slack App integration due to its advanced features and improved security model. +**Recommendation:** Currents recommends using the Slack App integration due to its advanced features and improved security model. {% endhint %} ## [Slack App](slack-app.md) Integration (Recommended) @@ -19,7 +19,7 @@ There are two versions of Slack integration available: The Slack App integration provides a rich, feature-complete experience for test notifications: * ✅ Organization-level installation with per-project configuration -* ✅ Multiple destinations (the dashboard shows your organization's limit; the default is 10) +* ✅ Multiple destinations (the dashboard shows the organization's limit; the default is 10) * ✅ Run-level notifications with thread-based grouping * ✅ Individual failed or flaky test notifications * ✅ Fix with AI from failed-test messages diff --git a/resources/integrations/slack/slack-app.md b/resources/integrations/slack/slack-app.md index 9c32a057..7c076f69 100644 --- a/resources/integrations/slack/slack-app.md +++ b/resources/integrations/slack/slack-app.md @@ -4,11 +4,11 @@ description: Slack App integration for Currents - test notifications and alerts # Slack App -Integrate Slack with Currents to receive real-time test notifications and failure alerts directly in your team's channels. The Slack App helps engineering teams stay informed about test results without leaving their workflow. +Integrate Slack with Currents to receive real-time test notifications and failure alerts directly in team channels. The Slack App helps engineering teams stay informed about test results without leaving their workflow. ## Use Cases -- **Instant failure alerts**: Get notified immediately when tests fail, allowing your team to respond quickly before issues reach production. +- **Instant failure alerts**: Notify teams immediately when tests fail so they can respond quickly before issues reach production. - **Flaky test detection**: Receive Slack alerts when tests exhibit flaky behavior, helping maintain test suite reliability. - **Team routing**: Automatically mention the right team members based on which tests failed - route checkout failures to the payments team, API failures to backend engineers. - **Release gating**: Send notifications to release managers when smoke tests or critical tests fail on main or release branches. @@ -100,7 +100,7 @@ Re-authenticating normally preserves the existing project configuration. If Slac ## Notification Destinations -The dashboard shows the destination limit for your organization; the default is **10**. Destinations let you send notifications to different Slack channels based on your needs. +The dashboard shows the destination limit for the organization; the default is **10**. Destinations allow notifications to be sent to different Slack channels based on project needs. ### Adding a Destination @@ -248,7 +248,7 @@ Messages display up to five test results. When more tests require attention, the ### Fix with AI -Failed-test messages include a **Fix with AI** button. It opens a modal where you can: +Failed-test messages include a **Fix with AI** button. The modal provides options to: - Open the failure context directly in Cursor - Open it in GitHub Copilot @@ -368,7 +368,7 @@ This removes the organization-level Slack installation and disables notification ### Can I send notifications to multiple channels? -Yes. The dashboard shows the destination limit for your organization; the default is 10. Each destination can target a different Slack channel with its own configuration. +Yes. The dashboard shows the destination limit for the organization; the default is 10. Each destination can target a different Slack channel with its own configuration. ### Why am I not receiving notifications? @@ -376,9 +376,9 @@ Check the following: 1. **Project-level toggle** - Ensure "Enable Notifications" is turned on 2. **Destination toggle** - Ensure the specific destination is enabled -3. **Notification mode** - Confirm the selected run-result mode matches the outcome you expect -4. **Filters** - Check if any tag or branch filters are excluding your runs -5. **Mention rules** - Ensure conditions match your test properties +3. **Notification mode** - Confirm the selected run-result mode matches the expected outcome +4. **Filters** - Check whether any tag or branch filters are excluding runs +5. **Mention rules** - Ensure conditions match test properties 6. **Installation permissions** - If notifications stopped entirely, the Slack token may have been invalidated (`account_inactive`). See [Why did notifications stop with an `account_inactive` error?](#why-did-notifications-stop-with-an-account_inactive-error) ### Why did notifications stop with an `account_inactive` error? From 96a8ebcc1f850936d612f7e1158a5cf2d41456e1 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 28 Jul 2026 00:53:40 +0000 Subject: [PATCH 12/28] docs: restore third-person Action lifecycle wording in Slack overview Co-authored-by: miguelangaranocurrents --- resources/integrations/slack/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/integrations/slack/README.md b/resources/integrations/slack/README.md index 1ab4e246..d7ad5402 100644 --- a/resources/integrations/slack/README.md +++ b/resources/integrations/slack/README.md @@ -28,7 +28,7 @@ The Slack App integration provides a rich, feature-complete experience for test * ✅ UI-based mention rules configuration * ✅ Improved security with OAuth 2.0 -The Slack App also delivers independently configured [Action lifecycle notifications](../../../guides/currents-actions/lifecycle-notifications.md) for actions that are created, disabled, re-enabled, archived, expiring, or expired. Connecting Slack under **Integrations** does not enable these notifications; configure them under **Actions > Settings**. +The Slack App also delivers independently configured [Action lifecycle notifications](../../../guides/currents-actions/lifecycle-notifications.md) for actions that are created, disabled, re-enabled, archived, expiring, or expired. Connecting Slack under **Integrations** does not enable these notifications; Action notifications are configured under **Actions > Settings**. ## [Slack Webhook](slack-webhook.md) Integration (Legacy) From 5886cbb4952fc0d72716c40099b1e9dda653eb13 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 29 Jul 2026 14:58:39 +0000 Subject: [PATCH 13/28] docs: cover ENG-895 Slack run colors, recovery, and live group updates Co-authored-by: miguelangaranocurrents --- resources/integrations/slack/README.md | 6 ++++++ resources/integrations/slack/slack-app.md | 22 ++++++++++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/resources/integrations/slack/README.md b/resources/integrations/slack/README.md index d7ad5402..8dc4df90 100644 --- a/resources/integrations/slack/README.md +++ b/resources/integrations/slack/README.md @@ -23,6 +23,8 @@ The Slack App integration provides a rich, feature-complete experience for test * ✅ Run-level notifications with thread-based grouping * ✅ Individual failed or flaky test notifications * ✅ Fix with AI from failed-test messages +* ✅ Run attachment colors for in-progress, success, and error states +* ✅ Live updates to the groups table on threaded run notifications * ✅ Advanced filtering by tags, branches, and commit messages * ✅ Annotation-based mentions (users, groups, emails) * ✅ UI-based mention rules configuration @@ -30,6 +32,10 @@ The Slack App integration provides a rich, feature-complete experience for test The Slack App also delivers independently configured [Action lifecycle notifications](../../../guides/currents-actions/lifecycle-notifications.md) for actions that are created, disabled, re-enabled, archived, expiring, or expired. Connecting Slack under **Integrations** does not enable these notifications; Action notifications are configured under **Actions > Settings**. +{% hint style="info" %} +**Automated reports:** Scheduled automated reports to Slack ([ENG-179](https://linear.app/currents-dev/issue/ENG-179)) are still in development and are not documented here yet. +{% endhint %} + ## [Slack Webhook](slack-webhook.md) Integration (Legacy) The webhook-based integration provides basic notification functionality: diff --git a/resources/integrations/slack/slack-app.md b/resources/integrations/slack/slack-app.md index 7c076f69..04b1ee73 100644 --- a/resources/integrations/slack/slack-app.md +++ b/resources/integrations/slack/slack-app.md @@ -155,6 +155,22 @@ This keeps your Slack channels organized and prevents notification overload. When **Message Threading** is disabled, each notification is sent as a standalone message in the channel. +### Run message appearance + +Run notifications use Slack **attachment colors** so run state is easy to scan in the channel list: + +| Attachment color | Meaning | +| --- | --- | +| **In progress** | The run is still executing | +| **Success** | The run finished with a passing outcome for the configured notification mode | +| **Error** | The run finished in a failed or otherwise error state for the configured notification mode | + +Detailed counts in the threaded **groups** table use the same status colors as other Currents Slack notifications: green for passed tests, red for failed and skipped tests, grey for ignored tests, and purple for flaky tests. + +### Results table updates during a run + +When **Message Threading** is enabled, Currents posts a main thread for the run and **updates the groups table on that thread** as groups finish while the run is still in progress. Teams see partial group results without waiting for every group to complete first. + ### Notification Modes Configure when run notifications are sent: @@ -164,7 +180,9 @@ Configure when run notifications are sent: | **Always send** | Send notifications for every run, regardless of outcome | | **Only when there are failures** | Send notifications only when there are failed tests | | **Only when there are failed or flaky tests** | Send notifications when failed or flaky tests are detected | -| **Only when all tests are passing** | Send notifications only when all tests pass | +| **Only when all tests are passing** | Send notifications only when all tests pass (passing-only run outcome) | + +When **Only when there are failures** is selected, the platform can also send a **recovery** notification: if a run already triggered a failure notification for that destination, a later completion with a passing outcome can post a success update so the channel shows when the pipeline is green again. ### Additional Run Events @@ -393,4 +411,4 @@ Yes, both methods work together. Annotation-based mentions take precedence and a ### What happens when a run has multiple groups? -By default, notifications are sent when all groups complete. You may still receive multiple notifications if one group finishes before others are discovered. For example, if one group completes before other groups are known, an early notification may be sent. +With **Message Threading** enabled, Currents keeps one run thread per destination and updates the **groups** table on that thread as groups complete during the run. Individual test failures and run-result replies stay in the same thread instead of filling the channel with separate run summaries for each group. From ff293f6157a79e5690bd08721f0a47a1226fe579 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 29 Jul 2026 15:08:30 +0000 Subject: [PATCH 14/28] docs: fix Requirements section anchor in Slack app FAQ Co-authored-by: miguelangaranocurrents --- resources/integrations/slack/slack-app.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/integrations/slack/slack-app.md b/resources/integrations/slack/slack-app.md index 04b1ee73..e1dbd675 100644 --- a/resources/integrations/slack/slack-app.md +++ b/resources/integrations/slack/slack-app.md @@ -403,7 +403,7 @@ Check the following: This usually means the Slack access token was invalidated because the app was installed without the required administrator permissions. In an Enterprise Grid organization, apps must be installed (or approved) by an **Org Owner/Admin** - a workspace-level admin alone is not sufficient, and Slack may later deactivate that installation's token. -The fix is to [disconnect](#disconnect-slack) the integration and reinstall it with an Org Owner/Admin (or a Workspace Owner/Admin for single-workspace accounts). See [Requirements](#requirements) for the full breakdown. +The fix is to [disconnect](#disconnect-slack) the integration and reinstall it with an Org Owner/Admin (or a Workspace Owner/Admin for single-workspace accounts). See [Requirements and permissions](#requirements-and-permissions) for the full breakdown. ### Can I use both annotation mentions and UI rules? From 320ebff64d9d1749aa16a16a4a5c20cd12147269 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 29 Jul 2026 15:15:22 +0000 Subject: [PATCH 15/28] docs: document Slack attachment color API values for run notifications Co-authored-by: miguelangaranocurrents --- resources/integrations/slack/slack-app.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/resources/integrations/slack/slack-app.md b/resources/integrations/slack/slack-app.md index e1dbd675..c59782fe 100644 --- a/resources/integrations/slack/slack-app.md +++ b/resources/integrations/slack/slack-app.md @@ -157,15 +157,17 @@ When **Message Threading** is disabled, each notification is sent as a standalon ### Run message appearance -Run notifications use Slack **attachment colors** so run state is easy to scan in the channel list: +Run notifications set the Slack attachment [`color`](https://api.slack.com/reference/messaging/attachments) field (the colored bar beside the message). Only Slack-defined values are valid for `attachments[].color`; do not use display labels such as “Success” or “In progress” as the field value. -| Attachment color | Meaning | +| Slack `color` value | Run state | | --- | --- | -| **In progress** | The run is still executing | -| **Success** | The run finished with a passing outcome for the configured notification mode | -| **Error** | The run finished in a failed or otherwise error state for the configured notification mode | +| `warning` | The run is still in progress | +| `good` | The run finished with a passing outcome for the configured notification mode | +| `danger` | The run finished with a failed or otherwise error outcome for the configured notification mode | -Detailed counts in the threaded **groups** table use the same status colors as other Currents Slack notifications: green for passed tests, red for failed and skipped tests, grey for ignored tests, and purple for flaky tests. +A recovery notification after a prior failure uses `good` when the run completes with a passing outcome. + +The threaded **groups** table uses separate status styling in the message body (not the attachment `color` field): green for passed tests, red for failed and skipped tests, grey for ignored tests, and purple for flaky tests. ### Results table updates during a run From e27eb356fc9f265a9c0de346828c1b5f0fc35ebf Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 29 Jul 2026 15:27:36 +0000 Subject: [PATCH 16/28] docs(slack): document ENG-179 automated reports to Slack Add Slack App guidance for scheduled automated reports (Block Kit delivery, per-report channel configuration, prerequisites) and cross-link from automated-reports.md. Remove in-development notice. Co-authored-by: miguelangaranocurrents --- dashboard/automated-reports.md | 19 +++++++++++ resources/integrations/slack/README.md | 5 ++- resources/integrations/slack/slack-app.md | 41 +++++++++++++++++++++++ 3 files changed, 62 insertions(+), 3 deletions(-) diff --git a/dashboard/automated-reports.md b/dashboard/automated-reports.md index b8144798..a66412f1 100644 --- a/dashboard/automated-reports.md +++ b/dashboard/automated-reports.md @@ -68,8 +68,27 @@ Configure the settings and enable the automated report: 9. Use **Preview** to examine and change the report settings. +### Send automated reports to Slack (Slack App) + +Projects with the [Slack App](../resources/integrations/slack/slack-app.md) connected at the organization level can deliver the same scheduled report to Slack channels. + +On the report customization page: + +1. Enable the report and configure label, filters, lookback period, and schedule as for email. +2. In the report **Slack** settings, enable **Send to Slack**. +3. Select the Slack channel or channels that should receive the report. The Currents app must be able to post in each channel (invite the app to private channels if needed). +4. Save the report. Email recipients and Slack channels can be used together or independently. + +At the scheduled time, Currents posts a Block Kit summary to each selected channel, with links to the full report in the dashboard. Message content matches the report’s filters and period; it is a channel-friendly summary rather than a copy of the HTML email. + +For prerequisites, channel selection, and troubleshooting, see [Automated Reports to Slack](../resources/integrations/slack/slack-app.md#automated-reports-to-slack). + ### Forward automated reports email to Slack +{% hint style="info" %} +**Recommendation:** When the organization uses the Currents Slack App, prefer [native Slack delivery](#send-automated-reports-to-slack-slack-app) on the report instead of forwarding email. Native delivery posts structured Block Kit messages and does not depend on Slack inbound email addresses. +{% endhint %} + Slack currently allows receiving emails in a Slack channel or private message. Slack generates an email where the automated reports will be sent and that must be registered in the dashboard. Slack then receives the email and forwards the email to the previously setup channel. diff --git a/resources/integrations/slack/README.md b/resources/integrations/slack/README.md index 8dc4df90..8e7449d2 100644 --- a/resources/integrations/slack/README.md +++ b/resources/integrations/slack/README.md @@ -28,13 +28,12 @@ The Slack App integration provides a rich, feature-complete experience for test * ✅ Advanced filtering by tags, branches, and commit messages * ✅ Annotation-based mentions (users, groups, emails) * ✅ UI-based mention rules configuration +* ✅ Scheduled [Automated Reports](../../../dashboard/automated-reports.md) to Slack channels (Block Kit summaries with dashboard links) * ✅ Improved security with OAuth 2.0 The Slack App also delivers independently configured [Action lifecycle notifications](../../../guides/currents-actions/lifecycle-notifications.md) for actions that are created, disabled, re-enabled, archived, expiring, or expired. Connecting Slack under **Integrations** does not enable these notifications; Action notifications are configured under **Actions > Settings**. -{% hint style="info" %} -**Automated reports:** Scheduled automated reports to Slack ([ENG-179](https://linear.app/currents-dev/issue/ENG-179)) are still in development and are not documented here yet. -{% endhint %} +Scheduled automated reports are configured per report on the project **Reports** page; see [Automated Reports to Slack](slack-app.md#automated-reports-to-slack). ## [Slack Webhook](slack-webhook.md) Integration (Legacy) diff --git a/resources/integrations/slack/slack-app.md b/resources/integrations/slack/slack-app.md index c59782fe..07de1591 100644 --- a/resources/integrations/slack/slack-app.md +++ b/resources/integrations/slack/slack-app.md @@ -364,6 +364,47 @@ Both [Annotation-Based Mentions](#annotation-based-mentions) and [UI-Based Menti **Finding Slack IDs:** See [Slack's documentation](https://slack.com/help/articles/360057541954-Get-user-and-group-IDs) for instructions on finding user and group IDs. {% endhint %} +## Automated Reports to Slack + +Scheduled [Automated Reports](../../../dashboard/automated-reports.md) can be delivered to Slack channels through the **Currents Slack App**, in addition to email. Delivery uses the same report definition (schedule, lookback period, and tag, author, and branch filters) as email; only the destination changes. + +Automated report messages are separate from [run notifications](#run-notifications) and [individual test notifications](#individual-test-notifications). Report Slack settings are configured on each report in the **Reports** section of the project, not under **Project Settings > Integrations > Slack** destinations. + +### Prerequisites + +Before a report can post to Slack: + +1. The organization must [connect the Slack App](#connecting-slack-to-your-organization) with a user who has the required Slack administrator role (see [Requirements and permissions](#requirements-and-permissions)). +2. The Currents app must be allowed to post in the target channel. For **private channels**, the app must be invited to the channel before delivery succeeds (see [Public and Private Channels](#public-and-private-channels)). + +{% hint style="info" %} +Native Slack App delivery for automated reports is available on Currents cloud. It does not replace per-project Incoming Webhook integrations or on-premises report configuration. +{% endhint %} + +### Configuring Slack delivery for a report + +1. Open the project **Reports** section and create or edit a report (see [Managing Automated Reports](../../../dashboard/automated-reports.md#managing-automated-reports)). +2. Enable the report and configure label, filters, lookback period, and schedule as for email delivery. +3. In the report's **Slack** settings, enable **Send to Slack**. +4. Select one or more Slack channels for the report. The channel picker lists channels visible to the Currents Slack App in the connected workspace. If a channel does not appear, use **Manual Input** and enter the channel ID and name (same approach as [notification destinations](#notification-destinations)). +5. Optionally keep **email recipients** configured so the same report is sent to both email and Slack. +6. Save the report and use **Preview** to validate settings before the next scheduled send. + +### What appears in Slack + +When a scheduled report runs, Currents posts a **Block Kit** message to each configured channel. The message summarizes the same performance insights as the email report (runs, tests, specs, and trend highlights for the selected period) and includes links to open the full report and related views in the Currents dashboard. + +Slack messages are optimized for channel reading; they do not duplicate the full HTML email layout. Teams that need the complete email formatting can continue to use email recipients, or the [email-to-Slack forwarding](../../../dashboard/automated-reports.md#forward-automated-reports-email-to-slack) workaround described in the Automated Reports documentation. + +### Troubleshooting report delivery + +| Symptom | What to check | +| --- | --- | +| No Slack message at the scheduled time | Report **Enable/Disable** is on; **Send to Slack** is enabled; at least one channel is selected; schedule and timezone are correct | +| Email arrives but Slack does not | Slack-specific settings on the report; organization [installation status](#installation-status-and-recovery) (`Credentials expired`, `Installation archived`, and similar) | +| Slack API errors for a channel | App membership in the channel (especially private channels); channel ID when using manual entry | +| Run notifications work but reports do not | Reports use per-report Slack settings on the **Reports** page, not integration **destinations** | + ## Disabling Slack Integration ### Disable for a Project From f3aa91b9e17e32817905cfd6d63f9a88c832e504 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 4 Aug 2026 12:50:19 +0000 Subject: [PATCH 17/28] docs(automated-reports): document single Slack channel selection Address PR review: automated reports support one Slack channel per report. Co-authored-by: miguelangaranocurrents --- dashboard/automated-reports.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dashboard/automated-reports.md b/dashboard/automated-reports.md index a66412f1..06985ad0 100644 --- a/dashboard/automated-reports.md +++ b/dashboard/automated-reports.md @@ -76,8 +76,8 @@ On the report customization page: 1. Enable the report and configure label, filters, lookback period, and schedule as for email. 2. In the report **Slack** settings, enable **Send to Slack**. -3. Select the Slack channel or channels that should receive the report. The Currents app must be able to post in each channel (invite the app to private channels if needed). -4. Save the report. Email recipients and Slack channels can be used together or independently. +3. Select the Slack channel that should receive the report. The Currents app must be able to post in the channel (invite the app to private channels if needed). +4. Save the report. Email recipients and a Slack channel can be used together or independently. At the scheduled time, Currents posts a Block Kit summary to each selected channel, with links to the full report in the dashboard. Message content matches the report’s filters and period; it is a channel-friendly summary rather than a copy of the HTML email. From d193bfdb4679d287cdc0f6fac9163cba6a7aeb35 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 4 Aug 2026 12:50:28 +0000 Subject: [PATCH 18/28] docs(automated-reports): describe Slack report message contents Address PR review: document the limited Block Kit summary shown in Slack. Co-authored-by: miguelangaranocurrents --- dashboard/automated-reports.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dashboard/automated-reports.md b/dashboard/automated-reports.md index 06985ad0..2843bbb2 100644 --- a/dashboard/automated-reports.md +++ b/dashboard/automated-reports.md @@ -79,7 +79,7 @@ On the report customization page: 3. Select the Slack channel that should receive the report. The Currents app must be able to post in the channel (invite the app to private channels if needed). 4. Save the report. Email recipients and a Slack channel can be used together or independently. -At the scheduled time, Currents posts a Block Kit summary to each selected channel, with links to the full report in the dashboard. Message content matches the report’s filters and period; it is a channel-friendly summary rather than a copy of the HTML email. +At the scheduled time, Currents posts a Block Kit summary to the selected channel. The message includes the report title and period, a link to change report settings, headline metrics (runs, tests, test success rate, flakiness rate, and average run duration), trend comparisons versus the previous period, and action buttons for Runs, Test results, Tests, Specs, and Errors. It is a channel-friendly summary rather than a copy of the full HTML email. For prerequisites, channel selection, and troubleshooting, see [Automated Reports to Slack](../resources/integrations/slack/slack-app.md#automated-reports-to-slack). From 006e757876309dac80e2a0df45c456a07778a9c6 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 4 Aug 2026 12:50:31 +0000 Subject: [PATCH 19/28] docs(ai): rephrase Fix with AI from Slack section Address PR review: avoid opening with 'The modal' before users know one opens. Co-authored-by: miguelangaranocurrents --- ai/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ai/overview.md b/ai/overview.md index f82504d6..a45acb94 100644 --- a/ai/overview.md +++ b/ai/overview.md @@ -87,7 +87,7 @@ This is the bridge from investigation to action: whoever is looking at the faili ### Fix with AI from Slack -Failed-test notifications from the [Slack App](../resources/integrations/slack/slack-app.md#fix-with-ai) include a **Fix with AI** button. The modal can open the failure in Cursor or GitHub Copilot, provide a copyable prompt for Claude, Codex, Zed, Conductor, and other tools, and link to the Currents MCP installation. This lets anyone monitoring a team channel route a failure to an agent without first opening the Currents dashboard. +Failed-test notifications from the [Slack App](../resources/integrations/slack/slack-app.md#fix-with-ai) include a **Fix with AI** button. Clicking it opens options to route the failure to Cursor or GitHub Copilot, copy a prompt for Claude, Codex, Zed, Conductor, and other tools, or open the Currents MCP installation. This lets anyone monitoring a team channel route a failure to an agent without first opening the Currents dashboard. ### Playwright Skill From 902881ff42380134519de140cf1e98aa70990e45 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 4 Aug 2026 12:50:36 +0000 Subject: [PATCH 20/28] docs(automated-reports): remove Slack delivery recommendation hint Address PR review: drop redundant native Slack delivery recommendation. Co-authored-by: miguelangaranocurrents --- dashboard/automated-reports.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/dashboard/automated-reports.md b/dashboard/automated-reports.md index 2843bbb2..6e8a6116 100644 --- a/dashboard/automated-reports.md +++ b/dashboard/automated-reports.md @@ -85,10 +85,6 @@ For prerequisites, channel selection, and troubleshooting, see [Automated Report ### Forward automated reports email to Slack -{% hint style="info" %} -**Recommendation:** When the organization uses the Currents Slack App, prefer [native Slack delivery](#send-automated-reports-to-slack-slack-app) on the report instead of forwarding email. Native delivery posts structured Block Kit messages and does not depend on Slack inbound email addresses. -{% endhint %} - Slack currently allows receiving emails in a Slack channel or private message. Slack generates an email where the automated reports will be sent and that must be registered in the dashboard. Slack then receives the email and forwards the email to the previously setup channel. From 9e444d13eeab74a8a74b468b7eb2555e113a956f Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 4 Aug 2026 12:50:38 +0000 Subject: [PATCH 21/28] docs(slack): include timed-out state in attachment colors Address PR review: run attachment colors also apply to timed-out runs. Co-authored-by: miguelangaranocurrents --- resources/integrations/slack/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/integrations/slack/README.md b/resources/integrations/slack/README.md index 8e7449d2..a2fa62d8 100644 --- a/resources/integrations/slack/README.md +++ b/resources/integrations/slack/README.md @@ -23,7 +23,7 @@ The Slack App integration provides a rich, feature-complete experience for test * ✅ Run-level notifications with thread-based grouping * ✅ Individual failed or flaky test notifications * ✅ Fix with AI from failed-test messages -* ✅ Run attachment colors for in-progress, success, and error states +* ✅ Run attachment colors for in-progress, success, error, and timed-out states * ✅ Live updates to the groups table on threaded run notifications * ✅ Advanced filtering by tags, branches, and commit messages * ✅ Annotation-based mentions (users, groups, emails) From 0b9f04326d56c9f1c5d8c38c03a8151e8a8b5b32 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 4 Aug 2026 12:50:50 +0000 Subject: [PATCH 22/28] docs(slack-app): remove attachment color API implementation detail Address PR review: drop customer-facing attachments[].color API note. Co-authored-by: miguelangaranocurrents --- resources/integrations/slack/slack-app.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/integrations/slack/slack-app.md b/resources/integrations/slack/slack-app.md index 07de1591..c26b2b51 100644 --- a/resources/integrations/slack/slack-app.md +++ b/resources/integrations/slack/slack-app.md @@ -157,7 +157,7 @@ When **Message Threading** is disabled, each notification is sent as a standalon ### Run message appearance -Run notifications set the Slack attachment [`color`](https://api.slack.com/reference/messaging/attachments) field (the colored bar beside the message). Only Slack-defined values are valid for `attachments[].color`; do not use display labels such as “Success” or “In progress” as the field value. +Run notifications set the Slack attachment [`color`](https://api.slack.com/reference/messaging/attachments) field (the colored bar beside the message). | Slack `color` value | Run state | | --- | --- | From 2a7e221d2ba4ab935d1bfad089b34fc9d40f6828 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 4 Aug 2026 12:51:02 +0000 Subject: [PATCH 23/28] docs(slack-app): use user-friendly run attachment color labels Address PR review: describe colors as yellow, green, and red instead of Slack API values. Co-authored-by: miguelangaranocurrents --- resources/integrations/slack/slack-app.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/resources/integrations/slack/slack-app.md b/resources/integrations/slack/slack-app.md index c26b2b51..764aeecd 100644 --- a/resources/integrations/slack/slack-app.md +++ b/resources/integrations/slack/slack-app.md @@ -157,15 +157,15 @@ When **Message Threading** is disabled, each notification is sent as a standalon ### Run message appearance -Run notifications set the Slack attachment [`color`](https://api.slack.com/reference/messaging/attachments) field (the colored bar beside the message). +Run notifications include a colored bar beside the message that reflects the run state: -| Slack `color` value | Run state | +| Color | Run state | | --- | --- | -| `warning` | The run is still in progress | -| `good` | The run finished with a passing outcome for the configured notification mode | -| `danger` | The run finished with a failed or otherwise error outcome for the configured notification mode | +| Yellow | The run is still in progress | +| Green | The run finished with a passing outcome for the configured notification mode | +| Red | The run finished with a failed, timed-out, or otherwise error outcome for the configured notification mode | -A recovery notification after a prior failure uses `good` when the run completes with a passing outcome. +A recovery notification after a prior failure shows green when the run completes with a passing outcome. The threaded **groups** table uses separate status styling in the message body (not the attachment `color` field): green for passed tests, red for failed and skipped tests, grey for ignored tests, and purple for flaky tests. From f054f69574f50723d8553a40eb5ca0cff84354fc Mon Sep 17 00:00:00 2001 From: miguelangarano Date: Tue, 4 Aug 2026 08:35:37 -0500 Subject: [PATCH 24/28] chore: update slack notification description --- .../automated-report-slack-notification.png | Bin 0 -> 56288 bytes dashboard/automated-reports.md | 15 ++++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 .gitbook/assets/automated-report-slack-notification.png diff --git a/.gitbook/assets/automated-report-slack-notification.png b/.gitbook/assets/automated-report-slack-notification.png new file mode 100644 index 0000000000000000000000000000000000000000..a4186a41391698077e896724a1b229e10bb5294f GIT binary patch literal 56288 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 HhyOPL%&LV% literal 0 HcmV?d00001 diff --git a/dashboard/automated-reports.md b/dashboard/automated-reports.md index 6e8a6116..5e7bb761 100644 --- a/dashboard/automated-reports.md +++ b/dashboard/automated-reports.md @@ -79,7 +79,20 @@ On the report customization page: 3. Select the Slack channel that should receive the report. The Currents app must be able to post in the channel (invite the app to private channels if needed). 4. Save the report. Email recipients and a Slack channel can be used together or independently. -At the scheduled time, Currents posts a Block Kit summary to the selected channel. The message includes the report title and period, a link to change report settings, headline metrics (runs, tests, test success rate, flakiness rate, and average run duration), trend comparisons versus the previous period, and action buttons for Runs, Test results, Tests, Specs, and Errors. It is a channel-friendly summary rather than a copy of the full HTML email. +At the scheduled time, Currents posts a Block Kit summary to the selected channel. The notification is a channel-friendly summary rather than a copy of the full HTML email. + +
Slack automated report notification showing headline metrics and dashboard links

Slack automated report notification

+ +Each message includes: + +* **Header** — report title (for example, `📊 Weekly update for General testing`), project name, reporting period date range, and a **Change report settings** link. +* **Headline metrics** — a 2×2 grid with: + * **Runs** — total runs and run success rate + * **Tests** — total tests and flakiness rate + * **Test success rate** — overall pass rate for the period + * **Avg run duration** — average time per run +* **Trend comparison** — changes versus the previous lookback period (for example, test success rate and average run duration), with up/down indicators. +* **Action buttons** — quick links to open the related views in the Currents dashboard: **Runs**, **Test results**, **Tests**, **Specs**, and **Errors**. For prerequisites, channel selection, and troubleshooting, see [Automated Reports to Slack](../resources/integrations/slack/slack-app.md#automated-reports-to-slack). From b2f6d3c119bd395e8e74066c619b707ab05e5dbd Mon Sep 17 00:00:00 2001 From: miguelangarano Date: Tue, 4 Aug 2026 09:25:49 -0500 Subject: [PATCH 25/28] chore: remove useless info --- resources/integrations/slack/slack-app.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/resources/integrations/slack/slack-app.md b/resources/integrations/slack/slack-app.md index 764aeecd..939187eb 100644 --- a/resources/integrations/slack/slack-app.md +++ b/resources/integrations/slack/slack-app.md @@ -377,10 +377,6 @@ Before a report can post to Slack: 1. The organization must [connect the Slack App](#connecting-slack-to-your-organization) with a user who has the required Slack administrator role (see [Requirements and permissions](#requirements-and-permissions)). 2. The Currents app must be allowed to post in the target channel. For **private channels**, the app must be invited to the channel before delivery succeeds (see [Public and Private Channels](#public-and-private-channels)). -{% hint style="info" %} -Native Slack App delivery for automated reports is available on Currents cloud. It does not replace per-project Incoming Webhook integrations or on-premises report configuration. -{% endhint %} - ### Configuring Slack delivery for a report 1. Open the project **Reports** section and create or edit a report (see [Managing Automated Reports](../../../dashboard/automated-reports.md#managing-automated-reports)). From 4a9a8ef66a518e69f79449dec3ebac7fb0f7eaec Mon Sep 17 00:00:00 2001 From: Maxi Gimenez Date: Wed, 5 Aug 2026 13:07:14 +0100 Subject: [PATCH 26/28] feat: docs updates --- ai/overview.md | 4 +-- dashboard/automated-reports.md | 33 ++++------------------- resources/integrations/slack/README.md | 4 +-- resources/integrations/slack/slack-app.md | 25 ++++++++--------- 4 files changed, 20 insertions(+), 46 deletions(-) diff --git a/ai/overview.md b/ai/overview.md index a45acb94..e88c86f9 100644 --- a/ai/overview.md +++ b/ai/overview.md @@ -33,7 +33,7 @@ Every entry point below delivers this same context - they differ in where you ar | [MCP Server](mcp-server.md) | Any MCP-capable agent | Agents querying runs, tests, and analytics on demand; autonomous troubleshooting | | [IDE Extension](ide-extension.md) | VS Code, Cursor, compatible forks | Debugging CI failures without leaving the editor | | [Fix with AI](overview.md#fix-with-ai-from-the-dashboard) | Currents dashboard | Handing a failure to an agent while triaging a run | -| [Slack Fix with AI](../resources/integrations/slack/slack-app.md#fix-with-ai) | Slack | Handing a failed-test notification to an agent from a team channel | +| [Slack Fix with AI](../resources/integrations/slack/slack-app.md#fix-with-ai) | Slack | Handing a failed-test notification to an agent from a channel | | [Playwright Skill](agent-skill-playwright-best-practices.md) | Claude Code, Cursor, other agents | Teaching agents how to write and fix Playwright tests correctly | | [n8n](../resources/integrations/n8n.md) | n8n workflows | Automated triage, notifications, and agent pipelines without code | @@ -87,7 +87,7 @@ This is the bridge from investigation to action: whoever is looking at the faili ### Fix with AI from Slack -Failed-test notifications from the [Slack App](../resources/integrations/slack/slack-app.md#fix-with-ai) include a **Fix with AI** button. Clicking it opens options to route the failure to Cursor or GitHub Copilot, copy a prompt for Claude, Codex, Zed, Conductor, and other tools, or open the Currents MCP installation. This lets anyone monitoring a team channel route a failure to an agent without first opening the Currents dashboard. +Failed-test notifications from the [Slack App](../resources/integrations/slack/slack-app.md#fix-with-ai) include a **Fix with AI** button. This sends the failed test context to Cursor, GitHub Copilot, Claude, Codex, Zed, Conductor, and other AI agents. Anyone monitoring a team channel can route a failure to an agent without opening the Currents dashboard. ### Playwright Skill diff --git a/dashboard/automated-reports.md b/dashboard/automated-reports.md index 5e7bb761..7916a5fb 100644 --- a/dashboard/automated-reports.md +++ b/dashboard/automated-reports.md @@ -68,41 +68,18 @@ Configure the settings and enable the automated report: 9. Use **Preview** to examine and change the report settings. -### Send automated reports to Slack (Slack App) +### Send automated reports to Slack -Projects with the [Slack App](../resources/integrations/slack/slack-app.md) connected at the organization level can deliver the same scheduled report to Slack channels. +Projects with the [Slack App](../resources/integrations/slack/slack-app.md) connected at the organization level can deliver the same scheduled report to a Slack channel. On the report customization page: 1. Enable the report and configure label, filters, lookback period, and schedule as for email. -2. In the report **Slack** settings, enable **Send to Slack**. -3. Select the Slack channel that should receive the report. The Currents app must be able to post in the channel (invite the app to private channels if needed). +2. In the **Slack** setting, enable **Send to Slack**. +3. Select the Slack channel that should receive the report. 4. Save the report. Email recipients and a Slack channel can be used together or independently. -At the scheduled time, Currents posts a Block Kit summary to the selected channel. The notification is a channel-friendly summary rather than a copy of the full HTML email. - -
Slack automated report notification showing headline metrics and dashboard links

Slack automated report notification

- -Each message includes: - -* **Header** — report title (for example, `📊 Weekly update for General testing`), project name, reporting period date range, and a **Change report settings** link. -* **Headline metrics** — a 2×2 grid with: - * **Runs** — total runs and run success rate - * **Tests** — total tests and flakiness rate - * **Test success rate** — overall pass rate for the period - * **Avg run duration** — average time per run -* **Trend comparison** — changes versus the previous lookback period (for example, test success rate and average run duration), with up/down indicators. -* **Action buttons** — quick links to open the related views in the Currents dashboard: **Runs**, **Test results**, **Tests**, **Specs**, and **Errors**. - -For prerequisites, channel selection, and troubleshooting, see [Automated Reports to Slack](../resources/integrations/slack/slack-app.md#automated-reports-to-slack). - -### Forward automated reports email to Slack - -Slack currently allows receiving emails in a Slack channel or private message. - -Slack generates an email where the automated reports will be sent and that must be registered in the dashboard. Slack then receives the email and forwards the email to the previously setup channel. - -Check the [Slack documentation](https://slack.com/help/articles/206819278-Send-emails-to-Slack) for more information and detailed steps. +At the scheduled time, Currents posts a Block Kit summary to the selected channel. For details on the message format, prerequisites, channel selection, and troubleshooting, see [Automated Reports to Slack](../resources/integrations/slack/slack-app.md#automated-reports-to-slack). ### Report Structure diff --git a/resources/integrations/slack/README.md b/resources/integrations/slack/README.md index a2fa62d8..d1048f76 100644 --- a/resources/integrations/slack/README.md +++ b/resources/integrations/slack/README.md @@ -23,12 +23,12 @@ The Slack App integration provides a rich, feature-complete experience for test * ✅ Run-level notifications with thread-based grouping * ✅ Individual failed or flaky test notifications * ✅ Fix with AI from failed-test messages -* ✅ Run attachment colors for in-progress, success, error, and timed-out states +* ✅ Run attachment colors for in-progress, timed-out, success, error, and cancelled states * ✅ Live updates to the groups table on threaded run notifications * ✅ Advanced filtering by tags, branches, and commit messages * ✅ Annotation-based mentions (users, groups, emails) * ✅ UI-based mention rules configuration -* ✅ Scheduled [Automated Reports](../../../dashboard/automated-reports.md) to Slack channels (Block Kit summaries with dashboard links) +* ✅ Scheduled [Automated Reports](../../../dashboard/automated-reports.md) to a Slack channel (Block Kit summaries with dashboard links) * ✅ Improved security with OAuth 2.0 The Slack App also delivers independently configured [Action lifecycle notifications](../../../guides/currents-actions/lifecycle-notifications.md) for actions that are created, disabled, re-enabled, archived, expiring, or expired. Connecting Slack under **Integrations** does not enable these notifications; Action notifications are configured under **Actions > Settings**. diff --git a/resources/integrations/slack/slack-app.md b/resources/integrations/slack/slack-app.md index 939187eb..1292fab7 100644 --- a/resources/integrations/slack/slack-app.md +++ b/resources/integrations/slack/slack-app.md @@ -161,13 +161,13 @@ Run notifications include a colored bar beside the message that reflects the run | Color | Run state | | --- | --- | -| Yellow | The run is still in progress | -| Green | The run finished with a passing outcome for the configured notification mode | -| Red | The run finished with a failed, timed-out, or otherwise error outcome for the configured notification mode | +| Blue | The run is still in progress | +| Green | The run finished with a passing outcome | +| Red | The run finished with a failed or otherwise error outcome | +| Yellow | The run timed out | +| Gray | The run was cancelled | -A recovery notification after a prior failure shows green when the run completes with a passing outcome. - -The threaded **groups** table uses separate status styling in the message body (not the attachment `color` field): green for passed tests, red for failed and skipped tests, grey for ignored tests, and purple for flaky tests. +The threaded **groups** table displays test results with status colors in the message: green for passed tests, red for failed and skipped tests, grey for ignored tests, and purple for flaky tests. ### Results table updates during a run @@ -268,10 +268,9 @@ Messages display up to five test results. When more tests require attention, the ### Fix with AI -Failed-test messages include a **Fix with AI** button. The modal provides options to: +Failed-test messages include a **Fix with AI** button. Clicking it presents options to: -- Open the failure context directly in Cursor -- Open it in GitHub Copilot +- Open the failure context directly in Cursor or GitHub Copilot - Copy a prompt for Claude, Codex, Zed, Conductor, or another AI tool - Install the [Currents MCP server](../../../ai/mcp-server.md) so an agent can retrieve additional test and run context @@ -382,15 +381,13 @@ Before a report can post to Slack: 1. Open the project **Reports** section and create or edit a report (see [Managing Automated Reports](../../../dashboard/automated-reports.md#managing-automated-reports)). 2. Enable the report and configure label, filters, lookback period, and schedule as for email delivery. 3. In the report's **Slack** settings, enable **Send to Slack**. -4. Select one or more Slack channels for the report. The channel picker lists channels visible to the Currents Slack App in the connected workspace. If a channel does not appear, use **Manual Input** and enter the channel ID and name (same approach as [notification destinations](#notification-destinations)). +4. Select the Slack channel for the report. If the channel does not appear in the picker, use **Manual Input** and enter the channel ID and name. 5. Optionally keep **email recipients** configured so the same report is sent to both email and Slack. -6. Save the report and use **Preview** to validate settings before the next scheduled send. +6. Save the report. ### What appears in Slack -When a scheduled report runs, Currents posts a **Block Kit** message to each configured channel. The message summarizes the same performance insights as the email report (runs, tests, specs, and trend highlights for the selected period) and includes links to open the full report and related views in the Currents dashboard. - -Slack messages are optimized for channel reading; they do not duplicate the full HTML email layout. Teams that need the complete email formatting can continue to use email recipients, or the [email-to-Slack forwarding](../../../dashboard/automated-reports.md#forward-automated-reports-email-to-slack) workaround described in the Automated Reports documentation. +When a scheduled report runs, Currents posts a message on the configured channel. The message summarizes the same performance insights as the email report (runs, tests, specs, and trend highlights for the selected period) and includes links to open the full report and related views in the Currents dashboard. ### Troubleshooting report delivery From 1b82b3c7877b3fe44c5a5c910b0d1a9b209cc936 Mon Sep 17 00:00:00 2001 From: Maxi Gimenez Date: Wed, 5 Aug 2026 13:20:31 +0100 Subject: [PATCH 27/28] feat: more tweaks. --- ai/overview.md | 2 +- resources/data-privacy/access-to-customer-data.md | 4 ++-- resources/integrations/slack/slack-app.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ai/overview.md b/ai/overview.md index e88c86f9..f731a221 100644 --- a/ai/overview.md +++ b/ai/overview.md @@ -87,7 +87,7 @@ This is the bridge from investigation to action: whoever is looking at the faili ### Fix with AI from Slack -Failed-test notifications from the [Slack App](../resources/integrations/slack/slack-app.md#fix-with-ai) include a **Fix with AI** button. This sends the failed test context to Cursor, GitHub Copilot, Claude, Codex, Zed, Conductor, and other AI agents. Anyone monitoring a team channel can route a failure to an agent without opening the Currents dashboard. +Failed-test notifications from the [Slack App](../resources/integrations/slack/slack-app.md#fix-with-ai) include a **Fix with AI** button. You can send the failed test context to Cursor, GitHub Copilot, Claude Code, Codex, Zed, Conductor, and other AI agents - routing a failure to an agent from a team channel without opening the Currents dashboard. ### Playwright Skill diff --git a/resources/data-privacy/access-to-customer-data.md b/resources/data-privacy/access-to-customer-data.md index 4f3377b0..2fb49cdd 100644 --- a/resources/data-privacy/access-to-customer-data.md +++ b/resources/data-privacy/access-to-customer-data.md @@ -52,5 +52,5 @@ We collect diverse data from our users' test suites, which are strictly limited * **GitHub**: No access to data or repos source code; we post comments and status check updates for Pull Requests. The integration application is listed here: [https://github.com/apps/currents-bot](https://github.com/apps/currents-bot), and the list of permissions appears as part of the setup. * **GitLab**: We list repositories and projects, refresh oAuth tokens, post notes and status check updates to Merge Requests, fetching Merge Request details. * **BitBucket**: No access to data; we only post status check updates for Pull Requests. -* **Microsoft Teams**: Currents posts messages within the restrictions of the platform's rules. -* **Slack**: The Slack App lists accessible channels; reads workspace, user, email, and user-group metadata; posts messages and thread replies; sends direct installation and re-authentication messages; and processes supported Slack interactions and message metadata. Access is limited by the OAuth permissions approved during installation and Slack channel-membership rules. +* **Microsoft Teams**: No access to data; we only post messages within the restrictions of the platform's rules. +* **Slack**: No access to test data; we list channels, read workspace/user metadata, and post messages, limited by the OAuth permissions granted during installation. diff --git a/resources/integrations/slack/slack-app.md b/resources/integrations/slack/slack-app.md index 1292fab7..3763dc1c 100644 --- a/resources/integrations/slack/slack-app.md +++ b/resources/integrations/slack/slack-app.md @@ -271,7 +271,7 @@ Messages display up to five test results. When more tests require attention, the Failed-test messages include a **Fix with AI** button. Clicking it presents options to: - Open the failure context directly in Cursor or GitHub Copilot -- Copy a prompt for Claude, Codex, Zed, Conductor, or another AI tool +- Copy a prompt for Claude Code, Codex, Zed, Conductor, or another AI tool - Install the [Currents MCP server](../../../ai/mcp-server.md) so an agent can retrieve additional test and run context See [AI-powered test troubleshooting](../../../ai/overview.md) for other Fix with AI entry points. From de2a1e5ec3a4d2debac35d84526736196db5a83d Mon Sep 17 00:00:00 2001 From: Maxi Gimenez Date: Wed, 5 Aug 2026 13:31:39 +0100 Subject: [PATCH 28/28] feat: more tweaks --- .../automated-report-slack-notification.png | Bin 56288 -> 0 bytes dashboard/automated-reports.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 .gitbook/assets/automated-report-slack-notification.png diff --git a/.gitbook/assets/automated-report-slack-notification.png b/.gitbook/assets/automated-report-slack-notification.png deleted file mode 100644 index a4186a41391698077e896724a1b229e10bb5294f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56288 zcmeFYcU%*1vp5<=Kt(`0NC2fORXRu$>0P9EDWSIzdi9Hn)X*e!P&%PWN$8-o(0dO> zIs^#4w~Oc8d*Anub8h+E^WXi=W@jhQ%ri4P`|Pv(nSJJV>h=%diHd@<0ssdG0KmE1 z0JlpxQ_8Zk=I`EXDk!VT|0kmha0mBa0RYY}9`5fI-##-iG z^SG0F_m_6pc`tiMTi?+yZ2yh6{5RUl&Hb-@)SZlkvy9 zvL{5uq{M`TPpF=dl2cGpQa&c3rlF#sA)}zA_^Sj5_pZ-wde`v6=VCcr&X99&YI+jao`UAXVz;@rXiakc<_f;$)Q+8*AqO`ZU7aB=V9-p41n z_uvr${(XYK;`j0J2}sGF^F1J^kfCDIdT$X&$*&9k=i4yz+lSNwdLBP2t5^huge~16 zo*@-9BBI(}@ztzsvI)Nz*~P3|Y31azb4K>>v;+T|{cHXIv<<+yhkvJ@;K3bNjP#C) zgM05jF5UwiT)e+BIHY&RpX2e7$!J;NlY^Pw|MR1Qf|CDj-0$JVJt}6)koeX+#WR4% zxOZJiaY+HvfIrgrBo7ZX|02T|4a96B|1g}Nv;Re0-(;fyC^iQv|3#{-Ppo`MceCRE z19i*M%-{E4U&;K7Dz)(cSEv6Ki2pSr{`XtszT6vm&lBI)y^>GQt2^TQj}V@n-oNp( zdDxK8Ca7sy-Ox!qZz%Ccx!8cak_FXcDi}w9wS;k%!ICZm!i*Y}MJ4S0(}=B(PD*&n zmsZ75nDsi0#zo(JNiIm`k=B`$`P#R-qPs1wd$lEuV;HA&NYV|4eeYL;xHL;*GbLn zQk~x;-M>aQL4aETJI!fK2Uo5I<&POch6<}X`MBC+f?*`4ftCBi=f=8@!DW`(c;9XO zTY!7sXqh$Q+P|?nf zj36I3w<#w@|H;5fJg;wUr8LCVD@aZv(cJ10wTa(P{Igm|Iy1{yGMmRgtdZOT_Q`f{ zj*>1%vL#CgsajUquSJ9FEN5QtDvWN5+N~C(uP!&=jNh2CD`9+(fe0%J$F`eWKx?Kv zWP{p9wZM+f8IwI2@cnxsqN`I?RcDe~RDx{soQns$KP|~tY+028x$GKE{fSlJx=_HUj-dn)C0;j72sY z5gOH~j4=g`hJyv?SgjXfAH%{P+@VsJff=gnfL=$gxH&p|!K3_wCXWFB?Kf!Wn-?74 z-V@1m5I@YYrdfvLX_pF(YSFg&$Yr2=eUJwWAjUWHY!&upstJ~-0TF0>7`)dWFfl+BB+V4NJv*pX-puU7o!ZjbZIIwBdxb@^f6$ zFJ-lw6z1}2l05My{MzpRe%pbR^xd7Ca&P3!mTY~QX`5%|h=zRReH_+wlm-a~#FLA?&!L#EHGD`Dwl%3P&OV7hHwT#^-rHpTUdBkht?9^a8jMd&mA~~>X`8$Y7D35@l{RVou?0Pnu3wHO0LK`1G9|PNoEjH9{>`c0l(|lt0Jd#i2z~hAbC(8| z$mNn?FQaDKp2x6E)(6?)THZWcY{!HSfn}E|Gr7zO+lzDY=9e+bT~jZ^rJ{HJZvh1J z4fVUi=$KD|HRyf_^o?@&A7%hHKMbvpZ^Y-<;yD5srYxR90?59n7yItJ!&8zx$r4f~(a0iZB=>DMQbEpDC+Shvz%pK(~ z)<2X}PBcWDBCGG=sk2}s)MK>TM@R&JIGn^(>nlP!IOyfy&G=NnA1u5K{~hHY zT83jAFSz5v7oO<_v+UjiD%Q4cMtB|8rgp1F+8hy4mIaT46{l|~&a7M;&v+TC zGIKlqeB|W7+6K#K=f!HxrpJ$VZVvxW)pI4L9p#2%C(XQAgPL=vtea=1!Sn9706!g9 zglsKhlvR4OUsNg zLrFXx&&S+b4JLQb5czBMNmJ$TC~+xsfe413#3WT6!K1^PEz$1U=!Wyq6tiHmW-Ceb z3I}#b_b4OplGmh?P6uZkNmslQ9ksTT6E`fK^|KQz{fn&@4S$u{mrM+s5q92Xhs95H zx>hic2Nc`__^dQ9Fa%e?lypj6u^<9BqSVYvw%PBY8qQ#s;XdKR+1JdsfQJUAr9yeg z%yFOGJ}~SPaXdk@Fl26ZN!jacr*+{>d*E}(@pPNwQHUy!WWo%;Q}(G_biRLdy_lNd ztfC9AcI?_~`hnRog6G@nf~MJauOdx5Wn=V)>$jHk0Nr?;rmcSz-(s02VvheYl`hnF z&?`(+kj?S?+ihpae#RH7NeAB?f|jin#VHi@YYOh3}tN$oGtL7Ko*4<@99t$Cd?fqfIy zr0t40z?j(k2XoF1WFHcZ98)nTd^-CQCz~%9$pqcw8dQvSnxB0U?5zj{*MW|`xmMjq|NA4+b|Lr4ENN;mPeff+fSW2*RgZ%j>=J?QwP0jd97AfoPHvJ zb8nYZL3}X~w@QKAs`X$;ZhXUGqjaY*c?dnnT(s)5?1ggC;PIUj^cTAxE$h=2Ow33` z82LTY#F1s@(Fjd$Y-z9!_3G!5=tlQDRUdNY?|jLt%fy3e5*|c4%f;jsVP{Y^w&Hau z-*JwW7QNv4a?kKr#6475oL>>*Ps|+Y={_KXt>AZlYWplMtK-;ltq}fYuu|YOsfyvTjk@6>kkxkl{^;CzmIPLG_`XWT18j?y!`lV z?J8z|g|+J1b7H0;P1t2wPxFS_#LYOeNw>Jm*~9B0%ZCWDHKKU?jE7$;s=BZykJQE@ zkkiw_IPe{FkKeg9W9fc`%#K!{b)}_#7{+YrodEu*eE6N^CXT zIx;P?GXKQ1c~wS!bI=NZ{_@RAZS;J-6?96}CQwdX*eH3SB0Oh~g~9fZ?(uXb5p~XZ z@eY25_N;w5)rI${jI%tj|`j_MMkDF}$%qauQvin&0 zN5{L?ABrQtN{E%Qd}{T+Pv88geK?(vx=TpfnD^eCW7E2a_r;=XPW|@A(($~(pV4M? zOPm|s7pV&fTggz9QjHA)iJPEp1fOF?wlB6RKm2DFXW89boDrkfZm!HU%E8m6pE~2{ z*<}f-*lm#KN*n9t^hb8LD$Lg4IwwBQl}vY2cj!4NDf?(rnhLUi{Nz0~wXQm|g=3z} z)xfWP2IGWwfF3UhZEaLAb;|mC$8&6dfstEIBSIfyOP9P>3vFb#6gi{Zs`T7R)n|j` zBsm^a=CDDF4vmYKu>5tq4l9Rp6uW{)3`?4cw?c4K>oQ%+Hnz`2XPN3)vNgOk{es{LDcLtZV zefN|rOK%(58$fa3E#cwOFJuw}C-Hc|;!X!yYsn%3`_Hb^&uXk(>V8f-T7Sps(MjCn zGpD{b?Ji3GBiECgQX*Gl2n+uD#CKa$=*=d|W=FEh-qZ~4z%t&C;sANT&>(?c^I2+G zN2enHx<3vODPDv`+yc&nEP{tiTMh`fLdMYk@4S@1kD@^{um#u*Qz)+D`@NBy)%l!{ z7^AhFJ`Zv1_Ym8_bdOyvL9-gI>Qo1e!Oof{rE{ro@YqyS<0-eBJu$HB*%yu~FS8L* zLGece2NCsYtl}G+TRf15v+~LT!QIu6Mb`E}-TH`-$ckG4s4tSPiG(+vXKm*39N&_ES8yQr!`SEq6)ZRWL0w5#>z3$Td&i{4d52^R{Y5r;%4K5>er`#rMw{=r)vNezrMrhY zoJfdYT!qa-)99fX=^v&kZW3*84<3JgB~(pKsP3ueNjVlDZv|x_`$Ic)v$wfciXIS{ z!EfJcYF#g$FxHUNnC!;$IMT_9ZtRu0PU7Vi0uC7!ZTZtUsLQJ@!Lto{T;sit;yOMi z5oc%$A`~!};+w=}c7cZ+qY5U4oZCxUC_~P4P`oe!OfolaOE84c3zKufJ?&4PH@vXS ztHo4rvdQt3QPH*<(W&^e;Y)7l#Q@I<5fa#w;l*+bsKn+5tHEypBXYSjI7LGBKcG?AQr&)< zQJ_&2iZT{dhe7jJFNIb@8>w9s27oMNeqS6;oPHI)Xb>A+@$WmI_BW!Q#u{OAbt_10TGG`Lp@0=VjI;-zm0p*8H2e$?$Z{vmYJD zhmYz^;Iyjply24uN?wklQ)~A$W9Qo3OS~lJ7||hI_{ZtvhL%VZo3V?DcfS?iO=dkd z+I)(uwBX#U`c)&Bw{*G6?3-P5ey>c*jJrhrrP~LO!x`qdVeNC#j{_eW(y*Epf&SK; z9m}+1mu6L?cbNv;8Xe>GmzP6#Q*G=MBNBF^Uz;ta7kFS>{isWWQYwi^c}PPbeZ7HK zaZV-;3paSZj@K&E_WLnWc7k&Td1@z=ADhk|_**W7jZ#IL7GFzH?yxck8!`yDV4`-)=+Y>w6Tj&ou;RFeTr`z7SMZBJ3YMSWK z$F)qHoniY}QO;aWyq;np8SOE$nwybb8RfDiBqVPtSyaaVUWuU@|S6r*k{&7GONHa|;NwxjB*74aWa^-j*6H|LGERpR+2S&k>-kRM!!9ntQ(G=H&K+93`P4MY8PjQ+sQA>!H-oU7UIy(>W))AY`Pz@ zd*UB)IwxI38&6M)2rO&qv>;mF^P|D=syi#Ef#k zAL|!~7v}bY8<0W{R&aBB)G{C6Vl=zEPdd;@WV+#>J=GOAQZ%GSll3fv)Fy=K857gJ z|6xQjJnn_{evexbtARFn;dcwDGI@(UTs@shpiMmnCpB1E+R~dq7eA~_L=Qfb2-&|V zYxRRJtXL&N$S)8BO(T_Cbkfrmy={H!r#mh?xj+qCPy|?>@jxhOE-@#rK&Gt-fks(1b;a=^XFpc%IE9| z@ahx~BJ}4hBpxjL8hi^VQo2JgjiknSmM5;FE={RV)pSdeBF^(YD)n`m^~J*nJqCE# z%T{*BeQIZmd5+_CC&x97b=hViV@lTkbfQ@o2K{t5~oS!$$(lwjsjPsE4C z#|LsiVK=K@Z-%zYb28=GjKS*ic9~O3#68>xnOYCUlg|e4BIkb2uUHjCO|?5|Re2C5 zDXjPkJ4uyg$9dYEU@1CRu{8+a3*(jQ^E>`9#1XkOQP!sG-J&P6xXA`p5EeBY`_v-k zLbTw@_Cpc%)HivJldt#I1$P@7n{-LWO*S0xe^~2Z=xHh|dXxle z+vf(YemtkIbIE@2>4F%&$q~_G2y``w zmch8yWNCOslXdk8^#%+5@2S6`j<3(RLjx1ZnuV|R>Q??a#oH$UorOt_=;^4FTgCe_ z(ghU*58hmcoQE?^z`oWBp5u1=$}yxdPd#u<$HCwztpsQgTcx9jzZ6(DW|QO|^N%Z; z3zjFY7iTUlA9D8Q`u`$^q!YYRIS7*)8Xr_+c%G{CsdM15FHm;M%Uo*zZbDW3T82I_ z(;_HPI{gS-7bQ;1nEWQkXvkrc673YmNbEi*(xYsVhugOLqsZ0UPl&t$z&+&^ zfT_s4%lX)$O+>_`U0D&uz=h?(g`aIxys}8~Ts%H1RI+mcQ^X<`8}g7Kj&R>}yxv&W zVTVr!sz02v?frB@lY*DW)>o4Ui|Zz{+F#%*ocMh-U1ijNQi)5b+R|UOI6rKZy7u1h zj-RviS6@>Nm57QN%bP}LZF4^MQZ}cL>(tWMG7}Rmto=dsey@&4{&s9VmQPp)Pt-?b z*{5T=4VRb%#6zVN$8kSHfIU%5wKu%l(JM3mKz?TZu!A$_{P@|S&wf9l@t)5rd(4;b zpYHPY#EvhuvTGc<3?_0mJ8l6?6;qu8KBxskc+pD?Be$d)85!qeXABnz3hI8o>?i0VsOrj3H-r@_&f^rya3 z{Fk|&l_zNCZ?Y3+VE^ zomz<*=(39Z_2e}c_P*Je4l8XQt;Y{r#wp0yLx~$`+~mvvN6$hi8wzVZrEz3G?T(_ScvTGB~pzCT^!i$ zN4fk-X~$2l=_&~|#NN+vycR9sLsr^mq;;M^76BnXnj3oWn-Cv7sZH?Dzg6b5Y0ngd zQvdqnGjHt%h~Y6VrO!mOVs_+RKO?Gi2fAoXhr|Ym=&r_>(5tD})61_55eCetdCtPm zL)v3f23eO1+s2*B_9xLNy2Lm)fy-ID9Im@YVOjcK?zJOxtJR9}Q*4bDa|<7Z0?4R$ zx^u#C>Q=k;s2jLl#J%9iS^EW5W3@wIg#^T&FjruQHimh;ui$wSYj#A)!n>K789xm% z&gaoT8n%DEKGsDk|h`o zu4opyiT5n_&Ft>__=m;nGvV@ug$ON6u1*e&Rl-JZ6y>POKC_X@{ZilOzy29?vFhfw zS1OIJVJvSLGAXwIz&~o7?KI9ya4uZ;`}romUxcPbBUZ%fHMk^q|N#a0X*ZT3LBT=*b=>t_=suyS?&&mZ>XUf*s(;%2E z!|dC4%dOtPbDWxZLltGptuT9#WP#catzdF5|0QD0@UdVbrOktvAFLvM!W>gg)=77! z?orR@sFcXQJKEVrL_7k9*eaTT@H9+olY~xv+{5zRtwfsLolG@UA)?GmGkN7GKcMFR zi6$K-Z{DWmLkZm%dTjr^-;sFdgCv1j`gu`C0#StngLrTVw|G%|2mRwj9gYIQDtnY|uk{mCUV=V>8tkD3}zSebm%}tpFr0vuqKyt$eUnt>-9dCgYil9Fnsw zfyc^Id^m)}yeXAH-Sj^Vyg4kt88*mBfxloH-vWBVCMH!`erfk?rVkSD4@Tj1FMwAf ziZMmGIYqFC#%)}hT>gQd=_AfLVUy8Q$Nu_1Du)a@#npl1?H=}@!~}-& zt~@w21XsMMD7QGts^+m8UEM-RUBx!lw0yp>|9A~yq(o8CF42Un{)<2cluhTHHnuDLbQmu`*D+1;DR3D0?{>ec?OqcVOLCGPy#8ZUE!Loj=M|R3!NYrEpd3?IQZFDJ= zM*7pPKZmQqfYG1XJ zrG2)?u|QJ=iX0#7A3g<;%uTc>9;itgxb*N&6RaaQFmZ~4&*!*_aBsGC)W9%R)uvlq zA}Yqw_p$k<`LU{x`vEXf4`xr>ji$$aJsE{5csf6)cgX9@vMXh`#>eQp!ZQ!kmk0mE zKlkyta>UfwIKoY2dfRW+?3P{Y6B*0g@=_fI2kmBdg}z!;!hC^=Ox`A(x3X zru0nMOJx{ERvx8h-}pS!jV!ga6LZ=YOyofE$}ST*^6N!M%l2ls9uS9B;dZZPN> zi*tn!cwy>o{LhtkJ+F*K3L)5>0`yRJUVqxTEZ{j7qDC(KuGQr~g)SgbuVR5`o1 z1fWY8!V~DP&OZKVb;4OXEB~NDXaJfn?#r}DBrf4gpHAGPntNtd>ScJim00N*%}S9m zUKt)IcEeNX!Gd#4;+&xcBP%)X6R z!hG#qP8xE5zG_x_30I`SE&H|8ynu&<$4vy{)}#u|rDgOlRVuji5D_n0NDb;R-U2Ws zsY|1^EQ}#X0w`5kAh?$ASg3vkcXak~f_s7wGd&gCDr^)aFi< zSoZn_>^F0!34p0dEl2hbn+htnswJn@HnUx5oOi!8ATe^2MK70%rp!Z z6BWGc6+8E4Xj$LJ|5#+L{QlotFnwGX>*l%(? zXr6d}Apk8d5D@j@-#3vDOj~2KLh7zc1#o`WW7Cc?bP-NBI(NyZvg4_eO3lxx6x)vO zcf;%FS+5Z|cn?=|q)!km>?~-T?{yYu*v(UyEA@SB;q9~T+Sa;*T9 zJ}_H*tPVun$g9u!dKbeRPU?#f^*8eC<)P?<^xxIgFB)d_wbhnH!=^&X=)0g_Q)ib> zB!b@^JoN|R<(>2p2JnxK>ma{3`yoX>h%6*1i+gO=oxIFL^y&lMJFRxq<$MQSUA>I1 z6*XOpGHI=ZJ}YQT=*Z3a&h_icaZ>25)H>52%y~jhEV)2OVf7|oaC%^3f4yH-AP zR569_h@@CpIfuxDm&@Z*j0@@D2l`&fY71-CDCbVZa$t+9dX((jPQ!J#=tOr>H$-NY z@8$e_4k$CT=dg`lEnC9OWPzM-b9-qL(@f8;b|kpYiwEg|kn+u2`m3bNS2XLto8|OJ z2UZ|cg8&lZYymmJ0`1s<>nuE}c0NBbH?U{kPt>>BJ}gLHeBEDN;)DD1sAn11#l?9) zUQZ9u47!$|wRA7cy7Hmzt%{1GI{M_n^MN)PY4}fhD~n`LeC@zyJ*ja?q2@ViKW@o$ z63F0l(m3=Jkwb}-L&Kz~_pln;+Q~s^8&ntF#u_DSVAcZz0}N!q&)Wh|2~&mrQY@Ck zm$S?q_pa?Hdf|49#RvIpXU*Ux_Z@nyf5&*cUvX-KyeTCfrPDB#w%*rd2F*z#Z^D++ zpvh^>&bK3oPP-MflIMas zmmiRi{5|JGpTZ-|ZWN>EC&@&^7p8}xk;~CTONPW+!fd^`KS(@&c0dBP`>vP0r#o8o zT}*|wxxWo~l9NKT7Mc`mTGAw?N};dKxGH)%P#ppW9rAq;240Q>ghs@#_7X3QiP5fa zA%gDOnOoaFMb2!mYew+^`dB>6wkm#V)eGocJ(ZSbFZ?L-_bx{&CaHGxmGsvH(;@Mc z`(+PiK%zcZS~FW&Mn`2g*a=fjO?ubFKPhXLXS<|JnLL;N94mT3*#?{7sp6L@p^qG% z_}F3h#+7dPTG(r`M&2h*uMc!X7AJ=@9$(RFO2?drd7Y${c&7%7JSeFOfhwEh`weIgb+&$!nNOV0yOS?gwB@~a~7xaD>O z1gnoL6@h9CpGcO}%?29;5m$?_?;w1-gXM~wkONU<|YGN@$u;rP1pSVH|)l;AL7-l^W`?~j2 zByxOfMQ?t%$Y6WV_FKq~ZuEp14-*`Atf{fCw1FeuiX{UM`5l~W7mlfLJKCnKMl9wd zfnL+5=I$lP*}NiHeqB17O?gkJK2!2#V7HNzSGo$-35|Be)r8jBf=!kh) z00PNNdvyCS5PmYQTLj#_h|TGpWwg>MXxo$(u~r`;V*8)l&4wcWWSYAf<;vJEcm__C zLh9C%SIS`V4w*by8yGU1Y>1I=CLoLeyAl9f%98%QBSx$&tI#tj>z=9?k<1hm>ge%% z)|qP|;gjj0#p=%koorUBbnBBo4m2ofqa=Pku&${en~ISpdF;H9#Yi5`?vlo-sOu~m zIFN>S5p-z^DvDvqVUbl_qT>{=IQC-xvJlKV&}-$}Rc1)?`9h&mrR5>6{r6px1F)de zM9fDOZl?yb7k0<5LswOuVQTN8=p&l!xCKOf!q+eDSw7n&f0}*DWIt}oFFB=lc-NX^ zhvk{?)@@Rl_FDL-8qsr}9wQ09;|7Q1YrQ~xzM7chiD&@^RKDKZLPc|PNwB8Vxps^O zUcodHR=wzgB$KS_@T^Z}jOPTMphz0EIrP-teuE6%r^-^&7s$W^!a$)JIH#@-0(l~B z=fDXH0ot;glJ4(=-6b%u&@*yK?RwN8jf#l4EV*GWLPx7Z z(&SAqOL@Acy*gzuUHAfX+sb0VyjbTaVkOF)vL|@Z180ewiEYYq%>!Ghj5yP ziY3|46;SqYVoDN)mGeBC*VS=S$|4lOuf=E{NE;_Jcj25~@oh~oes*x-1lO4I=yL|% zUoyhjZvj`Lzj<(7?R6tqsebZB_4GSTJde{KP3={Ti4P*DfqXL2B&^kZFG66o zt=*uJv+T2Ta&D>%n>(;~(a{y$r+o%t{uEvCHB2;K3)4yBZSbz==HURzrXIQ@VAq{+@p*&-5>vsHRW)j!dwMqFR1EV z$kOFzV52@7)-Afiu^#{( z6z8LbAkQwZmKobFQ%YWiGv^F#L(5u;6Y@NIofe_Mww3AZ5O0r`|MPOi=^JTWRiKiu zc*A|y!QRw0pS%FFN~QUY6$@g=RIg{y&y+%G##Kcd>dXfYqol4lKHOxa+x$2k*Y>J* zC&m^u&FYY9WL{!O#E-p)%NsZ3$Ss45a8Ptyvtm=!MJXhl=<;j)-a2({U3*GXOPII>Dh1j-mzB7BzjLm(w(eG5!XzB*LYq)@MgDn)X^<3sceO7<&5GZRrK zp~(uC?AI>TnUKxm)P9XxOj?{hr|c@ zI$~MNT;1~rs3Qa^^(gsM_pvqI@oMuefby&5_$=xvvU0(tWn5OCW=7PsjoFH!6O7w- z=9J^@*yMS!$nDu#=78zeIM5XDo!@Qz7DgAzle_A(TKA2r1iJ2;ZNcL#DWpApS8o*m zl(@}3KP9MowvwI$Rr2*&-IysY>%01gprBEO^-pvrOM!0qSB;4p;j)4M1ZSR*Z0-d+ zaW!e*0!q@eu9u}xdZ1bp>aNA1@Jv~Xy+&nVG-eXFmUFywQOm2mu(UXFbX-TGo2v}7 zPF}~VW$^)V{21j>ak(0?ZW=Sus7Wz4hUG0ta4l;?wlkRXhMOz@bn==6R`EZMIDKw` zEt0Q0`XhR@6fBhm$flUSQCHLiQk>%r&@kIMGDAyu9N%mJ2x84Omzgx0YAu9C3bwbe|RRuo8tk5*0Y@)kfszNP(;SP{>;7tm4q%E-m0 za{eMoV^XUNKmt+q5{Il%%^_T!rS46a=yMPj>&-!&2e*J8$2}wAncud(94-h- zTB1b+XCeC968i_} z_@8z4+yc^TTnD-@3ijg?ZvkR13mFN=hPDkO1MCbAuDuiGjhCWF7cT3XF9x^!I(!EY zW)+<*rBmOhyoB=@gwn;l4$XhGW|HgJ0TN#dJB0$7!=j;o7$W3@>J8l+GaYftyEn|a zveQ~S_b&8Ee;!+{_~6ew6xG>?Z1rh%nERHOLdEWvSReEHIClOKb@3&wTi-W+=qdg( z_1kFk>3b{Y&$Uk&6gw`#!A8m0qopO6+JjwEO4GADuXzFm%wI-jTe3-L&-~#&$!dZFxfIT>3Xr{7vF5)Fqjp>#hbKI;eNJut^*t`0pZ(`b&H7Iz%xMtn@TAyNT z!}haPy82Dr=E9{h0y^rQS1h&(qLk<}Cl}Hd($?Q3SEfpoF%4ghF0VCmQOl<|RBU*$ z0$zeV0De3vQI{4;7k{>|J;fs=sQaWD2B#X85F3_o@)Gx4A^C$~{MYrDj*2Qj@AbOc z&Vtu&Z7kAs3P{`7ScM&y2V0NLxOm#WhoETp+vN_E?CQ(J4`0#`;vq(c$JJGNWKB7f zcS+Qbtd_aGljvfY2r}DJXUAr^y_>|^UUE9XHy!8~lGTOy3YUOpKe>UY=*;CQoyQm{ zJsAR)`qn!;1PaF*+m0y0EI6T{vFr#TdXd|I!cZ=(Dtus_umZi-imQd4QC*Rt^ zEN4IuMNz1t0RgbcEg%XtS9Zvty;i|PU7VP?9)vm6GB8Y|6K!b3zUYD{lO$J-LQ`{FK*jUxVL&yamwGnjgY;&ZnhyZut3I*16G# zl|jYQGe<6K>uFHth-GMCPE&2L7uJ%KHf+h#hRyXwN=n+LRFwc&o4VDMGH|5+_uT@O zVKAukn8m%lQ>)9kHdZwHWc8;Iw88kfrL(w@2OL?tL6s&szPwoHky_FfgSDN(T_eW-@}37jlu2{VVE{O=jZ-K+)%SL*V+XTP1A>J z54~x1!tzNK6zQD62CB6)MoRK@VbAE_=CgmBVj#A4!{g!SNdkjHKy!h$Eqf;sBXUMI zE1HOi@YK|Z$VMA~aC=9-zN&{I1A$dOJg-q}&iRQdq5ZUT+)i>Gx_aLo-5s>5cUGDH z9>rYbN-^mVYWimO*w`9k&9y?0T6wVcVE58( zX~Xtb#S{fl5m@Q3)eCoNgy;225H70aBh%5=8RxO1am8QV4Q8FOfAD87N{K0YdfD>j z{ovKJ=r=PdtUS&XUuM|@>zwzsvi{59vU}%=DVWTvpFpqtFWDqTz|c%1FwKO)nQh7r zL@ML_+bB_49?GquX{KiLsgL7UJE^V_%by}!z|!;f10r##nd7~?0w#1h73Ohh=Av(D z1iY$MnaIQ9SaZ4|Ng+5mKFr{da6%Y#A-pUk0Fu!B@Vp;<0?YU*}=Os(2sL*#-_>=62!_tJ@7+f-@Dz@K^@p zg{zZSsJS1jDzjn_=>x?=UyGHFpn%4)K6A~>;F|ctu4mi6l+V3#K$`ZBm8!+53hht3 zg_+lK+LP{OEinUL4=H|YMtF9cEUyyHm<^%CY2e#gQ`u=k%hF`ik**hPsFR&wsAl@r0 zb4)iF!LcI-uh*3J7Sj3aOM9&h*j3Tn7e-9eF(c87&Jq&zK!V)>k@apbK>_rZ-Kq#* zdLV~y0sg5hq-t(ChmSm}UDG~164lY?>wQz^Enk7!M`!AKhECi4NL_YI3&N&mG-`VN zO89yC4~Mqt52G*6|BUJ^)`Vrd@-Hhb*L3kv%4qq+*nczU#6h778R@9#FsWAR&;N4^ ztjxc=yz>vC)=>wl(KTU-aF=xFGQ5;~_KGPfr*uY5U)n@hs?!UYv3+uTI0wazbiM_6 zdpe!SZKIWCL0-k{PrycnzXL00c4{%!bg?@z+P$$?0WcTkqBW# z?=#jav2SsiUS!(xB^Ej7L>+a5%y}9&Vw67dMAb*pN8!Nj7Le1fOt6Fy%})XO_OpzO zUWe50Y7$=7vE+VkD)mBddmT=F>5ZP`ak8}J(E6;$c+G&|JWuewD*mR**1k*Q+=bqS z%|x2o*#(2&4-nkdwSW@X@<^YM28AZke`L9$Ui$yE$~JBJ!dbF)bb0IZp5ilns*1+0 zQ|NL*h5f6P5|4BBdZ#!9zai5%Wo>$9+}yaFtOxi187$D9I5J!nZWl!IBe1n}PXxgBx~(<2lb*AUb#6 zSLYza%Bs%Qu1x2!%GZ)4iM;Q!a8sO8^1m_n-a$=%@1HjoL`6`PqJ*N-q$<6H=7&zC zHwhpD(t8QL2}+d?K|nxy4?TfUM0)R`q<|2Ll!PXs;lnOeQl) z=FZ&roH^Gy*SX&B*VSz8{dv}`(uYq>P55-aYZ(Ii`MJ{3*LPu})}>p5FdlaMK!>l| zXvdFP$=NRGP35n95DmR{cvnsb*$oil*>?{Bb&w$ej@`yvMD!U++v>e&tRi}HM(S=#wYe7CTNf21Fut{T1YusY;o9z28Z{n1!e?b}35?4WI5n}bJ3Vfb zk%7mEeckx|yTeiCmsGC3`B*^FX#SpC4!mqlZOt#>n^p!WZU#npkqonaLyG(8{#z!N z#vLCa6==C@D}Bi6Ih{4=m$m9ox-w`q6muWx|0Ua4F}mdn1Gm@{lss$jC=`lRY?gJ? zdsgqxQ^AMVTv01xTse4Ghmy00A!t3?v+|HX`vPSR-rs}7?JIM&gp_qA&|IZKbjS@2 zR*25cA4ryqlRX#ZOBGlC>71>*6^$&37zl4;S{7}e12?}BpsfjH#&v7252y&k{cN}X zVmk&Iqfl|Y1xIMKCx-U{uA~qP6h5X(9q!JvE)J(1yMUQg@85M3D{1w!$ntzYdl*Dh z0HW`q@YF&;Msr2v-00^VwbEZQElzz(e#f$`q`HP_F^b3COs{*+O`PF_b03WZINntw zQ6W?Q0l3@EU^`}0hebfQZm1R0Q^?Jug4~WWy4;$PwIelSkVYoH-daB?!@8zRFj@K9 z$~(y$?Ony#(~1MF5W-<;$g#f`VX~a9?#({+yZ~AycrqZ%d~A#Qj%FWb_{K3ue^o& z_a{NCWTHZ|?ESRp@i3&ZGucEm_?JW?VTe)fY1ra(u!;tJt#(K?s_ymGjHbEv@4R^# z*$9m8+HgAIMg1Co8G0^^uz!m)=@SIVv|OZ&2(H+^o!zx&p8~DEFMf6|mgy<$Y+eb;md!1Z zz>n&oWfuAHy2R6xR25NS6RS>wHocCH;IhQVM*m!Mcko&0`u6YUF#}Pp4N@#sg1@Q% zw{3;sMo{FA#Fd6GLHU2;-gsW%f5f7O{@ZtUv^!djLlToMK^oNjA(;~(y_Z3J?#g`>a__|t zGXq1l6-@w;kk^OnCc>s#b(dKyq>AlnpP|ADvAWty3$O28Z1KP1kPR#f1KQ)iiPkVN zyGB->dXS5_Q`u5Uar3)2qv>ny*n979xTwGeI|x@kc`N4Umq`?tIo4vRz|3*t7}Clo zK{Ia}Nb42GCD^F@N_&va%7@=d^ITEF#ou}F?LW|_%^R6LndPgm#K9UoaCaEFf=8m)yC7Ag7lM;${kL9wSdj-B_68M74wNU z`RS`(rrbebb_8e9Tss_J)r4A3<=HdiR4^!ipkyGx1 zp*0Wzww2k&t|5qvqG!!Q{I~{-N#cyzHfoCTPE}_dY{wkb62Je$y~dt+@<0<00qJ?a zYhFC$T#Q^k;ZNs+=BJ@jOkY_0L>9)umN@@WzO+iDC^d4mz_5-RQ#ZU_`exV;{d%=I zr`X3*XSaOZTRqU%vK__sX-p&ST3vBCT~ZrnYmnn5OQ^azG)fYl#K0!Q?+hw0D0G~ zc4OSa^pt-5V;&Y&0XtWP9}LfN&4-lnbf5kQz~f()bH6^F=>A2KF&|~I(&(PohsgVf~;r?hKl>VX%a-JP#t2f3}`BYY%LL}+OD<56cTz!wqfm)%x zfbyz%PN-l)@Ce!AiX=bpvTSVYma+4nKcZImUS$mNHviC+h)$?%%Z}J`g-=bNG!3tc z8ki@@o_qf>lWas|%KUH_sp)F2J{FV}#1k5qUbq|SqZXMozWB?7nUmHqErAC-rpO%- z6>aLh!?j>c#2;HZQO3Ft=}caR7tFf$ai*L(Mj}*0cW#CTHh-LOG+kbQsK$Q44s))S zKLJFI@$KAmC>XUJwcR7obSo+9D_tRideK<|vDH&vA_Z$(rqjS?>(=VYqUvXFd_xk5Zl+RI2 zbIXat5hmUHo-MV#(*syyu|rAHw~v-9Kca z^owK_Q0Iw>effy+BzMVZs|Sq=Bs#bpJlQG;l6H;o$$<$%cf*g!8qw)h8Bmy1>W3pA z!=LJEVbB*D_XHnJN4&cBqtAJo?%~IOCqDnzYn}IaO^qs(aSFh$=Q%dD-Pz49jg(kn z*&IVPKrFk(vSXyS{@0A?D2s2JZ-=c!1qRzbKpLUPZn5MP<6qlEH0U(GIczhb9QSkCq@BYH+5G1( zgPNkE!dz3gWX&=y=$({zJghY$#@E{8zv?M=J#jRh*lNrhUBOT1RLE&um8_6zYWyss zK|%cYV9OAuJt1G8gJ%ghuLl)ao90teiqB#Xw6E|gMLW+*bILI`b$`r1_VVI)&Tb?AfV@|9BB9QdF7N3_uH%( zR4`jB7V$>(V#k`}a@2o$xTV?P=5Nr{}lq0}no+pOO8`m(zwH&3M$5-n5~~+A9qX-ebG~vp0}D#bU}S zowN7l6FT^mj0SXafoE`BEMCCmP)2iMENt{=4Q8Ry;Sv9zQG8W(#vvWVBS_Ww2W@ie zi3ru;#+ePouE`z-Tk=g&cy;awAeOCSYz?O+&p^6=$?V+$_usS9*7m{g`LCy$l@YvS zo)E?FM!NNAX?7kpos;P?4as|+Umtft3}3m`v6DA85*9o5DI73v(c_FE)#Wgfzu~ zpE1lA?+MN4T8(@Lk7d8EAmcdn+|NwYhKtC?1U-#uP4=&ixsyFw5eK(s(Ib}-(FCLN zC(fu{Lf_4ixlq6GJqk2~{M0h6-Ts|HanouLKc|xYkhw7jm6-{5wy`Rkm$O?yKQ$lF z1$Qai)7I}+A!Z&_V_FAFHF(@hZc$RwPfXqS34@nPj#{&8v6`(%SF(GNor{B;a}GW) zxNq^7Z@K3ManMb`f&i;epJYzey1AOQ^Qsnut4qcC)rU%2W)*&YU!u{u3Ojuu&4o8{ z;d2zj#Qd2ducLrCekxwzU}lENJq=QGH<_%pzSZ;g{W$Web56WYoOz@CxQ)ofj`Z^p zw%?ZNk?u69z!2N&F2qj-r&A@mSw$gd`BVKyQb4L0X+n$&^C~5B7SB$DV9=!FGwiR- z7My%>NJ%k$@8gk*b_@M?Ye#zwnQxhZz#*t9@;+*-b`zfImzT;=`P>vEJjm8nD<~IH z@>TaLX{pme)%MYAeWFcUh zsM(#u@+eV{HIphhpMj{{PCMs-1N#T--;kQswz~x6L6b7 zF_H?g)hW4cn0xz*Dz_!ujg;muDo38RNPDl;0RB6A}RjvOUeyrnk0=pJY!xX;Ypt8VBK;Cz6fX{2RB~ zsnEY(Gqp}9$aK|EnkAaL-`jU2C~(lIxl}i{CtF@olW5{`BW&pkwXAev1UmigSq-mT zsnTahQd_1_^hUxARNaq~5x@8Jp;ix{wrW)Azib&k)78~5H=q)g*2>JcjZgvHB6?n_ z#2+}*pzM7hmDQ!!3xNrW8iLcTH>HZpp2?7kY;GP z1)zM+V2j0*|9o+V{BrQDx+I;g0s!ooderh_E(njhGWhpSTZbLl_nv9>c(&KbPJt4U z>T#Iv8;T_vECCSRURtvZh>)XdlQ?Z9F`L!@8Aray2m-70gB}w|XDj_scZ6M7`FBxV zPqkHVPa)){0J8Nr42BJmZ{aG0mV-nPH0D$njV5|xDNz!@>SsTPB3*y#1QpZ)#Pq8C z%tkvXCQ?v21cK}B#LyexC~6Yb6{B(}KVuK?^TF|O-)_X+6Gff9?94@>bym*MJ6v-N z=ya_eAJf5t#|=8|N01nw4mL#iQ$PEsiQcEJ$TVkf3)xu9%&MGTiujtV+N$!tIB~7q z^XqIv)IBz$yGgbPEbGk~=UPTp8?j{I<*Z$0tx@=yY91!;oT8MAl$G0ZHAzhI|I}AW z!t3xMeGa9iOuxox$pW3-FJ>hRLxag3-GcZB4gozfq0G2~2q`-XPUWB5 zH$Ftu&{-~B2#y+fcz(Rb$HG`BHYPnCfduBg^Ns3bY6?ah{HfV{>zh17@^4 z_6}{U|5&-t3fB-u44_sSgG^`FZcB_%F~?*wZK{?#8%imgxc7or@0D6CExh{!{P?*e zeOvh)e(-t}99iTikTx@+`=Q}_ghPLzB9pL?;Q-5-`}Ij>%;$$@tmv3TY!#Xtw5X(M z+iSnPQ_k82kSN4N_w`d9an054EsSP{K+Wc3z@j#H&u46!Uf=UBBfnXHE7{WN-1L<7 z?fv7x8(ssA7z~Vr zo*NcT_08_gu^S_{B@NEr?+B~-;-kDQi)WKa zw6$;f*Jz@rZT%nxEQO^dh2_oqbx`i|1(Qdn_?qRXk7nm+yW}Q*@0p2r9hjJ*W&;dJ z;zDk}f%Pi7i&Zr9eIYUl{C&yik#CsaPi)F4m$j<7!b+QC95wE_old!V24VvhK8bvU zcN~Bo1ZFW+cMDO*K{u`yH;rp<`Yp>L*Rm59q<nfZ3tGn|I_VIj7Cc~Qmvl~dg!Vhl0#!kh zz&&dKVYA1zLX+&Y3#^}8nHMQ4j?R5dyGuw^fzxl^O=7I81zU8+YuxH?>9f$^kGPCpSYf`=3L+SRLJ@Y}tmS^RRqf?zaQ5#kG4!2#O zcN~jG^FPcIH3IAwN?p*y&x&$*kXaBIG@?D9t((2fO6$qua9mf&(z^h5g8L6!L;Bp^ z*il{+(2YRcQ@#|}^Gc8W!lVP$4R+6*BjziF(tzxwe!7NmW}E0}s#EZ#{N$NnbF-uYeT;&$vmmlr%znh4Fp>&=(5kjgsKr!WKxq-1=fX*uVL)f0)nts96i77iq02PrRg zJdhK@mfV|M0yg+Owy`~RWora$^A@xUHHEg~bZqoOajN-=-3G;Gvquh8xe5i}J?gBJ zc4b2iQRlwRkFUSqTUNgL;(JDW)$%IS{pa=+J1$F`;Va|Pv#;LP4fP6Bb@FNq<}VC= zx|La~_am}B>d-2o{#Q-aEMtX|7hQwFLtRwI9=l%W@@#Ea-c2uVh40nrvG9EFz+vLa z2rnBFEs*L|KO>veurIkU5&a!-twlk`xfO1DwMV9l*iz7JmO);RdJPJimxO=j1l(S#UE;ACe-_`pua%+r19_-T?&g| zM+nl#;jD;Fc$V8cvzt{Z+=ZY2K=gYhu)j{4-J1McT>D*Ap64G^eLR8Fof(f@nd;%H&QHohBB7*M`j)p&f!r=o&n|+rK~f|)wgQcHwDBSp!9IuW#D(m-}WilJym29G%i=)n2836w2gQ`e{eP% z$gXNFIh@T8JW^;sr)D8uf+(q`rPH+>Sq!{(%{%XGur`0lsj9TXN~|_CQTYV`8H>CW`$y(+~8{XRG<( z+;Ck8bv~tSpP_ZN#sV6F)P#t9OXD91m*{_fb&3MnO8ROm6@XJ(8heP|pH5!Wbt=Y8 z_hrk%v?b#MKOR$c9wwW-49X6WU-d$pYl#vut{?O3;@?u4I)^ET{Vu+dL6(i!+FOL^ z&54f5^$_kgqW6c2=x#bM#ou0+=40vInc4*dsr{1h49%|e6*vg_r0$zEx6viGfvxVq zzhty|0h`PT^wTo;nr#W4y}2K}7;cx{(}#K5yD+^^r&nHTVjFWNk+NqJjPoJk^)qqv zJlCw9rVo8ol>On7oSZ_zq(lQxe-wZi;I^fl>K5_ z>P`HPrQ}VK+8@Xgr+jf0Zh)A)Dx3S>-Bv|r_X2cWk+Dmw6~ybS66szt^7p_K_lmZR z%=vGGW9$O!Ti2BuK`DY%n|E8i5>*69g9&o@rs7ny{zrUq^(^t*H8RoG0FQN)Cr9#; zc^t0H1&VC8bD^!f^SYPN_et;ENjeC@{E`%>Nq`Fi;E}JeP>(K1A;hfw<=sU-`~V5^yoFZJ!qB zp)JTUv4F-qYP!jpRascHRV+$8RApI#K@62lsPPa|s*o(X?NT$Ozl=eIO0S1G-t917Tc)r4^ zeBU3qG1*!WTpRV#&&ptvW=e>~T*~sQ^OwcdMXpzJdL|*^Tz=A;_`x+h+y0Ss!SWVM z6rK0idEJv2g^tIZ(VzQ1J)D|#G1GpBOL5~Ze)P@Afm1_C=R@C~|J|}&9TS>_w(JQh zvF;86!Uu*Q!m*5(-;<+8I?5KxMqo$p@NTk~mzJhpjzXU=Z*U}@h4N`a<&UZ%ifj> zxiu)bU2pJW7aN=@HLUljac0`sZrz1|#1=#)Nyl9*Mb zdX_UWhtj}t!{lZiMI-KybSUmS^~;FCPmMTUzVy5Pr*|{#w(J+!V|-1)BniJTDgHI9 zGC$?-zV1opyaFR7i%4h1tj14=Pra~by0I$nFW<=>MxM{gdtaqZm3*Fm$*9Nwl6f=8 zUI)KsiZXFZ;cs1|b3?r&8ZbyjSvX63=*vZq#1+^y1d_d;%0z@yfd*P+mx)!*ZRyg% zITZR$t~f+gvixfE+yjb?XU-x}Tmn8Qpa1QQc+sJ$SVf7un38XKrW*S3^3*Fks<^BZ z>Hwlli-1A%x+M9UiDDWe2ARQ6BgRP4uGc2a=;Qb{@CrM2c>qIyOuVbb3dQkA^Ht_N zw0#O!e(;uPruy`OR;{{`+J=m8gG05w`VJNO`(n5m*DmVKa?HC&yiF_%CJlsImiK9Q zW(*Mx^k3136imz`$}(@zfEn>?GB`>VRL(6wKY-k;soam3Wyxm0be zSrv*3^`g;D?a*2&Tc;U=K2*!e6`AXo+P)4E6gQ}$UZr}{jjBBHMjp0+5P_q2(f=lEb+hL z%t-yYTqvvTBdVF%hqX*8PYV#?HEEZ%EMuaJ;Gkm0km$Ge8=KB(!I0Vi;$_Gf5|HL&c6O7Bj#RKue}b_ z78h*2f2e*^y(zP$?#`OG0{PFz9oCy9MiHuQas(i-WMRyZ&w%!h@w z+ePkl=jf$^l)&b zUqW{Ujqp6DB`qHBrMVOUV%~O}tLFKGA^?#yKbfF`_WM&EM{QFR`gPSUHXUxnS;=k} z%H}_dt`3C-d1Yx+qKT?U|4t~uX!=NNbiY7UUY?WqT@PzMM{OK-9_g`T$Kk-alJ>MXo*@F0+;}HH_ZPZwqdlBNy*x&ldQYO%R3yCCnRz|W9K8Z12TdFt4HH=1`*6Tah zo(`Cl_}&HuXV7 z&o9|{#{mHxZk^%wUot({9qk?E)6TkMRh%9-xe3<$%8KT;5@#X>o)HD*jpcK4%}ryYG{gkCH*2S zeCfiG%m`a(`Edpx{K@k3x{Q6%NbmY#ioHOI`$-@s!$H3f76DcPU!|Hv5@`<q)1@do}}@yqjKPX}*F!J@io z8--iSxME$N!Lc8g7lYMXxB0WNj*#$IH3oB4GZ9y+@U`RT1vDdCFQD{~Kg!m;rW*5rKhyC&=iPd(l63&bS0vg(ab?AYw`mg*M$( zq_{fa@3MVl__`6ogmWPRBhoZE`SZ<(I?=ILy-&J*jfb}-i{f>?w5$}q^@*0`vAs9i zdI~j67ZPu)+5}I^o8?wL=HN6gmibnhx~rhVzv)}LS{lO{>HPF_QTGX);~S%q4!R=IzWt-fvdl<=df zcH@VB-8XHLlsJ8J5sdjYfcAq+;`U5BOUpH6QwsNu*?IVFea+l4{3E14`$jI>RiwI6)M0th__{>#Ht z?p48zn_7bL)&KDv3Y!Z*Ox80sNvo!w_{HT$lv_T z1CU2zg9OsnXac$t3;}mhE<-;jel7SV{qnHi^JsNgdMDo^QfjVigCIr%enuUL?0YT{ zFpuuP)Nk5pG5Yh8X}dPkvH|6}Xjit+IL|hp9$RsC8riRsVzwy~K&C_8Uo&sw+Jap{ zXb8hRbhY&!|9bgBB(dY?qdONfM787GW;5e90UZrf$L%Ye0=y+u-?$uP>B)GjXBSk< zWQyPmVOv>C>yk7{e_Sr_*dp>?(uMmC+C+wfd4W?nzWs|YI0~_*xqX27E*FDmHlB*v z<}|IIK$iov7hW(?_2!5{&C0AU4H*cVF;T}K*@Gjouqv^7@-5mLP`J(MKEvXfK0#a8f%dbqUB}_#|Z5Nqkdo7(- zR7wycLy>7y$1w=%xG*{6m5X0avI3M)u2?rIAYfZB9w#Ekh|Ji0Qkn*hc4_#7yBr~N z0#nN5)H7Hc9D;>tb~$vgekj0 zoLvwJRVGfb9Ik|dAd3>Ak|auN#Wzb2ZYA~!MnYFU{`e&hC`w&Ad7n(-HUKE_sr?n! zDsVR7Idm9XuW`gRZK~d9KN<+)<`*`-lJ)4J)oijrX5=(RW9?nxtzJv41~xB$U9W!%5%HLrWH`uWA}k+Ih<1ENY?p2 zO0eWDgjKJa^hNlHktEO_hWkWC_#;wlgj&S$7REfK^euAdr+{HkxveE1DDHRe_R&+r zFv&hz(y|3@t`$SoSY($bp}~W6XPO5w*>MUt?0o_(ASW=NGc&{SY}rMQr{h`>-9L z>rnYeY#7QLT9gTX@yR)Q9W1F{fl}B)&b4^tE{9f-w`M2>zGhA?ZhN`h|_}jLm3yaXe%m3!7<9; z*30pRks_xl5OR>wK}m~m2nA)+sT*O$pU95qBjS1`p}X0$YS#3phTi)SHv2s1mxXTP zO*HXTa9aVEEZ()Bmhb`0!SnneWYVo6H;06p2YJ#u+ zSoonNT`c@GdQA}ZA2INEkjd;;;DK5RiSOYUDAt%rpi#DRFRyse|N5Z>OJLv;CRYYw zMqbb?kZ&_@){gU=I5UXVtaxh?s5@Twh&GVo^JO!2@Og8@39%@ie?o>g*SPT^F7~zY zAD@`}UTMk#M@UDLW@%vDrG+JU52KW>&(^S#JT3K8%~J%`_)1w}_)TKtD4C0j#)(T% zY|WX-E&D!)ZM>FqLu!bEkbg{+b>KA=jfe=nU>$_&T8Hy`UBrBg_6kFgN9^OW8oVoF zBoIQm;H-1>IeX9L+ysId;n!EOlYk9cgTQnB1sLtu&kZL{Hn}MzI97T^D$UK72v@hHxr+5 zr4T_*zd|fE{U!TeXBt=5AWNRT?$d{h+zY_nHP#ffVt)3lN`Ni*8S>B5w26$Hu7dGO zOC=V^u-z#craJpY=d3juEfp%I`25LJv;#Qe4gkP@!`mq^JUsN+sa6DJQdX~FUp~e2 z?ImkbHz!0xM88ItTFi~YXH6Ad3TkPf5wDkG6yc;8jUq!6&sp{|wB zFV=QScf|YyG&K0y$Nb994A7Uk1eoj5g;B`VAGlPeWKhn5o}ba~B8z#hS5})W%D}Pf zxGMEVaM0hY){G5hACRBlM+hBw7rC)$BtF`|n>Fo(YIgn^S3=&P?b=}~_EHu#ckEj1 zQc`NaWnCf|FFic`#!vE+b^|c5>FXWz%I;>jVt&^sO zR7}qKx@=;S_X9?$?^ld%3A|S#od$<{kun_xa@WCJx1bJj8rD!sujTytz=F?{QBhd3 zwFb$K(4+h1uPJi6JwH1Xr7P~W`a{F1+86e-w#qY4h%TSHw3t|1JNmBB!5i?d9iOD4 zq!-?|pdX~Tix|#=O{`FSF`1d!*(-D1sX}|xa*>vO4;Hq=f`K801z>TsVUHz2Epgpv z(9d~>FH9=Nm>EEcd(+o0E=qLt;rgaQ;XGF9y=XlgmCEljZb%R>9sn4X%!|4x^IB)- zH%w0=Uo3g%cF)u_UzL{j_nBs>zhFd`3C12JW7V^7+=+3;IJdmeAtv1$!~KkuZCOq- zt$iFO`P3CNR8HN_VDfWgD?fuixr(xic)x18U0F`O-hmrkPZr3Qee77QEd5USXSB*P zUsh+@N1eJRVfVg7vJ^SdM!)n!X7oxO{9F3zO1oKO0=HZB=kFp&G-XwCz%*`ZsgZNS~%! z9mdLxGPf1D`hL;Ynr>`lix>!ok}ZCQVG;ph6ta<-mGv>q58%U|e zBdZ6F#Wq*;j>ij(uSv-i0$FJq&$S5}q9|te?ai~I9j57kHItjuqt+|}r;-JBerpm~ zl4!WqP>9X>w=x|6_sN#SeDHa=bjvT}sETBl%gm&m62X)vC!43LY`JDX=#=wyTp|b- zFfnGWNZJ~!#ZOKmHY?kV|_GX|- z13h;vY2b&gW<_!Z?G+$J0~T}Vnj`-X2n34Hv||t#A4~b zx%KGWOHsU*Dbdf-k|5ZQ4~e9!!5u{L}ERST<@+$ZW; zrGJiLHHPR-4%?e`Lbp(__V;}NEMofO%v=naah&2ICf_doMV{KA;}Jve+TIbUCFGwn zOsw72J+8V2s|X5mIuv?n&O0<9_Yf&p7hmz~lq1Gwo^EFSFIjtsgVA>t602gI#9OVtzKGR_?ugq3!!)y@5ImL1e zkrJ4m-h*d$R&Bb!#N2@cyS%UGR%gy{yb)!U?*GjJ2}j0bc?gABp`KBW84mz%;S1t3 z%P!r4%}?I?8&yjNCkWM1k~;-oui4RgZA57krU1u4TgI$;!*DDYqLY`CZ`(m0y*npC z9Oxe9O&DLi3h0pvWz@~)Q2@)M_ECxv_fLvq%8$k$7$CAqMWddr!TCMxf3EnyT0Aiz zB{uG?S0w2M7nPs-JRQH=XZ`DA96m_^+_S1DZRQ=EMa_?;YkfRC4nypEccx0Q{A;le zGv8LgUY)(C+ z&4>ncDFc)nCC$36fbg^5IY;83Ta?Ec{p3DnryA)WI@0!^@!1nuU699LVo=-=Ylg_Q zwsG9mkgeSUZc%@Nc_`*hAeg~DT-){vVSSM0!F=T1$Z=mk<%vCsodq{Hzj#xVauC_j z=Bsz~?jq$ft zwoMClYutyriFlAT!=xkmPx<)m2;#A`q}Yzb8&681JFbm-uME1dvQGd#-Rw4FROCOa zrGN4-j(DhZ&=aJqWw%Ke?+Q_>9w5})b|Z0QD@ zBWNxyd!W@qeTE11J#hXE+OFc9?)7q_^3N_@)N!9!j&+Lwk7E7|^hT+nv{r+tteIOV z*69lPQ~s=$hzI0cGDNhvSVaM?#?l+Tve%6pGUuzjkP!s6ej%|T-PtbduuL1h@dm`F z=5uF2Bqhj9lF~W{dkAaX9JeqC9VaV-~teRy;`|$czpT^M3?FPB`DuP!o zW%7dIEw6O?nMy~_ZjaNg5$W^-H>9jTH-L`MM*bqBg>l`vd4+N3M=&Ux<^@DK2<Go`};(k zj$&qM`PULAHg^_-uft!_)n@#4&|!V<1d!jfbZ7N%fRX`Vqb$=R+4B*Zqm>0sV|RAM z3IV=Se)Nwh8&elhy`HDlG>|z|AEoMW7R|cZ3jDMyT7*4fQIA*56Q21Ju?Tfou<&ox z_pPw*+|tw2kh_twpuBO%vB~rrAbdPjU+}*-2L37*lR#rSX(#gednKb@{{#2 z@%!8$8YueL^ah2yH?vIa&2cO0G6Ha!(hI;Mv!wdBJx2a#ihA@n=&y=8kq2z){HQ*q zvQts_$}nh_(iUfFHX&XD6XY)74kVMaC1`u1dB+-I;t@-JMde*F#+Q+mMR`sLI}>f2 zdpR24o-fOQ0PuB-!}hyWd2W274_#^)o1!UDsw!%kP5B@_DzIrfD%1<;mp%u>7VtFu^ix zV~sfhpJ|b@o*`N>`Go)IZDoTu;?3`+oo}-;`>H0xp%XPXT375 z&C39VPG7Sd1`G4%l|FQn{KA!C52X3gH&+9xVD9z$OZI#CpUD}c6?)R%JK}I+b3!TG zH=6iwe806a&XRjfqhiATGZmZvRd|fEK!7x|IPxmn(b)lwiWlqOop1vgEnfIJ!v5jHxqqlxUFhek{v`F818jv5 zJTNI9d$rz7qI`E$nC-P9B;{o?X+s zkV9<5w=eS4Yh6<^uxWC7?WiTVeOwgps02MTFq+gISE1bG zu}Ye7`)6`l704X=j@S9naDG_SYjSc}s!y1bN$z@S-@mM5{GW_1|Lt0UlX~ZN!HWjt zxl01-(EZAn(5iVOqzi)b->I4lz7w23rS5b$@_Eg&GwlacuB14x7V5oi$JJG6$01%m6-%X4HZ- zjM(JueP6oq36QxCs4-GcGCC$$j$1UlaL_jR63yf{`|Y@V0A(L+@B5Cv6x>3%_Ba9g z@gm;kv6m%_mejSD4}8YquQ#U+n`rJ?VQSYxmPn-$O`B(;nj3Z{a7=qduakaQ7|K;( z*~>i+;hDX*?j(K|hTf!y&6of2c{J6ko&(FoD6botZSs7b!GLSPp%sYFAawbb8{pg7EdG7eRI|=k%mj6)M=^ud-}IG z%QDS2<>r=eokt&RhT$fw6nYM~giAU-g5+v3^S=0)%yrw(c7Ie9DsxfoK_L`cJ zW3y_0^j^{q3%K zv15f$!99o`ZYiE~VychJ4_6~NigyQI$0MG`6i(25_`eXCE&wj#D-XOFY)trN=`05h zgAZRs!LHmt;-6I?aNuP&~kSq{nI!z`9V_l{aGTy>hWRiSX=n*uc+6YXY!Bz_k3J{ zCvFw2DxM=^Lmop_;n#W{-0r~-wM0eh4)tDDTHUed_*h826Gepp5C{g;8Czm9B~NT@ z<%eW6y0nDe;#72813xzMhcfuMP;c~(uLqu%u{htDTz^B@1El!32Ewl6f zc?F=d@u6lfhC?9V0KTUT>@#uMZA<9`YGPm4i@3$#JZJ-djG@!x<^$PA6B65mD@_ z6-V5)(bXTBe)+kIN{RpL8uR~iZOgyEi2jQY_!5^;^Zi`utd>OkJACioHroCl|KOGe z9Ao4Qi-?KH1P>12e$qa8)wbhPb8R?{NT~$Tn1Iift|$N604AyT52XGGYV!5p*)@LL zwsE|s;)GOI4dPJr^w_F#<2p^3Um^K=;YCJ8Z#L$0K`Ec@CzqE$d*&H3-#9AA!KdRL zCo{0KKcnK@2Q%0yaJQB(E($m+xsUViN;-ysxql^R+IES!#2896Zu>qPVJm(5hiAXj zRg9p~U5gb1pn`={b+mvRMW1r-oAJftZ~ZfQJ0y_{qK+HUgQZ2lZKn;6V2|D$r8n;^ zX0RWwuZ6F>B2Z?I76thwP*}O`EtQ*m0s*)cGNu6&uoDAYW&JeneXXfAT<_t0`TUy$ z+7ChR&EVM9iyQ}w`S!F%#-CPD`MA||sW>x!*4T(ne=U>Z=ZzeWR5B2tW{nU9gcysp z0-m?w9GszN%$@M1H>x?AcWvADoV*V^SgPe55HMqB%^UNJkF1M!zBj*f5pASFDf)hh z;A|4b-t@G8TH_)~XgV-qg06n(X;`HC-t?|oBmt=#By94>ih{Y*s3~scYZI%{r%*8& z9}-7u{$iB*^Pqw1`dL9z2Qzq9uZi)!|C3t_rDrqz?E`Kt3dW*zbV{Zo?mj3Xg(sdC zwwhc?=iK|oIb+;$zaQ^kRgD_8 zchy?E_FikxHRq})NeE5)`SY?By$3i77EYF(R29*75RD-Kv&8$RxYPmVYx!Xobnn%H zSW|T40`wDgal(`anv)-XV_U2QD3|abOL?F?WB!>Zz2$tKbzMq@dFb1%FPw#=zPUWu zTqyD?jUKkhuAUlStJ5bH0^9uqe33~H2$)|UV*ZLv@6~1=Co1Kk=bK6oJvp3Kprfd* zJsc3SNt`%h_WY`3jL3Rq@a7s$?f(;H<3P>M>3g3<_lQz}|G>h<1#SOv?r5V0%0a|D zz{U!znRCz;wQgyeN~nx2mmF@}{jHNxcnNOWBGnd@HIXoPaQD(H2A0J%o#!l1h%}zu z$^M3@Q>^2D-E*=lkqz&~aqrcS{YZcsJZ9TQpMAv&z4JvIsct4onsVBV@SiFD(3VjC zJvOC8!ne?$Z=uR4B)m7aieOZG*_xWH$Fmx(zOJ#B>^1=_q{TCf9rAf6-}gru`dA;Wl>Ga7tqmib!~x$tIjimgWnJj-4xK2|F;>%@Mg>T-TQX z0XyJP->0xb6je~3N}h=#uD zX8#g9Eqgon^=(qp0fLOo_ORdKNydtv-Qb+fGp+A^wqZbAXpZigFei zkx|_EREO-|=YPEiMGttt`!3vfw;sW*oH|I)hdS485b#1bT?0ENFDq?FP zB1HwD4uUSRS+6pWB~Tx;i}u|Xp0ud<-V#O z46RVd@>~DLb~ug)M|T)o-Th@;LbA};Z3823OmV8IV6}YL>+5aC;#0ZxMtg#vK2!x) zD6@iLCluNhL6iUulONa7nSq9-EVw^ub-v!a7dhHasrR||;B~LK&_wd-$XBg;UUD3d z<$06@tq|R4CoI91Ap-Mzkn5cZW#KlnwodVG1-WG6Erz24j4+Qv@qGc*yGz=Eljnc< z0ZigoQVK?Pt%}M*r=eHpEh5|No~%NdzzVT%Rdkme*s*y^)E4?KS^lnfSd&4VVn~zp zg{3nWW)!fu;t6K6&d&)_4ArMlcCBs-s*3<1yH4;t%W>-OYDe}uac@e81J~^e6TbGt zwoL#J&m81XH=<=3e1kdd;Bb|r+@v091#UntfjJ!IAj#z0k!7i)$7>{c9cwlpIk0UP zX1#_q;BxQ=Ml|;Z^rqOgy*S?Ozpv(2g|^pL#uedBsZU8nCRS<5>22~XX}3LRTGQR{ zX$RLD{b*?jER1UkidErPwf`=BcS$SqGLY~LTP`^f;eHql^nbVv9saOE-|};r$@wDi z-F<7F_w5VpFU#yfaqChM)rCJQ0I_^F=5qo2c=dlC+NpwCw$Ice)O!uxdvS7E3WOw? z6|sjk;4ufewj1hFxeTDtwPA%0+GX3s(cyY(a^mB~2nON=pl>?cYKgHF8f^A1;nHom zEZ)U&@kbdXLHmT;PXokUbjYmfs&7rFwmE06BZ1Wz`#{3|-=BuI@+^E&AHnZmfR}v7 zDYfGPjTT8{cWmI==u!ytj+BO*f@#jl`-^buYlj+*GbO7V-Qk}!X3O{q{KFDIPU|LkU^hH-SPTW$Zz}Ib{-N_r( zgctR;7r$d8P@ZX@=&V0Z|5R})Y`(-r2?~fqZO=<7(E%4pt*{gMb!r! zM32*n(@E^H*NqykJQ!$)3cV=^xg)WGVWqwVd0t{ivbH^1( zC^D8-*=%UUcZfLN!fLc3Y=xxaq9a}1Q6<}%{TvP|S0@urd zoZN7L;m#<_IKvL1V=*@4mek|O1!rV6-BCp+Ao&gGY(Vu$U&g_G_GLl2!=_(;q9tl4 zKX>1cDL+%sX191r{IF-GXXxNQ)3@~TzKqM`Ev-5*%K=4`9+z@%W$oV57 zMin}ZoJJ=Pl>3ihFk&%JH^Z+aI)wB|E z6(<5Wd(B9eihC|h$tL3rqx!?F1>4;uM&lo@GhR^CrQxyxR+7-fIVv=xT35Kvz*lJN=Tm?RBCJ`u zZrdntrlxKdR6Y!2lMs9jVV;D6F9fkGbjgy&e#{lH{ge`asg-`Nux3hscQB1zDASbD@ACOXeCTdWwN7OcKpda6$4|Q5Ee;_tDK2%xpOfz&c zHA`X3LE!5?`u4e)`SRJJ1L>}Atb$$Y@uzDJ0gAH@c`&_Z=bH7LBN7jP)GeMex`HN% zGfMyGz>s!)s#qdjwPbF7=8?<1uyo%o=IoW}zCoGVSQ+>+bvQ=2uTqC1O@(i^;&x20hpHQ&bKq$S8k!SWb>SX{Ht>lTiTURae%JDJPhl4U{vcyLT ztOh%Tp48mFVvy1kt2y?Jr-xs^?66qOobl%c4Bi=rad9?2 zF=m1dQ;NZg?C9=TfUZX7GDen2Cd3%0f1-Z-e#-0PJR5Q_a%os{OvROn)Hx)G%L#`A z36gj=1U2jhl7Zn*Gtd1)Oe&7FF1+m6U-1OJ#Z#_+GHTw^MrM{`y?#VD$9J3c$WUO*6zR$(~jO z&Qdq?FmLS1G!#n#fYx#iQnEgowim=2aN8&@|0{k^3PvIUf@@!nCU03 z>__UXiMVOL>a|Yq^KMy=fbOf05j(ZK$IrKe+(*R^g06}gg@`{begCCC{rMN~T2kS| zVr%pY35(!Op~qRPqttM#n=o7~V*K@}IjcNAmu z#(a?+ZUmmRqny*UZVp>=52F{en@o-g7oD$!q-CEIg?sD(ok-@QUBT}>v;hW2zwnqd z-;)W9&qMjX{M^oD|2DfpQIF|(ep~JmsHjlr8m~Csj{Gv`gn;(`%8w~>X%jilQD_||wa9_GX7NN~468I?cD~vmS68i*iD7-F>q5<*j!oqCeh00{L2KNW z$|qP*RMx$z8^2xp9Rq@1`}u8Ypi?{_B*ei3q+GG$e@OegOdgp*DYhij}vw!YUy zJ@bHPVccX@_d~y}%!a-@incYF_)+^spXJZGwj+G5f^xdH$Ts9fAvojV5-1bz)bm(#wZ&5!b=WHk)fOxt$pb_(ta`X-E5c4a=viD1RQ;(?j3DI3cKYChN2C|9^uix&R6vQ2)j@p8p`t``yP;+at& zcDuK-M8FF6EcoKPGaWrOrB07kLUB+SYCODUrt<{&d6pL- zeNFBEJr4VrX?+*GJ~-^V^Rx7pq{2H<1=^CibZ?QtAjJkfH_v)a^;8ap6+|smR1=x* zUDu;--f*=}(&jCs_zm)r*jDzIC!R8gBiy8==n7(Z_WkzV38vBXXe0UBQnTjD$)>_t zAhp*JWLwGZ#dB%_rg?_m9CTE0-(?A_L>|KDn~H-7y#Q=mQ=8uC?S!r4tiD3UMz-uuKdwv73emnjAiPv_Pw9o_&#&e zsdrwbM(e#LPGc{C77l+w8ndm6Ng62X_Ko?b1kAI9_gv0*a{BfxYdiV4r^;1L zYl?mtZ^OQ?&q$j6%zdtGupG9)k$9@J%Oa2p^^#Ix&$B~sV7DbShr5oKR*H+Q_o&5w z;F9#^r<&*hunL`1{Q!{^7ahQ{ehw>1^yLPhC9I7*`lnHv)eB)=THO#2pNwue%EyZ< z@#kN>pxw-P3~b^4&N`5MHj_Ss={o5_bLYZ`Z`P9L-ul6noa&6}L!qRbCl z=_BMniLbKBUJx)>Coqmw>%)!!&GglQOcFq&@}SqfX`yo*l+(=-u0<_SpT%Xe;*K3} z504#ebd2wku75MD4I^jm4CychB$5IVF3xD!9mFJ|JmgsZiA+S{8jkkHGxBLIi#E3~ zPu&O>=ro%Uy2rhlWPSTu)Fexljft}wtx%FD=3==y6aD9@rw`#LmV}OC!v?fsbuc-6 zjaQOM)_j3<%xW*Ii8)JG&Nbu`QM~wO%3- zTCI-)6-BrxK~XU?1NT(#G&Y8pEY1Jc4uek)h^sy#YF>REGkqagRSWefz^;|Xb{)U! zFGpo9QiR=FbRW}mA=e>dVuu5}Di-{c6QLLmKDf$-k`gkQBx>i;jbBRx#yEc5pq}Hc z4q-ZeC+eZ|ioI1970Lx2EOUYM^tgUzg#w7hJ|nOgE^sb33MgC2hBMAi%!CsGvG?s)gp}YnoI7fL?2Ho_k$&(4)8FRWT27-pc|}bZ2+_QzErtzW z<52p$B~?v92=Z2S%>I$PcCAaOnKK}=7xAlsoOH0v6;cW<)-_EK3|;Zg%S)_o?x?8! zc9UQggP-zhFqxjT|D|ligLC}^G>2d#NPD3nO1JA`YuWYtgGRFzyfrG=sagGM62Tb8 z`VFWq0Cll zruo+1m^;N#WRqCr*A@SF`Y3*qDgDQ4C2pyQ($d7PGuILlK5rjcW2@A8>QufslD#4| z+#d`F&178taE-?oj{hN69#lI^ogD0A!DPOB{jOY2<9=FpiUcWr?4rYIV(cdsHS6Nv zL7#osM(&hbGgz5<`cPHAm?6SkbqZu8oS|e%l)mktZ1X`PFsCgGrb^7XRIDOk_sqt* zZx6z*V&d|8Z(Q4>fALbqURU^l(L?*i z8%y(nn0k5Azj#{qBCmH|q-fZVNIMQ=pK0-Z;1VL`(FNp^214FBu!;nis&*!|`&8em zG;Ro9dAp8}qd;%P2L|1$(>2={8H|8=rSNs62D6kIJ*59nKn{ZJ?tJm`?=hopb{})b z^Lx$jQAwOpgA{i6SL}oK-OF?9jMf?iB1?+O^Xy|8p2G~t1Y>`{c@(C;1Vk3}^1+Ir zjmR)s>+4i61HJF+ZNulw=JKjOxU>!N)EoQfvK3k<)#}rW><2t4py`;<)GNy__Z8DM z`NxjEZW@da<*bSk_N(o^`pes|ty2w^q@)RhGU>0NKRvT}^EqeHF`AR2igwE92G-xz z7cH~RcbV|)CzvJ8`}P~kV_$!S9S_z)Uf=k6KI5cI>{(`xvf=ILx%YI_akS*JG7YR0 z?u1xbMN%QA!)EPA7oOoO$xB?>t8qeqP*O=SG_Rd#@jC|@0_!!}m$xg9HF!>c_B?14 zl-{E!(=O<&lRW(~gWh4o+;2}3q|((yn;)zeqp?cuJMPTb+>e1k-)ZkZvSwv9(~=qR zos^ZV&UV7cm~+$ihzL>@>lJah`qV!_D4%G3HrAECYp;}H{lZ`{pha5ES;nedrjugTb6LEr_bxoWZXAK5~zeDF@nrSPsfG|4MlQdD{aTQX6=!WSt^DquI}_85;rkmQ3eY8&~&{X zeGK5%-PdX~vE_^gu~ehfKuN8I`Pn&9!iFzV?jns0j1YSFt(@ZGOyjz+1Ls;@)OPt< zI3E|uukzG+nK_GM%WEjI?Z`&rJ<9E*&Q5k=TulMJuoqRC7a_0a;?|tW`r<)bFiC*Z z5wioOUzqyU^t6hxwt$LER4R_rf;mboNjRgQ-7RJVL6LNo4+Ne88Dym?Ny1hYT3ta}y&;F!*&bw{#QXKuE(V8-`dRs1i3kDk8kW$h zd#wMAv;k9X2jJ9(io1U5#xL0(()l&3DS+{=>E6k>JUTWQ64R;FbIUc9ev#d%zZT!j zPi>$x^}mmfsG=EYoJc?Itg7~r(IbX1+cNn%P9<~nv|*{u7R* zjk{K}4vcTe@in5zd;rMXZZC}@3He2~lzs0j1WhJz{}oQ7Q+EZo@k(3@^xoH{we6dy zi_`3zH|RI)nvg;}h2LVI^3bZ%FG0&@Z)S@_@!O5JoE z&I{S2P2gf9BS3 z89i5QS&I046z0j|3tF64WsDrpsAoj;JIBuY!WoPei^ml?Tf6uSqn=0%7&?M`opR!q zgnUN0=f!Jr@J92UD7*C#;H)_9Upy6$TGbcj-<*ijx@P$!({WH_DHO0kRyJC&$%2t6 zQGk-Aa9Y;65DG1X2LAZj``Tl!X@98R^C?c553J#xY3JN%2JwOTZEjs_#SN-;3}-cc zr*@{lJRy1?B6OZUv+CE&0avWpY&WjT+VeQ~yFXIWkhpb+ z>>7ieBC$?xGDGNFT6n6tr4pa-acD_9*qm6z}`hjG%C*FRg z-_(-Tai~jHNVYM3)Mt)>+M(=*8NmifFQLs-A>VI;Yct2cV);GIgR_-1nzPSpK44muD%L5C0-N^oLGE34sW{)xnuVh zy|Ny-25Lr$Wzo`}MO~(=%&(dcI`3<&z1PVIu7$fr%op$LEL?fn(tiA|-nC%qRsQ@~ z(&92vhmk1!57aC6toAw7EMl`^Hep8_P7AozqI8me<^9Z_#4Z&F2K^9_o1oV+T3#Fn z6}3`hFUfNTzvO0#d{u&<&Elh>!Pb7ta9ngWeM`H=T2S^S3Kj-`A|U?D6}PH@=%+-L zf39Iy7EEExsncKa_u`y^Sx$CrUXS3HTu-q*RseIpM{e@y=hauIl-Fs%!^p@UTOJ~c zsB0_Hjp`Ni8I-v}HT6Y^g={R_>uo0NN`z-4Xap;1Q9SS>e#P@thfQ8n4h5>%mRCPy zT1INXztBBst3#)Y;Og#?K{ntKF6SAejK^3UM-IiwVaReI>p>08c;6l5W%<+pCA@<1 z?*H$Ij{mvI;hHg`MDLg2dZxK%EQ1QZOG~1NJ^!(&D3LLBup?_jF2f=AB2IUS`Y+yV zm0McJJ<6w2FHc4sYdHNAp2NJXgyx~G17y?kvG;-}MOudH{;2zvY^N_-8sP4Kr(J|F zw5>ReozQ5zN)06)j^aVSxt$p4bvITjc-kJLE^7KZ%)o$t=Q)0J+>@U++k>ftG>7Xn z@}9g+{F^#vK0J$d)v5p9m=D02pq*+a{ zdIFUw_>cWG>;I3J|6}(VWS$!MG_bAPv6pMfWuVh-ma&VHFMezsJA&ZN<2<)(G6X$; z@$5dLU#~#dmR7a0#+LuINfjBU!cvVa<1$*P-VA=D7OQQF+LCqu+EFWWUX~L_t8~zYn)gxf3`DhII?(fBI@^~q*4H^ zfi3jqOWPYXStr=ZOc_1{RvvvjHOBEgy}!}CTz~f$kK@%X{-Fs+kBi@v`x}1O3*LWB z)>q}b8lN3!4c;ID|G`)Sv&N5#$5H80iIKP%Tufel9P!KVP08n$CFdgKWTXmPy*El_ z5qhpDP|JFl@Sn`hAUo&&^ttlJHSg@D)KyU-*f+)QCi_;)^YO=j?<{Vq{J*lq|J8Gc z!wi(8P@4R%hvTyoHBH_x0ladKRWCfB3~uDUkq-8?>%DGK+ZT91JE#Aesj}4HZ)L#R z+;t*$_PZPE3fc_Xd%kjBdG6YJY)kA}^Pu-7hy@l9L#jglff=&&R5$vcuUdTcBIfF! zV?pAdcF7xLod?01jM$2;vwc;Jl_SGmn>k>;`{(c^^0U$Z8aw~GzcNyKFOu|`V@>=0 z0fY3M69z8$z|oij{)~mo9Rv;9D>xHb(ncdFyR9`P?% z&{)%dBmJ*|sP!*zi)MUC_D{QL{?iFy;vvkE|8ydgstwuEyWZN!L&sgh?M`|`TU3~6 z2=h7Y^$Y%K{_hux#n*ic*zzOJn@2O{1@4zf)4zCD+~+@R#~c{lIHM*h-DJgVcWjlu zKT$ZvBQRUt-}rg^|9+9Xr*VJrV#=QHZTvZu|4%NVOKqV#3X$+@Ua~&W)~+qf4v6cq zM$g0AhajeIiM*gG2>|3 zUIp@PR7bxc01CZD6$dW;TH54%cP--I=t8WWVv{W-7Qx?+ez}>}{FS8t^6t->&BuT7 zxZD5aXJL>89hGm2@>9l8`?U^5RxeqUjaQcr(I+PV8X3h$w_onJ3I7iC%rbjO@NZ@= z)w(tsas5n33m^D{99_=bLa0{=Y{d<*y@VN>Uog-+aE)rbp<*t#vv4x6Um$x0f^P}^`KL>%{SV`$ zFYy1)RrS+d5!YI$>XX%R)k#)LbVkW%@$g@suj69PvR0@^w>qy)A3XivOu8gJ+<(;5 zuK1Vc-Y^%`w_bj5+?w?NQXF>|qq#yYno77U^D<%dUT|}p%h~>(GSAt^YCE5l$Hl&> zBKSMzg?N2uQ9exmjIMm z+DhPja|_7f&>y~6cbNYSk#+k^P@l}yXzdv&%_+$^q)>a_IC6OviHyBa0m zV$(#qIRi+SOc9cx!IO79?QV=o_)QB|WQXUgV zi~TM@%gAX3l@k?uV$Pt{c^g0u7ES!^PpH~3 z2*A)qbba1vE;5^Vu2OYh9TVsRD8#X0MdUZ4Z7W<)X%34M6TzaN+2{toZe}ui#!g-C z32h~@h^(rJG1*pBm@~wz>ebfi1V5d#wM>i&MT>@9gskAUT+4WkY`24#O3M&1HqflW zGi3pa8j>tPuevVC1_J)E+md4A7q??6mbj|>M##g*?qyBYeju3XoAltv`A#PxCjwAZ z7ucw10blLaM26Xbvq4%-WxOG5$f5qDf)DDe6l5)vGg{KNt4epkFy24%lfQKE^&Oc6 z1nXZs+WbGkWM_B#Y-T>&{n7Y;PIMRthy4fm|FN_hAiUbA=Pa#&JOKtqx5R{f9KEN) z^-c>s$Hiq_n)9r#S8dzbZXfm;TOCD{N$Xb@xlE_*bZi&&t1{yTm>>rY4zm?En)NCg zl$7Wtt`!_F;iI{@Og?y`a+4IcWdUYR{kS+;le*tdutKdoG5fA&?5rQ;LP_cP&I()Mk!B5V~R^q-i`*z#pzd+=7 zA!j9-LY}mkwRff4hM;HUJ^qUe1*8XvRcP)zt=ZKV}P0exvN|*a~iauEvSD;A-A?7s$-I_;BKFYIH zs!E<{PU*@Yo4o7bU_W%HRu=V)_P6S=t^%;>2<6nKQls2u0XF?y)PwhrvU&{X-I%o|+RQxd)d;dr z5%{K~eo{b}gpEJb5~;i-_#+NSqrg;D@U*e*m#QfhF$=!;v*Zld^yk0kj_*jF{Kb<2 zt7ul^GPZS5cEg-GzpE=dV?KAXF}?+~Y`T!ChG{RHO+yf8kyD{|+w5%HR(-om%2y%i znU9lvAsnw_0U||7u?*9G5Q;vmaFQiL>W=8;8wpziaRI;vKC(48HP>h`qB%S z=Ua1RL89(r&UZF0Ju7w!OS>8!*K~+T<#9jpL0u4BLq$oO$O6QaYi{&=rQ?pB+B31M z{BQ8hFFAsAW(~_Xw3q8qvvf(R*PpG=Mg{~^=%ndYmCoqSP?x9O36Bk5Z+tHoXE4)aq8|GN@D|6ZqPcpWfwbZfQ1YI+5e(BB0?^&)fgjJHjc||ST zRX2qtRf5p{a}IYTs07ZsoqOMX>y+QZ)(TMVv?`&vowc7tE=R*MhFOY|@8>`H{l*H$ zo80>STE*87Zx@8GCV@Bwu0bob_lf3-1STakp|f_~yOQ6VFq^r(H1mf1iOM#Zyx1kb zr=*)ez|>;jLP@@Gd!LK_X9F=Yx)~KsilKz}n=aNKHY|;Cl5`z##}ue$E~dHi(t@UZ znZ#Y1+IxJ1gAI zKjI|D(_3=?I&u&$j&#vkXX^_4uNX-_A(-@PHu~HrYr(dk#?JA}Up(q&|Hgv9cxgI0 z|1D4=Ol7=-l)CB>m9Hze0jERoNG&SH#?qf+<_pKAQr4+9&~MU`^D(xc7EmpTVtePdUWsfoh#62So2)1qc048OWQ=9oMdo zcaZU~8&puF-Vlj`RBEg43Z3(oTv%aS&s#|$JiNpkViLSSxy>wz#EhF~&(~Dk{^E5; z{OSI%01?d`^QN+GQeUV*l!latptqcN0!VrcjOS13tHfUrIN)vI2d?j7&t2ro&b&rz z<#NNsTc4+5=xrEN3!?0Q4$14(?K3<6-YH08=(-xV>9pvF{e%^lA8Mu|&3XB{KC zlZxqTrp(T04qANG<|&K&F^rjb(tj{E$`uw|wQRTb#lo-v0U$BZYhfl+~`R4gCLJ(4^rnAjkJMEmSnlNMj zr)i1;=H&g$JyuPUw!~q*bdikt8R1645bsnqm2}S&rPx9JKbaN=#tGWyNRYmC>S))ee0R7f5RJ|Rk)W`s-255! zP?i4{9?wiP-k@>VjhdwEjyl_jy`-BTxFKXEbRH(0@5z1nsQu4~;{k;;ft~*YJK>}B zK`2gbTpd>j*qV(kSn@NvIzBSOzoEfNH+u8&b09cG^a_pSznntz-J> z(|e1N`ww2}C#=jW+h#FVFOGU@tBI%MVaFDYqI#$AF=SV6Y?S`m>*Q6CrPJ)ShJo|* zDDP3%wXBA$eOvbE2-+ulRgJEo^;H3l zdvjN%5l8X!qs^hN4&4<7w^qHpA2#Pv#C2dzp7p5WCx{UF`i(ossLX+}8BWlom_1VN zNesjRZk9+f1kIe+ms@&h&>JY@^6^(sQk3CAW57j)*I2rph9h!H+sjnNL{P;hbb2pt z@qHYtP|0TBw|W3W<9-#!{VaBe!Dhkg&d6c2&*YYAt^Pi_wsh>QA-&86j79|SGu~6b zvprNH3aqaNdAppB;}j{`Jmc^>jW%=BRnoqkfJeay_-oD_I6XaIP2ts{G4N{_0}}nQ zrX?BfDR@Lrw?sundAe&+{Aw}YR}VT&X9%-{Xk;&!sasDz@9kf_-+dDoJe@9a8RxJd z9U>3U)o-n(s3wxz#kV6(hS9*M_kC-SRs31Vp! zG%?_OLLX9BnD_J(Gthw zm!*j~c;d*2xoteg*c>)uEY0W1YgGpC)lBPEU+q;W?Cxu=+U|JC(nOS7Pa(0jug0#|`lE>tLPP$(9DpwA`X-(qN8YAHDACPUu9hBgp8 zo2(7Q51ES_pU%zpD@yE^p^iI-## zSrdA+p!s9wFW!T{cp^4`@#Y6_QP2R#-;T%7tlRWf4ALS(8`<@4@V9@-t8)hf;C~%U zJ&`dfceV>4FcS$3^e)&hsWL`+yA4#2(>LhZN^h-@B@ZwV8*#dGW&Z(GH09^@AJIjn zNkj|#OdlIy{D9q4YdQiEryofO=5blkq|~)?=HdJv2O*kGP&EvrE6eSNsx{tIPRyrS zJdg(A2VZ_hPaJ{*s^U1hr+YqO^t zttg-~^UFtzcC1Pe5p`lm6IU%uBo&+MtCU?vp2nW;2TOjgXvZo&_5lfygDA8fA~$WQQjxiA5;iQWq~QS! zqgG?51(y00vexDKeQA2qJ?=3e#%h~M8EJvMe?XmzvF^VFs19Z5Or4Ki8DHA^Z996O z!}mmE=uB2T0_EG~@Ny{t4~ApU95X@#4`{aG*GIZ7Jh&xJquVYJ z6fg!aOrx@>;|jSut~2A{e)Q_g@cHqQ8<$Sj$aRrLhHlO0!%_jAmpX$j(&U9XIixlT zRgKQnk+&)cz##~}OQv)E)>baW&;~045x*jGJ#yzPjnYw~iAS^K@A;j++v{9#eA|Ij z@~%Es@|&{km(`&6`Cw!F=H-vIXDp_h?N#`G->_@>8QHaJ_tM^%xS1#)=w2z?79K3) z^rNuOztW=|BeKc}R7U>dc_9R&K7QiRy!mi>OXF|YViOw14o$S8m2Q67B zflaYmn@C8;ED2ta6NEc??Qu z=T@-u? z9+>UUP6<87sQ?*woP0bIobDN?*e!FPv%j^c5Unyv2fUv(F>;vzPtx=Wlgn}C^WK- z3xid^5rye>IoOYo;M9KtbtQ5SMG*=UJ6AjfrF@h^{!@@+8yrC1-R0;%y>MjgrH)27e86tT1u< z6f%XZ2uJOUy$j&4W1<72*LfneoayAfejv(4FfEr#YWCSFbw*F!<35gn7~05EOO{hk zj^#P5g5-onist0sHZh{F+|?$w(>zc%DqWtV>4=u3N!JF|S^A2Ip?{nYfM5%gDZ74B zYTm<+a;L6EUp2cmmUF(s-zwl+Cy!5MdOMU6={gv@)R+_hoU|qJ4~W7U9T@b?R&N+S zr@Ha%9Rp`?td=6TV$Lq7FVDUP%u9SQ!lT7RTY;pkG%c79 zAu;97I8(OCG4+}+4X$FWpE%jq{{ktpT=~5gJJ$1+wkL8FHU=0v+R$Qq`XjOQHt&@D z^E1b2;l3=du&+s)J#0AvWzGO<5CDLboNSm}Ug%8vMN^>=Ip?quI2ha0SCNpL$tEss z*h;wKO_YXsa+U9b zT78GuI8P6oR$7H9Q&eO> zG?I*IFx3;Zk*k@Fek(kxi<+w}vdU#Cu-8qp~FnEba2P_a_e9>W25P5-YG4`%gw~@gE;BNbhS^4myFvWxR;>`#q!Yl zqE+i(yl6htNmo&bh+Gn10($5?>y+UGBiHeas_UpB*qA=>n)Ic&pvOT%N8GP*6=KZI zdts+P<5A03*bPjyKxkoVU9$B)jy#}@_b;BVX+6~4F)lr@-w@jzb-(gC!QI@~fpb$) z(_ZDJe1;bNe4;zCpkkmgoohLe>19SRL=iw_AiUri%wXR4qjsp#dRNjnWHe&&I1Cmp zt8Cn@?5x>-FY(EKm3^FCPjg$84EgA&n?i2l-O&lvN!r95SL#P}uUZED zQCY=YEs_?)q{W({F!*f@ddHDEZ1y~nGEr^SdsJ$)4-XH|1rJYz^TUgK8Ns~83A6rb z(C23^xY$vr+=2UXOW3q!ezKF6EK&HJ7b0{m5=S3bB$e^s_F^eAZ}E4W(_{{#gtxEf z@|n&RAgliEa*rYMza2N{un!Y~@fJcm>=fV$nYn_pjH=+rw|#)qwbtwyNa7@6&x9>W zpqlC75Wye23(N3_J?joxnCDl@HYUesotGDX@w7WzJ4{OI3$w?T@oD=w&ui2;6_Pcy z1T|?mEpf!+}E zhco=N-4NZSQcIoIFZl-YH(h&@q63(HDEY%h<$)7t1M#Y2FSaWlOOo79U)v87K~YJ$2UkHwE8T`uA`Njy826&tkOaYSe4ey|o}+IBjZ;Tl77 zg12*XW3=t95~&1|zFJZgFix-eM(5qgVCtxL`K(#Nz}Me-TJ&B(a|J>04)?eH7l#hw zA?hmPvmD2Y)eU9w)cw2VNvX{@+VYPRw6N|HyPxUiMKW%`cpj^3DF!$I>B~;RZwL3E zNel|tHym1nGjKl1OSl~#G{PAgNqid2)Ts7&&7J62>srqiUaO~XG3c_5r3z~LxbvEA zxiCzZG)RgZ&|9@3jKDhvyor69jRR}`e4xAc70yqOPhaN-L8)b!=PFw5E8%rr>xs7^~<3OJjd@#XC*zZeln zX+W7HYO7P@w+2MKe;OIdlP`m#dDVDzds+A6%S582BbT_J;RG1X>&RerQ@((Yqh#!; zj!h@{3;O!?nt(@8nPO8LS--+HgoNC)b(Nt(=%Wj)*)m#=EY$oP>J^?N!7G0HddT{? z$CQd(U!4hOS$}nDXv5N*3z<_nnw8aMYdc@Pg_+2&^mii}a}Rz(=4a666yfv;+xs2t z7Ci1e?y=GwhkT%KhJ14t4xKUcXgI(=N0)*Z4M)iUgUXa>W>cYyjtb- z8`tIo7pU377?~5_Q7y}Lj*^| z-s9R2CvI|kbbQM@nadklD_o?PrwaL0tkV7VYG=*Uc{41Jzt{de(0&hpZB%~f!4KVS zw<_H|m6kG|{oQqG5&u$Gm#xM7GUvTit-O1#@LBj-LAKm&?*p@oe^0vZ_Hpy0iF&brjSU;efCP2Mm0e)n^nAp5>i-e^dSrUE+V HhyOPL%&LV% diff --git a/dashboard/automated-reports.md b/dashboard/automated-reports.md index 7916a5fb..7a700a47 100644 --- a/dashboard/automated-reports.md +++ b/dashboard/automated-reports.md @@ -79,7 +79,7 @@ On the report customization page: 3. Select the Slack channel that should receive the report. 4. Save the report. Email recipients and a Slack channel can be used together or independently. -At the scheduled time, Currents posts a Block Kit summary to the selected channel. For details on the message format, prerequisites, channel selection, and troubleshooting, see [Automated Reports to Slack](../resources/integrations/slack/slack-app.md#automated-reports-to-slack). +At the scheduled time, Currents posts a summary to the selected channel. For details on the message format, prerequisites, channel selection, and troubleshooting, see [Automated Reports to Slack](../resources/integrations/slack/slack-app.md#automated-reports-to-slack). ### Report Structure