From 424c4890b00b0bab59b6b7754b4e191bfdce8217 Mon Sep 17 00:00:00 2001 From: Harshit Singh <73997189+harshit078@users.noreply.github.com> Date: Fri, 4 Oct 2024 20:08:15 +0530 Subject: [PATCH 01/30] fix: New Relation Design hot fix (#7423) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description - This PR solves the issue #7353 - [x] Improved layout for mobile and desktop - [ ] Added tooltip on hover --------- Co-authored-by: Nitin Koche Co-authored-by: Félix Malfait --- .../SettingsDataModelFieldRelationForm.tsx | 10 ++++---- ...DataModelFieldRelationSettingsFormCard.tsx | 24 +++++++++++++------ 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/packages/twenty-front/src/modules/settings/data-model/fields/forms/relation/components/SettingsDataModelFieldRelationForm.tsx b/packages/twenty-front/src/modules/settings/data-model/fields/forms/relation/components/SettingsDataModelFieldRelationForm.tsx index 83f81326436a..d6f3fe48be10 100644 --- a/packages/twenty-front/src/modules/settings/data-model/fields/forms/relation/components/SettingsDataModelFieldRelationForm.tsx +++ b/packages/twenty-front/src/modules/settings/data-model/fields/forms/relation/components/SettingsDataModelFieldRelationForm.tsx @@ -14,6 +14,7 @@ import { RelationType } from '@/settings/data-model/types/RelationType'; import { IconPicker } from '@/ui/input/components/IconPicker'; import { Select } from '@/ui/input/components/Select'; import { TextInput } from '@/ui/input/components/TextInput'; +import { useIsMobile } from '@/ui/utilities/responsive/hooks/useIsMobile'; import { RelationDefinitionType } from '~/generated-metadata/graphql'; export const settingsDataModelFieldRelationFormSchema = z.object({ @@ -44,13 +45,12 @@ const StyledContainer = styled.div` padding: ${({ theme }) => theme.spacing(4)}; `; -const StyledSelectsContainer = styled.div` +const StyledSelectsContainer = styled.div<{ isMobile: boolean }>` display: grid; gap: ${({ theme }) => theme.spacing(4)}; - grid-template-columns: 1fr 1fr; + grid-template-columns: ${({ isMobile }) => (isMobile ? '1fr' : '1fr 1fr')}; margin-bottom: ${({ theme }) => theme.spacing(4)}; `; - const StyledInputsLabel = styled.span` color: ${({ theme }) => theme.font.color.light}; display: block; @@ -98,9 +98,11 @@ export const SettingsDataModelFieldRelationForm = ({ watchFormValue('relation.objectMetadataId'), ); + const isMobile = useIsMobile(); + return ( - + & Partial>; @@ -27,14 +27,23 @@ const StyledFieldPreviewCard = styled(SettingsDataModelFieldPreviewCard)` flex: 1 1 100%; `; -const StyledPreviewContent = styled.div` +const StyledPreviewContent = styled.div<{ isMobile: boolean }>` display: flex; - flex-direction: column; gap: 6px; + flex-direction: ${({ isMobile }) => (isMobile ? 'column' : 'row')}; `; -const StyledRelationImage = styled.img<{ flip?: boolean }>` - transform: ${({ flip }) => (flip ? 'scaleX(-1) rotate(270deg)' : 'none')}; +const StyledRelationImage = styled.img<{ flip?: boolean; isMobile: boolean }>` + transform: ${({ flip, isMobile }) => { + let transform = ''; + if (isMobile) { + transform += 'rotate(90deg) '; + } + if (flip === true) { + transform += 'scaleX(-1)'; + } + return transform.trim(); + }}; margin: auto; width: 54px; `; @@ -46,7 +55,7 @@ export const SettingsDataModelFieldRelationSettingsFormCard = ({ const { watch: watchFormValue } = useFormContext(); const { findObjectMetadataItemById } = useFilteredObjectMetadataItems(); - + const isMobile = useIsMobile(); const { initialRelationObjectMetadataItem, initialRelationType, @@ -69,7 +78,7 @@ export const SettingsDataModelFieldRelationSettingsFormCard = ({ return ( + Date: Fri, 4 Oct 2024 20:47:05 +0530 Subject: [PATCH 02/30] oss.gg:quest points tracking files/folders (#7430) ### create all oss.gg quest tracking file which oss.gg hackathon contributor come and there proof of work ### let me know if any changes required :slightly_smiling_face: also can I get some brownie oss.gg point ? for this PR ### thank you ![image](https://github.com/user-attachments/assets/d029c696-4c01-441f-abde-51ef09c24a93) ![image](https://github.com/user-attachments/assets/71f306f2-8e4c-4f14-83dd-84ecaaf3082f) ![image](https://github.com/user-attachments/assets/eef363ef-040f-4427-a998-9995dd33bc80) ![image](https://github.com/user-attachments/assets/e404205a-0387-4af0-8580-0619baf2e4cc) ![image](https://github.com/user-attachments/assets/86206a0b-7d1a-4f45-ad3d-aa692cbad71f) --- .../1-create-youtube-video-about-20.md | 21 +++++++++++++++++ .../2-write-blog-post-about-20.md | 21 +++++++++++++++++ .../3-write-selfthost-guide-blog-post-20.md | 21 +++++++++++++++++ .../4-create-promotional-video-20-share.md | 21 +++++++++++++++++ .../1-design-promotional-poster-20-share.md | 21 +++++++++++++++++ .../2-design-new-logo-twenty.md | 21 +++++++++++++++++ .../3-create-custom-interfact-theme-20.md | 21 +++++++++++++++++ ...-write-migration-script-other-crm-to-20.md | 21 +++++++++++++++++ .../2-create-raycast-integration-for-20.md | 21 +++++++++++++++++ .../1-create-n8n-template-integrate-20-API.md | 21 +++++++++++++++++ .../2-write-selfthost-guide-blog-post-20.md | 21 +++++++++++++++++ .../1-quote-tweet-20-oss-gg-launch.md | 23 +++++++++++++++++++ .../2-tweet-about-fav-twenty-feature.md | 23 +++++++++++++++++++ oss-gg/twenty-side-quest/3-meme-magic.md | 23 +++++++++++++++++++ oss-gg/twenty-side-quest/4-gif-magic.md | 23 +++++++++++++++++++ oss-gg/twenty-side-quest/5-quest-wizard.md | 19 +++++++++++++++ 16 files changed, 342 insertions(+) create mode 100644 oss-gg/twenty-content-challenges/1-create-youtube-video-about-20.md create mode 100644 oss-gg/twenty-content-challenges/2-write-blog-post-about-20.md create mode 100644 oss-gg/twenty-content-challenges/3-write-selfthost-guide-blog-post-20.md create mode 100644 oss-gg/twenty-content-challenges/4-create-promotional-video-20-share.md create mode 100644 oss-gg/twenty-design-challenges/1-design-promotional-poster-20-share.md create mode 100644 oss-gg/twenty-design-challenges/2-design-new-logo-twenty.md create mode 100644 oss-gg/twenty-design-challenges/3-create-custom-interfact-theme-20.md create mode 100644 oss-gg/twenty-dev-challenges/1-write-migration-script-other-crm-to-20.md create mode 100644 oss-gg/twenty-dev-challenges/2-create-raycast-integration-for-20.md create mode 100644 oss-gg/twenty-no-code-challenges/1-create-n8n-template-integrate-20-API.md create mode 100644 oss-gg/twenty-no-code-challenges/2-write-selfthost-guide-blog-post-20.md create mode 100644 oss-gg/twenty-side-quest/1-quote-tweet-20-oss-gg-launch.md create mode 100644 oss-gg/twenty-side-quest/2-tweet-about-fav-twenty-feature.md create mode 100644 oss-gg/twenty-side-quest/3-meme-magic.md create mode 100644 oss-gg/twenty-side-quest/4-gif-magic.md create mode 100644 oss-gg/twenty-side-quest/5-quest-wizard.md diff --git a/oss-gg/twenty-content-challenges/1-create-youtube-video-about-20.md b/oss-gg/twenty-content-challenges/1-create-youtube-video-about-20.md new file mode 100644 index 000000000000..455b5e35bae3 --- /dev/null +++ b/oss-gg/twenty-content-challenges/1-create-youtube-video-about-20.md @@ -0,0 +1,21 @@ +**Side Quest**: Create a YouTube Video about Twenty showcasing a specific way to use Twenty effectively. +**Points**: 750 Points +**Proof**: Add your oss handle and YouTube video link to the list below. + +Please follow the following schema: + +--- + +» 05-April-2024 by YOUR oss.gg HANDLE » YouTube Link: https://link.to/content + +--- + +//////////////////////////// + +Your turn 👇 + +//////////////////////////// + +» 02-October-2024 by [yourhandle](https://oss.gg/yourhandle) YouTube Link: [YouTube](https://twenty.com/) + +--- \ No newline at end of file diff --git a/oss-gg/twenty-content-challenges/2-write-blog-post-about-20.md b/oss-gg/twenty-content-challenges/2-write-blog-post-about-20.md new file mode 100644 index 000000000000..a4c4e6bee944 --- /dev/null +++ b/oss-gg/twenty-content-challenges/2-write-blog-post-about-20.md @@ -0,0 +1,21 @@ +**Side Quest**: Write a blog post about sharing your experience using Twenty in a detailed format on any platform. +**Points**: 750 Points +**Proof**: Add your oss handle and blog link to the list below. + +Please follow the following schema: + +--- + +» 05-April-2024 by YOUR oss.gg HANDLE » blog Link: https://link.to/content + +--- + +//////////////////////////// + +Your turn 👇 + +//////////////////////////// + +» 02-October-2024 by [yourhandle](https://oss.gg/yourhandle) blog Link: [blog](https://twenty.com/) + +--- \ No newline at end of file diff --git a/oss-gg/twenty-content-challenges/3-write-selfthost-guide-blog-post-20.md b/oss-gg/twenty-content-challenges/3-write-selfthost-guide-blog-post-20.md new file mode 100644 index 000000000000..c7352ec430fc --- /dev/null +++ b/oss-gg/twenty-content-challenges/3-write-selfthost-guide-blog-post-20.md @@ -0,0 +1,21 @@ +**Side Quest**: Write a blog post about self-hosting Twenty in a detailed format on any platform. +**Points**: 750 Points +**Proof**: Add your oss handle and blog link to the list below. + +Please follow the following schema: + +--- + +» 05-April-2024 by YOUR oss.gg HANDLE » blog Link: https://link.to/content + +--- + +//////////////////////////// + +Your turn 👇 + +//////////////////////////// + +» 02-October-2024 by [yourhandle](https://oss.gg/yourhandle) blog Link: [blog](https://twenty.com/) + +--- \ No newline at end of file diff --git a/oss-gg/twenty-content-challenges/4-create-promotional-video-20-share.md b/oss-gg/twenty-content-challenges/4-create-promotional-video-20-share.md new file mode 100644 index 000000000000..e52cb43a4247 --- /dev/null +++ b/oss-gg/twenty-content-challenges/4-create-promotional-video-20-share.md @@ -0,0 +1,21 @@ +**Side Quest**: Create a promotional video for Twenty and share it on social media. +**Points**: 750 Points +**Proof**: Add your oss handle and video link to the list below. + +Please follow the following schema: + +--- + +» 05-April-2024 by YOUR oss.gg HANDLE » video Link: https://link.to/content + +--- + +//////////////////////////// + +Your turn 👇 + +//////////////////////////// + +» 02-October-2024 by [yourhandle](https://oss.gg/yourhandle) video Link: [video](https://twenty.com/) + +--- \ No newline at end of file diff --git a/oss-gg/twenty-design-challenges/1-design-promotional-poster-20-share.md b/oss-gg/twenty-design-challenges/1-design-promotional-poster-20-share.md new file mode 100644 index 000000000000..b995788bc3f1 --- /dev/null +++ b/oss-gg/twenty-design-challenges/1-design-promotional-poster-20-share.md @@ -0,0 +1,21 @@ +**Side Quest**: Design a promotional poster of Twenty and share it on social media. +**Points**: 300 Points +**Proof**: Add your oss handle and poster link to the list below. + +Please follow the following schema: + +--- + +» 05-April-2024 by YOUR oss.gg HANDLE » poster Link: https://link.to/content + +--- + +//////////////////////////// + +Your turn 👇 + +//////////////////////////// + +» 02-October-2024 by [yourhandle](https://oss.gg/yourhandle) poster Link: [poster](https://twenty.com/) + +--- \ No newline at end of file diff --git a/oss-gg/twenty-design-challenges/2-design-new-logo-twenty.md b/oss-gg/twenty-design-challenges/2-design-new-logo-twenty.md new file mode 100644 index 000000000000..e8e70ca913cb --- /dev/null +++ b/oss-gg/twenty-design-challenges/2-design-new-logo-twenty.md @@ -0,0 +1,21 @@ +**Side Quest**: Design/Create new Twenty logo, tweet your design, and mention @twentycrm. +**Points**: 300 Points +**Proof**: Create a logo uploade it on any of the platform and add your oss handle and logo link to the list below. + +Please follow the following schema: + +--- + +» 05-April-2024 by YOUR oss.gg HANDLE » Logo Link: https://link.to/content » tweet Link: https://link.to/content + +--- + +//////////////////////////// + +Your turn 👇 + +//////////////////////////// + +» 02-October-2024 by [yourhandle](https://oss.gg/yourhandle) Logo Link: [logo](https://twenty.com/) tweet Link: [tweet](https://x.com) + +--- \ No newline at end of file diff --git a/oss-gg/twenty-design-challenges/3-create-custom-interfact-theme-20.md b/oss-gg/twenty-design-challenges/3-create-custom-interfact-theme-20.md new file mode 100644 index 000000000000..e51945ea9988 --- /dev/null +++ b/oss-gg/twenty-design-challenges/3-create-custom-interfact-theme-20.md @@ -0,0 +1,21 @@ +**Side Quest**: Duplicate the Figma file from the main repo and customize the variables to create a unique interface theme for Twenty. +**Points**: 750 Points +**Proof**: Add your oss handle and Figma link to the list below. + +Please follow the following schema: + +--- + +» 05-April-2024 by YOUR oss.gg HANDLE » Figma Link: https://link.to/content + +--- + +//////////////////////////// + +Your turn 👇 + +//////////////////////////// + +» 02-October-2024 by [yourhandle](https://oss.gg/yourhandle) Figma Link: [Figma](https://twenty.com/) + +--- \ No newline at end of file diff --git a/oss-gg/twenty-dev-challenges/1-write-migration-script-other-crm-to-20.md b/oss-gg/twenty-dev-challenges/1-write-migration-script-other-crm-to-20.md new file mode 100644 index 000000000000..249d8e158cfa --- /dev/null +++ b/oss-gg/twenty-dev-challenges/1-write-migration-script-other-crm-to-20.md @@ -0,0 +1,21 @@ +**Side Quest**: Develop a script to facilitate the migration of data from another CRM to Twenty. +**Points**: 750 Points +**Proof**: Add your oss handle and record video and share link to the list below. In video show the working proof of your created script. + +Please follow the following schema: + +--- + +» 05-April-2024 by YOUR oss.gg HANDLE » video Link: https://link.to/content + +--- + +//////////////////////////// + +Your turn 👇 + +//////////////////////////// + +» 02-October-2024 by [yourhandle](https://oss.gg/yourhandle) video Link: [video](https://twenty.com/) + +--- \ No newline at end of file diff --git a/oss-gg/twenty-dev-challenges/2-create-raycast-integration-for-20.md b/oss-gg/twenty-dev-challenges/2-create-raycast-integration-for-20.md new file mode 100644 index 000000000000..e4793c40d66f --- /dev/null +++ b/oss-gg/twenty-dev-challenges/2-create-raycast-integration-for-20.md @@ -0,0 +1,21 @@ +**Side Quest**: Develop an integration for Raycast that enables users to create records on any object within Twenty directly from Raycast. +**Points**: 1500 Points +**Proof**: Add your oss handle and record video and share link to the list below. In video show the workflow of the your integration created and perform some task. + +Please follow the following schema: + +--- + +» 05-April-2024 by YOUR oss.gg HANDLE » video Link: https://link.to/content + +--- + +//////////////////////////// + +Your turn 👇 + +//////////////////////////// + +» 02-October-2024 by [yourhandle](https://oss.gg/yourhandle) video Link: [video](https://twenty.com/) + +--- \ No newline at end of file diff --git a/oss-gg/twenty-no-code-challenges/1-create-n8n-template-integrate-20-API.md b/oss-gg/twenty-no-code-challenges/1-create-n8n-template-integrate-20-API.md new file mode 100644 index 000000000000..6786e5a94553 --- /dev/null +++ b/oss-gg/twenty-no-code-challenges/1-create-n8n-template-integrate-20-API.md @@ -0,0 +1,21 @@ +**Side Quest**: Create an n8n workflow that empowers Twenty by connecting it to another tool. +**Points**: 750 Points +**Proof**: Add your oss handle and template link to the list below. + +Please follow the following schema: + +--- + +» 05-April-2024 by YOUR oss.gg HANDLE » template Link: https://link.to/content + +--- + +//////////////////////////// + +Your turn 👇 + +//////////////////////////// + +» 02-October-2024 by [yourhandle](https://oss.gg/yourhandle) template Link: [template](https://twenty.com/) + +--- \ No newline at end of file diff --git a/oss-gg/twenty-no-code-challenges/2-write-selfthost-guide-blog-post-20.md b/oss-gg/twenty-no-code-challenges/2-write-selfthost-guide-blog-post-20.md new file mode 100644 index 000000000000..58fa6de4d8d6 --- /dev/null +++ b/oss-gg/twenty-no-code-challenges/2-write-selfthost-guide-blog-post-20.md @@ -0,0 +1,21 @@ +**Side Quest**: Write a comprehensive guide on how to integrate Twenty with marketing automation tool (n8n, Zapier). Include a concrete use case and explain how to leverage AI to write API requests for non-developers and share it. +**Points**: 1500 Points +**Proof**: Add your oss handle and guide link to the list below. + +Please follow the following schema: + +--- + +» 05-April-2024 by YOUR oss.gg HANDLE » guide Link: https://link.to/content + +--- + +//////////////////////////// + +Your turn 👇 + +//////////////////////////// + +» 02-October-2024 by [yourhandle](https://oss.gg/yourhandle) guide Link: [guide](https://twenty.com/) + +--- \ No newline at end of file diff --git a/oss-gg/twenty-side-quest/1-quote-tweet-20-oss-gg-launch.md b/oss-gg/twenty-side-quest/1-quote-tweet-20-oss-gg-launch.md new file mode 100644 index 000000000000..0a33e2287146 --- /dev/null +++ b/oss-gg/twenty-side-quest/1-quote-tweet-20-oss-gg-launch.md @@ -0,0 +1,23 @@ +**Side Quest**: Meme Magic - Craft a meme where a brick plays a role. Tweet it, and tag us @papermarkio to submit. +**Points**: 150 Points +**Proof**: Add a screenshot of meme to the PR description. Add a link to your tweet in the list below. + +Please follow the following schema: + +--- + +» 05-April-2024 by YOUR NAME +» Link to Tweet: https://x.com/... + +--- + +//////////////////////////// + +Your turn 👇 + +//////////////////////////// + +» 01-October-2024 by YOUR NAME +» Link to Tweet: https://x.com/... + +--- diff --git a/oss-gg/twenty-side-quest/2-tweet-about-fav-twenty-feature.md b/oss-gg/twenty-side-quest/2-tweet-about-fav-twenty-feature.md new file mode 100644 index 000000000000..0a33e2287146 --- /dev/null +++ b/oss-gg/twenty-side-quest/2-tweet-about-fav-twenty-feature.md @@ -0,0 +1,23 @@ +**Side Quest**: Meme Magic - Craft a meme where a brick plays a role. Tweet it, and tag us @papermarkio to submit. +**Points**: 150 Points +**Proof**: Add a screenshot of meme to the PR description. Add a link to your tweet in the list below. + +Please follow the following schema: + +--- + +» 05-April-2024 by YOUR NAME +» Link to Tweet: https://x.com/... + +--- + +//////////////////////////// + +Your turn 👇 + +//////////////////////////// + +» 01-October-2024 by YOUR NAME +» Link to Tweet: https://x.com/... + +--- diff --git a/oss-gg/twenty-side-quest/3-meme-magic.md b/oss-gg/twenty-side-quest/3-meme-magic.md new file mode 100644 index 000000000000..0a33e2287146 --- /dev/null +++ b/oss-gg/twenty-side-quest/3-meme-magic.md @@ -0,0 +1,23 @@ +**Side Quest**: Meme Magic - Craft a meme where a brick plays a role. Tweet it, and tag us @papermarkio to submit. +**Points**: 150 Points +**Proof**: Add a screenshot of meme to the PR description. Add a link to your tweet in the list below. + +Please follow the following schema: + +--- + +» 05-April-2024 by YOUR NAME +» Link to Tweet: https://x.com/... + +--- + +//////////////////////////// + +Your turn 👇 + +//////////////////////////// + +» 01-October-2024 by YOUR NAME +» Link to Tweet: https://x.com/... + +--- diff --git a/oss-gg/twenty-side-quest/4-gif-magic.md b/oss-gg/twenty-side-quest/4-gif-magic.md new file mode 100644 index 000000000000..0e38ace584d6 --- /dev/null +++ b/oss-gg/twenty-side-quest/4-gif-magic.md @@ -0,0 +1,23 @@ +**Side Quest**: GIF Magic - Craft a GIF where a brick plays a role. Upload it to GIPHY with tags 'open source', 'foss', 'papermarkio'. +**Points**: 150 Points +**Proof**: Add a screenshot of GIF on Giphy to the PR description. Add a link to your GIPHY in the list below. + +Please follow the following schema: + +--- + +» 05-April-2024 by YOUR NAME +» Link to Tweet: https://giphy.com/... + +--- + +//////////////////////////// + +Your turn 👇 + +//////////////////////////// + +» 01-October-2024 by YOUR NAME +» Link to Tweet: https://x.com/... + +--- diff --git a/oss-gg/twenty-side-quest/5-quest-wizard.md b/oss-gg/twenty-side-quest/5-quest-wizard.md new file mode 100644 index 000000000000..2dfe4bd9c86b --- /dev/null +++ b/oss-gg/twenty-side-quest/5-quest-wizard.md @@ -0,0 +1,19 @@ +**Side Quest**: Complete all papermarkio side quests +**Points**: 300 Points +**Proof**: Add screenshots for each side quest to the PR description. Add your name to the list below. + +Please follow the following schema: + +--- + + » 05-April-2024 by YOUR NAME + +//////////////////////////// + +Your turn 👇 + +//////////////////////////// + +» 01-October-2024 by X + +--- From 2f223f329461d9e7e6ba360a44b6876928674c59 Mon Sep 17 00:00:00 2001 From: Weiko Date: Fri, 4 Oct 2024 18:31:19 +0200 Subject: [PATCH 03/30] Fix 'name' column wrongly added in standard objects (#7428) ## Context Name shouldn't be added to all tables, especially standard objects because they already have their own labelIdentifierFieldMetadata specified in the workspace-entity schema. This PR removes this column from the "base" list of columns to add when creating a new object/table and moves it to the object-metadata service that is, as of today, only used for custom objects. Also had to modify the migration-runner to handle column creation in a table creation migration (this was available in the migration definition already but was not doing anything) This also fixes an issue in standard objects that already have a "name" field defined with a different field type, this is even more important when the said field is a composite field. For example people already has a FULL_NAME name field which clashes with the default TEXT name field meaning it was only creating 1 field metadata for 'name' but 3 columns were created: `name, nameFirstName, nameLastName`. This inconsistency with metadata (which is our source of truth everywhere) brought some issues (lately, converting back typeorm response to gql (including composition) was broken). --- ...phql-query-update-many-resolver.service.ts | 3 +- ...aphql-query-update-one-resolver.service.ts | 8 +-- .../object-metadata.service.ts | 39 ++++++++++++- ...ations-for-custom-object-relations.util.ts | 4 -- .../twenty-orm/base.workspace-entity.ts | 2 +- .../utils/custom-table-default-column.util.ts | 55 ------------------- .../utils/table-default-column.util.ts | 10 ++++ .../workspace-migration-runner.service.ts | 21 ++++++- .../calendar/common/types/calendar-event.ts | 2 + .../message-import-manager/types/message.ts | 2 + 10 files changed, 74 insertions(+), 72 deletions(-) delete mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration-runner/utils/custom-table-default-column.util.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration-runner/utils/table-default-column.util.ts diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-update-many-resolver.service.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-update-many-resolver.service.ts index 149674209329..d8854223794b 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-update-many-resolver.service.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-update-many-resolver.service.ts @@ -66,8 +66,7 @@ export class GraphqlQueryUpdateManyResolverService const data = formatData(args.data, objectMetadataMapItem); const result = await withFilterQueryBuilder - .update() - .set(data) + .update(data) .returning('*') .execute(); diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-update-one-resolver.service.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-update-one-resolver.service.ts index 7be966cc656c..6fc4e1a72c58 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-update-one-resolver.service.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/resolvers/graphql-query-update-one-resolver.service.ts @@ -61,13 +61,11 @@ export class GraphqlQueryUpdateOneResolverService objectMetadataMapItem.nameSingular, ); - const withFilterQueryBuilder = queryBuilder.where({ id: args.id }); - const data = formatData(args.data, objectMetadataMapItem); - const result = await withFilterQueryBuilder - .update() - .set(data) + const result = await queryBuilder + .update(data) + .where({ id: args.id }) .returning('*') .execute(); diff --git a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.service.ts b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.service.ts index b4102db85746..ff08237d20fc 100644 --- a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.service.ts @@ -49,8 +49,10 @@ import { generateMigrationName } from 'src/engine/metadata-modules/workspace-mig import { WorkspaceMigrationColumnActionType, WorkspaceMigrationColumnDrop, + WorkspaceMigrationTableAction, WorkspaceMigrationTableActionType, } from 'src/engine/metadata-modules/workspace-migration/workspace-migration.entity'; +import { WorkspaceMigrationFactory } from 'src/engine/metadata-modules/workspace-migration/workspace-migration.factory'; import { WorkspaceMigrationService } from 'src/engine/metadata-modules/workspace-migration/workspace-migration.service'; import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager'; import { computeObjectTargetTable } from 'src/engine/utils/compute-object-target-table.util'; @@ -103,6 +105,7 @@ export class ObjectMetadataService extends TypeOrmQueryService [ - { - name: computeObjectTargetTable(createdObjectMetadata), - action: WorkspaceMigrationTableActionType.CREATE, - } satisfies WorkspaceMigrationTableAction, // Add activity target relation { name: computeObjectTargetTable(activityTargetObjectMetadata), diff --git a/packages/twenty-server/src/engine/twenty-orm/base.workspace-entity.ts b/packages/twenty-server/src/engine/twenty-orm/base.workspace-entity.ts index d9a19a689301..53355304c346 100644 --- a/packages/twenty-server/src/engine/twenty-orm/base.workspace-entity.ts +++ b/packages/twenty-server/src/engine/twenty-orm/base.workspace-entity.ts @@ -55,5 +55,5 @@ export abstract class BaseWorkspaceEntity { }, }) @WorkspaceIsNullable() - deletedAt?: string | null; + deletedAt: string | null; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-runner/utils/custom-table-default-column.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-runner/utils/custom-table-default-column.util.ts deleted file mode 100644 index 11a831f809d4..000000000000 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-runner/utils/custom-table-default-column.util.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { TableColumnOptions } from 'typeorm'; - -import { FieldActorSource } from 'src/engine/metadata-modules/field-metadata/composite-types/actor.composite-type'; - -export const customTableDefaultColumns = ( - tableName: string, -): TableColumnOptions[] => [ - { - name: 'id', - type: 'uuid', - isPrimary: true, - default: 'public.uuid_generate_v4()', - }, - { - name: 'createdAt', - type: 'timestamptz', - default: 'now()', - }, - { - name: 'updatedAt', - type: 'timestamptz', - default: 'now()', - }, - { - name: 'deletedAt', - type: 'timestamptz', - isNullable: true, - }, - { - name: 'position', - type: 'float', - isNullable: true, - }, - { - name: 'name', - type: 'text', - isNullable: false, - default: "'Untitled'", - }, - { - name: 'createdBySource', - type: 'enum', - enumName: `${tableName}_createdBySource_enum`, - enum: Object.values(FieldActorSource), - isNullable: false, - default: `'${FieldActorSource.MANUAL}'`, - }, - { name: 'createdByWorkspaceMemberId', type: 'uuid', isNullable: true }, - { - name: 'createdByName', - type: 'text', - isNullable: false, - default: "''", - }, -]; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-runner/utils/table-default-column.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-runner/utils/table-default-column.util.ts new file mode 100644 index 000000000000..8967eb83f0d9 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-runner/utils/table-default-column.util.ts @@ -0,0 +1,10 @@ +import { TableColumnOptions } from 'typeorm'; + +export const tableDefaultColumns = (): TableColumnOptions[] => [ + { + name: 'id', + type: 'uuid', + isPrimary: true, + default: 'public.uuid_generate_v4()', + }, +]; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-runner/workspace-migration-runner.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-runner/workspace-migration-runner.service.ts index 2d6a20e147e1..db2072c8447b 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-runner/workspace-migration-runner.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-runner/workspace-migration-runner.service.ts @@ -26,10 +26,10 @@ import { WorkspaceMigrationService } from 'src/engine/metadata-modules/workspace import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service'; import { WorkspaceMigrationEnumService } from 'src/engine/workspace-manager/workspace-migration-runner/services/workspace-migration-enum.service'; import { convertOnDeleteActionToOnDelete } from 'src/engine/workspace-manager/workspace-migration-runner/utils/convert-on-delete-action-to-on-delete.util'; +import { tableDefaultColumns } from 'src/engine/workspace-manager/workspace-migration-runner/utils/table-default-column.util'; import { isDefined } from 'src/utils/is-defined'; import { WorkspaceMigrationTypeService } from './services/workspace-migration-type.service'; -import { customTableDefaultColumns } from './utils/custom-table-default-column.util'; @Injectable() export class WorkspaceMigrationRunnerService { @@ -121,7 +121,12 @@ export class WorkspaceMigrationRunnerService { ) { switch (tableMigration.action) { case WorkspaceMigrationTableActionType.CREATE: - await this.createTable(queryRunner, schemaName, tableMigration.name); + await this.createTable( + queryRunner, + schemaName, + tableMigration.name, + tableMigration.columns, + ); break; case WorkspaceMigrationTableActionType.ALTER: { if (tableMigration.newName) { @@ -244,16 +249,26 @@ export class WorkspaceMigrationRunnerService { queryRunner: QueryRunner, schemaName: string, tableName: string, + columns?: WorkspaceMigrationColumnAction[], ) { await queryRunner.createTable( new Table({ name: tableName, schema: schemaName, - columns: customTableDefaultColumns(tableName), + columns: tableDefaultColumns(), }), true, ); + if (columns && columns.length > 0) { + await this.handleColumnChanges( + queryRunner, + schemaName, + tableName, + columns, + ); + } + // Enable totalCount for the table await queryRunner.query(` COMMENT ON TABLE "${schemaName}"."${tableName}" IS '@graphql({"totalCount": {"enabled": true}})'; diff --git a/packages/twenty-server/src/modules/calendar/common/types/calendar-event.ts b/packages/twenty-server/src/modules/calendar/common/types/calendar-event.ts index 00f4c82ac5c5..ae817cc3fae7 100644 --- a/packages/twenty-server/src/modules/calendar/common/types/calendar-event.ts +++ b/packages/twenty-server/src/modules/calendar/common/types/calendar-event.ts @@ -5,6 +5,7 @@ export type CalendarEvent = Omit< CalendarEventWorkspaceEntity, | 'createdAt' | 'updatedAt' + | 'deletedAt' | 'calendarChannelEventAssociations' | 'calendarEventParticipants' | 'conferenceLink' @@ -19,6 +20,7 @@ export type CalendarEventParticipant = Omit< | 'id' | 'createdAt' | 'updatedAt' + | 'deletedAt' | 'personId' | 'workspaceMemberId' | 'person' diff --git a/packages/twenty-server/src/modules/messaging/message-import-manager/types/message.ts b/packages/twenty-server/src/modules/messaging/message-import-manager/types/message.ts index 4ec483869a8d..b665e54898a8 100644 --- a/packages/twenty-server/src/modules/messaging/message-import-manager/types/message.ts +++ b/packages/twenty-server/src/modules/messaging/message-import-manager/types/message.ts @@ -6,6 +6,7 @@ export type Message = Omit< MessageWorkspaceEntity, | 'createdAt' | 'updatedAt' + | 'deletedAt' | 'messageChannelMessageAssociations' | 'messageParticipants' | 'messageThread' @@ -25,6 +26,7 @@ export type MessageParticipant = Omit< | 'id' | 'createdAt' | 'updatedAt' + | 'deletedAt' | 'personId' | 'workspaceMemberId' | 'person' From ae2bd66f45f1079564c92085347c46e6ec992100 Mon Sep 17 00:00:00 2001 From: bmbaji <116686135+bmbaji@users.noreply.github.com> Date: Fri, 4 Oct 2024 12:57:15 -0400 Subject: [PATCH 04/30] changed the createdByName to Twenty(Sample data). (#7424) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I changed the createdByName from' system' to 'Twenty(Sample Data)'. --------- Co-authored-by: Félix Malfait --- .../utils/getSourceEnumOptions.ts | 8 ++++++++ .../ui/field/display/components/ActorDisplay.tsx | 6 +++++- .../composite-types/actor.composite-type.ts | 1 + .../standard-objects-prefill-data/company.ts | 12 +++++++----- .../standard-objects-prefill-data/person.ts | 11 ++++++----- .../src/display/icon/components/TablerIcons.ts | 7 ++++--- 6 files changed, 31 insertions(+), 14 deletions(-) diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getSourceEnumOptions.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getSourceEnumOptions.ts index ee886da633e0..7006bb1ed8f1 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getSourceEnumOptions.ts +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getSourceEnumOptions.ts @@ -4,6 +4,7 @@ import { IconCsv, IconGmail, IconGoogleCalendar, + IconRobot, IconSettingsAutomation, IconUserCircle, } from 'twenty-ui'; @@ -52,5 +53,12 @@ export const getSourceEnumOptions = ( AvatarIcon: IconSettingsAutomation, isIconInverted: true, }, + { + id: 'SYSTEM', + name: 'System', + isSelected: selectedItemIds.includes('SYSTEM'), + AvatarIcon: IconRobot, + isIconInverted: true, + }, ]; }; diff --git a/packages/twenty-front/src/modules/ui/field/display/components/ActorDisplay.tsx b/packages/twenty-front/src/modules/ui/field/display/components/ActorDisplay.tsx index ba107aa612f0..b5111d245a0a 100644 --- a/packages/twenty-front/src/modules/ui/field/display/components/ActorDisplay.tsx +++ b/packages/twenty-front/src/modules/ui/field/display/components/ActorDisplay.tsx @@ -7,6 +7,7 @@ import { IconCalendar, IconCsv, IconGmail, + IconRobot, } from 'twenty-ui'; type ActorDisplayProps = Partial & { @@ -29,12 +30,15 @@ export const ActorDisplay = ({ return IconGmail; case 'CALENDAR': return IconCalendar; + case 'SYSTEM': + return IconRobot; default: return undefined; } }, [source]); - const isIconInverted = source === 'API' || source === 'IMPORT'; + const isIconInverted = + source === 'API' || source === 'IMPORT' || source === 'SYSTEM'; return ( Date: Fri, 4 Oct 2024 19:08:08 +0200 Subject: [PATCH 05/30] Adding instruction for running redis (#7434) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fixes #7433 --------- Co-authored-by: Félix Malfait --- .../src/content/developers/local-setup.mdx | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/packages/twenty-website/src/content/developers/local-setup.mdx b/packages/twenty-website/src/content/developers/local-setup.mdx index 7e436c1aa304..69cf9cb630e7 100644 --- a/packages/twenty-website/src/content/developers/local-setup.mdx +++ b/packages/twenty-website/src/content/developers/local-setup.mdx @@ -185,6 +185,24 @@ yarn ## Step 7: Running the project +Start your redis server: + + + Depending on your Linux distribution, Redis server might be started automatically. + If not, check the [Redis installation guide](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/) for your distro. + + + ```bash + brew services start redis + ``` + + + Depending on your Linux distribution, Redis server might be started automatically. + If not, check the [Redis installation guide](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/) for your distro. + + + + Setup your database with the following command: ```bash npx nx database:reset twenty-server From bd305c84320fce442b6237a02c5a4f8e84452fac Mon Sep 17 00:00:00 2001 From: Weiko Date: Fri, 4 Oct 2024 19:28:29 +0200 Subject: [PATCH 06/30] Fix worker run ci step (#7437) ## Context Updating the Worker / Run step to run in sync mode with in-memory cache type so it does not hang forever in the CI. --- .github/workflows/ci-server.yaml | 2 +- packages/twenty-server/project.json | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci-server.yaml b/.github/workflows/ci-server.yaml index 857dec2fc863..074d63fdda40 100644 --- a/.github/workflows/ci-server.yaml +++ b/.github/workflows/ci-server.yaml @@ -54,7 +54,7 @@ jobs: - name: Server / Write .env run: npx nx reset:env twenty-server - name: Worker / Run - run: MESSAGE_QUEUE_TYPE=sync npx nx worker twenty-server + run: npx nx run twenty-server:worker:ci server-test: runs-on: ubuntu-latest diff --git a/packages/twenty-server/project.json b/packages/twenty-server/project.json index a31ff4fb101f..ed8ad716b6e0 100644 --- a/packages/twenty-server/project.json +++ b/packages/twenty-server/project.json @@ -77,6 +77,14 @@ "options": { "cwd": "packages/twenty-server", "command": "node dist/src/queue-worker/queue-worker.js" + }, + "configurations": { + "ci": { + "env": { + "MESSAGE_QUEUE_TYPE": "sync", + "CACHE_STORAGE_TYPE": "memory" + } + } } }, "typeorm": { From d8c4af9279ab4c16fe0e47709bc7197c33486868 Mon Sep 17 00:00:00 2001 From: Charles Bochet Date: Sat, 5 Oct 2024 00:22:38 +0200 Subject: [PATCH 07/30] Fix all broken CIs (#7439) Fix all the broken CIs :p This includes an ongoing effort to simplify test maintenance by having 1 unique source of truth about metadata and data mocks (that will later be generated from a unique source of seeds: dev = demo = test) Regressions: - Unit line coverage: 60 > 55 - Storybook Pages branch coverage: 40 > 35 We will need to write tests to increase those coverage - RelationFieldDisplay perf: 0.2ms to 0.22ms > We might have a regression here - Removed perf story about RawJSON > We will need to re-add it --- packages/twenty-emails/package.json | 2 +- packages/twenty-front/.storybook/preview.tsx | 8 +- packages/twenty-front/jest.config.ts | 3 +- packages/twenty-front/nyc.config.cjs | 2 +- packages/twenty-front/package.json | 2 +- .../useRightDrawerEmailThread.test.tsx | 436 ++++++- .../useActivityTargetObjectRecords.test.tsx | 2 +- .../__tests__/useCreateActivityInDB.test.tsx | 54 +- .../useOpenCreateActivityDrawer.test.tsx | 18 +- .../tasks/__stories__/TaskGroups.stories.tsx | 3 + .../tasks/__stories__/TaskList.stories.tsx | 11 +- .../tasks/components/TaskGroups.tsx | 1 + .../activities/tasks/components/TaskList.tsx | 1 + .../hooks/__tests__/useCompleteTask.test.tsx | 131 +- .../__tests__/useTimelineActivities.test.tsx | 9 +- .../EventRowMainObjectUpdated.stories.tsx | 6 +- .../ChromeExtensionSidecarProvider.tsx | 92 +- .../favorites/hooks/__mocks__/useFavorites.ts | 820 ++++++------- .../hooks/__tests__/useFavorites.test.tsx | 20 +- .../__tests__/useDefaultHomePagePath.test.ts | 2 +- .../ObjectMetadataItemsLoadEffect.tsx | 2 +- ...=> ApolloMetadataClientMockedProvider.tsx} | 0 .../hooks/__mocks__/useFieldMetadataItem.ts | 14 +- ...ColumnDefinitionsFromFieldMetadata.test.ts | 2 +- .../useCreateOneObjectMetadataItem.test.tsx | 14 +- .../__tests__/useFieldMetadataItem.test.tsx | 4 +- .../useFilteredObjectMetadataItems.test.tsx | 2 +- .../useGetObjectOrderByField.test.tsx | 12 +- ...ectRecordIdentifierByNameSingular.test.tsx | 2 +- .../__tests__/useGetRelationMetadata.test.tsx | 2 +- .../useMapToObjectRecordIdentifier.test.tsx | 8 +- .../__tests__/useObjectMetadataItem.test.tsx | 14 +- .../hooks/useObjectNamePluralFromSingular.ts | 2 +- .../hooks/useObjectNameSingularFromPlural.ts | 2 +- ...etObjectMetadataItemBySingularName.test.ts | 2 +- .../__tests__/getObjectOrderByField.test.ts | 2 +- .../utils/__tests__/getObjectSlug.test.ts | 2 +- ...ObjectMetadataAvailableForRelation.test.ts | 2 +- .../mapFieldMetadataToGraphQLQuery.test.tsx | 2 +- .../mapObjectMetadataToGraphQLQuery.test.tsx | 2 +- .../utils/mapObjectMetadataToGraphQLQuery.ts | 1 + .../objectMetadataItemSchema.test.ts | 7 +- .../__tests__/getRecordNodeFromRecord.test.ts | 40 +- .../cache/utils/getRecordNodeFromRecord.ts | 4 +- .../hooks/__mocks__/personFragment.ts | 48 - .../hooks/__mocks__/personFragments.ts | 327 +++++ .../hooks/__mocks__/useCreateManyRecords.ts | 4 +- .../hooks/__mocks__/useCreateOneRecord.ts | 4 +- .../hooks/__mocks__/useDeleteOneRecord.ts | 2 + .../__mocks__/useFindDuplicateRecords.ts | 4 +- .../hooks/__mocks__/useFindOneRecord.ts | 4 +- .../hooks/__mocks__/useUpdateOneRecord.ts | 4 +- .../__tests__/useCreateManyRecords.test.tsx | 14 +- .../useCreateManyRecordsMutation.test.tsx | 12 +- .../__tests__/useCreateOneRecord.test.tsx | 14 +- .../useCreateOneRecordMutation.test.tsx | 12 +- .../__tests__/useDeleteManyRecords.test.tsx | 14 +- .../useDeleteManyRecordsMutation.test.tsx | 8 +- .../__tests__/useDeleteOneRecord.test.tsx | 17 +- .../useDeleteOneRecordMutation.test.tsx | 10 +- .../__tests__/useFetchAllRecordIds.test.tsx | 27 +- .../useFindDuplicateRecords.test.tsx | 17 +- .../useFindDuplicateRecordsQuery.test.tsx | 12 +- .../__tests__/useFindManyRecords.test.tsx | 33 +- .../useFindManyRecordsQuery.test.tsx | 12 +- .../hooks/__tests__/useFindOneRecord.test.tsx | 25 +- .../__tests__/useFindOneRecordQuery.test.tsx | 12 +- ...ordsForMultipleMetadataItemsQuery.test.tsx | 2 +- .../__tests__/useLazyFindOneRecord.test.tsx | 17 +- .../__tests__/useObjectRecordTable.test.tsx | 19 +- .../__tests__/useUpdateOneRecord.test.tsx | 14 +- .../useUpdateOneRecordMutation.test.tsx | 12 +- .../hooks/useFindDuplicateRecords.ts | 2 +- .../object-record/hooks/useFindManyRecords.ts | 5 +- .../__mocks__/fieldDefinitions.ts | 27 +- .../hooks/__tests__/usePersistField.test.tsx | 19 +- .../__tests__/useToggleEditOnlyInput.test.tsx | 276 ++++- .../DateTimeFieldDisplay.perf.stories.tsx | 4 +- ...sx => EmailsFieldDisplay.perf.stories.tsx} | 27 +- .../perf/JsonFieldDisplay.perf.stories.tsx | 43 - .../MultiSelectFieldDisplay.perf.stories.tsx | 2 +- ...sx => PhonesFieldDisplay.perf.stories.tsx} | 20 +- .../perf/RatingFieldDisplay.perf.stories.tsx | 4 +- ...RelationToOneFieldDisplay.perf.stories.tsx | 2 +- .../isMatchingBooleanFilter.test.ts} | 0 .../isMatchingCurrencyFilter.test.ts} | 0 .../isMatchingDateFilter.test.ts} | 0 .../isMatchingFloatFilter.test.ts} | 0 .../isMatchingStringFilter.test.ts} | 0 .../isMatchingUUIDFilter.test.ts} | 0 .../isRecordMatchingFilter.test.ts} | 5 +- ...bjectDropdownFilterIntoQueryFilter.test.ts | 1063 +++++++++++++++++ ...turnObjectDropdownFilterIntoQueryFilter.ts | 52 - .../hooks/useLoadRecordIndexTable.ts | 4 + .../hooks/__tests__/useTableData.test.tsx | 120 +- .../RecordDetailRelationSection.stories.tsx | 10 +- .../perf/RecordTableCell.perf.stories.tsx | 2 +- .../hooks/__tests__/useUpsertRecord.test.tsx | 2 +- ...attedAsObjectRecordForSelectArray.test.tsx | 2 +- ...jectRecordsSpreasheetImportDialog.test.tsx | 274 ++++- .../useFilteredSearchEntityQuery.test.tsx | 2 +- ...AccountsCalendarChannelDetails.stories.tsx | 8 +- ...ccountsCalendarChannelsGeneral.stories.tsx | 8 +- ...sAccountsMessageChannelDetails.stories.tsx | 8 +- ...sDataModelFieldDescriptionForm.stories.tsx | 10 +- ...ngsDataModelFieldIconLabelForm.stories.tsx | 10 +- ...DataModelFieldSettingsFormCard.stories.tsx | 10 +- ...tingsDataModelFieldPreviewCard.stories.tsx | 37 +- .../__tests__/useFieldPreviewValue.test.tsx | 43 +- .../getCurrencyFieldPreviewValue.test.ts | 18 +- .../__tests__/getFieldPreviewValue.test.ts | 38 +- .../getMultiSelectFieldPreviewValue.test.ts | 50 +- .../getSelectFieldPreviewValue.test.ts | 30 +- ...ttingsDataModelObjectAboutForm.stories.tsx | 5 +- .../getFieldPreviewValueFromRecord.test.ts | 36 +- ...eServerlessFunctionUpdateFormState.test.ts | 4 +- .../useServerlessFunctionUpdateFormState.ts | 2 +- .../__stories__/RecordShowPage.stories.tsx | 8 - .../SettingsAppearance.stories.tsx | 36 +- .../SettingsIntegrationDatabase.stories.tsx | 3 +- .../decorators/ChipGeneratorsDecorator.tsx | 2 +- .../src/testing/decorators/PageDecorator.tsx | 53 +- .../src/testing/decorators/RootDecorator.tsx | 2 +- .../testing/decorators/getFieldDecorator.tsx | 4 +- .../twenty-front/src/testing/graphqlMocks.ts | 26 +- .../jest/JestObjectMetadataItemSetter.tsx | 2 +- .../jest/generateEmptyJestRecordNode.ts | 37 + ... getJestMetadataAndApolloMocksWrapper.tsx} | 2 +- .../generated/mock-metadata-query-result.ts | 539 ++++++++- ...ts => generatedMockObjectMetadataItems.ts} | 0 .../src/testing/mock-data/metadata.ts | 290 ----- .../src/testing/mock-data/users.ts | 2 + .../src/testing/mock-data/view-fields.ts | 218 +++- .../src/testing/mock-data/views.ts | 823 +------------ .../src/utils/format/__tests__/number.test.ts | 7 +- packages/twenty-server/jest.config.ts | 2 +- packages/twenty-server/package.json | 2 +- .../src/constants/assets-path.ts | 7 +- .../typeorm-seeds/metadata/fieldsMetadata.ts | 2 +- ...ld-metadata-to-graphql-query.utils.spec.ts | 3 + .../utils/__tests__/components.utils.spec.ts | 9 +- .../get-base-typescript-project-files.ts | 2 +- .../test/people.integration-spec.ts | 4 +- .../serverless-functions.integration-spec.ts | 61 - .../twenty-server/test/utils/setup-test.ts | 2 +- packages/twenty-ui/package.json | 2 +- .../display/icon/components/TablerIcons.ts | 2 +- packages/twenty-website/package.json | 2 +- 148 files changed, 4363 insertions(+), 2542 deletions(-) rename packages/twenty-front/src/modules/object-metadata/hooks/__mocks__/{ApolloMetadataClientProvider.tsx => ApolloMetadataClientMockedProvider.tsx} (100%) delete mode 100644 packages/twenty-front/src/modules/object-record/hooks/__mocks__/personFragment.ts create mode 100644 packages/twenty-front/src/modules/object-record/hooks/__mocks__/personFragments.ts rename packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/{EmailFieldDisplay.perf.stories.tsx => EmailsFieldDisplay.perf.stories.tsx} (55%) delete mode 100644 packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/JsonFieldDisplay.perf.stories.tsx rename packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/{PhoneFieldDisplay.perf.stories.tsx => PhonesFieldDisplay.perf.stories.tsx} (61%) rename packages/twenty-front/src/modules/object-record/record-filter/utils/{isMatchingBooleanFilter.spec.ts => __tests__/isMatchingBooleanFilter.test.ts} (100%) rename packages/twenty-front/src/modules/object-record/record-filter/utils/{isMatchingCurrencyFilter.spec.ts => __tests__/isMatchingCurrencyFilter.test.ts} (100%) rename packages/twenty-front/src/modules/object-record/record-filter/utils/{isMatchingDateFilter.spec.ts => __tests__/isMatchingDateFilter.test.ts} (100%) rename packages/twenty-front/src/modules/object-record/record-filter/utils/{isMatchingFloatFilter.spec.ts => __tests__/isMatchingFloatFilter.test.ts} (100%) rename packages/twenty-front/src/modules/object-record/record-filter/utils/{isMatchingStringFilter.spec.ts => __tests__/isMatchingStringFilter.test.ts} (100%) rename packages/twenty-front/src/modules/object-record/record-filter/utils/{isMatchingUUIDFilter.spec.ts => __tests__/isMatchingUUIDFilter.test.ts} (100%) rename packages/twenty-front/src/modules/object-record/record-filter/utils/{isRecordMatchingFilter.spec.ts => __tests__/isRecordMatchingFilter.test.ts} (98%) create mode 100644 packages/twenty-front/src/modules/object-record/record-filter/utils/__tests__/turnObjectDropdownFilterIntoQueryFilter.test.ts create mode 100644 packages/twenty-front/src/testing/jest/generateEmptyJestRecordNode.ts rename packages/twenty-front/src/testing/jest/{getJestHookWrapper.tsx => getJestMetadataAndApolloMocksWrapper.tsx} (94%) rename packages/twenty-front/src/testing/mock-data/{objectMetadataItems.ts => generatedMockObjectMetadataItems.ts} (100%) delete mode 100644 packages/twenty-front/src/testing/mock-data/metadata.ts delete mode 100644 packages/twenty-server/test/serverless-functions.integration-spec.ts diff --git a/packages/twenty-emails/package.json b/packages/twenty-emails/package.json index a792a42a373a..1f20fbe7eb64 100644 --- a/packages/twenty-emails/package.json +++ b/packages/twenty-emails/package.json @@ -1,6 +1,6 @@ { "name": "twenty-emails", - "version": "0.31.canary", + "version": "0.31.0-canary", "description": "", "author": "", "private": true, diff --git a/packages/twenty-front/.storybook/preview.tsx b/packages/twenty-front/.storybook/preview.tsx index f49ed56c58b9..1d67634e2a54 100644 --- a/packages/twenty-front/.storybook/preview.tsx +++ b/packages/twenty-front/.storybook/preview.tsx @@ -1,7 +1,7 @@ -import { useEffect } from 'react'; import { ThemeProvider } from '@emotion/react'; import { Preview } from '@storybook/react'; import { initialize, mswDecorator } from 'msw-storybook-addon'; +import { useEffect } from 'react'; import { useDarkMode } from 'storybook-dark-mode'; import { THEME_DARK, THEME_LIGHT, ThemeContextProvider } from 'twenty-ui'; @@ -13,12 +13,16 @@ import 'react-loading-skeleton/dist/skeleton.css'; initialize({ onUnhandledRequest: async (request: Request) => { const fileExtensionsToIgnore = - /\.(ts|tsx|js|jsx|svg|css|png)(\?v=[a-zA-Z0-9]+)?/; + /\.(ts|tsx|js|jsx|svg|css|png|woff2)(\?v=[a-zA-Z0-9]+)?/; if (fileExtensionsToIgnore.test(request.url)) { return; } + if (request.url.startsWith('http://localhost:3000/files/data:image')) { + return; + } + const requestBody = await request.json(); // eslint-disable-next-line no-console console.warn(`Unhandled ${request.method} request to ${request.url} diff --git a/packages/twenty-front/jest.config.ts b/packages/twenty-front/jest.config.ts index c71df7b77aff..8ed7f398db4e 100644 --- a/packages/twenty-front/jest.config.ts +++ b/packages/twenty-front/jest.config.ts @@ -2,6 +2,7 @@ import { JestConfigWithTsJest, pathsToModuleNameMapper } from 'ts-jest'; // eslint-disable-next-line @typescript-eslint/no-var-requires const tsConfig = require('./tsconfig.json'); +process.env.TZ = 'GMT'; const jestConfig: JestConfigWithTsJest = { // to enable logs, comment out the following line @@ -25,7 +26,7 @@ const jestConfig: JestConfigWithTsJest = { coverageThreshold: { global: { statements: 60, - lines: 60, + lines: 55, functions: 50, }, }, diff --git a/packages/twenty-front/nyc.config.cjs b/packages/twenty-front/nyc.config.cjs index 3fbf2dfd6204..8ae501c6910f 100644 --- a/packages/twenty-front/nyc.config.cjs +++ b/packages/twenty-front/nyc.config.cjs @@ -16,7 +16,7 @@ const modulesCoverage = { }; const pagesCoverage = { - branches: 40, + branches: 35, statements: 60, lines: 60, functions: 45, diff --git a/packages/twenty-front/package.json b/packages/twenty-front/package.json index 96e6442a3f56..9370f2460b92 100644 --- a/packages/twenty-front/package.json +++ b/packages/twenty-front/package.json @@ -1,6 +1,6 @@ { "name": "twenty-front", - "version": "0.31.canary", + "version": "0.31.0-canary", "private": true, "type": "module", "scripts": { diff --git a/packages/twenty-front/src/modules/activities/emails/right-drawer/hooks/__tests__/useRightDrawerEmailThread.test.tsx b/packages/twenty-front/src/modules/activities/emails/right-drawer/hooks/__tests__/useRightDrawerEmailThread.test.tsx index f88c7b79a1b5..0af5cec8224a 100644 --- a/packages/twenty-front/src/modules/activities/emails/right-drawer/hooks/__tests__/useRightDrawerEmailThread.test.tsx +++ b/packages/twenty-front/src/modules/activities/emails/right-drawer/hooks/__tests__/useRightDrawerEmailThread.test.tsx @@ -1,56 +1,410 @@ -import { MockedProvider } from '@apollo/client/testing'; -import { renderHook } from '@testing-library/react'; -import { RecoilRoot } from 'recoil'; - -import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords'; -import { useFindOneRecord } from '@/object-record/hooks/useFindOneRecord'; +import { renderHook, waitFor } from '@testing-library/react'; +import { viewableRecordIdState } from '@/object-record/record-right-drawer/states/viewableRecordIdState'; +import gql from 'graphql-tag'; +import { generateEmptyJestRecordNode } from '~/testing/jest/generateEmptyJestRecordNode'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; import { useRightDrawerEmailThread } from '../useRightDrawerEmailThread'; -jest.mock('@/object-record/hooks/useFindOneRecord', () => ({ - __esModule: true, - useFindOneRecord: jest.fn(), -})); +const mocks = [ + { + request: { + query: gql` + query FindOneMessageThread($objectRecordId: ID!) { + messageThread(filter: { id: { eq: $objectRecordId } }) { + __typename + id + } + } + `, + variables: { objectRecordId: '1' }, + }, + result: jest.fn(() => ({ + data: { + messageThread: { + id: '1', + __typename: 'MessageThread', + }, + }, + })), + }, + { + request: { + query: gql` + query FindManyMessages( + $filter: MessageFilterInput + $orderBy: [MessageOrderByInput] + $lastCursor: String + $limit: Int + ) { + messages( + filter: $filter + orderBy: $orderBy + first: $limit + after: $lastCursor + ) { + edges { + node { + __typename + createdAt + headerMessageId + id + messageParticipants { + edges { + node { + __typename + displayName + handle + id + person { + __typename + avatarUrl + city + companyId + createdAt + createdBy { + source + workspaceMemberId + name + } + deletedAt + emails { + primaryEmail + additionalEmails + } + id + intro + jobTitle + linkedinLink { + primaryLinkUrl + primaryLinkLabel + secondaryLinks + } + name { + firstName + lastName + } + performanceRating + phones { + primaryPhoneNumber + primaryPhoneCountryCode + additionalPhones + } + position + updatedAt + whatsapp { + primaryPhoneNumber + primaryPhoneCountryCode + additionalPhones + } + workPreference + xLink { + primaryLinkUrl + primaryLinkLabel + secondaryLinks + } + } + role + workspaceMember { + __typename + avatarUrl + colorScheme + createdAt + dateFormat + deletedAt + id + locale + name { + firstName + lastName + } + timeFormat + timeZone + updatedAt + userEmail + userId + } + } + } + } + messageThread { + __typename + id + } + receivedAt + subject + text + } + cursor + } + pageInfo { + hasNextPage + hasPreviousPage + startCursor + endCursor + } + totalCount + } + } + `, + variables: { + filter: { messageThreadId: { eq: '1' } }, + orderBy: [{ receivedAt: 'AscNullsLast' }], + lastCursor: undefined, + limit: 10, + }, + }, + result: jest.fn(() => ({ + data: { + messages: { + edges: [ + { + node: generateEmptyJestRecordNode({ + objectNameSingular: 'message', + input: { + id: '1', + text: 'Message 1', + createdAt: '2024-10-03T10:20:10.145Z', + }, + }), + cursor: '1', + }, + { + node: generateEmptyJestRecordNode({ + objectNameSingular: 'message', + input: { + id: '2', + text: 'Message 2', + createdAt: '2024-10-03T10:20:10.145Z', + }, + }), + cursor: '2', + }, + ], + totalCount: 2, + pageInfo: { + hasNextPage: false, + hasPreviousPage: false, + startCursor: '1', + endCursor: '2', + }, + }, + }, + })), + }, + { + request: { + query: gql` + query FindManyMessageParticipants( + $filter: MessageParticipantFilterInput + $orderBy: [MessageParticipantOrderByInput] + $lastCursor: String + $limit: Int + ) { + messageParticipants( + filter: $filter + orderBy: $orderBy + first: $limit + after: $lastCursor + ) { + edges { + node { + __typename + displayName + handle + id + messageId + person { + __typename + avatarUrl + city + companyId + createdAt + createdBy { + source + workspaceMemberId + name + } + deletedAt + emails { + primaryEmail + additionalEmails + } + id + intro + jobTitle + linkedinLink { + primaryLinkUrl + primaryLinkLabel + secondaryLinks + } + name { + firstName + lastName + } + performanceRating + phones { + primaryPhoneNumber + primaryPhoneCountryCode + additionalPhones + } + position + updatedAt + whatsapp { + primaryPhoneNumber + primaryPhoneCountryCode + additionalPhones + } + workPreference + xLink { + primaryLinkUrl + primaryLinkLabel + secondaryLinks + } + } + role + workspaceMember { + __typename + avatarUrl + colorScheme + createdAt + dateFormat + deletedAt + id + locale + name { + firstName + lastName + } + timeFormat + timeZone + updatedAt + userEmail + userId + } + } + cursor + } + pageInfo { + hasNextPage + hasPreviousPage + startCursor + endCursor + } + totalCount + } + } + `, + variables: { + filter: { messageId: { in: ['1', '2'] }, role: { eq: 'from' } }, + orderBy: undefined, + lastCursor: undefined, + limit: undefined, + }, + }, + result: jest.fn(() => ({ + data: { + messageParticipants: { + edges: [ + { + node: generateEmptyJestRecordNode({ + objectNameSingular: 'messageParticipant', + input: { + id: 'messageParticipant-1', + role: 'from', + messageId: '1', + }, + }), + cursor: '1', + }, + { + node: generateEmptyJestRecordNode({ + objectNameSingular: 'messageParticipant', + input: { + id: 'messageParticipant-2', + role: 'from', + messageId: '2', + }, + }), + cursor: '2', + }, + ], + totalCount: 2, + pageInfo: { + hasNextPage: false, + hasPreviousPage: false, + startCursor: '1', + endCursor: '2', + }, + }, + }, + })), + }, +]; -jest.mock('@/object-record/hooks/useFindManyRecords', () => ({ - __esModule: true, - useFindManyRecords: jest.fn(), -})); +const Wrapper = getJestMetadataAndApolloMocksWrapper({ + apolloMocks: mocks, + onInitializeRecoilSnapshot: ({ set }) => { + set(viewableRecordIdState, '1'); + }, +}); describe('useRightDrawerEmailThread', () => { it('should return correct values', async () => { - const mockThread = { id: '1' }; - const mockMessages = [ - { id: '1', text: 'Message 1' }, - { id: '2', text: 'Message 2' }, + { + __typename: 'Message', + createdAt: '2024-10-03T10:20:10.145Z', + headerMessageId: '', + id: '1', + messageParticipants: [], + messageThread: null, + receivedAt: null, + sender: { + __typename: 'MessageParticipant', + displayName: '', + handle: '', + id: 'messageParticipant-1', + messageId: '1', + person: null, + role: 'from', + workspaceMember: null, + }, + subject: '', + text: 'Message 1', + }, + { + __typename: 'Message', + createdAt: '2024-10-03T10:20:10.145Z', + headerMessageId: '', + id: '2', + messageParticipants: [], + messageThread: null, + receivedAt: null, + sender: { + __typename: 'MessageParticipant', + displayName: '', + handle: '', + id: 'messageParticipant-2', + messageId: '2', + person: null, + role: 'from', + workspaceMember: null, + }, + subject: '', + text: 'Message 2', + }, ]; - const mockFetchMoreRecords = jest.fn(); - - (useFindOneRecord as jest.Mock).mockReturnValue({ - record: mockThread, - loading: false, - fetchMoreRecords: mockFetchMoreRecords, - }); - - (useFindManyRecords as jest.Mock).mockReturnValue({ - records: mockMessages, - loading: false, - fetchMoreRecords: mockFetchMoreRecords, - }); - const { result } = renderHook(() => useRightDrawerEmailThread(), { - wrapper: ({ children }) => ( - - {children} - - ), + wrapper: Wrapper, }); - expect(result.current.thread).toBeDefined(); - expect(result.current.messages).toEqual(mockMessages); - expect(result.current.threadLoading).toBeFalsy(); - expect(result.current.fetchMoreMessages).toBeInstanceOf(Function); + await waitFor(() => { + expect(result.current.thread).toBeDefined(); + expect(result.current.messages).toEqual(mockMessages); + expect(result.current.threadLoading).toBeFalsy(); + expect(result.current.fetchMoreMessages).toBeInstanceOf(Function); + }); }); }); diff --git a/packages/twenty-front/src/modules/activities/hooks/__tests__/useActivityTargetObjectRecords.test.tsx b/packages/twenty-front/src/modules/activities/hooks/__tests__/useActivityTargetObjectRecords.test.tsx index 260e931a3ae2..7d1426f4cb75 100644 --- a/packages/twenty-front/src/modules/activities/hooks/__tests__/useActivityTargetObjectRecords.test.tsx +++ b/packages/twenty-front/src/modules/activities/hooks/__tests__/useActivityTargetObjectRecords.test.tsx @@ -9,7 +9,7 @@ import { currentWorkspaceMemberState } from '@/auth/states/currentWorkspaceMembe import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope'; import { JestObjectMetadataItemSetter } from '~/testing/jest/JestObjectMetadataItemSetter'; -import { generatedMockObjectMetadataItems } from '~/testing/mock-data/objectMetadataItems'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; import { mockWorkspaceMembers } from '~/testing/mock-data/workspace-members'; const cache = new InMemoryCache(); diff --git a/packages/twenty-front/src/modules/activities/hooks/__tests__/useCreateActivityInDB.test.tsx b/packages/twenty-front/src/modules/activities/hooks/__tests__/useCreateActivityInDB.test.tsx index 1b56bc49d5da..baddb1029bda 100644 --- a/packages/twenty-front/src/modules/activities/hooks/__tests__/useCreateActivityInDB.test.tsx +++ b/packages/twenty-front/src/modules/activities/hooks/__tests__/useCreateActivityInDB.test.tsx @@ -1,13 +1,11 @@ -import { MockedProvider, MockedResponse } from '@apollo/client/testing'; +import { MockedResponse } from '@apollo/client/testing'; import { act, renderHook } from '@testing-library/react'; import gql from 'graphql-tag'; import pick from 'lodash.pick'; -import { ReactNode } from 'react'; -import { RecoilRoot } from 'recoil'; import { useCreateActivityInDB } from '@/activities/hooks/useCreateActivityInDB'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; -import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; import { mockedTasks } from '~/testing/mock-data/tasks'; const mockedDate = '2024-03-15T12:00:00.000Z'; @@ -26,14 +24,44 @@ const mocks: MockedResponse[] = [ mutation CreateOneTask($input: TaskCreateInput!) { createTask(data: $input) { __typename - updatedAt + assignee { + __typename + id + name { + firstName + lastName + } + } + assigneeId + attachments { + edges { + node { + __typename + activityId + authorId + companyId + createdAt + deletedAt + fullPath + id + name + noteId + opportunityId + personId + rocketId + taskId + type + updatedAt + } + } + } + body createdAt dueAt id status - body - assigneeId title + updatedAt } } `, @@ -56,15 +84,9 @@ const mocks: MockedResponse[] = [ }, ]; -const Wrapper = ({ children }: { children: ReactNode }) => ( - - - - {children} - - - -); +const Wrapper = getJestMetadataAndApolloMocksWrapper({ + apolloMocks: mocks, +}); describe('useCreateActivityInDB', () => { it('Should create activity in DB', async () => { diff --git a/packages/twenty-front/src/modules/activities/hooks/__tests__/useOpenCreateActivityDrawer.test.tsx b/packages/twenty-front/src/modules/activities/hooks/__tests__/useOpenCreateActivityDrawer.test.tsx index 665702704d1b..855c0b55bd29 100644 --- a/packages/twenty-front/src/modules/activities/hooks/__tests__/useOpenCreateActivityDrawer.test.tsx +++ b/packages/twenty-front/src/modules/activities/hooks/__tests__/useOpenCreateActivityDrawer.test.tsx @@ -1,7 +1,6 @@ -import { MockedProvider, MockedResponse } from '@apollo/client/testing'; +import { MockedResponse } from '@apollo/client/testing'; import { act, renderHook } from '@testing-library/react'; -import { ReactNode } from 'react'; -import { RecoilRoot, useRecoilValue, useSetRecoilState } from 'recoil'; +import { useRecoilValue, useSetRecoilState } from 'recoil'; import { useOpenCreateActivityDrawer } from '@/activities/hooks/useOpenCreateActivityDrawer'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; @@ -9,7 +8,8 @@ import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSi import { viewableRecordIdState } from '@/object-record/record-right-drawer/states/viewableRecordIdState'; import gql from 'graphql-tag'; import pick from 'lodash.pick'; -import { generatedMockObjectMetadataItems } from '~/testing/mock-data/objectMetadataItems'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; import { mockedTasks } from '~/testing/mock-data/tasks'; const mockedDate = '2024-03-15T12:00:00.000Z'; @@ -61,13 +61,9 @@ const mocks: MockedResponse[] = [ }, ]; -const Wrapper = ({ children }: { children: ReactNode }) => ( - - - {children} - - -); +const Wrapper = getJestMetadataAndApolloMocksWrapper({ + apolloMocks: mocks, +}); const mockObjectMetadataItems = generatedMockObjectMetadataItems; diff --git a/packages/twenty-front/src/modules/activities/tasks/__stories__/TaskGroups.stories.tsx b/packages/twenty-front/src/modules/activities/tasks/__stories__/TaskGroups.stories.tsx index 444049cc1844..aefa6f2ed59a 100644 --- a/packages/twenty-front/src/modules/activities/tasks/__stories__/TaskGroups.stories.tsx +++ b/packages/twenty-front/src/modules/activities/tasks/__stories__/TaskGroups.stories.tsx @@ -42,5 +42,8 @@ export const WithTasks: Story = { }, parameters: { msw: graphqlMocks, + container: { + width: '500px', + }, }, }; diff --git a/packages/twenty-front/src/modules/activities/tasks/__stories__/TaskList.stories.tsx b/packages/twenty-front/src/modules/activities/tasks/__stories__/TaskList.stories.tsx index 1113febb6223..c2a65b772be9 100644 --- a/packages/twenty-front/src/modules/activities/tasks/__stories__/TaskList.stories.tsx +++ b/packages/twenty-front/src/modules/activities/tasks/__stories__/TaskList.stories.tsx @@ -3,6 +3,7 @@ import { ComponentDecorator } from 'twenty-ui'; import { TaskList } from '@/activities/tasks/components/TaskList'; import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator'; +import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator'; import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator'; import { graphqlMocks } from '~/testing/graphqlMocks'; import { mockedTasks } from '~/testing/mock-data/tasks'; @@ -10,13 +11,21 @@ import { mockedTasks } from '~/testing/mock-data/tasks'; const meta: Meta = { title: 'Modules/Activity/TaskList', component: TaskList, - decorators: [MemoryRouterDecorator, ComponentDecorator, SnackBarDecorator], + decorators: [ + ComponentDecorator, + MemoryRouterDecorator, + ObjectMetadataItemsDecorator, + SnackBarDecorator, + ], args: { title: 'Tasks', tasks: mockedTasks, }, parameters: { msw: graphqlMocks, + container: { + width: '500px', + }, }, }; diff --git a/packages/twenty-front/src/modules/activities/tasks/components/TaskGroups.tsx b/packages/twenty-front/src/modules/activities/tasks/components/TaskGroups.tsx index ae484382ffcc..16ebbec0f38a 100644 --- a/packages/twenty-front/src/modules/activities/tasks/components/TaskGroups.tsx +++ b/packages/twenty-front/src/modules/activities/tasks/components/TaskGroups.tsx @@ -27,6 +27,7 @@ import { TaskList } from './TaskList'; const StyledContainer = styled.div` display: flex; flex-direction: column; + width: 100%; `; type TaskGroupsProps = { diff --git a/packages/twenty-front/src/modules/activities/tasks/components/TaskList.tsx b/packages/twenty-front/src/modules/activities/tasks/components/TaskList.tsx index 04e56c8d65ed..10e7982ca04f 100644 --- a/packages/twenty-front/src/modules/activities/tasks/components/TaskList.tsx +++ b/packages/twenty-front/src/modules/activities/tasks/components/TaskList.tsx @@ -12,6 +12,7 @@ type TaskListProps = { const StyledContainer = styled.div` align-items: flex-start; + width: 100%; align-self: stretch; display: flex; flex-direction: column; diff --git a/packages/twenty-front/src/modules/activities/tasks/hooks/__tests__/useCompleteTask.test.tsx b/packages/twenty-front/src/modules/activities/tasks/hooks/__tests__/useCompleteTask.test.tsx index ba3e2ac53482..814b72fb6ce1 100644 --- a/packages/twenty-front/src/modules/activities/tasks/hooks/__tests__/useCompleteTask.test.tsx +++ b/packages/twenty-front/src/modules/activities/tasks/hooks/__tests__/useCompleteTask.test.tsx @@ -1,11 +1,10 @@ -import { MockedProvider, MockedResponse } from '@apollo/client/testing'; +import { MockedResponse } from '@apollo/client/testing'; import { act, renderHook } from '@testing-library/react'; import gql from 'graphql-tag'; -import { ReactNode } from 'react'; -import { RecoilRoot } from 'recoil'; import { useCompleteTask } from '@/activities/tasks/hooks/useCompleteTask'; import { Task } from '@/activities/types/Task'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; const task: Task = { id: '123', @@ -28,21 +27,123 @@ const mocks: MockedResponse[] = [ mutation UpdateOneTask($idToUpdate: ID!, $input: TaskUpdateInput!) { updateTask(id: $idToUpdate, data: $input) { __typename - updatedAt - createdAt - deletedAt - dueAt - id - status + assignee { + __typename + avatarUrl + colorScheme + createdAt + dateFormat + deletedAt + id + locale + name { + firstName + lastName + } + timeFormat + timeZone + updatedAt + userEmail + userId + } + assigneeId + attachments { + edges { + node { + __typename + activityId + authorId + companyId + createdAt + deletedAt + fullPath + id + name + noteId + opportunityId + personId + rocketId + taskId + type + updatedAt + } + } + } body + createdAt createdBy { source workspaceMemberId name } - assigneeId + deletedAt + dueAt + favorites { + edges { + node { + __typename + companyId + createdAt + deletedAt + id + noteId + opportunityId + personId + position + rocketId + taskId + updatedAt + viewId + workflowId + workspaceMemberId + } + } + } + id position + status + taskTargets { + edges { + node { + __typename + companyId + createdAt + deletedAt + id + opportunityId + personId + rocketId + taskId + updatedAt + } + } + } + timelineActivities { + edges { + node { + __typename + companyId + createdAt + deletedAt + happensAt + id + linkedObjectMetadataId + linkedRecordCachedName + linkedRecordId + name + noteId + opportunityId + personId + properties + rocketId + taskId + updatedAt + workspaceMemberId + } + } + } title + updatedAt } } `, @@ -72,13 +173,9 @@ const mocks: MockedResponse[] = [ }, ]; -const Wrapper = ({ children }: { children: ReactNode }) => ( - - - {children} - - -); +const Wrapper = getJestMetadataAndApolloMocksWrapper({ + apolloMocks: mocks, +}); describe('useCompleteTask', () => { it('should complete task', async () => { diff --git a/packages/twenty-front/src/modules/activities/timelineActivities/hooks/__tests__/useTimelineActivities.test.tsx b/packages/twenty-front/src/modules/activities/timelineActivities/hooks/__tests__/useTimelineActivities.test.tsx index 894d541c888b..2d1989cc68ea 100644 --- a/packages/twenty-front/src/modules/activities/timelineActivities/hooks/__tests__/useTimelineActivities.test.tsx +++ b/packages/twenty-front/src/modules/activities/timelineActivities/hooks/__tests__/useTimelineActivities.test.tsx @@ -1,21 +1,16 @@ import { renderHook } from '@testing-library/react'; import { useTimelineActivities } from '@/activities/timelineActivities/hooks/useTimelineActivities'; -import { ReactNode } from 'react'; -import { getJestHookWrapper } from '~/testing/jest/getJestHookWrapper'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; jest.mock('@/object-record/hooks/useFindManyRecords', () => ({ useFindManyRecords: jest.fn(), })); -const Wrappers = getJestHookWrapper({ +const Wrapper = getJestMetadataAndApolloMocksWrapper({ apolloMocks: [], }); -const Wrapper = ({ children }: { children: ReactNode }) => ( - {children} -); - describe('useTimelineActivities', () => { afterEach(() => { jest.clearAllMocks(); diff --git a/packages/twenty-front/src/modules/activities/timelineActivities/rows/main-object/components/__stories__/EventRowMainObjectUpdated.stories.tsx b/packages/twenty-front/src/modules/activities/timelineActivities/rows/main-object/components/__stories__/EventRowMainObjectUpdated.stories.tsx index 0cb945bdc4b2..224438b853cf 100644 --- a/packages/twenty-front/src/modules/activities/timelineActivities/rows/main-object/components/__stories__/EventRowMainObjectUpdated.stories.tsx +++ b/packages/twenty-front/src/modules/activities/timelineActivities/rows/main-object/components/__stories__/EventRowMainObjectUpdated.stories.tsx @@ -5,7 +5,7 @@ import { EventRowMainObjectUpdated } from '@/activities/timelineActivities/rows/ import { TimelineActivity } from '@/activities/timelineActivities/types/TimelineActivity'; import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator'; import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator'; -import { mockedPersonObjectMetadataItem } from '~/testing/mock-data/metadata'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; const meta: Meta = { title: 'Modules/TimelineActivities/Rows/MainObject/EventRowMainObjectUpdated', @@ -35,7 +35,9 @@ const meta: Meta = { }, }, } as TimelineActivity, - mainObjectMetadataItem: mockedPersonObjectMetadataItem, + mainObjectMetadataItem: generatedMockObjectMetadataItems.find( + (item) => item.namePlural === 'person', + ), }, decorators: [ ComponentDecorator, diff --git a/packages/twenty-front/src/modules/chrome-extension-sidecar/components/ChromeExtensionSidecarProvider.tsx b/packages/twenty-front/src/modules/chrome-extension-sidecar/components/ChromeExtensionSidecarProvider.tsx index 3c4d8556a4bf..9409540ead23 100644 --- a/packages/twenty-front/src/modules/chrome-extension-sidecar/components/ChromeExtensionSidecarProvider.tsx +++ b/packages/twenty-front/src/modules/chrome-extension-sidecar/components/ChromeExtensionSidecarProvider.tsx @@ -1,56 +1,46 @@ -import styled from '@emotion/styled'; -import { useRecoilValue } from 'recoil'; - -import { isLoadingTokensFromExtensionState } from '@/chrome-extension-sidecar/states/isLoadingTokensFromExtensionState'; -import { chromeExtensionIdState } from '@/client-config/states/chromeExtensionIdState'; -import { isDefined } from '~/utils/isDefined'; -import { isInFrame } from '~/utils/isInIframe'; - -const StyledContainer = styled.div` - align-items: center; - display: flex; - flex-direction: column; - height: 100vh; - justify-content: center; -`; - -const AppInaccessible = ({ message }: { message: string }) => { - return ( - - twenty-icon -

{message}

-
- ); -}; +// const StyledContainer = styled.div` +// align-items: center; +// display: flex; +// flex-direction: column; +// height: 100vh; +// justify-content: center; +// `; + +// const AppInaccessible = ({ message }: { message: string }) => { +// return ( +// +// twenty-icon +//

{message}

+//
+// ); +// }; export const ChromeExtensionSidecarProvider: React.FC< React.PropsWithChildren > = ({ children }) => { - const isLoadingTokensFromExtension = useRecoilValue( - isLoadingTokensFromExtensionState, - ); - const chromeExtensionId = useRecoilValue(chromeExtensionIdState); - - if (!isInFrame()) return <>{children}; - - if (!isDefined(chromeExtensionId)) - return ( - - ); - - if (isDefined(isLoadingTokensFromExtension) && !isLoadingTokensFromExtension) - return ( - - ); - - return isLoadingTokensFromExtension && <>{children}; + return <>{children}; + + // TODO: this is conflictting with storybook tests + // if (!isInFrame()) return <>{children}; + + // if (!isDefined(chromeExtensionId)) + // return ( + // + // ); + + // if (isDefined(isLoadingTokensFromExtension) && !isLoadingTokensFromExtension) + // return ( + // + // ); + + // return isLoadingTokensFromExtension && <>{children}; }; diff --git a/packages/twenty-front/src/modules/favorites/hooks/__mocks__/useFavorites.ts b/packages/twenty-front/src/modules/favorites/hooks/__mocks__/useFavorites.ts index 98813ad384c7..cf0fe8e888b1 100644 --- a/packages/twenty-front/src/modules/favorites/hooks/__mocks__/useFavorites.ts +++ b/packages/twenty-front/src/modules/favorites/hooks/__mocks__/useFavorites.ts @@ -87,262 +87,264 @@ export const mocks = [ mutation CreateOneFavorite($input: FavoriteCreateInput!) { createFavorite(data: $input) { __typename - noteId - taskId - person { + company { __typename - name { - firstName - lastName + accountOwnerId + address { + addressStreet1 + addressStreet2 + addressCity + addressState + addressCountry + addressPostcode + addressLat + addressLng + } + annualRecurringRevenue { + amountMicros + currencyCode + } + createdAt + createdBy { + source + workspaceMemberId + name + } + deletedAt + domainName { + primaryLinkUrl + primaryLinkLabel + secondaryLinks + } + employees + id + idealCustomerProfile + introVideo { + primaryLinkUrl + primaryLinkLabel + secondaryLinks } linkedinLink { primaryLinkUrl primaryLinkLabel secondaryLinks } - deletedAt - createdAt + name + position + tagline updatedAt - jobTitle - intro - workPrefereance - performanceRating + visaSponsorship + workPolicy xLink { primaryLinkUrl primaryLinkLabel secondaryLinks } - city - companyId - phones { - primaryPhoneNumber - primaryPhoneCountryCode - additionalPhones + } + companyId + createdAt + deletedAt + id + note { + __typename + body + createdAt + createdBy { + source + workspaceMemberId + name + } + deletedAt + id + position + title + updatedAt + } + noteId + opportunity { + __typename + amount { + amountMicros + currencyCode } + closeDate + companyId + createdAt createdBy { source workspaceMemberId name } + deletedAt id + name + pointOfContactId position + stage + updatedAt + } + opportunityId + person { + __typename + avatarUrl + city + companyId + createdAt + createdBy { + source + workspaceMemberId + name + } + deletedAt emails { primaryEmail additionalEmails } - avatarUrl + id + intro + jobTitle + linkedinLink { + primaryLinkUrl + primaryLinkLabel + secondaryLinks + } + name { + firstName + lastName + } + performanceRating + phones { + primaryPhoneNumber + primaryPhoneCountryCode + additionalPhones + } + position + updatedAt whatsapp { primaryPhoneNumber primaryPhoneCountryCode additionalPhones } + workPreference + xLink { + primaryLinkUrl + primaryLinkLabel + secondaryLinks + } } - task { + personId + position + rocket { __typename - updatedAt createdAt - deletedAt - dueAt - id - status - body createdBy { source workspaceMemberId name } - assigneeId - position - title - } - rocketId - viewId - updatedAt - workflowId - personId - workspaceMemberId - note { - __typename deletedAt id + name position updatedAt + } + rocketId + task { + __typename + assigneeId + body + createdAt createdBy { source workspaceMemberId name } - body + deletedAt + dueAt + id + position + status title - createdAt + updatedAt } - createdAt + taskId + updatedAt view { __typename - id - type + createdAt + deletedAt icon - key + id isCompact kanbanFieldMetadataId + key + name objectMetadataId position - createdAt - deletedAt + type updatedAt - name } - opportunityId - position - deletedAt - id - companyId + viewId workflow { __typename - deletedAt - lastPublishedVersionId createdAt + deletedAt id - statuses + lastPublishedVersionId name position + statuses updatedAt } + workflowId workspaceMember { __typename + avatarUrl + colorScheme + createdAt + dateFormat + deletedAt + id + locale name { firstName lastName } - avatarUrl - userId - createdAt - timeZone - id timeFormat + timeZone updatedAt - locale userEmail - deletedAt - colorScheme - dateFormat + userId } - company { - __typename - updatedAt - domainName { - primaryLinkUrl - primaryLinkLabel - secondaryLinks - } - visaSponsorship - address { - addressStreet1 - addressStreet2 - addressCity - addressState - addressCountry - addressPostcode - addressLat - addressLng - } - position - employees - deletedAt - accountOwnerId - annualRecurringRevenue { - amountMicros - currencyCode - } - id - name - xLink { - primaryLinkUrl - primaryLinkLabel - secondaryLinks - } - createdAt - createdBy { - source - workspaceMemberId - name - } - workPolicy - introVideo { - primaryLinkUrl - primaryLinkLabel - secondaryLinks - } - linkedinLink { - primaryLinkUrl - primaryLinkLabel - secondaryLinks - } - tagline - idealCustomerProfile - } - rocket { - __typename - createdBy { - source - workspaceMemberId - name - } - updatedAt - name - position - createdAt - id - deletedAt - } - opportunity { - __typename - createdBy { - source - workspaceMemberId - name - } - amount { - amountMicros - currencyCode - } - stage - position - closeDate - id - name - pointOfContactId - companyId - updatedAt - deletedAt - createdAt - } - } - } - `, - variables: { - input: { - id: mockId, - personId: favoriteTargetObjectId, - position: 4, - workspaceMemberId: '1', - }, - }, - }, - result: jest.fn(() => ({ - data: { - createFavorite: { - id: favoriteId, - }, - }, - })), - }, - { - request: { - query: gql` - mutation DeleteOneFavorite($idToDelete: ID!) { - deleteFavorite(id: $idToDelete) { - id + workspaceMemberId + } + } + `, + variables: { + input: { + id: mockId, + personId: favoriteTargetObjectId, + position: 4, + workspaceMemberId: '1', + }, + }, + }, + result: jest.fn(() => ({ + data: { + createFavorite: { + id: favoriteId, + }, + }, + })), + }, + { + request: { + query: gql` + mutation DeleteOneFavorite($idToDelete: ID!) { + deleteFavorite(id: $idToDelete) { + __typename + deletedAt + id } } `, @@ -365,236 +367,236 @@ export const mocks = [ ) { updateFavorite(id: $idToUpdate, data: $input) { __typename - noteId - taskId - person { - __typename - name { - firstName - lastName - } - linkedinLink { - primaryLinkUrl - primaryLinkLabel - secondaryLinks - } - deletedAt - createdAt - updatedAt - jobTitle - intro - workPrefereance - performanceRating - xLink { - primaryLinkUrl - primaryLinkLabel - secondaryLinks - } - city - companyId - phones { - primaryPhoneNumber - primaryPhoneCountryCode - additionalPhones - } - createdBy { - source - workspaceMemberId - name - } - id - position - emails { - primaryEmail - additionalEmails - } - avatarUrl - whatsapp { - primaryPhoneNumber - primaryPhoneCountryCode - additionalPhones - } - } - task { - __typename - updatedAt - createdAt - deletedAt - dueAt - id - status - body - createdBy { - source - workspaceMemberId - name - } - assigneeId - position - title - } - rocketId - viewId - updatedAt - workflowId - personId - workspaceMemberId - note { - __typename - deletedAt - id - position - updatedAt - createdBy { - source - workspaceMemberId - name - } - body - title - createdAt - } - createdAt - view { - __typename - id - type - icon - key - isCompact - kanbanFieldMetadataId - objectMetadataId - position - createdAt - deletedAt - updatedAt - name - } - opportunityId - position - deletedAt - id - companyId - workflow { - __typename - deletedAt - lastPublishedVersionId - createdAt - id - statuses - name - position - updatedAt - } - workspaceMember { - __typename - name { - firstName - lastName - } - avatarUrl - userId - createdAt - timeZone - id - timeFormat - updatedAt - locale - userEmail - deletedAt - colorScheme - dateFormat - } - company { - __typename - updatedAt - domainName { - primaryLinkUrl - primaryLinkLabel - secondaryLinks - } - visaSponsorship - address { - addressStreet1 - addressStreet2 - addressCity - addressState - addressCountry - addressPostcode - addressLat - addressLng - } - position - employees - deletedAt - accountOwnerId - annualRecurringRevenue { - amountMicros - currencyCode - } - id - name - xLink { - primaryLinkUrl - primaryLinkLabel - secondaryLinks - } - createdAt - createdBy { - source - workspaceMemberId - name - } - workPolicy - introVideo { - primaryLinkUrl - primaryLinkLabel - secondaryLinks - } - linkedinLink { - primaryLinkUrl - primaryLinkLabel - secondaryLinks - } - tagline - idealCustomerProfile - } - rocket { - __typename - createdBy { - source - workspaceMemberId - name - } - updatedAt - name - position - createdAt - id - deletedAt - } - opportunity { - __typename - createdBy { - source + company { + __typename + accountOwnerId + address { + addressStreet1 + addressStreet2 + addressCity + addressState + addressCountry + addressPostcode + addressLat + addressLng + } + annualRecurringRevenue { + amountMicros + currencyCode + } + createdAt + createdBy { + source + workspaceMemberId + name + } + deletedAt + domainName { + primaryLinkUrl + primaryLinkLabel + secondaryLinks + } + employees + id + idealCustomerProfile + introVideo { + primaryLinkUrl + primaryLinkLabel + secondaryLinks + } + linkedinLink { + primaryLinkUrl + primaryLinkLabel + secondaryLinks + } + name + position + tagline + updatedAt + visaSponsorship + workPolicy + xLink { + primaryLinkUrl + primaryLinkLabel + secondaryLinks + } + } + companyId + createdAt + deletedAt + id + note { + __typename + body + createdAt + createdBy { + source + workspaceMemberId + name + } + deletedAt + id + position + title + updatedAt + } + noteId + opportunity { + __typename + amount { + amountMicros + currencyCode + } + closeDate + companyId + createdAt + createdBy { + source + workspaceMemberId + name + } + deletedAt + id + name + pointOfContactId + position + stage + updatedAt + } + opportunityId + person { + __typename + avatarUrl + city + companyId + createdAt + createdBy { + source + workspaceMemberId + name + } + deletedAt + emails { + primaryEmail + additionalEmails + } + id + intro + jobTitle + linkedinLink { + primaryLinkUrl + primaryLinkLabel + secondaryLinks + } + name { + firstName + lastName + } + performanceRating + phones { + primaryPhoneNumber + primaryPhoneCountryCode + additionalPhones + } + position + updatedAt + whatsapp { + primaryPhoneNumber + primaryPhoneCountryCode + additionalPhones + } + workPreference + xLink { + primaryLinkUrl + primaryLinkLabel + secondaryLinks + } + } + personId + position + rocket { + __typename + createdAt + createdBy { + source + workspaceMemberId + name + } + deletedAt + id + name + position + updatedAt + } + rocketId + task { + __typename + assigneeId + body + createdAt + createdBy { + source + workspaceMemberId + name + } + deletedAt + dueAt + id + position + status + title + updatedAt + } + taskId + updatedAt + view { + __typename + createdAt + deletedAt + icon + id + isCompact + kanbanFieldMetadataId + key + name + objectMetadataId + position + type + updatedAt + } + viewId + workflow { + __typename + createdAt + deletedAt + id + lastPublishedVersionId + name + position + statuses + updatedAt + } + workflowId + workspaceMember { + __typename + avatarUrl + colorScheme + createdAt + dateFormat + deletedAt + id + locale + name { + firstName + lastName + } + timeFormat + timeZone + updatedAt + userEmail + userId + } workspaceMemberId - name - } - amount { - amountMicros - currencyCode - } - stage - position - closeDate - id - name - pointOfContactId - companyId - updatedAt - deletedAt - createdAt - } } } `, diff --git a/packages/twenty-front/src/modules/favorites/hooks/__tests__/useFavorites.test.tsx b/packages/twenty-front/src/modules/favorites/hooks/__tests__/useFavorites.test.tsx index 3a30077ea285..9c984ececa94 100644 --- a/packages/twenty-front/src/modules/favorites/hooks/__tests__/useFavorites.test.tsx +++ b/packages/twenty-front/src/modules/favorites/hooks/__tests__/useFavorites.test.tsx @@ -1,16 +1,14 @@ -import { MockedProvider } from '@apollo/client/testing'; import { DropResult, ResponderProvided } from '@hello-pangea/dnd'; import { act, renderHook, waitFor } from '@testing-library/react'; -import { ReactNode } from 'react'; -import { RecoilRoot, useSetRecoilState } from 'recoil'; +import { useSetRecoilState } from 'recoil'; import { currentWorkspaceMemberState } from '@/auth/states/currentWorkspaceMemberState'; import { useFavorites } from '@/favorites/hooks/useFavorites'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; -import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope'; -import { generatedMockObjectMetadataItems } from '~/testing/mock-data/objectMetadataItems'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; import { favoriteId, favoriteTargetObjectRecord, @@ -29,15 +27,9 @@ jest.mock('@/object-record/hooks/useFindManyRecords', () => ({ useFindManyRecords: () => ({ records: initialFavorites }), })); -const Wrapper = ({ children }: { children: ReactNode }) => ( - - - - {children} - - - -); +const Wrapper = getJestMetadataAndApolloMocksWrapper({ + apolloMocks: mocks, +}); describe('useFavorites', () => { it('should fetch favorites successfully', async () => { diff --git a/packages/twenty-front/src/modules/navigation/hooks/__tests__/useDefaultHomePagePath.test.ts b/packages/twenty-front/src/modules/navigation/hooks/__tests__/useDefaultHomePagePath.test.ts index 1ec02c2fd071..a7fb3b4e51ed 100644 --- a/packages/twenty-front/src/modules/navigation/hooks/__tests__/useDefaultHomePagePath.test.ts +++ b/packages/twenty-front/src/modules/navigation/hooks/__tests__/useDefaultHomePagePath.test.ts @@ -6,7 +6,7 @@ import { useDefaultHomePagePath } from '@/navigation/hooks/useDefaultHomePagePat import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; import { usePrefetchedData } from '@/prefetch/hooks/usePrefetchedData'; import { AppPath } from '@/types/AppPath'; -import { generatedMockObjectMetadataItems } from '~/testing/mock-data/objectMetadataItems'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; import { mockedUserData } from '~/testing/mock-data/users'; jest.mock('@/prefetch/hooks/usePrefetchedData'); diff --git a/packages/twenty-front/src/modules/object-metadata/components/ObjectMetadataItemsLoadEffect.tsx b/packages/twenty-front/src/modules/object-metadata/components/ObjectMetadataItemsLoadEffect.tsx index dd1971790bb1..c8659e1689c8 100644 --- a/packages/twenty-front/src/modules/object-metadata/components/ObjectMetadataItemsLoadEffect.tsx +++ b/packages/twenty-front/src/modules/object-metadata/components/ObjectMetadataItemsLoadEffect.tsx @@ -9,7 +9,7 @@ import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadat import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { FieldMetadataType } from '~/generated-metadata/graphql'; import { WorkspaceActivationStatus } from '~/generated/graphql'; -import { generatedMockObjectMetadataItems } from '~/testing/mock-data/objectMetadataItems'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; import { isDeeplyEqual } from '~/utils/isDeeplyEqual'; import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/__mocks__/ApolloMetadataClientProvider.tsx b/packages/twenty-front/src/modules/object-metadata/hooks/__mocks__/ApolloMetadataClientMockedProvider.tsx similarity index 100% rename from packages/twenty-front/src/modules/object-metadata/hooks/__mocks__/ApolloMetadataClientProvider.tsx rename to packages/twenty-front/src/modules/object-metadata/hooks/__mocks__/ApolloMetadataClientMockedProvider.tsx diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/__mocks__/useFieldMetadataItem.ts b/packages/twenty-front/src/modules/object-metadata/hooks/__mocks__/useFieldMetadataItem.ts index de52cbd8fe73..0e7470a10359 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/__mocks__/useFieldMetadataItem.ts +++ b/packages/twenty-front/src/modules/object-metadata/hooks/__mocks__/useFieldMetadataItem.ts @@ -48,10 +48,20 @@ export const queries = { createMetadataField: gql` mutation CreateOneFieldMetadataItem($input: CreateOneFieldMetadataInput!) { createOneField(input: $input) { - ${baseFields} + id + type + name + label + description + icon + isCustom + isActive + isNullable + createdAt + updatedAt + settings defaultValue options - settings } } `, diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useColumnDefinitionsFromFieldMetadata.test.ts b/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useColumnDefinitionsFromFieldMetadata.test.ts index 558d2ff3034c..05c87497dcc6 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useColumnDefinitionsFromFieldMetadata.test.ts +++ b/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useColumnDefinitionsFromFieldMetadata.test.ts @@ -3,7 +3,7 @@ import { Nullable } from 'twenty-ui'; import { useColumnDefinitionsFromFieldMetadata } from '@/object-metadata/hooks/useColumnDefinitionsFromFieldMetadata'; import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; -import { generatedMockObjectMetadataItems } from '~/testing/mock-data/objectMetadataItems'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; describe('useColumnDefinitionsFromFieldMetadata', () => { it('should return empty definitions if no object is passed', () => { diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useCreateOneObjectMetadataItem.test.tsx b/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useCreateOneObjectMetadataItem.test.tsx index 03443712d9de..cc92f241e31c 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useCreateOneObjectMetadataItem.test.tsx +++ b/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useCreateOneObjectMetadataItem.test.tsx @@ -1,10 +1,8 @@ -import { ReactNode } from 'react'; -import { MockedProvider } from '@apollo/client/testing'; import { act, renderHook } from '@testing-library/react'; -import { RecoilRoot } from 'recoil'; import { useCreateOneObjectMetadataItem } from '@/object-metadata/hooks/useCreateOneObjectMetadataItem'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; import { findManyViewsQuery, query, @@ -47,13 +45,9 @@ const mocks = [ }, ]; -const Wrapper = ({ children }: { children: ReactNode }) => ( - - - {children} - - -); +const Wrapper = getJestMetadataAndApolloMocksWrapper({ + apolloMocks: mocks, +}); describe('useCreateOneObjectMetadataItem', () => { it('should work as expected', async () => { diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useFieldMetadataItem.test.tsx b/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useFieldMetadataItem.test.tsx index 47b1a6c18c88..6795897e3cfd 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useFieldMetadataItem.test.tsx +++ b/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useFieldMetadataItem.test.tsx @@ -1,6 +1,6 @@ -import { ReactNode } from 'react'; import { MockedProvider } from '@apollo/client/testing'; -import { act, renderHook } from '@testing-library/react'; +import { renderHook } from '@testing-library/react'; +import { act, ReactNode } from 'react'; import { RecoilRoot } from 'recoil'; import { useFieldMetadataItem } from '@/object-metadata/hooks/useFieldMetadataItem'; diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useFilteredObjectMetadataItems.test.tsx b/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useFilteredObjectMetadataItems.test.tsx index 4d16bb6d8af9..02e39712fe57 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useFilteredObjectMetadataItems.test.tsx +++ b/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useFilteredObjectMetadataItems.test.tsx @@ -10,7 +10,7 @@ import { } from '@/object-metadata/hooks/__mocks__/useFilteredObjectMetadataItems'; import { useFilteredObjectMetadataItems } from '@/object-metadata/hooks/useFilteredObjectMetadataItems'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; -import { generatedMockObjectMetadataItems } from '~/testing/mock-data/objectMetadataItems'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; const mocks = [ { diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useGetObjectOrderByField.test.tsx b/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useGetObjectOrderByField.test.tsx index 21ec56ad60b4..41220e695b94 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useGetObjectOrderByField.test.tsx +++ b/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useGetObjectOrderByField.test.tsx @@ -1,15 +1,11 @@ -import { ReactNode } from 'react'; -import { MockedProvider } from '@apollo/client/testing'; import { renderHook } from '@testing-library/react'; -import { RecoilRoot } from 'recoil'; import { useGetObjectOrderByField } from '@/object-metadata/hooks/useGetObjectOrderByField'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; -const Wrapper = ({ children }: { children: ReactNode }) => ( - - {children} - -); +const Wrapper = getJestMetadataAndApolloMocksWrapper({ + apolloMocks: [], +}); describe('useGetObjectOrderByField', () => { it('should work as expected', () => { diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useGetObjectRecordIdentifierByNameSingular.test.tsx b/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useGetObjectRecordIdentifierByNameSingular.test.tsx index a457bd27eff7..938796b78714 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useGetObjectRecordIdentifierByNameSingular.test.tsx +++ b/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useGetObjectRecordIdentifierByNameSingular.test.tsx @@ -3,7 +3,7 @@ import { RecoilRoot, useSetRecoilState } from 'recoil'; import { useGetObjectRecordIdentifierByNameSingular } from '@/object-metadata/hooks/useGetObjectRecordIdentifierByNameSingular'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; -import { generatedMockObjectMetadataItems } from '~/testing/mock-data/objectMetadataItems'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; describe('useGetObjectRecordIdentifierByNameSingular', () => { it('should work as expected', async () => { diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useGetRelationMetadata.test.tsx b/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useGetRelationMetadata.test.tsx index 12ef572b6adf..7455088f27bc 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useGetRelationMetadata.test.tsx +++ b/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useGetRelationMetadata.test.tsx @@ -5,7 +5,7 @@ import { RecoilRoot, useSetRecoilState } from 'recoil'; import { useGetRelationMetadata } from '@/object-metadata/hooks/useGetRelationMetadata'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; -import { generatedMockObjectMetadataItems } from '~/testing/mock-data/objectMetadataItems'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; const Wrapper = ({ children }: { children: ReactNode }) => ( diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useMapToObjectRecordIdentifier.test.tsx b/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useMapToObjectRecordIdentifier.test.tsx index d0157678c04a..8792fb31299a 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useMapToObjectRecordIdentifier.test.tsx +++ b/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useMapToObjectRecordIdentifier.test.tsx @@ -1,7 +1,11 @@ import { renderHook } from '@testing-library/react'; -import { RecoilRoot } from 'recoil'; import { useMapToObjectRecordIdentifier } from '@/object-metadata/hooks/useMapToObjectRecordIdentifier'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; + +const Wrapper = getJestMetadataAndApolloMocksWrapper({ + apolloMocks: [], +}); describe('useMapToObjectRecordIdentifier', () => { it('should work as expected', async () => { @@ -18,7 +22,7 @@ describe('useMapToObjectRecordIdentifier', () => { }); }, { - wrapper: RecoilRoot, + wrapper: Wrapper, }, ); diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useObjectMetadataItem.test.tsx b/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useObjectMetadataItem.test.tsx index ee757d7ff7b2..876846f2bd4b 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useObjectMetadataItem.test.tsx +++ b/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useObjectMetadataItem.test.tsx @@ -1,16 +1,12 @@ -import { MockedProvider } from '@apollo/client/testing'; import { renderHook } from '@testing-library/react'; -import { ReactNode } from 'react'; -import { RecoilRoot } from 'recoil'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; -import { generatedMockObjectMetadataItems } from '~/testing/mock-data/objectMetadataItems'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; -const Wrapper = ({ children }: { children: ReactNode }) => ( - - {children} - -); +const Wrapper = getJestMetadataAndApolloMocksWrapper({ + apolloMocks: [], +}); // Split into tests for each new hook describe('useObjectMetadataItem', () => { diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/useObjectNamePluralFromSingular.ts b/packages/twenty-front/src/modules/object-metadata/hooks/useObjectNamePluralFromSingular.ts index 25208307eabd..88ac0baab21d 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/useObjectNamePluralFromSingular.ts +++ b/packages/twenty-front/src/modules/object-metadata/hooks/useObjectNamePluralFromSingular.ts @@ -3,7 +3,7 @@ import { useRecoilValue } from 'recoil'; import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState'; import { objectMetadataItemFamilySelector } from '@/object-metadata/states/objectMetadataItemFamilySelector'; import { WorkspaceActivationStatus } from '~/generated/graphql'; -import { generatedMockObjectMetadataItems } from '~/testing/mock-data/objectMetadataItems'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; import { isDefined } from '~/utils/isDefined'; export const useObjectNamePluralFromSingular = ({ diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/useObjectNameSingularFromPlural.ts b/packages/twenty-front/src/modules/object-metadata/hooks/useObjectNameSingularFromPlural.ts index 5a94a5191b9f..2e5127d8fcd9 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/useObjectNameSingularFromPlural.ts +++ b/packages/twenty-front/src/modules/object-metadata/hooks/useObjectNameSingularFromPlural.ts @@ -3,7 +3,7 @@ import { useRecoilValue } from 'recoil'; import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState'; import { objectMetadataItemFamilySelector } from '@/object-metadata/states/objectMetadataItemFamilySelector'; import { WorkspaceActivationStatus } from '~/generated/graphql'; -import { generatedMockObjectMetadataItems } from '~/testing/mock-data/objectMetadataItems'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; import { isDefined } from '~/utils/isDefined'; export const useObjectNameSingularFromPlural = ({ diff --git a/packages/twenty-front/src/modules/object-metadata/utils/__tests__/getObjectMetadataItemBySingularName.test.ts b/packages/twenty-front/src/modules/object-metadata/utils/__tests__/getObjectMetadataItemBySingularName.test.ts index ea2f1d5eee19..92a7e414b822 100644 --- a/packages/twenty-front/src/modules/object-metadata/utils/__tests__/getObjectMetadataItemBySingularName.test.ts +++ b/packages/twenty-front/src/modules/object-metadata/utils/__tests__/getObjectMetadataItemBySingularName.test.ts @@ -1,5 +1,5 @@ import { getObjectMetadataItemByNameSingular } from '@/object-metadata/utils/getObjectMetadataItemBySingularName'; -import { generatedMockObjectMetadataItems } from '~/testing/mock-data/objectMetadataItems'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; describe('getObjectMetadataItemBySingularName', () => { it('should work as expected', () => { diff --git a/packages/twenty-front/src/modules/object-metadata/utils/__tests__/getObjectOrderByField.test.ts b/packages/twenty-front/src/modules/object-metadata/utils/__tests__/getObjectOrderByField.test.ts index 78c0e7047a4a..cc5691412fd3 100644 --- a/packages/twenty-front/src/modules/object-metadata/utils/__tests__/getObjectOrderByField.test.ts +++ b/packages/twenty-front/src/modules/object-metadata/utils/__tests__/getObjectOrderByField.test.ts @@ -1,5 +1,5 @@ import { getOrderByFieldForObjectMetadataItem } from '@/object-metadata/utils/getObjectOrderByField'; -import { generatedMockObjectMetadataItems } from '~/testing/mock-data/objectMetadataItems'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; describe('getObjectOrderByField', () => { it('should work as expected', () => { diff --git a/packages/twenty-front/src/modules/object-metadata/utils/__tests__/getObjectSlug.test.ts b/packages/twenty-front/src/modules/object-metadata/utils/__tests__/getObjectSlug.test.ts index c43c9d039e7c..526c6fe47635 100644 --- a/packages/twenty-front/src/modules/object-metadata/utils/__tests__/getObjectSlug.test.ts +++ b/packages/twenty-front/src/modules/object-metadata/utils/__tests__/getObjectSlug.test.ts @@ -1,5 +1,5 @@ import { getObjectSlug } from '@/object-metadata/utils/getObjectSlug'; -import { generatedMockObjectMetadataItems } from '~/testing/mock-data/objectMetadataItems'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; describe('getObjectSlug', () => { it('should work as expected', () => { diff --git a/packages/twenty-front/src/modules/object-metadata/utils/__tests__/isObjectMetadataAvailableForRelation.test.ts b/packages/twenty-front/src/modules/object-metadata/utils/__tests__/isObjectMetadataAvailableForRelation.test.ts index caefb7feed45..ece3ae39de06 100644 --- a/packages/twenty-front/src/modules/object-metadata/utils/__tests__/isObjectMetadataAvailableForRelation.test.ts +++ b/packages/twenty-front/src/modules/object-metadata/utils/__tests__/isObjectMetadataAvailableForRelation.test.ts @@ -1,5 +1,5 @@ import { isObjectMetadataAvailableForRelation } from '@/object-metadata/utils/isObjectMetadataAvailableForRelation'; -import { generatedMockObjectMetadataItems } from '~/testing/mock-data/objectMetadataItems'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; describe('isObjectMetadataAvailableForRelation', () => { it('should work as expected', () => { diff --git a/packages/twenty-front/src/modules/object-metadata/utils/__tests__/mapFieldMetadataToGraphQLQuery.test.tsx b/packages/twenty-front/src/modules/object-metadata/utils/__tests__/mapFieldMetadataToGraphQLQuery.test.tsx index 755ce29ac677..7208246e7e49 100644 --- a/packages/twenty-front/src/modules/object-metadata/utils/__tests__/mapFieldMetadataToGraphQLQuery.test.tsx +++ b/packages/twenty-front/src/modules/object-metadata/utils/__tests__/mapFieldMetadataToGraphQLQuery.test.tsx @@ -1,5 +1,5 @@ import { mapFieldMetadataToGraphQLQuery } from '@/object-metadata/utils/mapFieldMetadataToGraphQLQuery'; -import { generatedMockObjectMetadataItems } from '~/testing/mock-data/objectMetadataItems'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; import { normalizeGQLField } from '~/utils/normalizeGQLField'; const personObjectMetadataItem = generatedMockObjectMetadataItems.find( diff --git a/packages/twenty-front/src/modules/object-metadata/utils/__tests__/mapObjectMetadataToGraphQLQuery.test.tsx b/packages/twenty-front/src/modules/object-metadata/utils/__tests__/mapObjectMetadataToGraphQLQuery.test.tsx index c47eae446715..d2650b69807f 100644 --- a/packages/twenty-front/src/modules/object-metadata/utils/__tests__/mapObjectMetadataToGraphQLQuery.test.tsx +++ b/packages/twenty-front/src/modules/object-metadata/utils/__tests__/mapObjectMetadataToGraphQLQuery.test.tsx @@ -1,5 +1,5 @@ import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery'; -import { generatedMockObjectMetadataItems } from '~/testing/mock-data/objectMetadataItems'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; import { normalizeGQLQuery } from '~/utils/normalizeGQLQuery'; const personObjectMetadataItem = generatedMockObjectMetadataItems.find( diff --git a/packages/twenty-front/src/modules/object-metadata/utils/mapObjectMetadataToGraphQLQuery.ts b/packages/twenty-front/src/modules/object-metadata/utils/mapObjectMetadataToGraphQLQuery.ts index f9e248815d99..9e705d428ced 100644 --- a/packages/twenty-front/src/modules/object-metadata/utils/mapObjectMetadataToGraphQLQuery.ts +++ b/packages/twenty-front/src/modules/object-metadata/utils/mapObjectMetadataToGraphQLQuery.ts @@ -18,6 +18,7 @@ export const mapObjectMetadataToGraphQLQuery = ({ const fieldsThatShouldBeQueried = objectMetadataItem?.fields .filter((field) => field.isActive) + .sort((fieldA, fieldB) => fieldA.name.localeCompare(fieldB.name)) .filter((field) => shouldFieldBeQueried({ field, diff --git a/packages/twenty-front/src/modules/object-metadata/validation-schemas/__tests__/objectMetadataItemSchema.test.ts b/packages/twenty-front/src/modules/object-metadata/validation-schemas/__tests__/objectMetadataItemSchema.test.ts index 0e8d60c66fb9..cbb1b2c46b3d 100644 --- a/packages/twenty-front/src/modules/object-metadata/validation-schemas/__tests__/objectMetadataItemSchema.test.ts +++ b/packages/twenty-front/src/modules/object-metadata/validation-schemas/__tests__/objectMetadataItemSchema.test.ts @@ -1,11 +1,12 @@ -import { mockedCompanyObjectMetadataItem } from '~/testing/mock-data/metadata'; - +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; import { objectMetadataItemSchema } from '../objectMetadataItemSchema'; describe('objectMetadataItemSchema', () => { it('validates a valid object metadata item', () => { // Given - const validObjectMetadataItem = mockedCompanyObjectMetadataItem; + const validObjectMetadataItem = generatedMockObjectMetadataItems.find( + (item) => item.nameSingular === 'company', + ); // When const result = objectMetadataItemSchema.parse(validObjectMetadataItem); diff --git a/packages/twenty-front/src/modules/object-record/cache/utils/__tests__/getRecordNodeFromRecord.test.ts b/packages/twenty-front/src/modules/object-record/cache/utils/__tests__/getRecordNodeFromRecord.test.ts index 219d05f854e5..4641974a0632 100644 --- a/packages/twenty-front/src/modules/object-record/cache/utils/__tests__/getRecordNodeFromRecord.test.ts +++ b/packages/twenty-front/src/modules/object-record/cache/utils/__tests__/getRecordNodeFromRecord.test.ts @@ -1,10 +1,8 @@ import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; -import { - mockedObjectMetadataItems, - mockedPersonObjectMetadataItem, -} from '~/testing/mock-data/metadata'; + import { getPeopleMock } from '~/testing/mock-data/people'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; import { getRecordNodeFromRecord } from '../getRecordNodeFromRecord'; const peopleMock = getPeopleMock(); @@ -12,11 +10,18 @@ const peopleMock = getPeopleMock(); describe('getRecordNodeFromRecord', () => { it('computes relation records cache references by default', () => { // Given - const objectMetadataItems: ObjectMetadataItem[] = mockedObjectMetadataItems; - const objectMetadataItem: Pick< - ObjectMetadataItem, - 'fields' | 'namePlural' | 'nameSingular' - > = mockedPersonObjectMetadataItem; + const objectMetadataItems: ObjectMetadataItem[] = + generatedMockObjectMetadataItems; + const objectMetadataItem: + | Pick + | undefined = generatedMockObjectMetadataItems.find( + (item) => item.nameSingular === 'person', + ); + + if (!objectMetadataItem) { + throw new Error('Object metadata item not found'); + } + const recordGqlFields = { name: true, company: true, @@ -47,11 +52,18 @@ describe('getRecordNodeFromRecord', () => { it('does not compute relation records cache references when `computeReferences` is false', () => { // Given - const objectMetadataItems: ObjectMetadataItem[] = mockedObjectMetadataItems; - const objectMetadataItem: Pick< - ObjectMetadataItem, - 'fields' | 'namePlural' | 'nameSingular' - > = mockedPersonObjectMetadataItem; + const objectMetadataItems: ObjectMetadataItem[] = + generatedMockObjectMetadataItems; + const objectMetadataItem: + | Pick + | undefined = generatedMockObjectMetadataItems.find( + (item) => item.nameSingular === 'person', + ); + + if (!objectMetadataItem) { + throw new Error('Object metadata item not found'); + } + const recordGqlFields = { name: true, company: true, diff --git a/packages/twenty-front/src/modules/object-record/cache/utils/getRecordNodeFromRecord.ts b/packages/twenty-front/src/modules/object-record/cache/utils/getRecordNodeFromRecord.ts index d7faf5a77f29..2ab3b25344fa 100644 --- a/packages/twenty-front/src/modules/object-record/cache/utils/getRecordNodeFromRecord.ts +++ b/packages/twenty-front/src/modules/object-record/cache/utils/getRecordNodeFromRecord.ts @@ -65,7 +65,9 @@ export const getRecordNodeFromRecord = ({ RelationDefinitionType.OneToMany ) { const oneToManyObjectMetadataItem = objectMetadataItems.find( - (item) => item.namePlural === fieldName, + (item) => + item.namePlural === + field.relationDefinition?.targetObjectMetadata.namePlural, ); if (!oneToManyObjectMetadataItem) { diff --git a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/personFragment.ts b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/personFragment.ts deleted file mode 100644 index 8a2b3f08567d..000000000000 --- a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/personFragment.ts +++ /dev/null @@ -1,48 +0,0 @@ -export const PERSON_FRAGMENT = ` - __typename - name { - firstName - lastName - } - linkedinLink { - primaryLinkUrl - primaryLinkLabel - secondaryLinks - } - deletedAt - createdAt - updatedAt - jobTitle - intro - workPrefereance - performanceRating - xLink { - primaryLinkUrl - primaryLinkLabel - secondaryLinks - } - city - companyId - phones { - primaryPhoneNumber - primaryPhoneCountryCode - additionalPhones - } - createdBy { - source - workspaceMemberId - name - } - id - position - emails { - primaryEmail - additionalEmails - } - avatarUrl - whatsapp { - primaryPhoneNumber - primaryPhoneCountryCode - additionalPhones - } -` diff --git a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/personFragments.ts b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/personFragments.ts new file mode 100644 index 000000000000..21cf8b2848b2 --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/personFragments.ts @@ -0,0 +1,327 @@ +export const PERSON_FRAGMENT_WITH_DEPTH_ZERO_RELATIONS = ` + __typename + avatarUrl + city + companyId + createdAt + createdBy { + source + workspaceMemberId + name + } + deletedAt + emails { + primaryEmail + additionalEmails + } + id + intro + jobTitle + linkedinLink{ + primaryLinkUrl + primaryLinkLabel + secondaryLinks + } + name { + firstName + lastName + } + performanceRating + phones { + primaryPhoneNumber + primaryPhoneCountryCode + additionalPhones + } + position + updatedAt + whatsapp { + primaryPhoneNumber + primaryPhoneCountryCode + additionalPhones + } + workPreference + xLink { + primaryLinkUrl + primaryLinkLabel + secondaryLinks + } +` + +export const PERSON_FRAGMENT_WITH_DEPTH_ONE_RELATIONS = ` + __typename + activityTargets { + edges { + node { + __typename + activityId + companyId + createdAt + deletedAt + id + opportunityId + personId + rocketId + updatedAt + } + } + } + attachments { + edges { + node { + __typename + activityId + authorId + companyId + createdAt + deletedAt + fullPath + id + name + noteId + opportunityId + personId + rocketId + taskId + type + updatedAt + } + } + } + avatarUrl + calendarEventParticipants { + edges { + node { + __typename + calendarEventId + createdAt + deletedAt + displayName + handle + id + isOrganizer + personId + responseStatus + updatedAt + workspaceMemberId + } + } + } + city + company { + __typename + accountOwnerId + address { + addressStreet1 + addressStreet2 + addressCity + addressState + addressCountry + addressPostcode + addressLat + addressLng + } + annualRecurringRevenue { + amountMicros + currencyCode + } + createdAt + createdBy { + source + workspaceMemberId + name + } + deletedAt + domainName { + primaryLinkUrl + primaryLinkLabel + secondaryLinks + } + employees + id + idealCustomerProfile + introVideo { + primaryLinkUrl + primaryLinkLabel + secondaryLinks + } + linkedinLink { + primaryLinkUrl + primaryLinkLabel + secondaryLinks + } + name + position + tagline + updatedAt + visaSponsorship + workPolicy + xLink { + primaryLinkUrl + primaryLinkLabel + secondaryLinks + } + } + companyId + createdAt + createdBy { + source + workspaceMemberId + name + } + deletedAt + emails { + primaryEmail + additionalEmails + } + favorites { + edges { + node { + __typename + companyId + createdAt + deletedAt + id + noteId + opportunityId + personId + position + rocketId + taskId + updatedAt + viewId + workflowId + workspaceMemberId + } + } + } + id + intro + jobTitle + linkedinLink { + primaryLinkUrl + primaryLinkLabel + secondaryLinks + } + messageParticipants { + edges { + node { + __typename + createdAt + deletedAt + displayName + handle + id + messageId + personId + role + updatedAt + workspaceMemberId + } + } + } + name { + firstName + lastName + } + noteTargets { + edges { + node { + __typename + companyId + createdAt + deletedAt + id + noteId + opportunityId + personId + rocketId + updatedAt + } + } + } + performanceRating + phones { + primaryPhoneNumber + primaryPhoneCountryCode + additionalPhones + } + pointOfContactForOpportunities { + edges { + node { + __typename + amount { + amountMicros + currencyCode + } + closeDate + companyId + createdAt + createdBy { + source + workspaceMemberId + name + } + deletedAt + id + name + pointOfContactId + position + stage + updatedAt + } + } + } + position + taskTargets { + edges { + node { + __typename + companyId + createdAt + deletedAt + id + opportunityId + personId + rocketId + taskId + updatedAt + } + } + } + timelineActivities { + edges { + node { + __typename + companyId + createdAt + deletedAt + happensAt + id + linkedObjectMetadataId + linkedRecordCachedName + linkedRecordId + name + noteId + opportunityId + personId + properties + rocketId + taskId + updatedAt + workspaceMemberId + } + } + } + updatedAt + whatsapp { + primaryPhoneNumber + primaryPhoneCountryCode + additionalPhones + } + workPreference + xLink { + primaryLinkUrl + primaryLinkLabel + secondaryLinks + } +` diff --git a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useCreateManyRecords.ts b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useCreateManyRecords.ts index fd28307168b5..b9d5b32b8b36 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useCreateManyRecords.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useCreateManyRecords.ts @@ -1,12 +1,12 @@ import { gql } from '@apollo/client'; -import { PERSON_FRAGMENT } from '@/object-record/hooks/__mocks__/personFragment'; +import { PERSON_FRAGMENT_WITH_DEPTH_ONE_RELATIONS } from '@/object-record/hooks/__mocks__/personFragments'; import { Person } from '@/people/types/Person'; export const query = gql` mutation CreatePeople($data: [PersonCreateInput!]!, $upsert: Boolean) { createPeople(data: $data, upsert: $upsert) { - ${PERSON_FRAGMENT} + ${PERSON_FRAGMENT_WITH_DEPTH_ONE_RELATIONS} } } `; diff --git a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useCreateOneRecord.ts b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useCreateOneRecord.ts index 6804a92c3525..6a0261794f3c 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useCreateOneRecord.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useCreateOneRecord.ts @@ -1,10 +1,10 @@ -import { PERSON_FRAGMENT } from '@/object-record/hooks/__mocks__/personFragment'; +import { PERSON_FRAGMENT_WITH_DEPTH_ONE_RELATIONS } from '@/object-record/hooks/__mocks__/personFragments'; import { gql } from '@apollo/client'; export const query = gql` mutation CreateOnePerson($input: PersonCreateInput!) { createPerson(data: $input) { - ${PERSON_FRAGMENT} + ${PERSON_FRAGMENT_WITH_DEPTH_ONE_RELATIONS} } } `; diff --git a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useDeleteOneRecord.ts b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useDeleteOneRecord.ts index f31b210e089b..2e7ce9bc5320 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useDeleteOneRecord.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useDeleteOneRecord.ts @@ -3,6 +3,8 @@ import { gql } from '@apollo/client'; export const query = gql` mutation DeleteOnePerson($idToDelete: ID!) { deletePerson(id: $idToDelete) { + __typename + deletedAt id } } diff --git a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useFindDuplicateRecords.ts b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useFindDuplicateRecords.ts index 2e50e02aac84..784e178fc785 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useFindDuplicateRecords.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useFindDuplicateRecords.ts @@ -1,4 +1,4 @@ -import { PERSON_FRAGMENT } from '@/object-record/hooks/__mocks__/personFragment'; +import { PERSON_FRAGMENT_WITH_DEPTH_ZERO_RELATIONS } from '@/object-record/hooks/__mocks__/personFragments'; import { gql } from '@apollo/client'; import { getPeopleMock } from '~/testing/mock-data/people'; @@ -9,7 +9,7 @@ export const query = gql` personDuplicates(ids: $ids) { edges { node { - ${PERSON_FRAGMENT} + ${PERSON_FRAGMENT_WITH_DEPTH_ZERO_RELATIONS} } cursor } diff --git a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useFindOneRecord.ts b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useFindOneRecord.ts index 26ac2981aa37..075dabb052f5 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useFindOneRecord.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useFindOneRecord.ts @@ -1,12 +1,12 @@ import { gql } from '@apollo/client'; -import { PERSON_FRAGMENT } from '@/object-record/hooks/__mocks__/personFragment'; +import { PERSON_FRAGMENT_WITH_DEPTH_ONE_RELATIONS } from '@/object-record/hooks/__mocks__/personFragments'; import { responseData as person } from './useUpdateOneRecord'; export const query = gql` query FindOnePerson($objectRecordId: ID!) { person(filter: { id: { eq: $objectRecordId } }) { - ${PERSON_FRAGMENT} + ${PERSON_FRAGMENT_WITH_DEPTH_ONE_RELATIONS} } } `; diff --git a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useUpdateOneRecord.ts b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useUpdateOneRecord.ts index 15bb27bc76b1..1c109b9e3ed4 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useUpdateOneRecord.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useUpdateOneRecord.ts @@ -1,10 +1,10 @@ -import { PERSON_FRAGMENT } from '@/object-record/hooks/__mocks__/personFragment'; +import { PERSON_FRAGMENT_WITH_DEPTH_ONE_RELATIONS } from '@/object-record/hooks/__mocks__/personFragments'; import { gql } from '@apollo/client'; export const query = gql` mutation UpdateOnePerson($idToUpdate: ID!, $input: PersonUpdateInput!) { updatePerson(id: $idToUpdate, data: $input) { - ${PERSON_FRAGMENT} + ${PERSON_FRAGMENT_WITH_DEPTH_ONE_RELATIONS} } } `; diff --git a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useCreateManyRecords.test.tsx b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useCreateManyRecords.test.tsx index 9eb14eadd799..761680c43081 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useCreateManyRecords.test.tsx +++ b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useCreateManyRecords.test.tsx @@ -1,8 +1,5 @@ -import { ReactNode } from 'react'; -import { MockedProvider } from '@apollo/client/testing'; import { mocked } from '@storybook/test'; import { act, renderHook } from '@testing-library/react'; -import { RecoilRoot } from 'recoil'; import { v4 } from 'uuid'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; @@ -12,6 +9,7 @@ import { variables, } from '@/object-record/hooks/__mocks__/useCreateManyRecords'; import { useCreateManyRecords } from '@/object-record/hooks/useCreateManyRecords'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; jest.mock('uuid', () => ({ v4: jest.fn(), @@ -37,13 +35,9 @@ const mocks = [ }, ]; -const Wrapper = ({ children }: { children: ReactNode }) => ( - - - {children} - - -); +const Wrapper = getJestMetadataAndApolloMocksWrapper({ + apolloMocks: mocks, +}); describe('useCreateManyRecords', () => { it('works as expected', async () => { diff --git a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useCreateManyRecordsMutation.test.tsx b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useCreateManyRecordsMutation.test.tsx index 3b4d1ad42d4c..a5ab3efec117 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useCreateManyRecordsMutation.test.tsx +++ b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useCreateManyRecordsMutation.test.tsx @@ -1,18 +1,22 @@ import { renderHook } from '@testing-library/react'; import { print } from 'graphql'; -import { RecoilRoot } from 'recoil'; -import { PERSON_FRAGMENT } from '@/object-record/hooks/__mocks__/personFragment'; +import { PERSON_FRAGMENT_WITH_DEPTH_ZERO_RELATIONS } from '@/object-record/hooks/__mocks__/personFragments'; import { useCreateManyRecordsMutation } from '@/object-record/hooks/useCreateManyRecordsMutation'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; const expectedQueryTemplate = ` mutation CreatePeople($data: [PersonCreateInput!]!, $upsert: Boolean) { createPeople(data: $data, upsert: $upsert) { - ${PERSON_FRAGMENT} + ${PERSON_FRAGMENT_WITH_DEPTH_ZERO_RELATIONS} } } `.replace(/\s/g, ''); +const Wrapper = getJestMetadataAndApolloMocksWrapper({ + apolloMocks: [], +}); + describe('useCreateManyRecordsMutation', () => { it('should return a valid createManyRecordsMutation', () => { const objectNameSingular = 'person'; @@ -23,7 +27,7 @@ describe('useCreateManyRecordsMutation', () => { objectNameSingular, }), { - wrapper: RecoilRoot, + wrapper: Wrapper, }, ); diff --git a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useCreateOneRecord.test.tsx b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useCreateOneRecord.test.tsx index 837af4dd2bf6..db26b860517a 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useCreateOneRecord.test.tsx +++ b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useCreateOneRecord.test.tsx @@ -1,7 +1,4 @@ -import { ReactNode } from 'react'; -import { MockedProvider } from '@apollo/client/testing'; import { act, renderHook } from '@testing-library/react'; -import { RecoilRoot } from 'recoil'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { @@ -9,6 +6,7 @@ import { responseData, } from '@/object-record/hooks/__mocks__/useCreateOneRecord'; import { useCreateOneRecord } from '@/object-record/hooks/useCreateOneRecord'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; const personId = 'a7286b9a-c039-4a89-9567-2dfa7953cda9'; const input = { name: { firstName: 'John', lastName: 'Doe' } }; @@ -31,13 +29,9 @@ const mocks = [ }, ]; -const Wrapper = ({ children }: { children: ReactNode }) => ( - - - {children} - - -); +const Wrapper = getJestMetadataAndApolloMocksWrapper({ + apolloMocks: mocks, +}); describe('useCreateOneRecord', () => { it('works as expected', async () => { diff --git a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useCreateOneRecordMutation.test.tsx b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useCreateOneRecordMutation.test.tsx index 18db35f815b0..376a085cde7c 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useCreateOneRecordMutation.test.tsx +++ b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useCreateOneRecordMutation.test.tsx @@ -1,18 +1,22 @@ import { renderHook } from '@testing-library/react'; import { print } from 'graphql'; -import { RecoilRoot } from 'recoil'; -import { PERSON_FRAGMENT } from '@/object-record/hooks/__mocks__/personFragment'; +import { PERSON_FRAGMENT_WITH_DEPTH_ONE_RELATIONS } from '@/object-record/hooks/__mocks__/personFragments'; import { useCreateOneRecordMutation } from '@/object-record/hooks/useCreateOneRecordMutation'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; const expectedQueryTemplate = ` mutation CreateOnePerson($input: PersonCreateInput!) { createPerson(data: $input) { - ${PERSON_FRAGMENT} + ${PERSON_FRAGMENT_WITH_DEPTH_ONE_RELATIONS} } } `.replace(/\s/g, ''); +const Wrapper = getJestMetadataAndApolloMocksWrapper({ + apolloMocks: [], +}); + describe('useCreateOneRecordMutation', () => { it('should return a valid createOneRecordMutation', () => { const objectNameSingular = 'person'; @@ -23,7 +27,7 @@ describe('useCreateOneRecordMutation', () => { objectNameSingular, }), { - wrapper: RecoilRoot, + wrapper: Wrapper, }, ); diff --git a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useDeleteManyRecords.test.tsx b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useDeleteManyRecords.test.tsx index 1c7dd33d33e6..ada53864a7a6 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useDeleteManyRecords.test.tsx +++ b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useDeleteManyRecords.test.tsx @@ -1,7 +1,4 @@ -import { MockedProvider } from '@apollo/client/testing'; import { act, renderHook } from '@testing-library/react'; -import { ReactNode } from 'react'; -import { RecoilRoot } from 'recoil'; import { query, @@ -9,6 +6,7 @@ import { variables, } from '@/object-record/hooks/__mocks__/useDeleteManyRecords'; import { useDeleteManyRecords } from '@/object-record/hooks/useDeleteManyRecords'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; const people = [ 'a7286b9a-c039-4a89-9567-2dfa7953cda9', @@ -29,13 +27,9 @@ const mocks = [ }, ]; -const Wrapper = ({ children }: { children: ReactNode }) => ( - - - {children} - - -); +const Wrapper = getJestMetadataAndApolloMocksWrapper({ + apolloMocks: mocks, +}); describe('useDeleteManyRecords', () => { it('works as expected', async () => { diff --git a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useDeleteManyRecordsMutation.test.tsx b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useDeleteManyRecordsMutation.test.tsx index 7f96b1be6114..cc5b85d6b664 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useDeleteManyRecordsMutation.test.tsx +++ b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useDeleteManyRecordsMutation.test.tsx @@ -1,8 +1,8 @@ import { renderHook } from '@testing-library/react'; import { print } from 'graphql'; -import { RecoilRoot } from 'recoil'; import { useDeleteManyRecordsMutation } from '@/object-record/hooks/useDeleteManyRecordsMutation'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; const expectedQueryTemplate = ` mutation DeleteManyPeople($filter: PersonFilterInput!) { @@ -12,6 +12,10 @@ const expectedQueryTemplate = ` } `.replace(/\s/g, ''); +const Wrapper = getJestMetadataAndApolloMocksWrapper({ + apolloMocks: [], +}); + describe('useDeleteManyRecordsMutation', () => { it('should return a valid deleteManyRecordsMutation', () => { const objectNameSingular = 'person'; @@ -22,7 +26,7 @@ describe('useDeleteManyRecordsMutation', () => { objectNameSingular, }), { - wrapper: RecoilRoot, + wrapper: Wrapper, }, ); diff --git a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useDeleteOneRecord.test.tsx b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useDeleteOneRecord.test.tsx index 731a468a2835..0c347d309520 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useDeleteOneRecord.test.tsx +++ b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useDeleteOneRecord.test.tsx @@ -1,7 +1,5 @@ -import { ReactNode } from 'react'; -import { MockedProvider } from '@apollo/client/testing'; -import { act, renderHook } from '@testing-library/react'; -import { RecoilRoot } from 'recoil'; +import { renderHook } from '@testing-library/react'; +import { act } from 'react'; import { query, @@ -9,6 +7,7 @@ import { variables, } from '@/object-record/hooks/__mocks__/useDeleteOneRecord'; import { useDeleteOneRecord } from '@/object-record/hooks/useDeleteOneRecord'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; const personId = 'a7286b9a-c039-4a89-9567-2dfa7953cda9'; @@ -26,13 +25,9 @@ const mocks = [ }, ]; -const Wrapper = ({ children }: { children: ReactNode }) => ( - - - {children} - - -); +const Wrapper = getJestMetadataAndApolloMocksWrapper({ + apolloMocks: mocks, +}); describe('useDeleteOneRecord', () => { it('works as expected', async () => { diff --git a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useDeleteOneRecordMutation.test.tsx b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useDeleteOneRecordMutation.test.tsx index 3bbc51f65a85..859355818ae8 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useDeleteOneRecordMutation.test.tsx +++ b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useDeleteOneRecordMutation.test.tsx @@ -1,17 +1,23 @@ import { renderHook } from '@testing-library/react'; import { print } from 'graphql'; -import { RecoilRoot } from 'recoil'; import { useDeleteOneRecordMutation } from '@/object-record/hooks/useDeleteOneRecordMutation'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; const expectedQueryTemplate = ` mutation DeleteOnePerson($idToDelete: ID!) { deletePerson(id: $idToDelete) { + __typename + deletedAt id } } `.replace(/\s/g, ''); +const Wrapper = getJestMetadataAndApolloMocksWrapper({ + apolloMocks: [], +}); + describe('useDeleteOneRecordMutation', () => { it('should return a valid deleteOneRecordMutation', () => { const objectNameSingular = 'person'; @@ -22,7 +28,7 @@ describe('useDeleteOneRecordMutation', () => { objectNameSingular, }), { - wrapper: RecoilRoot, + wrapper: Wrapper, }, ); diff --git a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useFetchAllRecordIds.test.tsx b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useFetchAllRecordIds.test.tsx index 02095502e9ed..80b57d7dc5bd 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useFetchAllRecordIds.test.tsx +++ b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useFetchAllRecordIds.test.tsx @@ -1,7 +1,6 @@ -import { MockedProvider } from '@apollo/client/testing'; import { act, renderHook } from '@testing-library/react'; -import { ReactNode, useEffect } from 'react'; -import { RecoilRoot, useRecoilState } from 'recoil'; +import { useEffect } from 'react'; +import { useRecoilState } from 'recoil'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; import { @@ -16,8 +15,8 @@ import { variablesThirdRequest, } from '@/object-record/hooks/__mocks__/useFetchAllRecordIds'; import { useFetchAllRecordIds } from '@/object-record/hooks/useFetchAllRecordIds'; -import { SnackBarManagerScopeInternalContext } from '@/ui/feedback/snack-bar-manager/scopes/scope-internal-context/SnackBarManagerScopeInternalContext'; -import { generatedMockObjectMetadataItems } from '~/testing/mock-data/objectMetadataItems'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; const mocks = [ { @@ -52,22 +51,12 @@ const mocks = [ }, ]; +const Wrapper = getJestMetadataAndApolloMocksWrapper({ + apolloMocks: mocks, +}); + describe('useFetchAllRecordIds', () => { it('fetches all record ids with fetch more synchronous loop', async () => { - const Wrapper = ({ children }: { children: ReactNode }) => ( - - - - {children} - - - - ); - const { result } = renderHook( () => { const [, setObjectMetadataItems] = useRecoilState( diff --git a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useFindDuplicateRecords.test.tsx b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useFindDuplicateRecords.test.tsx index e8616d1da1a7..61cd950ff76f 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useFindDuplicateRecords.test.tsx +++ b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useFindDuplicateRecords.test.tsx @@ -1,11 +1,8 @@ -import { ReactNode } from 'react'; -import { MockedProvider } from '@apollo/client/testing'; import { renderHook, waitFor } from '@testing-library/react'; -import { RecoilRoot } from 'recoil'; import { useFindDuplicateRecords } from '@/object-record/hooks/useFindDuplicateRecords'; -import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; import { query, responseData, @@ -24,15 +21,9 @@ const mocks = [ }, ]; -const Wrapper = ({ children }: { children: ReactNode }) => ( - - - - {children} - - - -); +const Wrapper = getJestMetadataAndApolloMocksWrapper({ + apolloMocks: mocks, +}); describe('useFindDuplicateRecords', () => { it('should fetch duplicate records and return the correct data', async () => { diff --git a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useFindDuplicateRecordsQuery.test.tsx b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useFindDuplicateRecordsQuery.test.tsx index e7d0ad73348f..10cb78a400d3 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useFindDuplicateRecordsQuery.test.tsx +++ b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useFindDuplicateRecordsQuery.test.tsx @@ -1,16 +1,16 @@ import { renderHook } from '@testing-library/react'; import { print } from 'graphql'; -import { RecoilRoot } from 'recoil'; -import { PERSON_FRAGMENT } from '@/object-record/hooks/__mocks__/personFragment'; +import { PERSON_FRAGMENT_WITH_DEPTH_ZERO_RELATIONS } from '@/object-record/hooks/__mocks__/personFragments'; import { useFindDuplicateRecordsQuery } from '@/object-record/hooks/useFindDuplicatesRecordsQuery'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; const expectedQueryTemplate = ` query FindDuplicatePerson($ids: [ID!]!) { personDuplicates(ids: $ids) { edges { node { - ${PERSON_FRAGMENT} + ${PERSON_FRAGMENT_WITH_DEPTH_ZERO_RELATIONS} } cursor } @@ -23,6 +23,10 @@ const expectedQueryTemplate = ` } `.replace(/\s/g, ''); +const Wrapper = getJestMetadataAndApolloMocksWrapper({ + apolloMocks: [], +}); + describe('useFindDuplicateRecordsQuery', () => { it('should return a valid findDuplicateRecordsQuery', () => { const objectNameSingular = 'person'; @@ -33,7 +37,7 @@ describe('useFindDuplicateRecordsQuery', () => { objectNameSingular, }), { - wrapper: RecoilRoot, + wrapper: Wrapper, }, ); diff --git a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useFindManyRecords.test.tsx b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useFindManyRecords.test.tsx index d86769f1d219..5d85b80c98da 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useFindManyRecords.test.tsx +++ b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useFindManyRecords.test.tsx @@ -1,7 +1,5 @@ -import { MockedProvider } from '@apollo/client/testing'; import { renderHook } from '@testing-library/react'; -import { ReactNode } from 'react'; -import { RecoilRoot, useSetRecoilState } from 'recoil'; +import { useSetRecoilState } from 'recoil'; import { currentWorkspaceMemberState } from '@/auth/states/currentWorkspaceMemberState'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; @@ -11,8 +9,8 @@ import { variables, } from '@/object-record/hooks/__mocks__/useFindManyRecords'; import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords'; -import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope'; -import { generatedMockObjectMetadataItems } from '~/testing/mock-data/objectMetadataItems'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; const mocks = [ { @@ -28,29 +26,10 @@ const mocks = [ }, ]; -const Wrapper = ({ children }: { children: ReactNode }) => ( - - - - {children} - - - -); - +const Wrapper = getJestMetadataAndApolloMocksWrapper({ + apolloMocks: mocks, +}); describe('useFindManyRecords', () => { - it('should skip fetch if currentWorkspaceMember is undefined', async () => { - const { result } = renderHook( - () => useFindManyRecords({ objectNameSingular: 'person' }), - { - wrapper: Wrapper, - }, - ); - - expect(result.current.loading).toBe(false); - expect(result.current.error).toBeUndefined(); - }); - it('should work as expected', async () => { const onCompleted = jest.fn(); diff --git a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useFindManyRecordsQuery.test.tsx b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useFindManyRecordsQuery.test.tsx index 3d2213a589f4..0c7fd0afbeb2 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useFindManyRecordsQuery.test.tsx +++ b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useFindManyRecordsQuery.test.tsx @@ -1,16 +1,16 @@ import { renderHook } from '@testing-library/react'; import { print } from 'graphql'; -import { RecoilRoot } from 'recoil'; -import { PERSON_FRAGMENT } from '@/object-record/hooks/__mocks__/personFragment'; +import { PERSON_FRAGMENT_WITH_DEPTH_ZERO_RELATIONS } from '@/object-record/hooks/__mocks__/personFragments'; import { useFindManyRecordsQuery } from '@/object-record/hooks/useFindManyRecordsQuery'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; const expectedQueryTemplate = ` query FindManyPeople($filter: PersonFilterInput, $orderBy: [PersonOrderByInput], $lastCursor: String, $limit: Int) { people(filter: $filter, orderBy: $orderBy, first: $limit, after: $lastCursor) { edges { node { - ${PERSON_FRAGMENT} + ${PERSON_FRAGMENT_WITH_DEPTH_ZERO_RELATIONS} } cursor } @@ -25,6 +25,10 @@ const expectedQueryTemplate = ` } `.replace(/\s/g, ''); +const Wrapper = getJestMetadataAndApolloMocksWrapper({ + apolloMocks: [], +}); + describe('useFindManyRecordsQuery', () => { it('should return a valid findManyRecordsQuery', () => { const objectNameSingular = 'person'; @@ -37,7 +41,7 @@ describe('useFindManyRecordsQuery', () => { computeReferences, }), { - wrapper: RecoilRoot, + wrapper: Wrapper, }, ); diff --git a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useFindOneRecord.test.tsx b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useFindOneRecord.test.tsx index 62e11efe51dd..e7249d9caf4b 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useFindOneRecord.test.tsx +++ b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useFindOneRecord.test.tsx @@ -1,15 +1,12 @@ -import { ReactNode } from 'react'; -import { MockedProvider } from '@apollo/client/testing'; import { renderHook, waitFor } from '@testing-library/react'; -import { RecoilRoot } from 'recoil'; import { query, - responseData, variables, } from '@/object-record/hooks/__mocks__/useFindOneRecord'; import { useFindOneRecord } from '@/object-record/hooks/useFindOneRecord'; -import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope'; +import { generateEmptyJestRecordNode } from '~/testing/jest/generateEmptyJestRecordNode'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; const mocks = [ { @@ -19,21 +16,19 @@ const mocks = [ }, result: jest.fn(() => ({ data: { - person: responseData, + person: generateEmptyJestRecordNode({ + objectNameSingular: 'person', + input: { id: '6205681e-7c11-40b4-9e32-f523dbe54590' }, + withDepthOneRelation: true, + }), }, })), }, ]; -const Wrapper = ({ children }: { children: ReactNode }) => ( - - - - {children} - - - -); +const Wrapper = getJestMetadataAndApolloMocksWrapper({ + apolloMocks: mocks, +}); const objectRecordId = '6205681e-7c11-40b4-9e32-f523dbe54590'; diff --git a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useFindOneRecordQuery.test.tsx b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useFindOneRecordQuery.test.tsx index 386e0d55f84f..32b2a169139d 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useFindOneRecordQuery.test.tsx +++ b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useFindOneRecordQuery.test.tsx @@ -1,18 +1,22 @@ import { renderHook } from '@testing-library/react'; import { print } from 'graphql'; -import { RecoilRoot } from 'recoil'; -import { PERSON_FRAGMENT } from '@/object-record/hooks/__mocks__/personFragment'; +import { PERSON_FRAGMENT_WITH_DEPTH_ZERO_RELATIONS } from '@/object-record/hooks/__mocks__/personFragments'; import { useFindOneRecordQuery } from '@/object-record/hooks/useFindOneRecordQuery'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; const expectedQueryTemplate = ` query FindOnePerson($objectRecordId: ID!) { person(filter: { id: { eq: $objectRecordId } }) { - ${PERSON_FRAGMENT} + ${PERSON_FRAGMENT_WITH_DEPTH_ZERO_RELATIONS} } } `.replace(/\s/g, ''); +const Wrapper = getJestMetadataAndApolloMocksWrapper({ + apolloMocks: [], +}); + describe('useFindOneRecordQuery', () => { it('should return a valid findOneRecordQuery', () => { const objectNameSingular = 'person'; @@ -23,7 +27,7 @@ describe('useFindOneRecordQuery', () => { objectNameSingular, }), { - wrapper: RecoilRoot, + wrapper: Wrapper, }, ); diff --git a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useGenerateFindManyRecordsForMultipleMetadataItemsQuery.test.tsx b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useGenerateFindManyRecordsForMultipleMetadataItemsQuery.test.tsx index feb33c81b30a..2cdf074ad1d5 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useGenerateFindManyRecordsForMultipleMetadataItemsQuery.test.tsx +++ b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useGenerateFindManyRecordsForMultipleMetadataItemsQuery.test.tsx @@ -5,7 +5,7 @@ import { RecoilRoot } from 'recoil'; import { useGenerateCombinedFindManyRecordsQuery } from '@/object-record/multiple-objects/hooks/useGenerateCombinedFindManyRecordsQuery'; import { JestObjectMetadataItemSetter } from '~/testing/jest/JestObjectMetadataItemSetter'; -import { generatedMockObjectMetadataItems } from '~/testing/mock-data/objectMetadataItems'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; const Wrapper = ({ children }: { children: ReactNode }) => ( diff --git a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useLazyFindOneRecord.test.tsx b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useLazyFindOneRecord.test.tsx index 013889b934cd..77833552d8db 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useLazyFindOneRecord.test.tsx +++ b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useLazyFindOneRecord.test.tsx @@ -1,7 +1,4 @@ -import { ReactNode } from 'react'; -import { MockedProvider } from '@apollo/client/testing'; import { act, renderHook, waitFor } from '@testing-library/react'; -import { RecoilRoot } from 'recoil'; import { query, @@ -9,7 +6,7 @@ import { variables, } from '@/object-record/hooks/__mocks__/useFindOneRecord'; import { useLazyFindOneRecord } from '@/object-record/hooks/useLazyFindOneRecord'; -import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; const mocks = [ { @@ -25,15 +22,9 @@ const mocks = [ }, ]; -const Wrapper = ({ children }: { children: ReactNode }) => ( - - - - {children} - - - -); +const Wrapper = getJestMetadataAndApolloMocksWrapper({ + apolloMocks: mocks, +}); const objectRecordId = '6205681e-7c11-40b4-9e32-f523dbe54590'; diff --git a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useObjectRecordTable.test.tsx b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useObjectRecordTable.test.tsx index 627991b7f41d..4cd4cdbffc11 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useObjectRecordTable.test.tsx +++ b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useObjectRecordTable.test.tsx @@ -1,13 +1,12 @@ -import { ReactNode } from 'react'; -import { MockedProvider } from '@apollo/client/testing'; import { expect } from '@storybook/test'; import { renderHook } from '@testing-library/react'; -import { RecoilRoot } from 'recoil'; +import { ReactNode } from 'react'; +import { mocks } from '@/auth/hooks/__mocks__/useAuth'; import { useLoadRecordIndexTable } from '@/object-record/record-index/hooks/useLoadRecordIndexTable'; import { RecordTableScope } from '@/object-record/record-table/scopes/RecordTableScope'; -import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope'; import { getScopeIdFromComponentId } from '@/ui/utilities/recoil-scope/utils/getScopeIdFromComponentId'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; const recordTableId = 'people'; const objectNameSingular = 'person'; @@ -17,20 +16,22 @@ const ObjectNamePluralSetter = ({ children }: { children: ReactNode }) => { return <>{children}; }; +const HookMockWrapper = getJestMetadataAndApolloMocksWrapper({ + apolloMocks: mocks, +}); + const Wrapper = ({ children }: { children: ReactNode }) => { return ( - + - - {children} - + {children} - + ); }; diff --git a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useUpdateOneRecord.test.tsx b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useUpdateOneRecord.test.tsx index eb6e7048d316..d32ef37508b1 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useUpdateOneRecord.test.tsx +++ b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useUpdateOneRecord.test.tsx @@ -1,7 +1,4 @@ -import { MockedProvider } from '@apollo/client/testing'; import { act, renderHook } from '@testing-library/react'; -import { ReactNode } from 'react'; -import { RecoilRoot } from 'recoil'; import { query, @@ -9,6 +6,7 @@ import { variables, } from '@/object-record/hooks/__mocks__/useUpdateOneRecord'; import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; const person = { id: '36abbb63-34ed-4a16-89f5-f549ac55d0f9' }; const update = { @@ -37,13 +35,9 @@ const mocks = [ }, ]; -const Wrapper = ({ children }: { children: ReactNode }) => ( - - - {children} - - -); +const Wrapper = getJestMetadataAndApolloMocksWrapper({ + apolloMocks: mocks, +}); const idToUpdate = '36abbb63-34ed-4a16-89f5-f549ac55d0f9'; diff --git a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useUpdateOneRecordMutation.test.tsx b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useUpdateOneRecordMutation.test.tsx index 7581e1612582..be862743e9b8 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useUpdateOneRecordMutation.test.tsx +++ b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useUpdateOneRecordMutation.test.tsx @@ -1,18 +1,22 @@ import { renderHook } from '@testing-library/react'; import { print } from 'graphql'; -import { RecoilRoot } from 'recoil'; -import { PERSON_FRAGMENT } from '@/object-record/hooks/__mocks__/personFragment'; +import { PERSON_FRAGMENT_WITH_DEPTH_ZERO_RELATIONS } from '@/object-record/hooks/__mocks__/personFragments'; import { useUpdateOneRecordMutation } from '@/object-record/hooks/useUpdateOneRecordMutation'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; import { normalizeGQLQuery } from '~/utils/normalizeGQLQuery'; const expectedQueryTemplate = ` mutation UpdateOnePerson($idToUpdate: ID!, $input: PersonUpdateInput!) { updatePerson(id: $idToUpdate, data: $input) { - ${PERSON_FRAGMENT} + ${PERSON_FRAGMENT_WITH_DEPTH_ZERO_RELATIONS} } }`; +const Wrapper = getJestMetadataAndApolloMocksWrapper({ + apolloMocks: [], +}); + describe('useUpdateOneRecordMutation', () => { it('should return a valid createManyRecordsMutation', () => { const objectNameSingular = 'person'; @@ -23,7 +27,7 @@ describe('useUpdateOneRecordMutation', () => { objectNameSingular, }), { - wrapper: RecoilRoot, + wrapper: Wrapper, }, ); diff --git a/packages/twenty-front/src/modules/object-record/hooks/useFindDuplicateRecords.ts b/packages/twenty-front/src/modules/object-record/hooks/useFindDuplicateRecords.ts index bd75db4a75a4..7b73f918fd74 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/useFindDuplicateRecords.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/useFindDuplicateRecords.ts @@ -1,5 +1,5 @@ -import { useMemo } from 'react'; import { useQuery } from '@apollo/client'; +import { useMemo } from 'react'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { ObjectMetadataItemIdentifier } from '@/object-metadata/types/ObjectMetadataItemIdentifier'; diff --git a/packages/twenty-front/src/modules/object-record/hooks/useFindManyRecords.ts b/packages/twenty-front/src/modules/object-record/hooks/useFindManyRecords.ts index c5f22c9f640e..0dac0caa6d68 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/useFindManyRecords.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/useFindManyRecords.ts @@ -1,7 +1,5 @@ import { useQuery, WatchQueryFetchPolicy } from '@apollo/client'; -import { useRecoilValue } from 'recoil'; -import { currentWorkspaceMemberState } from '@/auth/states/currentWorkspaceMemberState'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { ObjectMetadataItemIdentifier } from '@/object-metadata/types/ObjectMetadataItemIdentifier'; import { RecordGqlOperationFindManyResult } from '@/object-record/graphql/types/RecordGqlOperationFindManyResult'; @@ -36,7 +34,6 @@ export const useFindManyRecords = ({ onCompleted, cursorFilter, }: UseFindManyRecordsParams) => { - const currentWorkspaceMember = useRecoilValue(currentWorkspaceMemberState); const { objectMetadataItem } = useObjectMetadataItem({ objectNameSingular, }); @@ -66,7 +63,7 @@ export const useFindManyRecords = ({ const { data, loading, error, fetchMore } = useQuery(findManyRecordsQuery, { - skip: skip || !objectMetadataItem || !currentWorkspaceMember, + skip: skip || !objectMetadataItem, variables: { filter, orderBy, diff --git a/packages/twenty-front/src/modules/object-record/record-field/__mocks__/fieldDefinitions.ts b/packages/twenty-front/src/modules/object-record/record-field/__mocks__/fieldDefinitions.ts index e688a2a64544..90cd7f176e26 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/__mocks__/fieldDefinitions.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/__mocks__/fieldDefinitions.ts @@ -9,10 +9,8 @@ import { FieldTextMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { FieldMetadataType } from '~/generated-metadata/graphql'; -import { - mockedCompanyObjectMetadataItem, - mockedPersonObjectMetadataItem, -} from '~/testing/mock-data/metadata'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; + export const fieldMetadataId = 'fieldMetadataId'; export const textfieldDefinition: FieldDefinition = { @@ -24,7 +22,16 @@ export const textfieldDefinition: FieldDefinition = { metadata: { placeHolder: 'John Doe', fieldName: 'userName' }, }; -const relationFieldMetadataItem = mockedPersonObjectMetadataItem.fields?.find( +const mockedPersonObjectMetadataItem = generatedMockObjectMetadataItems.find( + ({ nameSingular }) => nameSingular === 'person', +); + +if (!mockedPersonObjectMetadataItem) { + throw new Error('Person object metadata item not found'); +} + + +const relationFieldMetadataItem = mockedPersonObjectMetadataItem?.fields?.find( ({ name }) => name === 'company', ); @@ -91,7 +98,15 @@ export const ratingFieldDefinition: FieldDefinition = { }, }; -const booleanFieldMetadataItem = mockedCompanyObjectMetadataItem.fields?.find( +const mockedCompanyObjectMetadataItem = generatedMockObjectMetadataItems.find( + (item) => item.nameSingular === 'company', +); + +if (!mockedCompanyObjectMetadataItem) { + throw new Error('Company object metadata item not found'); +} + +const booleanFieldMetadataItem = mockedCompanyObjectMetadataItem?.fields?.find( ({ name }) => name === 'idealCustomerProfile', ); export const booleanFieldDefinition = formatFieldMetadataItemAsFieldDefinition({ diff --git a/packages/twenty-front/src/modules/object-record/record-field/hooks/__tests__/usePersistField.test.tsx b/packages/twenty-front/src/modules/object-record/record-field/hooks/__tests__/usePersistField.test.tsx index 2e8756c2e8f0..4eea3aae834f 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/hooks/__tests__/usePersistField.test.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/hooks/__tests__/usePersistField.test.tsx @@ -1,11 +1,11 @@ import { gql } from '@apollo/client'; -import { MockedProvider, MockedResponse } from '@apollo/client/testing'; +import { MockedResponse } from '@apollo/client/testing'; import { act, renderHook, waitFor } from '@testing-library/react'; import { ReactNode } from 'react'; -import { RecoilRoot, useRecoilValue } from 'recoil'; +import { useRecoilValue } from 'recoil'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; -import { PERSON_FRAGMENT } from '@/object-record/hooks/__mocks__/personFragment'; +import { PERSON_FRAGMENT_WITH_DEPTH_ONE_RELATIONS } from '@/object-record/hooks/__mocks__/personFragments'; import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord'; import { phonesFieldDefinition, @@ -20,11 +20,12 @@ import { usePersistField } from '@/object-record/record-field/hooks/usePersistFi import { FieldDefinition } from '@/object-record/record-field/types/FieldDefinition'; import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; const query = gql` mutation UpdateOnePerson($idToUpdate: ID!, $input: PersonUpdateInput!) { updatePerson(id: $idToUpdate, data: $input) { - ${PERSON_FRAGMENT} + ${PERSON_FRAGMENT_WITH_DEPTH_ONE_RELATIONS} } } `; @@ -72,6 +73,10 @@ const mocks: MockedResponse[] = [ const recordId = 'recordId'; +const JestMetadataAndApolloMocksWrapper = getJestMetadataAndApolloMocksWrapper({ + apolloMocks: mocks, +}); + const getWrapper = (fieldDefinition: FieldDefinition) => ({ children }: { children: ReactNode }) => { @@ -91,7 +96,7 @@ const getWrapper = }; return ( - + - {children} + {children} - + ); }; diff --git a/packages/twenty-front/src/modules/object-record/record-field/hooks/__tests__/useToggleEditOnlyInput.test.tsx b/packages/twenty-front/src/modules/object-record/record-field/hooks/__tests__/useToggleEditOnlyInput.test.tsx index 86a2037c5d2c..5ec442483de4 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/hooks/__tests__/useToggleEditOnlyInput.test.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/hooks/__tests__/useToggleEditOnlyInput.test.tsx @@ -1,8 +1,7 @@ import { gql } from '@apollo/client'; -import { MockedProvider, MockedResponse } from '@apollo/client/testing'; -import { act, renderHook, waitFor } from '@testing-library/react'; -import { ReactNode } from 'react'; -import { RecoilRoot } from 'recoil'; +import { MockedResponse } from '@apollo/client/testing'; +import { renderHook, waitFor } from '@testing-library/react'; +import { ReactNode, act } from 'react'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord'; @@ -13,6 +12,8 @@ import { RecordUpdateHookParams, } from '@/object-record/record-field/contexts/FieldContext'; import { useToggleEditOnlyInput } from '@/object-record/record-field/hooks/useToggleEditOnlyInput'; +import { generateEmptyJestRecordNode } from '~/testing/jest/generateEmptyJestRecordNode'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; const recordId = 'recordId'; @@ -26,13 +27,42 @@ const mocks: MockedResponse[] = [ ) { updateCompany(id: $idToUpdate, data: $input) { __typename - updatedAt - domainName { - primaryLinkUrl - primaryLinkLabel - secondaryLinks + accountOwner { + __typename + avatarUrl + colorScheme + createdAt + dateFormat + deletedAt + id + locale + name { + firstName + lastName + } + timeFormat + timeZone + updatedAt + userEmail + userId + } + accountOwnerId + activityTargets { + edges { + node { + __typename + activityId + companyId + createdAt + deletedAt + id + opportunityId + personId + rocketId + updatedAt + } + } } - visaSponsorship address { addressStreet1 addressStreet2 @@ -43,20 +73,31 @@ const mocks: MockedResponse[] = [ addressLat addressLng } - position - employees - deletedAt - accountOwnerId annualRecurringRevenue { amountMicros currencyCode } - id - name - xLink { - primaryLinkUrl - primaryLinkLabel - secondaryLinks + attachments { + edges { + node { + __typename + activityId + authorId + companyId + createdAt + deletedAt + fullPath + id + name + noteId + opportunityId + personId + rocketId + taskId + type + updatedAt + } + } } createdAt createdBy { @@ -64,7 +105,36 @@ const mocks: MockedResponse[] = [ workspaceMemberId name } - workPolicy + deletedAt + domainName { + primaryLinkUrl + primaryLinkLabel + secondaryLinks + } + employees + favorites { + edges { + node { + __typename + companyId + createdAt + deletedAt + id + noteId + opportunityId + personId + position + rocketId + taskId + updatedAt + viewId + workflowId + workspaceMemberId + } + } + } + id + idealCustomerProfile introVideo { primaryLinkUrl primaryLinkLabel @@ -75,8 +145,151 @@ const mocks: MockedResponse[] = [ primaryLinkLabel secondaryLinks } + name + noteTargets { + edges { + node { + __typename + companyId + createdAt + deletedAt + id + noteId + opportunityId + personId + rocketId + updatedAt + } + } + } + opportunities { + edges { + node { + __typename + amount { + amountMicros + currencyCode + } + closeDate + companyId + createdAt + createdBy { + source + workspaceMemberId + name + } + deletedAt + id + name + pointOfContactId + position + stage + updatedAt + } + } + } + people { + edges { + node { + __typename + avatarUrl + city + companyId + createdAt + createdBy { + source + workspaceMemberId + name + } + deletedAt + emails { + primaryEmail + additionalEmails + } + id + intro + jobTitle + linkedinLink { + primaryLinkUrl + primaryLinkLabel + secondaryLinks + } + name { + firstName + lastName + } + performanceRating + phones { + primaryPhoneNumber + primaryPhoneCountryCode + additionalPhones + } + position + updatedAt + whatsapp { + primaryPhoneNumber + primaryPhoneCountryCode + additionalPhones + } + workPreference + xLink { + primaryLinkUrl + primaryLinkLabel + secondaryLinks + } + } + } + } + position tagline - idealCustomerProfile + taskTargets { + edges { + node { + __typename + companyId + createdAt + deletedAt + id + opportunityId + personId + rocketId + taskId + updatedAt + } + } + } + timelineActivities { + edges { + node { + __typename + companyId + createdAt + deletedAt + happensAt + id + linkedObjectMetadataId + linkedRecordCachedName + linkedRecordId + name + noteId + opportunityId + personId + properties + rocketId + taskId + updatedAt + workspaceMemberId + } + } + } + updatedAt + visaSponsorship + workPolicy + xLink { + primaryLinkUrl + primaryLinkLabel + secondaryLinks + } } } `, @@ -87,8 +300,12 @@ const mocks: MockedResponse[] = [ }, result: jest.fn(() => ({ data: { - updateWorkspaceMember: { - id: 'recordId', + updateCompany: { + ...generateEmptyJestRecordNode({ + objectNameSingular: CoreObjectNameSingular.Company, + input: { id: recordId }, + withDepthOneRelation: true, + }), }, }, })), @@ -111,8 +328,13 @@ const Wrapper = ({ children }: { children: ReactNode }) => { return [updateEntity, { loading: false }]; }; + const JestMetadataAndApolloMocksWrapper = + getJestMetadataAndApolloMocksWrapper({ + apolloMocks: mocks, + }); + return ( - + { useUpdateRecord: useUpdateOneRecordMutation, }} > - {children} + {children} - + ); }; diff --git a/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/DateTimeFieldDisplay.perf.stories.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/DateTimeFieldDisplay.perf.stories.tsx index 079b84520e91..9e2cb6b78622 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/DateTimeFieldDisplay.perf.stories.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/DateTimeFieldDisplay.perf.stories.tsx @@ -51,6 +51,6 @@ export const Elipsis: Story = { export const Performance = getProfilingStory({ componentName: 'DateTimeFieldDisplay', averageThresholdInMs: 0.1, - numberOfRuns: 50, - numberOfTestsPerRun: 100, + numberOfRuns: 30, + numberOfTestsPerRun: 30, }); diff --git a/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/EmailFieldDisplay.perf.stories.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/EmailsFieldDisplay.perf.stories.tsx similarity index 55% rename from packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/EmailFieldDisplay.perf.stories.tsx rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/EmailsFieldDisplay.perf.stories.tsx index b901caa9c1cd..283224dd88a5 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/EmailFieldDisplay.perf.stories.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/EmailsFieldDisplay.perf.stories.tsx @@ -1,19 +1,22 @@ import { Meta, StoryObj } from '@storybook/react'; import { ComponentDecorator } from 'twenty-ui'; -import { EmailFieldDisplay } from '@/object-record/record-field/meta-types/display/components/EmailFieldDisplay'; +import { EmailsFieldDisplay } from '@/object-record/record-field/meta-types/display/components/EmailsFieldDisplay'; import { getFieldDecorator } from '~/testing/decorators/getFieldDecorator'; import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator'; import { getProfilingStory } from '~/testing/profiling/utils/getProfilingStory'; const meta: Meta = { - title: 'UI/Data/Field/Display/EmailFieldDisplay', + title: 'UI/Data/Field/Display/EmailsFieldDisplay', decorators: [ MemoryRouterDecorator, - getFieldDecorator('person', 'email'), + getFieldDecorator('person', 'emails', { + primaryEmail: 'test@test.com', + additionalEmails: ['toto@test.com'], + }), ComponentDecorator, ], - component: EmailFieldDisplay, + component: EmailsFieldDisplay, args: {}, parameters: { chromatic: { disableSnapshot: true }, @@ -22,25 +25,25 @@ const meta: Meta = { export default meta; -type Story = StoryObj; +type Story = StoryObj; export const Default: Story = {}; export const Elipsis: Story = { parameters: { - container: { width: 50 }, + container: { width: 100 }, }, decorators: [ - getFieldDecorator( - 'person', - 'email', - 'asdasdasdaksjdhkajshdkajhasmdkamskdsd@asdkjhaksjdhaksjd.com', - ), + getFieldDecorator('person', 'emails', { + primaryEmail: + 'asdasdasdaksjdhkajshdkajhasmdkamskdsd@asdkjhaksjdhaksjd.com', + additionalEmails: [], + }), ], }; export const Performance = getProfilingStory({ - componentName: 'EmailFieldDisplay', + componentName: 'EmailsFieldDisplay', averageThresholdInMs: 0.5, numberOfRuns: 50, numberOfTestsPerRun: 100, diff --git a/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/JsonFieldDisplay.perf.stories.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/JsonFieldDisplay.perf.stories.tsx deleted file mode 100644 index be1567d863b0..000000000000 --- a/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/JsonFieldDisplay.perf.stories.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; -import { ComponentDecorator } from 'twenty-ui'; - -import { JsonFieldDisplay } from '@/object-record/record-field/meta-types/display/components/JsonFieldDisplay'; -import { getFieldDecorator } from '~/testing/decorators/getFieldDecorator'; -import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator'; -import { getProfilingStory } from '~/testing/profiling/utils/getProfilingStory'; - -const meta: Meta = { - title: 'UI/Data/Field/Display/JsonFieldDisplay', - decorators: [ - MemoryRouterDecorator, - getFieldDecorator('company', 'testRawJson', { - key1: 'value1', - key2: 'value2', - }), - ComponentDecorator, - ], - component: JsonFieldDisplay, - args: {}, - parameters: { - chromatic: { disableSnapshot: true }, - }, -}; - -export default meta; - -type Story = StoryObj; - -export const Default: Story = {}; - -export const Elipsis: Story = { - parameters: { - container: { width: 50 }, - }, -}; - -export const Performance = getProfilingStory({ - componentName: 'JsonFieldDisplay', - averageThresholdInMs: 0.1, - numberOfRuns: 50, - numberOfTestsPerRun: 100, -}); diff --git a/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/MultiSelectFieldDisplay.perf.stories.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/MultiSelectFieldDisplay.perf.stories.tsx index ec9a8291d2c5..0eae95f09db0 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/MultiSelectFieldDisplay.perf.stories.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/MultiSelectFieldDisplay.perf.stories.tsx @@ -23,7 +23,7 @@ const meta: Meta = { title: 'UI/Data/Field/Display/MultiSelectFieldDisplay', decorators: [ MemoryRouterDecorator, - getFieldDecorator('company', 'testMultiSelect', [ + getFieldDecorator('company', 'workPolicy', [ 'Option 1', 'Option 2', 'Option 3', diff --git a/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/PhoneFieldDisplay.perf.stories.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/PhonesFieldDisplay.perf.stories.tsx similarity index 61% rename from packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/PhoneFieldDisplay.perf.stories.tsx rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/PhonesFieldDisplay.perf.stories.tsx index fed4bbe247a3..94f37ee5cfb6 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/PhoneFieldDisplay.perf.stories.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/PhonesFieldDisplay.perf.stories.tsx @@ -1,19 +1,19 @@ import { Meta, StoryObj } from '@storybook/react'; import { ComponentDecorator } from 'twenty-ui'; -import { PhoneFieldDisplay } from '@/object-record/record-field/meta-types/display/components/PhoneFieldDisplay'; +import { PhonesFieldDisplay } from '@/object-record/record-field/meta-types/display/components/PhonesFieldDisplay'; import { getFieldDecorator } from '~/testing/decorators/getFieldDecorator'; import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator'; import { getProfilingStory } from '~/testing/profiling/utils/getProfilingStory'; const meta: Meta = { - title: 'UI/Data/Field/Display/PhoneFieldDisplay', + title: 'UI/Data/Field/Display/PhonesFieldDisplay', decorators: [ MemoryRouterDecorator, - getFieldDecorator('person', 'phone'), + getFieldDecorator('person', 'phones'), ComponentDecorator, ], - component: PhoneFieldDisplay, + component: PhonesFieldDisplay, args: {}, parameters: { chromatic: { disableSnapshot: true }, @@ -22,7 +22,7 @@ const meta: Meta = { export default meta; -type Story = StoryObj; +type Story = StoryObj; export const Default: Story = {}; @@ -33,11 +33,17 @@ export const Elipsis: Story = { }; export const WrongNumber: Story = { - decorators: [getFieldDecorator('person', 'phone', 'sdklaskdj')], + decorators: [ + getFieldDecorator('person', 'phones', { + primaryPhoneNumber: '123-456-7890', + primaryPhoneCountryCode: '+1', + additionalPhones: null, + }), + ], }; export const Performance = getProfilingStory({ - componentName: 'PhoneFieldDisplay', + componentName: 'PhonesFieldDisplay', averageThresholdInMs: 0.5, numberOfRuns: 20, numberOfTestsPerRun: 100, diff --git a/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/RatingFieldDisplay.perf.stories.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/RatingFieldDisplay.perf.stories.tsx index 3c31dc6d5682..3d4b5950aea0 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/RatingFieldDisplay.perf.stories.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/RatingFieldDisplay.perf.stories.tsx @@ -10,7 +10,7 @@ const meta: Meta = { title: 'UI/Data/Field/Display/RatingFieldDisplay', decorators: [ MemoryRouterDecorator, - getFieldDecorator('company', 'testRating'), + getFieldDecorator('person', 'performanceRating'), ComponentDecorator, ], component: RatingFieldDisplay, @@ -30,5 +30,5 @@ export const Performance = getProfilingStory({ componentName: 'RatingFieldDisplay', averageThresholdInMs: 0.5, numberOfRuns: 30, - numberOfTestsPerRun: 50, + numberOfTestsPerRun: 30, }); diff --git a/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/RelationToOneFieldDisplay.perf.stories.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/RelationToOneFieldDisplay.perf.stories.tsx index 49a076d80a47..989de5e7439f 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/RelationToOneFieldDisplay.perf.stories.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/perf/RelationToOneFieldDisplay.perf.stories.tsx @@ -30,7 +30,7 @@ export const Default: Story = {}; export const Performance = getProfilingStory({ componentName: 'RelationFieldDisplay', - averageThresholdInMs: 0.2, + averageThresholdInMs: 0.22, numberOfRuns: 20, numberOfTestsPerRun: 100, }); diff --git a/packages/twenty-front/src/modules/object-record/record-filter/utils/isMatchingBooleanFilter.spec.ts b/packages/twenty-front/src/modules/object-record/record-filter/utils/__tests__/isMatchingBooleanFilter.test.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/record-filter/utils/isMatchingBooleanFilter.spec.ts rename to packages/twenty-front/src/modules/object-record/record-filter/utils/__tests__/isMatchingBooleanFilter.test.ts diff --git a/packages/twenty-front/src/modules/object-record/record-filter/utils/isMatchingCurrencyFilter.spec.ts b/packages/twenty-front/src/modules/object-record/record-filter/utils/__tests__/isMatchingCurrencyFilter.test.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/record-filter/utils/isMatchingCurrencyFilter.spec.ts rename to packages/twenty-front/src/modules/object-record/record-filter/utils/__tests__/isMatchingCurrencyFilter.test.ts diff --git a/packages/twenty-front/src/modules/object-record/record-filter/utils/isMatchingDateFilter.spec.ts b/packages/twenty-front/src/modules/object-record/record-filter/utils/__tests__/isMatchingDateFilter.test.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/record-filter/utils/isMatchingDateFilter.spec.ts rename to packages/twenty-front/src/modules/object-record/record-filter/utils/__tests__/isMatchingDateFilter.test.ts diff --git a/packages/twenty-front/src/modules/object-record/record-filter/utils/isMatchingFloatFilter.spec.ts b/packages/twenty-front/src/modules/object-record/record-filter/utils/__tests__/isMatchingFloatFilter.test.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/record-filter/utils/isMatchingFloatFilter.spec.ts rename to packages/twenty-front/src/modules/object-record/record-filter/utils/__tests__/isMatchingFloatFilter.test.ts diff --git a/packages/twenty-front/src/modules/object-record/record-filter/utils/isMatchingStringFilter.spec.ts b/packages/twenty-front/src/modules/object-record/record-filter/utils/__tests__/isMatchingStringFilter.test.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/record-filter/utils/isMatchingStringFilter.spec.ts rename to packages/twenty-front/src/modules/object-record/record-filter/utils/__tests__/isMatchingStringFilter.test.ts diff --git a/packages/twenty-front/src/modules/object-record/record-filter/utils/isMatchingUUIDFilter.spec.ts b/packages/twenty-front/src/modules/object-record/record-filter/utils/__tests__/isMatchingUUIDFilter.test.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/record-filter/utils/isMatchingUUIDFilter.spec.ts rename to packages/twenty-front/src/modules/object-record/record-filter/utils/__tests__/isMatchingUUIDFilter.test.ts diff --git a/packages/twenty-front/src/modules/object-record/record-filter/utils/isRecordMatchingFilter.spec.ts b/packages/twenty-front/src/modules/object-record/record-filter/utils/__tests__/isRecordMatchingFilter.test.ts similarity index 98% rename from packages/twenty-front/src/modules/object-record/record-filter/utils/isRecordMatchingFilter.spec.ts rename to packages/twenty-front/src/modules/object-record/record-filter/utils/__tests__/isRecordMatchingFilter.test.ts index ed0b22070777..1c5e1d2b4f46 100644 --- a/packages/twenty-front/src/modules/object-record/record-filter/utils/isRecordMatchingFilter.spec.ts +++ b/packages/twenty-front/src/modules/object-record/record-filter/utils/__tests__/isRecordMatchingFilter.test.ts @@ -1,10 +1,11 @@ import { RecordGqlOperationFilter } from '@/object-record/graphql/types/RecordGqlOperationFilter'; import { getCompaniesMock } from '~/testing/mock-data/companies'; -import { generatedMockObjectMetadataItems } from '~/testing/mock-data/objectMetadataItems'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; import { Company } from '@/companies/types/Company'; import { getCompanyDomainName } from '@/object-metadata/utils/getCompanyDomainName'; -import { isRecordMatchingFilter } from './isRecordMatchingFilter'; +import { isRecordMatchingFilter } from '@/object-record/record-filter/utils/isRecordMatchingFilter'; +import { expect } from '@storybook/test'; const companiesMock = getCompaniesMock(); diff --git a/packages/twenty-front/src/modules/object-record/record-filter/utils/__tests__/turnObjectDropdownFilterIntoQueryFilter.test.ts b/packages/twenty-front/src/modules/object-record/record-filter/utils/__tests__/turnObjectDropdownFilterIntoQueryFilter.test.ts new file mode 100644 index 000000000000..6486ca29b92e --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/record-filter/utils/__tests__/turnObjectDropdownFilterIntoQueryFilter.test.ts @@ -0,0 +1,1063 @@ +import { Filter } from '@/object-record/object-filter-dropdown/types/Filter'; +import { turnObjectDropdownFilterIntoQueryFilter } from '@/object-record/record-filter/utils/turnObjectDropdownFilterIntoQueryFilter'; +import { ViewFilterOperand } from '@/views/types/ViewFilterOperand'; +import { getCompaniesMock } from '~/testing/mock-data/companies'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; + +const companiesMock = getCompaniesMock(); + +const companyMockObjectMetadataItem = generatedMockObjectMetadataItems.find( + (item) => item.nameSingular === 'company', +)!; + +const personMockObjectMetadataItem = generatedMockObjectMetadataItems.find( + (item) => item.nameSingular === 'person', +)!; + +jest.useFakeTimers().setSystemTime(new Date('2020-01-01')); + +describe('turnObjectDropdownFilterIntoQueryFilter', () => { + it('should work as expected for single filter', () => { + const companyMockNameFieldMetadataId = + companyMockObjectMetadataItem.fields.find( + (field) => field.name === 'name', + ); + + const nameFilter: Filter = { + id: 'company-name-filter', + value: companiesMock[0].name, + fieldMetadataId: companyMockNameFieldMetadataId?.id, + displayValue: companiesMock[0].name, + operand: ViewFilterOperand.Contains, + definition: { + type: 'TEXT', + fieldMetadataId: companyMockNameFieldMetadataId?.id, + label: 'Name', + iconName: 'text', + }, + }; + + const result = turnObjectDropdownFilterIntoQueryFilter( + [nameFilter], + companyMockObjectMetadataItem.fields, + ); + + expect(result).toEqual({ + name: { + ilike: '%Linkedin%', + }, + }); + }); + + it('should work as expected for multiple filters', () => { + const companyMockNameFieldMetadataId = + companyMockObjectMetadataItem.fields.find( + (field) => field.name === 'name', + ); + + const companyMockEmployeesFieldMetadataId = + companyMockObjectMetadataItem.fields.find( + (field) => field.name === 'employees', + ); + + const nameFilter: Filter = { + id: 'company-name-filter', + value: companiesMock[0].name, + fieldMetadataId: companyMockNameFieldMetadataId?.id, + displayValue: companiesMock[0].name, + operand: ViewFilterOperand.Contains, + definition: { + type: 'TEXT', + fieldMetadataId: companyMockNameFieldMetadataId?.id, + label: 'Name', + iconName: 'text', + }, + }; + + const employeesFilter: Filter = { + id: 'company-employees-filter', + value: '1000', + fieldMetadataId: companyMockEmployeesFieldMetadataId?.id, + displayValue: '1000', + operand: ViewFilterOperand.GreaterThan, + definition: { + type: 'NUMBER', + fieldMetadataId: companyMockEmployeesFieldMetadataId?.id, + label: 'Employees', + iconName: 'number', + }, + }; + + const result = turnObjectDropdownFilterIntoQueryFilter( + [nameFilter, employeesFilter], + companyMockObjectMetadataItem.fields, + ); + + expect(result).toEqual({ + and: [ + { + name: { + ilike: '%Linkedin%', + }, + }, + { + employees: { + gte: 1000, + }, + }, + ], + }); + }); +}); + +describe('should work as expected for the different field types', () => { + it('address field type', () => { + const companyMockAddressFieldMetadataId = + companyMockObjectMetadataItem.fields.find( + (field) => field.name === 'address', + ); + + const addressFilterContains: Filter = { + id: 'company-address-filter-contains', + value: '123 Main St', + fieldMetadataId: companyMockAddressFieldMetadataId?.id, + displayValue: '123 Main St', + operand: ViewFilterOperand.Contains, + definition: { + type: 'ADDRESS', + fieldMetadataId: companyMockAddressFieldMetadataId?.id, + label: 'Address', + iconName: 'address', + }, + }; + + const addressFilterDoesNotContain: Filter = { + id: 'company-address-filter-does-not-contain', + value: '123 Main St', + fieldMetadataId: companyMockAddressFieldMetadataId?.id, + displayValue: '123 Main St', + operand: ViewFilterOperand.DoesNotContain, + definition: { + type: 'ADDRESS', + fieldMetadataId: companyMockAddressFieldMetadataId?.id, + label: 'Address', + iconName: 'address', + }, + }; + + const addressFilterIsEmpty: Filter = { + id: 'company-address-filter-is-empty', + value: '', + fieldMetadataId: companyMockAddressFieldMetadataId?.id, + displayValue: '', + operand: ViewFilterOperand.IsEmpty, + definition: { + type: 'ADDRESS', + fieldMetadataId: companyMockAddressFieldMetadataId?.id, + label: 'Address', + iconName: 'address', + }, + }; + + const addressFilterIsNotEmpty: Filter = { + id: 'company-address-filter-is-not-empty', + value: '', + fieldMetadataId: companyMockAddressFieldMetadataId?.id, + displayValue: '', + operand: ViewFilterOperand.IsNotEmpty, + definition: { + type: 'ADDRESS', + fieldMetadataId: companyMockAddressFieldMetadataId?.id, + label: 'Address', + iconName: 'address', + }, + }; + + const result = turnObjectDropdownFilterIntoQueryFilter( + [ + addressFilterContains, + addressFilterDoesNotContain, + addressFilterIsEmpty, + addressFilterIsNotEmpty, + ], + companyMockObjectMetadataItem.fields, + ); + + expect(result).toEqual({ + and: [ + { + or: [ + { + address: { + addressStreet1: { + ilike: '%123 Main St%', + }, + }, + }, + { + address: { + addressStreet2: { + ilike: '%123 Main St%', + }, + }, + }, + { + address: { + addressCity: { + ilike: '%123 Main St%', + }, + }, + }, + { + address: { + addressState: { + ilike: '%123 Main St%', + }, + }, + }, + { + address: { + addressCountry: { + ilike: '%123 Main St%', + }, + }, + }, + { + address: { + addressPostcode: { + ilike: '%123 Main St%', + }, + }, + }, + ], + }, + { + and: [ + { + not: { + address: { + addressStreet1: { + ilike: '%123 Main St%', + }, + }, + }, + }, + { + not: { + address: { + addressStreet2: { + ilike: '%123 Main St%', + }, + }, + }, + }, + { + not: { + address: { + addressCity: { + ilike: '%123 Main St%', + }, + }, + }, + }, + ], + }, + { + and: [ + { + or: [ + { + address: { + addressStreet1: { + ilike: '', + }, + }, + }, + { + address: { + addressStreet1: { + is: 'NULL', + }, + }, + }, + ], + }, + { + or: [ + { + address: { + addressStreet2: { + ilike: '', + }, + }, + }, + { + address: { + addressStreet2: { + is: 'NULL', + }, + }, + }, + ], + }, + { + or: [ + { + address: { + addressCity: { + ilike: '', + }, + }, + }, + { + address: { + addressCity: { + is: 'NULL', + }, + }, + }, + ], + }, + { + or: [ + { + address: { + addressState: { + ilike: '', + }, + }, + }, + { + address: { + addressState: { + is: 'NULL', + }, + }, + }, + ], + }, + { + or: [ + { + address: { + addressCountry: { + ilike: '', + }, + }, + }, + { + address: { + addressCountry: { + is: 'NULL', + }, + }, + }, + ], + }, + { + or: [ + { + address: { + addressPostcode: { + ilike: '', + }, + }, + }, + { + address: { + addressPostcode: { + is: 'NULL', + }, + }, + }, + ], + }, + ], + }, + { + not: { + and: [ + { + or: [ + { + address: { + addressStreet1: { + ilike: '', + }, + }, + }, + { + address: { + addressStreet1: { + is: 'NULL', + }, + }, + }, + ], + }, + { + or: [ + { + address: { + addressStreet2: { + ilike: '', + }, + }, + }, + { + address: { + addressStreet2: { + is: 'NULL', + }, + }, + }, + ], + }, + { + or: [ + { + address: { + addressCity: { + ilike: '', + }, + }, + }, + { + address: { + addressCity: { + is: 'NULL', + }, + }, + }, + ], + }, + { + or: [ + { + address: { + addressState: { + ilike: '', + }, + }, + }, + { + address: { + addressState: { + is: 'NULL', + }, + }, + }, + ], + }, + { + or: [ + { + address: { + addressCountry: { + ilike: '', + }, + }, + }, + { + address: { + addressCountry: { + is: 'NULL', + }, + }, + }, + ], + }, + { + or: [ + { + address: { + addressPostcode: { + ilike: '', + }, + }, + }, + { + address: { + addressPostcode: { + is: 'NULL', + }, + }, + }, + ], + }, + ], + }, + }, + ], + }); + }); + + it('phones field type', () => { + const personMockPhonesFieldMetadataId = + personMockObjectMetadataItem.fields.find( + (field) => field.name === 'phones', + ); + + const phonesFilterContains: Filter = { + id: 'person-phones-filter-contains', + value: '1234567890', + fieldMetadataId: personMockPhonesFieldMetadataId?.id, + displayValue: '1234567890', + operand: ViewFilterOperand.Contains, + definition: { + type: 'PHONES', + fieldMetadataId: personMockPhonesFieldMetadataId?.id, + label: 'Phones', + iconName: 'phone', + }, + }; + + const phonesFilterDoesNotContain: Filter = { + id: 'person-phones-filter-does-not-contain', + value: '1234567890', + fieldMetadataId: personMockPhonesFieldMetadataId?.id, + displayValue: '1234567890', + operand: ViewFilterOperand.DoesNotContain, + definition: { + type: 'PHONES', + fieldMetadataId: personMockPhonesFieldMetadataId?.id, + label: 'Phones', + iconName: 'phone', + }, + }; + + const phonesFilterIsEmpty: Filter = { + id: 'person-phones-filter-is-empty', + value: '', + fieldMetadataId: personMockPhonesFieldMetadataId?.id, + displayValue: '', + operand: ViewFilterOperand.IsEmpty, + definition: { + type: 'PHONES', + fieldMetadataId: personMockPhonesFieldMetadataId?.id, + label: 'Phones', + iconName: 'phone', + }, + }; + + const phonesFilterIsNotEmpty: Filter = { + id: 'person-phones-filter-is-not-empty', + value: '', + fieldMetadataId: personMockPhonesFieldMetadataId?.id, + displayValue: '', + operand: ViewFilterOperand.IsNotEmpty, + definition: { + type: 'PHONES', + fieldMetadataId: personMockPhonesFieldMetadataId?.id, + label: 'Phones', + iconName: 'phone', + }, + }; + + const result = turnObjectDropdownFilterIntoQueryFilter( + [ + phonesFilterContains, + phonesFilterDoesNotContain, + phonesFilterIsEmpty, + phonesFilterIsNotEmpty, + ], + personMockObjectMetadataItem.fields, + ); + + expect(result).toEqual({ + and: [ + { + or: [ + { + phones: { + primaryPhoneNumber: { + ilike: '%1234567890%', + }, + }, + }, + { + phones: { + primaryPhoneCountryCode: { + ilike: '%1234567890%', + }, + }, + }, + ], + }, + { + and: [ + { + not: { + phones: { + primaryPhoneNumber: { + ilike: '%1234567890%', + }, + }, + }, + }, + { + not: { + phones: { + primaryPhoneCountryCode: { + ilike: '%1234567890%', + }, + }, + }, + }, + ], + }, + { + and: [ + { + or: [ + { + phones: { + primaryPhoneNumber: { + is: 'NULL', + }, + }, + }, + { + phones: { + primaryPhoneNumber: { + ilike: '', + }, + }, + }, + ], + }, + { + or: [ + { + phones: { + primaryPhoneCountryCode: { + is: 'NULL', + }, + }, + }, + { + phones: { + primaryPhoneCountryCode: { + ilike: '', + }, + }, + }, + ], + }, + ], + }, + { + not: { + and: [ + { + or: [ + { + phones: { + primaryPhoneNumber: { + is: 'NULL', + }, + }, + }, + { + phones: { + primaryPhoneNumber: { + ilike: '', + }, + }, + }, + ], + }, + { + or: [ + { + phones: { + primaryPhoneCountryCode: { + is: 'NULL', + }, + }, + }, + { + phones: { + primaryPhoneCountryCode: { + ilike: '', + }, + }, + }, + ], + }, + ], + }, + }, + ], + }); + }); + + it('emails field type', () => { + const personMockEmailFieldMetadataId = + personMockObjectMetadataItem.fields.find( + (field) => field.name === 'emails', + ); + + const emailsFilterContains: Filter = { + id: 'person-emails-filter-contains', + value: 'test@test.com', + fieldMetadataId: personMockEmailFieldMetadataId?.id, + displayValue: 'test@test.com', + operand: ViewFilterOperand.Contains, + definition: { + type: 'EMAILS', + fieldMetadataId: personMockEmailFieldMetadataId?.id, + iconName: 'email', + label: 'Emails', + }, + }; + + const emailsFilterDoesNotContain: Filter = { + id: 'person-emails-filter-does-not-contain', + value: 'test@test.com', + fieldMetadataId: personMockEmailFieldMetadataId?.id, + displayValue: 'test@test.com', + operand: ViewFilterOperand.DoesNotContain, + definition: { + type: 'EMAILS', + fieldMetadataId: personMockEmailFieldMetadataId?.id, + label: 'Emails', + iconName: 'email', + }, + }; + + const emailsFilterIsEmpty: Filter = { + id: 'person-emails-filter-is-empty', + value: '', + fieldMetadataId: personMockEmailFieldMetadataId?.id, + displayValue: '', + operand: ViewFilterOperand.IsEmpty, + definition: { + type: 'EMAILS', + label: 'Emails', + iconName: 'email', + fieldMetadataId: personMockEmailFieldMetadataId?.id, + }, + }; + + const emailsFilterIsNotEmpty: Filter = { + id: 'person-emails-filter-is-not-empty', + value: '', + fieldMetadataId: personMockEmailFieldMetadataId?.id, + displayValue: '', + operand: ViewFilterOperand.IsNotEmpty, + definition: { + type: 'EMAILS', + label: 'Emails', + iconName: 'email', + fieldMetadataId: personMockEmailFieldMetadataId?.id, + }, + }; + + const result = turnObjectDropdownFilterIntoQueryFilter( + [ + emailsFilterContains, + emailsFilterDoesNotContain, + emailsFilterIsEmpty, + emailsFilterIsNotEmpty, + ], + personMockObjectMetadataItem.fields, + ); + + expect(result).toEqual({ + and: [ + { + or: [ + { + emails: { + primaryEmail: { + ilike: '%test@test.com%', + }, + }, + }, + ], + }, + { + and: [ + { + not: { + emails: { + primaryEmail: { + ilike: '%test@test.com%', + }, + }, + }, + }, + ], + }, + { + or: [ + { + emails: { + primaryEmail: { + ilike: '', + }, + }, + }, + { + emails: { + primaryEmail: { + is: 'NULL', + }, + }, + }, + ], + }, + { + not: { + or: [ + { + emails: { + primaryEmail: { + ilike: '', + }, + }, + }, + { + emails: { + primaryEmail: { + is: 'NULL', + }, + }, + }, + ], + }, + }, + ], + }); + }); + + it('date field type', () => { + const companyMockDateFieldMetadataId = + companyMockObjectMetadataItem.fields.find( + (field) => field.name === 'createdAt', + ); + + const dateFilterIsAfter: Filter = { + id: 'company-date-filter-is-after', + value: '2024-09-17T20:46:58.922Z', + fieldMetadataId: companyMockDateFieldMetadataId?.id, + displayValue: '2024-09-17T20:46:58.922Z', + operand: ViewFilterOperand.IsAfter, + definition: { + type: 'DATE_TIME', + fieldMetadataId: companyMockDateFieldMetadataId?.id, + label: 'Created At', + iconName: 'date', + }, + }; + + const dateFilterIsBefore: Filter = { + id: 'company-date-filter-is-before', + value: '2024-09-17T20:46:58.922Z', + fieldMetadataId: companyMockDateFieldMetadataId?.id, + displayValue: '2024-09-17T20:46:58.922Z', + operand: ViewFilterOperand.IsBefore, + definition: { + type: 'DATE_TIME', + fieldMetadataId: companyMockDateFieldMetadataId?.id, + label: 'Created At', + iconName: 'date', + }, + }; + + const dateFilterIs: Filter = { + id: 'company-date-filter-is', + value: '2024-09-17T20:46:58.922Z', + fieldMetadataId: companyMockDateFieldMetadataId?.id, + displayValue: '2024-09-17T20:46:58.922Z', + operand: ViewFilterOperand.Is, + definition: { + type: 'DATE_TIME', + fieldMetadataId: companyMockDateFieldMetadataId?.id, + label: 'Created At', + iconName: 'date', + }, + }; + + const dateFilterIsEmpty: Filter = { + id: 'company-date-filter-is-empty', + value: '', + fieldMetadataId: companyMockDateFieldMetadataId?.id, + displayValue: '', + operand: ViewFilterOperand.IsEmpty, + definition: { + type: 'DATE_TIME', + fieldMetadataId: companyMockDateFieldMetadataId?.id, + label: 'Created At', + iconName: 'date', + }, + }; + + const dateFilterIsNotEmpty: Filter = { + id: 'company-date-filter-is-not-empty', + value: '', + fieldMetadataId: companyMockDateFieldMetadataId?.id, + displayValue: '', + operand: ViewFilterOperand.IsNotEmpty, + definition: { + type: 'DATE_TIME', + fieldMetadataId: companyMockDateFieldMetadataId?.id, + label: 'Created At', + iconName: 'date', + }, + }; + + const result = turnObjectDropdownFilterIntoQueryFilter( + [ + dateFilterIsAfter, + dateFilterIsBefore, + dateFilterIs, + dateFilterIsEmpty, + dateFilterIsNotEmpty, + ], + companyMockObjectMetadataItem.fields, + ); + + expect(result).toEqual({ + and: [ + { + createdAt: { + gt: '2024-09-17T20:46:58.922Z', + }, + }, + { + createdAt: { + lt: '2024-09-17T20:46:58.922Z', + }, + }, + { + and: [ + { + createdAt: { + lte: '2024-09-17T23:59:59.999Z', + }, + }, + { + createdAt: { + gte: '2024-09-17T00:00:00.000Z', + }, + }, + ], + }, + { + createdAt: { + is: 'NULL', + }, + }, + { + not: { + createdAt: { + is: 'NULL', + }, + }, + }, + ], + }); + }); + + it('number field type', () => { + const companyMockEmployeesFieldMetadataId = + companyMockObjectMetadataItem.fields.find( + (field) => field.name === 'employees', + ); + + const employeesFilterIsGreaterThan: Filter = { + id: 'company-employees-filter-is-greater-than', + value: '1000', + fieldMetadataId: companyMockEmployeesFieldMetadataId?.id, + displayValue: '1000', + operand: ViewFilterOperand.GreaterThan, + definition: { + type: 'NUMBER', + fieldMetadataId: companyMockEmployeesFieldMetadataId?.id, + label: 'Employees', + iconName: 'number', + }, + }; + + const employeesFilterIsLessThan: Filter = { + id: 'company-employees-filter-is-less-than', + value: '1000', + fieldMetadataId: companyMockEmployeesFieldMetadataId?.id, + displayValue: '1000', + operand: ViewFilterOperand.LessThan, + definition: { + type: 'NUMBER', + fieldMetadataId: companyMockEmployeesFieldMetadataId?.id, + label: 'Employees', + iconName: 'number', + }, + }; + + const employeesFilterIsEmpty: Filter = { + id: 'company-employees-filter-is-empty', + value: '', + fieldMetadataId: companyMockEmployeesFieldMetadataId?.id, + displayValue: '', + operand: ViewFilterOperand.IsEmpty, + definition: { + type: 'NUMBER', + fieldMetadataId: companyMockEmployeesFieldMetadataId?.id, + label: 'Employees', + iconName: 'number', + }, + }; + + const employeesFilterIsNotEmpty: Filter = { + id: 'company-employees-filter-is-not-empty', + value: '', + fieldMetadataId: companyMockEmployeesFieldMetadataId?.id, + displayValue: '', + operand: ViewFilterOperand.IsNotEmpty, + definition: { + type: 'NUMBER', + fieldMetadataId: companyMockEmployeesFieldMetadataId?.id, + label: 'Employees', + iconName: 'number', + }, + }; + + const result = turnObjectDropdownFilterIntoQueryFilter( + [ + employeesFilterIsGreaterThan, + employeesFilterIsLessThan, + employeesFilterIsEmpty, + employeesFilterIsNotEmpty, + ], + companyMockObjectMetadataItem.fields, + ); + + expect(result).toEqual({ + and: [ + { + employees: { + gte: 1000, + }, + }, + { + employees: { + lte: 1000, + }, + }, + { + employees: { + is: 'NULL', + }, + }, + { + not: { + employees: { + is: 'NULL', + }, + }, + }, + ], + }); + }); +}); diff --git a/packages/twenty-front/src/modules/object-record/record-filter/utils/turnObjectDropdownFilterIntoQueryFilter.ts b/packages/twenty-front/src/modules/object-record/record-filter/utils/turnObjectDropdownFilterIntoQueryFilter.ts index 14584485370e..323e36e2985a 100644 --- a/packages/twenty-front/src/modules/object-record/record-filter/utils/turnObjectDropdownFilterIntoQueryFilter.ts +++ b/packages/twenty-front/src/modules/object-record/record-filter/utils/turnObjectDropdownFilterIntoQueryFilter.ts @@ -10,7 +10,6 @@ import { RecordGqlOperationFilter, RelationFilter, StringFilter, - URLFilter, UUIDFilter, } from '@/object-record/graphql/types/RecordGqlOperationFilter'; import { FilterType } from '@/object-record/object-filter-dropdown/types/FilterType'; @@ -40,8 +39,6 @@ const applyEmptyFilters = ( switch (filterType) { case 'TEXT': - case 'EMAIL': - case 'PHONE': emptyRecordFilter = { or: [ { [correspondingField.name]: { ilike: '' } as StringFilter }, @@ -86,16 +83,6 @@ const applyEmptyFilters = ( }; break; } - case 'LINK': - emptyRecordFilter = { - or: [ - { [correspondingField.name]: { url: { ilike: '' } } as URLFilter }, - { - [correspondingField.name]: { url: { is: 'NULL' } } as URLFilter, - }, - ], - }; - break; case 'LINKS': { const linksFilters = generateILikeFiltersForCompositeFields( '', @@ -305,8 +292,6 @@ export const turnObjectDropdownFilterIntoQueryFilter = ( } switch (rawUIFilter.definition.type) { - case 'EMAIL': - case 'PHONE': case 'TEXT': switch (rawUIFilter.operand) { case ViewFilterOperand.Contains: @@ -627,43 +612,6 @@ export const turnObjectDropdownFilterIntoQueryFilter = ( ); } break; - case 'LINK': - switch (rawUIFilter.operand) { - case ViewFilterOperand.Contains: - objectRecordFilters.push({ - [correspondingField.name]: { - url: { - ilike: `%${rawUIFilter.value}%`, - }, - } as URLFilter, - }); - break; - case ViewFilterOperand.DoesNotContain: - objectRecordFilters.push({ - not: { - [correspondingField.name]: { - url: { - ilike: `%${rawUIFilter.value}%`, - }, - } as URLFilter, - }, - }); - break; - case ViewFilterOperand.IsEmpty: - case ViewFilterOperand.IsNotEmpty: - applyEmptyFilters( - rawUIFilter.operand, - correspondingField, - objectRecordFilters, - rawUIFilter.definition.type, - ); - break; - default: - throw new Error( - `Unknown operand ${rawUIFilter.operand} for ${rawUIFilter.definition.type} filter`, - ); - } - break; case 'LINKS': { const linksFilters = generateILikeFiltersForCompositeFields( rawUIFilter.value, diff --git a/packages/twenty-front/src/modules/object-record/record-index/hooks/useLoadRecordIndexTable.ts b/packages/twenty-front/src/modules/object-record/record-index/hooks/useLoadRecordIndexTable.ts index 36947097459e..df178df4c4fd 100644 --- a/packages/twenty-front/src/modules/object-record/record-index/hooks/useLoadRecordIndexTable.ts +++ b/packages/twenty-front/src/modules/object-record/record-index/hooks/useLoadRecordIndexTable.ts @@ -1,5 +1,6 @@ import { useRecoilValue } from 'recoil'; +import { currentWorkspaceMemberState } from '@/auth/states/currentWorkspaceMemberState'; import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords'; @@ -9,6 +10,7 @@ import { useRecordTableRecordGqlFields } from '@/object-record/record-index/hook import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates'; import { useRecordTable } from '@/object-record/record-table/hooks/useRecordTable'; import { SIGN_IN_BACKGROUND_MOCK_COMPANIES } from '@/sign-in-background-mock/constants/SignInBackgroundMockCompanies'; +import { isNull } from '@sniptt/guards'; import { WorkspaceActivationStatus } from '~/generated/graphql'; export const useFindManyParams = ( @@ -43,6 +45,7 @@ export const useLoadRecordIndexTable = (objectNameSingular: string) => { const { setRecordTableData, setIsRecordTableInitialLoading } = useRecordTable(); const currentWorkspace = useRecoilValue(currentWorkspaceState); + const currentWorkspaceMember = useRecoilValue(currentWorkspaceMemberState); const params = useFindManyParams(objectNameSingular); const recordGqlFields = useRecordTableRecordGqlFields({ objectMetadataItem }); @@ -63,6 +66,7 @@ export const useLoadRecordIndexTable = (objectNameSingular: string) => { onError: () => { setIsRecordTableInitialLoading(false); }, + skip: isNull(currentWorkspaceMember), }); return { diff --git a/packages/twenty-front/src/modules/object-record/record-index/options/hooks/__tests__/useTableData.test.tsx b/packages/twenty-front/src/modules/object-record/record-index/options/hooks/__tests__/useTableData.test.tsx index 752deafc8e7f..d670b908cb22 100644 --- a/packages/twenty-front/src/modules/object-record/record-index/options/hooks/__tests__/useTableData.test.tsx +++ b/packages/twenty-front/src/modules/object-record/record-index/options/hooks/__tests__/useTableData.test.tsx @@ -1,18 +1,18 @@ -import { act, renderHook, waitFor } from '@testing-library/react'; -import { ReactNode } from 'react'; +import { renderHook, waitFor } from '@testing-library/react'; +import { act } from 'react'; import { percentage, sleep, useTableData } from '../useTableData'; +import { PERSON_FRAGMENT_WITH_DEPTH_ZERO_RELATIONS } from '@/object-record/hooks/__mocks__/personFragments'; import { useRecordBoard } from '@/object-record/record-board/hooks/useRecordBoard'; import { recordBoardKanbanFieldMetadataNameComponentState } from '@/object-record/record-board/states/recordBoardKanbanFieldMetadataNameComponentState'; import { useRecordIndexOptionsForBoard } from '@/object-record/record-index/options/hooks/useRecordIndexOptionsForBoard'; -import { SnackBarManagerScopeInternalContext } from '@/ui/feedback/snack-bar-manager/scopes/scope-internal-context/SnackBarManagerScopeInternalContext'; import { extractComponentState } from '@/ui/utilities/state/component-state/utils/extractComponentState'; import { ViewType } from '@/views/types/ViewType'; -import { MockedProvider, MockedResponse } from '@apollo/client/testing'; +import { MockedResponse } from '@apollo/client/testing'; import gql from 'graphql-tag'; -import { BrowserRouter as Router } from 'react-router-dom'; -import { RecoilRoot, useRecoilValue } from 'recoil'; -import { generatedMockObjectMetadataItems } from '~/testing/mock-data/objectMetadataItems'; +import { useRecoilValue } from 'recoil'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; const defaultResponseData = { pageInfo: { @@ -23,10 +23,10 @@ const defaultResponseData = { }, totalCount: 1, }; + const mockPerson = { __typename: 'Person', updatedAt: '2021-08-03T19:20:06.000Z', - myCustomObjectId: '123', whatsapp: { primaryPhoneNumber: '+1', primaryPhoneCountryCode: '234-567-890', @@ -41,7 +41,10 @@ const mockPerson = { firstName: 'firstName', lastName: 'lastName', }, - email: 'email', + emails: { + primaryEmail: 'email', + additionalEmails: [], + }, position: 'position', createdBy: { source: 'source', @@ -57,7 +60,7 @@ const mockPerson = { }, performanceRating: 1, createdAt: '2021-08-03T19:20:06.000Z', - phone: { + phones: { primaryPhoneNumber: '+1', primaryPhoneCountryCode: '234-567-890', additionalPhones: [], @@ -66,8 +69,10 @@ const mockPerson = { city: 'city', companyId: '1', intro: 'intro', - workPreference: 'workPrefereance', + deletedAt: null, + workPreference: 'workPreference', }; + const mocks: MockedResponse[] = [ { request: { @@ -86,52 +91,7 @@ const mocks: MockedResponse[] = [ ) { edges { node { - __typename - name { - firstName - lastName - } - linkedinLink { - primaryLinkUrl - primaryLinkLabel - secondaryLinks - } - deletedAt - createdAt - updatedAt - jobTitle - intro - workPrefereance - performanceRating - xLink { - primaryLinkUrl - primaryLinkLabel - secondaryLinks - } - city - companyId - phones { - primaryPhoneNumber - primaryPhoneCountryCode - additionalPhones - } - createdBy { - source - workspaceMemberId - name - } - id - position - emails { - primaryEmail - additionalEmails - } - avatarUrl - whatsapp { - primaryPhoneNumber - primaryPhoneCountryCode - additionalPhones - } + ${PERSON_FRAGMENT_WITH_DEPTH_ZERO_RELATIONS} } cursor } @@ -167,21 +127,9 @@ const mocks: MockedResponse[] = [ }, ]; -const Wrapper = ({ children }: { children: ReactNode }) => ( - - - - - {children} - - - - -); +const WrapperWithResponse = getJestMetadataAndApolloMocksWrapper({ + apolloMocks: mocks, +}); const graphqlEmptyResponse = [ { @@ -197,21 +145,9 @@ const graphqlEmptyResponse = [ }, ]; -const WrapperWithEmptyResponse = ({ children }: { children: ReactNode }) => ( - - - - - {children} - - - - -); +const WrapperWithEmptyResponse = getJestMetadataAndApolloMocksWrapper({ + apolloMocks: graphqlEmptyResponse, +}); describe('useTableData', () => { const recordIndexId = 'people'; @@ -225,6 +161,7 @@ describe('useTableData', () => { useTableData({ recordIndexId, objectNameSingular, + pageSize: 30, callback, delayMs: 0, viewType: ViewType.Kanban, @@ -249,10 +186,11 @@ describe('useTableData', () => { recordIndexId, objectNameSingular, callback, + pageSize: 30, delayMs: 0, }), - { wrapper: Wrapper }, + { wrapper: WrapperWithResponse }, ); await act(async () => { @@ -292,7 +230,7 @@ describe('useTableData', () => { }; }, { - wrapper: Wrapper, + wrapper: WrapperWithResponse, }, ); @@ -340,8 +278,10 @@ describe('useTableData', () => { relationObjectMetadataNameSingular: '', relationType: undefined, targetFieldMetadataName: '', + settings: {}, }, position: 7, + settings: {}, showLabel: undefined, size: 100, type: 'DATE_TIME', @@ -379,7 +319,7 @@ describe('useTableData', () => { }; }, { - wrapper: Wrapper, + wrapper: WrapperWithResponse, }, ); diff --git a/packages/twenty-front/src/modules/object-record/record-show/record-detail-section/components/__stories__/RecordDetailRelationSection.stories.tsx b/packages/twenty-front/src/modules/object-record/record-show/record-detail-section/components/__stories__/RecordDetailRelationSection.stories.tsx index 06cb79025bc5..aca53588e1be 100644 --- a/packages/twenty-front/src/modules/object-record/record-show/record-detail-section/components/__stories__/RecordDetailRelationSection.stories.tsx +++ b/packages/twenty-front/src/modules/object-record/record-show/record-detail-section/components/__stories__/RecordDetailRelationSection.stories.tsx @@ -9,15 +9,23 @@ import { RecordStoreDecorator } from '~/testing/decorators/RecordStoreDecorator' import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator'; import { graphqlMocks } from '~/testing/graphqlMocks'; import { getCompaniesMock } from '~/testing/mock-data/companies'; -import { mockedCompanyObjectMetadataItem } from '~/testing/mock-data/metadata'; import { getPeopleMock } from '~/testing/mock-data/people'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; import { RecordDetailRelationSection } from '../RecordDetailRelationSection'; const companiesMock = getCompaniesMock(); const peopleMock = getPeopleMock(); +const mockedCompanyObjectMetadataItem = generatedMockObjectMetadataItems.find( + (item) => item.nameSingular === 'company', +); + +if (!mockedCompanyObjectMetadataItem) { + throw new Error('Company object metadata item not found'); +} + const meta: Meta = { title: 'Modules/ObjectRecord/RecordShow/RecordDetailSection/RecordDetailRelationSection', diff --git a/packages/twenty-front/src/modules/object-record/record-table/components/__stories__/perf/RecordTableCell.perf.stories.tsx b/packages/twenty-front/src/modules/object-record/record-table/components/__stories__/perf/RecordTableCell.perf.stories.tsx index 9b68416e8192..b866e344842f 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/components/__stories__/perf/RecordTableCell.perf.stories.tsx +++ b/packages/twenty-front/src/modules/object-record/record-table/components/__stories__/perf/RecordTableCell.perf.stories.tsx @@ -21,7 +21,7 @@ import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorato import { getProfilingStory } from '~/testing/profiling/utils/getProfilingStory'; import { RecordTableCellFieldContextWrapper } from '@/object-record/record-table/record-table-cell/components/RecordTableCellFieldContextWrapper'; -import { generatedMockObjectMetadataItems } from '~/testing/mock-data/objectMetadataItems'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; import { mockPerformance } from './mock'; const RelationFieldValueSetterEffect = () => { diff --git a/packages/twenty-front/src/modules/object-record/record-table/record-table-cell/hooks/__tests__/useUpsertRecord.test.tsx b/packages/twenty-front/src/modules/object-record/record-table/record-table-cell/hooks/__tests__/useUpsertRecord.test.tsx index e592107c5a1b..cf18193570e2 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/record-table-cell/hooks/__tests__/useUpsertRecord.test.tsx +++ b/packages/twenty-front/src/modules/object-record/record-table/record-table-cell/hooks/__tests__/useUpsertRecord.test.tsx @@ -10,7 +10,7 @@ import { textfieldDefinition } from '@/object-record/record-field/__mocks__/fiel import { FieldContext } from '@/object-record/record-field/contexts/FieldContext'; import { useUpsertRecord } from '@/object-record/record-table/record-table-cell/hooks/useUpsertRecord'; import { TableHotkeyScope } from '@/object-record/record-table/types/TableHotkeyScope'; -import { generatedMockObjectMetadataItems } from '~/testing/mock-data/objectMetadataItems'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; const draftValue = 'updated Name'; diff --git a/packages/twenty-front/src/modules/object-record/relation-picker/hooks/__tests__/useMultiObjectRecordsQueryResultFormattedAsObjectRecordForSelectArray.test.tsx b/packages/twenty-front/src/modules/object-record/relation-picker/hooks/__tests__/useMultiObjectRecordsQueryResultFormattedAsObjectRecordForSelectArray.test.tsx index 9eb2e7b3642e..0aeca9fcb3aa 100644 --- a/packages/twenty-front/src/modules/object-record/relation-picker/hooks/__tests__/useMultiObjectRecordsQueryResultFormattedAsObjectRecordForSelectArray.test.tsx +++ b/packages/twenty-front/src/modules/object-record/relation-picker/hooks/__tests__/useMultiObjectRecordsQueryResultFormattedAsObjectRecordForSelectArray.test.tsx @@ -4,7 +4,7 @@ import { RecoilRoot, useSetRecoilState } from 'recoil'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; import { useMultiObjectRecordsQueryResultFormattedAsObjectRecordForSelectArray } from '@/object-record/relation-picker/hooks/useMultiObjectRecordsQueryResultFormattedAsObjectRecordForSelectArray'; import { RelationPickerScopeInternalContext } from '@/object-record/relation-picker/scopes/scope-internal-context/RelationPickerScopeInternalContext'; -import { generatedMockObjectMetadataItems } from '~/testing/mock-data/objectMetadataItems'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; const scopeId = 'scopeId'; const Wrapper = ({ children }: { children: React.ReactNode }) => ( diff --git a/packages/twenty-front/src/modules/object-record/spreadsheet-import/__tests__/useOpenObjectRecordsSpreasheetImportDialog.test.tsx b/packages/twenty-front/src/modules/object-record/spreadsheet-import/__tests__/useOpenObjectRecordsSpreasheetImportDialog.test.tsx index da745581eb75..a7e47f8ba713 100644 --- a/packages/twenty-front/src/modules/object-record/spreadsheet-import/__tests__/useOpenObjectRecordsSpreasheetImportDialog.test.tsx +++ b/packages/twenty-front/src/modules/object-record/spreadsheet-import/__tests__/useOpenObjectRecordsSpreasheetImportDialog.test.tsx @@ -1,13 +1,12 @@ import { gql } from '@apollo/client'; -import { MockedProvider } from '@apollo/client/testing'; -import { act, renderHook, waitFor } from '@testing-library/react'; -import { ReactNode } from 'react'; -import { RecoilRoot, useRecoilValue } from 'recoil'; +import { renderHook, waitFor } from '@testing-library/react'; +import { act } from 'react'; +import { useRecoilValue } from 'recoil'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { spreadsheetImportDialogState } from '@/spreadsheet-import/states/spreadsheetImportDialogState'; -import { SnackBarManagerScopeInternalContext } from '@/ui/feedback/snack-bar-manager/scopes/scope-internal-context/SnackBarManagerScopeInternalContext'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; import { useOpenObjectRecordsSpreasheetImportDialog } from '../hooks/useOpenObjectRecordsSpreasheetImportDialog'; const companyId = 'cb2e9f4b-20c3-4759-9315-4ffeecfaf71a'; @@ -26,13 +25,42 @@ const companyMocks = [ ) { createCompanies(data: $data, upsert: $upsert) { __typename - updatedAt - domainName { - primaryLinkUrl - primaryLinkLabel - secondaryLinks + accountOwner { + __typename + avatarUrl + colorScheme + createdAt + dateFormat + deletedAt + id + locale + name { + firstName + lastName + } + timeFormat + timeZone + updatedAt + userEmail + userId + } + accountOwnerId + activityTargets { + edges { + node { + __typename + activityId + companyId + createdAt + deletedAt + id + opportunityId + personId + rocketId + updatedAt + } + } } - visaSponsorship address { addressStreet1 addressStreet2 @@ -43,20 +71,31 @@ const companyMocks = [ addressLat addressLng } - position - employees - deletedAt - accountOwnerId annualRecurringRevenue { amountMicros currencyCode } - id - name - xLink { - primaryLinkUrl - primaryLinkLabel - secondaryLinks + attachments { + edges { + node { + __typename + activityId + authorId + companyId + createdAt + deletedAt + fullPath + id + name + noteId + opportunityId + personId + rocketId + taskId + type + updatedAt + } + } } createdAt createdBy { @@ -64,7 +103,36 @@ const companyMocks = [ workspaceMemberId name } - workPolicy + deletedAt + domainName { + primaryLinkUrl + primaryLinkLabel + secondaryLinks + } + employees + favorites { + edges { + node { + __typename + companyId + createdAt + deletedAt + id + noteId + opportunityId + personId + position + rocketId + taskId + updatedAt + viewId + workflowId + workspaceMemberId + } + } + } + id + idealCustomerProfile introVideo { primaryLinkUrl primaryLinkLabel @@ -75,8 +143,151 @@ const companyMocks = [ primaryLinkLabel secondaryLinks } + name + noteTargets { + edges { + node { + __typename + companyId + createdAt + deletedAt + id + noteId + opportunityId + personId + rocketId + updatedAt + } + } + } + opportunities { + edges { + node { + __typename + amount { + amountMicros + currencyCode + } + closeDate + companyId + createdAt + createdBy { + source + workspaceMemberId + name + } + deletedAt + id + name + pointOfContactId + position + stage + updatedAt + } + } + } + people { + edges { + node { + __typename + avatarUrl + city + companyId + createdAt + createdBy { + source + workspaceMemberId + name + } + deletedAt + emails { + primaryEmail + additionalEmails + } + id + intro + jobTitle + linkedinLink { + primaryLinkUrl + primaryLinkLabel + secondaryLinks + } + name { + firstName + lastName + } + performanceRating + phones { + primaryPhoneNumber + primaryPhoneCountryCode + additionalPhones + } + position + updatedAt + whatsapp { + primaryPhoneNumber + primaryPhoneCountryCode + additionalPhones + } + workPreference + xLink { + primaryLinkUrl + primaryLinkLabel + secondaryLinks + } + } + } + } + position tagline - idealCustomerProfile + taskTargets { + edges { + node { + __typename + companyId + createdAt + deletedAt + id + opportunityId + personId + rocketId + taskId + updatedAt + } + } + } + timelineActivities { + edges { + node { + __typename + companyId + createdAt + deletedAt + happensAt + id + linkedObjectMetadataId + linkedRecordCachedName + linkedRecordId + name + noteId + opportunityId + personId + properties + rocketId + taskId + updatedAt + workspaceMemberId + } + } + } + updatedAt + visaSponsorship + workPolicy + xLink { + primaryLinkUrl + primaryLinkLabel + secondaryLinks + } } } `, @@ -99,6 +310,9 @@ const companyMocks = [ createCompanies: [ { id: companyId, + favorites: { + edges: [], + }, }, ], }, @@ -112,17 +326,9 @@ const fakeCsv = () => { return new File([blob], 'fakeData.csv', { type: 'text/csv' }); }; -const Wrapper = ({ children }: { children: ReactNode }) => ( - - - - {children} - - - -); +const Wrapper = getJestMetadataAndApolloMocksWrapper({ + apolloMocks: companyMocks, +}); // TODO: improve object metadata item seeds to have more field types to add tests on composite fields here describe('useSpreadsheetCompanyImport', () => { diff --git a/packages/twenty-front/src/modules/search/hooks/__tests__/useFilteredSearchEntityQuery.test.tsx b/packages/twenty-front/src/modules/search/hooks/__tests__/useFilteredSearchEntityQuery.test.tsx index 83fa74e7b864..263b70decf0f 100644 --- a/packages/twenty-front/src/modules/search/hooks/__tests__/useFilteredSearchEntityQuery.test.tsx +++ b/packages/twenty-front/src/modules/search/hooks/__tests__/useFilteredSearchEntityQuery.test.tsx @@ -8,7 +8,7 @@ import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadat import { EntitiesForMultipleEntitySelect } from '@/object-record/relation-picker/types/EntitiesForMultipleEntitySelect'; import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope'; -import { generatedMockObjectMetadataItems } from '~/testing/mock-data/objectMetadataItems'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; import { query, responseData, diff --git a/packages/twenty-front/src/modules/settings/accounts/components/__stories__/SettingsAccountsCalendarChannelDetails.stories.tsx b/packages/twenty-front/src/modules/settings/accounts/components/__stories__/SettingsAccountsCalendarChannelDetails.stories.tsx index 5ef756baf4c6..a4e9f5294e83 100644 --- a/packages/twenty-front/src/modules/settings/accounts/components/__stories__/SettingsAccountsCalendarChannelDetails.stories.tsx +++ b/packages/twenty-front/src/modules/settings/accounts/components/__stories__/SettingsAccountsCalendarChannelDetails.stories.tsx @@ -3,12 +3,18 @@ import { ComponentDecorator } from 'twenty-ui'; import { SettingsAccountsCalendarChannelDetails } from '@/settings/accounts/components/SettingsAccountsCalendarChannelDetails'; import { CalendarChannelVisibility } from '~/generated/graphql'; +import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator'; +import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator'; const meta: Meta = { title: 'Modules/Settings/Accounts/CalendarChannels/SettingsAccountsCalendarChannelDetails', component: SettingsAccountsCalendarChannelDetails, - decorators: [ComponentDecorator], + decorators: [ + ComponentDecorator, + ObjectMetadataItemsDecorator, + SnackBarDecorator, + ], args: { calendarChannel: { id: '20202020-ef5a-4822-9e08-ce6e6a4dcb6a', diff --git a/packages/twenty-front/src/modules/settings/accounts/components/__stories__/SettingsAccountsCalendarChannelsGeneral.stories.tsx b/packages/twenty-front/src/modules/settings/accounts/components/__stories__/SettingsAccountsCalendarChannelsGeneral.stories.tsx index 49f279316908..83c05df92b98 100644 --- a/packages/twenty-front/src/modules/settings/accounts/components/__stories__/SettingsAccountsCalendarChannelsGeneral.stories.tsx +++ b/packages/twenty-front/src/modules/settings/accounts/components/__stories__/SettingsAccountsCalendarChannelsGeneral.stories.tsx @@ -2,12 +2,18 @@ import { Meta, StoryObj } from '@storybook/react'; import { ComponentDecorator } from 'twenty-ui'; import { SettingsAccountsCalendarChannelsGeneral } from '@/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral'; +import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator'; +import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator'; const meta: Meta = { title: 'Modules/Settings/Accounts/CalendarChannels/SettingsAccountsCalendarChannelsGeneral', component: SettingsAccountsCalendarChannelsGeneral, - decorators: [ComponentDecorator], + decorators: [ + ComponentDecorator, + ObjectMetadataItemsDecorator, + SnackBarDecorator, + ], }; export default meta; diff --git a/packages/twenty-front/src/modules/settings/accounts/components/__stories__/SettingsAccountsMessageChannelDetails.stories.tsx b/packages/twenty-front/src/modules/settings/accounts/components/__stories__/SettingsAccountsMessageChannelDetails.stories.tsx index 02264d8e66fe..a951150c94f3 100644 --- a/packages/twenty-front/src/modules/settings/accounts/components/__stories__/SettingsAccountsMessageChannelDetails.stories.tsx +++ b/packages/twenty-front/src/modules/settings/accounts/components/__stories__/SettingsAccountsMessageChannelDetails.stories.tsx @@ -4,12 +4,18 @@ import { ComponentDecorator } from 'twenty-ui'; import { MessageChannelContactAutoCreationPolicy } from '@/accounts/types/MessageChannel'; import { SettingsAccountsMessageChannelDetails } from '@/settings/accounts/components/SettingsAccountsMessageChannelDetails'; import { MessageChannelVisibility } from '~/generated/graphql'; +import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator'; +import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator'; const meta: Meta = { title: 'Modules/Settings/Accounts/MessageChannels/SettingsAccountsMessageChannelDetails', component: SettingsAccountsMessageChannelDetails, - decorators: [ComponentDecorator], + decorators: [ + ComponentDecorator, + ObjectMetadataItemsDecorator, + SnackBarDecorator, + ], args: { messageChannel: { id: '20202020-ef5a-4822-9e08-ce6e6a4dcb6a', diff --git a/packages/twenty-front/src/modules/settings/data-model/fields/forms/components/__stories__/SettingsDataModelFieldDescriptionForm.stories.tsx b/packages/twenty-front/src/modules/settings/data-model/fields/forms/components/__stories__/SettingsDataModelFieldDescriptionForm.stories.tsx index 7499adea0338..58f33bf2210f 100644 --- a/packages/twenty-front/src/modules/settings/data-model/fields/forms/components/__stories__/SettingsDataModelFieldDescriptionForm.stories.tsx +++ b/packages/twenty-front/src/modules/settings/data-model/fields/forms/components/__stories__/SettingsDataModelFieldDescriptionForm.stories.tsx @@ -3,7 +3,7 @@ import { ComponentDecorator } from 'twenty-ui'; import { FormProviderDecorator } from '~/testing/decorators/FormProviderDecorator'; -import { mockedPersonObjectMetadataItem } from '~/testing/mock-data/metadata'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; import { SettingsDataModelFieldDescriptionForm } from '../SettingsDataModelFieldDescriptionForm'; const meta: Meta = { @@ -25,11 +25,15 @@ type Story = StoryObj; export const Default: Story = {}; +const mockedPersonObjectMetadataItem = generatedMockObjectMetadataItems.find( + (item) => item.namePlural === 'person', +); + export const WithFieldMetadataItem: Story = { args: { - fieldMetadataItem: mockedPersonObjectMetadataItem.fields.find( + fieldMetadataItem: mockedPersonObjectMetadataItem?.fields.find( ({ description }) => description === 'description', - )!, + ), }, }; diff --git a/packages/twenty-front/src/modules/settings/data-model/fields/forms/components/__stories__/SettingsDataModelFieldIconLabelForm.stories.tsx b/packages/twenty-front/src/modules/settings/data-model/fields/forms/components/__stories__/SettingsDataModelFieldIconLabelForm.stories.tsx index 150efdc46683..555db1bc92d1 100644 --- a/packages/twenty-front/src/modules/settings/data-model/fields/forms/components/__stories__/SettingsDataModelFieldIconLabelForm.stories.tsx +++ b/packages/twenty-front/src/modules/settings/data-model/fields/forms/components/__stories__/SettingsDataModelFieldIconLabelForm.stories.tsx @@ -5,7 +5,7 @@ import { ComponentDecorator } from 'twenty-ui'; import { FormProviderDecorator } from '~/testing/decorators/FormProviderDecorator'; import { IconsProviderDecorator } from '~/testing/decorators/IconsProviderDecorator'; -import { mockedPersonObjectMetadataItem } from '~/testing/mock-data/metadata'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; import { SettingsDataModelFieldIconLabelForm } from '../SettingsDataModelFieldIconLabelForm'; const StyledContainer = styled.div` @@ -32,11 +32,15 @@ type Story = StoryObj; export const Default: Story = {}; +const mockedPersonObjectMetadataItem = generatedMockObjectMetadataItems.find( + (item) => item.namePlural === 'person', +); + export const WithFieldMetadataItem: Story = { args: { - fieldMetadataItem: mockedPersonObjectMetadataItem.fields.find( + fieldMetadataItem: mockedPersonObjectMetadataItem?.fields.find( ({ name }) => name === 'name', - )!, + ), }, }; diff --git a/packages/twenty-front/src/modules/settings/data-model/fields/forms/components/__stories__/SettingsDataModelFieldSettingsFormCard.stories.tsx b/packages/twenty-front/src/modules/settings/data-model/fields/forms/components/__stories__/SettingsDataModelFieldSettingsFormCard.stories.tsx index aff46aa2da0e..09aaf60c282c 100644 --- a/packages/twenty-front/src/modules/settings/data-model/fields/forms/components/__stories__/SettingsDataModelFieldSettingsFormCard.stories.tsx +++ b/packages/twenty-front/src/modules/settings/data-model/fields/forms/components/__stories__/SettingsDataModelFieldSettingsFormCard.stories.tsx @@ -7,10 +7,18 @@ import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorato import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator'; import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator'; import { graphqlMocks } from '~/testing/graphqlMocks'; -import { mockedCompanyObjectMetadataItem } from '~/testing/mock-data/metadata'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; import { SettingsDataModelFieldSettingsFormCard } from '../SettingsDataModelFieldSettingsFormCard'; +const mockedCompanyObjectMetadataItem = generatedMockObjectMetadataItems.find( + (item) => item.nameSingular === 'company', +); + +if (!mockedCompanyObjectMetadataItem) { + throw new Error('Company object metadata item not found'); +} + const fieldMetadataItem = mockedCompanyObjectMetadataItem.fields.find( ({ type }) => type === FieldMetadataType.Text, )!; diff --git a/packages/twenty-front/src/modules/settings/data-model/fields/preview/components/__stories__/SettingsDataModelFieldPreviewCard.stories.tsx b/packages/twenty-front/src/modules/settings/data-model/fields/preview/components/__stories__/SettingsDataModelFieldPreviewCard.stories.tsx index 3df8c6e7664a..6b0fb477eef2 100644 --- a/packages/twenty-front/src/modules/settings/data-model/fields/preview/components/__stories__/SettingsDataModelFieldPreviewCard.stories.tsx +++ b/packages/twenty-front/src/modules/settings/data-model/fields/preview/components/__stories__/SettingsDataModelFieldPreviewCard.stories.tsx @@ -6,14 +6,23 @@ import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorato import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator'; import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator'; import { graphqlMocks } from '~/testing/graphqlMocks'; -import { - mockedCompanyObjectMetadataItem, - mockedOpportunityObjectMetadataItem, - mockedPersonObjectMetadataItem, -} from '~/testing/mock-data/metadata'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; import { SettingsDataModelFieldPreviewCard } from '../SettingsDataModelFieldPreviewCard'; +const mockedCompanyObjectMetadataItem = generatedMockObjectMetadataItems.find( + (item) => item.nameSingular === 'company', +); + +const mockedOpportunityObjectMetadataItem = + generatedMockObjectMetadataItems.find( + (item) => item.nameSingular === 'opportunity', + ); + +const mockedPersonObjectMetadataItem = generatedMockObjectMetadataItems.find( + (item) => item.nameSingular === 'person', +); + const meta: Meta = { title: 'Modules/Settings/DataModel/Fields/Preview/SettingsDataModelFieldPreviewCard', @@ -38,7 +47,7 @@ type Story = StoryObj; export const LabelIdentifier: Story = { args: { - fieldMetadataItem: mockedPersonObjectMetadataItem.fields.find( + fieldMetadataItem: mockedPersonObjectMetadataItem?.fields.find( ({ name, type }) => name === 'name' && type === FieldMetadataType.FullName, ), @@ -47,7 +56,7 @@ export const LabelIdentifier: Story = { export const Text: Story = { args: { - fieldMetadataItem: mockedPersonObjectMetadataItem.fields.find( + fieldMetadataItem: mockedPersonObjectMetadataItem?.fields.find( ({ name, type }) => name === 'city' && type === FieldMetadataType.Text, ), }, @@ -55,7 +64,7 @@ export const Text: Story = { export const Boolean: Story = { args: { - fieldMetadataItem: mockedCompanyObjectMetadataItem.fields.find( + fieldMetadataItem: mockedCompanyObjectMetadataItem?.fields.find( ({ name, type }) => name === 'idealCustomerProfile' && type === FieldMetadataType.Boolean, ), @@ -65,7 +74,7 @@ export const Boolean: Story = { export const Currency: Story = { args: { - fieldMetadataItem: mockedCompanyObjectMetadataItem.fields.find( + fieldMetadataItem: mockedCompanyObjectMetadataItem?.fields.find( ({ name, type }) => name === 'annualRecurringRevenue' && type === FieldMetadataType.Currency, @@ -76,7 +85,7 @@ export const Currency: Story = { export const Date: Story = { args: { - fieldMetadataItem: mockedCompanyObjectMetadataItem.fields.find( + fieldMetadataItem: mockedCompanyObjectMetadataItem?.fields.find( ({ type }) => type === FieldMetadataType.DateTime, ), objectMetadataItem: mockedCompanyObjectMetadataItem, @@ -85,7 +94,7 @@ export const Date: Story = { export const Links: Story = { args: { - fieldMetadataItem: mockedCompanyObjectMetadataItem.fields.find( + fieldMetadataItem: mockedCompanyObjectMetadataItem?.fields.find( ({ name, type }) => name === 'linkedinLink' && type === FieldMetadataType.Links, ), @@ -95,7 +104,7 @@ export const Links: Story = { export const Number: Story = { args: { - fieldMetadataItem: mockedCompanyObjectMetadataItem.fields.find( + fieldMetadataItem: mockedCompanyObjectMetadataItem?.fields.find( ({ type }) => type === FieldMetadataType.Number, ), objectMetadataItem: mockedCompanyObjectMetadataItem, @@ -114,7 +123,7 @@ export const Rating: Story = { export const Relation: Story = { args: { - fieldMetadataItem: mockedPersonObjectMetadataItem.fields.find( + fieldMetadataItem: mockedPersonObjectMetadataItem?.fields.find( ({ name }) => name === 'company', ), relationObjectMetadataItem: mockedCompanyObjectMetadataItem, @@ -123,7 +132,7 @@ export const Relation: Story = { export const Select: Story = { args: { - fieldMetadataItem: mockedOpportunityObjectMetadataItem.fields.find( + fieldMetadataItem: mockedOpportunityObjectMetadataItem?.fields.find( ({ name, type }) => name === 'stage' && type === FieldMetadataType.Select, ), objectMetadataItem: mockedOpportunityObjectMetadataItem, diff --git a/packages/twenty-front/src/modules/settings/data-model/fields/preview/hooks/__tests__/useFieldPreviewValue.test.tsx b/packages/twenty-front/src/modules/settings/data-model/fields/preview/hooks/__tests__/useFieldPreviewValue.test.tsx index a3fbadbf1a24..c9c6b0d4367b 100644 --- a/packages/twenty-front/src/modules/settings/data-model/fields/preview/hooks/__tests__/useFieldPreviewValue.test.tsx +++ b/packages/twenty-front/src/modules/settings/data-model/fields/preview/hooks/__tests__/useFieldPreviewValue.test.tsx @@ -1,35 +1,34 @@ -import { ReactNode } from 'react'; -import { MockedProvider } from '@apollo/client/testing'; import { renderHook } from '@testing-library/react'; -import { RecoilRoot } from 'recoil'; -import { ObjectMetadataItemsProvider } from '@/object-metadata/components/ObjectMetadataItemsProvider'; import { FieldMetadataItemOption } from '@/object-metadata/types/FieldMetadataItem'; -import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope'; import { FieldMetadataType } from '~/generated/graphql'; -import { - mockedCompanyObjectMetadataItem, - mockedOpportunityObjectMetadataItem, - mockedPersonObjectMetadataItem, -} from '~/testing/mock-data/metadata'; +import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; import { useFieldPreviewValue } from '../useFieldPreviewValue'; -const Wrapper = ({ children }: { children: ReactNode }) => ( - - - - {children} - - - +const mockedCompanyObjectMetadataItem = generatedMockObjectMetadataItems.find( + (item) => item.nameSingular === 'company', ); +const mockedOpportunityObjectMetadataItem = + generatedMockObjectMetadataItems.find( + (item) => item.nameSingular === 'opportunity', + ); + +const mockedPersonObjectMetadataItem = generatedMockObjectMetadataItems.find( + (item) => item.nameSingular === 'person', +); + +const Wrapper = getJestMetadataAndApolloMocksWrapper({ + apolloMocks: [], +}); + describe('useFieldPreviewValue', () => { it('returns null if skip is true', () => { // Given const fieldName = 'amount'; - const fieldMetadataItem = mockedOpportunityObjectMetadataItem.fields.find( + const fieldMetadataItem = mockedOpportunityObjectMetadataItem?.fields.find( ({ name, type }) => name === fieldName && type === FieldMetadataType.Currency, ); @@ -52,7 +51,7 @@ describe('useFieldPreviewValue', () => { it("returns the field's preview value for a Currency field", () => { // Given const fieldName = 'amount'; - const fieldMetadataItem = mockedOpportunityObjectMetadataItem.fields.find( + const fieldMetadataItem = mockedOpportunityObjectMetadataItem?.fields.find( ({ name, type }) => name === fieldName && type === FieldMetadataType.Currency, ); @@ -106,7 +105,7 @@ describe('useFieldPreviewValue', () => { it("returns the field's preview value for a Select field", () => { // Given const fieldName = 'stage'; - const fieldMetadataItem = mockedOpportunityObjectMetadataItem.fields.find( + const fieldMetadataItem = mockedOpportunityObjectMetadataItem?.fields.find( ({ name, type }) => name === fieldName && type === FieldMetadataType.Select, ); @@ -169,7 +168,7 @@ describe('useFieldPreviewValue', () => { it("returns the field's preview value for other field types", () => { // Given const fieldName = 'employees'; - const fieldMetadataItem = mockedCompanyObjectMetadataItem.fields.find( + const fieldMetadataItem = mockedCompanyObjectMetadataItem?.fields.find( ({ name }) => name === fieldName, ); diff --git a/packages/twenty-front/src/modules/settings/data-model/fields/preview/utils/__tests__/getCurrencyFieldPreviewValue.test.ts b/packages/twenty-front/src/modules/settings/data-model/fields/preview/utils/__tests__/getCurrencyFieldPreviewValue.test.ts index a8d9b9a4af7e..8eeda74fbb79 100644 --- a/packages/twenty-front/src/modules/settings/data-model/fields/preview/utils/__tests__/getCurrencyFieldPreviewValue.test.ts +++ b/packages/twenty-front/src/modules/settings/data-model/fields/preview/utils/__tests__/getCurrencyFieldPreviewValue.test.ts @@ -1,16 +1,22 @@ import { CurrencyCode } from '@/object-record/record-field/types/CurrencyCode'; import { FieldMetadataType } from '~/generated-metadata/graphql'; -import { - mockedCompanyObjectMetadataItem, - mockedOpportunityObjectMetadataItem, -} from '~/testing/mock-data/metadata'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; import { getCurrencyFieldPreviewValue } from '../getCurrencyFieldPreviewValue'; +const mockedCompanyObjectMetadataItem = generatedMockObjectMetadataItems.find( + (item) => item.nameSingular === 'company', +); + +const mockedOpportunityObjectMetadataItem = + generatedMockObjectMetadataItems.find( + (item) => item.nameSingular === 'opportunity', + ); + describe('getCurrencyFieldPreviewValue', () => { it('returns null if the field is not a Currency field', () => { // Given - const fieldMetadataItem = mockedCompanyObjectMetadataItem.fields.find( + const fieldMetadataItem = mockedCompanyObjectMetadataItem?.fields.find( ({ type }) => type !== FieldMetadataType.Currency, ); @@ -26,7 +32,7 @@ describe('getCurrencyFieldPreviewValue', () => { }); const fieldName = 'amount'; - const fieldMetadataItem = mockedOpportunityObjectMetadataItem.fields.find( + const fieldMetadataItem = mockedOpportunityObjectMetadataItem?.fields.find( ({ name, type }) => name === fieldName && type === FieldMetadataType.Currency, ); diff --git a/packages/twenty-front/src/modules/settings/data-model/fields/preview/utils/__tests__/getFieldPreviewValue.test.ts b/packages/twenty-front/src/modules/settings/data-model/fields/preview/utils/__tests__/getFieldPreviewValue.test.ts index 7acf2b0cfe4c..c3a649dbad77 100644 --- a/packages/twenty-front/src/modules/settings/data-model/fields/preview/utils/__tests__/getFieldPreviewValue.test.ts +++ b/packages/twenty-front/src/modules/settings/data-model/fields/preview/utils/__tests__/getFieldPreviewValue.test.ts @@ -1,17 +1,21 @@ import { getFieldPreviewValue } from '@/settings/data-model/fields/preview/utils/getFieldPreviewValue'; import { getSettingsFieldTypeConfig } from '@/settings/data-model/utils/getSettingsFieldTypeConfig'; import { FieldMetadataType } from '~/generated-metadata/graphql'; -import { - mockedCompanyObjectMetadataItem, - mockedCustomObjectMetadataItem, - mockedPersonObjectMetadataItem, -} from '~/testing/mock-data/metadata'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; + +const mockedCompanyObjectMetadataItem = generatedMockObjectMetadataItems.find( + (item) => item.nameSingular === 'company', +); + +const mockedPersonObjectMetadataItem = generatedMockObjectMetadataItems.find( + (item) => item.nameSingular === 'person', +); describe('getFieldPreviewValue', () => { it("returns the field's defaultValue from metadata if it exists", () => { // Given const fieldName = 'idealCustomerProfile'; - const fieldMetadataItem = mockedCompanyObjectMetadataItem.fields.find( + const fieldMetadataItem = mockedCompanyObjectMetadataItem?.fields.find( ({ name }) => name === fieldName, ); @@ -29,7 +33,7 @@ describe('getFieldPreviewValue', () => { it('returns a placeholder defaultValue if the field metadata does not have a defaultValue', () => { // Given const fieldName = 'employees'; - const fieldMetadataItem = mockedCompanyObjectMetadataItem.fields.find( + const fieldMetadataItem = mockedCompanyObjectMetadataItem?.fields.find( ({ name }) => name === fieldName, ); @@ -50,25 +54,7 @@ describe('getFieldPreviewValue', () => { it('returns null if the field is supported in Settings but has no pre-configured placeholder defaultValue', () => { // Given const fieldName = 'company'; - const fieldMetadataItem = mockedPersonObjectMetadataItem.fields.find( - ({ name }) => name === fieldName, - ); - - if (!fieldMetadataItem) { - throw new Error(`Field '${fieldName}' not found`); - } - - // When - const result = getFieldPreviewValue({ fieldMetadataItem }); - - // Then - expect(result).toBeNull(); - }); - - it('returns null if the field is not supported in Settings', () => { - // Given - const fieldName = 'position'; - const fieldMetadataItem = mockedCustomObjectMetadataItem.fields.find( + const fieldMetadataItem = mockedPersonObjectMetadataItem?.fields.find( ({ name }) => name === fieldName, ); diff --git a/packages/twenty-front/src/modules/settings/data-model/fields/preview/utils/__tests__/getMultiSelectFieldPreviewValue.test.ts b/packages/twenty-front/src/modules/settings/data-model/fields/preview/utils/__tests__/getMultiSelectFieldPreviewValue.test.ts index 824d6e820167..2737a829ee91 100644 --- a/packages/twenty-front/src/modules/settings/data-model/fields/preview/utils/__tests__/getMultiSelectFieldPreviewValue.test.ts +++ b/packages/twenty-front/src/modules/settings/data-model/fields/preview/utils/__tests__/getMultiSelectFieldPreviewValue.test.ts @@ -1,15 +1,20 @@ import { FieldMetadataType } from '~/generated-metadata/graphql'; -import { - mockedCompanyObjectMetadataItem, - mockedCustomObjectMetadataItem, -} from '~/testing/mock-data/metadata'; - +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; import { getMultiSelectFieldPreviewValue } from '../getMultiSelectFieldPreviewValue'; +const mockedCompanyObjectMetadataItem = generatedMockObjectMetadataItems.find( + (item) => item.nameSingular === 'company', +); + +const mockedOpportunityObjectMetadataItem = + generatedMockObjectMetadataItems.find( + (item) => item.nameSingular === 'opportunity', + ); + describe('getMultiSelectFieldPreviewValue', () => { it('returns null if the field is not a Multi-Select field', () => { // Given - const fieldMetadataItem = mockedCompanyObjectMetadataItem.fields.find( + const fieldMetadataItem = mockedCompanyObjectMetadataItem?.fields.find( ({ type }) => type !== FieldMetadataType.MultiSelect, ); @@ -24,10 +29,11 @@ describe('getMultiSelectFieldPreviewValue', () => { expect(previewValue).toBeNull(); }); - const fieldName = 'priority'; - const selectFieldMetadataItem = mockedCustomObjectMetadataItem.fields.find( - ({ name, type }) => name === fieldName && type === FieldMetadataType.Select, - ); + const fieldName = 'stage'; + const selectFieldMetadataItem = + mockedOpportunityObjectMetadataItem?.fields.find( + ({ name }) => name === fieldName, + ); if (!selectFieldMetadataItem) { throw new Error(`Field '${fieldName}' not found`); @@ -52,7 +58,13 @@ describe('getMultiSelectFieldPreviewValue', () => { }); // Then - expect(previewValue).toEqual(['MEDIUM', 'LOW']); + expect(previewValue).toEqual([ + 'NEW', + 'SCREENING', + 'MEETING', + 'PROPOSAL', + 'CUSTOMER', + ]); }); it("returns all option values if no defaultValue was found in the field's metadata", () => { @@ -69,7 +81,13 @@ describe('getMultiSelectFieldPreviewValue', () => { }); // Then - expect(previewValue).toEqual(['LOW', 'MEDIUM', 'HIGH']); + expect(previewValue).toEqual([ + 'NEW', + 'SCREENING', + 'MEETING', + 'PROPOSAL', + 'CUSTOMER', + ]); expect(previewValue).toEqual( fieldMetadataItemWithDefaultValue.options?.map(({ value }) => value), ); @@ -89,7 +107,13 @@ describe('getMultiSelectFieldPreviewValue', () => { }); // Then - expect(previewValue).toEqual(['LOW', 'MEDIUM', 'HIGH']); + expect(previewValue).toEqual([ + 'NEW', + 'SCREENING', + 'MEETING', + 'PROPOSAL', + 'CUSTOMER', + ]); expect(previewValue).toEqual( fieldMetadataItemWithDefaultValue.options?.map(({ value }) => value), ); diff --git a/packages/twenty-front/src/modules/settings/data-model/fields/preview/utils/__tests__/getSelectFieldPreviewValue.test.ts b/packages/twenty-front/src/modules/settings/data-model/fields/preview/utils/__tests__/getSelectFieldPreviewValue.test.ts index 3572d58d9007..109feefb3ab1 100644 --- a/packages/twenty-front/src/modules/settings/data-model/fields/preview/utils/__tests__/getSelectFieldPreviewValue.test.ts +++ b/packages/twenty-front/src/modules/settings/data-model/fields/preview/utils/__tests__/getSelectFieldPreviewValue.test.ts @@ -1,15 +1,21 @@ import { FieldMetadataType } from '~/generated-metadata/graphql'; -import { - mockedCompanyObjectMetadataItem, - mockedCustomObjectMetadataItem, -} from '~/testing/mock-data/metadata'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; import { getSelectFieldPreviewValue } from '../getSelectFieldPreviewValue'; +const mockedCompanyObjectMetadataItem = generatedMockObjectMetadataItems.find( + (item) => item.nameSingular === 'company', +); + +const mockedOpportunityObjectMetadataItem = + generatedMockObjectMetadataItems.find( + (item) => item.nameSingular === 'opportunity', + ); + describe('getSelectFieldPreviewValue', () => { it('returns null if the field is not a Select field', () => { // Given - const fieldMetadataItem = mockedCompanyObjectMetadataItem.fields.find( + const fieldMetadataItem = mockedCompanyObjectMetadataItem?.fields.find( ({ type }) => type !== FieldMetadataType.Select, ); @@ -24,9 +30,9 @@ describe('getSelectFieldPreviewValue', () => { expect(previewValue).toBeNull(); }); - const fieldName = 'priority'; - const fieldMetadataItem = mockedCustomObjectMetadataItem.fields.find( - ({ name, type }) => name === fieldName && type === FieldMetadataType.Select, + const fieldName = 'stage'; + const fieldMetadataItem = mockedOpportunityObjectMetadataItem?.fields.find( + ({ name }) => name === fieldName, ); if (!fieldMetadataItem) { @@ -35,7 +41,7 @@ describe('getSelectFieldPreviewValue', () => { it("returns the defaultValue as an option value if a valid defaultValue is found in the field's metadata", () => { // Given - const defaultValue = "'MEDIUM'"; + const defaultValue = "'NEW'"; const fieldMetadataItemWithDefaultValue = { ...fieldMetadataItem, defaultValue, @@ -47,7 +53,7 @@ describe('getSelectFieldPreviewValue', () => { }); // Then - expect(previewValue).toBe('MEDIUM'); + expect(previewValue).toBe('NEW'); }); it("returns the first option value if no defaultValue was found in the field's metadata", () => { @@ -64,7 +70,7 @@ describe('getSelectFieldPreviewValue', () => { }); // Then - expect(previewValue).toBe('LOW'); + expect(previewValue).toBe('NEW'); expect(previewValue).toBe( fieldMetadataItemWithDefaultValue.options?.[0]?.value, ); @@ -84,7 +90,7 @@ describe('getSelectFieldPreviewValue', () => { }); // Then - expect(previewValue).toBe('LOW'); + expect(previewValue).toBe('NEW'); expect(previewValue).toBe( fieldMetadataItemWithDefaultValue.options?.[0]?.value, ); diff --git a/packages/twenty-front/src/modules/settings/data-model/objects/forms/components/__stories__/SettingsDataModelObjectAboutForm.stories.tsx b/packages/twenty-front/src/modules/settings/data-model/objects/forms/components/__stories__/SettingsDataModelObjectAboutForm.stories.tsx index 4345f59229e9..173106174fdf 100644 --- a/packages/twenty-front/src/modules/settings/data-model/objects/forms/components/__stories__/SettingsDataModelObjectAboutForm.stories.tsx +++ b/packages/twenty-front/src/modules/settings/data-model/objects/forms/components/__stories__/SettingsDataModelObjectAboutForm.stories.tsx @@ -4,9 +4,12 @@ import { ComponentDecorator } from 'twenty-ui'; import { FormProviderDecorator } from '~/testing/decorators/FormProviderDecorator'; import { IconsProviderDecorator } from '~/testing/decorators/IconsProviderDecorator'; -import { mockedCompanyObjectMetadataItem } from '~/testing/mock-data/metadata'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; import { SettingsDataModelObjectAboutForm } from '../SettingsDataModelObjectAboutForm'; +const mockedCompanyObjectMetadataItem = generatedMockObjectMetadataItems.find( + (item) => item.nameSingular === 'company', +); const StyledContainer = styled.div` flex: 1; diff --git a/packages/twenty-front/src/modules/settings/data-model/utils/__tests__/getFieldPreviewValueFromRecord.test.ts b/packages/twenty-front/src/modules/settings/data-model/utils/__tests__/getFieldPreviewValueFromRecord.test.ts index 95b0aac275e1..750604ef1515 100644 --- a/packages/twenty-front/src/modules/settings/data-model/utils/__tests__/getFieldPreviewValueFromRecord.test.ts +++ b/packages/twenty-front/src/modules/settings/data-model/utils/__tests__/getFieldPreviewValueFromRecord.test.ts @@ -1,10 +1,14 @@ import { ObjectRecord } from '@/object-record/types/ObjectRecord'; -import { - mockedCompanyObjectMetadataItem, - mockedPersonObjectMetadataItem, -} from '~/testing/mock-data/metadata'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; import { getFieldPreviewValueFromRecord } from '../getFieldPreviewValueFromRecord'; +const mockedCompanyObjectMetadataItem = generatedMockObjectMetadataItems.find( + (item) => item.nameSingular === 'company', +); + +const mockedPersonObjectMetadataItem = generatedMockObjectMetadataItems.find( + (item) => item.nameSingular === 'person', +); describe('getFieldPreviewValueFromRecord', () => { describe('RELATION field', () => { @@ -21,9 +25,13 @@ describe('getFieldPreviewValueFromRecord', () => { }, __typename: 'Opportunity', }; - const fieldMetadataItem = mockedCompanyObjectMetadataItem.fields.find( + const fieldMetadataItem = mockedCompanyObjectMetadataItem?.fields.find( ({ name }) => name === 'people', - )!; + ); + + if (!fieldMetadataItem) { + throw new Error('Field not found'); + } // When const result = getFieldPreviewValueFromRecord({ @@ -43,9 +51,13 @@ describe('getFieldPreviewValueFromRecord', () => { company: relationRecord, __typename: 'Opportunity', }; - const fieldMetadataItem = mockedPersonObjectMetadataItem.fields.find( + const fieldMetadataItem = mockedPersonObjectMetadataItem?.fields.find( ({ name }) => name === 'company', - )!; + ); + + if (!fieldMetadataItem) { + throw new Error('Field not found'); + } // When const result = getFieldPreviewValueFromRecord({ @@ -62,9 +74,13 @@ describe('getFieldPreviewValueFromRecord', () => { it('returns the record field value', () => { // Given const record = { id: '', name: 'Twenty', __typename: 'Opportunity' }; - const fieldMetadataItem = mockedCompanyObjectMetadataItem.fields.find( + const fieldMetadataItem = mockedCompanyObjectMetadataItem?.fields.find( ({ name }) => name === 'name', - )!; + ); + + if (!fieldMetadataItem) { + throw new Error('Field not found'); + } // When const result = getFieldPreviewValueFromRecord({ diff --git a/packages/twenty-front/src/modules/settings/serverless-functions/hooks/__tests__/useServerlessFunctionUpdateFormState.test.ts b/packages/twenty-front/src/modules/settings/serverless-functions/hooks/__tests__/useServerlessFunctionUpdateFormState.test.ts index e0799f13ac2e..36de554158df 100644 --- a/packages/twenty-front/src/modules/settings/serverless-functions/hooks/__tests__/useServerlessFunctionUpdateFormState.test.ts +++ b/packages/twenty-front/src/modules/settings/serverless-functions/hooks/__tests__/useServerlessFunctionUpdateFormState.test.ts @@ -1,5 +1,5 @@ -import { renderHook } from '@testing-library/react'; import { useServerlessFunctionUpdateFormState } from '@/settings/serverless-functions/hooks/useServerlessFunctionUpdateFormState'; +import { renderHook } from '@testing-library/react'; import { RecoilRoot } from 'recoil'; jest.mock( @@ -44,6 +44,6 @@ describe('useServerlessFunctionUpdateFormState', () => { const { formValues } = result.current; - expect(formValues).toEqual({ name: '', description: '', code: '' }); + expect(formValues).toEqual({ name: '', description: '', code: undefined }); }); }); diff --git a/packages/twenty-front/src/modules/settings/serverless-functions/hooks/useServerlessFunctionUpdateFormState.ts b/packages/twenty-front/src/modules/settings/serverless-functions/hooks/useServerlessFunctionUpdateFormState.ts index 367710df7137..9e8a13483810 100644 --- a/packages/twenty-front/src/modules/settings/serverless-functions/hooks/useServerlessFunctionUpdateFormState.ts +++ b/packages/twenty-front/src/modules/settings/serverless-functions/hooks/useServerlessFunctionUpdateFormState.ts @@ -1,6 +1,6 @@ -import { Dispatch, SetStateAction, useState } from 'react'; import { useGetOneServerlessFunction } from '@/settings/serverless-functions/hooks/useGetOneServerlessFunction'; import { useGetOneServerlessFunctionSourceCode } from '@/settings/serverless-functions/hooks/useGetOneServerlessFunctionSourceCode'; +import { Dispatch, SetStateAction, useState } from 'react'; import { FindOneServerlessFunctionSourceCodeQuery } from '~/generated-metadata/graphql'; export type ServerlessFunctionNewFormValues = { diff --git a/packages/twenty-front/src/pages/object-record/__stories__/RecordShowPage.stories.tsx b/packages/twenty-front/src/pages/object-record/__stories__/RecordShowPage.stories.tsx index 5f1b8c02129d..31d04e0c1edb 100644 --- a/packages/twenty-front/src/pages/object-record/__stories__/RecordShowPage.stories.tsx +++ b/packages/twenty-front/src/pages/object-record/__stories__/RecordShowPage.stories.tsx @@ -11,7 +11,6 @@ import { graphqlMocks } from '~/testing/graphqlMocks'; import { getPeopleMock, peopleQueryResult } from '~/testing/mock-data/people'; import { mockedWorkspaceMemberData } from '~/testing/mock-data/users'; -import { viewQueryResultMock } from '~/testing/mock-data/views'; import { RecordShowPage } from '../RecordShowPage'; const peopleMock = getPeopleMock(); @@ -63,13 +62,6 @@ const meta: Meta = { }, }); }), - graphql.query('FindManyViews', () => { - return HttpResponse.json({ - data: { - views: viewQueryResultMock, - }, - }); - }), graphqlMocks.handlers, ], }, diff --git a/packages/twenty-front/src/pages/settings/__stories__/SettingsAppearance.stories.tsx b/packages/twenty-front/src/pages/settings/__stories__/SettingsAppearance.stories.tsx index 1aa66449abcc..2b7ab8f8e528 100644 --- a/packages/twenty-front/src/pages/settings/__stories__/SettingsAppearance.stories.tsx +++ b/packages/twenty-front/src/pages/settings/__stories__/SettingsAppearance.stories.tsx @@ -38,6 +38,24 @@ export const Default: Story = { }, }; +export const DateTimeSettingsTimeFormat: Story = { + play: async () => { + const canvas = within(document.body); + + await canvas.findByText('Date and time'); + + const timeFormatSelect = await canvas.findByText('24h (08:33)'); + + userEvent.click(timeFormatSelect); + + const timeFormatOptions = await canvas.findByText('12h (8:33 AM)'); + + userEvent.click(timeFormatOptions); + + await canvas.findByText('12h (8:33 AM)'); + }, +}; + export const DateTimeSettingsTimezone: Story = { play: async () => { const canvas = within(document.body); @@ -77,21 +95,3 @@ export const DateTimeSettingsDateFormat: Story = { await canvas.findByText('Jun 13, 2022'); }, }; - -export const DateTimeSettingsTimeFormat: Story = { - play: async () => { - const canvas = within(document.body); - - await canvas.findByText('Date and time'); - - const timeFormatSelect = await canvas.findByText('24h (08:33)'); - - userEvent.click(timeFormatSelect); - - const timeFormatOptions = await canvas.findByText('12h (8:33 AM)'); - - userEvent.click(timeFormatOptions); - - await canvas.findByText('12h (8:33 AM)'); - }, -}; diff --git a/packages/twenty-front/src/pages/settings/integrations/__stories__/SettingsIntegrationDatabase.stories.tsx b/packages/twenty-front/src/pages/settings/integrations/__stories__/SettingsIntegrationDatabase.stories.tsx index e828bfa766e8..fc7cecd82dee 100644 --- a/packages/twenty-front/src/pages/settings/integrations/__stories__/SettingsIntegrationDatabase.stories.tsx +++ b/packages/twenty-front/src/pages/settings/integrations/__stories__/SettingsIntegrationDatabase.stories.tsx @@ -1,3 +1,4 @@ +import { expect } from '@storybook/jest'; import { Meta, StoryObj } from '@storybook/react'; import { within } from '@storybook/test'; @@ -33,6 +34,6 @@ export const Default: Story = { const canvas = within(canvasElement); sleep(1000); - await canvas.findByText('PostgreSQL database'); + expect(await canvas.findByText('PostgreSQL database')).toBeInTheDocument(); }, }; diff --git a/packages/twenty-front/src/testing/decorators/ChipGeneratorsDecorator.tsx b/packages/twenty-front/src/testing/decorators/ChipGeneratorsDecorator.tsx index 283e7046e0ab..c107d5466387 100644 --- a/packages/twenty-front/src/testing/decorators/ChipGeneratorsDecorator.tsx +++ b/packages/twenty-front/src/testing/decorators/ChipGeneratorsDecorator.tsx @@ -3,7 +3,7 @@ import { useMemo } from 'react'; import { PreComputedChipGeneratorsContext } from '@/object-metadata/context/PreComputedChipGeneratorsContext'; import { getRecordChipGenerators } from '@/object-record/utils/getRecordChipGenerators'; -import { generatedMockObjectMetadataItems } from '~/testing/mock-data/objectMetadataItems'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; export const ChipGeneratorsDecorator: Decorator = (Story) => { const { chipGeneratorPerObjectPerField, identifierChipGeneratorPerObject } = diff --git a/packages/twenty-front/src/testing/decorators/PageDecorator.tsx b/packages/twenty-front/src/testing/decorators/PageDecorator.tsx index 7125e4326dc6..244772c809e6 100644 --- a/packages/twenty-front/src/testing/decorators/PageDecorator.tsx +++ b/packages/twenty-front/src/testing/decorators/PageDecorator.tsx @@ -12,7 +12,7 @@ import { import { RecoilRoot } from 'recoil'; import { ClientConfigProviderEffect } from '@/client-config/components/ClientConfigProviderEffect'; -import { ApolloMetadataClientMockedProvider } from '@/object-metadata/hooks/__mocks__/ApolloMetadataClientProvider'; +import { ApolloMetadataClientMockedProvider } from '@/object-metadata/hooks/__mocks__/ApolloMetadataClientMockedProvider'; import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope'; import { UserProviderEffect } from '@/users/components/UserProviderEffect'; import { ClientConfigProvider } from '~/modules/client-config/components/ClientConfigProvider'; @@ -21,6 +21,7 @@ import { UserProvider } from '~/modules/users/components/UserProvider'; import { mockedApolloClient } from '~/testing/mockedApolloClient'; import { RecoilDebugObserverEffect } from '@/debug/components/RecoilDebugObserver'; +import { ObjectMetadataItemsProvider } from '@/object-metadata/components/ObjectMetadataItemsProvider'; import { PrefetchDataProvider } from '@/prefetch/components/PrefetchDataProvider'; import { IconsProvider } from 'twenty-ui'; import { FullHeightStorybookLayout } from '../FullHeightStorybookLayout'; @@ -64,29 +65,33 @@ const ApolloStorybookDevLogEffect = () => { const Providers = () => { return ( - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + ); }; diff --git a/packages/twenty-front/src/testing/decorators/RootDecorator.tsx b/packages/twenty-front/src/testing/decorators/RootDecorator.tsx index 9c2633037b5b..5808791d1ae2 100644 --- a/packages/twenty-front/src/testing/decorators/RootDecorator.tsx +++ b/packages/twenty-front/src/testing/decorators/RootDecorator.tsx @@ -2,7 +2,7 @@ import { ApolloProvider } from '@apollo/client'; import { Decorator } from '@storybook/react'; import { RecoilRoot } from 'recoil'; -import { ApolloMetadataClientMockedProvider } from '@/object-metadata/hooks/__mocks__/ApolloMetadataClientProvider'; +import { ApolloMetadataClientMockedProvider } from '@/object-metadata/hooks/__mocks__/ApolloMetadataClientMockedProvider'; import { InitializeHotkeyStorybookHookEffect } from '../InitializeHotkeyStorybookHook'; import { mockedApolloClient } from '../mockedApolloClient'; diff --git a/packages/twenty-front/src/testing/decorators/getFieldDecorator.tsx b/packages/twenty-front/src/testing/decorators/getFieldDecorator.tsx index 62cee6f5077b..e61885ed9a0d 100644 --- a/packages/twenty-front/src/testing/decorators/getFieldDecorator.tsx +++ b/packages/twenty-front/src/testing/decorators/getFieldDecorator.tsx @@ -12,7 +12,7 @@ import { import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState'; import { ObjectRecord } from '@/object-record/types/ObjectRecord'; import { getCompaniesMock } from '~/testing/mock-data/companies'; -import { generatedMockObjectMetadataItems } from '~/testing/mock-data/objectMetadataItems'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; import { getPeopleMock } from '~/testing/mock-data/people'; import { mockedTasks } from '~/testing/mock-data/tasks'; import { isDefined } from '~/utils/isDefined'; @@ -56,7 +56,7 @@ const RecordMockSetterEffect = ({ export const getFieldDecorator = ( - objectNameSingular: 'company' | 'person' | 'task', + objectNameSingular: 'company' | 'person' | 'task' | 'workflowVersions', fieldName: string, fieldValue?: any, ): Decorator => diff --git a/packages/twenty-front/src/testing/graphqlMocks.ts b/packages/twenty-front/src/testing/graphqlMocks.ts index c5d319b460b7..a69d6c17c660 100644 --- a/packages/twenty-front/src/testing/graphqlMocks.ts +++ b/packages/twenty-front/src/testing/graphqlMocks.ts @@ -11,7 +11,6 @@ import { getCompanyDuplicateMock, } from '~/testing/mock-data/companies'; import { mockedClientConfig } from '~/testing/mock-data/config'; -import { mockedObjectMetadataItemsQueryResult } from '~/testing/mock-data/metadata'; import { mockedNotes } from '~/testing/mock-data/notes'; import { getPeopleMock } from '~/testing/mock-data/people'; import { mockedRemoteTables } from '~/testing/mock-data/remote-tables'; @@ -19,6 +18,7 @@ import { mockedUserData } from '~/testing/mock-data/users'; import { mockedViewsData } from '~/testing/mock-data/views'; import { mockWorkspaceMembers } from '~/testing/mock-data/workspace-members'; +import { mockedStandardObjectMetadataQueryResult } from '~/testing/mock-data/generated/mock-metadata-query-result'; import { mockedTasks } from '~/testing/mock-data/tasks'; import { mockedRemoteServers } from './mock-data/remote-servers'; import { mockedViewFieldsData } from './mock-data/view-fields'; @@ -58,7 +58,7 @@ export const graphqlMocks = { getOperationName(FIND_MANY_OBJECT_METADATA_ITEMS) ?? '', () => { return HttpResponse.json({ - data: mockedObjectMetadataItemsQueryResult, + data: mockedStandardObjectMetadataQueryResult, }); }, ), @@ -297,7 +297,7 @@ export const graphqlMocks = { graphql.query('FindManyTasks', () => { return HttpResponse.json({ data: { - activities: { + tasks: { edges: mockedTasks.map(({ taskTargets, ...rest }) => ({ node: { ...rest, @@ -320,6 +320,26 @@ export const graphqlMocks = { }, }); }), + graphql.query('FindManyTaskTargets', () => { + return HttpResponse.json({ + data: { + taskTargets: { + edges: mockedTasks.flatMap((task) => + task.taskTargets.map((target) => ({ + node: target, + cursor: null, + })), + ), + pageInfo: { + hasNextPage: false, + hasPreviousPage: false, + startCursor: null, + endCursor: null, + }, + }, + }, + }); + }), graphql.query('FindManyFavorites', () => { return HttpResponse.json({ data: { diff --git a/packages/twenty-front/src/testing/jest/JestObjectMetadataItemSetter.tsx b/packages/twenty-front/src/testing/jest/JestObjectMetadataItemSetter.tsx index abd11cab1832..98e83cb833a5 100644 --- a/packages/twenty-front/src/testing/jest/JestObjectMetadataItemSetter.tsx +++ b/packages/twenty-front/src/testing/jest/JestObjectMetadataItemSetter.tsx @@ -2,7 +2,7 @@ import { ReactNode, useEffect, useState } from 'react'; import { useSetRecoilState } from 'recoil'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; -import { generatedMockObjectMetadataItems } from '~/testing/mock-data/objectMetadataItems'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; export const JestObjectMetadataItemSetter = ({ children, diff --git a/packages/twenty-front/src/testing/jest/generateEmptyJestRecordNode.ts b/packages/twenty-front/src/testing/jest/generateEmptyJestRecordNode.ts new file mode 100644 index 000000000000..f27e4f3a3cd8 --- /dev/null +++ b/packages/twenty-front/src/testing/jest/generateEmptyJestRecordNode.ts @@ -0,0 +1,37 @@ +import { getRecordNodeFromRecord } from '@/object-record/cache/utils/getRecordNodeFromRecord'; +import { generateDepthOneRecordGqlFields } from '@/object-record/graphql/utils/generateDepthOneRecordGqlFields'; +import { prefillRecord } from '@/object-record/utils/prefillRecord'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; + +export const generateEmptyJestRecordNode = ({ + objectNameSingular, + input, + withDepthOneRelation = false, +}: { + objectNameSingular: string; + input: Record; + withDepthOneRelation?: boolean; +}) => { + const objectMetadataItem = generatedMockObjectMetadataItems.find( + (item) => item.nameSingular === objectNameSingular, + ); + + if (!objectMetadataItem) { + throw new Error( + `ObjectMetadataItem not found for objectNameSingular: ${objectNameSingular} while generating empty Jest record node`, + ); + } + + const prefilledRecord = prefillRecord({ objectMetadataItem, input }); + + return getRecordNodeFromRecord({ + record: prefilledRecord, + objectMetadataItem, + objectMetadataItems: generatedMockObjectMetadataItems, + recordGqlFields: withDepthOneRelation + ? generateDepthOneRecordGqlFields({ + objectMetadataItem, + }) + : undefined, + }); +}; diff --git a/packages/twenty-front/src/testing/jest/getJestHookWrapper.tsx b/packages/twenty-front/src/testing/jest/getJestMetadataAndApolloMocksWrapper.tsx similarity index 94% rename from packages/twenty-front/src/testing/jest/getJestHookWrapper.tsx rename to packages/twenty-front/src/testing/jest/getJestMetadataAndApolloMocksWrapper.tsx index 3c8f21553323..ea0e6528f0bc 100644 --- a/packages/twenty-front/src/testing/jest/getJestHookWrapper.tsx +++ b/packages/twenty-front/src/testing/jest/getJestMetadataAndApolloMocksWrapper.tsx @@ -5,7 +5,7 @@ import { MutableSnapshot, RecoilRoot } from 'recoil'; import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope'; import { JestObjectMetadataItemSetter } from '~/testing/jest/JestObjectMetadataItemSetter'; -export const getJestHookWrapper = ({ +export const getJestMetadataAndApolloMocksWrapper = ({ apolloMocks, onInitializeRecoilSnapshot, }: { diff --git a/packages/twenty-front/src/testing/mock-data/generated/mock-metadata-query-result.ts b/packages/twenty-front/src/testing/mock-data/generated/mock-metadata-query-result.ts index c30b74ec2344..6832293415c8 100644 --- a/packages/twenty-front/src/testing/mock-data/generated/mock-metadata-query-result.ts +++ b/packages/twenty-front/src/testing/mock-data/generated/mock-metadata-query-result.ts @@ -51,6 +51,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'ed0dfa31-8e2f-4b23-87e4-8fa55eb16729', type: 'TEXT', name: 'operation', @@ -72,6 +73,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '814795ef-6f2d-4798-a6f9-4e1c87c68d43', type: 'DATE_TIME', name: 'deletedAt', @@ -93,6 +95,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '1c802ccf-c0ae-4b04-8c1e-f77417e6c3f8', type: 'DATE_TIME', name: 'updatedAt', @@ -114,6 +117,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '6f210155-9cdc-48c6-9803-e20f63512024', type: 'DATE_TIME', name: 'createdAt', @@ -135,6 +139,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '5fa54f64-3363-4a21-89ca-30d4816d8c77', type: 'UUID', name: 'id', @@ -156,6 +161,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'a8876650-a7b6-4a9f-95b4-9ec1d6c232cc', type: 'TEXT', name: 'targetUrl', @@ -177,6 +183,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'afae3f60-bfeb-4faf-a899-b0eb0fefac51', type: 'TEXT', name: 'description', @@ -233,6 +240,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'ad82920a-857a-4357-8e4a-ed70961ba5d8', type: 'DATE_TIME', name: 'updatedAt', @@ -254,6 +262,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '89662f00-b57c-49f6-aa48-d1c84f5fd7c7', type: 'UUID', name: 'personId', @@ -275,6 +284,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '19270b1d-73b4-4aa9-8106-c1c81351ec53', type: 'UUID', name: 'rocketId', @@ -296,6 +306,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '0c796ac5-0592-455f-9a0a-66ad53c6e4cf', type: 'UUID', name: 'companyId', @@ -317,6 +328,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'dadac630-f64e-4d3d-9923-78ca579373f3', type: 'RELATION', name: 'rocket', @@ -364,6 +376,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '0fcdebbb-a332-45ec-ab46-c30d5d7f9ef0', type: 'DATE_TIME', name: 'createdAt', @@ -385,6 +398,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '37882bc2-c8d8-4cc5-bc13-4b820cc05b83', type: 'UUID', name: 'taskId', @@ -406,6 +420,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'da63ddb4-7c19-49f0-bf90-ac2cc9486ae7', type: 'DATE_TIME', name: 'deletedAt', @@ -427,6 +442,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '26cc6ba3-cff7-4b84-bf78-71823187a824', type: 'RELATION', name: 'person', @@ -474,6 +490,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'e4414119-6f9c-465a-9ee2-95d1fc5eec01', type: 'UUID', name: 'opportunityId', @@ -495,6 +512,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '598688a1-9766-439d-abd3-c0a47c8f36a3', type: 'RELATION', name: 'opportunity', @@ -542,6 +560,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'cd7f57e8-a67f-4be9-a971-b5609cb0fb83', type: 'RELATION', name: 'company', @@ -589,6 +608,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '400c9e53-283b-42d8-a69f-5010fb75d977', type: 'UUID', name: 'id', @@ -610,6 +630,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'ec532542-a4dc-4722-99c3-fca6366db597', type: 'RELATION', name: 'task', @@ -692,6 +713,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '26c57af1-5c70-4a9d-974f-e54c6a77a2b4', type: 'RELATION', name: 'rocket', @@ -739,6 +761,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '434d1fd2-e6e0-4de7-9b15-706398e34d2d', type: 'DATE_TIME', name: 'deletedAt', @@ -760,6 +783,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '06fcb5e2-b2f7-4118-a9f0-34558429b72c', type: 'DATE_TIME', name: 'updatedAt', @@ -781,6 +805,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '4b6aaf36-4247-4bbb-b26d-64987b02f805', type: 'RELATION', name: 'company', @@ -828,6 +853,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'c9bbd140-d9ab-4557-bd77-b446cd80774b', type: 'UUID', name: 'personId', @@ -849,6 +875,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'b86fd021-b648-4a1e-b02e-080f0b280303', type: 'UUID', name: 'rocketId', @@ -870,6 +897,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'cd3a9c3d-a29e-4b27-9fdb-0e8959f21f10', type: 'UUID', name: 'opportunityId', @@ -891,6 +919,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'e6a5a8b1-ebef-4e01-ba22-a5f86d894eb5', type: 'UUID', name: 'id', @@ -912,6 +941,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '9d568132-6cbc-4e87-95e8-7c2509549391', type: 'RELATION', name: 'note', @@ -959,6 +989,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '6f80afcd-8ed7-4bf9-a987-9de3d1cddc81', type: 'RELATION', name: 'opportunity', @@ -1006,6 +1037,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'dc63ee78-06ac-4312-b223-1d41a7ea2af4', type: 'UUID', name: 'noteId', @@ -1027,6 +1059,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '646f3b4b-0fad-495a-a90d-136593464c7f', type: 'UUID', name: 'companyId', @@ -1048,6 +1081,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '2b9481a9-c605-45d0-8aad-801a19c4b92c', type: 'DATE_TIME', name: 'createdAt', @@ -1069,6 +1103,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '77508442-f0de-4809-b690-3c998edfc0b5', type: 'RELATION', name: 'person', @@ -1151,6 +1186,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '27e79204-ba19-4791-8110-ec2bdc523e07', type: 'TEXT', name: 'messageThreadExternalId', @@ -1172,6 +1208,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '1d9f0c85-c16f-41e9-9241-2acd90781cdd', type: 'RELATION', name: 'message', @@ -1219,6 +1256,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '72a85b74-9803-4279-9f74-dafb833847fb', type: 'DATE_TIME', name: 'createdAt', @@ -1240,6 +1278,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '6cb121b9-32d1-44fe-af26-324d73ffe0ac', type: 'DATE_TIME', name: 'deletedAt', @@ -1261,6 +1300,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '9491ddd2-aea5-47fe-bd93-09fb6969b20c', type: 'TEXT', name: 'messageExternalId', @@ -1282,6 +1322,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'f3eafb28-947a-4c7a-9464-24fa5549fb03', type: 'UUID', name: 'id', @@ -1303,6 +1344,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'dbfff493-11a0-4866-9ef6-e4e8418a661a', type: 'UUID', name: 'messageChannelId', @@ -1324,6 +1366,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '95488a9d-6473-47e8-aa62-a04d49238a2f', type: 'UUID', name: 'messageId', @@ -1345,6 +1388,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'f4582d66-df12-4499-8ede-ab347427241b', type: 'RELATION', name: 'messageChannel', @@ -1392,6 +1436,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '7bf79a5a-f5b7-495e-a336-4ddf85a5b2f7', type: 'SELECT', name: 'direction', @@ -1428,6 +1473,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'a18edc4a-1b58-4a78-8de4-9564479b09cc', type: 'DATE_TIME', name: 'updatedAt', @@ -1484,6 +1530,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'ea62fcb2-2161-47db-9151-19011419ac66', type: 'DATE_TIME', name: 'createdAt', @@ -1505,6 +1552,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'e2f2b624-93bf-4d16-8517-bf66e43cabc4', type: 'RELATION', name: 'message', @@ -1552,6 +1600,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'b92e3ff7-e5e0-4fec-b36e-cb496e2b57ae', type: 'UUID', name: 'id', @@ -1573,6 +1622,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'ef5a67e6-88dd-4c92-a9be-7ab0605804e7', type: 'DATE_TIME', name: 'deletedAt', @@ -1594,6 +1644,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'f3db188f-7329-40bc-9978-e30e5c07d962', type: 'RELATION', name: 'person', @@ -1641,6 +1692,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '26c81156-529d-4bec-b5fb-f92e991907b5', type: 'UUID', name: 'messageId', @@ -1662,6 +1714,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'aa502069-91c1-4eeb-bc8e-b22240564fe1', type: 'TEXT', name: 'displayName', @@ -1683,6 +1736,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'd205df4f-f9de-4f61-9a85-40f340a4de23', type: 'RELATION', name: 'workspaceMember', @@ -1730,6 +1784,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '0cf35f0a-eb64-47ef-88a4-55b92ca57c64', type: 'UUID', name: 'personId', @@ -1751,6 +1806,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'e8550477-6034-45f4-8370-5a1cd75f7a55', type: 'UUID', name: 'workspaceMemberId', @@ -1772,6 +1828,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '8dcde658-c38a-4659-8546-89c60465d36e', type: 'TEXT', name: 'handle', @@ -1793,6 +1850,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '56ff0ed7-7916-4610-834c-a7c0657fa9e7', type: 'DATE_TIME', name: 'updatedAt', @@ -1814,6 +1872,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '7a8597e3-bbce-4ff5-9f6e-9bf3c7fd43fa', type: 'SELECT', name: 'role', @@ -1899,6 +1958,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '9061081a-eed9-49b8-99ab-9a7b8ce7a355', type: 'BOOLEAN', name: 'isContactAutoCreationEnabled', @@ -1920,6 +1980,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'df104a7c-39e5-491d-8bde-6e3f75a3156b', type: 'DATE_TIME', name: 'syncedAt', @@ -1941,6 +2002,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '751ef307-be5e-4451-9434-e2bae8861873', type: 'BOOLEAN', name: 'excludeNonProfessionalEmails', @@ -1962,6 +2024,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '9a8520ed-6577-46b0-a732-1a08aafb0160', type: 'SELECT', name: 'visibility', @@ -2005,6 +2068,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '2f7f7ea2-c5d0-47bc-bb0e-e3afc6d82b91', type: 'DATE_TIME', name: 'updatedAt', @@ -2026,6 +2090,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'dafc931d-0466-4c83-91b3-72be3fdee12f', type: 'DATE_TIME', name: 'createdAt', @@ -2047,6 +2112,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '97ba10a8-da33-4d1f-a9c6-964f814f5fd7', type: 'DATE_TIME', name: 'deletedAt', @@ -2068,6 +2134,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'a3c22a32-9c6c-4294-abc4-7b3f9b6d8816', type: 'RELATION', name: 'messageChannelMessageAssociations', @@ -2115,6 +2182,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'c1686e5a-1af6-45d9-a9f8-d2ecaef71526', type: 'RELATION', name: 'connectedAccount', @@ -2162,6 +2230,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '7eaa0427-04b4-4cf8-9676-4e28c88a0fa8', type: 'DATE_TIME', name: 'syncStageStartedAt', @@ -2183,6 +2252,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '290318a3-e994-4dee-8dd1-6bebe92043af', type: 'SELECT', name: 'syncStatus', @@ -2240,6 +2310,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '7238d6c1-c54c-4787-aa4f-79294220acdc', type: 'BOOLEAN', name: 'isSyncEnabled', @@ -2261,6 +2332,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '9416f68a-84cb-4b1f-805b-e58fb009cc44', type: 'TEXT', name: 'syncCursor', @@ -2282,6 +2354,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '09ec080b-c8fe-432f-aff1-c151861c3ec7', type: 'SELECT', name: 'contactAutoCreationPolicy', @@ -2326,6 +2399,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'd30ddf0c-769a-4480-a9cf-fea5867f9eea', type: 'BOOLEAN', name: 'excludeGroupEmails', @@ -2347,6 +2421,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '839a7a90-3b1a-4f76-8207-5a0779ca909d', type: 'SELECT', name: 'type', @@ -2383,6 +2458,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'b0026844-d54e-4fe2-af36-ed7ac7be1833', type: 'UUID', name: 'connectedAccountId', @@ -2404,6 +2480,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '7ca7d194-3cdc-4ff9-a90f-6bfaedba8280', type: 'TEXT', name: 'handle', @@ -2425,6 +2502,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '5f87d969-7dae-4a25-8b11-9577aa11285e', type: 'UUID', name: 'id', @@ -2446,6 +2524,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'aafcc52e-d761-4b6a-97a6-1bc097e2ccd2', type: 'SELECT', name: 'syncStage', @@ -2510,6 +2589,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '33180dbd-4124-43eb-84c3-17e32b4848e4', type: 'NUMBER', name: 'throttleFailureCount', @@ -2566,6 +2646,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '8ca32bd7-4999-4562-9e41-698a458944ea', type: 'DATE_TIME', name: 'deletedAt', @@ -2587,6 +2668,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '236195db-49d1-4386-99b9-4518ab7586f2', type: 'RELATION', name: 'accountOwner', @@ -2634,6 +2716,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '919dadd4-8dda-479f-a8a7-b4ed89eafae5', type: 'RELATION', name: 'calendarChannels', @@ -2681,6 +2764,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '75c78041-39ca-4b46-bcff-6ed0af05248e', type: 'TEXT', name: 'handleAliases', @@ -2702,6 +2786,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'd3f821eb-c8b1-48a5-aebb-1bfe23c4128e', type: 'DATE_TIME', name: 'updatedAt', @@ -2723,6 +2808,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '6f74d250-76f0-4eff-8e27-d1a12782517d', type: 'TEXT', name: 'lastSyncHistoryId', @@ -2744,6 +2830,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'fd6c04f4-8dba-47ac-a597-90300eb1a079', type: 'UUID', name: 'id', @@ -2765,6 +2852,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '8f7d7528-83a8-442e-b0b6-958f52a1de5e', type: 'DATE_TIME', name: 'authFailedAt', @@ -2786,6 +2874,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '762d59c0-f7e9-410f-b5dc-df66d764de0d', type: 'TEXT', name: 'handle', @@ -2808,6 +2897,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'f45f5e44-f88a-490c-b112-df2465b612a3', type: 'TEXT', name: 'refreshToken', @@ -2829,6 +2919,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '2aa282f3-5542-47e8-adf3-4384e9ce5d10', type: 'UUID', name: 'accountOwnerId', @@ -2850,6 +2941,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '5f411e82-b626-4456-896c-d5a326e5e02a', type: 'TEXT', name: 'accessToken', @@ -2871,6 +2963,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'c21734fd-6539-410f-bc1a-e91a3177b9c9', type: 'DATE_TIME', name: 'createdAt', @@ -2892,6 +2985,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '5b0a8a38-9d02-4e06-8f07-2f76f0ab70eb', type: 'TEXT', name: 'provider', @@ -2913,6 +3007,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '178f1e8a-cbbf-448e-95f3-d1262d9ff33d', type: 'RELATION', name: 'messageChannels', @@ -2995,6 +3090,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '9e7b7d2f-02fb-426b-8e3e-392225f5b6b3', type: 'RELATION', name: 'taskTargets', @@ -3042,6 +3138,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '78f1d502-397e-4cce-b096-a525b2d373e2', type: 'RELATION', name: 'noteTargets', @@ -3089,6 +3186,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'c692555c-020e-46a4-b537-c9c4c7d3cd32', type: 'ACTOR', name: 'createdBy', @@ -3113,6 +3211,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '6d32aa8b-28c0-4e35-b45e-9643fd8e1c33', type: 'CURRENCY', name: 'amount', @@ -3137,6 +3236,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'c859b99c-2554-483d-8ffe-4d29cb9c8459', type: 'RELATION', name: 'company', @@ -3184,6 +3284,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '7ad6853d-d1e9-46a8-a77a-38eeae27e1d6', type: 'RELATION', name: 'pointOfContact', @@ -3231,6 +3332,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'f6c45230-619b-4432-82fd-e5bed0c4e8f4', type: 'SELECT', name: 'stage', @@ -3288,6 +3390,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '5d3ca5b4-9468-4061-8c6b-ef03a9b123df', type: 'RELATION', name: 'favorites', @@ -3335,6 +3438,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '3bc37e42-10f2-4501-94e4-760a7c3fa38e', type: 'POSITION', name: 'position', @@ -3356,6 +3460,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '9019bf90-efbc-4499-a87b-0624bda5a559', type: 'RELATION', name: 'timelineActivities', @@ -3404,6 +3509,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'c7472787-44e9-4641-9901-cc4909ca031d', type: 'DATE_TIME', name: 'closeDate', @@ -3425,6 +3531,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '01e75534-627f-4a49-bc28-c08170a71085', type: 'UUID', name: 'id', @@ -3446,6 +3553,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '6d5401c0-d456-42c4-85d4-9666900615ef', type: 'TEXT', name: 'name', @@ -3467,6 +3575,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'aa651efa-1576-4edc-9599-070666a76dda', type: 'RELATION', name: 'attachments', @@ -3514,6 +3623,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'b8eb99bd-3485-44bb-8483-f0c600af4e92', type: 'UUID', name: 'pointOfContactId', @@ -3535,6 +3645,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '55fd22aa-80df-4c0b-b5ee-f19163d10a82', type: 'UUID', name: 'companyId', @@ -3556,6 +3667,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'd487fe61-e181-4077-ba4e-9c7b466085ad', type: 'DATE_TIME', name: 'updatedAt', @@ -3577,6 +3689,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'bf11e668-6598-42ee-8c81-563641403ba9', type: 'DATE_TIME', name: 'deletedAt', @@ -3598,6 +3711,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '2e77023d-fdeb-454d-9368-ab638a68a0bb', type: 'DATE_TIME', name: 'createdAt', @@ -3619,6 +3733,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'ac708d8f-abd4-436f-aec7-9a8c4ec2cd28', type: 'RELATION', name: 'activityTargets', @@ -3701,6 +3816,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '4a2da98e-6880-47be-8673-165e1d77a910', type: 'RELATION', name: 'rocket', @@ -3748,6 +3864,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '03aab98d-e16c-48fb-91e7-bffc2300402d', type: 'UUID', name: 'opportunityId', @@ -3769,6 +3886,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'e1d06322-0658-4c45-9c9b-8a42750c8751', type: 'RELATION', name: 'company', @@ -3816,6 +3934,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'ca812263-7b62-4e7f-8f31-bed3de2d4a94', type: 'DATE_TIME', name: 'updatedAt', @@ -3837,6 +3956,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '984d38ae-335d-41fb-ac29-9029ff43c4c6', type: 'UUID', name: 'companyId', @@ -3858,6 +3978,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'b2531e1e-39ad-46c8-af56-853fe1cc7dd6', type: 'RELATION', name: 'activity', @@ -3905,6 +4026,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '26d681d7-4ef2-40eb-bd0c-7e0b7d6d6cb0', type: 'UUID', name: 'personId', @@ -3926,6 +4048,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'dc9c8fec-55d2-40b6-9fcd-d441024be60f', type: 'DATE_TIME', name: 'createdAt', @@ -3947,6 +4070,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '08806161-5d03-4777-8825-b5cff93de042', type: 'UUID', name: 'activityId', @@ -3968,6 +4092,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '9ff04b9e-f87c-44df-82ed-518748ca0d81', type: 'UUID', name: 'rocketId', @@ -3989,6 +4114,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '86438a20-0beb-4e73-93d9-cf91bfe9ac3f', type: 'UUID', name: 'id', @@ -4010,6 +4136,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '2f2ed506-e96e-48d3-8225-45a9c0b55e76', type: 'DATE_TIME', name: 'deletedAt', @@ -4031,6 +4158,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '867aff40-ddf5-4af8-a3f5-6359ab91eb2c', type: 'RELATION', name: 'person', @@ -4078,6 +4206,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'c2708db4-5c1e-482b-bdd4-bd620612c15f', type: 'RELATION', name: 'opportunity', @@ -4160,6 +4289,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'eb926345-9d3c-4815-a044-bf1085b31cdc', type: 'UUID', name: 'assigneeId', @@ -4181,6 +4311,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '7314a7d0-f318-4aa0-b8f3-db1953139d3f', type: 'TEXT', name: 'title', @@ -4202,6 +4333,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '3e63dfad-08ba-422f-88e5-0c1ebffd6496', type: 'RELATION', name: 'author', @@ -4249,6 +4381,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '5ceb1884-c3ff-4a31-9629-3ef599b1a461', type: 'DATE_TIME', name: 'updatedAt', @@ -4270,6 +4403,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'ffdb396b-200a-4dc5-a3aa-e2c23b180ac0', type: 'TEXT', name: 'body', @@ -4291,6 +4425,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '0f1cfe74-f960-44f9-91f3-fc9d25a4b96b', type: 'RELATION', name: 'comments', @@ -4338,6 +4473,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '248b356d-5a70-458d-a10b-92d70512497b', type: 'DATE_TIME', name: 'createdAt', @@ -4359,6 +4495,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '2f1f7b1a-2c98-42ca-8f6c-784406d7bad8', type: 'UUID', name: 'authorId', @@ -4380,6 +4517,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '799c1e27-3fa5-4411-bfa2-a1f494d2434a', type: 'DATE_TIME', name: 'reminderAt', @@ -4401,6 +4539,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'dd5354bb-dd0a-4426-ac75-87e9ab171dc4', type: 'RELATION', name: 'assignee', @@ -4448,6 +4587,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'd7b4584a-d0ed-49f8-b14c-198036b60fe8', type: 'DATE_TIME', name: 'dueAt', @@ -4469,6 +4609,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '9b8808d3-be01-4595-9b20-ebb9553cd7db', type: 'DATE_TIME', name: 'completedAt', @@ -4490,6 +4631,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'd0341ced-bdb0-4629-a816-d402df827bd7', type: 'TEXT', name: 'type', @@ -4511,6 +4653,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '1dc0b9af-181a-4f2c-bd01-9c4bf355b9de', type: 'RELATION', name: 'activityTargets', @@ -4558,6 +4701,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'b31fdd11-115b-4405-8265-c03329338f0c', type: 'DATE_TIME', name: 'deletedAt', @@ -4579,6 +4723,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'bfa2ab3d-a55b-41ca-906b-9d497aee7ba8', type: 'RELATION', name: 'attachments', @@ -4626,6 +4771,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '33b0ccb9-19fc-42d6-b7af-87bc4411692e', type: 'UUID', name: 'id', @@ -4682,6 +4828,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'e166c79b-99c1-4fb4-9575-5cf7e7f4811f', type: 'BOOLEAN', name: 'isOrganizer', @@ -4703,6 +4850,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '34f2ac5d-bb7e-446c-ab52-18e722345a24', type: 'UUID', name: 'workspaceMemberId', @@ -4724,6 +4872,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '0c215138-fc5b-4be2-8c37-0acc7cb4e5a1', type: 'SELECT', name: 'responseStatus', @@ -4774,6 +4923,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '16b867dd-9fb1-43ab-8254-2478004b30b3', type: 'UUID', name: 'id', @@ -4795,6 +4945,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'fdfea59a-624c-4af3-9901-1f86d1972b23', type: 'TEXT', name: 'displayName', @@ -4816,6 +4967,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '2f77bc8e-26dc-40b1-964a-f0748feb193a', type: 'RELATION', name: 'person', @@ -4863,6 +5015,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '597d153f-8724-4d61-8863-8bfae905721f', type: 'RELATION', name: 'calendarEvent', @@ -4910,6 +5063,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '83d94e19-f9f3-47bb-a277-6935af6ae69d', type: 'UUID', name: 'personId', @@ -4931,6 +5085,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'cc27c5b5-44cc-4f19-a56e-8ce172e2ab37', type: 'DATE_TIME', name: 'updatedAt', @@ -4952,6 +5107,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '22c34bd1-550b-4b5c-a2a4-fbb475a4420b', type: 'DATE_TIME', name: 'createdAt', @@ -4973,6 +5129,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '7b7792da-246d-4015-855a-ea029f0b8a02', type: 'DATE_TIME', name: 'deletedAt', @@ -4994,6 +5151,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '7794c913-c52f-4c06-921e-2b391b63e51e', type: 'UUID', name: 'calendarEventId', @@ -5015,6 +5173,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '30fd4e8a-2089-4443-ac06-5cd53d9a3fcf', type: 'RELATION', name: 'workspaceMember', @@ -5062,6 +5221,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'c97d9e28-d807-4fff-ba2c-c72f99087f89', type: 'TEXT', name: 'handle', @@ -5118,6 +5278,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'e8a5a86c-b1ce-4db1-8d51-d5b01d2b361b', type: 'DATE_TIME', name: 'updatedAt', @@ -5139,6 +5300,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '09a753b7-a5f9-4810-ae2f-389982f593c3', type: 'DATE_TIME', name: 'createdAt', @@ -5160,6 +5322,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '7881aa82-a7ed-4090-923d-f1c0cf16a486', type: 'DATE_TIME', name: 'deletedAt', @@ -5181,6 +5344,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '7f1d2847-9f16-457f-a57c-de36c401286a', type: 'UUID', name: 'recordId', @@ -5202,6 +5366,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '1db6f800-bb46-45a2-a324-cfe52362ed9a', type: 'UUID', name: 'id', @@ -5223,6 +5388,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '785dc6cb-77dc-4bdd-be44-60ad8f1f45da', type: 'UUID', name: 'workspaceMemberId', @@ -5244,6 +5410,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '3d6dc314-877d-4aaa-88bd-364dc50f780b', type: 'RELATION', name: 'workspaceMember', @@ -5291,6 +5458,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '80fe2b13-5cb0-48a0-9341-aec08481628f', type: 'RAW_JSON', name: 'context', @@ -5313,6 +5481,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '0383ac8e-6138-4e06-a828-bfc391e53d01', type: 'TEXT', name: 'name', @@ -5334,6 +5503,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'f4f0343a-8241-492a-8156-18d40c75f46a', type: 'RAW_JSON', name: 'properties', @@ -5355,6 +5525,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'a8282a28-724f-487b-a9fa-f0d10c919237', type: 'TEXT', name: 'objectName', @@ -5376,6 +5547,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'd85abbad-9616-456f-978c-4cced740490c', type: 'TEXT', name: 'objectMetadataId', @@ -5432,6 +5604,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '818ec7cd-9181-4c72-ad99-c19b00fde065', type: 'TEXT', name: 'syncCursor', @@ -5454,6 +5627,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '93658b38-cb56-4d2b-93f8-3a4c7714f7c4', type: 'TEXT', name: 'handle', @@ -5475,6 +5649,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'af61423d-0891-4e91-b6d3-2f7ed6363916', type: 'UUID', name: 'connectedAccountId', @@ -5496,6 +5671,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'e921674b-2e9f-4f19-a067-920685cf9164', type: 'SELECT', name: 'visibility', @@ -5532,6 +5708,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '0abc3baf-2797-4f88-8565-a3ffa4468b55', type: 'DATE_TIME', name: 'deletedAt', @@ -5553,6 +5730,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'e567e960-f3c8-4ef0-b810-d8a4bc6a4f7d', type: 'BOOLEAN', name: 'isSyncEnabled', @@ -5574,6 +5752,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'bb3531fe-a008-4505-820b-0cb2c365b05d', type: 'DATE_TIME', name: 'createdAt', @@ -5595,6 +5774,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'd9a353c7-25ba-403f-8157-0d8bee911cec', type: 'UUID', name: 'id', @@ -5616,6 +5796,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'd1596020-b595-4bf9-b3c1-782f9b49f41b', type: 'RELATION', name: 'calendarChannelEventAssociations', @@ -5663,6 +5844,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'd757fd20-3568-411f-a2ba-ec2f7b30dc55', type: 'SELECT', name: 'syncStatus', @@ -5720,6 +5902,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '529b36bb-42d1-4361-ac0a-e683557cc879', type: 'DATE_TIME', name: 'updatedAt', @@ -5741,6 +5924,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '8d7cb56f-29f1-40ad-90cf-4497bee669a1', type: 'SELECT', name: 'contactAutoCreationPolicy', @@ -5792,6 +5976,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'c933e11e-7820-42e4-a589-389c2f314add', type: 'RELATION', name: 'connectedAccount', @@ -5839,6 +6024,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '01e23a9d-d8b7-47c6-a1f8-7e012ae9f54a', type: 'DATE_TIME', name: 'syncStageStartedAt', @@ -5860,6 +6046,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '9c5f7d31-5b5e-4af1-9918-859ce66b6c08', type: 'SELECT', name: 'syncStage', @@ -5924,6 +6111,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '0c81da27-4ff4-4bf4-8937-9a8ee627e46c', type: 'NUMBER', name: 'throttleFailureCount', @@ -5945,6 +6133,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '5c73b1cc-ddda-46a8-a517-f0bb5f0c5f60', type: 'BOOLEAN', name: 'isContactAutoCreationEnabled', @@ -6001,6 +6190,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '0cc37cbd-c7ce-4898-b34d-5da7736e7b54', type: 'DATE_TIME', name: 'updatedAt', @@ -6022,6 +6212,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '537e956c-58bb-4ed4-8127-beb0f2d04dd2', type: 'RELATION', name: 'messages', @@ -6069,6 +6260,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '728f4580-9220-4130-9a25-c56669ad0e43', type: 'DATE_TIME', name: 'deletedAt', @@ -6090,6 +6282,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'fe0508ef-6e8e-4422-b822-67899af4aa58', type: 'DATE_TIME', name: 'createdAt', @@ -6111,6 +6304,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '823a20db-9431-422c-b0a1-4f559b992651', type: 'UUID', name: 'id', @@ -6167,6 +6361,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '7011922c-2271-4960-81eb-b9f9ae3ae00c', type: 'DATE_TIME', name: 'updatedAt', @@ -6188,6 +6383,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '37abc2ae-9f44-4bc0-8277-e3ddfd54738c', type: 'RELATION', name: 'people', @@ -6235,6 +6431,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'c264b8c8-1260-410b-aa34-d69b14bba19b', type: 'LINKS', name: 'domainName', @@ -6261,6 +6458,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '73c7c0bc-a328-488f-b357-fd9dc332ab75', type: 'BOOLEAN', name: 'visaSponsorship', @@ -6282,6 +6480,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'b08a8600-2c4f-4e8a-8f32-6ffe7041e569', type: 'ADDRESS', name: 'address', @@ -6312,6 +6511,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '107fd869-fa4a-4ca5-b6b1-a918ec78851e', type: 'POSITION', name: 'position', @@ -6333,6 +6533,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '2f0ab2d8-3cdf-49d1-a8be-ef204e871968', type: 'NUMBER', name: 'employees', @@ -6354,6 +6555,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '9677b321-e8fc-4d1b-9d7f-145a5dea0001', type: 'RELATION', name: 'favorites', @@ -6401,6 +6603,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '8a21fcb9-5ee7-498c-a09d-1d3137be0540', type: 'DATE_TIME', name: 'deletedAt', @@ -6422,6 +6625,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '300545a5-6ca7-487a-8374-a662bab5d717', type: 'UUID', name: 'accountOwnerId', @@ -6444,6 +6648,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'e41f22fd-ecd5-4b28-a2ed-a04d2a017c19', type: 'CURRENCY', name: 'annualRecurringRevenue', @@ -6469,6 +6674,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '24cc7f7b-e8d3-4c12-a3c5-caa5ccf61523', type: 'UUID', name: 'id', @@ -6490,6 +6696,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '8421d3d3-d5ac-4065-a431-95780fda2ce7', type: 'RELATION', name: 'opportunities', @@ -6537,6 +6744,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '2395970c-d0a2-43df-9f55-58299e930b34', type: 'RELATION', name: 'attachments', @@ -6584,6 +6792,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '3b52848e-e419-4361-8fbc-3d4ed19f1956', type: 'TEXT', name: 'name', @@ -6605,6 +6814,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '5f23c37a-9971-4060-a861-19f030848b90', type: 'LINKS', name: 'xLink', @@ -6630,6 +6840,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'c5103301-686a-4c1f-86d1-69e32a4a34ae', type: 'DATE_TIME', name: 'createdAt', @@ -6651,6 +6862,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '81907e01-90e3-412a-9aa5-9ae8352b679d', type: 'ACTOR', name: 'createdBy', @@ -6675,6 +6887,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'f8393bb6-05c2-44d7-bff8-4a7671b43f15', type: 'RELATION', name: 'timelineActivities', @@ -6722,6 +6935,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '4882e808-7cd2-487f-911f-ab2d9353e60d', type: 'RELATION', name: 'accountOwner', @@ -6770,6 +6984,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'a8cf3568-4d04-43cf-b8c2-2070a7eb0e4e', type: 'MULTI_SELECT', name: 'workPolicy', @@ -6813,6 +7028,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'd69eb854-c043-43d9-a40e-65a0649fd1a9', type: 'RELATION', name: 'taskTargets', @@ -6860,6 +7076,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '531c4b2e-94a0-46f4-9395-277c3239413d', type: 'RELATION', name: 'noteTargets', @@ -6907,6 +7124,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'de10d71e-4cfa-4322-b967-761871e69bc0', type: 'LINKS', name: 'introVideo', @@ -6932,6 +7150,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'e2e632fe-1c08-4c12-9aba-88f8595bf5be', type: 'RELATION', name: 'activityTargets', @@ -6979,6 +7198,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '16838104-8adf-45a3-93bf-e97551240b66', type: 'LINKS', name: 'linkedinLink', @@ -7004,6 +7224,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '195db745-305e-40f0-b740-d071c5c19214', type: 'TEXT', name: 'tagline', @@ -7025,6 +7246,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '2d8e886a-3ebf-474c-8c7a-909e9d7fcc6f', type: 'BOOLEAN', name: 'idealCustomerProfile', @@ -7082,6 +7304,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'c496110c-239a-4dd4-bdbd-022ca4fdc62c', type: 'RELATION', name: 'calendarEvent', @@ -7129,6 +7352,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '8505bc8b-e978-401a-8983-f1f1e64aa26d', type: 'UUID', name: 'id', @@ -7150,6 +7374,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '18e21e78-56c2-492a-8082-f1e8ceb72e14', type: 'UUID', name: 'calendarChannelId', @@ -7171,6 +7396,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'b61d8723-b739-42b6-b23d-b82e09b34669', type: 'DATE_TIME', name: 'deletedAt', @@ -7192,6 +7418,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '97a0be23-ba2e-4af3-8503-d4c27c293a37', type: 'DATE_TIME', name: 'createdAt', @@ -7213,6 +7440,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '906e35f2-e2d1-45d5-8326-cb7712a19e60', type: 'RELATION', name: 'calendarChannel', @@ -7260,6 +7488,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'aa298945-e331-40de-a6db-855b58b99d05', type: 'TEXT', name: 'eventExternalId', @@ -7281,6 +7510,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '0ec16ef5-2331-4a1e-b429-0e4fc3d9576f', type: 'DATE_TIME', name: 'updatedAt', @@ -7302,6 +7532,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '2c765e90-ce86-4f6b-a528-94e38b5aaf54', type: 'UUID', name: 'calendarEventId', @@ -7358,6 +7589,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '78eec6b7-ab9c-4dee-ac64-2b9e40b467f6', type: 'TEXT', name: 'name', @@ -7379,6 +7611,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'd2653ce4-585b-4a38-9e09-4ae8e2afae51', type: 'DATE_TIME', name: 'expiresAt', @@ -7400,6 +7633,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '9e5cd8cb-e800-4b25-a9e6-cfb6d51623c6', type: 'DATE_TIME', name: 'updatedAt', @@ -7421,6 +7655,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '68704d45-b248-4e41-a07b-21d5874663bb', type: 'DATE_TIME', name: 'revokedAt', @@ -7442,6 +7677,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '77ef9f04-627b-4708-b400-076629ed9f20', type: 'DATE_TIME', name: 'createdAt', @@ -7463,6 +7699,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'dc4892f0-a890-4a49-90ae-5a7999665785', type: 'UUID', name: 'id', @@ -7484,6 +7721,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'bbe022a1-426f-40c2-ad1d-8294ef127c0b', type: 'DATE_TIME', name: 'deletedAt', @@ -7540,6 +7778,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '9d2499b3-403c-473f-b61f-61bbea97afeb', type: 'UUID', name: 'noteId', @@ -7561,6 +7800,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '0d232853-5ae9-43f3-ac4a-248c50e2a64e', type: 'UUID', name: 'taskId', @@ -7582,6 +7822,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '8e506212-1b66-4981-95d6-f0ac83f5d869', type: 'RELATION', name: 'person', @@ -7629,6 +7870,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'dc005581-351b-4fa0-9b39-da5bbe2554b7', type: 'RELATION', name: 'task', @@ -7676,6 +7918,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '86e97af0-ec16-4937-b5b6-e4531027be82', type: 'UUID', name: 'rocketId', @@ -7697,6 +7940,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'c33a0768-3f55-4c7b-aa1a-07aeacf3fb85', type: 'UUID', name: 'viewId', @@ -7718,6 +7962,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'afc385d4-22d1-4f83-a67a-46450df368e9', type: 'DATE_TIME', name: 'updatedAt', @@ -7739,6 +7984,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '90a28b04-0214-424f-afad-172b7cd28073', type: 'UUID', name: 'workflowId', @@ -7760,6 +8006,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '6a245087-243d-450b-9f00-c951d417d4ef', type: 'UUID', name: 'personId', @@ -7781,6 +8028,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '14e0bf40-d4eb-4893-a5f2-3df3ce749996', type: 'UUID', name: 'workspaceMemberId', @@ -7802,6 +8050,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '0ecb3679-5ff7-4b55-9ed3-9927bc9e184b', type: 'RELATION', name: 'note', @@ -7849,6 +8098,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '3a561744-45bd-45a6-af94-bfb4d4f508fe', type: 'DATE_TIME', name: 'createdAt', @@ -7870,6 +8120,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '46ff8942-360f-4837-9a83-007739c8ba05', type: 'RELATION', name: 'view', @@ -7917,6 +8168,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '6e104959-9dfb-42a7-80da-0ddb0dab12f9', type: 'UUID', name: 'opportunityId', @@ -7938,6 +8190,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'f112f2a8-4f21-454d-b3a7-fcd85f0eab72', type: 'NUMBER', name: 'position', @@ -7959,6 +8212,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'e4102fb0-c6e3-47e8-a810-71e0b6453705', type: 'DATE_TIME', name: 'deletedAt', @@ -7980,6 +8234,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'a1555234-ff28-4a04-871c-31008b39e442', type: 'UUID', name: 'id', @@ -8001,6 +8256,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '10509b5e-71c0-49e8-9cb8-d0ff7ee8691b', type: 'UUID', name: 'companyId', @@ -8022,6 +8278,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'eed525bd-edf3-4030-9f09-8ff68226a6a0', type: 'RELATION', name: 'workflow', @@ -8069,6 +8326,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '5b559e4c-eb75-4a1e-b904-a486d2328b24', type: 'RELATION', name: 'workspaceMember', @@ -8116,6 +8374,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '7155582f-4bbc-4643-be0c-38165b8a282f', type: 'RELATION', name: 'company', @@ -8163,6 +8422,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '11e6c0a0-e1fa-4931-a705-8725a79afe24', type: 'RELATION', name: 'rocket', @@ -8210,6 +8470,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '1d3858e1-e4aa-484f-b422-8bbefa9409c8', type: 'RELATION', name: 'opportunity', @@ -8292,6 +8553,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '974ab999-a946-409f-820c-aa2e2c21f3ce', type: 'DATE_TIME', name: 'updatedAt', @@ -8313,6 +8575,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '70a9b04f-0d11-41a1-bce8-e7ac8bb0ed5d', type: 'DATE_TIME', name: 'createdAt', @@ -8334,6 +8597,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'da1dda8a-b7b6-4166-b11b-740a8414706b', type: 'UUID', name: 'authorId', @@ -8355,6 +8619,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '3b07941b-15b6-4468-8e2f-52abf7ff36b3', type: 'TEXT', name: 'body', @@ -8376,6 +8641,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '8f985123-68d4-4e8a-b75b-85a75f0f071e', type: 'UUID', name: 'id', @@ -8397,6 +8663,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'e48bc6a2-211c-46aa-9f22-1859aedac28e', type: 'RELATION', name: 'activity', @@ -8444,6 +8711,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'c39eb95c-2e9f-4fd3-abc3-103986dd21bb', type: 'UUID', name: 'activityId', @@ -8465,6 +8733,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '571e3b8c-0c80-4292-93b1-c73b4d976b05', type: 'DATE_TIME', name: 'deletedAt', @@ -8486,6 +8755,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'b1ead0df-5b1c-4c00-b0c5-05a67ec37327', type: 'RELATION', name: 'author', @@ -8568,6 +8838,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '0c1f5af5-c2d5-4f38-9fd4-6ce854e693d3', type: 'DATE_TIME', name: 'updatedAt', @@ -8589,6 +8860,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'f06f5946-e54f-458d-9c77-47d6d8fbd995', type: 'DATE_TIME', name: 'endsAt', @@ -8610,6 +8882,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'bc8be6a6-4707-498a-9e79-8ffb86e92a43', type: 'RELATION', name: 'calendarEventParticipants', @@ -8657,6 +8930,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '6bfac067-9c6c-4b4d-bdaf-ecf7737b2599', type: 'TEXT', name: 'iCalUID', @@ -8678,6 +8952,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '45bd7c28-f450-4487-a556-1fd85be68beb', type: 'TEXT', name: 'title', @@ -8699,6 +8974,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '52d1ed74-b3d5-4339-b408-6f4c8dbc3969', type: 'DATE_TIME', name: 'createdAt', @@ -8720,6 +8996,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '4078641f-c8b4-418c-9e7a-0bfdc411c4d9', type: 'DATE_TIME', name: 'externalUpdatedAt', @@ -8741,6 +9018,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'ae4f8ff1-47f1-4b84-b61b-c519c939a409', type: 'TEXT', name: 'conferenceSolution', @@ -8762,6 +9040,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'a77794e2-adea-40cb-a0f9-a91a6d4494ed', type: 'DATE_TIME', name: 'startsAt', @@ -8783,6 +9062,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '62d6a06b-0083-4702-be85-edd6ca882816', type: 'TEXT', name: 'location', @@ -8804,6 +9084,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '567c7852-6dc5-4c6e-826d-e4b253614e60', type: 'TEXT', name: 'recurringEventExternalId', @@ -8825,6 +9106,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'c0ed400f-b0cf-4fe1-a929-89698dc020a5', type: 'DATE_TIME', name: 'externalCreatedAt', @@ -8846,6 +9128,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'da0d1cc9-be28-4b41-9ddf-48041702024b', type: 'TEXT', name: 'description', @@ -8867,6 +9150,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '52db308a-e428-4efd-95ed-2b0e19cbdc92', type: 'RELATION', name: 'calendarChannelEventAssociations', @@ -8914,6 +9198,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '63904769-6145-4230-b294-c4554c36a273', type: 'BOOLEAN', name: 'isCanceled', @@ -8935,6 +9220,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '48fac512-a780-4c44-b1dc-f178bd8ab3f8', type: 'DATE_TIME', name: 'deletedAt', @@ -8956,6 +9242,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '1ba833a8-68ca-4396-b3ed-9a7411e1dc4f', type: 'UUID', name: 'id', @@ -8977,6 +9264,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '3050381d-7191-4d18-be27-9a92cbefb57a', type: 'LINKS', name: 'conferenceLink', @@ -9002,6 +9290,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'b6cf9c5d-e923-4026-9316-c3a513ce7c12', type: 'BOOLEAN', name: 'isFullDay', @@ -9058,6 +9347,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'ac76a0ff-f5c1-4127-b354-0b3ce2b3696b', type: 'RELATION', name: 'favorites', @@ -9105,6 +9395,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'e32f7a81-d208-4c14-afb4-a4befc938670', type: 'RELATION', name: 'assignedActivities', @@ -9152,6 +9443,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '85df4525-aed1-4e46-b718-b5bc963da41d', type: 'RELATION', name: 'auditLogs', @@ -9199,6 +9491,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'a1ffe54a-6b76-47fa-bd25-df479a31eee2', type: 'FULL_NAME', name: 'name', @@ -9223,6 +9516,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '7370da8c-294f-4671-91e5-7f87f4dccc1e', type: 'RELATION', name: 'calendarEventParticipants', @@ -9270,6 +9564,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '13531c23-42ca-4b1e-a6e3-3fcfad74a3e9', type: 'RELATION', name: 'connectedAccounts', @@ -9317,6 +9612,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'a5fc2711-0e3d-40ac-938a-8beafeac1f57', type: 'RELATION', name: 'timelineActivities', @@ -9364,6 +9660,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'bb548a08-0706-4021-833d-e527c23e2a48', type: 'RELATION', name: 'accountOwnerForCompanies', @@ -9411,6 +9708,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'fc4f41c0-01ea-428d-9e0c-e2496acc765b', type: 'TEXT', name: 'avatarUrl', @@ -9432,6 +9730,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'f74a56bf-9230-4452-b6a0-099ba9f7de0d', type: 'RELATION', name: 'authoredComments', @@ -9479,6 +9778,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'e2895a0d-0e4f-4673-a778-2b99cac1ab20', type: 'UUID', name: 'userId', @@ -9500,6 +9800,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '4cceec11-98cc-41c6-b08c-b04887a0ac22', type: 'DATE_TIME', name: 'createdAt', @@ -9521,6 +9822,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '1dc4eef9-d576-4106-b19e-2fc91777470d', type: 'TEXT', name: 'timeZone', @@ -9542,6 +9844,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '2f548d63-6cf6-4116-ae5a-03fcc35ffd1d', type: 'UUID', name: 'id', @@ -9563,6 +9866,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '6cc143e8-f88a-4d75-a52c-d5c7f7419d97', type: 'SELECT', name: 'timeFormat', @@ -9606,6 +9910,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'b9f4e812-721f-4c83-9f1e-42b79042d905', type: 'DATE_TIME', name: 'updatedAt', @@ -9627,6 +9932,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '12e6ccfa-23ef-4b68-a043-6012bc7b9c67', type: 'TEXT', name: 'locale', @@ -9648,6 +9954,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'b75d64ca-eb86-439d-ad61-3f23efec07e4', type: 'TEXT', name: 'userEmail', @@ -9669,6 +9976,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'dd63010d-24f1-4e62-9b49-b4728bb3bd81', type: 'DATE_TIME', name: 'deletedAt', @@ -9690,6 +9998,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'f173a8e9-af79-4377-9b21-5cb1ca27bc87', type: 'TEXT', name: 'colorScheme', @@ -9711,6 +10020,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'f76b3faa-0bc6-45ed-9654-0421171a1f1a', type: 'RELATION', name: 'authoredActivities', @@ -9758,6 +10068,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'c5df2d21-5db8-4e72-82bf-aeb3ec984ca9', type: 'RELATION', name: 'authoredAttachments', @@ -9805,6 +10116,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'd82db237-ca6d-4bee-8d69-dfa0f753707b', type: 'RELATION', name: 'messageParticipants', @@ -9852,6 +10164,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'e64fef03-fda1-4b5c-8894-d1bee725e7e2', type: 'RELATION', name: 'blocklist', @@ -9899,6 +10212,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '3653df1b-5687-45c1-a2bf-afc261fe85a8', type: 'RELATION', name: 'assignedTasks', @@ -9946,6 +10260,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '18a0276f-ce5e-4fc7-81fc-c32f6dd844f3', type: 'SELECT', name: 'dateFormat', @@ -10031,6 +10346,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'f58f100f-8ee9-4a0c-8f35-8bdcb561d586', type: 'DATE_TIME', name: 'createdAt', @@ -10052,6 +10368,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'a3740f53-215a-477d-82be-b57265731d83', type: 'DATE_TIME', name: 'deletedAt', @@ -10073,6 +10390,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '67dbcf4d-f15b-4703-ba84-4bc2b9903579', type: 'UUID', name: 'id', @@ -10094,6 +10412,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'd26efc67-251a-4bdd-a585-177717e298a6', type: 'TEXT', name: 'eventName', @@ -10115,6 +10434,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'c8d7ed48-3d0e-47fa-a4af-5a62e578c128', type: 'UUID', name: 'workflowId', @@ -10137,6 +10457,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'a424fba4-d3f4-41b1-bf9a-4b809ad628a9', type: 'RELATION', name: 'workflow', @@ -10184,6 +10505,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'aabd6970-7bf9-488b-8411-5bc654574d58', type: 'DATE_TIME', name: 'updatedAt', @@ -10240,6 +10562,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'ee4d98d0-37a4-42cc-8794-653099d4df54', type: 'BOOLEAN', name: 'isVisible', @@ -10261,6 +10584,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '643509ce-5666-4264-8b09-f095e23a1624', type: 'NUMBER', name: 'position', @@ -10282,6 +10606,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'c672e744-21f3-4d23-abd8-fcc03fad503a', type: 'UUID', name: 'viewId', @@ -10303,6 +10628,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '49e8ada7-3a80-49c7-869a-3ebfdae35387', type: 'NUMBER', name: 'size', @@ -10324,6 +10650,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'dd7510e1-4f22-4376-8436-19d7d631ea77', type: 'DATE_TIME', name: 'createdAt', @@ -10345,6 +10672,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'f74ba2c1-22ab-4827-85ad-d2dbbe2a9b51', type: 'RELATION', name: 'view', @@ -10392,6 +10720,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '959d36dc-493b-4e08-ae3d-38680bab1d0d', type: 'UUID', name: 'id', @@ -10413,6 +10742,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '300b7bf6-e1fa-4cd2-a601-7a125b7bf1b8', type: 'DATE_TIME', name: 'deletedAt', @@ -10434,6 +10764,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '0f7acd2a-ccd1-437e-b80a-bf4555a7c034', type: 'UUID', name: 'fieldMetadataId', @@ -10455,6 +10786,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '217be100-e82e-4aae-9566-b091823a5466', type: 'DATE_TIME', name: 'updatedAt', @@ -10511,6 +10843,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '330a6b96-c7eb-41ae-962e-eb528dc16aaf', type: 'DATE_TIME', name: 'updatedAt', @@ -10532,6 +10865,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '45fe30a3-141f-4908-be8b-b826f84edb75', type: 'UUID', name: 'viewId', @@ -10553,6 +10887,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '7924f4d6-c92b-436f-a86d-26b2dcc521aa', type: 'TEXT', name: 'direction', @@ -10574,6 +10909,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'fc34ddd1-7f8a-4f23-a2b6-9a6d3165cc0a', type: 'DATE_TIME', name: 'deletedAt', @@ -10595,6 +10931,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'e4f8f882-dec2-4d6b-a141-936e87d3fd27', type: 'UUID', name: 'id', @@ -10616,6 +10953,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '25ae0938-795a-491a-b029-e4672412e85f', type: 'RELATION', name: 'view', @@ -10663,6 +11001,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '540715e7-6531-4746-b567-b0a7fcda60ef', type: 'UUID', name: 'fieldMetadataId', @@ -10684,6 +11023,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '26889121-d2d9-49dc-86ac-51c64d123197', type: 'DATE_TIME', name: 'createdAt', @@ -10739,6 +11079,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '9aed4be2-3434-489f-a8a3-384311ee585e', type: 'RELATION', name: 'activityTargets', @@ -10786,6 +11127,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '13794481-6a3a-48cb-80c2-109b7558f7b3', type: 'RELATION', name: 'attachments', @@ -10833,6 +11175,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '79da64bc-eea3-476e-801b-f08c86a8c337', type: 'RELATION', name: 'favorites', @@ -10880,6 +11223,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '0a688ec2-f55c-4485-a7a9-9438c19bcbe3', type: 'ACTOR', name: 'createdBy', @@ -10904,6 +11248,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '17cbb6ed-1acc-43e9-a802-96a2b373a067', type: 'DATE_TIME', name: 'updatedAt', @@ -10925,6 +11270,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'ba68ee30-5dc6-47db-bf6f-db25d829feb5', type: 'TEXT', name: 'name', @@ -10946,6 +11292,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'ff73fd8a-9b60-4480-82d0-7b96c3c3aab6', type: 'POSITION', name: 'position', @@ -10967,6 +11314,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '83515891-eb29-472e-9cde-4a1d42b6855d', type: 'RELATION', name: 'taskTargets', @@ -11014,6 +11362,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '73428c65-a426-4c59-b50b-0dea5ffe9bf0', type: 'DATE_TIME', name: 'createdAt', @@ -11035,6 +11384,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '6c65c781-9def-4c6c-98d4-25d3c0c085b8', type: 'UUID', name: 'id', @@ -11056,6 +11406,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'b2643f4a-319e-49d4-a7b7-cbfff4712bf7', type: 'DATE_TIME', name: 'deletedAt', @@ -11077,6 +11428,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '75f64c23-e9a5-4ada-8dc6-3c2c2ea27280', type: 'RELATION', name: 'noteTargets', @@ -11124,6 +11476,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'aeefa434-6843-4b47-92f6-3ce6d8e93860', type: 'RELATION', name: 'timelineActivities', @@ -11206,6 +11559,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'fa957d80-c61a-4298-aab9-54e8fba2110d', type: 'UUID', name: 'id', @@ -11227,6 +11581,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'f966b379-0438-4b9c-8696-3edf18c197f7', type: 'RELATION', name: 'workspaceMember', @@ -11274,6 +11629,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '37f7671b-aa7c-4fed-b50c-9b7cc7f59aa8', type: 'TEXT', name: 'handle', @@ -11295,6 +11651,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '862261a3-5473-4e16-9220-16444ee99243', type: 'DATE_TIME', name: 'updatedAt', @@ -11316,6 +11673,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '1233f40e-cc97-4281-a8a8-c23de8961693', type: 'DATE_TIME', name: 'createdAt', @@ -11337,6 +11695,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'a75f6045-cf57-4b05-960b-5719ce2037c9', type: 'DATE_TIME', name: 'deletedAt', @@ -11358,6 +11717,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'c30e3bff-ce4e-4e64-80e3-bf417ceefa25', type: 'UUID', name: 'workspaceMemberId', @@ -11414,6 +11774,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '2d00a390-5ae4-40d9-8d6c-6abbcdc0bc75', type: 'DATE_TIME', name: 'updatedAt', @@ -11435,6 +11796,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '2aab6f08-2cab-4beb-8775-1ad8b89c3313', type: 'ACTOR', name: 'createdBy', @@ -11459,6 +11821,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'f40e2edc-c0dd-46d8-9a01-a0afd33a00db', type: 'UUID', name: 'id', @@ -11480,6 +11843,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '421de2e5-36a1-4fb2-ae00-4e2f62dd67e6', type: 'UUID', name: 'workflowVersionId', @@ -11502,6 +11866,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'c9e837bb-4516-43ad-8756-7a9c2ad33ca9', type: 'DATE_TIME', name: 'createdAt', @@ -11523,6 +11888,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'aec86cc0-1fb6-4ff0-b1df-85b74ee6a974', type: 'UUID', name: 'workflowId', @@ -11544,6 +11910,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'b38c3f7d-d455-4f1c-b674-66b86c0d56cc', type: 'RELATION', name: 'workflowVersion', @@ -11591,6 +11958,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '446d4c37-71ac-4a61-8b65-16d70250cbc5', type: 'SELECT', name: 'status', @@ -11641,6 +12009,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '0ed4a200-4d2e-4d4d-81b2-45240ae9e1b8', type: 'DATE_TIME', name: 'endedAt', @@ -11662,6 +12031,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'a5444b51-1ad5-46ae-b9d9-ef5f1def9232', type: 'RELATION', name: 'workflow', @@ -11709,6 +12079,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'b388b202-371a-4663-9299-afc6be461a8c', type: 'DATE_TIME', name: 'deletedAt', @@ -11730,6 +12101,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '2e84a165-18af-492f-8662-14fbd5852b0c', type: 'DATE_TIME', name: 'startedAt', @@ -11786,6 +12158,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '6f41b722-fbc4-44d9-9315-51498900e157', type: 'DATE_TIME', name: 'updatedAt', @@ -11807,6 +12180,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '1d53ad9c-bdf4-4660-b4b6-e79162d13c39', type: 'RELATION', name: 'favorites', @@ -11854,6 +12228,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'e7df66e0-50cc-4047-9b91-8f5ee1ff7246', type: 'DATE_TIME', name: 'createdAt', @@ -11875,6 +12250,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '34ec585e-b42e-4e63-8e4b-7f9bf6a4e79b', type: 'DATE_TIME', name: 'deletedAt', @@ -11896,6 +12272,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '22b735aa-95d7-44fe-a4a6-965171e3f7b7', type: 'DATE_TIME', name: 'dueAt', @@ -11917,6 +12294,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'fea3a2f3-73ca-4142-8d15-3b8877b68cee', type: 'UUID', name: 'id', @@ -11938,6 +12316,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '4f82dbad-cf61-4dd1-ad90-4cec71b288be', type: 'RELATION', name: 'attachments', @@ -11985,6 +12364,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'b52cbdab-0c97-4601-b5ad-de766ec9f940', type: 'SELECT', name: 'status', @@ -12028,6 +12408,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '1eea9af9-53a3-4085-9391-4a2fad697eb7', type: 'RELATION', name: 'timelineActivities', @@ -12075,6 +12456,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '78360243-9830-4f40-a515-59cd8faf88b1', type: 'RICH_TEXT', name: 'body', @@ -12096,6 +12478,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '33d7eb92-8231-417c-8efe-eb837c6ccadf', type: 'ACTOR', name: 'createdBy', @@ -12120,6 +12503,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '5f9a8761-e5e6-492c-87ab-401c7b0e25cd', type: 'UUID', name: 'assigneeId', @@ -12141,6 +12525,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '7a062a59-07da-4d2d-a0e8-f79f87e2e5e3', type: 'RELATION', name: 'assignee', @@ -12188,6 +12573,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '80932806-6350-4941-a291-4d1430275d65', type: 'RELATION', name: 'taskTargets', @@ -12235,6 +12621,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'daf389ba-49e6-4753-8a5a-a0330c5ab154', type: 'POSITION', name: 'position', @@ -12256,6 +12643,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '0413dccd-00a6-4abd-967a-45233e8cf666', type: 'TEXT', name: 'title', @@ -12312,6 +12700,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '38f5127c-ab53-45bc-90b9-a3883d697eb9', type: 'DATE_TIME', name: 'deletedAt', @@ -12333,6 +12722,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'b2a7002e-19f2-4f16-8b5b-ea452aeb7104', type: 'TEXT', name: 'lastPublishedVersionId', @@ -12354,6 +12744,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'd6fb9120-9aa5-4fdf-a84a-2805bb359855', type: 'RELATION', name: 'versions', @@ -12401,6 +12792,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '99d7e7e6-ac6a-4b74-9129-d4a9759bc928', type: 'DATE_TIME', name: 'createdAt', @@ -12422,6 +12814,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '06a5a424-930c-4465-9943-2a9c486f2038', type: 'UUID', name: 'id', @@ -12443,6 +12836,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '650b02ef-32b5-4b10-bdab-a49f4e3b7a9b', type: 'MULTI_SELECT', name: 'statuses', @@ -12484,6 +12878,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'b14865e9-26a6-4ae8-930d-d22c21c7696c', type: 'RELATION', name: 'eventListeners', @@ -12532,6 +12927,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '4f32f14b-5009-4624-8b19-e65084368349', type: 'RELATION', name: 'runs', @@ -12579,6 +12975,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'bab376b1-a7d9-48b8-88b7-f302bc6d483d', type: 'TEXT', name: 'name', @@ -12600,6 +12997,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '141281c7-5b28-41d4-99bd-31c1e4c88e9b', type: 'RELATION', name: 'favorites', @@ -12647,6 +13045,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'f21077b2-283f-4362-98fd-e5ea5f87d621', type: 'POSITION', name: 'position', @@ -12668,6 +13067,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'b063853c-a442-4b52-8f89-f750c44a2e04', type: 'DATE_TIME', name: 'updatedAt', @@ -12725,6 +13125,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '6615546f-8744-4b36-83d5-59c1ef72e845', type: 'UUID', name: 'id', @@ -12746,6 +13147,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '299c9bdc-5137-4d2b-8225-ddb81a720bfe', type: 'UUID', name: 'rocketId', @@ -12767,6 +13169,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '8626f50f-1d39-40e7-a05b-528c42fe4313', type: 'RELATION', name: 'task', @@ -12814,6 +13217,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'f2f27d9e-c959-4dee-aed4-f87c64229c3f', type: 'RELATION', name: 'rocket', @@ -12861,6 +13265,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '62e278a5-d719-4b49-a820-fc5ed358311e', type: 'DATE_TIME', name: 'happensAt', @@ -12882,6 +13287,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '145c8790-abd1-49fb-9857-650da78c6717', type: 'RELATION', name: 'company', @@ -12929,6 +13335,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '08dd3999-ca07-43cf-b872-a2bed317aa6a', type: 'TEXT', name: 'name', @@ -12950,6 +13357,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'bbdf103a-60cb-4c39-a982-1704e26f6735', type: 'UUID', name: 'noteId', @@ -12971,6 +13379,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '9e9d4989-fdf2-4e71-90af-aae2ef0b4923', type: 'RELATION', name: 'person', @@ -13018,6 +13427,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '1b496b65-948d-4614-889f-2a9e0a6292f3', type: 'UUID', name: 'linkedObjectMetadataId', @@ -13039,6 +13449,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'cd22914c-60d6-4e45-9936-9ff345d3a5bb', type: 'DATE_TIME', name: 'updatedAt', @@ -13060,6 +13471,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '77f9059d-33f5-4fa1-8641-4976d38eaeb7', type: 'TEXT', name: 'linkedRecordCachedName', @@ -13081,6 +13493,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '137a88ef-9c08-414c-adcc-2d450624acf8', type: 'RELATION', name: 'workspaceMember', @@ -13128,6 +13541,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'b2df9370-1560-47f6-89b6-88293de46572', type: 'UUID', name: 'personId', @@ -13149,6 +13563,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '9cb24716-07e8-4c54-a0c8-7005a619314e', type: 'RAW_JSON', name: 'properties', @@ -13170,6 +13585,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'bc5277df-a1ec-4ae2-affe-e42aed88f0b9', type: 'UUID', name: 'taskId', @@ -13191,6 +13607,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'cda06c7c-9c62-4579-b3ba-2e8275c604b1', type: 'DATE_TIME', name: 'createdAt', @@ -13212,6 +13629,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '95fa7d72-fd85-4a32-a489-a5d03199debb', type: 'UUID', name: 'workspaceMemberId', @@ -13233,6 +13651,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '1d16560a-4a8f-448c-8289-70e3e98ad3b4', type: 'UUID', name: 'linkedRecordId', @@ -13254,6 +13673,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'c646eaf5-2754-4924-a212-c5747b0d1d41', type: 'UUID', name: 'companyId', @@ -13275,6 +13695,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '88a829b3-6d66-4e53-b1ad-ed02e544e4d2', type: 'RELATION', name: 'opportunity', @@ -13322,6 +13743,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'db7ab4e8-9d93-4f45-bbbf-f68eb31776cb', type: 'RELATION', name: 'note', @@ -13369,6 +13791,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '1ee1c4bc-7281-4eff-bc32-6afaff324477', type: 'DATE_TIME', name: 'deletedAt', @@ -13390,6 +13813,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '225d1acc-2ccc-458d-acd5-06f7d8647a38', type: 'UUID', name: 'opportunityId', @@ -13447,6 +13871,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'f926708e-cc19-4e5f-8684-d14a1a1bc7df', type: 'RELATION', name: 'pointOfContactForOpportunities', @@ -13495,6 +13920,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '5a063961-bffe-4d68-a0c8-e86b6b26f85e', type: 'FULL_NAME', name: 'name', @@ -13519,6 +13945,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'd02d52c8-379b-476d-84d6-1222c2179db7', type: 'LINKS', name: 'linkedinLink', @@ -13544,6 +13971,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '504f7e23-1476-422b-ac1d-5d86d3d33022', type: 'RELATION', name: 'company', @@ -13591,6 +14019,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'daab9749-7d39-44cb-9557-23e0e257aaad', type: 'RELATION', name: 'attachments', @@ -13638,6 +14067,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '6e46c199-d4f9-4c60-b9bb-19da859991b4', type: 'RELATION', name: 'timelineActivities', @@ -13685,6 +14115,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'aa5e7931-e042-45d5-af4a-e4c22979a3b7', type: 'RELATION', name: 'calendarEventParticipants', @@ -13732,6 +14163,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'a8a3d68a-a1b1-4912-aa13-51f088c6a754', type: 'DATE_TIME', name: 'deletedAt', @@ -13753,6 +14185,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'e442f814-f8a6-44e9-b60c-d736afec87dd', type: 'DATE_TIME', name: 'createdAt', @@ -13774,6 +14207,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'a91e4125-7885-4b3c-9672-0f6d2fc49c07', type: 'DATE_TIME', name: 'updatedAt', @@ -13795,6 +14229,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '4a9a6c3e-633d-47d6-99bc-b8e6e9b6aad9', type: 'TEXT', name: 'jobTitle', @@ -13816,6 +14251,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'b801b0d2-2a24-42be-b878-ef439ef7ea78', type: 'TEXT', name: 'intro', @@ -13837,6 +14273,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'c188f5b7-2259-4207-87d2-5232ec775029', type: 'RELATION', name: 'favorites', @@ -13884,9 +14321,10 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '5cdf5de5-6c7f-4787-b47d-de5e3787e670', type: 'MULTI_SELECT', - name: 'workPrefereance', + name: 'workPreference', label: 'Work Preference', description: "Person's Work Preference", icon: 'IconHome', @@ -13927,6 +14365,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '1315ca79-3abd-4b7f-917e-8949db3e01f3', type: 'RATING', name: 'performanceRating', @@ -13979,6 +14418,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '749e13b2-5430-4993-83db-635c6ff11d1a', type: 'LINKS', name: 'xLink', @@ -14004,6 +14444,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '0f7b1621-5da6-439a-927f-948fd2dd6f29', type: 'RELATION', name: 'noteTargets', @@ -14051,6 +14492,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '759da4e9-e9c6-4827-9802-5b7b4021448f', type: 'TEXT', name: 'city', @@ -14072,6 +14514,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '48f76fc3-3c82-463d-afa7-977011eed7c8', type: 'UUID', name: 'companyId', @@ -14093,6 +14536,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '23c64ee1-4935-4a25-b401-afc08a0967fd', type: 'RELATION', name: 'activityTargets', @@ -14140,6 +14584,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'd4a5fecc-285b-42d7-8eb4-96fc2a6838c4', type: 'PHONES', name: 'phones', @@ -14165,6 +14610,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'bb5900a5-29ff-46bb-8bbb-7dbedd844e29', type: 'ACTOR', name: 'createdBy', @@ -14189,6 +14635,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '54fbea0f-ce3f-4d28-8fa4-abcfe1ae3d54', type: 'UUID', name: 'id', @@ -14210,6 +14657,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '718ee8a6-a294-4609-91d4-7ab0e83d996f', type: 'POSITION', name: 'position', @@ -14231,6 +14679,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '779bdf5a-a28d-48be-8d02-b6ca93851829', type: 'RELATION', name: 'messageParticipants', @@ -14278,6 +14727,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '7f8249b8-5919-4fee-81cf-b4dfdb89cf4d', type: 'EMAILS', name: 'emails', @@ -14302,6 +14752,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'b328a712-5dc3-457a-aa56-8631f1b57248', type: 'RELATION', name: 'taskTargets', @@ -14349,6 +14800,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '377efd0d-9798-4522-b9db-73c19bf55e26', type: 'TEXT', name: 'avatarUrl', @@ -14370,6 +14822,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '3a34e81d-d5b1-417d-9831-a355040a6f44', type: 'PHONES', name: 'whatsapp', @@ -14430,6 +14883,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'f115229b-f5b3-4623-ac80-f8bf3df5e077', type: 'RELATION', name: 'favorites', @@ -14477,6 +14931,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'ed46299b-4006-45b4-aaa4-2dc7c0c25613', type: 'DATE_TIME', name: 'deletedAt', @@ -14498,6 +14953,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '54952f24-63cc-475e-ab4c-b0f3ad6400bc', type: 'UUID', name: 'id', @@ -14519,6 +14975,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'bef43ac8-834a-4a86-8bfb-5bed6cd94a57', type: 'RELATION', name: 'noteTargets', @@ -14566,6 +15023,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '210b544b-46f7-422d-84e7-328ef270f081', type: 'RELATION', name: 'timelineActivities', @@ -14613,6 +15071,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'd80706c2-3c5d-491f-9759-b05b25004799', type: 'POSITION', name: 'position', @@ -14634,6 +15093,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '2238e043-a33f-4e8d-99d6-386cd0d2ea3b', type: 'DATE_TIME', name: 'updatedAt', @@ -14655,6 +15115,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'c996b13e-a787-44f7-ad7a-2ba22afd46bc', type: 'ACTOR', name: 'createdBy', @@ -14679,6 +15140,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '61375724-caaa-46b1-8e50-4b2f23afac71', type: 'RICH_TEXT', name: 'body', @@ -14700,6 +15162,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '7ffc4d21-aa5d-4f0f-bc91-61c72660f2ba', type: 'TEXT', name: 'title', @@ -14721,6 +15184,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '27b7400b-e754-4db9-b895-0a9252a015bf', type: 'DATE_TIME', name: 'createdAt', @@ -14742,6 +15206,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '80479763-1c19-4465-a62f-cd5e37c9165a', type: 'RELATION', name: 'attachments', @@ -14824,6 +15289,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '4e4f0f26-89bd-41eb-bc00-a591e041ca7d', type: 'DATE_TIME', name: 'updatedAt', @@ -14845,6 +15311,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '362cb4b7-dda1-4136-9385-4f5402b4f700', type: 'UUID', name: 'id', @@ -14866,6 +15333,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'd13848d4-b41e-43b0-87ca-ab40c00fd739', type: 'DATE_TIME', name: 'createdAt', @@ -14887,6 +15355,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '81685712-ecaa-4d04-a8d9-e6c93a6bfe7a', type: 'TEXT', name: 'displayValue', @@ -14908,6 +15377,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'f72701d1-8337-4640-84b7-4570cfbe96aa', type: 'UUID', name: 'viewId', @@ -14929,6 +15399,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'e323bb1b-8018-4b6f-b065-37c979caf7fc', type: 'DATE_TIME', name: 'deletedAt', @@ -14950,6 +15421,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '646c0bfc-071d-44f3-b8d4-428061106500', type: 'UUID', name: 'fieldMetadataId', @@ -14971,6 +15443,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '016a2312-ac04-4d46-b7c7-2d6e24e363c8', type: 'TEXT', name: 'value', @@ -14992,6 +15465,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'e09cc7ab-2750-4cd9-86e1-c257dac8b390', type: 'TEXT', name: 'operand', @@ -15013,6 +15487,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'd1829b60-e886-4dac-8cf3-0d3b84da093d', type: 'RELATION', name: 'view', @@ -15095,6 +15570,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'dd208a4e-3e5e-4192-83a1-adbc5b9123a1', type: 'RAW_JSON', name: 'steps', @@ -15116,6 +15592,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'fe28de2e-8979-4cfd-9b66-03e67e93406b', type: 'UUID', name: 'id', @@ -15137,6 +15614,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'dcdf9413-04c8-44f7-ace7-a11950ce3019', type: 'SELECT', name: 'status', @@ -15187,6 +15665,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'ef3d8797-2f17-4f31-9970-697fc230df7f', type: 'RELATION', name: 'runs', @@ -15234,6 +15713,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'ebe58c33-17d2-418b-b33f-f5c3907e97d7', type: 'DATE_TIME', name: 'deletedAt', @@ -15255,6 +15735,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '1b223e47-9228-41c4-a420-ff6ed516393e', type: 'DATE_TIME', name: 'createdAt', @@ -15276,6 +15757,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '54cde78b-4bd4-436b-b10b-e6de37494161', type: 'RELATION', name: 'workflow', @@ -15323,6 +15805,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '4ebb0eb9-9ad6-4e5b-b01b-837b0e2c0718', type: 'RAW_JSON', name: 'trigger', @@ -15344,6 +15827,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'ef2dd597-faaa-4b1d-96b7-5953cd8c8539', type: 'TEXT', name: 'name', @@ -15365,6 +15849,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'd9f1d5c8-ce95-48c3-a4f3-0909aea7e322', type: 'DATE_TIME', name: 'updatedAt', @@ -15386,6 +15871,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '182c0466-9e03-4500-8cf7-22673e05b299', type: 'UUID', name: 'workflowId', @@ -15442,6 +15928,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '426142c4-5a52-4105-a880-387b6dba6362', type: 'DATE_TIME', name: 'deletedAt', @@ -15463,6 +15950,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '4d459669-2ffd-4fd0-b28b-57d8a1eb9434', type: 'UUID', name: 'personId', @@ -15484,6 +15972,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '1a6dd2bf-3da7-492d-80de-a8891c5307b7', type: 'UUID', name: 'opportunityId', @@ -15505,6 +15994,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '3669c8b2-ba73-4e9b-be61-10a2023955fd', type: 'RELATION', name: 'activity', @@ -15552,6 +16042,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '023f376c-023a-4cae-89e8-961add0b3743', type: 'UUID', name: 'id', @@ -15573,6 +16064,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '6a5833a9-0741-44f0-948d-424a60d3264e', type: 'RELATION', name: 'note', @@ -15620,6 +16112,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '1d3d2f23-c3e6-4ee0-b62e-7668e4f8147d', type: 'TEXT', name: 'fullPath', @@ -15641,6 +16134,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'd9a80298-6f72-4b2f-a859-2bd355d36735', type: 'RELATION', name: 'author', @@ -15688,6 +16182,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '42dbb8d7-320b-460d-a25e-943222ae2a9b', type: 'TEXT', name: 'type', @@ -15709,6 +16204,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'a7971798-8b85-477e-8a1e-9b2f2fb5da6d', type: 'UUID', name: 'rocketId', @@ -15730,6 +16226,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '610633e7-0221-4838-adaf-71943d18a5ca', type: 'RELATION', name: 'person', @@ -15777,6 +16274,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '26668e62-39e7-4842-a198-a657f44206f8', type: 'RELATION', name: 'task', @@ -15824,6 +16322,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '1433d739-29ed-450c-8216-6afea26d21fb', type: 'RELATION', name: 'company', @@ -15871,6 +16370,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '1a8466d6-8be7-458a-a7ea-cdf11b4fe31d', type: 'DATE_TIME', name: 'updatedAt', @@ -15892,6 +16392,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '7dc968df-7127-4e05-b63e-f2e9809324ee', type: 'UUID', name: 'noteId', @@ -15913,6 +16414,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '7ffec116-99d2-402d-adea-68b731be4c74', type: 'UUID', name: 'taskId', @@ -15934,6 +16436,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'd76c9b48-5a3e-445f-be15-948de8ba2fc2', type: 'TEXT', name: 'name', @@ -15955,6 +16458,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'fa9d964c-3d30-4d8b-bc57-9b382053e9e3', type: 'RELATION', name: 'opportunity', @@ -16002,6 +16506,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '133dcd8e-aa07-4c9e-a337-92dabd5f7d03', type: 'UUID', name: 'activityId', @@ -16023,6 +16528,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'd10c5485-159b-4700-a709-37d3049a8778', type: 'DATE_TIME', name: 'createdAt', @@ -16044,6 +16550,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '60f8c4fb-1ab9-44a7-a5bd-e89a0349feb7', type: 'RELATION', name: 'rocket', @@ -16091,6 +16598,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'adaa359c-c834-44bb-8639-44ef1affce2f', type: 'UUID', name: 'authorId', @@ -16112,6 +16620,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '3486e0e2-053c-4e27-9d5d-c27b5dd739ea', type: 'UUID', name: 'companyId', @@ -16168,6 +16677,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '827beccf-c3ca-4f24-a349-5d7c8690ac95', type: 'TEXT', name: 'headerMessageId', @@ -16189,6 +16699,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'f51b5646-06b0-45e4-960f-5f8eaeb18c83', type: 'DATE_TIME', name: 'deletedAt', @@ -16210,6 +16721,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'f32d4ef7-cadd-4ce5-84ce-a95fd76fde05', type: 'DATE_TIME', name: 'updatedAt', @@ -16231,6 +16743,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'c36f257c-2318-4b61-9c63-666e1fc0810c', type: 'DATE_TIME', name: 'receivedAt', @@ -16252,6 +16765,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '86a6dca6-5ad5-4576-b8f4-4be343e573de', type: 'RELATION', name: 'messageChannelMessageAssociations', @@ -16299,6 +16813,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '606cef74-d9c3-4abc-b6ae-bb778f518e49', type: 'RELATION', name: 'messageParticipants', @@ -16346,6 +16861,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '21c34ce8-7505-4d6c-9fc8-218dd8532a25', type: 'UUID', name: 'id', @@ -16367,6 +16883,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '48f20f05-700d-4609-965b-8a954bf07e8d', type: 'UUID', name: 'messageThreadId', @@ -16388,6 +16905,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '11f38fa4-e7b8-4275-b0b2-59688cb2eed8', type: 'RELATION', name: 'messageThread', @@ -16435,6 +16953,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '2697ab29-9991-4188-9569-8bc6fc079ec6', type: 'TEXT', name: 'subject', @@ -16456,6 +16975,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'f6a75fcf-f8a3-41dd-b1d0-efce8358e2d2', type: 'TEXT', name: 'text', @@ -16477,6 +16997,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '29f11f81-aab0-4b96-971f-24d84c81f1bf', type: 'DATE_TIME', name: 'createdAt', @@ -16533,6 +17054,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '61fe3c78-ab04-4a83-9a40-8560f7285abe', type: 'RELATION', name: 'favorites', @@ -16580,6 +17102,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '027418ee-6028-456f-a570-0b032d35b07f', type: 'RELATION', name: 'viewFields', @@ -16627,6 +17150,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '4385a72b-bb9d-4ac6-9c08-d9853c468726', type: 'UUID', name: 'id', @@ -16648,6 +17172,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '421bf244-013a-4962-970a-37150cf38057', type: 'TEXT', name: 'type', @@ -16669,6 +17194,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '8ee5c1d6-718a-4e43-b468-91563270ae35', type: 'TEXT', name: 'icon', @@ -16690,6 +17216,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '073a7e52-0c68-4853-a500-5470b026c914', type: 'SELECT', name: 'key', @@ -16719,6 +17246,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'ed944e8e-e84d-40ef-aa44-b423453c23f9', type: 'BOOLEAN', name: 'isCompact', @@ -16740,6 +17268,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '5454b125-73c2-438b-991b-eb361bcd6295', type: 'TEXT', name: 'kanbanFieldMetadataId', @@ -16761,6 +17290,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '7974ab3b-7d05-4738-a05b-b76840f98328', type: 'RELATION', name: 'viewFilters', @@ -16808,6 +17338,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '23b99490-be92-4edc-a939-07e0f64f13eb', type: 'RELATION', name: 'viewSorts', @@ -16855,6 +17386,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '36f1f251-121a-461c-aef5-aba2c9fa39a6', type: 'UUID', name: 'objectMetadataId', @@ -16876,6 +17408,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: '2fcf2221-da1f-4c19-acdc-adfb089ea219', type: 'POSITION', name: 'position', @@ -16897,6 +17430,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'a0e02b0d-6681-41da-a8a8-48c0bc5ba690', type: 'DATE_TIME', name: 'createdAt', @@ -16918,6 +17452,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'dbc64e7b-2b59-4e9e-9e1e-bcd9e9f5a57a', type: 'DATE_TIME', name: 'deletedAt', @@ -16939,6 +17474,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'f5c9b9fc-87fd-4a74-af09-28a330a53bec', type: 'DATE_TIME', name: 'updatedAt', @@ -16960,6 +17496,7 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = __typename: 'fieldEdge', node: { __typename: 'field', + settings: {}, id: 'a24df79d-a05a-45e7-8791-b71957dff236', type: 'TEXT', name: 'name', diff --git a/packages/twenty-front/src/testing/mock-data/objectMetadataItems.ts b/packages/twenty-front/src/testing/mock-data/generatedMockObjectMetadataItems.ts similarity index 100% rename from packages/twenty-front/src/testing/mock-data/objectMetadataItems.ts rename to packages/twenty-front/src/testing/mock-data/generatedMockObjectMetadataItems.ts diff --git a/packages/twenty-front/src/testing/mock-data/metadata.ts b/packages/twenty-front/src/testing/mock-data/metadata.ts deleted file mode 100644 index f739afd46647..000000000000 --- a/packages/twenty-front/src/testing/mock-data/metadata.ts +++ /dev/null @@ -1,290 +0,0 @@ -import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; -import { mapPaginatedObjectMetadataItemsToObjectMetadataItems } from '@/object-metadata/utils/mapPaginatedObjectMetadataItemsToObjectMetadataItems'; -import { - FieldMetadataType, - ObjectEdge, - ObjectMetadataItemsQuery, -} from '~/generated-metadata/graphql'; -import { mockedStandardObjectMetadataQueryResult } from '~/testing/mock-data/generated/mock-metadata-query-result'; - -// TODO: replace with new mock -const customObjectMetadataItemEdge: ObjectEdge = { - __typename: 'objectEdge', - node: { - __typename: 'object', - id: 'efa1addc-a9cb-4789-b99e-a060fa84f982', - dataSourceId: 'd36e6a2d-28bc-459d-afd5-fe18e4405729', - nameSingular: 'myCustom', - namePlural: 'myCustoms', - labelSingular: 'My Custom', - labelPlural: 'My Customs', - description: 'A custom object example', - icon: 'IconLayoutCollage', - isCustom: true, - isRemote: false, - isActive: true, - isSystem: false, - createdAt: '2024-04-08T12:48:49.538Z', - updatedAt: '2024-04-08T12:48:49.538Z', - labelIdentifierFieldMetadataId: null, - imageIdentifierFieldMetadataId: null, - fields: { - __typename: 'ObjectFieldsConnection', - pageInfo: { - __typename: 'PageInfo', - hasNextPage: false, - hasPreviousPage: false, - startCursor: 'YXJyYXljb25uZWN0aW9uOjA=', - endCursor: 'YXJyYXljb25uZWN0aW9uOjEz', - }, - edges: [ - { - __typename: 'fieldEdge', - node: { - __typename: 'field', - id: 'ea83af89-be10-49af-a605-10c3392ae007', - type: 'RELATION', - name: 'companies', - label: 'Companies', - description: 'A custom Relation example', - icon: 'IconTag', - isCustom: false, - isActive: true, - isSystem: true, - options: null, - isNullable: true, - createdAt: '2024-04-08T12:48:49.538Z', - updatedAt: '2024-04-08T12:48:49.538Z', - defaultValue: null, - relationDefinition: { - relationId: '1ec22b36-9e3c-4f24-8cf6-6c387ec3f243', - __typename: 'RelationDefinition', - direction: 'ONE_TO_MANY', - sourceObjectMetadata: { - __typename: 'object', - id: 'efa1addc-a9cb-4789-b99e-a060fa84f982', - nameSingular: 'myCustom', - namePlural: 'myCustoms', - }, - sourceFieldMetadata: { - __typename: 'field', - id: 'ea83af89-be10-49af-a605-10c3392ae007', - name: 'companies', - }, - targetObjectMetadata: { - __typename: 'object', - id: 'dba899da-7d88-41ac-b70e-5ea612ab4b2e', - nameSingular: 'company', - namePlural: 'companies', - }, - targetFieldMetadata: { - __typename: 'field', - id: 'c9607ed7-168d-4743-a56a-689ffcfffe98', - name: 'myCustom', - }, - }, - }, - }, - { - __typename: 'fieldEdge', - node: { - __typename: 'field', - id: 'c5384d2a-9ec3-4e1b-b93f-86f53f122169', - type: 'UUID', - name: 'objectMetadataId', - label: 'Object Metadata Id', - description: 'View target object', - icon: null, - isCustom: false, - isActive: true, - isSystem: true, - options: null, - isNullable: false, - createdAt: '2024-04-08T12:48:49.538Z', - updatedAt: '2024-04-08T12:48:49.538Z', - defaultValue: null, - relationDefinition: null, - }, - }, - { - __typename: 'fieldEdge', - node: { - __typename: 'field', - id: 'bb4d96be-e4d9-47a9-812d-fcdfb063ebf3', - type: 'POSITION', - name: 'position', - label: 'Position', - description: 'View position', - icon: null, - isCustom: false, - isActive: true, - isSystem: true, - options: null, - isNullable: true, - createdAt: '2024-04-08T12:48:49.538Z', - updatedAt: '2024-04-08T12:48:49.538Z', - defaultValue: null, - relationDefinition: null, - }, - }, - { - __typename: 'fieldEdge', - node: { - __typename: 'field', - id: 'f20c68aa-3930-41c4-9f79-45dceda506df', - type: 'TEXT', - name: 'name', - label: 'Name', - description: 'Custom name', - icon: null, - isCustom: false, - isActive: true, - isSystem: true, - options: null, - isNullable: false, - createdAt: '2024-04-08T12:48:49.538Z', - updatedAt: '2024-04-08T12:48:49.538Z', - defaultValue: "''", - relationDefinition: null, - }, - }, - { - __typename: 'fieldEdge', - node: { - __typename: 'field', - id: 'a3ef848d-660a-4aef-9cd4-5baf25ce36ed', - type: 'DATE_TIME', - name: 'createdAt', - label: 'Creation date', - description: 'Creation date', - icon: 'IconCalendar', - isCustom: false, - isActive: true, - isSystem: true, - options: null, - isNullable: false, - createdAt: '2024-04-08T12:48:49.538Z', - updatedAt: '2024-04-08T12:48:49.538Z', - defaultValue: 'now', - relationDefinition: null, - }, - }, - { - __typename: 'fieldEdge', - node: { - __typename: 'field', - id: '92f3e27c-041d-45b2-b2bd-46db2b1aec3f', - type: 'DATE_TIME', - name: 'updatedAt', - label: 'Update date', - description: 'Update date', - icon: 'IconCalendar', - isCustom: false, - isActive: true, - isSystem: true, - options: null, - isNullable: false, - createdAt: '2024-04-08T12:48:49.538Z', - updatedAt: '2024-04-08T12:48:49.538Z', - defaultValue: 'now', - relationDefinition: null, - }, - }, - { - __typename: 'fieldEdge', - node: { - __typename: 'field', - id: '8d7987eb-99e8-4e54-a86c-86b3bd07d2be', - type: 'UUID', - name: 'id', - label: 'Id', - description: 'Id', - icon: 'Icon123', - isCustom: false, - isActive: true, - isSystem: true, - options: null, - isNullable: false, - createdAt: '2024-04-08T12:48:49.538Z', - updatedAt: '2024-04-08T12:48:49.538Z', - defaultValue: 'uuid', - relationDefinition: null, - }, - }, - { - __typename: 'fieldEdge', - node: { - __typename: 'field', - id: 'e07fcc3f-beec-4d91-8488-9d1d2cfa5f99', - type: FieldMetadataType.Select, - name: 'priority', - label: 'Priority', - description: 'A custom Select example', - icon: 'IconWarning', - isCustom: true, - isActive: true, - isSystem: false, - options: [ - { - id: '2b98dc02-0d99-4f3e-890e-e2e6b8f3196c', - value: 'LOW', - label: 'Low', - color: 'turquoise', - }, - { - id: 'd925a8de-d8ec-4b59-a079-64f4012e3311', - value: 'MEDIUM', - label: 'Medium', - color: 'yellow', - }, - { - id: '6f6e1421-8a42-4d4a-bf76-465b5f84b6d2', - value: 'HIGH', - label: 'High', - color: 'red', - }, - ], - isNullable: true, - createdAt: '2024-04-08T12:48:49.538Z', - updatedAt: '2024-04-08T12:48:49.538Z', - defaultValue: null, - relationDefinition: null, - }, - }, - ], - }, - }, -} as ObjectEdge; - -export const mockedObjectMetadataItemsQueryResult = { - ...mockedStandardObjectMetadataQueryResult, - objects: { - ...mockedStandardObjectMetadataQueryResult.objects, - edges: [ - ...mockedStandardObjectMetadataQueryResult.objects.edges, - customObjectMetadataItemEdge, - ], - }, -} as ObjectMetadataItemsQuery; - -export const mockedObjectMetadataItems = - mapPaginatedObjectMetadataItemsToObjectMetadataItems({ - pagedObjectMetadataItems: mockedObjectMetadataItemsQueryResult, - }); - -export const mockedCompanyObjectMetadataItem = mockedObjectMetadataItems?.find( - (object) => object.nameSingular === 'company', -) as ObjectMetadataItem; - -export const mockedPersonObjectMetadataItem = mockedObjectMetadataItems?.find( - (object) => object.nameSingular === 'person', -) as ObjectMetadataItem; - -export const mockedCustomObjectMetadataItem = mockedObjectMetadataItems?.find( - (object) => object.nameSingular === 'myCustom', -) as ObjectMetadataItem; - -export const mockedOpportunityObjectMetadataItem = - mockedObjectMetadataItems?.find( - (object) => object.nameSingular === 'opportunity', - ) as ObjectMetadataItem; diff --git a/packages/twenty-front/src/testing/mock-data/users.ts b/packages/twenty-front/src/testing/mock-data/users.ts index f7a4c2727e22..cc483bd1e570 100644 --- a/packages/twenty-front/src/testing/mock-data/users.ts +++ b/packages/twenty-front/src/testing/mock-data/users.ts @@ -26,6 +26,7 @@ type MockedUser = Pick< locale: string; defaultWorkspace: Workspace; workspaces: Array<{ workspace: Workspace }>; + workspaceMembers: WorkspaceMember[]; }; export const avatarUrl = @@ -107,6 +108,7 @@ export const mockedUserData: MockedUser = { defaultWorkspace: mockDefaultWorkspace, locale: 'en', workspaces: [{ workspace: mockDefaultWorkspace }], + workspaceMembers: [mockedWorkspaceMemberData], onboardingStatus: OnboardingStatus.Completed, userVars: {}, }; diff --git a/packages/twenty-front/src/testing/mock-data/view-fields.ts b/packages/twenty-front/src/testing/mock-data/view-fields.ts index b68cfb706a27..325e3610ccd7 100644 --- a/packages/twenty-front/src/testing/mock-data/view-fields.ts +++ b/packages/twenty-front/src/testing/mock-data/view-fields.ts @@ -1,240 +1,416 @@ +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; import { mockedViewsData } from './views'; +const companyObjectMetadata = generatedMockObjectMetadataItems.find( + (item) => item.nameSingular === 'company', +); + +const personObjectMetadata = generatedMockObjectMetadataItems.find( + (item) => item.nameSingular === 'person', +); + +const opportunityObjectMetadata = generatedMockObjectMetadataItems.find( + (item) => item.nameSingular === 'opportunity', +); + export const mockedViewFieldsData = [ // Companies { id: '79035310-e955-4986-a4a4-73f9d9949c6a', - fieldMetadataId: '9e123592-cd2b-471c-8143-3cc0b46089ef', + fieldMetadataId: companyObjectMetadata?.fields.find( + (field) => field.name === 'name', + )?.id, viewId: mockedViewsData[0].id, position: 0, isVisible: true, size: 180, createdAt: '2021-09-01T00:00:00.000Z', updatedAt: '2021-09-01T00:00:00.000Z', + deletedAt: null, __typename: 'ViewField', }, { id: '2a96bbc8-d86d-439a-8e50-4b07ebd27750', - fieldMetadataId: 'domainName', + fieldMetadataId: companyObjectMetadata?.fields.find( + (field) => field.name === 'domainName', + )?.id, viewId: mockedViewsData[0].id, position: 1, isVisible: true, size: 100, createdAt: '2021-09-01T00:00:00.000Z', updatedAt: '2021-09-01T00:00:00.000Z', + deletedAt: null, __typename: 'ViewField', }, { id: '0c1b4c7b-6a3d-4fb0-bf2b-5d7c8fb844ed', - fieldMetadataId: 'accountOwner', + fieldMetadataId: companyObjectMetadata?.fields.find( + (field) => field.name === 'accountOwner', + )?.id, viewId: mockedViewsData[0].id, position: 2, isVisible: true, size: 150, createdAt: '2021-09-01T00:00:00.000Z', updatedAt: '2021-09-01T00:00:00.000Z', + deletedAt: null, __typename: 'ViewField', }, { id: 'cc7f9560-32b5-4b82-8fd9-b05fe77c8cf7', - fieldMetadataId: 'createdAt', + fieldMetadataId: companyObjectMetadata?.fields.find( + (field) => field.name === 'createdAt', + )?.id, viewId: mockedViewsData[0].id, position: 3, isVisible: true, size: 150, createdAt: '2021-09-01T00:00:00.000Z', updatedAt: '2021-09-01T00:00:00.000Z', + deletedAt: null, __typename: 'ViewField', }, { id: '3de4d078-3396-4480-be2d-6f3b1a228b0d', - fieldMetadataId: 'employees', + fieldMetadataId: companyObjectMetadata?.fields.find( + (field) => field.name === 'employees', + )?.id, viewId: mockedViewsData[0].id, position: 4, isVisible: true, size: 150, createdAt: '2021-09-01T00:00:00.000Z', updatedAt: '2021-09-01T00:00:00.000Z', + deletedAt: null, __typename: 'ViewField', }, { id: '4650c8fb-0f1e-4342-88dc-adedae1445f9', - fieldMetadataId: 'linkedin', + fieldMetadataId: companyObjectMetadata?.fields.find( + (field) => field.name === 'linkedinLink', + )?.id, viewId: mockedViewsData[0].id, position: 5, isVisible: true, size: 170, createdAt: '2021-09-01T00:00:00.000Z', updatedAt: '2021-09-01T00:00:00.000Z', + deletedAt: null, __typename: 'ViewField', }, { id: '727430bf-6ff8-4c85-9828-cbe72ac0fc27', - fieldMetadataId: 'address', + fieldMetadataId: companyObjectMetadata?.fields.find( + (field) => field.name === 'address', + )?.id, viewId: mockedViewsData[0].id, position: 6, isVisible: true, size: 170, createdAt: '2021-09-01T00:00:00.000Z', updatedAt: '2021-09-01T00:00:00.000Z', + deletedAt: null, + __typename: 'ViewField', + }, + + // Companies v2 + { + id: '79035310-e955-4986-a4a4-73f9d9949c6a', + fieldMetadataId: companyObjectMetadata?.fields.find( + (field) => field.name === 'name', + )?.id, + viewId: mockedViewsData[3].id, + position: 0, + isVisible: true, + size: 180, + createdAt: '2021-09-01T00:00:00.000Z', + updatedAt: '2021-09-01T00:00:00.000Z', + deletedAt: null, + __typename: 'ViewField', + }, + { + id: '2a96bbc8-d86d-439a-8e50-4b07ebd27750', + fieldMetadataId: companyObjectMetadata?.fields.find( + (field) => field.name === 'domainName', + )?.id, + viewId: mockedViewsData[3].id, + position: 1, + isVisible: true, + size: 100, + createdAt: '2021-09-01T00:00:00.000Z', + updatedAt: '2021-09-01T00:00:00.000Z', + deletedAt: null, + __typename: 'ViewField', + }, + { + id: '0c1b4c7b-6a3d-4fb0-bf2b-5d7c8fb844ed', + fieldMetadataId: companyObjectMetadata?.fields.find( + (field) => field.name === 'accountOwner', + )?.id, + viewId: mockedViewsData[3].id, + position: 2, + isVisible: true, + size: 150, + createdAt: '2021-09-01T00:00:00.000Z', + updatedAt: '2021-09-01T00:00:00.000Z', + deletedAt: null, + __typename: 'ViewField', + }, + { + id: 'cc7f9560-32b5-4b82-8fd9-b05fe77c8cf7', + fieldMetadataId: companyObjectMetadata?.fields.find( + (field) => field.name === 'createdAt', + )?.id, + viewId: mockedViewsData[3].id, + position: 3, + isVisible: true, + size: 150, + createdAt: '2021-09-01T00:00:00.000Z', + updatedAt: '2021-09-01T00:00:00.000Z', + deletedAt: null, + __typename: 'ViewField', + }, + { + id: '3de4d078-3396-4480-be2d-6f3b1a228b0d', + fieldMetadataId: companyObjectMetadata?.fields.find( + (field) => field.name === 'employees', + )?.id, + viewId: mockedViewsData[3].id, + position: 4, + isVisible: true, + size: 150, + createdAt: '2021-09-01T00:00:00.000Z', + updatedAt: '2021-09-01T00:00:00.000Z', + deletedAt: null, + __typename: 'ViewField', + }, + { + id: '4650c8fb-0f1e-4342-88dc-adedae1445f9', + fieldMetadataId: companyObjectMetadata?.fields.find( + (field) => field.name === 'linkedinLink', + )?.id, + viewId: mockedViewsData[3].id, + position: 5, + isVisible: true, + size: 170, + createdAt: '2021-09-01T00:00:00.000Z', + updatedAt: '2021-09-01T00:00:00.000Z', + deletedAt: null, + __typename: 'ViewField', + }, + { + id: '727430bf-6ff8-4c85-9828-cbe72ac0fc27', + fieldMetadataId: companyObjectMetadata?.fields.find( + (field) => field.name === 'address', + )?.id, + viewId: mockedViewsData[3].id, + position: 6, + isVisible: true, + size: 170, + createdAt: '2021-09-01T00:00:00.000Z', + updatedAt: '2021-09-01T00:00:00.000Z', + deletedAt: null, __typename: 'ViewField', }, // People { id: '28894146-4fde-4a16-a9ca-1a31b5b788b4', - fieldMetadataId: 'displayName', + fieldMetadataId: personObjectMetadata?.fields.find( + (field) => field.name === 'name', + )?.id, viewId: mockedViewsData[1].id, position: 0, isVisible: true, size: 210, createdAt: '2021-09-01T00:00:00.000Z', updatedAt: '2021-09-01T00:00:00.000Z', + deletedAt: null, __typename: 'ViewField', }, { id: 'e1e24864-8601-4cd8-8a63-09c1285f2e39', - fieldMetadataId: 'email', + fieldMetadataId: personObjectMetadata?.fields.find( + (field) => field.name === 'emails', + )?.id, viewId: mockedViewsData[1].id, position: 1, isVisible: true, size: 150, createdAt: '2021-09-01T00:00:00.000Z', updatedAt: '2021-09-01T00:00:00.000Z', + deletedAt: null, __typename: 'ViewField', }, { id: '5a1df716-7211-445a-9f16-9783a00998a7', - fieldMetadataId: 'company', + fieldMetadataId: personObjectMetadata?.fields.find( + (field) => field.name === 'company', + )?.id, viewId: mockedViewsData[1].id, position: 2, isVisible: true, size: 150, createdAt: '2021-09-01T00:00:00.000Z', updatedAt: '2021-09-01T00:00:00.000Z', + deletedAt: null, __typename: 'ViewField', }, { id: 'a6e1197a-7e84-4d92-ace2-367c0bc46c49', - fieldMetadataId: 'phone', + fieldMetadataId: personObjectMetadata?.fields.find( + (field) => field.name === 'phones', + )?.id, viewId: mockedViewsData[1].id, position: 3, isVisible: true, size: 150, createdAt: '2021-09-01T00:00:00.000Z', updatedAt: '2021-09-01T00:00:00.000Z', + deletedAt: null, __typename: 'ViewField', }, { id: 'c9343097-d14b-4559-a5fa-626c1527d39f', - fieldMetadataId: 'createdAt', + fieldMetadataId: personObjectMetadata?.fields.find( + (field) => field.name === 'createdAt', + )?.id, viewId: mockedViewsData[1].id, position: 4, isVisible: true, size: 150, createdAt: '2021-09-01T00:00:00.000Z', updatedAt: '2021-09-01T00:00:00.000Z', + deletedAt: null, __typename: 'ViewField', }, { id: 'a873e5f0-fed6-47e9-a712-6854eab3ec77', - fieldMetadataId: 'city', + fieldMetadataId: personObjectMetadata?.fields.find( + (field) => field.name === 'city', + )?.id, viewId: mockedViewsData[1].id, position: 5, isVisible: true, size: 150, createdAt: '2021-09-01T00:00:00.000Z', updatedAt: '2021-09-01T00:00:00.000Z', + deletedAt: null, __typename: 'ViewField', }, { id: '66f134b8-5329-422f-b88e-83e6bb707eb5', - fieldMetadataId: 'jobTitle', + fieldMetadataId: personObjectMetadata?.fields.find( + (field) => field.name === 'jobTitle', + )?.id, viewId: mockedViewsData[1].id, position: 6, isVisible: true, size: 150, createdAt: '2021-09-01T00:00:00.000Z', updatedAt: '2021-09-01T00:00:00.000Z', + deletedAt: null, __typename: 'ViewField', }, { id: '648faa24-cabb-482a-8578-ba3f09906017', - fieldMetadataId: 'linkedin', + fieldMetadataId: personObjectMetadata?.fields.find( + (field) => field.name === 'linkedinLink', + )?.id, viewId: mockedViewsData[1].id, position: 7, isVisible: true, size: 150, createdAt: '2021-09-01T00:00:00.000Z', updatedAt: '2021-09-01T00:00:00.000Z', + deletedAt: null, __typename: 'ViewField', }, { id: '3a9e7f0d-a4ce-4ad5-aac7-3a24eb1a412d', - fieldMetadataId: 'x', + fieldMetadataId: personObjectMetadata?.fields.find( + (field) => field.name === 'xLink', + )?.id, viewId: mockedViewsData[1].id, position: 8, isVisible: true, size: 150, createdAt: '2021-09-01T00:00:00.000Z', updatedAt: '2021-09-01T00:00:00.000Z', + deletedAt: null, __typename: 'ViewField', }, // Opportunities { id: '35a42e2d-83dd-4b57-ada6-f90616da706d', - fieldMetadataId: 'amount', + fieldMetadataId: opportunityObjectMetadata?.fields.find( + (field) => field.name === 'name', + )?.id, viewId: mockedViewsData[2].id, position: 0, isVisible: true, size: 180, createdAt: '2021-09-01T00:00:00.000Z', updatedAt: '2021-09-01T00:00:00.000Z', + deletedAt: null, __typename: 'ViewField', }, { id: '3159acd8-463f-458d-bf9a-af8ac6f57dc0', - fieldMetadataId: 'closeDate', + fieldMetadataId: opportunityObjectMetadata?.fields.find( + (field) => field.name === 'closeDate', + )?.id, viewId: mockedViewsData[2].id, position: 2, isVisible: true, size: 100, createdAt: '2021-09-01T00:00:00.000Z', updatedAt: '2021-09-01T00:00:00.000Z', + deletedAt: null, __typename: 'ViewField', }, { id: 'afc0819d-b694-4e3c-a2e6-25261aa3ed2c', - fieldMetadataId: 'company', + fieldMetadataId: opportunityObjectMetadata?.fields.find( + (field) => field.name === 'company', + )?.id, viewId: mockedViewsData[2].id, position: 3, isVisible: true, size: 150, createdAt: '2021-09-01T00:00:00.000Z', updatedAt: '2021-09-01T00:00:00.000Z', + deletedAt: null, __typename: 'ViewField', }, { id: 'ec0507bb-aedc-4695-ba96-d81bdeb9db83', - fieldMetadataId: 'createdAt', + fieldMetadataId: opportunityObjectMetadata?.fields.find( + (field) => field.name === 'createdAt', + )?.id, viewId: mockedViewsData[2].id, position: 4, isVisible: true, size: 150, createdAt: '2021-09-01T00:00:00.000Z', updatedAt: '2021-09-01T00:00:00.000Z', + deletedAt: null, __typename: 'ViewField', }, { id: '3f1585f6-44f6-45c5-b840-bc05af5d0008', - fieldMetadataId: 'pointOfContact', + fieldMetadataId: opportunityObjectMetadata?.fields.find( + (field) => field.name === 'pointOfContact', + )?.id, viewId: mockedViewsData[2].id, position: 5, isVisible: true, size: 150, createdAt: '2021-09-01T00:00:00.000Z', updatedAt: '2021-09-01T00:00:00.000Z', + deletedAt: null, __typename: 'ViewField', }, ]; diff --git a/packages/twenty-front/src/testing/mock-data/views.ts b/packages/twenty-front/src/testing/mock-data/views.ts index d13c0dc3fdfb..3318e158b4f6 100644 --- a/packages/twenty-front/src/testing/mock-data/views.ts +++ b/packages/twenty-front/src/testing/mock-data/views.ts @@ -1,813 +1,22 @@ -import { RecordGqlConnection } from '@/object-record/graphql/types/RecordGqlConnection'; -import { ViewType } from '@/views/types/ViewType'; +import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; -export const viewQueryResultMock: RecordGqlConnection = { - __typename: 'ViewConnection', - totalCount: 6, - pageInfo: { - __typename: 'PageInfo', - hasNextPage: false, - hasPreviousPage: false, - startCursor: 'WyIyY2M5MGJjZC0wNzkzLTRkMzctYWZlOS1kZTVlY2NmYmFlNzEiXQ==', - endCursor: 'WyJmZjhlZGQyMi02NjVhLTQ5NWYtODljYy03MGFiOGZkNWMxYTYiXQ==', - }, - edges: [ - { - __typename: 'ViewEdge', - cursor: 'WyIyY2M5MGJjZC0wNzkzLTRkMzctYWZlOS1kZTVlY2NmYmFlNzEiXQ==', - node: { - __typename: 'View', - position: 1, - updatedAt: '2024-07-11T10:21:33.304Z', - key: null, - id: '2cc90bcd-0793-4d37-afe9-de5eccfbae71', - objectMetadataId: '9c293c05-f461-456a-b5a2-2710b5b30447', - createdAt: '2024-07-11T10:21:33.304Z', - icon: 'IconLayoutKanban', - isCompact: false, - name: 'By Stage', - type: 'kanban' as ViewType, - kanbanFieldMetadataId: 'f74de381-4392-4662-a890-5ed3b5bd847d', - viewSorts: { - __typename: 'ViewSortConnection', - edges: [], - }, - viewFilters: { - __typename: 'ViewFilterConnection', - edges: [], - }, - viewFields: { - __typename: 'ViewFieldConnection', - edges: [ - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T10:21:33.304Z', - position: 2, - id: '05ffd5e0-69b0-4774-843a-fbae12231e7d', - viewId: '2cc90bcd-0793-4d37-afe9-de5eccfbae71', - createdAt: '2024-07-11T10:21:33.304Z', - isVisible: true, - size: 150, - fieldMetadataId: 'c4e1b90f-bf9a-4a04-b67a-0f88263d8706', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T10:21:33.304Z', - position: 4, - id: '573ae123-1eed-4671-8fff-d9ac9455b1b4', - viewId: '2cc90bcd-0793-4d37-afe9-de5eccfbae71', - createdAt: '2024-07-11T10:21:33.304Z', - isVisible: true, - size: 150, - fieldMetadataId: '6e073ac2-034c-43ab-b0c6-206b1dd1174b', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T10:21:33.304Z', - position: 0, - id: 'ae4f318f-5059-41ba-b365-22daa0b3cb0e', - viewId: '2cc90bcd-0793-4d37-afe9-de5eccfbae71', - createdAt: '2024-07-11T10:21:33.304Z', - isVisible: true, - size: 150, - fieldMetadataId: '4ee7183a-f1f6-42a6-94e5-79f741357760', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T10:21:33.304Z', - position: 1, - id: 'b5ac37dc-9f64-412f-a598-611bdb5d27f8', - viewId: '2cc90bcd-0793-4d37-afe9-de5eccfbae71', - createdAt: '2024-07-11T10:21:33.304Z', - isVisible: true, - size: 150, - fieldMetadataId: '37593700-f3ac-43a2-9ce2-1b811fa3fbfc', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T10:21:33.304Z', - position: 5, - id: 'bda12277-2962-4b35-a549-665cbbe53483', - viewId: '2cc90bcd-0793-4d37-afe9-de5eccfbae71', - createdAt: '2024-07-11T10:21:33.304Z', - isVisible: true, - size: 150, - fieldMetadataId: '031bc747-1787-4e46-9320-562a8b75f3ff', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T10:21:33.304Z', - position: 3, - id: 'f43e660f-bbf8-4a2f-aeb1-54890ac40f4b', - viewId: '2cc90bcd-0793-4d37-afe9-de5eccfbae71', - createdAt: '2024-07-11T10:21:33.304Z', - isVisible: true, - size: 150, - fieldMetadataId: '2cc0fa2b-dbea-4fd0-b7f5-11fa54cd0242', - }, - }, - ], - }, - }, - }, - { - __typename: 'ViewEdge', - cursor: 'WyI1N2FkYTUyMy0zZDgzLTQzOTEtYThiOS0wZTkxOGUyNGE1MTkiXQ==', - node: { - __typename: 'View', - position: null, - updatedAt: '2024-07-12T09:52:15.595Z', - key: 'INDEX', - id: '57ada523-3d83-4391-a8b9-0e918e24a519', - objectMetadataId: '3561dbe5-39a2-40fa-a111-4af924e39908', - createdAt: '2024-07-12T09:52:15.595Z', - icon: 'IconListNumbers', - isCompact: false, - name: 'All Tests', - type: 'table', - kanbanFieldMetadataId: '', - viewSorts: { - __typename: 'ViewSortConnection', - edges: [], - }, - viewFilters: { - __typename: 'ViewFilterConnection', - edges: [], - }, - viewFields: { - __typename: 'ViewFieldConnection', - edges: [ - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-16T12:58:56.823Z', - position: 2, - id: '39a026d9-8362-4a4c-9b35-3d23218122a7', - viewId: '57ada523-3d83-4391-a8b9-0e918e24a519', - createdAt: '2024-07-16T12:58:56.823Z', - isVisible: true, - size: 100, - fieldMetadataId: '9918f304-99d9-4d5b-8351-c6b6f7cc38bb', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-12T09:52:15.598Z', - position: 0, - id: '3ab70930-e60a-4bfd-830a-57355121d889', - viewId: '57ada523-3d83-4391-a8b9-0e918e24a519', - createdAt: '2024-07-12T09:52:15.598Z', - isVisible: true, - size: 180, - fieldMetadataId: 'f7f485fc-0c14-4b70-a180-0508699a5c14', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-12T09:52:15.604Z', - position: 1, - id: '43ec0b2c-d94f-4eaf-a4bc-f00d409661b5', - viewId: '57ada523-3d83-4391-a8b9-0e918e24a519', - createdAt: '2024-07-12T09:52:15.604Z', - isVisible: true, - size: 180, - fieldMetadataId: '66645848-4100-4649-bc0e-d50281df2fd6', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-12T09:52:15.604Z', - position: 2, - id: '53f01c19-7042-4551-97d8-d36b6ae28602', - viewId: '57ada523-3d83-4391-a8b9-0e918e24a519', - createdAt: '2024-07-12T09:52:15.604Z', - isVisible: true, - size: 180, - fieldMetadataId: '1b3caa7a-343a-4b4b-8c2e-3371cd1dd237', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-16T12:59:52.966Z', - position: 3, - id: 'ecbc275e-f937-4d00-b035-6225e6f87c90', - viewId: '57ada523-3d83-4391-a8b9-0e918e24a519', - createdAt: '2024-07-16T12:59:46.864Z', - isVisible: true, - size: 209, - fieldMetadataId: '9e3e6ed9-7889-4979-bc15-c7803bf437f1', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-12T09:52:15.605Z', - position: 3, - id: 'ed9f32e7-cd08-4bcf-b78f-838371cd282a', - viewId: '57ada523-3d83-4391-a8b9-0e918e24a519', - createdAt: '2024-07-12T09:52:15.605Z', - isVisible: true, - size: 180, - fieldMetadataId: 'ffa953c4-d8e0-49af-b2ef-f16e238f4687', - }, - }, - ], - }, - }, - }, - { - __typename: 'ViewEdge', - cursor: 'WyI1ODJmMjI0Yy0zYzNmLTQxMjctYjFlZC0yOTcxZDI3ZTU0YTQiXQ==', - node: { - __typename: 'View', - position: 0, - updatedAt: '2024-07-11T10:21:33.304Z', - key: 'INDEX', - id: '582f224c-3c3f-4127-b1ed-2971d27e54a4', - objectMetadataId: '9c293c05-f461-456a-b5a2-2710b5b30447', - createdAt: '2024-07-11T10:21:33.304Z', - icon: 'IconTargetArrow', - isCompact: false, - name: 'All Opportunities', - type: 'table', - kanbanFieldMetadataId: '', - viewSorts: { - __typename: 'ViewSortConnection', - edges: [], - }, - viewFilters: { - __typename: 'ViewFilterConnection', - edges: [], - }, - viewFields: { - __typename: 'ViewFieldConnection', - edges: [ - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T10:21:33.304Z', - position: 2, - id: '0f0cacad-7f1d-4667-a0e8-466cddad3e65', - viewId: '582f224c-3c3f-4127-b1ed-2971d27e54a4', - createdAt: '2024-07-11T10:21:33.304Z', - isVisible: true, - size: 150, - fieldMetadataId: 'c4e1b90f-bf9a-4a04-b67a-0f88263d8706', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T10:21:33.304Z', - position: 1, - id: '19d0d674-9825-492d-bbd0-c1de494201dc', - viewId: '582f224c-3c3f-4127-b1ed-2971d27e54a4', - createdAt: '2024-07-11T10:21:33.304Z', - isVisible: true, - size: 150, - fieldMetadataId: '37593700-f3ac-43a2-9ce2-1b811fa3fbfc', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T10:21:33.304Z', - position: 5, - id: '77d6a102-7b8e-40c0-9d53-33e9a8d0df0f', - viewId: '582f224c-3c3f-4127-b1ed-2971d27e54a4', - createdAt: '2024-07-11T10:21:33.304Z', - isVisible: true, - size: 150, - fieldMetadataId: '031bc747-1787-4e46-9320-562a8b75f3ff', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T10:21:33.304Z', - position: 4, - id: '8d1da76d-4056-4675-b2e5-907021c1b482', - viewId: '582f224c-3c3f-4127-b1ed-2971d27e54a4', - createdAt: '2024-07-11T10:21:33.304Z', - isVisible: true, - size: 150, - fieldMetadataId: '6e073ac2-034c-43ab-b0c6-206b1dd1174b', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T10:21:33.304Z', - position: 3, - id: 'a5556adc-e4a0-4f71-aee3-2ff2a4e53b31', - viewId: '582f224c-3c3f-4127-b1ed-2971d27e54a4', - createdAt: '2024-07-11T10:21:33.304Z', - isVisible: true, - size: 150, - fieldMetadataId: '2cc0fa2b-dbea-4fd0-b7f5-11fa54cd0242', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T10:21:33.304Z', - position: 0, - id: 'fa8cdb32-24f0-483d-a9f6-bc92f2704452', - viewId: '582f224c-3c3f-4127-b1ed-2971d27e54a4', - createdAt: '2024-07-11T10:21:33.304Z', - isVisible: true, - size: 150, - fieldMetadataId: '4ee7183a-f1f6-42a6-94e5-79f741357760', - }, - }, - ], - }, - }, - }, - { - __typename: 'ViewEdge', - cursor: 'WyI2NTM3M2UxZS0xNmU1LTRlNWYtOWJjMS1jMDlkOTAxNTZmMjciXQ==', - node: { - __typename: 'View', - position: null, - updatedAt: '2024-07-11T15:41:08.076Z', - key: null, - id: '65373e1e-16e5-4e5f-9bc1-c09d90156f27', - objectMetadataId: 'b8115dc1-5304-4d22-b300-0b4efda42ebc', - createdAt: '2024-07-11T15:41:08.076Z', - icon: 'IconBuildingSkyscraper', - isCompact: false, - name: 'All Companies L', - type: 'kanban', - kanbanFieldMetadataId: '4ba829d2-c34a-40d0-9ae6-a65d11d2ff5a', - viewSorts: { - __typename: 'ViewSortConnection', - edges: [], - }, - viewFilters: { - __typename: 'ViewFilterConnection', - edges: [], - }, - viewFields: { - __typename: 'ViewFieldConnection', - edges: [ - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T15:41:09.141Z', - position: 5, - id: '00bf00d5-f257-4ed0-9a80-ce6d7fa2eace', - viewId: '65373e1e-16e5-4e5f-9bc1-c09d90156f27', - createdAt: '2024-07-11T15:41:09.141Z', - isVisible: true, - size: 170, - fieldMetadataId: 'f50611a0-d4b2-49a3-8110-1ca1282ad9c2', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T15:41:09.082Z', - position: 4, - id: '08ccb08d-d279-4738-bdc0-32a0f9b01390', - viewId: '65373e1e-16e5-4e5f-9bc1-c09d90156f27', - createdAt: '2024-07-11T15:41:09.082Z', - isVisible: true, - size: 150, - fieldMetadataId: '2334adb8-a0c5-408e-a449-6730f010aff1', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T15:41:09.115Z', - position: 2, - id: '478c93ae-1dcc-4d79-b821-b53431348abe', - viewId: '65373e1e-16e5-4e5f-9bc1-c09d90156f27', - createdAt: '2024-07-11T15:41:09.115Z', - isVisible: true, - size: 150, - fieldMetadataId: 'be572271-de80-4d55-ae25-6141ec48e1a7', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T15:41:09.083Z', - position: 7, - id: '4b28e7c9-f97b-4e86-80bf-ca7a1cc49f64', - viewId: '65373e1e-16e5-4e5f-9bc1-c09d90156f27', - createdAt: '2024-07-11T15:41:09.083Z', - isVisible: true, - size: 180, - fieldMetadataId: '4ba829d2-c34a-40d0-9ae6-a65d11d2ff5a', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T15:41:09.076Z', - position: 3, - id: '6402a5db-dc6f-433c-9de3-af19a6d71a28', - viewId: '65373e1e-16e5-4e5f-9bc1-c09d90156f27', - createdAt: '2024-07-11T15:41:09.076Z', - isVisible: true, - size: 150, - fieldMetadataId: '04f98129-3433-43f6-a5fa-5ede5314fafd', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T15:41:09.141Z', - position: 1, - id: '97938fb7-d3a2-42a1-8c04-7ff59d18e41c', - viewId: '65373e1e-16e5-4e5f-9bc1-c09d90156f27', - createdAt: '2024-07-11T15:41:09.141Z', - isVisible: true, - size: 100, - fieldMetadataId: '7b76bf52-04ff-4624-9dd5-26ef59be0d88', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T15:41:09.129Z', - position: 0, - id: 'c7429772-5214-49ee-9d96-c4c9ea929888', - viewId: '65373e1e-16e5-4e5f-9bc1-c09d90156f27', - createdAt: '2024-07-11T15:41:09.129Z', - isVisible: true, - size: 180, - fieldMetadataId: '716b202a-7f2f-4d7a-a78a-666db003d94f', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T15:41:09.083Z', - position: 6, - id: 'ec211171-6676-40d2-acc2-5fa13f11ed00', - viewId: '65373e1e-16e5-4e5f-9bc1-c09d90156f27', - createdAt: '2024-07-11T15:41:09.083Z', - isVisible: true, - size: 170, - fieldMetadataId: '479e7d9f-cd8a-4064-b009-65cb89a16c36', - }, - }, - ], - }, - }, - }, - { - __typename: 'ViewEdge', - cursor: 'WyJiZWU2NWJjNC05YmNiLTQ5YTgtOGVhNS0xYmQ5MjQxYjA5YzMiXQ==', - node: { - __typename: 'View', - position: 0, - updatedAt: '2024-07-11T10:21:33.304Z', - key: 'INDEX', - id: 'bee65bc4-9bcb-49a8-8ea5-1bd9241b09c3', - objectMetadataId: '48824ee2-367d-481f-b80b-ca1eeb85c4ab', - createdAt: '2024-07-11T10:21:33.304Z', - icon: 'IconUser', - isCompact: false, - name: 'All People', - type: 'table', - kanbanFieldMetadataId: '', - viewSorts: { - __typename: 'ViewSortConnection', - edges: [], - }, - viewFilters: { - __typename: 'ViewFilterConnection', - edges: [], - }, - viewFields: { - __typename: 'ViewFieldConnection', - edges: [ - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T10:21:33.304Z', - position: 3, - id: '2dc48490-3ee8-4ade-a979-d5326da33d43', - viewId: 'bee65bc4-9bcb-49a8-8ea5-1bd9241b09c3', - createdAt: '2024-07-11T10:21:33.304Z', - isVisible: true, - size: 150, - fieldMetadataId: '34ed07ad-067a-4f5f-bdee-21a37616f96b', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T10:21:33.304Z', - position: 0, - id: '67af4225-56e0-4ef9-bcfc-4a551d676c2b', - viewId: 'bee65bc4-9bcb-49a8-8ea5-1bd9241b09c3', - createdAt: '2024-07-11T10:21:33.304Z', - isVisible: true, - size: 210, - fieldMetadataId: 'c485ed46-3f8a-4ee6-af70-628b9f18ad47', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T10:21:33.304Z', - position: 5, - id: '796bdd63-cc83-4f8c-b538-9f8e9dfb1937', - viewId: 'bee65bc4-9bcb-49a8-8ea5-1bd9241b09c3', - createdAt: '2024-07-11T10:21:33.304Z', - isVisible: true, - size: 150, - fieldMetadataId: '4aadffed-1df4-4732-bb99-559f31a464af', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T10:21:33.304Z', - position: 7, - id: '80cb1229-5e05-45d4-89da-b2ec850ffb2f', - viewId: 'bee65bc4-9bcb-49a8-8ea5-1bd9241b09c3', - createdAt: '2024-07-11T10:21:33.304Z', - isVisible: true, - size: 150, - fieldMetadataId: 'a8298361-b7c8-4b6c-be6c-d33885e00237', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T10:21:33.304Z', - position: 8, - id: '835b104c-b9fc-4c9f-b659-3dc4bb54d9ef', - viewId: 'bee65bc4-9bcb-49a8-8ea5-1bd9241b09c3', - createdAt: '2024-07-11T10:21:33.304Z', - isVisible: true, - size: 150, - fieldMetadataId: '125cbc00-7efb-473d-b0a6-581d3cf868dd', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T10:21:33.304Z', - position: 6, - id: '8f494c43-6b63-4033-b303-0110698cf19c', - viewId: 'bee65bc4-9bcb-49a8-8ea5-1bd9241b09c3', - createdAt: '2024-07-11T10:21:33.304Z', - isVisible: true, - size: 150, - fieldMetadataId: '22566388-8ece-43dc-8205-371e662716d4', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T10:21:33.304Z', - position: 4, - id: 'b2d72e77-a323-4e2e-acef-598b6da04712', - viewId: 'bee65bc4-9bcb-49a8-8ea5-1bd9241b09c3', - createdAt: '2024-07-11T10:21:33.304Z', - isVisible: true, - size: 150, - fieldMetadataId: 'b328512c-ff13-431b-9c94-1018ef0bd53c', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T10:21:33.304Z', - position: 1, - id: 'c7e1a253-9af8-498a-b579-adab742acf2d', - viewId: 'bee65bc4-9bcb-49a8-8ea5-1bd9241b09c3', - createdAt: '2024-07-11T10:21:33.304Z', - isVisible: true, - size: 150, - fieldMetadataId: '2eb50615-376c-45e8-b99b-440a92a912d3', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T10:21:33.304Z', - position: 2, - id: 'cceae812-2687-49b5-a0c8-eb59956865e8', - viewId: 'bee65bc4-9bcb-49a8-8ea5-1bd9241b09c3', - createdAt: '2024-07-11T10:21:33.304Z', - isVisible: true, - size: 150, - fieldMetadataId: 'f34c04f8-ce2f-4c92-8dbc-9166c6e0d49f', - }, - }, - ], - }, - }, - }, - { - __typename: 'ViewEdge', - cursor: 'WyJmZjhlZGQyMi02NjVhLTQ5NWYtODljYy03MGFiOGZkNWMxYTYiXQ==', - node: { - __typename: 'View', - position: 0, - updatedAt: '2024-07-11T10:21:33.304Z', - key: 'INDEX', - id: 'ff8edd22-665a-495f-89cc-70ab8fd5c1a6', - objectMetadataId: 'b8115dc1-5304-4d22-b300-0b4efda42ebc', - createdAt: '2024-07-11T10:21:33.304Z', - icon: 'IconBuildingSkyscraper', - isCompact: false, - name: 'All Companies', - type: 'table', - kanbanFieldMetadataId: '', - viewSorts: { - __typename: 'ViewSortConnection', - edges: [], - }, - viewFilters: { - __typename: 'ViewFilterConnection', - edges: [], - }, - viewFields: { - __typename: 'ViewFieldConnection', - edges: [ - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T10:21:33.304Z', - position: 3, - id: '1cb6aeed-8011-495f-9371-20bace45814a', - viewId: 'ff8edd22-665a-495f-89cc-70ab8fd5c1a6', - createdAt: '2024-07-11T10:21:33.304Z', - isVisible: true, - size: 150, - fieldMetadataId: '04f98129-3433-43f6-a5fa-5ede5314fafd', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T10:21:33.304Z', - position: 6, - id: '3beb2130-bdc5-48d1-8cd0-22c5d0010ad2', - viewId: 'ff8edd22-665a-495f-89cc-70ab8fd5c1a6', - createdAt: '2024-07-11T10:21:33.304Z', - isVisible: true, - size: 170, - fieldMetadataId: '479e7d9f-cd8a-4064-b009-65cb89a16c36', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T10:21:33.304Z', - position: 4, - id: '5f73729b-9592-473a-8742-8e52b693c780', - viewId: 'ff8edd22-665a-495f-89cc-70ab8fd5c1a6', - createdAt: '2024-07-11T10:21:33.304Z', - isVisible: true, - size: 150, - fieldMetadataId: '2334adb8-a0c5-408e-a449-6730f010aff1', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T15:41:03.814Z', - position: 7, - id: '788627cb-0d3a-4659-ab4b-69deabf02f27', - viewId: 'ff8edd22-665a-495f-89cc-70ab8fd5c1a6', - createdAt: '2024-07-11T15:41:03.814Z', - isVisible: true, - size: 180, - fieldMetadataId: '4ba829d2-c34a-40d0-9ae6-a65d11d2ff5a', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T10:21:33.304Z', - position: 2, - id: 'ac5797a1-2d29-42d2-b9fb-d679a945eec5', - viewId: 'ff8edd22-665a-495f-89cc-70ab8fd5c1a6', - createdAt: '2024-07-11T10:21:33.304Z', - isVisible: true, - size: 150, - fieldMetadataId: 'be572271-de80-4d55-ae25-6141ec48e1a7', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T10:21:33.304Z', - position: 0, - id: 'ae98037e-38f7-4fbf-8ae1-c0b6754c6311', - viewId: 'ff8edd22-665a-495f-89cc-70ab8fd5c1a6', - createdAt: '2024-07-11T10:21:33.304Z', - isVisible: true, - size: 180, - fieldMetadataId: '716b202a-7f2f-4d7a-a78a-666db003d94f', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T10:21:33.304Z', - position: 5, - id: 'b4d9f94e-0c4b-4422-839a-f2ceb293fde1', - viewId: 'ff8edd22-665a-495f-89cc-70ab8fd5c1a6', - createdAt: '2024-07-11T10:21:33.304Z', - isVisible: true, - size: 170, - fieldMetadataId: 'f50611a0-d4b2-49a3-8110-1ca1282ad9c2', - }, - }, - { - __typename: 'ViewFieldEdge', - node: { - __typename: 'ViewField', - updatedAt: '2024-07-11T10:21:33.304Z', - position: 1, - id: 'd45b1412-ff6b-41e5-86df-0fb778033bb3', - viewId: 'ff8edd22-665a-495f-89cc-70ab8fd5c1a6', - createdAt: '2024-07-11T10:21:33.304Z', - isVisible: true, - size: 100, - fieldMetadataId: '7b76bf52-04ff-4624-9dd5-26ef59be0d88', - }, - }, - ], - }, - }, - }, - ], -}; +const companyObjectMetadata = generatedMockObjectMetadataItems.find( + (item) => item.nameSingular === 'company', +); + +const personObjectMetadata = generatedMockObjectMetadataItems.find( + (item) => item.nameSingular === 'person', +); + +const opportunityObjectMetadata = generatedMockObjectMetadataItems.find( + (item) => item.nameSingular === 'opportunity', +); export const mockedViewsData = [ { id: '37a8a866-eb17-4e76-9382-03143a2f6a80', name: 'All companies', - objectMetadataId: '701aecf9-eb1c-4d84-9d94-b954b231b64b', + objectMetadataId: companyObjectMetadata?.id, type: 'table', icon: 'IconSkyline', key: 'INDEX', @@ -822,7 +31,7 @@ export const mockedViewsData = [ { id: '6095799e-b48f-4e00-b071-10818083593a', name: 'All people', - objectMetadataId: 'person', + objectMetadataId: personObjectMetadata?.id, type: 'table', icon: 'IconPerson', key: 'INDEX', @@ -836,7 +45,7 @@ export const mockedViewsData = [ { id: 'e26f66b7-f890-4a5c-b4d2-ec09987b5308', name: 'All opportunities', - objectMetadataId: 'company', + objectMetadataId: opportunityObjectMetadata?.id, type: 'kanban', icon: 'IconOpportunity', key: 'INDEX', @@ -850,7 +59,7 @@ export const mockedViewsData = [ { id: '5c307222-1dd5-4ff3-ab06-8d990e9b3c74', name: 'All companies (v2)', - objectMetadataId: '701aecf9-eb1c-4d84-9d94-b954b231b64b', + objectMetadataId: companyObjectMetadata?.id, type: 'table', icon: 'IconSkyline', key: 'INDEX', diff --git a/packages/twenty-front/src/utils/format/__tests__/number.test.ts b/packages/twenty-front/src/utils/format/__tests__/number.test.ts index 37237e03dd53..8b2f6687f8f1 100644 --- a/packages/twenty-front/src/utils/format/__tests__/number.test.ts +++ b/packages/twenty-front/src/utils/format/__tests__/number.test.ts @@ -6,12 +6,15 @@ describe('formatNumber', () => { expect(formatNumber(123)).toEqual('123'); }); it(`Should format decimal numbers correctly`, () => { - expect(formatNumber(123.92)).toEqual('123.92'); + expect(formatNumber(123.92, 2)).toEqual('123.92'); }); it(`Should format large numbers correctly`, () => { expect(formatNumber(1234567)).toEqual('1,234,567'); }); it(`Should format large numbers with a decimal point correctly`, () => { - expect(formatNumber(7654321.89)).toEqual('7,654,321.89'); + expect(formatNumber(7654321.89, 2)).toEqual('7,654,321.89'); + }); + it('should format apply decimals correctly', () => { + expect(formatNumber(123.456, 2)).toEqual('123.46'); }); }); diff --git a/packages/twenty-server/jest.config.ts b/packages/twenty-server/jest.config.ts index 00c1b6f06fdb..f25c9e66dcca 100644 --- a/packages/twenty-server/jest.config.ts +++ b/packages/twenty-server/jest.config.ts @@ -7,7 +7,7 @@ const jestConfig: JestConfigWithTsJest = { displayName: 'twenty-server', rootDir: './', testEnvironment: 'node', - transformIgnorePatterns: ['../../node_modules/'], + transformIgnorePatterns: ['/node_modules/'], testRegex: '.*\\.spec\\.ts$', transform: { '^.+\\.(t|j)s$': 'ts-jest', diff --git a/packages/twenty-server/package.json b/packages/twenty-server/package.json index dde92f42a8da..d5c8f91b9c69 100644 --- a/packages/twenty-server/package.json +++ b/packages/twenty-server/package.json @@ -1,6 +1,6 @@ { "name": "twenty-server", - "version": "0.31.canary", + "version": "0.31.0-canary", "description": "", "author": "", "private": true, diff --git a/packages/twenty-server/src/constants/assets-path.ts b/packages/twenty-server/src/constants/assets-path.ts index 44c7724db0b8..04766287433a 100644 --- a/packages/twenty-server/src/constants/assets-path.ts +++ b/packages/twenty-server/src/constants/assets-path.ts @@ -1,3 +1,8 @@ import path from 'path'; -export const ASSET_PATH = path.resolve(__dirname, `../../assets`); +// If the code is built through the testing module, assets are not output to the dist/assets directory. +const IS_BUILT_THROUGH_TESTING_MODULE = !__dirname.includes('/dist/'); + +export const ASSET_PATH = IS_BUILT_THROUGH_TESTING_MODULE + ? path.resolve(__dirname, `../`) + : path.resolve(__dirname, `../../assets`); diff --git a/packages/twenty-server/src/database/typeorm-seeds/metadata/fieldsMetadata.ts b/packages/twenty-server/src/database/typeorm-seeds/metadata/fieldsMetadata.ts index 330975f00d02..cf605a51244e 100644 --- a/packages/twenty-server/src/database/typeorm-seeds/metadata/fieldsMetadata.ts +++ b/packages/twenty-server/src/database/typeorm-seeds/metadata/fieldsMetadata.ts @@ -104,7 +104,7 @@ export const getDevSeedPeopleCustomFields = ( { workspaceId, type: FieldMetadataType.MULTI_SELECT, - name: 'workPrefereance', + name: 'workPreference', label: 'Work Preference', description: "Person's Work Preference", icon: 'IconHome', diff --git a/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/__tests__/map-field-metadata-to-graphql-query.utils.spec.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/__tests__/map-field-metadata-to-graphql-query.utils.spec.ts index 4fec6c7ab443..625da7f23b07 100644 --- a/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/__tests__/map-field-metadata-to-graphql-query.utils.spec.ts +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/utils/__tests__/map-field-metadata-to-graphql-query.utils.spec.ts @@ -31,6 +31,9 @@ describe('mapFieldMetadataToGraphqlQuery', () => { }); describe('should handle all field metadata types', () => { Object.values(FieldMetadataType).forEach((fieldMetadataType) => { + if (fieldMetadataType === FieldMetadataType.TS_VECTOR) { + return; + } it(`with field type ${fieldMetadataType}`, () => { const field = { type: fieldMetadataType, diff --git a/packages/twenty-server/src/engine/core-modules/open-api/utils/__tests__/components.utils.spec.ts b/packages/twenty-server/src/engine/core-modules/open-api/utils/__tests__/components.utils.spec.ts index 5c885c312dfc..5f10e3be0d75 100644 --- a/packages/twenty-server/src/engine/core-modules/open-api/utils/__tests__/components.utils.spec.ts +++ b/packages/twenty-server/src/engine/core-modules/open-api/utils/__tests__/components.utils.spec.ts @@ -10,7 +10,8 @@ describe('computeSchemaComponents', () => { it('should test all non-deprecated field types', () => { expect(fields.map((field) => field.type)).toEqual( Object.keys(FieldMetadataType).filter( - (key) => key !== FieldMetadataType.LINK, + (key) => + key !== FieldMetadataType.LINK && key !== FieldMetadataType.TS_VECTOR, ), ); }); @@ -21,6 +22,7 @@ describe('computeSchemaComponents', () => { ] as ObjectMetadataEntity[]), ).toEqual({ ObjectName: { + description: undefined, type: 'object', properties: { fieldUuid: { @@ -195,6 +197,7 @@ describe('computeSchemaComponents', () => { 'API', 'IMPORT', 'MANUAL', + 'SYSTEM', ], }, }, @@ -203,6 +206,7 @@ describe('computeSchemaComponents', () => { required: ['fieldNumber'], }, 'ObjectName for Update': { + description: undefined, type: 'object', properties: { fieldUuid: { @@ -377,6 +381,7 @@ describe('computeSchemaComponents', () => { 'API', 'IMPORT', 'MANUAL', + 'SYSTEM', ], }, }, @@ -384,6 +389,7 @@ describe('computeSchemaComponents', () => { }, }, 'ObjectName for Response': { + description: undefined, type: 'object', properties: { fieldUuid: { @@ -558,6 +564,7 @@ describe('computeSchemaComponents', () => { 'API', 'IMPORT', 'MANUAL', + 'SYSTEM', ], }, workspaceMemberId: { diff --git a/packages/twenty-server/src/engine/core-modules/serverless/drivers/utils/get-base-typescript-project-files.ts b/packages/twenty-server/src/engine/core-modules/serverless/drivers/utils/get-base-typescript-project-files.ts index 8fed171beec6..3d3a8c2a8952 100644 --- a/packages/twenty-server/src/engine/core-modules/serverless/drivers/utils/get-base-typescript-project-files.ts +++ b/packages/twenty-server/src/engine/core-modules/serverless/drivers/utils/get-base-typescript-project-files.ts @@ -1,5 +1,5 @@ -import path, { join } from 'path'; import fs from 'fs/promises'; +import path, { join } from 'path'; import { ASSET_PATH } from 'src/constants/assets-path'; diff --git a/packages/twenty-server/test/people.integration-spec.ts b/packages/twenty-server/test/people.integration-spec.ts index fd568bd5ba40..28b981e22dbe 100644 --- a/packages/twenty-server/test/people.integration-spec.ts +++ b/packages/twenty-server/test/people.integration-spec.ts @@ -27,7 +27,7 @@ describe('peopleResolver (integration)', () => { whatsapp { primaryPhoneNumber } - workPrefereance + workPreference performanceRating } } @@ -69,7 +69,7 @@ describe('peopleResolver (integration)', () => { expect(people).toHaveProperty('companyId'); expect(people).toHaveProperty('intro'); expect(people).toHaveProperty('whatsapp'); - expect(people).toHaveProperty('workPrefereance'); + expect(people).toHaveProperty('workPreference'); expect(people).toHaveProperty('performanceRating'); } }); diff --git a/packages/twenty-server/test/serverless-functions.integration-spec.ts b/packages/twenty-server/test/serverless-functions.integration-spec.ts deleted file mode 100644 index b4b87ff7caed..000000000000 --- a/packages/twenty-server/test/serverless-functions.integration-spec.ts +++ /dev/null @@ -1,61 +0,0 @@ -import request from 'supertest'; - -const client = request(`http://localhost:${APP_PORT}`); - -describe('serverlessFunctionsResolver (integration)', () => { - it('should find many serverlessFunctions', () => { - const queryData = { - query: ` - query serverlessFunctions { - serverlessFunctions { - edges { - node { - id - name - description - sourceCodeHash - runtime - latestVersion - syncStatus - createdAt - updatedAt - } - } - } - } - `, - }; - - return client - .post('/graphql') - .set('Authorization', `Bearer ${ACCESS_TOKEN}`) - .send(queryData) - .expect(200) - .expect((res) => { - expect(res.body.data).toBeDefined(); - expect(res.body.errors).toBeUndefined(); - }) - .expect((res) => { - const data = res.body.data.serverlessFunctions; - - expect(data).toBeDefined(); - expect(Array.isArray(data.edges)).toBe(true); - - const edges = data.edges; - - if (edges.length > 0) { - const serverlessFunctions = edges[0].node; - - expect(serverlessFunctions).toHaveProperty('id'); - expect(serverlessFunctions).toHaveProperty('name'); - expect(serverlessFunctions).toHaveProperty('description'); - expect(serverlessFunctions).toHaveProperty('sourceCodeHash'); - expect(serverlessFunctions).toHaveProperty('runtime'); - expect(serverlessFunctions).toHaveProperty('latestVersion'); - expect(serverlessFunctions).toHaveProperty('syncStatus'); - expect(serverlessFunctions).toHaveProperty('createdAt'); - expect(serverlessFunctions).toHaveProperty('updatedAt'); - } - }); - }); -}); diff --git a/packages/twenty-server/test/utils/setup-test.ts b/packages/twenty-server/test/utils/setup-test.ts index aac860fc79ee..bc206be689a6 100644 --- a/packages/twenty-server/test/utils/setup-test.ts +++ b/packages/twenty-server/test/utils/setup-test.ts @@ -1,5 +1,5 @@ -import 'tsconfig-paths/register'; import { JestConfigWithTsJest } from 'ts-jest'; +import 'tsconfig-paths/register'; import { createApp } from './create-app'; diff --git a/packages/twenty-ui/package.json b/packages/twenty-ui/package.json index 64e99d25f0a9..3e9aadc6ce64 100644 --- a/packages/twenty-ui/package.json +++ b/packages/twenty-ui/package.json @@ -1,6 +1,6 @@ { "name": "twenty-ui", - "version": "0.31.canary", + "version": "0.31.0-canary", "type": "module", "main": "./src/index.ts", "exports": { diff --git a/packages/twenty-ui/src/display/icon/components/TablerIcons.ts b/packages/twenty-ui/src/display/icon/components/TablerIcons.ts index 84a8db29ff09..a7518f4e1510 100644 --- a/packages/twenty-ui/src/display/icon/components/TablerIcons.ts +++ b/packages/twenty-ui/src/display/icon/components/TablerIcons.ts @@ -185,7 +185,7 @@ export { IconVideo, IconWand, IconWorld, - IconX + IconX, } from '@tabler/icons-react'; export type { TablerIconsProps } from '@tabler/icons-react'; diff --git a/packages/twenty-website/package.json b/packages/twenty-website/package.json index e60004faf0f8..f3ca9e2137db 100644 --- a/packages/twenty-website/package.json +++ b/packages/twenty-website/package.json @@ -1,6 +1,6 @@ { "name": "twenty-website", - "version": "0.31.canary", + "version": "0.31.0-canary", "private": true, "scripts": { "nx": "NX_DEFAULT_PROJECT=twenty-website node ../../node_modules/nx/bin/nx.js", From 23e7958218175ead1ba0d7a455e5e1c057719a76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Bosi?= <71827178+bosiraphael@users.noreply.github.com> Date: Sat, 5 Oct 2024 00:44:52 +0200 Subject: [PATCH 08/30] Fix syncStageStartedAt not correctly set (#7436) Fix syncStageStartedAt not correctly set --------- Co-authored-by: Charles Bochet --- .../common/services/message-channel-sync-status.service.ts | 1 + .../services/messaging-partial-message-list-fetch.service.ts | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/twenty-server/src/modules/messaging/common/services/message-channel-sync-status.service.ts b/packages/twenty-server/src/modules/messaging/common/services/message-channel-sync-status.service.ts index 19e6746ce1a3..35affc12d9a7 100644 --- a/packages/twenty-server/src/modules/messaging/common/services/message-channel-sync-status.service.ts +++ b/packages/twenty-server/src/modules/messaging/common/services/message-channel-sync-status.service.ts @@ -161,6 +161,7 @@ export class MessageChannelSyncStatusService { await messageChannelRepository.update(messageChannelIds, { syncStage: MessageChannelSyncStage.MESSAGES_IMPORT_ONGOING, + syncStageStartedAt: new Date().toISOString(), }); } diff --git a/packages/twenty-server/src/modules/messaging/message-import-manager/services/messaging-partial-message-list-fetch.service.ts b/packages/twenty-server/src/modules/messaging/message-import-manager/services/messaging-partial-message-list-fetch.service.ts index bdf13895045a..b80ebc9c86ad 100644 --- a/packages/twenty-server/src/modules/messaging/message-import-manager/services/messaging-partial-message-list-fetch.service.ts +++ b/packages/twenty-server/src/modules/messaging/message-import-manager/services/messaging-partial-message-list-fetch.service.ts @@ -54,7 +54,6 @@ export class MessagingPartialMessageListFetchService { }, { throttleFailureCount: 0, - syncStageStartedAt: null, }, ); From c73feb513a079aa289a0fa468ebac2ff0decf843 Mon Sep 17 00:00:00 2001 From: Gabriel Utzig Date: Fri, 4 Oct 2024 20:23:02 -0300 Subject: [PATCH 09/30] fix: Center Functions Empty state (#7378) ## Description - This PR fix #7012 - It changes the logic behind the rendering of `SettingsPageContainer` component. Now, the component is only rendered when the page content is not blank. ## Changes | Before | After | |--------|--------| | ![image](https://github.com/user-attachments/assets/98b64370-f145-41a2-a829-f86ae9687f73) | ![image](https://github.com/user-attachments/assets/4cb0cc32-a669-4151-9444-4bc734bd2909) |
Details

This change aligns the behavior of the settings page with the existing logic found on the `/rockets` page

Co-authored-by: Charles Bochet --- .../SettingsServerlessFunctionsTable.tsx | 43 ++++++++++--------- .../SettingsServerlessFunctions.tsx | 9 ++-- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/packages/twenty-front/src/modules/settings/serverless-functions/components/SettingsServerlessFunctionsTable.tsx b/packages/twenty-front/src/modules/settings/serverless-functions/components/SettingsServerlessFunctionsTable.tsx index 93785116af7e..286a90faadca 100644 --- a/packages/twenty-front/src/modules/settings/serverless-functions/components/SettingsServerlessFunctionsTable.tsx +++ b/packages/twenty-front/src/modules/settings/serverless-functions/components/SettingsServerlessFunctionsTable.tsx @@ -1,3 +1,4 @@ +import { SettingsPageContainer } from '@/settings/components/SettingsPageContainer'; import { SettingsServerlessFunctionsFieldItemTableRow } from '@/settings/serverless-functions/components/SettingsServerlessFunctionsFieldItemTableRow'; import { SettingsServerlessFunctionsTableEmpty } from '@/settings/serverless-functions/components/SettingsServerlessFunctionsTableEmpty'; import { useGetManyServerlessFunctions } from '@/settings/serverless-functions/hooks/useGetManyServerlessFunctions'; @@ -24,26 +25,28 @@ export const SettingsServerlessFunctionsTable = () => { return ( <> {serverlessFunctions.length ? ( - - - Name - Runtime - - - - {serverlessFunctions.map( - (serverlessFunction: ServerlessFunction) => ( - - ), - )} - -
+ + + + Name + Runtime + + + + {serverlessFunctions.map( + (serverlessFunction: ServerlessFunction) => ( + + ), + )} + +
+
) : ( )} diff --git a/packages/twenty-front/src/pages/settings/serverless-functions/SettingsServerlessFunctions.tsx b/packages/twenty-front/src/pages/settings/serverless-functions/SettingsServerlessFunctions.tsx index 00dcabb77bdc..5f9e58ce7e2a 100644 --- a/packages/twenty-front/src/pages/settings/serverless-functions/SettingsServerlessFunctions.tsx +++ b/packages/twenty-front/src/pages/settings/serverless-functions/SettingsServerlessFunctions.tsx @@ -1,4 +1,3 @@ -import { SettingsPageContainer } from '@/settings/components/SettingsPageContainer'; import { SettingsServerlessFunctionsTable } from '@/settings/serverless-functions/components/SettingsServerlessFunctionsTable'; import { getSettingsPagePath } from '@/settings/utils/getSettingsPagePath'; import { SettingsPath } from '@/types/SettingsPath'; @@ -35,11 +34,9 @@ export const SettingsServerlessFunctions = () => { }, ]} > - -
- -
-
+
+ +
); }; From 2472b3faaf54d600df05bf633658a941bebbba1d Mon Sep 17 00:00:00 2001 From: Charles Bochet Date: Sat, 5 Oct 2024 09:56:51 +0200 Subject: [PATCH 10/30] Diagnostics CI size issue --- .github/workflows/ci-front.yaml | 2 + packages/twenty-front/src/App.tsx | 72 +++++++++++++++---------------- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/.github/workflows/ci-front.yaml b/.github/workflows/ci-front.yaml index aa6955723796..b61506709f93 100644 --- a/.github/workflows/ci-front.yaml +++ b/.github/workflows/ci-front.yaml @@ -31,6 +31,8 @@ jobs: uses: actions/checkout@v4 - name: Install dependencies uses: ./.github/workflows/actions/yarn-install + - name: Diagnostic disk space issue + run: df -h - name: Front / Restore Storybook Task Cache uses: ./.github/workflows/actions/task-cache with: diff --git a/packages/twenty-front/src/App.tsx b/packages/twenty-front/src/App.tsx index 1c6adcfdf60e..e8757d1b9913 100644 --- a/packages/twenty-front/src/App.tsx +++ b/packages/twenty-front/src/App.tsx @@ -58,43 +58,41 @@ const ProvidersThatNeedRouterContext = () => { const pageTitle = getPageTitleFromPath(pathname); return ( - <> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); }; From 316b80ed78ac2843f806f0e0f831576f0415cb09 Mon Sep 17 00:00:00 2001 From: Ikko Eltociear Ashimine Date: Sat, 5 Oct 2024 17:10:04 +0900 Subject: [PATCH 11/30] chore: update ProfilePictureUploader.tsx (#7440) occured -> occurred --- .../settings/profile/components/ProfilePictureUploader.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/twenty-front/src/modules/settings/profile/components/ProfilePictureUploader.tsx b/packages/twenty-front/src/modules/settings/profile/components/ProfilePictureUploader.tsx index dcfcfaf5e7e1..6d9bf03e00e2 100644 --- a/packages/twenty-front/src/modules/settings/profile/components/ProfilePictureUploader.tsx +++ b/packages/twenty-front/src/modules/settings/profile/components/ProfilePictureUploader.tsx @@ -71,7 +71,7 @@ export const ProfilePictureUploader = () => { return result; } catch (error) { - setErrorMessage('An error occured while uploading the picture.'); + setErrorMessage('An error occurred while uploading the picture.'); } }; @@ -97,7 +97,7 @@ export const ProfilePictureUploader = () => { setCurrentWorkspaceMember({ ...currentWorkspaceMember, avatarUrl: null }); } catch (error) { - setErrorMessage('An error occured while removing the picture.'); + setErrorMessage('An error occurred while removing the picture.'); } }; From 16f2033170f849d1adab96dc92da4e174ad374cd Mon Sep 17 00:00:00 2001 From: Vardhaman Bhandari <97441447+Vardhaman619@users.noreply.github.com> Date: Sat, 5 Oct 2024 14:34:06 +0530 Subject: [PATCH 12/30] Feat : Toggle Eye Icon to Expand/Collapse Kanban Card (#7396) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This pull request implements the functionality to toggle the eye icon in Kanban cards to expand or collapse the card details. #7389 [toogle-button-in-kanban-card.webm](https://github.com/user-attachments/assets/3bc1a31c-4053-429a-95e7-aa98188c39e4) --------- Co-authored-by: Nitin Koche Co-authored-by: Félix Malfait --- .../components/RecordBoardCard.tsx | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/packages/twenty-front/src/modules/object-record/record-board/record-board-card/components/RecordBoardCard.tsx b/packages/twenty-front/src/modules/object-record/record-board/record-board-card/components/RecordBoardCard.tsx index ef4aef726458..d336467e8db3 100644 --- a/packages/twenty-front/src/modules/object-record/record-board/record-board-card/components/RecordBoardCard.tsx +++ b/packages/twenty-front/src/modules/object-record/record-board/record-board-card/components/RecordBoardCard.tsx @@ -25,7 +25,8 @@ import styled from '@emotion/styled'; import { ReactNode, useContext, useState } from 'react'; import { useInView } from 'react-intersection-observer'; import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil'; -import { AvatarChipVariant, IconEye } from 'twenty-ui'; +import { AvatarChipVariant, IconEye, IconEyeOff } from 'twenty-ui'; +import { useDebouncedCallback } from 'use-debounce'; import { useAddNewCard } from '../../record-board-column/hooks/useAddNewCard'; const StyledBoardCard = styled.div<{ selected: boolean }>` @@ -162,7 +163,7 @@ export const RecordBoardCard = ({ } = useRecordBoardStates(); const isCompactModeActive = useRecoilValue(isCompactModeActiveState); - const [isCardInCompactMode, setIsCardInCompactMode] = useState(true); + const [isCardExpanded, setIsCardExpanded] = useState(false); const [isCurrentCardSelected, setIsCurrentCardSelected] = useRecoilState( isRecordBoardCardSelectedFamilyState(recordId), @@ -201,11 +202,11 @@ export const RecordBoardCard = ({ ); - const onMouseLeaveBoard = () => { - if (isCompactModeActive) { - setIsCardInCompactMode(true); + const onMouseLeaveBoard = useDebouncedCallback(() => { + if (isCompactModeActive && isCardExpanded) { + setIsCardExpanded(false); } - }; + }, 800); const useUpdateOneRecordHook: RecordUpdateHook = () => { const updateEntity = ({ variables }: RecordUpdateHookParams) => { @@ -285,11 +286,11 @@ export const RecordBoardCard = ({ {isCompactModeActive && ( { e.stopPropagation(); - setIsCardInCompactMode(false); + setIsCardExpanded((prev) => !prev); }} /> @@ -310,7 +311,7 @@ export const RecordBoardCard = ({ From 4d67787fa283bfce5583b9cec0a908159270f9b6 Mon Sep 17 00:00:00 2001 From: Arafat Hossain <43510343+ArafatOSDev@users.noreply.github.com> Date: Sat, 5 Oct 2024 15:39:12 +0600 Subject: [PATCH 13/30] Tab design improvements (#7307) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## What does this PR do? Improve minimize tab design. Fixes #7150 Screenshot 2024-09-28 at 11 46 35 AM --------- Co-authored-by: Félix Malfait --- .../right-drawer/components/RightDrawer.tsx | 15 ++++++++++++--- .../tooltip/OverflowingTextWithTooltip.tsx | 2 +- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/packages/twenty-front/src/modules/ui/layout/right-drawer/components/RightDrawer.tsx b/packages/twenty-front/src/modules/ui/layout/right-drawer/components/RightDrawer.tsx index d28366027c44..92ed242e7d6d 100644 --- a/packages/twenty-front/src/modules/ui/layout/right-drawer/components/RightDrawer.tsx +++ b/packages/twenty-front/src/modules/ui/layout/right-drawer/components/RightDrawer.tsx @@ -28,10 +28,18 @@ import { RightDrawerHotkeyScope } from '../types/RightDrawerHotkeyScope'; import { emitRightDrawerCloseEvent } from '@/ui/layout/right-drawer/utils/emitRightDrawerCloseEvent'; import { RightDrawerRouter } from './RightDrawerRouter'; -const StyledContainer = styled(motion.div)` +const StyledContainer = styled(motion.div)<{ isRightDrawerMinimized: boolean }>` background: ${({ theme }) => theme.background.primary}; - border-left: 1px solid ${({ theme }) => theme.border.color.medium}; - box-shadow: ${({ theme }) => theme.boxShadow.strong}; + border-left: ${({ theme, isRightDrawerMinimized }) => + isRightDrawerMinimized + ? `1px solid ${theme.border.color.strong}` + : `1px solid ${theme.border.color.medium}`}; + border-top: ${({ theme, isRightDrawerMinimized }) => + isRightDrawerMinimized ? `1px solid ${theme.border.color.strong}` : 'none'}; + border-top-left-radius: ${({ theme, isRightDrawerMinimized }) => + isRightDrawerMinimized ? theme.border.radius.md : '0'}; + box-shadow: ${({ theme, isRightDrawerMinimized }) => + isRightDrawerMinimized ? 'none' : theme.boxShadow.light}; height: 100dvh; overflow-x: hidden; position: fixed; @@ -157,6 +165,7 @@ export const RightDrawer = () => { return ( Date: Sat, 5 Oct 2024 15:16:35 +0530 Subject: [PATCH 14/30] fix: Minor bug in column scroll in mobile viewport (#7448) > [!Note] > - This PR fixes #7447 --------- Co-authored-by: Charles Bochet --- .../__stories__/PrefetchLoading.stories.tsx | 2 +- .../EventRowMainObjectUpdated.stories.tsx | 2 +- .../components/RecordInlineCell.tsx | 6 ++---- .../components/RecordInlineCellContainer.tsx | 2 +- .../components/RecordInlineCellEditMode.tsx | 17 ++++++++--------- .../components/RecordShowContainer.tsx | 4 ++-- .../components/RecordTableHeader.tsx | 2 +- 7 files changed, 16 insertions(+), 19 deletions(-) diff --git a/packages/twenty-front/src/loading/components/__stories__/PrefetchLoading.stories.tsx b/packages/twenty-front/src/loading/components/__stories__/PrefetchLoading.stories.tsx index 847680fbae61..16c87e7c1732 100644 --- a/packages/twenty-front/src/loading/components/__stories__/PrefetchLoading.stories.tsx +++ b/packages/twenty-front/src/loading/components/__stories__/PrefetchLoading.stories.tsx @@ -38,6 +38,6 @@ export const Default: Story = { await canvas.findByText('Tasks'); await canvas.findByText('People'); await canvas.findByText('Opportunities'); - await canvas.findByText('My Customs'); + await canvas.findByText('Rockets'); }, }; diff --git a/packages/twenty-front/src/modules/activities/timelineActivities/rows/main-object/components/__stories__/EventRowMainObjectUpdated.stories.tsx b/packages/twenty-front/src/modules/activities/timelineActivities/rows/main-object/components/__stories__/EventRowMainObjectUpdated.stories.tsx index 224438b853cf..fe0b549d68da 100644 --- a/packages/twenty-front/src/modules/activities/timelineActivities/rows/main-object/components/__stories__/EventRowMainObjectUpdated.stories.tsx +++ b/packages/twenty-front/src/modules/activities/timelineActivities/rows/main-object/components/__stories__/EventRowMainObjectUpdated.stories.tsx @@ -36,7 +36,7 @@ const meta: Meta = { }, } as TimelineActivity, mainObjectMetadataItem: generatedMockObjectMetadataItems.find( - (item) => item.namePlural === 'person', + (item) => item.nameSingular === 'person', ), }, decorators: [ diff --git a/packages/twenty-front/src/modules/object-record/record-inline-cell/components/RecordInlineCell.tsx b/packages/twenty-front/src/modules/object-record/record-inline-cell/components/RecordInlineCell.tsx index e2c8b2bcfa03..55f3ccbf751e 100644 --- a/packages/twenty-front/src/modules/object-record/record-inline-cell/components/RecordInlineCell.tsx +++ b/packages/twenty-front/src/modules/object-record/record-inline-cell/components/RecordInlineCell.tsx @@ -24,15 +24,13 @@ import { type RecordInlineCellProps = { readonly?: boolean; loading?: boolean; - isCentered?: boolean; }; export const RecordInlineCell = ({ readonly, loading, - isCentered, }: RecordInlineCellProps) => { - const { fieldDefinition, recordId } = useContext(FieldContext); + const { fieldDefinition, recordId, isCentered } = useContext(FieldContext); const buttonIcon = useGetButtonIcon(); const isFieldInputOnly = useIsFieldInputOnly(); @@ -90,7 +88,7 @@ export const RecordInlineCell = ({ label: fieldDefinition.label, labelWidth: fieldDefinition.labelWidth, showLabel: fieldDefinition.showLabel, - isCentered: isCentered, + isCentered, editModeContent: ( ` @@ -79,7 +80,6 @@ export type RecordInlineCellContainerProps = { isDisplayModeFixHeight?: boolean; disableHoverEffect?: boolean; loading?: boolean; - isCentered?: boolean; }; export const RecordInlineCellContainer = () => { diff --git a/packages/twenty-front/src/modules/object-record/record-inline-cell/components/RecordInlineCellEditMode.tsx b/packages/twenty-front/src/modules/object-record/record-inline-cell/components/RecordInlineCellEditMode.tsx index 7d6c6e4d50ed..a6a4bec4559d 100644 --- a/packages/twenty-front/src/modules/object-record/record-inline-cell/components/RecordInlineCellEditMode.tsx +++ b/packages/twenty-front/src/modules/object-record/record-inline-cell/components/RecordInlineCellEditMode.tsx @@ -1,17 +1,16 @@ +import { RecordInlineCellContext } from '@/object-record/record-inline-cell/components/RecordInlineCellContext'; import styled from '@emotion/styled'; import { autoUpdate, flip, offset, useFloating } from '@floating-ui/react'; import { useContext } from 'react'; import { createPortal } from 'react-dom'; -import { FieldContext } from '@/object-record/record-field/contexts/FieldContext'; - const StyledInlineCellEditModeContainer = styled.div` align-items: center; display: flex; + width: 100%; + position: absolute; height: 24px; - - margin-left: -${({ theme }) => theme.spacing(1)}; `; const StyledInlineCellInput = styled.div` @@ -34,21 +33,21 @@ type RecordInlineCellEditModeProps = { export const RecordInlineCellEditMode = ({ children, }: RecordInlineCellEditModeProps) => { - const { isCentered } = useContext(FieldContext); + const { isCentered } = useContext(RecordInlineCellContext); const { refs, floatingStyles } = useFloating({ - placement: isCentered ? undefined : 'right-start', + placement: isCentered ? 'bottom' : 'bottom-start', middleware: [ flip(), offset( isCentered ? { - mainAxis: -32, - crossAxis: 160, + mainAxis: -26, + crossAxis: 0, } : { + mainAxis: -28, crossAxis: -4, - mainAxis: -4, }, ), ], diff --git a/packages/twenty-front/src/modules/object-record/record-show/components/RecordShowContainer.tsx b/packages/twenty-front/src/modules/object-record/record-show/components/RecordShowContainer.tsx index e72df975f22f..f9176f499913 100644 --- a/packages/twenty-front/src/modules/object-record/record-show/components/RecordShowContainer.tsx +++ b/packages/twenty-front/src/modules/object-record/record-show/components/RecordShowContainer.tsx @@ -202,10 +202,10 @@ export const RecordShowContainer = ({ }, useUpdateRecord: useUpdateOneObjectRecordMutation, hotkeyScope: InlineCellHotkeyScope.InlineCell, - isCentered: true, + isCentered: !isMobile, }} > - + } avatarType={recordIdentifier?.avatarType ?? 'rounded'} diff --git a/packages/twenty-front/src/modules/object-record/record-table/record-table-header/components/RecordTableHeader.tsx b/packages/twenty-front/src/modules/object-record/record-table/record-table-header/components/RecordTableHeader.tsx index a21a0578ab0d..566ca51cd643 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/record-table-header/components/RecordTableHeader.tsx +++ b/packages/twenty-front/src/modules/object-record/record-table/record-table-header/components/RecordTableHeader.tsx @@ -50,7 +50,7 @@ const StyledTableHead = styled.thead<{ clip-path: inset(0px -4px 0px 0px); } @media (max-width: ${MOBILE_VIEWPORT}px) { - width: 35px; + width: 30px; max-width: 35px; } } From e55bb3e5cd98b02c7cd68b2d1a9562a5a03e5911 Mon Sep 17 00:00:00 2001 From: BOHEUS <56270748+BOHEUS@users.noreply.github.com> Date: Sat, 5 Oct 2024 11:47:56 +0200 Subject: [PATCH 15/30] Add missing currencies (#7441) Related to #7038 --------- Co-authored-by: Charles Bochet --- .../record-field/types/CurrencyCode.ts | 150 +++++++++- .../constants/SettingsFieldCurrencyCodes.ts | 262 +++++++++++++----- .../display/icon/components/TablerIcons.ts | 37 +++ 3 files changed, 369 insertions(+), 80 deletions(-) diff --git a/packages/twenty-front/src/modules/object-record/record-field/types/CurrencyCode.ts b/packages/twenty-front/src/modules/object-record/record-field/types/CurrencyCode.ts index 9e86b3c87939..fcc4c3c3267a 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/types/CurrencyCode.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/types/CurrencyCode.ts @@ -1,20 +1,154 @@ export enum CurrencyCode { + AED = 'AED', + AFN = 'AFN', + ALL = 'ALL', + AMD = 'AMD', + ANG = 'ANG', + AOA = 'AOA', + ARS = 'ARS', + AUD = 'AUD', + AWG = 'AWG', + AZN = 'AZN', + BAM = 'BAM', + BBD = 'BBD', + BDT = 'BDT', + BGN = 'BGN', + BHD = 'BHD', + BIF = 'BIF', + BMD = 'BMD', + BND = 'BND', + BOB = 'BOB', + BRL = 'BRL', + BSD = 'BSD', + BTN = 'BTN', + BWP = 'BWP', + BYN = 'BYN', + BZD = 'BZD', CAD = 'CAD', + CDF = 'CDF', CHF = 'CHF', + CLP = 'CLP', CNY = 'CNY', + COP = 'COP', + CRC = 'CRC', + CUP = 'CUP', + CVE = 'CVE', CZK = 'CZK', + DJF = 'DJF', + DKK = 'DKK', + DOP = 'DOP', + DZD = 'DZD', + EGP = 'EGP', + ERN = 'ERN', + ETB = 'ETB', EUR = 'EUR', + FJD = 'FJD', + FKP = 'FKP', GBP = 'GBP', + GEL = 'GEL', + GHS = 'GHS', + GIP = 'GIP', + GMD = 'GMD', + GNF = 'GNF', + GTQ = 'GTQ', + GYD = 'GYD', HKD = 'HKD', + HNL = 'HNL', + HTG = 'HTG', + HUF = 'HUF', + IDR = 'IDR', + ILS = 'ILS', + INR = 'INR', + IQD = 'IQD', + IRR = 'IRR', + ISK = 'ISK', + JMD = 'JMD', + JOD = 'JOD', JPY = 'JPY', - USD = 'USD', - NOK = 'NOK', - SEK = 'SEK', - BHT = 'BHT', + KES = 'KES', + KGS = 'KGS', + KHR = 'KHR', + KMF = 'KMF', + KPW = 'KPW', + KRW = 'KRW', + KWD = 'KWD', + KYD = 'KYD', + KZT = 'KZT', + LAK = 'LAK', + LBP = 'LBP', + LKR = 'LKR', + LRD = 'LRD', + LSL = 'LSL', + LYD = 'LYD', MAD = 'MAD', + MDL = 'MDL', + MGA = 'MGA', + MKD = 'MKD', + MMK = 'MMK', + MNT = 'MNT', + MOP = 'MOP', + MRU = 'MRU', + MUR = 'MUR', + MVR = 'MVR', + MWK = 'MWK', + MXN = 'MXN', + MYR = 'MYR', + MZN = 'MZN', + NAD = 'NAD', + NGN = 'NGN', + NIO = 'NIO', + NOK = 'NOK', + NPR = 'NPR', + NZD = 'NZD', + OMR = 'OMR', + PAB = 'PAB', + PEN = 'PEN', + PGK = 'PGK', + PHP = 'PHP', + PKR = 'PKR', + PLN = 'PLN', + PYG = 'PYG', QAR = 'QAR', - AED = 'AED', - KRW = 'KRW', - BRL = 'BRL', - AUD = 'AUD', + RON = 'RON', + RSD = 'RSD', + RUB = 'RUB', + RWF = 'RWF', + SAR = 'SAR', + SBD = 'SBD', + SCR = 'SCR', + SDG = 'SDG', + SEK = 'SEK', + SGD = 'SGD', + SHP = 'SHP', + SLE = 'SLE', + SOS = 'SOS', + SRD = 'SRD', + SSP = 'SSP', + STN = 'STN', + SVC = 'SVC', + SYP = 'SYP', + SZL = 'SZL', + THB = 'THB', + TJS = 'TJS', + TMT = 'TMT', + TND = 'TND', + TOP = 'TOP', + TRY = 'TRY', + TTD = 'TTD', + TWD = 'TWD', + TZS = 'TZS', + UAH = 'UAH', + UGX = 'UGX', + USD = 'USD', + UYU = 'UYU', + UZS = 'UZS', + VES = 'VES', + VND = 'VND', + VUV = 'VUV', + WST = 'WST', + XCD = 'XCD', + YER = 'YER', + ZAR = 'ZAR', + ZMW = 'ZMW', + ZWG = 'ZWG', } diff --git a/packages/twenty-front/src/modules/settings/data-model/constants/SettingsFieldCurrencyCodes.ts b/packages/twenty-front/src/modules/settings/data-model/constants/SettingsFieldCurrencyCodes.ts index 5e013b50ca26..681da4b3b611 100644 --- a/packages/twenty-front/src/modules/settings/data-model/constants/SettingsFieldCurrencyCodes.ts +++ b/packages/twenty-front/src/modules/settings/data-model/constants/SettingsFieldCurrencyCodes.ts @@ -1,18 +1,56 @@ import { + IconCoins, IconComponent, + IconCurrencyAfghani, + IconCurrencyBahraini, IconCurrencyBaht, + IconCurrencyForint, + IconCurrencyDinar, IconCurrencyDirham, IconCurrencyDollar, + IconCurrencyDollarAustralian, + IconCurrencyDollarBrunei, + IconCurrencyDollarCanadian, + IconCurrencyDollarGuyanese, + IconCurrencyDollarSingapore, + IconCurrencyDong, + IconCurrencyDram, IconCurrencyEuro, + IconCurrencyFlorin, IconCurrencyFrank, + IconCurrencyGuarani, + IconCurrencyHryvnia, + IconCurrencyIranianRial, + IconCurrencyKip, IconCurrencyKroneCzech, + IconCurrencyKroneDanish, IconCurrencyKroneSwedish, + IconCurrencyLari, + IconCurrencyLeu, + IconCurrencyLira, + IconCurrencyLyd, + IconCurrencyManat, + IconCurrencyNaira, + IconCurrencyPaanga, + IconCurrencyPeso, IconCurrencyPound, + IconCurrencyQuetzal, IconCurrencyReal, + IconCurrencyRenminbi, IconCurrencyRiyal, + IconCurrencyRubel, + IconCurrencyRufiyaa, + IconCurrencyRupee, + IconCurrencyRupeeNepalese, + IconCurrencyTaka, + IconCurrencyTenge, + IconCurrencyTugrik, + IconCurrencySom, + IconCurrencyShekel, IconCurrencyWon, IconCurrencyYen, IconCurrencyYuan, + IconCurrencyZloty, } from 'twenty-ui'; import { CurrencyCode } from '@/object-record/record-field/types/CurrencyCode'; @@ -21,76 +59,156 @@ export const SETTINGS_FIELD_CURRENCY_CODES: Record< CurrencyCode, { label: string; Icon: IconComponent } > = { - USD: { - label: 'United States dollar', - Icon: IconCurrencyDollar, - }, - EUR: { - label: 'Euro', - Icon: IconCurrencyEuro, - }, - JPY: { - label: 'Japanese yen', - Icon: IconCurrencyYen, - }, - GBP: { - label: 'British pound', - Icon: IconCurrencyPound, - }, - CAD: { - label: 'Canadian dollar', - Icon: IconCurrencyDollar, - }, - CHF: { - label: 'Swiss franc', - Icon: IconCurrencyFrank, - }, - CNY: { - label: 'Chinese yuan', - Icon: IconCurrencyYuan, - }, - CZK: { - label: 'Czech koruna', - Icon: IconCurrencyKroneCzech, - }, - HKD: { - label: 'Hong Kong dollar', - Icon: IconCurrencyDollar, - }, - NOK: { - label: 'Norwegian krone', - Icon: IconCurrencyKroneSwedish, - }, - SEK: { - label: 'Swedish krona', - Icon: IconCurrencyKroneSwedish, - }, - BHT: { - label: 'Thai Baht', - Icon: IconCurrencyBaht, - }, - MAD: { - label: 'Moroccan dirham', - Icon: IconCurrencyDirham, - }, - QAR: { - label: 'Qatari riyal', - Icon: IconCurrencyRiyal, - }, - AED: { - label: 'UAE dirham', - Icon: IconCurrencyDirham, - }, - KRW: { - label: 'South Korean won', - Icon: IconCurrencyWon, - }, - BRL: { - label: 'Brazilian real', - Icon: IconCurrencyReal, - }, - AUD: { - label: 'Australian dollar', - Icon: IconCurrencyDollar, - }, + AED: { label: 'UAE dirham', Icon: IconCurrencyDirham }, + AFN: { label: 'Afghan afghani', Icon: IconCurrencyAfghani }, + ALL: { label: 'Albanian lek', Icon: IconCurrencyLeu }, + AMD: { label: 'Armenian dram', Icon: IconCurrencyDram }, + ANG: { label: 'Netherlands Antillean guilder', Icon: IconCurrencyFlorin }, + AOA: { label: 'Angolan kwanza', Icon: IconCoins }, + ARS: { label: 'Argentine peso', Icon: IconCoins }, + AUD: { label: 'Australian dollar', Icon: IconCurrencyDollarAustralian }, + AWG: { label: 'Aruban florin', Icon: IconCurrencyFlorin }, + AZN: { label: 'Azerbaijani manat', Icon: IconCurrencyManat }, + BAM: { label: 'Bosnia and Herzegovina mark', Icon: IconCoins }, + BBD: { label: 'Barbados dollar', Icon: IconCurrencyDollar }, + BDT: { label: 'Bangladeshi taka', Icon: IconCurrencyTaka }, + BGN: { label: 'Bulgarian lev', Icon: IconCoins }, + BHD: { label: 'Bahraini dinar', Icon: IconCurrencyBahraini }, + BIF: { label: 'Burundian franc', Icon: IconCoins }, + BMD: { label: 'Bermudian dollar', Icon: IconCurrencyDollar }, + BND: { label: 'Brunei dollar', Icon: IconCurrencyDollarBrunei }, + BOB: { label: 'Boliviano', Icon: IconCoins }, + BRL: { label: 'Brazilian real', Icon: IconCurrencyReal }, + BSD: { label: 'Bahamian dollar', Icon: IconCurrencyDollar }, + BTN: { label: 'Bhutanese ngultrum', Icon: IconCurrencyDollar }, + BWP: { label: 'Botswana pula', Icon: IconCoins }, + BYN: { label: 'Belarusian ruble', Icon: IconCoins }, + BZD: { label: 'Belize dollar', Icon: IconCurrencyDollar }, + CAD: { label: 'Canadian dollar', Icon: IconCurrencyDollarCanadian }, + CDF: { label: 'Congolese franc', Icon: IconCoins }, + CHF: { label: 'Swiss franc', Icon: IconCurrencyFrank }, + CLP: { label: 'Chilean peso', Icon: IconCoins }, + CNY: { label: 'Chinese yuan', Icon: IconCurrencyYuan }, + COP: { label: 'Colombian peso', Icon: IconCoins }, + CRC: { label: 'Costa Rican colon', Icon: IconCoins }, + CUP: { label: 'Cuban peso', Icon: IconCoins }, + CVE: { label: 'Cape Verdean escudo', Icon: IconCoins }, + CZK: { label: 'Czech koruna', Icon: IconCurrencyKroneCzech }, + DJF: { label: 'Djiboutian franc', Icon: IconCoins }, + DKK: { label: 'Danish krone', Icon: IconCurrencyKroneDanish }, + DOP: { label: 'Dominican peso', Icon: IconCoins }, + DZD: { label: 'Algerian Dinar', Icon: IconCoins }, + EGP: { label: 'Egyptian pound', Icon: IconCoins }, + ERN: { label: 'Eritrean nakfa', Icon: IconCoins }, + ETB: { label: 'Ethiopian birr', Icon: IconCoins }, + EUR: { label: 'Euro', Icon: IconCurrencyEuro }, + FJD: { label: 'Fiji dollar', Icon: IconCurrencyDollar }, + FKP: { label: 'Falkland Islands pound', Icon: IconCoins }, + GBP: { label: 'British pound', Icon: IconCurrencyPound }, + GEL: { label: 'Georgian lari', Icon: IconCurrencyLari }, + GHS: { label: 'Ghanaian cedi', Icon: IconCoins }, + GIP: { label: 'Gibraltar pound', Icon: IconCoins }, + GMD: { label: 'Gambian dalasi', Icon: IconCoins }, + GNF: { label: 'Guinean franc', Icon: IconCoins }, + GTQ: { label: 'Guatemalan quetzal', Icon: IconCurrencyQuetzal }, + GYD: { label: 'Guyanese dollar', Icon: IconCurrencyDollarGuyanese }, + HKD: { label: 'Hong Kong dollar', Icon: IconCurrencyRenminbi }, + HNL: { label: 'Honduran lempira', Icon: IconCurrencyLeu }, + HTG: { label: 'Haitian gourde', Icon: IconCoins }, + HUF: { label: 'Hungarian forint', Icon: IconCurrencyForint }, + IDR: { label: 'Indonesian rupiah', Icon: IconCoins }, + ILS: { label: 'Israeli shekel', Icon: IconCurrencyShekel }, + INR: { label: 'Indian rupee', Icon: IconCurrencyRupee }, + IQD: { label: 'Iraqi dinar', Icon: IconCoins }, + IRR: { label: 'Iranian rial', Icon: IconCurrencyIranianRial }, + ISK: { label: 'Icelandic króna', Icon: IconCoins }, + JMD: { label: 'Jamaican dollar', Icon: IconCurrencyDollar }, + JOD: { label: 'Jordanian dinar', Icon: IconCoins }, + JPY: { label: 'Japanese yen', Icon: IconCurrencyYen }, + KES: { label: 'Kenyan shilling', Icon: IconCoins }, + KGS: { label: 'Kyrgyzstani som', Icon: IconCurrencySom }, + KHR: { label: 'Cambodian riel', Icon: IconCoins }, + KMF: { label: 'Comoro franc', Icon: IconCoins }, + KPW: { label: 'North Korean won', Icon: IconCurrencyWon }, + KRW: { label: 'South Korean won', Icon: IconCurrencyWon }, + KWD: { label: 'Kuwaiti dinar', Icon: IconCurrencyDinar }, + KYD: { label: 'Cayman Islands dollar', Icon: IconCurrencyDollar }, + KZT: { label: 'Kazakhstani tenge', Icon: IconCurrencyTenge }, + LAK: { label: 'Lao kip', Icon: IconCurrencyKip }, + LBP: { label: 'Lebanese pound', Icon: IconCoins }, + LKR: { label: 'Sri Lankan rupee', Icon: IconCoins }, + LRD: { label: 'Liberian dollar', Icon: IconCurrencyDollar }, + LSL: { label: 'Lesotho loti', Icon: IconCurrencyLeu }, + LYD: { label: 'Libyan dinar', Icon: IconCurrencyLyd }, + MAD: { label: 'Moroccan dirham', Icon: IconCurrencyDirham }, + MDL: { label: 'Moldovan leu', Icon: IconCurrencyLeu }, + MGA: { label: 'Malagasy ariary', Icon: IconCoins }, + MKD: { label: 'Macedonian denar', Icon: IconCoins }, + MMK: { label: 'Myanmar kyat', Icon: IconCoins }, + MNT: { label: 'Mongolian tögrög', Icon: IconCurrencyTugrik }, + MOP: { label: 'Macanese pataca', Icon: IconCurrencyRenminbi }, + MRU: { label: 'Mauritanian ouguiya', Icon: IconCoins }, + MUR: { label: 'Mauritian rupee', Icon: IconCoins }, + MVR: { label: 'Maldivian rufiyaa', Icon: IconCurrencyRufiyaa }, + MWK: { label: 'Malawian kwacha', Icon: IconCoins }, + MXN: { label: 'Mexican peso', Icon: IconCoins }, + MYR: { label: 'Malaysian ringgit', Icon: IconCoins }, + MZN: { label: 'Mozambican metical', Icon: IconCoins }, + NAD: { label: 'Namibian dollar', Icon: IconCurrencyDollar }, + NGN: { label: 'Nigerian naira', Icon: IconCurrencyNaira }, + NIO: { label: 'Nicaraguan córdoba', Icon: IconCoins }, + NOK: { label: 'Norwegian krone', Icon: IconCurrencyKroneSwedish }, + NPR: { label: 'Nepalese rupee', Icon: IconCurrencyRupeeNepalese }, + NZD: { label: 'New Zealand dollar', Icon: IconCurrencyDollar }, + OMR: { label: 'Omani rial', Icon: IconCoins }, + PAB: { label: 'Panamanian balboa', Icon: IconCoins }, + PEN: { label: 'Peruvian sol', Icon: IconCoins }, + PGK: { label: 'Papua New Guinean kina', Icon: IconCoins }, + PHP: { label: 'Philippine peso', Icon: IconCurrencyPeso }, + PKR: { label: 'Pakistani rupee', Icon: IconCoins }, + PLN: { label: 'Polish złoty', Icon: IconCurrencyZloty }, + PYG: { label: 'Paraguayan guaraní', Icon: IconCurrencyGuarani }, + QAR: { label: 'Qatari riyal', Icon: IconCurrencyRiyal }, + RON: { label: 'Romanian leu', Icon: IconCurrencyLeu }, + RSD: { label: 'Serbian dinar', Icon: IconCoins }, + RUB: { label: 'Russian ruble', Icon: IconCurrencyRubel }, + RWF: { label: 'Rwandan franc', Icon: IconCoins }, + SAR: { label: 'Saudi riyal', Icon: IconCoins }, + SBD: { label: 'Solomon Islands dollar', Icon: IconCurrencyDollar }, + SCR: { label: 'Seychelles rupee', Icon: IconCoins }, + SDG: { label: 'Sudanese pound', Icon: IconCoins }, + SEK: { label: 'Swedish krona', Icon: IconCurrencyKroneSwedish }, + SGD: { label: 'Singapore dollar', Icon: IconCurrencyDollarSingapore }, + SHP: { label: 'Saint Helena pound', Icon: IconCoins }, + SLE: { label: 'Sierra Leonean leone', Icon: IconCoins }, + SOS: { label: 'Somalian shilling', Icon: IconCoins }, + SRD: { label: 'Surinamese dollar', Icon: IconCurrencyDollar }, + SSP: { label: 'South Sudanese pound', Icon: IconCoins }, + STN: { label: 'São Tomé and Príncipe dobra', Icon: IconCoins }, + SVC: { label: 'Salvadoran colón', Icon: IconCoins }, + SYP: { label: 'Syrian pound', Icon: IconCoins }, + SZL: { label: 'Swazi lilangeni', Icon: IconCurrencyLeu }, + THB: { label: 'Thai Baht', Icon: IconCurrencyBaht }, + TJS: { label: 'Tajikistani somoni', Icon: IconCoins }, + TMT: { label: 'Turkmenistan manat', Icon: IconCurrencyManat }, + TND: { label: 'Tunisian dinar', Icon: IconCoins }, + TOP: { label: 'Tongan paʻanga', Icon: IconCurrencyPaanga }, + TRY: { label: 'Turkish lira', Icon: IconCurrencyLira }, + TTD: { label: 'Trinidad and Tobago dollar', Icon: IconCurrencyDollar }, + TWD: { label: 'Taiwanese dollar', Icon: IconCurrencyRenminbi }, + TZS: { label: 'Tanzanian shilling', Icon: IconCoins }, + UAH: { label: 'Ukrainian hryvnia', Icon: IconCurrencyHryvnia }, + UGX: { label: 'Ugandan shilling', Icon: IconCoins }, + USD: { label: 'United States dollar', Icon: IconCurrencyDollar }, + UYU: { label: 'Uruguayan peso', Icon: IconCoins }, + UZS: { label: 'Uzbekistani sum', Icon: IconCoins }, + VES: { label: 'Venezuelan bolívar', Icon: IconCoins }, + VND: { label: 'Vietnamese đồng', Icon: IconCurrencyDong }, + VUV: { label: 'Vanuatu vatu', Icon: IconCoins }, + WST: { label: 'Samoan tala', Icon: IconCoins }, + XCD: { label: 'East Caribbean dollar', Icon: IconCurrencyDollar }, + YER: { label: 'Yemeni rial', Icon: IconCoins }, + ZAR: { label: 'South African rand', Icon: IconCoins }, + ZMW: { label: 'Zambian kwacha', Icon: IconCoins }, + ZWG: { label: 'Zimbabwe Gold', Icon: IconCoins }, }; diff --git a/packages/twenty-ui/src/display/icon/components/TablerIcons.ts b/packages/twenty-ui/src/display/icon/components/TablerIcons.ts index a7518f4e1510..c2e19f37fe70 100644 --- a/packages/twenty-ui/src/display/icon/components/TablerIcons.ts +++ b/packages/twenty-ui/src/display/icon/components/TablerIcons.ts @@ -57,19 +57,56 @@ export { IconCreativeCommonsSa, IconCreditCard, IconCsv, + IconCurrencyAfghani, + IconCurrencyBahraini, IconCurrencyBaht, + IconCurrencyDinar, IconCurrencyDirham, IconCurrencyDollar, + IconCurrencyDollarAustralian, + IconCurrencyDollarBrunei, + IconCurrencyDollarCanadian, + IconCurrencyDollarGuyanese, + IconCurrencyDollarSingapore, + IconCurrencyDong, + IconCurrencyDram, IconCurrencyEuro, + IconCurrencyFlorin, + IconCurrencyForint, IconCurrencyFrank, + IconCurrencyGuarani, + IconCurrencyHryvnia, + IconCurrencyIranianRial, + IconCurrencyKip, IconCurrencyKroneCzech, + IconCurrencyKroneDanish, IconCurrencyKroneSwedish, + IconCurrencyLari, + IconCurrencyLeu, + IconCurrencyLira, + IconCurrencyLyd, + IconCurrencyManat, + IconCurrencyNaira, + IconCurrencyPaanga, + IconCurrencyPeso, IconCurrencyPound, + IconCurrencyQuetzal, IconCurrencyReal, + IconCurrencyRenminbi, IconCurrencyRiyal, + IconCurrencyRubel, + IconCurrencyRufiyaa, + IconCurrencyRupee, + IconCurrencyRupeeNepalese, + IconCurrencyTaka, + IconCurrencyTenge, + IconCurrencyTugrik, + IconCurrencySom, + IconCurrencyShekel, IconCurrencyWon, IconCurrencyYen, IconCurrencyYuan, + IconCurrencyZloty, IconDatabase, IconDeviceFloppy, IconDoorEnter, From db9ec58f5d937dfed6efa1cba064e54c0d039f5f Mon Sep 17 00:00:00 2001 From: Ciara Hatcher <67052777+LumosViridi@users.noreply.github.com> Date: Mon, 7 Oct 2024 03:23:42 -0500 Subject: [PATCH 16/30] Updating terraform and k8s files adding redis... (#7425) Also updated the way secrets are generated with Terraform and some code cleanup --- .../k8s/manifests/deployment-db.yaml | 54 +++---- .../k8s/manifests/deployment-redis.yaml | 44 ++++++ .../k8s/manifests/deployment-server.yaml | 133 ++++++++++-------- .../k8s/manifests/deployment-worker.yaml | 106 +++++++------- .../twenty-docker/k8s/manifests/ingress.yaml | 28 ++-- .../k8s/manifests/pv-docker-data.yaml | 11 ++ .../k8s/manifests/pvc-docker-data.yaml | 13 ++ .../k8s/manifests/service-db.yaml | 6 +- .../k8s/manifests/service-redis.yaml | 18 +++ .../k8s/manifests/service-server.yaml | 8 +- .../k8s/terraform/.terraform-docs.yml | 8 +- .../twenty-docker/k8s/terraform/README.md | 29 ++-- .../k8s/terraform/deployment-redis.tf | 60 ++++++++ .../k8s/terraform/deployment-server.tf | 49 +++++-- .../k8s/terraform/deployment-worker.tf | 27 +++- packages/twenty-docker/k8s/terraform/main.tf | 6 +- .../k8s/terraform/pv-docker-data.tf | 19 +++ .../k8s/terraform/pvc-docker-data.tf | 15 ++ .../twenty-docker/k8s/terraform/secret.tf | 25 +++- .../k8s/terraform/service-redis.tf | 18 +++ .../twenty-docker/k8s/terraform/variables.tf | 64 +++++---- 21 files changed, 515 insertions(+), 226 deletions(-) create mode 100644 packages/twenty-docker/k8s/manifests/deployment-redis.yaml create mode 100644 packages/twenty-docker/k8s/manifests/pv-docker-data.yaml create mode 100644 packages/twenty-docker/k8s/manifests/pvc-docker-data.yaml create mode 100644 packages/twenty-docker/k8s/manifests/service-redis.yaml create mode 100644 packages/twenty-docker/k8s/terraform/deployment-redis.tf create mode 100644 packages/twenty-docker/k8s/terraform/pv-docker-data.tf create mode 100644 packages/twenty-docker/k8s/terraform/pvc-docker-data.tf create mode 100644 packages/twenty-docker/k8s/terraform/service-redis.tf diff --git a/packages/twenty-docker/k8s/manifests/deployment-db.yaml b/packages/twenty-docker/k8s/manifests/deployment-db.yaml index 2e317376d53b..31a3361774e4 100644 --- a/packages/twenty-docker/k8s/manifests/deployment-db.yaml +++ b/packages/twenty-docker/k8s/manifests/deployment-db.yaml @@ -22,33 +22,33 @@ spec: app: twentycrm-db spec: volumes: - - name: twentycrm-db-data - persistentVolumeClaim: - claimName: twentycrm-db-pvc + - name: twentycrm-db-data + persistentVolumeClaim: + claimName: twentycrm-db-pvc containers: - - env: - - name: POSTGRES_PASSWORD - value: "twenty" - - name: BITNAMI_DEBUG - value: "true" - - image: twentycrm/twenty-postgres:latest - imagePullPolicy: Always - name: twentycrm - ports: - - containerPort: 5432 - name: tcp - protocol: TCP - resources: - requests: - memory: "256Mi" - cpu: "250m" - limits: - memory: "1024Mi" - cpu: "1000m" - stdin: true - tty: true - volumeMounts: - - mountPath: /bitnami/postgresql - name: twentycrm-db-data + - name: twentycrm + image: twentycrm/twenty-postgres:latest + imagePullPolicy: Always + env: + - name: POSTGRES_PASSWORD + value: "twenty" + - name: BITNAMI_DEBUG + value: "true" + ports: + - containerPort: 5432 + name: tcp + protocol: TCP + resources: + requests: + memory: "256Mi" + cpu: "250m" + limits: + memory: "1024Mi" + cpu: "1000m" + stdin: true + tty: true + volumeMounts: + - mountPath: /bitnami/postgresql + name: twentycrm-db-data dnsPolicy: ClusterFirst restartPolicy: Always diff --git a/packages/twenty-docker/k8s/manifests/deployment-redis.yaml b/packages/twenty-docker/k8s/manifests/deployment-redis.yaml new file mode 100644 index 000000000000..e09874aac262 --- /dev/null +++ b/packages/twenty-docker/k8s/manifests/deployment-redis.yaml @@ -0,0 +1,44 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: twentycrm-redis + name: twentycrm-redis + namespace: twentycrm +spec: + progressDeadlineSeconds: 600 + replicas: 1 + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 1 + type: RollingUpdate + selector: + matchLabels: + app: twentycrm-redis + template: + metadata: + labels: + app: twentycrm-redis + spec: + containers: + - name: redis + image: redis/redis-stack-server:latest + imagePullPolicy: Always + env: + - name: PORT + value: 6379 + ports: + - containerPort: 6379 + name: redis + protocol: TCP + resources: + requests: + memory: "1024Mi" + cpu: "250m" + limits: + memory: "2048Mi" + cpu: "500m" + + dnsPolicy: ClusterFirst + restartPolicy: Always diff --git a/packages/twenty-docker/k8s/manifests/deployment-server.yaml b/packages/twenty-docker/k8s/manifests/deployment-server.yaml index b4596e9fc87b..b1229d649bbb 100644 --- a/packages/twenty-docker/k8s/manifests/deployment-server.yaml +++ b/packages/twenty-docker/k8s/manifests/deployment-server.yaml @@ -22,67 +22,78 @@ spec: app: twentycrm-server spec: volumes: - - name: twentycrm-server-data - persistentVolumeClaim: - claimName: twentycrm-server-pvc + - name: twentycrm-server-data + persistentVolumeClaim: + claimName: twentycrm-server-pvc + - name: twentycrm-docker-data + persistentVolumeClaim: + claimName: twentycrm-docker-data-pvc containers: - - env: - - name: PORT - value: 3000 - - name: SERVER_URL - value: "https://crm.example.com:443" - - name: FRONT_BASE_URL - value: "https://crm.example.com:443" - - name: PG_DATABASE_URL - value: "postgres://twenty:twenty@twenty-db.twentycrm.svc.cluster.local/default" - - name: ENABLE_DB_MIGRATIONS - value: "true" - - name: SIGN_IN_PREFILLED - value: "true" - - name: STORAGE_TYPE - value: "local" - - name: "MESSAGE_QUEUE_TYPE" - value: "pg-boss" - - name: ACCESS_TOKEN_SECRET - valueFrom: - secretKeyRef: - name: tokens - key: accessToken - - name: LOGIN_TOKEN_SECRET - valueFrom: - secretKeyRef: - name: tokens - key: loginToken - - name: REFRESH_TOKEN_SECRET - valueFrom: - secretKeyRef: - name: tokens - key: refreshToken - - name: FILE_TOKEN_SECRET - valueFrom: - secretKeyRef: - name: tokens - key: fileToken - - image: twentycrm/twenty:latest - imagePullPolicy: Always - name: twentycrm - ports: - - containerPort: 3000 - name: http-tcp - protocol: TCP - resources: - requests: - memory: "256Mi" - cpu: "250m" - limits: - memory: "1024Mi" - cpu: "1000m" - stdin: true - tty: true - volumeMounts: - - mountPath: /app/docker-data - name: twentycrm-server-data - - mountPath: /app/.local-storage - name: twentycrm-server-data + - name: twentycrm + image: twentycrm/twenty:latest + imagePullPolicy: Always + env: + - name: PORT + value: 3000 + - name: SERVER_URL + value: "https://crm.example.com:443" + - name: FRONT_BASE_URL + value: "https://crm.example.com:443" + - name: "PG_DATABASE_URL" + value: "postgres://twenty:twenty@twenty-db.twentycrm.svc.cluster.local/default" + - name: "REDIS_HOST" + value: "twentycrm-redis.twentycrm.svc.cluster.local" + - name: "REDIS_PORT" + value: 6379 + - name: ENABLE_DB_MIGRATIONS + value: "true" + - name: SIGN_IN_PREFILLED + value: "true" + - name: STORAGE_TYPE + value: "local" + - name: "MESSAGE_QUEUE_TYPE" + value: "bull-mq" + - name: "ACCESS_TOKEN_EXPIRES_IN" + value: "7d" + - name: "LOGIN_TOKEN_EXPIRES_IN" + value: "1h" + - name: ACCESS_TOKEN_SECRET + valueFrom: + secretKeyRef: + name: tokens + key: accessToken + - name: LOGIN_TOKEN_SECRET + valueFrom: + secretKeyRef: + name: tokens + key: loginToken + - name: REFRESH_TOKEN_SECRET + valueFrom: + secretKeyRef: + name: tokens + key: refreshToken + - name: FILE_TOKEN_SECRET + valueFrom: + secretKeyRef: + name: tokens + key: fileToken + ports: + - containerPort: 3000 + name: http-tcp + protocol: TCP + resources: + requests: + memory: "256Mi" + cpu: "250m" + limits: + memory: "1024Mi" + cpu: "1000m" + stdin: true + tty: true + volumeMounts: + - mountPath: /app/docker-data + name: twentycrm-docker-data + - mountPath: /app/packages/twenty-server/.local-storage + name: twentycrm-server-data dnsPolicy: ClusterFirst restartPolicy: Always diff --git a/packages/twenty-docker/k8s/manifests/deployment-worker.yaml b/packages/twenty-docker/k8s/manifests/deployment-worker.yaml index b3834c46e515..b3a7e07a19aa 100644 --- a/packages/twenty-docker/k8s/manifests/deployment-worker.yaml +++ b/packages/twenty-docker/k8s/manifests/deployment-worker.yaml @@ -21,58 +21,60 @@ spec: labels: app: twentycrm-worker spec: - volumes: - - name: twentycrm-worker-data - persistentVolumeClaim: - claimName: twentycrm-worker-pvc containers: - - env: - - name: SERVER_URL - value: "https://crm.example.com:443" - - name: FRONT_BASE_URL - value: "https://crm.example.com:443" - - name: PG_DATABASE_URL - value: "postgres://twenty:twenty@twenty-db.twentycrm.svc.cluster.local/default" - - name: ENABLE_DB_MIGRATIONS - value: "false" # it already runs on the server - - name: STORAGE_TYPE - value: "local" - - name: "MESSAGE_QUEUE_TYPE" - value: "pg-boss" - - name: ACCESS_TOKEN_SECRET - valueFrom: - secretKeyRef: - name: tokens - key: accessToken - - name: LOGIN_TOKEN_SECRET - valueFrom: - secretKeyRef: - name: tokens - key: loginToken - - name: REFRESH_TOKEN_SECRET - valueFrom: - secretKeyRef: - name: tokens - key: refreshToken - - name: FILE_TOKEN_SECRET - valueFrom: - secretKeyRef: - name: tokens - key: fileToken - - image: twentycrm/twenty:latest - imagePullPolicy: Always - name: twentycrm - command: - - yarn - - worker:prod - resources: - requests: - memory: "256Mi" - cpu: "250m" - limits: - memory: "1024Mi" - cpu: "1000m" - stdin: true - tty: true + - name: twentycrm + image: twentycrm/twenty:latest + imagePullPolicy: Always + env: + - name: SERVER_URL + value: "https://crm.example.com:443" + - name: FRONT_BASE_URL + value: "https://crm.example.com:443" + - name: PG_DATABASE_URL + value: "postgres://twenty:twenty@twenty-db.twentycrm.svc.cluster.local/default" + - name: ENABLE_DB_MIGRATIONS + value: "false" # it already runs on the server + - name: STORAGE_TYPE + value: "local" + - name: "MESSAGE_QUEUE_TYPE" + value: "bull-mq" + - name: "CACHE_STORAGE_TYPE" + value: "redis" + - name: "REDIS_HOST" + value: "twentycrm-redis.twentycrm.svc.cluster.local" + - name: "REDIS_PORT" + value: 6379 + - name: ACCESS_TOKEN_SECRET + valueFrom: + secretKeyRef: + name: tokens + key: accessToken + - name: LOGIN_TOKEN_SECRET + valueFrom: + secretKeyRef: + name: tokens + key: loginToken + - name: REFRESH_TOKEN_SECRET + valueFrom: + secretKeyRef: + name: tokens + key: refreshToken + - name: FILE_TOKEN_SECRET + valueFrom: + secretKeyRef: + name: tokens + key: fileToken + command: + - yarn + - worker:prod + resources: + requests: + memory: "1024Mi" + cpu: "250m" + limits: + memory: "2048Mi" + cpu: "1000m" + stdin: true + tty: true dnsPolicy: ClusterFirst restartPolicy: Always diff --git a/packages/twenty-docker/k8s/manifests/ingress.yaml b/packages/twenty-docker/k8s/manifests/ingress.yaml index b334aac21916..0bbae11dd72b 100644 --- a/packages/twenty-docker/k8s/manifests/ingress.yaml +++ b/packages/twenty-docker/k8s/manifests/ingress.yaml @@ -4,21 +4,21 @@ metadata: name: twentycrm namespace: twentycrm annotations: - nginx.ingress.kubernetes.io/configuration-snippet: | + nginx.ingress.kubernetes.io/configuration-snippet: | more_set_headers "X-Forwarded-For $http_x_forwarded_for"; - nginx.ingress.kubernetes.io/force-ssl-redirect: "false" - kubernetes.io/ingress.class: "nginx" - nginx.ingress.kubernetes.io/backend-protocol: "HTTP" + nginx.ingress.kubernetes.io/force-ssl-redirect: "false" + kubernetes.io/ingress.class: "nginx" + nginx.ingress.kubernetes.io/backend-protocol: "HTTP" spec: ingressClassName: nginx rules: - - host: crm.example.com - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: twentycrm-server - port: - name: http-tcp + - host: crm.example.com + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: twentycrm-server + port: + name: http-tcp diff --git a/packages/twenty-docker/k8s/manifests/pv-docker-data.yaml b/packages/twenty-docker/k8s/manifests/pv-docker-data.yaml new file mode 100644 index 000000000000..95fc52a26251 --- /dev/null +++ b/packages/twenty-docker/k8s/manifests/pv-docker-data.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: PersistentVolume +metadata: + name: twentycrm-docker-data-pv +spec: + storageClassName: default + capacity: + storage: 100Mi + accessModes: + - ReadWriteOnce + persistentVolumeReclaimPolicy: Retain diff --git a/packages/twenty-docker/k8s/manifests/pvc-docker-data.yaml b/packages/twenty-docker/k8s/manifests/pvc-docker-data.yaml new file mode 100644 index 000000000000..12dd071a7f21 --- /dev/null +++ b/packages/twenty-docker/k8s/manifests/pvc-docker-data.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: twentycrm-docker-data-pvc + namespace: twentycrm +spec: + storageClassName: default + volumeName: twentycrm-docker-data-pv + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 100Mi diff --git a/packages/twenty-docker/k8s/manifests/service-db.yaml b/packages/twenty-docker/k8s/manifests/service-db.yaml index bb0e38df6d6d..89dbd1464bed 100644 --- a/packages/twenty-docker/k8s/manifests/service-db.yaml +++ b/packages/twenty-docker/k8s/manifests/service-db.yaml @@ -6,9 +6,9 @@ metadata: spec: internalTrafficPolicy: Cluster ports: - - port: 5432 - protocol: TCP - targetPort: 5432 + - port: 5432 + protocol: TCP + targetPort: 5432 selector: app: twentycrm-db sessionAffinity: ClientIP diff --git a/packages/twenty-docker/k8s/manifests/service-redis.yaml b/packages/twenty-docker/k8s/manifests/service-redis.yaml new file mode 100644 index 000000000000..49f508897dfa --- /dev/null +++ b/packages/twenty-docker/k8s/manifests/service-redis.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +kind: Service +metadata: + name: twentycrm-redis + namespace: twentycrm +spec: + internalTrafficPolicy: Cluster + ports: + - port: 6379 + protocol: TCP + targetPort: 6379 + selector: + app: twentycrm-redis + sessionAffinity: ClientIP + sessionAffinityConfig: + clientIP: + timeoutSeconds: 10800 + type: ClusterIP diff --git a/packages/twenty-docker/k8s/manifests/service-server.yaml b/packages/twenty-docker/k8s/manifests/service-server.yaml index 7fcc869a6edc..b45b28f312ff 100644 --- a/packages/twenty-docker/k8s/manifests/service-server.yaml +++ b/packages/twenty-docker/k8s/manifests/service-server.yaml @@ -6,10 +6,10 @@ metadata: spec: internalTrafficPolicy: Cluster ports: - - name: http-tcp - port: 3000 - protocol: TCP - targetPort: 3000 + - name: http-tcp + port: 3000 + protocol: TCP + targetPort: 3000 selector: app: twentycrm-server sessionAffinity: ClientIP diff --git a/packages/twenty-docker/k8s/terraform/.terraform-docs.yml b/packages/twenty-docker/k8s/terraform/.terraform-docs.yml index 00778168f3ee..792c543f4d30 100644 --- a/packages/twenty-docker/k8s/terraform/.terraform-docs.yml +++ b/packages/twenty-docker/k8s/terraform/.terraform-docs.yml @@ -15,12 +15,12 @@ output: # TwentyCRM Terraform Docs - This file was generated by [terraform-docs](https://terraform-docs.io/), for more information on how to install, configure and use visit their website. + This file was generated by [terraform-docs](https://terraform-docs.io/), for more information on how to install, configure, and use visit their website. - To update this `README.md` after changes to the Terraform code in this folder, run: `terraform-docs .` + To update this `README.md` after changes to the Terraform code in this folder, run: `terraform-docs -c `./.terraform-docs.yml .` To make configuration changes to how this doc is generated, see `./.terraform-docs.yml` - + {{ .Content }} @@ -45,4 +45,4 @@ settings: read-comments: true required: true sensitive: true - type: true \ No newline at end of file + type: true diff --git a/packages/twenty-docker/k8s/terraform/README.md b/packages/twenty-docker/k8s/terraform/README.md index 10a7ab557cb7..f6955300a63f 100644 --- a/packages/twenty-docker/k8s/terraform/README.md +++ b/packages/twenty-docker/k8s/terraform/README.md @@ -1,9 +1,9 @@ # TwentyCRM Terraform Docs -This file was generated by [terraform-docs](https://terraform-docs.io/), for more information on how to install, configure and use visit their website. +This file was generated by [terraform-docs](https://terraform-docs.io/), for more information on how to install, configure, and use visit their website. -To update this `README.md` after changes to the Terraform code in this folder, run: `terraform-docs .` +To update this `README.md` after changes to the Terraform code in this folder, run: `terraform-docs -c `./.terraform-docs.yml .` To make configuration changes to how this doc is generated, see `./.terraform-docs.yml` @@ -12,30 +12,37 @@ To make configuration changes to how this doc is generated, see `./.terraform-do | Name | Version | |------|---------| | [terraform](#requirement\_terraform) | >= 1.9.2 | -| [kubernetes](#requirement\_kubernetes) | >= 2.31.0 | +| [kubernetes](#requirement\_kubernetes) | >= 2.32.0 | +| [random](#requirement\_random) | >= 3.6.3 | ## Providers | Name | Version | |------|---------| -| [kubernetes](#provider\_kubernetes) | >= 2.31.0 | +| [kubernetes](#provider\_kubernetes) | >= 2.32.0 | +| [random](#provider\_random) | >= 3.6.3 | ## Resources | Name | Type | |------|------| | [kubernetes_deployment.twentycrm_db](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/deployment) | resource | +| [kubernetes_deployment.twentycrm_redis](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/deployment) | resource | | [kubernetes_deployment.twentycrm_server](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/deployment) | resource | | [kubernetes_deployment.twentycrm_worker](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/deployment) | resource | | [kubernetes_ingress.twentycrm](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/ingress) | resource | | [kubernetes_namespace.twentycrm](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/namespace) | resource | | [kubernetes_persistent_volume.db](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/persistent_volume) | resource | +| [kubernetes_persistent_volume.docker_data](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/persistent_volume) | resource | | [kubernetes_persistent_volume.server](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/persistent_volume) | resource | | [kubernetes_persistent_volume_claim.db](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/persistent_volume_claim) | resource | +| [kubernetes_persistent_volume_claim.docker_data](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/persistent_volume_claim) | resource | | [kubernetes_persistent_volume_claim.server](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/persistent_volume_claim) | resource | | [kubernetes_secret.twentycrm_tokens](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/secret) | resource | | [kubernetes_service.twentycrm_db](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/service) | resource | +| [kubernetes_service.twentycrm_redis](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/service) | resource | | [kubernetes_service.twentycrm_server](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/service) | resource | +| [random_bytes.this](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/bytes) | resource | ## Inputs @@ -43,22 +50,24 @@ To make configuration changes to how this doc is generated, see `./.terraform-do |------|-------------|------|---------|:--------:| | [twentycrm\_app\_hostname](#input\_twentycrm\_app\_hostname) | The protocol, DNS fully qualified hostname, and port used to access TwentyCRM in your environment. Ex: https://crm.example.com:443 | `string` | n/a | yes | | [twentycrm\_pgdb\_admin\_password](#input\_twentycrm\_pgdb\_admin\_password) | TwentyCRM password for postgres database. | `string` | n/a | yes | -| [twentycrm\_token\_accessToken](#input\_twentycrm\_token\_accessToken) | TwentyCRM access Token | `string` | n/a | yes | -| [twentycrm\_token\_fileToken](#input\_twentycrm\_token\_fileToken) | TwentyCRM file Token | `string` | n/a | yes | -| [twentycrm\_token\_loginToken](#input\_twentycrm\_token\_loginToken) | TwentyCRM login Token | `string` | n/a | yes | -| [twentycrm\_token\_refreshToken](#input\_twentycrm\_token\_refreshToken) | TwentyCRM refresh Token | `string` | n/a | yes | | [twentycrm\_app\_name](#input\_twentycrm\_app\_name) | A friendly name prefix to use for every component deployed. | `string` | `"twentycrm"` | no | | [twentycrm\_db\_image](#input\_twentycrm\_db\_image) | TwentyCRM image for database deployment. This defaults to latest. | `string` | `"twentycrm/twenty-postgres:latest"` | no | | [twentycrm\_db\_pv\_capacity](#input\_twentycrm\_db\_pv\_capacity) | Storage capacity provisioned for database persistent volume. | `string` | `"10Gi"` | no | | [twentycrm\_db\_pv\_path](#input\_twentycrm\_db\_pv\_path) | Local path to use to store the physical volume if using local storage on nodes. | `string` | `""` | no | | [twentycrm\_db\_pvc\_requests](#input\_twentycrm\_db\_pvc\_requests) | Storage capacity reservation for database persistent volume claim. | `string` | `"10Gi"` | no | | [twentycrm\_db\_replicas](#input\_twentycrm\_db\_replicas) | Number of replicas for the TwentyCRM database deployment. This defaults to 1. | `number` | `1` | no | +| [twentycrm\_docker\_data\_mount\_path](#input\_twentycrm\_docker\_data\_mount\_path) | TwentyCRM mount path for servers application data. Defaults to '/app/docker-data'. | `string` | `"/app/docker-data"` | no | +| [twentycrm\_docker\_data\_pv\_capacity](#input\_twentycrm\_docker\_data\_pv\_capacity) | Storage capacity provisioned for server persistent volume. | `string` | `"10Gi"` | no | +| [twentycrm\_docker\_data\_pv\_path](#input\_twentycrm\_docker\_data\_pv\_path) | Local path to use to store the physical volume if using local storage on nodes. | `string` | `""` | no | +| [twentycrm\_docker\_data\_pvc\_requests](#input\_twentycrm\_docker\_data\_pvc\_requests) | Storage capacity reservation for server persistent volume claim. | `string` | `"10Gi"` | no | | [twentycrm\_namespace](#input\_twentycrm\_namespace) | Namespace for all TwentyCRM resources | `string` | `"twentycrm"` | no | -| [twentycrm\_server\_data\_mount\_path](#input\_twentycrm\_server\_data\_mount\_path) | TwentyCRM mount path for servers application data. Defaults to '/app/docker-data'. | `string` | `"/app/docker-data"` | no | +| [twentycrm\_redis\_image](#input\_twentycrm\_redis\_image) | TwentyCRM image for Redis deployment. This defaults to latest. | `string` | `"redis/redis-stack-server:latest"` | no | +| [twentycrm\_redis\_replicas](#input\_twentycrm\_redis\_replicas) | Number of replicas for the TwentyCRM Redis deployment. This defaults to 1. | `number` | `1` | no | +| [twentycrm\_server\_data\_mount\_path](#input\_twentycrm\_server\_data\_mount\_path) | TwentyCRM mount path for servers application data. Defaults to '/app/packages/twenty-server/.local-storage'. | `string` | `"/app/packages/twenty-server/.local-storage"` | no | | [twentycrm\_server\_image](#input\_twentycrm\_server\_image) | TwentyCRM server image for the server deployment. This defaults to latest. This value is also used for the workers image. | `string` | `"twentycrm/twenty:latest"` | no | | [twentycrm\_server\_pv\_capacity](#input\_twentycrm\_server\_pv\_capacity) | Storage capacity provisioned for server persistent volume. | `string` | `"10Gi"` | no | | [twentycrm\_server\_pv\_path](#input\_twentycrm\_server\_pv\_path) | Local path to use to store the physical volume if using local storage on nodes. | `string` | `""` | no | | [twentycrm\_server\_pvc\_requests](#input\_twentycrm\_server\_pvc\_requests) | Storage capacity reservation for server persistent volume claim. | `string` | `"10Gi"` | no | | [twentycrm\_server\_replicas](#input\_twentycrm\_server\_replicas) | Number of replicas for the TwentyCRM server deployment. This defaults to 1. | `number` | `1` | no | | [twentycrm\_worker\_replicas](#input\_twentycrm\_worker\_replicas) | Number of replicas for the TwentyCRM worker deployment. This defaults to 1. | `number` | `1` | no | - \ No newline at end of file + diff --git a/packages/twenty-docker/k8s/terraform/deployment-redis.tf b/packages/twenty-docker/k8s/terraform/deployment-redis.tf new file mode 100644 index 000000000000..d867dac76ee0 --- /dev/null +++ b/packages/twenty-docker/k8s/terraform/deployment-redis.tf @@ -0,0 +1,60 @@ +resource "kubernetes_deployment" "twentycrm_redis" { + metadata { + name = "${var.twentycrm_app_name}-redis" + namespace = kubernetes_namespace.twentycrm.metadata.0.name + + labels = { + app = "${var.twentycrm_app_name}-redis" + } + } + + spec { + replicas = var.twentycrm_redis_replicas + selector { + match_labels = { + app = "${var.twentycrm_app_name}-redis" + } + } + + strategy { + type = "RollingUpdate" + rolling_update { + max_surge = "1" + max_unavailable = "1" + } + } + + template { + metadata { + labels = { + app = "${var.twentycrm_app_name}-redis" + } + } + + spec { + container { + image = var.twentycrm_redis_image + name = "redis" + + port { + container_port = 6379 + protocol = "TCP" + } + + resources { + requests = { + cpu = "250m" + memory = "1024Mi" + } + limits = { + cpu = "500m" + memory = "2048Mi" + } + } + } + dns_policy = "ClusterFirst" + restart_policy = "Always" + } + } + } +} diff --git a/packages/twenty-docker/k8s/terraform/deployment-server.tf b/packages/twenty-docker/k8s/terraform/deployment-server.tf index a3c1f9ac1d11..1868b17624da 100644 --- a/packages/twenty-docker/k8s/terraform/deployment-server.tf +++ b/packages/twenty-docker/k8s/terraform/deployment-server.tf @@ -37,20 +37,14 @@ resource "kubernetes_deployment" "twentycrm_server" { stdin = true tty = true - security_context { - allow_privilege_escalation = true - privileged = true - run_as_user = 1000 - } - env { name = "PORT" value = "3000" } - env { - name = "DEBUG_MODE" - value = false - } + # env { + # name = "DEBUG_MODE" + # value = false + # } env { name = "SERVER_URL" @@ -64,9 +58,16 @@ resource "kubernetes_deployment" "twentycrm_server" { env { name = "PG_DATABASE_URL" - value = "postgres://twenty:${var.twentycrm_pgdb_admin_password}@${var.twentycrm_app_name}-db.${kubernetes_namespace.twentycrm.metadata.0.name}.svc.cluster.local/default" + value = "postgres://twenty:${var.twentycrm_pgdb_admin_password}@${kubernetes_service.twentycrm_db.metadata.0.name}.${kubernetes_namespace.twentycrm.metadata.0.name}.svc.cluster.local/default" + } + env { + name = "REDIS_HOST" + value = "${kubernetes_service.twentycrm_redis.metadata.0.name}.${kubernetes_namespace.twentycrm.metadata.0.name}.svc.cluster.local" + } + env { + name = "REDIS_PORT" + value = 6379 } - env { name = "ENABLE_DB_MIGRATIONS" value = "true" @@ -83,7 +84,15 @@ resource "kubernetes_deployment" "twentycrm_server" { } env { name = "MESSAGE_QUEUE_TYPE" - value = "pg-boss" + value = "bull-mq" + } + env { + name = "ACCESS_TOKEN_EXPIRES_IN" + value = "7d" + } + env { + name = "LOGIN_TOKEN_EXPIRES_IN" + value = "1h" } env { name = "ACCESS_TOKEN_SECRET" @@ -145,6 +154,11 @@ resource "kubernetes_deployment" "twentycrm_server" { name = "server-data" mount_path = var.twentycrm_server_data_mount_path } + + volume_mount { + name = "docker-data" + mount_path = var.twentycrm_docker_data_mount_path + } } volume { @@ -155,6 +169,14 @@ resource "kubernetes_deployment" "twentycrm_server" { } } + volume { + name = "docker-data" + + persistent_volume_claim { + claim_name = kubernetes_persistent_volume_claim.docker_data.metadata.0.name + } + } + dns_policy = "ClusterFirst" restart_policy = "Always" } @@ -162,6 +184,7 @@ resource "kubernetes_deployment" "twentycrm_server" { } depends_on = [ kubernetes_deployment.twentycrm_db, + kubernetes_deployment.twentycrm_redis, kubernetes_secret.twentycrm_tokens ] } diff --git a/packages/twenty-docker/k8s/terraform/deployment-worker.tf b/packages/twenty-docker/k8s/terraform/deployment-worker.tf index 9a005839ddda..78e5ea6dcc1d 100644 --- a/packages/twenty-docker/k8s/terraform/deployment-worker.tf +++ b/packages/twenty-docker/k8s/terraform/deployment-worker.tf @@ -50,7 +50,22 @@ resource "kubernetes_deployment" "twentycrm_worker" { env { name = "PG_DATABASE_URL" - value = "postgres://twenty:${var.twentycrm_pgdb_admin_password}@${var.twentycrm_app_name}-db.${kubernetes_namespace.twentycrm.metadata.0.name}.svc.cluster.local/default" + value = "postgres://twenty:${var.twentycrm_pgdb_admin_password}@${kubernetes_service.twentycrm_db.metadata.0.name}.${kubernetes_namespace.twentycrm.metadata.0.name}.svc.cluster.local/default" + } + + env { + name = "CACHE_STORAGE_TYPE" + value = "redis" + } + + env { + name = "REDIS_HOST" + value = "${kubernetes_service.twentycrm_redis.metadata.0.name}.${kubernetes_namespace.twentycrm.metadata.0.name}.svc.cluster.local" + } + + env { + name = "REDIS_PORT" + value = 6379 } env { @@ -64,7 +79,7 @@ resource "kubernetes_deployment" "twentycrm_worker" { } env { name = "MESSAGE_QUEUE_TYPE" - value = "pg-boss" + value = "bull-mq" } env { @@ -110,11 +125,11 @@ resource "kubernetes_deployment" "twentycrm_worker" { resources { requests = { cpu = "250m" - memory = "256Mi" + memory = "1024Mi" } limits = { cpu = "1000m" - memory = "1024Mi" + memory = "2048Mi" } } } @@ -126,6 +141,8 @@ resource "kubernetes_deployment" "twentycrm_worker" { } depends_on = [ kubernetes_deployment.twentycrm_db, - kubernetes_secret.twentycrm_tokens + kubernetes_deployment.twentycrm_redis, + kubernetes_deployment.twentycrm_server, + kubernetes_secret.twentycrm_tokens, ] } diff --git a/packages/twenty-docker/k8s/terraform/main.tf b/packages/twenty-docker/k8s/terraform/main.tf index 66ae6e18e061..a0e208d15f5d 100644 --- a/packages/twenty-docker/k8s/terraform/main.tf +++ b/packages/twenty-docker/k8s/terraform/main.tf @@ -13,7 +13,11 @@ terraform { required_providers { kubernetes = { source = "hashicorp/kubernetes" - version = ">= 2.31.0" + version = ">= 2.32.0" + } + random = { + source = "hashicorp/random" + version = ">= 3.6.3" } } } diff --git a/packages/twenty-docker/k8s/terraform/pv-docker-data.tf b/packages/twenty-docker/k8s/terraform/pv-docker-data.tf new file mode 100644 index 000000000000..9195fff61c8a --- /dev/null +++ b/packages/twenty-docker/k8s/terraform/pv-docker-data.tf @@ -0,0 +1,19 @@ +resource "kubernetes_persistent_volume" "docker_data" { + metadata { + name = "${var.twentycrm_app_name}-docker-data-pv" + } + spec { + storage_class_name = "default" + capacity = { + storage = var.twentycrm_docker_data_pv_capacity + } + access_modes = ["ReadWriteOnce"] + # refer to Terraform Docs for your specific implementation requirements + # https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/persistent_volume + persistent_volume_source { + local { + path = var.twentycrm_docker_data_pv_path + } + } + } +} diff --git a/packages/twenty-docker/k8s/terraform/pvc-docker-data.tf b/packages/twenty-docker/k8s/terraform/pvc-docker-data.tf new file mode 100644 index 000000000000..daac13dcc3a3 --- /dev/null +++ b/packages/twenty-docker/k8s/terraform/pvc-docker-data.tf @@ -0,0 +1,15 @@ +resource "kubernetes_persistent_volume_claim" "docker_data" { + metadata { + name = "${var.twentycrm_app_name}-docker-data-pvc" + namespace = kubernetes_namespace.twentycrm.metadata.0.name + } + spec { + access_modes = ["ReadWriteOnce"] + resources { + requests = { + storage = var.twentycrm_docker_data_pvc_requests + } + } + volume_name = kubernetes_persistent_volume.docker_data.metadata.0.name + } +} diff --git a/packages/twenty-docker/k8s/terraform/secret.tf b/packages/twenty-docker/k8s/terraform/secret.tf index 664d07803ccc..2aa7ccf4765a 100644 --- a/packages/twenty-docker/k8s/terraform/secret.tf +++ b/packages/twenty-docker/k8s/terraform/secret.tf @@ -1,3 +1,18 @@ +locals { + tokens = [ + "accessToken", + "loginToken", + "refreshToken", + "fileToken" + ] +} + +resource "random_bytes" "this" { + for_each = toset(local.tokens) + + length = 32 +} + resource "kubernetes_secret" "twentycrm_tokens" { metadata { name = "tokens" @@ -5,11 +20,9 @@ resource "kubernetes_secret" "twentycrm_tokens" { } data = { - accessToken = var.twentycrm_token_accessToken - loginToken = var.twentycrm_token_loginToken - refreshToken = var.twentycrm_token_refreshToken - fileToken = var.twentycrm_token_fileToken + accessToken = random_bytes.this["accessToken"].base64 + loginToken = random_bytes.this["loginToken"].base64 + refreshToken = random_bytes.this["refreshToken"].base64 + fileToken = random_bytes.this["fileToken"].base64 } - - # type = "kubernetes.io/basic-auth" } diff --git a/packages/twenty-docker/k8s/terraform/service-redis.tf b/packages/twenty-docker/k8s/terraform/service-redis.tf new file mode 100644 index 000000000000..fab1c0051ccf --- /dev/null +++ b/packages/twenty-docker/k8s/terraform/service-redis.tf @@ -0,0 +1,18 @@ +resource "kubernetes_service" "twentycrm_redis" { + metadata { + name = "${var.twentycrm_app_name}-redis" + namespace = kubernetes_namespace.twentycrm.metadata.0.name + } + spec { + selector = { + app = "${var.twentycrm_app_name}-redis" + } + session_affinity = "ClientIP" + port { + port = 6379 + target_port = 6379 + } + + type = "ClusterIP" + } +} diff --git a/packages/twenty-docker/k8s/terraform/variables.tf b/packages/twenty-docker/k8s/terraform/variables.tf index 53255aaf1489..7b682db79a35 100644 --- a/packages/twenty-docker/k8s/terraform/variables.tf +++ b/packages/twenty-docker/k8s/terraform/variables.tf @@ -1,30 +1,6 @@ ###################### # Required Variables # ###################### -variable "twentycrm_token_accessToken" { - type = string - description = "TwentyCRM access Token" - sensitive = true -} - -variable "twentycrm_token_loginToken" { - type = string - description = "TwentyCRM login Token" - sensitive = true -} - -variable "twentycrm_token_refreshToken" { - type = string - description = "TwentyCRM refresh Token" - sensitive = true -} - -variable "twentycrm_token_fileToken" { - type = string - description = "TwentyCRM file Token" - sensitive = true -} - variable "twentycrm_pgdb_admin_password" { type = string description = "TwentyCRM password for postgres database." @@ -77,8 +53,8 @@ variable "twentycrm_db_replicas" { variable "twentycrm_server_data_mount_path" { type = string - default = "/app/docker-data" - description = "TwentyCRM mount path for servers application data. Defaults to '/app/docker-data'." + default = "/app/packages/twenty-server/.local-storage" + description = "TwentyCRM mount path for servers application data. Defaults to '/app/packages/twenty-server/.local-storage'." } variable "twentycrm_db_pv_path" { @@ -122,3 +98,39 @@ variable "twentycrm_namespace" { default = "twentycrm" description = "Namespace for all TwentyCRM resources" } + +variable "twentycrm_redis_replicas" { + type = number + default = 1 + description = "Number of replicas for the TwentyCRM Redis deployment. This defaults to 1." +} + +variable "twentycrm_redis_image" { + type = string + default = "redis/redis-stack-server:latest" + description = "TwentyCRM image for Redis deployment. This defaults to latest." +} + +variable "twentycrm_docker_data_mount_path" { + type = string + default = "/app/docker-data" + description = "TwentyCRM mount path for servers application data. Defaults to '/app/docker-data'." +} + +variable "twentycrm_docker_data_pv_path" { + type = string + default = "" + description = "Local path to use to store the physical volume if using local storage on nodes." +} + +variable "twentycrm_docker_data_pv_capacity" { + type = string + default = "100Mi" + description = "Storage capacity provisioned for server persistent volume." +} + +variable "twentycrm_docker_data_pvc_requests" { + type = string + default = "100Mi" + description = "Storage capacity reservation for server persistent volume claim." +} From 2bc7974da97db772e63385d72948df7633518133 Mon Sep 17 00:00:00 2001 From: Ngan Phan Date: Mon, 7 Oct 2024 04:06:51 -0700 Subject: [PATCH 17/30] fix: Improve Usability of Adding Options via Return Key for Multi-Select Field (#7450) Fixes #6602 This is the approach that I followed based on these comments https://github.com/twentyhq/twenty/issues/6602#issuecomment-2356870311, https://github.com/twentyhq/twenty/issues/6602#issuecomment-2330737907 - Create forward ref in `` component - Create ref to select text in parent component `` and pass it to `` --------- Co-authored-by: Lucas Bordeau --- .../SettingsDataModelFieldSelectForm.tsx | 8 +------- ...SettingsDataModelFieldSelectFormOptionRow.tsx | 7 ++++--- .../SettingsServerlessFunctionNewForm.tsx | 10 +++++----- .../modules/ui/input/components/TextInput.tsx | 16 ++++++++++++---- 4 files changed, 22 insertions(+), 19 deletions(-) diff --git a/packages/twenty-front/src/modules/settings/data-model/fields/forms/select/components/SettingsDataModelFieldSelectForm.tsx b/packages/twenty-front/src/modules/settings/data-model/fields/forms/select/components/SettingsDataModelFieldSelectForm.tsx index 9d3c97628f2e..128aab7ab6fd 100644 --- a/packages/twenty-front/src/modules/settings/data-model/fields/forms/select/components/SettingsDataModelFieldSelectForm.tsx +++ b/packages/twenty-front/src/modules/settings/data-model/fields/forms/select/components/SettingsDataModelFieldSelectForm.tsx @@ -1,6 +1,5 @@ import styled from '@emotion/styled'; import { DropResult } from '@hello-pangea/dnd'; -import { useState } from 'react'; import { Controller, useFormContext } from 'react-hook-form'; import { IconPlus } from 'twenty-ui'; import { z } from 'zod'; @@ -79,7 +78,6 @@ const StyledButton = styled(LightButton)` export const SettingsDataModelFieldSelectForm = ({ fieldMetadataItem, }: SettingsDataModelFieldSelectFormProps) => { - const [focusedOptionId, setFocusedOptionId] = useState(''); const { initialDefaultValue, initialOptions } = useSelectSettingsFormInitialValues({ fieldMetadataItem }); @@ -190,10 +188,6 @@ export const SettingsDataModelFieldSelectForm = ({ const newOptions = getOptionsWithNewOption(); setFormValue('options', newOptions); - - const lastOptionId = newOptions[newOptions.length - 1].id; - - setFocusedOptionId(lastOptionId); }; return ( @@ -227,7 +221,7 @@ export const SettingsDataModelFieldSelectForm = ({ { const nextOptions = toSpliced( options, diff --git a/packages/twenty-front/src/modules/settings/data-model/fields/forms/select/components/SettingsDataModelFieldSelectFormOptionRow.tsx b/packages/twenty-front/src/modules/settings/data-model/fields/forms/select/components/SettingsDataModelFieldSelectFormOptionRow.tsx index 121aa15e0e07..d9be3fff7e0e 100644 --- a/packages/twenty-front/src/modules/settings/data-model/fields/forms/select/components/SettingsDataModelFieldSelectFormOptionRow.tsx +++ b/packages/twenty-front/src/modules/settings/data-model/fields/forms/select/components/SettingsDataModelFieldSelectFormOptionRow.tsx @@ -33,7 +33,7 @@ type SettingsDataModelFieldSelectFormOptionRowProps = { onRemoveAsDefault?: () => void; onInputEnter?: () => void; option: FieldMetadataItemOption; - focused?: boolean; + isNewRow?: boolean; }; const StyledRow = styled.div` @@ -67,7 +67,7 @@ export const SettingsDataModelFieldSelectFormOptionRow = ({ onRemoveAsDefault, onInputEnter, option, - focused, + isNewRow, }: SettingsDataModelFieldSelectFormOptionRowProps) => { const theme = useTheme(); @@ -129,10 +129,11 @@ export const SettingsDataModelFieldSelectFormOptionRow = ({ value: getOptionValueFromLabel(label), }) } - focused={focused} RightIcon={isDefault ? IconCheck : undefined} maxLength={OPTION_VALUE_MAXIMUM_LENGTH} onInputEnter={handleInputEnter} + autoFocusOnMount={isNewRow} + autoSelectOnMount={isNewRow} /> diff --git a/packages/twenty-front/src/modules/ui/input/components/TextInput.tsx b/packages/twenty-front/src/modules/ui/input/components/TextInput.tsx index b0841eaa710f..8e31f598822d 100644 --- a/packages/twenty-front/src/modules/ui/input/components/TextInput.tsx +++ b/packages/twenty-front/src/modules/ui/input/components/TextInput.tsx @@ -14,7 +14,8 @@ export type TextInputProps = TextInputV2ComponentProps & { disableHotkeys?: boolean; onInputEnter?: () => void; dataTestId?: string; - focused?: boolean; + autoFocusOnMount?: boolean; + autoSelectOnMount?: boolean; }; export const TextInput = ({ @@ -22,7 +23,8 @@ export const TextInput = ({ onBlur, onInputEnter, disableHotkeys = false, - focused, + autoFocusOnMount, + autoSelectOnMount, dataTestId, ...props }: TextInputProps) => { @@ -31,11 +33,17 @@ export const TextInput = ({ const [isFocused, setIsFocused] = useState(false); useEffect(() => { - if (focused === true) { + if (autoFocusOnMount === true) { inputRef.current?.focus(); setIsFocused(true); } - }, [focused]); + }, [autoFocusOnMount]); + + useEffect(() => { + if (autoSelectOnMount === true) { + inputRef.current?.select(); + } + }, [autoSelectOnMount]); const { goBackToPreviousHotkeyScope, From ce676f699d621bd7dddd520567fdbaa311a0c4c3 Mon Sep 17 00:00:00 2001 From: Thomas Trompette Date: Mon, 7 Oct 2024 13:45:29 +0200 Subject: [PATCH 18/30] Add opened section (#7265) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When object is not part of the workspace favorite list, we want to show it in the "opened section" while its record page is accessed. This PR: - adds a new component `NavigationDrawerOpenedSection` - makes workflow versions and runs not system object + creates a prefilled view index for these - do not create workspace favorites for these so these do not appear in the workspace section Capture d’écran 2024-09-26 à 11 45 25 --- .../components/WorkspaceFavorites.tsx | 27 ++------- .../components/MainNavigationDrawerItems.tsx | 3 + ...ObjectMetadataItemsInWorkspaceFavorites.ts | 35 ++++++++++++ .../NavigationDrawerOpenedSection.tsx | 57 +++++++++++++++++++ .../useIsMenuNavbarDisplayed.test.tsx | 40 ------------- .../layout/hooks/useIsMenuNavbarDisplayed.ts | 6 -- .../data-seed-dev-workspace.command.ts | 10 +++- .../utils/should-seed-workspace-favorite.ts | 9 +++ .../demo-objects-prefill-data.ts | 3 +- .../standard-objects-prefill-data.ts | 10 +++- .../standard-objects-prefill-data/view.ts | 24 +++++--- .../views/companies-all.view.ts | 2 +- .../views/notes-all.view.ts | 2 +- .../views/opportunities-all.view.ts | 2 +- .../views/opportunity-by-stage.view.ts | 2 +- .../views/people-all.view.ts | 2 +- .../views/tasks-all.view.ts | 2 +- .../views/tasks-by-status.view.ts | 2 +- .../views/workflow-runs-all.view.ts | 56 ++++++++++++++++++ .../views/workflow-versions-all.view.ts | 56 ++++++++++++++++++ .../views/workflows-all.view.ts | 2 +- .../constants/standard-field-ids.ts | 3 + .../workflow-run.workspace-entity.ts | 29 ++++++++-- .../workflow-version.workspace-entity.ts | 19 ++++++- .../workflow.workspace-entity.ts | 1 + 25 files changed, 310 insertions(+), 94 deletions(-) create mode 100644 packages/twenty-front/src/modules/navigation/hooks/useObjectMetadataItemsInWorkspaceFavorites.ts create mode 100644 packages/twenty-front/src/modules/object-metadata/components/NavigationDrawerOpenedSection.tsx delete mode 100644 packages/twenty-front/src/modules/ui/layout/hooks/__tests__/useIsMenuNavbarDisplayed.test.tsx delete mode 100644 packages/twenty-front/src/modules/ui/layout/hooks/useIsMenuNavbarDisplayed.ts create mode 100644 packages/twenty-server/src/engine/utils/should-seed-workspace-favorite.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/workflow-runs-all.view.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/workflow-versions-all.view.ts diff --git a/packages/twenty-front/src/modules/favorites/components/WorkspaceFavorites.tsx b/packages/twenty-front/src/modules/favorites/components/WorkspaceFavorites.tsx index b89290526c98..cf106211405b 100644 --- a/packages/twenty-front/src/modules/favorites/components/WorkspaceFavorites.tsx +++ b/packages/twenty-front/src/modules/favorites/components/WorkspaceFavorites.tsx @@ -1,7 +1,6 @@ -import { useFavorites } from '@/favorites/hooks/useFavorites'; +import { useFilteredObjectMetadataItemsForWorkspaceFavorites } from '@/navigation/hooks/useObjectMetadataItemsInWorkspaceFavorites'; import { NavigationDrawerSectionForObjectMetadataItems } from '@/object-metadata/components/NavigationDrawerSectionForObjectMetadataItems'; import { NavigationDrawerSectionForObjectMetadataItemsSkeletonLoader } from '@/object-metadata/components/NavigationDrawerSectionForObjectMetadataItemsSkeletonLoader'; -import { useFilteredObjectMetadataItems } from '@/object-metadata/hooks/useFilteredObjectMetadataItems'; import { useIsPrefetchLoading } from '@/prefetch/hooks/useIsPrefetchLoading'; import { usePrefetchedData } from '@/prefetch/hooks/usePrefetchedData'; import { PrefetchKey } from '@/prefetch/types/PrefetchKey'; @@ -9,34 +8,18 @@ import { View } from '@/views/types/View'; export const WorkspaceFavorites = () => { const { records: views } = usePrefetchedData(PrefetchKey.AllViews); - const loading = useIsPrefetchLoading(); - - const { workspaceFavorites } = useFavorites(); - - const workspaceFavoriteIds = new Set( - workspaceFavorites.map((favorite) => favorite.recordId), - ); - const favoriteViewObjectMetadataIds = views.reduce((acc, view) => { - if (workspaceFavoriteIds.has(view.id)) { - acc.push(view.objectMetadataId); - } - return acc; - }, []); - - const { objectMetadataItems } = useFilteredObjectMetadataItems(); - - const objectMetadataItemsToDisplay = objectMetadataItems.filter((item) => - favoriteViewObjectMetadataIds.includes(item.id), - ); + const { activeObjectMetadataItems: objectMetadataItemsToDisplay } = + useFilteredObjectMetadataItemsForWorkspaceFavorites(); + const loading = useIsPrefetchLoading(); if (loading) { return ; } return ( { )} + {isWorkspaceFavoriteEnabled && } + {isWorkspaceFavoriteEnabled ? ( diff --git a/packages/twenty-front/src/modules/navigation/hooks/useObjectMetadataItemsInWorkspaceFavorites.ts b/packages/twenty-front/src/modules/navigation/hooks/useObjectMetadataItemsInWorkspaceFavorites.ts new file mode 100644 index 000000000000..1c8abefe350e --- /dev/null +++ b/packages/twenty-front/src/modules/navigation/hooks/useObjectMetadataItemsInWorkspaceFavorites.ts @@ -0,0 +1,35 @@ +import { useFavorites } from '@/favorites/hooks/useFavorites'; +import { useFilteredObjectMetadataItems } from '@/object-metadata/hooks/useFilteredObjectMetadataItems'; +import { usePrefetchedData } from '@/prefetch/hooks/usePrefetchedData'; +import { PrefetchKey } from '@/prefetch/types/PrefetchKey'; +import { View } from '@/views/types/View'; + +export const useFilteredObjectMetadataItemsForWorkspaceFavorites = () => { + const { records: views } = usePrefetchedData(PrefetchKey.AllViews); + + const { workspaceFavorites } = useFavorites(); + + const workspaceFavoriteIds = new Set( + workspaceFavorites.map((favorite) => favorite.recordId), + ); + + const favoriteViewObjectMetadataIds = new Set( + views.reduce((acc, view) => { + if (workspaceFavoriteIds.has(view.id)) { + acc.push(view.objectMetadataId); + } + return acc; + }, []), + ); + + const { activeObjectMetadataItems } = useFilteredObjectMetadataItems(); + + const activeObjectMetadataItemsInWorkspaceFavorites = + activeObjectMetadataItems.filter((item) => + favoriteViewObjectMetadataIds.has(item.id), + ); + + return { + activeObjectMetadataItems: activeObjectMetadataItemsInWorkspaceFavorites, + }; +}; diff --git a/packages/twenty-front/src/modules/object-metadata/components/NavigationDrawerOpenedSection.tsx b/packages/twenty-front/src/modules/object-metadata/components/NavigationDrawerOpenedSection.tsx new file mode 100644 index 000000000000..fb17b643078f --- /dev/null +++ b/packages/twenty-front/src/modules/object-metadata/components/NavigationDrawerOpenedSection.tsx @@ -0,0 +1,57 @@ +import { useParams } from 'react-router-dom'; + +import { useFilteredObjectMetadataItemsForWorkspaceFavorites } from '@/navigation/hooks/useObjectMetadataItemsInWorkspaceFavorites'; +import { NavigationDrawerSectionForObjectMetadataItems } from '@/object-metadata/components/NavigationDrawerSectionForObjectMetadataItems'; +import { NavigationDrawerSectionForObjectMetadataItemsSkeletonLoader } from '@/object-metadata/components/NavigationDrawerSectionForObjectMetadataItemsSkeletonLoader'; +import { useFilteredObjectMetadataItems } from '@/object-metadata/hooks/useFilteredObjectMetadataItems'; +import { useIsPrefetchLoading } from '@/prefetch/hooks/useIsPrefetchLoading'; +import { usePrefetchedData } from '@/prefetch/hooks/usePrefetchedData'; +import { PrefetchKey } from '@/prefetch/types/PrefetchKey'; +import { View } from '@/views/types/View'; + +export const NavigationDrawerOpenedSection = () => { + const { activeObjectMetadataItems } = useFilteredObjectMetadataItems(); + const filteredActiveObjectMetadataItems = activeObjectMetadataItems.filter( + (item) => !item.isRemote, + ); + + const { records: views } = usePrefetchedData(PrefetchKey.AllViews); + const loading = useIsPrefetchLoading(); + + const currentObjectNamePlural = useParams().objectNamePlural; + + const { activeObjectMetadataItems: workspaceFavoritesObjectMetadataItems } = + useFilteredObjectMetadataItemsForWorkspaceFavorites(); + + if (!currentObjectNamePlural) { + return; + } + + const objectMetadataItem = filteredActiveObjectMetadataItems.find( + (item) => item.namePlural === currentObjectNamePlural, + ); + + if (!objectMetadataItem) { + return; + } + + const shouldDisplayObjectInOpenedSection = + !workspaceFavoritesObjectMetadataItems + .map((item) => item.id) + .includes(objectMetadataItem.id); + + if (loading) { + return ; + } + + return ( + shouldDisplayObjectInOpenedSection && ( + + ) + ); +}; diff --git a/packages/twenty-front/src/modules/ui/layout/hooks/__tests__/useIsMenuNavbarDisplayed.test.tsx b/packages/twenty-front/src/modules/ui/layout/hooks/__tests__/useIsMenuNavbarDisplayed.test.tsx deleted file mode 100644 index 990ff743bbf6..000000000000 --- a/packages/twenty-front/src/modules/ui/layout/hooks/__tests__/useIsMenuNavbarDisplayed.test.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import * as reactRouterDom from 'react-router-dom'; - -import { useIsMenuNavbarDisplayed } from '../useIsMenuNavbarDisplayed'; - -jest.mock('react-router-dom', () => ({ - useLocation: jest.fn(), -})); - -const setupMockLocation = (pathname: string) => { - jest.spyOn(reactRouterDom, 'useLocation').mockReturnValueOnce({ - pathname, - state: undefined, - key: '', - search: '', - hash: '', - }); -}; - -describe('useIsMenuNavbarDisplayed', () => { - it('Should return true for paths starting with "/companies"', () => { - setupMockLocation('/companies'); - - const result = useIsMenuNavbarDisplayed(); - expect(result).toBeTruthy(); - }); - - it('Should return true for paths starting with "/companies/"', () => { - setupMockLocation('/companies/test-some-subpath'); - - const result = useIsMenuNavbarDisplayed(); - expect(result).toBeTruthy(); - }); - - it('Should return false for paths not starting with "/companies"', () => { - setupMockLocation('/test-path'); - - const result = useIsMenuNavbarDisplayed(); - expect(result).toBeFalsy(); - }); -}); diff --git a/packages/twenty-front/src/modules/ui/layout/hooks/useIsMenuNavbarDisplayed.ts b/packages/twenty-front/src/modules/ui/layout/hooks/useIsMenuNavbarDisplayed.ts deleted file mode 100644 index 08f6103f310d..000000000000 --- a/packages/twenty-front/src/modules/ui/layout/hooks/useIsMenuNavbarDisplayed.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { useLocation } from 'react-router-dom'; - -export const useIsMenuNavbarDisplayed = () => { - const currentPath = useLocation().pathname; - return currentPath.match(/^\/companies(\/.*)?$/) !== null; -}; diff --git a/packages/twenty-server/src/database/commands/data-seed-dev-workspace.command.ts b/packages/twenty-server/src/database/commands/data-seed-dev-workspace.command.ts index 50113a1c95b4..5f212a025a1d 100644 --- a/packages/twenty-server/src/database/commands/data-seed-dev-workspace.command.ts +++ b/packages/twenty-server/src/database/commands/data-seed-dev-workspace.command.ts @@ -40,6 +40,7 @@ import { DataSourceService } from 'src/engine/metadata-modules/data-source/data- import { FieldMetadataService } from 'src/engine/metadata-modules/field-metadata/field-metadata.service'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; import { ObjectMetadataService } from 'src/engine/metadata-modules/object-metadata/object-metadata.service'; +import { shouldSeedWorkspaceFavorite } from 'src/engine/utils/should-seed-workspace-favorite'; import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service'; import { viewPrefillData } from 'src/engine/workspace-manager/standard-objects-prefill-data/view'; import { STANDARD_OBJECT_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids'; @@ -219,7 +220,14 @@ export class DataSeedWorkspaceCommand extends CommandRunner { await seedWorkspaceFavorites( viewDefinitionsWithId - .filter((view) => view.key === 'INDEX') + .filter( + (view) => + view.key === 'INDEX' && + shouldSeedWorkspaceFavorite( + view.objectMetadataId, + objectMetadataMap, + ), + ) .map((view) => view.id), entityManager, dataSourceMetadata.schema, diff --git a/packages/twenty-server/src/engine/utils/should-seed-workspace-favorite.ts b/packages/twenty-server/src/engine/utils/should-seed-workspace-favorite.ts new file mode 100644 index 000000000000..ae7d9b6ff9f3 --- /dev/null +++ b/packages/twenty-server/src/engine/utils/should-seed-workspace-favorite.ts @@ -0,0 +1,9 @@ +import { STANDARD_OBJECT_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids'; + +export const shouldSeedWorkspaceFavorite = ( + objectMetadataId, + objectMetadataMap, +): boolean => + objectMetadataId !== + objectMetadataMap[STANDARD_OBJECT_IDS.workflowVersion].id && + objectMetadataId !== objectMetadataMap[STANDARD_OBJECT_IDS.workflowRun].id; diff --git a/packages/twenty-server/src/engine/workspace-manager/demo-objects-prefill-data/demo-objects-prefill-data.ts b/packages/twenty-server/src/engine/workspace-manager/demo-objects-prefill-data/demo-objects-prefill-data.ts index 226e5557c82b..73b36137db03 100644 --- a/packages/twenty-server/src/engine/workspace-manager/demo-objects-prefill-data/demo-objects-prefill-data.ts +++ b/packages/twenty-server/src/engine/workspace-manager/demo-objects-prefill-data/demo-objects-prefill-data.ts @@ -2,6 +2,7 @@ import { DataSource, EntityManager } from 'typeorm'; import { seedWorkspaceFavorites } from 'src/database/typeorm-seeds/workspace/favorites'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; +import { shouldSeedWorkspaceFavorite } from 'src/engine/utils/should-seed-workspace-favorite'; import { companyPrefillDemoData } from 'src/engine/workspace-manager/demo-objects-prefill-data/company'; import { opportunityPrefillDemoData } from 'src/engine/workspace-manager/demo-objects-prefill-data/opportunity'; import { personPrefillDemoData } from 'src/engine/workspace-manager/demo-objects-prefill-data/person'; @@ -42,7 +43,7 @@ export const demoObjectsPrefillData = async ( await seedWorkspaceFavorites( viewDefinitionsWithId - .filter((view) => view.key === 'INDEX') + .filter((view) => view.key === 'INDEX' && shouldSeedWorkspaceFavorite(view.objectMetadataId, objectMetadataMap)) .map((view) => view.id), entityManager, schemaName, diff --git a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/standard-objects-prefill-data.ts b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/standard-objects-prefill-data.ts index 7198fe4ef1e6..9584474f4377 100644 --- a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/standard-objects-prefill-data.ts +++ b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/standard-objects-prefill-data.ts @@ -2,6 +2,7 @@ import { DataSource, EntityManager } from 'typeorm'; import { seedWorkspaceFavorites } from 'src/database/typeorm-seeds/workspace/favorites'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; +import { shouldSeedWorkspaceFavorite } from 'src/engine/utils/should-seed-workspace-favorite'; import { companyPrefillData } from 'src/engine/workspace-manager/standard-objects-prefill-data/company'; import { personPrefillData } from 'src/engine/workspace-manager/standard-objects-prefill-data/person'; import { viewPrefillData } from 'src/engine/workspace-manager/standard-objects-prefill-data/view'; @@ -45,7 +46,14 @@ export const standardObjectsPrefillData = async ( await seedWorkspaceFavorites( viewDefinitionsWithId - .filter((view) => view.key === 'INDEX') + .filter( + (view) => + view.key === 'INDEX' && + shouldSeedWorkspaceFavorite( + view.objectMetadataId, + objectMetadataMap, + ), + ) .map((view) => view.id), entityManager, schemaName, diff --git a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/view.ts b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/view.ts index a4f230eaca32..3b7e47b80d90 100644 --- a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/view.ts +++ b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/view.ts @@ -9,6 +9,8 @@ import { opportunitiesByStageView } from 'src/engine/workspace-manager/standard- import { peopleAllView } from 'src/engine/workspace-manager/standard-objects-prefill-data/views/people-all.view'; import { tasksAllView } from 'src/engine/workspace-manager/standard-objects-prefill-data/views/tasks-all.view'; import { tasksByStatusView } from 'src/engine/workspace-manager/standard-objects-prefill-data/views/tasks-by-status.view'; +import { workflowRunsAllView } from 'src/engine/workspace-manager/standard-objects-prefill-data/views/workflow-runs-all.view'; +import { workflowVersionsAllView } from 'src/engine/workspace-manager/standard-objects-prefill-data/views/workflow-versions-all.view'; import { workflowsAllView } from 'src/engine/workspace-manager/standard-objects-prefill-data/views/workflows-all.view'; export const viewPrefillData = async ( @@ -18,14 +20,20 @@ export const viewPrefillData = async ( isWorkflowEnabled: boolean, ) => { const viewDefinitions = [ - await companiesAllView(objectMetadataMap), - await peopleAllView(objectMetadataMap), - await opportunitiesAllView(objectMetadataMap), - await opportunitiesByStageView(objectMetadataMap), - await notesAllView(objectMetadataMap), - await tasksAllView(objectMetadataMap), - await tasksByStatusView(objectMetadataMap), - ...(isWorkflowEnabled ? [await workflowsAllView(objectMetadataMap)] : []), + companiesAllView(objectMetadataMap), + peopleAllView(objectMetadataMap), + opportunitiesAllView(objectMetadataMap), + opportunitiesByStageView(objectMetadataMap), + notesAllView(objectMetadataMap), + tasksAllView(objectMetadataMap), + tasksByStatusView(objectMetadataMap), + ...(isWorkflowEnabled + ? [ + workflowsAllView(objectMetadataMap), + workflowVersionsAllView(objectMetadataMap), + workflowRunsAllView(objectMetadataMap), + ] + : []), ]; const viewDefinitionsWithId = viewDefinitions.map((viewDefinition) => ({ diff --git a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/companies-all.view.ts b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/companies-all.view.ts index ff26eab35631..73aad80dbba6 100644 --- a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/companies-all.view.ts +++ b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/companies-all.view.ts @@ -5,7 +5,7 @@ import { } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids'; import { STANDARD_OBJECT_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids'; -export const companiesAllView = async ( +export const companiesAllView = ( objectMetadataMap: Record, ) => { return { diff --git a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/notes-all.view.ts b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/notes-all.view.ts index 97354aa1f2ff..fec9f63b0ed0 100644 --- a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/notes-all.view.ts +++ b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/notes-all.view.ts @@ -5,7 +5,7 @@ import { } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids'; import { STANDARD_OBJECT_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids'; -export const notesAllView = async ( +export const notesAllView = ( objectMetadataMap: Record, ) => { return { diff --git a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/opportunities-all.view.ts b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/opportunities-all.view.ts index 4dfad89ad4a7..b3a57bf4de61 100644 --- a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/opportunities-all.view.ts +++ b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/opportunities-all.view.ts @@ -2,7 +2,7 @@ import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadat import { OPPORTUNITY_STANDARD_FIELD_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids'; import { STANDARD_OBJECT_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids'; -export const opportunitiesAllView = async ( +export const opportunitiesAllView = ( objectMetadataMap: Record, ) => { return { diff --git a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/opportunity-by-stage.view.ts b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/opportunity-by-stage.view.ts index c67a5945b814..82d3b479122c 100644 --- a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/opportunity-by-stage.view.ts +++ b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/opportunity-by-stage.view.ts @@ -2,7 +2,7 @@ import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadat import { OPPORTUNITY_STANDARD_FIELD_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids'; import { STANDARD_OBJECT_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids'; -export const opportunitiesByStageView = async ( +export const opportunitiesByStageView = ( objectMetadataMap: Record, ) => { return { diff --git a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/people-all.view.ts b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/people-all.view.ts index 9fbddef9109b..53492e7b9dda 100644 --- a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/people-all.view.ts +++ b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/people-all.view.ts @@ -5,7 +5,7 @@ import { } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids'; import { STANDARD_OBJECT_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids'; -export const peopleAllView = async ( +export const peopleAllView = ( objectMetadataMap: Record, ) => { return { diff --git a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/tasks-all.view.ts b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/tasks-all.view.ts index 3d9a0ffadf71..29ed1ce476f8 100644 --- a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/tasks-all.view.ts +++ b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/tasks-all.view.ts @@ -5,7 +5,7 @@ import { } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids'; import { STANDARD_OBJECT_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids'; -export const tasksAllView = async ( +export const tasksAllView = ( objectMetadataMap: Record, ) => { return { diff --git a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/tasks-by-status.view.ts b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/tasks-by-status.view.ts index fe392c181305..304b3ed0112e 100644 --- a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/tasks-by-status.view.ts +++ b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/tasks-by-status.view.ts @@ -5,7 +5,7 @@ import { } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids'; import { STANDARD_OBJECT_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids'; -export const tasksByStatusView = async ( +export const tasksByStatusView = ( objectMetadataMap: Record, ) => { return { diff --git a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/workflow-runs-all.view.ts b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/workflow-runs-all.view.ts new file mode 100644 index 000000000000..d7bc3775d9c3 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/workflow-runs-all.view.ts @@ -0,0 +1,56 @@ +import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; +import { WORKFLOW_RUN_STANDARD_FIELD_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids'; +import { STANDARD_OBJECT_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids'; + +export const workflowRunsAllView = ( + objectMetadataMap: Record, +) => { + return { + name: 'All Workflow Runs', + objectMetadataId: objectMetadataMap[STANDARD_OBJECT_IDS.workflowRun].id, + type: 'table', + key: 'INDEX', + position: 0, + icon: 'IconHistory', + kanbanFieldMetadataId: '', + filters: [], + fields: [ + { + fieldMetadataId: + objectMetadataMap[STANDARD_OBJECT_IDS.workflowRun].fields[ + WORKFLOW_RUN_STANDARD_FIELD_IDS.name + ], + position: 0, + isVisible: true, + size: 210, + }, + { + fieldMetadataId: + objectMetadataMap[STANDARD_OBJECT_IDS.workflowRun].fields[ + WORKFLOW_RUN_STANDARD_FIELD_IDS.status + ], + position: 1, + isVisible: true, + size: 150, + }, + { + fieldMetadataId: + objectMetadataMap[STANDARD_OBJECT_IDS.workflowRun].fields[ + WORKFLOW_RUN_STANDARD_FIELD_IDS.startedAt + ], + position: 2, + isVisible: true, + size: 150, + }, + { + fieldMetadataId: + objectMetadataMap[STANDARD_OBJECT_IDS.workflowRun].fields[ + WORKFLOW_RUN_STANDARD_FIELD_IDS.endedAt + ], + position: 3, + isVisible: true, + size: 150, + }, + ], + }; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/workflow-versions-all.view.ts b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/workflow-versions-all.view.ts new file mode 100644 index 000000000000..fff64745d579 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/workflow-versions-all.view.ts @@ -0,0 +1,56 @@ +import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; +import { WORKFLOW_VERSION_STANDARD_FIELD_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids'; +import { STANDARD_OBJECT_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids'; + +export const workflowVersionsAllView = ( + objectMetadataMap: Record, +) => { + return { + name: 'All Workflow Versions', + objectMetadataId: objectMetadataMap[STANDARD_OBJECT_IDS.workflowVersion].id, + type: 'table', + key: 'INDEX', + position: 0, + icon: 'IconVersions', + kanbanFieldMetadataId: '', + filters: [], + fields: [ + { + fieldMetadataId: + objectMetadataMap[STANDARD_OBJECT_IDS.workflowVersion].fields[ + WORKFLOW_VERSION_STANDARD_FIELD_IDS.name + ], + position: 0, + isVisible: true, + size: 210, + }, + { + fieldMetadataId: + objectMetadataMap[STANDARD_OBJECT_IDS.workflowVersion].fields[ + WORKFLOW_VERSION_STANDARD_FIELD_IDS.status + ], + position: 1, + isVisible: true, + size: 150, + }, + { + fieldMetadataId: + objectMetadataMap[STANDARD_OBJECT_IDS.workflowVersion].fields[ + WORKFLOW_VERSION_STANDARD_FIELD_IDS.trigger + ], + position: 2, + isVisible: true, + size: 150, + }, + { + fieldMetadataId: + objectMetadataMap[STANDARD_OBJECT_IDS.workflowVersion].fields[ + WORKFLOW_VERSION_STANDARD_FIELD_IDS.steps + ], + position: 3, + isVisible: true, + size: 150, + }, + ], + }; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/workflows-all.view.ts b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/workflows-all.view.ts index 8eba4bdc4442..330d68523529 100644 --- a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/workflows-all.view.ts +++ b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/workflows-all.view.ts @@ -2,7 +2,7 @@ import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadat import { WORKFLOW_STANDARD_FIELD_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids'; import { STANDARD_OBJECT_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids'; -export const workflowsAllView = async ( +export const workflowsAllView = ( objectMetadataMap: Record, ) => { return { diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids.ts index d9359e6eb595..6243016b8f73 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids.ts @@ -412,11 +412,13 @@ export const WORKFLOW_STANDARD_FIELD_IDS = { }; export const WORKFLOW_RUN_STANDARD_FIELD_IDS = { + name: '20202020-b840-4253-aef9-4e5013694587', workflowVersion: '20202020-2f52-4ba8-8dc4-d0d6adb9578d', workflow: '20202020-8c57-4e7f-84f5-f373f68e1b82', startedAt: '20202020-a234-4e2d-bd15-85bcea6bb183', endedAt: '20202020-e1c1-4b6b-bbbd-b2beaf2e159e', status: '20202020-6b3e-4f9c-8c2b-2e5b8e6d6f3b', + position: '20202020-7802-4c40-ae89-1f506fe3365c', createdBy: '20202020-6007-401a-8aa5-e6f38581a6f3', output: '20202020-7be4-4db2-8ac6-3ff0d740843d', }; @@ -426,6 +428,7 @@ export const WORKFLOW_VERSION_STANDARD_FIELD_IDS = { workflow: '20202020-afa3-46c3-91b0-0631ca6aa1c8', trigger: '20202020-4eae-43e7-86e0-212b41a30b48', status: '20202020-5a34-440e-8a25-39d8c3d1d4cf', + position: '20202020-791d-4950-ab28-0e704767ae1c', runs: '20202020-1d08-46df-901a-85045f18099a', steps: '20202020-5988-4a64-b94a-1f9b7b989039', }; diff --git a/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts b/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts index 388d5f1293c9..347536f57a82 100644 --- a/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts +++ b/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts @@ -41,15 +41,25 @@ export type WorkflowRunOutput = { @WorkspaceEntity({ standardId: STANDARD_OBJECT_IDS.workflowRun, namePlural: 'workflowRuns', - labelSingular: 'workflowRun', - labelPlural: 'WorkflowRuns', + labelSingular: 'Workflow Run', + labelPlural: 'Workflow Runs', description: 'A workflow run', + labelIdentifierStandardId: WORKFLOW_RUN_STANDARD_FIELD_IDS.name, + icon: 'IconHistory', }) @WorkspaceGate({ featureFlag: FeatureFlagKey.IsWorkflowEnabled, }) -@WorkspaceIsSystem() export class WorkflowRunWorkspaceEntity extends BaseWorkspaceEntity { + @WorkspaceField({ + standardId: WORKFLOW_RUN_STANDARD_FIELD_IDS.name, + type: FieldMetadataType.TEXT, + label: 'Name', + description: 'Name of the workflow run', + icon: 'IconText', + }) + name: string; + @WorkspaceField({ standardId: WORKFLOW_RUN_STANDARD_FIELD_IDS.startedAt, type: FieldMetadataType.DATE_TIME, @@ -75,7 +85,7 @@ export class WorkflowRunWorkspaceEntity extends BaseWorkspaceEntity { type: FieldMetadataType.SELECT, label: 'Workflow run status', description: 'Workflow run status', - icon: 'IconHistory', + icon: 'IconStatusChange', options: [ { value: WorkflowRunStatus.NOT_STARTED, @@ -128,6 +138,17 @@ export class WorkflowRunWorkspaceEntity extends BaseWorkspaceEntity { @WorkspaceIsNullable() output: WorkflowRunOutput | null; + @WorkspaceField({ + standardId: WORKFLOW_RUN_STANDARD_FIELD_IDS.position, + type: FieldMetadataType.POSITION, + label: 'Position', + description: 'Workflow run position', + icon: 'IconHierarchy2', + }) + @WorkspaceIsSystem() + @WorkspaceIsNullable() + position: number | null; + // Relations @WorkspaceRelation({ standardId: WORKFLOW_RUN_STANDARD_FIELD_IDS.workflowVersion, diff --git a/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow-version.workspace-entity.ts b/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow-version.workspace-entity.ts index 80545fe7897d..5ec2b4ade7da 100644 --- a/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow-version.workspace-entity.ts +++ b/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow-version.workspace-entity.ts @@ -61,8 +61,8 @@ const WorkflowVersionStatusOptions = [ @WorkspaceEntity({ standardId: STANDARD_OBJECT_IDS.workflowVersion, namePlural: 'workflowVersions', - labelSingular: 'WorkflowVersion', - labelPlural: 'WorkflowVersions', + labelSingular: 'Workflow Version', + labelPlural: 'Workflow Versions', description: 'A workflow version', icon: 'IconVersions', labelIdentifierStandardId: WORKFLOW_VERSION_STANDARD_FIELD_IDS.name, @@ -70,7 +70,6 @@ const WorkflowVersionStatusOptions = [ @WorkspaceGate({ featureFlag: FeatureFlagKey.IsWorkflowEnabled, }) -@WorkspaceIsSystem() export class WorkflowVersionWorkspaceEntity extends BaseWorkspaceEntity { @WorkspaceField({ standardId: WORKFLOW_VERSION_STANDARD_FIELD_IDS.name, @@ -86,6 +85,7 @@ export class WorkflowVersionWorkspaceEntity extends BaseWorkspaceEntity { type: FieldMetadataType.RAW_JSON, label: 'Version trigger', description: 'Json object to provide trigger', + icon: 'IconSettingsAutomation', }) @WorkspaceIsNullable() trigger: WorkflowTrigger | null; @@ -95,6 +95,7 @@ export class WorkflowVersionWorkspaceEntity extends BaseWorkspaceEntity { type: FieldMetadataType.RAW_JSON, label: 'Version steps', description: 'Json object to provide steps', + icon: 'IconSettingsAutomation', }) @WorkspaceIsNullable() steps: WorkflowStep[] | null; @@ -104,11 +105,23 @@ export class WorkflowVersionWorkspaceEntity extends BaseWorkspaceEntity { type: FieldMetadataType.SELECT, label: 'Version status', description: 'The workflow version status', + icon: 'IconStatusChange', options: WorkflowVersionStatusOptions, defaultValue: "'DRAFT'", }) status: WorkflowVersionStatus; + @WorkspaceField({ + standardId: WORKFLOW_VERSION_STANDARD_FIELD_IDS.position, + type: FieldMetadataType.POSITION, + label: 'Position', + description: 'Workflow version position', + icon: 'IconHierarchy2', + }) + @WorkspaceIsSystem() + @WorkspaceIsNullable() + position: number | null; + // Relations @WorkspaceRelation({ standardId: WORKFLOW_VERSION_STANDARD_FIELD_IDS.workflow, diff --git a/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow.workspace-entity.ts b/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow.workspace-entity.ts index 98dd40417e35..167f449740ff 100644 --- a/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow.workspace-entity.ts +++ b/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow.workspace-entity.ts @@ -84,6 +84,7 @@ export class WorkflowWorkspaceEntity extends BaseWorkspaceEntity { type: FieldMetadataType.MULTI_SELECT, label: 'Statuses', description: 'The current statuses of the workflow versions', + icon: 'IconStatusChange', options: WorkflowStatusOptions, }) @WorkspaceIsNullable() From b5d14868304416e0469fddca240de48bf822c569 Mon Sep 17 00:00:00 2001 From: Thomas Trompette Date: Mon, 7 Oct 2024 15:00:47 +0200 Subject: [PATCH 19/30] Fix currency input (#7469) Fix https://github.com/twentyhq/twenty/issues/7458 --- .../ui/field/display/components/CurrencyDisplay.tsx | 8 ++++---- .../modules/ui/field/input/components/CurrencyInput.tsx | 1 + .../src/engine/utils/should-seed-workspace-favorite.ts | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/twenty-front/src/modules/ui/field/display/components/CurrencyDisplay.tsx b/packages/twenty-front/src/modules/ui/field/display/components/CurrencyDisplay.tsx index 3fbb5960f2de..f2af5ae75803 100644 --- a/packages/twenty-front/src/modules/ui/field/display/components/CurrencyDisplay.tsx +++ b/packages/twenty-front/src/modules/ui/field/display/components/CurrencyDisplay.tsx @@ -5,6 +5,7 @@ import { FieldCurrencyValue } from '@/object-record/record-field/types/FieldMeta import { SETTINGS_FIELD_CURRENCY_CODES } from '@/settings/data-model/constants/SettingsFieldCurrencyCodes'; import { formatAmount } from '~/utils/format/formatAmount'; import { isDefined } from '~/utils/isDefined'; +import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; type CurrencyDisplayProps = { currencyValue: FieldCurrencyValue | null | undefined; @@ -29,10 +30,9 @@ export const CurrencyDisplay = ({ currencyValue }: CurrencyDisplayProps) => { ? SETTINGS_FIELD_CURRENCY_CODES[currencyValue?.currencyCode]?.Icon : null; - const amountToDisplay = - currencyValue?.amountMicros != null - ? currencyValue?.amountMicros / 1000000 - : null; + const amountToDisplay = isUndefinedOrNull(currencyValue?.amountMicros) + ? null + : currencyValue?.amountMicros / 1000000; if (!shouldDisplayCurrency) { return {0}; diff --git a/packages/twenty-front/src/modules/ui/field/input/components/CurrencyInput.tsx b/packages/twenty-front/src/modules/ui/field/input/components/CurrencyInput.tsx index a25fe10cacc6..052f47954202 100644 --- a/packages/twenty-front/src/modules/ui/field/input/components/CurrencyInput.tsx +++ b/packages/twenty-front/src/modules/ui/field/input/components/CurrencyInput.tsx @@ -144,6 +144,7 @@ export const CurrencyInput = ({ placeholder={placeholder} autoFocus={autoFocus} value={value} + unmask /> ); diff --git a/packages/twenty-server/src/engine/utils/should-seed-workspace-favorite.ts b/packages/twenty-server/src/engine/utils/should-seed-workspace-favorite.ts index ae7d9b6ff9f3..9668a7a4eda4 100644 --- a/packages/twenty-server/src/engine/utils/should-seed-workspace-favorite.ts +++ b/packages/twenty-server/src/engine/utils/should-seed-workspace-favorite.ts @@ -5,5 +5,5 @@ export const shouldSeedWorkspaceFavorite = ( objectMetadataMap, ): boolean => objectMetadataId !== - objectMetadataMap[STANDARD_OBJECT_IDS.workflowVersion].id && - objectMetadataId !== objectMetadataMap[STANDARD_OBJECT_IDS.workflowRun].id; + objectMetadataMap[STANDARD_OBJECT_IDS.workflowVersion]?.id && + objectMetadataId !== objectMetadataMap[STANDARD_OBJECT_IDS.workflowRun]?.id; From 7bdbbcf72e7d54dce711dc664fec5dcfd0b66670 Mon Sep 17 00:00:00 2001 From: Weiko Date: Mon, 7 Oct 2024 15:20:45 +0200 Subject: [PATCH 20/30] Add delete name column from standard object tables (#7470) Following this https://github.com/twentyhq/twenty/pull/7428 we now need to fix existing workspaces thanks to this migration command. This command will fetch all standard objects and their fields then filter out tables that don't have that column OR objects that have an existing fieldMetadata "name" of type TEXT and delete the rest. --- ...e-column-standard-object-tables.command.ts | 121 ++++++++++++++++++ .../0-31/0-31-upgrade-version.command.ts | 7 + .../0-31/0-31-upgrade-version.module.ts | 2 + 3 files changed, 130 insertions(+) create mode 100644 packages/twenty-server/src/database/commands/upgrade-version/0-31/0-31-delete-name-column-standard-object-tables.command.ts diff --git a/packages/twenty-server/src/database/commands/upgrade-version/0-31/0-31-delete-name-column-standard-object-tables.command.ts b/packages/twenty-server/src/database/commands/upgrade-version/0-31/0-31-delete-name-column-standard-object-tables.command.ts new file mode 100644 index 000000000000..91576604e642 --- /dev/null +++ b/packages/twenty-server/src/database/commands/upgrade-version/0-31/0-31-delete-name-column-standard-object-tables.command.ts @@ -0,0 +1,121 @@ +import { InjectRepository } from '@nestjs/typeorm'; + +import chalk from 'chalk'; +import { Command } from 'nest-commander'; +import { Repository } from 'typeorm'; + +import { + ActiveWorkspacesCommandOptions, + ActiveWorkspacesCommandRunner, +} from 'src/database/commands/active-workspaces.command'; +import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; +import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; +import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; +import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager'; + +@Command({ + name: 'upgrade-0.31:delete-name-column-standard-object-tables', + description: 'Delete name column from standard object tables', +}) +export class DeleteNameColumnStandardObjectTablesCommand extends ActiveWorkspacesCommandRunner { + constructor( + @InjectRepository(Workspace, 'core') + protected readonly workspaceRepository: Repository, + @InjectRepository(ObjectMetadataEntity, 'metadata') + private readonly objectMetadataRepository: Repository, + private readonly twentyORMGlobalManager: TwentyORMGlobalManager, + ) { + super(workspaceRepository); + } + + async executeActiveWorkspacesCommand( + _passedParam: string[], + options: ActiveWorkspacesCommandOptions, + workspaceIds: string[], + ): Promise { + this.logger.log('Running command to fix migration'); + + for (const workspaceId of workspaceIds) { + this.logger.log(`Running command for workspace ${workspaceId}`); + + try { + this.logger.log( + chalk.green(`Deleting name columns from workspace ${workspaceId}.`), + ); + + const standardObjects = await this.objectMetadataRepository.find({ + where: { + isCustom: false, + workspaceId, + }, + relations: ['fields'], + }); + + const dataSource = + await this.twentyORMGlobalManager.getDataSourceForWorkspace( + workspaceId, + ); + + dataSource.transaction(async (entityManager) => { + const queryRunner = entityManager.queryRunner; + + for (const standardObject of standardObjects) { + if (options.dryRun) { + this.logger.log( + chalk.yellow( + `Dry run mode enabled. Skipping deletion of name column for workspace ${workspaceId} and table ${standardObject.nameSingular}.`, + ), + ); + continue; + } + + const nameColumnExists = await queryRunner?.hasColumn( + standardObject.nameSingular, + 'name', + ); + + const nameFieldMetadataExists = standardObject.fields.some( + (field) => + field.name === 'name' && field.type === FieldMetadataType.TEXT, + ); + + if (nameFieldMetadataExists) { + this.logger.log( + chalk.yellow( + `Name field exists for workspace ${workspaceId} and table ${standardObject.nameSingular}. Skipping deletion.`, + ), + ); + continue; + } + + if (!nameColumnExists) { + this.logger.log( + chalk.yellow( + `Name column does not exist for workspace ${workspaceId} and table ${standardObject.nameSingular}. Skipping deletion.`, + ), + ); + continue; + } + + await queryRunner?.dropColumn(standardObject.nameSingular, 'name'); + } + }); + } catch (error) { + this.logger.log( + chalk.red( + `Running command on workspace ${workspaceId} failed with error: ${error}`, + ), + ); + continue; + } finally { + this.logger.log( + chalk.green(`Finished running command for workspace ${workspaceId}.`), + ); + + await this.twentyORMGlobalManager.destroyDataSourceForWorkspace( + workspaceId, + ); + } + } + } +} diff --git a/packages/twenty-server/src/database/commands/upgrade-version/0-31/0-31-upgrade-version.command.ts b/packages/twenty-server/src/database/commands/upgrade-version/0-31/0-31-upgrade-version.command.ts index 1ab48a059db3..247e8cd4d20d 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version/0-31/0-31-upgrade-version.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version/0-31/0-31-upgrade-version.command.ts @@ -7,6 +7,7 @@ import { ActiveWorkspacesCommandRunner } from 'src/database/commands/active-work import { AddIndexKeyToTasksAndNotesViewsCommand } from 'src/database/commands/upgrade-version/0-31/0-31-add-index-key-to-tasks-and-notes-views.command'; import { BackfillWorkspaceFavoritesCommand } from 'src/database/commands/upgrade-version/0-31/0-31-backfill-workspace-favorites.command'; import { CleanViewsAssociatedWithOutdatedObjectsCommand } from 'src/database/commands/upgrade-version/0-31/0-31-clean-views-associated-with-outdated-objects.command'; +import { DeleteNameColumnStandardObjectTablesCommand } from 'src/database/commands/upgrade-version/0-31/0-31-delete-name-column-standard-object-tables.command'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { SyncWorkspaceMetadataCommand } from 'src/engine/workspace-manager/workspace-sync-metadata/commands/sync-workspace-metadata.command'; @@ -26,6 +27,7 @@ export class UpgradeTo0_31Command extends ActiveWorkspacesCommandRunner { private readonly backfillWorkspaceFavoritesCommand: BackfillWorkspaceFavoritesCommand, private readonly cleanViewsAssociatedWithOutdatedObjectsCommand: CleanViewsAssociatedWithOutdatedObjectsCommand, private readonly addIndexKeyToTasksAndNotesViewsCommand: AddIndexKeyToTasksAndNotesViewsCommand, + private readonly deleteNameColumnStandardObjectTablesCommand: DeleteNameColumnStandardObjectTablesCommand, ) { super(workspaceRepository); } @@ -58,5 +60,10 @@ export class UpgradeTo0_31Command extends ActiveWorkspacesCommandRunner { options, workspaceIds, ); + await this.deleteNameColumnStandardObjectTablesCommand.executeActiveWorkspacesCommand( + passedParam, + options, + workspaceIds, + ); } } diff --git a/packages/twenty-server/src/database/commands/upgrade-version/0-31/0-31-upgrade-version.module.ts b/packages/twenty-server/src/database/commands/upgrade-version/0-31/0-31-upgrade-version.module.ts index d53dc237e96a..e1f731cb5ba4 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version/0-31/0-31-upgrade-version.module.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version/0-31/0-31-upgrade-version.module.ts @@ -4,6 +4,7 @@ import { TypeOrmModule } from '@nestjs/typeorm'; import { AddIndexKeyToTasksAndNotesViewsCommand } from 'src/database/commands/upgrade-version/0-31/0-31-add-index-key-to-tasks-and-notes-views.command'; import { BackfillWorkspaceFavoritesCommand } from 'src/database/commands/upgrade-version/0-31/0-31-backfill-workspace-favorites.command'; import { CleanViewsAssociatedWithOutdatedObjectsCommand } from 'src/database/commands/upgrade-version/0-31/0-31-clean-views-associated-with-outdated-objects.command'; +import { DeleteNameColumnStandardObjectTablesCommand } from 'src/database/commands/upgrade-version/0-31/0-31-delete-name-column-standard-object-tables.command'; import { UpgradeTo0_31Command } from 'src/database/commands/upgrade-version/0-31/0-31-upgrade-version.command'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; @@ -20,6 +21,7 @@ import { WorkspaceSyncMetadataCommandsModule } from 'src/engine/workspace-manage BackfillWorkspaceFavoritesCommand, CleanViewsAssociatedWithOutdatedObjectsCommand, AddIndexKeyToTasksAndNotesViewsCommand, + DeleteNameColumnStandardObjectTablesCommand, ], }) export class UpgradeTo0_31CommandModule {} From 94031605ac37dc1b7396ef7ff3584bc374baac78 Mon Sep 17 00:00:00 2001 From: Marie <51697796+ijreilly@users.noreply.github.com> Date: Mon, 7 Oct 2024 15:29:33 +0200 Subject: [PATCH 21/30] Prepare workspace for search features at creation (#7467) Enabling feature flags IsSearchEnabled and IsWorkspaceMigratedForSearch at workspace creation to ensure workspaces have the searchVector fields and indexes created. For the feature to be enabled in the front-end we will also need IsQueryRunnerTwentyORMEnabled to be enabled but that is an independent topic. --- .../feature-flag/services/feature-flag.service.ts | 13 +++++++++++++ .../workspace/services/workspace.service.spec.ts | 11 ++++++++--- .../workspace/services/workspace.service.ts | 10 +++++++++- .../core-modules/workspace/workspace.module.ts | 4 +++- .../constants/default-feature-flags.ts | 6 ++++++ .../workspace-sync-metadata.service.ts | 15 +++++++++++++-- 6 files changed, 52 insertions(+), 7 deletions(-) create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/constants/default-feature-flags.ts diff --git a/packages/twenty-server/src/engine/core-modules/feature-flag/services/feature-flag.service.ts b/packages/twenty-server/src/engine/core-modules/feature-flag/services/feature-flag.service.ts index fc9c5038a2bd..cd2e4ca4d255 100644 --- a/packages/twenty-server/src/engine/core-modules/feature-flag/services/feature-flag.service.ts +++ b/packages/twenty-server/src/engine/core-modules/feature-flag/services/feature-flag.service.ts @@ -46,4 +46,17 @@ export class FeatureFlagService { return workspaceFeatureFlagsMap; } + + public async enableFeatureFlags( + keys: FeatureFlagKey[], + workspaceId: string, + ): Promise { + await this.featureFlagRepository.upsert( + keys.map((key) => ({ workspaceId, key, value: true })), + { + conflictPaths: ['workspaceId', 'key'], + skipUpdateIfNoValuesChanged: true, + }, + ); + } } diff --git a/packages/twenty-server/src/engine/core-modules/workspace/services/workspace.service.spec.ts b/packages/twenty-server/src/engine/core-modules/workspace/services/workspace.service.spec.ts index 6a3d8b4400a6..8418fd8f295c 100644 --- a/packages/twenty-server/src/engine/core-modules/workspace/services/workspace.service.spec.ts +++ b/packages/twenty-server/src/engine/core-modules/workspace/services/workspace.service.spec.ts @@ -2,16 +2,17 @@ import { Test, TestingModule } from '@nestjs/testing'; import { getRepositoryToken } from '@nestjs/typeorm'; import { BillingSubscriptionService } from 'src/engine/core-modules/billing/services/billing-subscription.service'; +import { EmailService } from 'src/engine/core-modules/email/email.service'; +import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; +import { FeatureFlagEntity } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; import { OnboardingService } from 'src/engine/core-modules/onboarding/onboarding.service'; import { UserWorkspace } from 'src/engine/core-modules/user-workspace/user-workspace.entity'; import { UserWorkspaceService } from 'src/engine/core-modules/user-workspace/user-workspace.service'; import { UserService } from 'src/engine/core-modules/user/services/user.service'; import { User } from 'src/engine/core-modules/user/user.entity'; +import { WorkspaceInvitationService } from 'src/engine/core-modules/workspace-invitation/services/workspace-invitation.service'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; -import { EmailService } from 'src/engine/core-modules/email/email.service'; -import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { WorkspaceManagerService } from 'src/engine/workspace-manager/workspace-manager.service'; -import { WorkspaceInvitationService } from 'src/engine/core-modules/workspace-invitation/services/workspace-invitation.service'; import { WorkspaceService } from './workspace.service'; @@ -34,6 +35,10 @@ describe('WorkspaceService', () => { provide: getRepositoryToken(User, 'core'), useValue: {}, }, + { + provide: getRepositoryToken(FeatureFlagEntity, 'core'), + useValue: {}, + }, { provide: WorkspaceManagerService, useValue: {}, diff --git a/packages/twenty-server/src/engine/core-modules/workspace/services/workspace.service.ts b/packages/twenty-server/src/engine/core-modules/workspace/services/workspace.service.ts index 0be6fd02f97d..38befbf6e12d 100644 --- a/packages/twenty-server/src/engine/core-modules/workspace/services/workspace.service.ts +++ b/packages/twenty-server/src/engine/core-modules/workspace/services/workspace.service.ts @@ -1,6 +1,6 @@ import { BadRequestException } from '@nestjs/common'; -import { InjectRepository } from '@nestjs/typeorm'; import { ModuleRef } from '@nestjs/core'; +import { InjectRepository } from '@nestjs/typeorm'; import assert from 'assert'; @@ -8,6 +8,7 @@ import { TypeOrmQueryService } from '@ptc-org/nestjs-query-typeorm'; import { Repository } from 'typeorm'; import { BillingSubscriptionService } from 'src/engine/core-modules/billing/services/billing-subscription.service'; +import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service'; import { UserWorkspace } from 'src/engine/core-modules/user-workspace/user-workspace.entity'; import { UserWorkspaceService } from 'src/engine/core-modules/user-workspace/user-workspace.service'; import { User } from 'src/engine/core-modules/user/user.entity'; @@ -17,6 +18,7 @@ import { WorkspaceActivationStatus, } from 'src/engine/core-modules/workspace/workspace.entity'; import { WorkspaceManagerService } from 'src/engine/workspace-manager/workspace-manager.service'; +import { DEFAULT_FEATURE_FLAGS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/default-feature-flags'; // eslint-disable-next-line @nx/workspace-inject-workspace-repository export class WorkspaceService extends TypeOrmQueryService { @@ -29,6 +31,7 @@ export class WorkspaceService extends TypeOrmQueryService { @InjectRepository(UserWorkspace, 'core') private readonly userWorkspaceRepository: Repository, private readonly workspaceManagerService: WorkspaceManagerService, + private readonly featureFlagService: FeatureFlagService, private readonly billingSubscriptionService: BillingSubscriptionService, private moduleRef: ModuleRef, ) { @@ -69,6 +72,11 @@ export class WorkspaceService extends TypeOrmQueryService { activationStatus: WorkspaceActivationStatus.ONGOING_CREATION, }); + await this.featureFlagService.enableFeatureFlags( + DEFAULT_FEATURE_FLAGS, + user.defaultWorkspaceId, + ); + await this.workspaceManagerService.init(user.defaultWorkspaceId); await this.userWorkspaceService.createWorkspaceMember( user.defaultWorkspaceId, diff --git a/packages/twenty-server/src/engine/core-modules/workspace/workspace.module.ts b/packages/twenty-server/src/engine/core-modules/workspace/workspace.module.ts index 040b945329d4..07233050ab07 100644 --- a/packages/twenty-server/src/engine/core-modules/workspace/workspace.module.ts +++ b/packages/twenty-server/src/engine/core-modules/workspace/workspace.module.ts @@ -6,6 +6,7 @@ import { NestjsQueryTypeOrmModule } from '@ptc-org/nestjs-query-typeorm'; import { TypeORMModule } from 'src/database/typeorm/typeorm.module'; import { BillingModule } from 'src/engine/core-modules/billing/billing.module'; import { FeatureFlagEntity } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; +import { FeatureFlagModule } from 'src/engine/core-modules/feature-flag/feature-flag.module'; import { FileUploadModule } from 'src/engine/core-modules/file/file-upload/file-upload.module'; import { FileModule } from 'src/engine/core-modules/file/file.module'; import { OnboardingModule } from 'src/engine/core-modules/onboarding/onboarding.module'; @@ -13,12 +14,12 @@ import { UserWorkspace } from 'src/engine/core-modules/user-workspace/user-works import { UserWorkspaceModule } from 'src/engine/core-modules/user-workspace/user-workspace.module'; import { UserWorkspaceResolver } from 'src/engine/core-modules/user-workspace/user-workspace.resolver'; import { User } from 'src/engine/core-modules/user/user.entity'; +import { WorkspaceInvitationModule } from 'src/engine/core-modules/workspace-invitation/workspace-invitation.module'; import { WorkspaceWorkspaceMemberListener } from 'src/engine/core-modules/workspace/workspace-workspace-member.listener'; import { WorkspaceResolver } from 'src/engine/core-modules/workspace/workspace.resolver'; import { DataSourceModule } from 'src/engine/metadata-modules/data-source/data-source.module'; import { WorkspaceMetadataCacheModule } from 'src/engine/metadata-modules/workspace-metadata-cache/workspace-metadata-cache.module'; import { WorkspaceManagerModule } from 'src/engine/workspace-manager/workspace-manager.module'; -import { WorkspaceInvitationModule } from 'src/engine/core-modules/workspace-invitation/workspace-invitation.module'; import { workspaceAutoResolverOpts } from './workspace.auto-resolver-opts'; import { Workspace } from './workspace.entity'; @@ -40,6 +41,7 @@ import { WorkspaceService } from './services/workspace.service'; ), UserWorkspaceModule, WorkspaceManagerModule, + FeatureFlagModule, DataSourceModule, OnboardingModule, TypeORMModule, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/constants/default-feature-flags.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/constants/default-feature-flags.ts new file mode 100644 index 000000000000..88ec505dd432 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/constants/default-feature-flags.ts @@ -0,0 +1,6 @@ +import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; + +export const DEFAULT_FEATURE_FLAGS = [ + FeatureFlagKey.IsSearchEnabled, + FeatureFlagKey.IsWorkspaceMigratedForSearch, +]; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/workspace-sync-metadata.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/workspace-sync-metadata.service.ts index 6e035b99c07f..c090d413aa18 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/workspace-sync-metadata.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/workspace-sync-metadata.service.ts @@ -1,10 +1,12 @@ import { Injectable, Logger } from '@nestjs/common'; -import { InjectDataSource } from '@nestjs/typeorm'; +import { InjectDataSource, InjectRepository } from '@nestjs/typeorm'; -import { DataSource, QueryFailedError } from 'typeorm'; +import { DataSource, QueryFailedError, Repository } from 'typeorm'; import { WorkspaceSyncContext } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/workspace-sync-context.interface'; +import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; +import { FeatureFlagEntity } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service'; import { WorkspaceMetadataVersionService } from 'src/engine/metadata-modules/workspace-metadata-version/services/workspace-metadata-version.service'; import { WorkspaceMigrationEntity } from 'src/engine/metadata-modules/workspace-migration/workspace-migration.entity'; @@ -35,6 +37,8 @@ export class WorkspaceSyncMetadataService { private readonly workspaceSyncIndexMetadataService: WorkspaceSyncIndexMetadataService, private readonly workspaceSyncObjectMetadataIdentifiersService: WorkspaceSyncObjectMetadataIdentifiersService, private readonly workspaceMetadataVersionService: WorkspaceMetadataVersionService, + @InjectRepository(FeatureFlagEntity, 'core') + private readonly featureFlagRepository: Repository, ) {} /** @@ -149,6 +153,13 @@ export class WorkspaceSyncMetadataService { await this.workspaceMigrationRunnerService.executeMigrationFromPendingMigrations( context.workspaceId, ); + + if (workspaceFeatureFlagsMap.IS_SEARCH_ENABLED) { + await this.featureFlagService.enableFeatureFlags( + [FeatureFlagKey.IsWorkspaceMigratedForSearch], + context.workspaceId, + ); + } } catch (error) { this.logger.error('Sync of standard objects failed with:', error); From 8b716f98f7008f20a61adcd660257d71a2380fdd Mon Sep 17 00:00:00 2001 From: Marie <51697796+ijreilly@users.noreply.github.com> Date: Mon, 7 Oct 2024 16:02:07 +0200 Subject: [PATCH 22/30] [Search] Fix tests (#7471) --- .../workspace/services/workspace.service.spec.ts | 10 +++++----- .../engine/core-modules/workspace/workspace.module.ts | 3 +-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/twenty-server/src/engine/core-modules/workspace/services/workspace.service.spec.ts b/packages/twenty-server/src/engine/core-modules/workspace/services/workspace.service.spec.ts index 8418fd8f295c..0c53265e6302 100644 --- a/packages/twenty-server/src/engine/core-modules/workspace/services/workspace.service.spec.ts +++ b/packages/twenty-server/src/engine/core-modules/workspace/services/workspace.service.spec.ts @@ -4,7 +4,7 @@ import { getRepositoryToken } from '@nestjs/typeorm'; import { BillingSubscriptionService } from 'src/engine/core-modules/billing/services/billing-subscription.service'; import { EmailService } from 'src/engine/core-modules/email/email.service'; import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; -import { FeatureFlagEntity } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; +import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service'; import { OnboardingService } from 'src/engine/core-modules/onboarding/onboarding.service'; import { UserWorkspace } from 'src/engine/core-modules/user-workspace/user-workspace.entity'; import { UserWorkspaceService } from 'src/engine/core-modules/user-workspace/user-workspace.service'; @@ -35,10 +35,6 @@ describe('WorkspaceService', () => { provide: getRepositoryToken(User, 'core'), useValue: {}, }, - { - provide: getRepositoryToken(FeatureFlagEntity, 'core'), - useValue: {}, - }, { provide: WorkspaceManagerService, useValue: {}, @@ -71,6 +67,10 @@ describe('WorkspaceService', () => { provide: WorkspaceInvitationService, useValue: {}, }, + { + provide: FeatureFlagService, + useValue: {}, + }, ], }).compile(); diff --git a/packages/twenty-server/src/engine/core-modules/workspace/workspace.module.ts b/packages/twenty-server/src/engine/core-modules/workspace/workspace.module.ts index 07233050ab07..bd03d0e12c88 100644 --- a/packages/twenty-server/src/engine/core-modules/workspace/workspace.module.ts +++ b/packages/twenty-server/src/engine/core-modules/workspace/workspace.module.ts @@ -5,7 +5,6 @@ import { NestjsQueryTypeOrmModule } from '@ptc-org/nestjs-query-typeorm'; import { TypeORMModule } from 'src/database/typeorm/typeorm.module'; import { BillingModule } from 'src/engine/core-modules/billing/billing.module'; -import { FeatureFlagEntity } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; import { FeatureFlagModule } from 'src/engine/core-modules/feature-flag/feature-flag.module'; import { FileUploadModule } from 'src/engine/core-modules/file/file-upload/file-upload.module'; import { FileModule } from 'src/engine/core-modules/file/file.module'; @@ -36,7 +35,7 @@ import { WorkspaceService } from './services/workspace.service'; FileUploadModule, WorkspaceMetadataCacheModule, NestjsQueryTypeOrmModule.forFeature( - [User, Workspace, UserWorkspace, FeatureFlagEntity], + [User, Workspace, UserWorkspace], 'core', ), UserWorkspaceModule, From fbb5b3dfd4d064ec89ab9a9807393a47611da13b Mon Sep 17 00:00:00 2001 From: Thomas Trompette Date: Mon, 7 Oct 2024 18:19:00 +0200 Subject: [PATCH 23/30] Fix settings navigation advanced design (#7472) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR moved the settings navigation to the left and bottom https://github.com/twentyhq/twenty/pull/7130 Updating the logic to: -remove logic that move the existing -add the setting icon to absolute Capture d’écran 2024-10-07 à 18 04 05 Capture d’écran 2024-10-07 à 18 04 11 --- .../SettingsNavigationDrawerItems.tsx | 44 +++++++++---------- .../modules/ui/layout/page/DefaultLayout.tsx | 2 +- .../components/AdvancedSettingsToggle.tsx | 6 ++- .../components/NavigationDrawer.tsx | 4 +- .../components/NavigationDrawerBackButton.tsx | 1 - .../components/NavigationDrawerSection.tsx | 1 - 6 files changed, 27 insertions(+), 31 deletions(-) diff --git a/packages/twenty-front/src/modules/settings/components/SettingsNavigationDrawerItems.tsx b/packages/twenty-front/src/modules/settings/components/SettingsNavigationDrawerItems.tsx index e721e8d8e60e..f2ea6c95ad18 100644 --- a/packages/twenty-front/src/modules/settings/components/SettingsNavigationDrawerItems.tsx +++ b/packages/twenty-front/src/modules/settings/components/SettingsNavigationDrawerItems.tsx @@ -39,39 +39,35 @@ import styled from '@emotion/styled'; import { AnimatePresence, motion } from 'framer-motion'; import { matchPath, resolvePath, useLocation } from 'react-router-dom'; -const StyledNavigationDrawerSection = styled(NavigationDrawerSection)<{ - withLeftMargin?: boolean; -}>` - margin-left: ${({ withLeftMargin, theme }) => - withLeftMargin && theme.spacing(5)}; - margin-top: ${({ theme }) => theme.spacing(3)}; -`; +type SettingsNavigationItem = { + label: string; + path: SettingsPath; + Icon: IconComponent; + matchSubPages?: boolean; + indentationLevel?: NavigationDrawerItemIndentationLevel; +}; const StyledIconContainer = styled.div` border-right: 1px solid ${MAIN_COLORS.yellow}; display: flex; - margin-top: ${({ theme }) => theme.spacing(5)}; width: 16px; + position: absolute; + left: ${({ theme }) => theme.spacing(-5)}; + margin-top: ${({ theme }) => theme.spacing(2)}; + height: 90%; `; const StyledDeveloperSection = styled.div` display: flex; width: 100%; gap: ${({ theme }) => theme.spacing(1)}; + position: relative; `; const StyledIconTool = styled(IconTool)` margin-right: ${({ theme }) => theme.spacing(0.5)}; `; -type SettingsNavigationItem = { - label: string; - path: SettingsPath; - Icon: IconComponent; - matchSubPages?: boolean; - indentationLevel?: NavigationDrawerItemIndentationLevel; -}; - export const SettingsNavigationDrawerItems = () => { const isAdvancedModeEnabled = useRecoilValue(isAdvancedModeEnabledState); const { contentRef, motionAnimationVariants } = useExpandedHeightAnimation( @@ -123,7 +119,7 @@ export const SettingsNavigationDrawerItems = () => { return ( <> - + { /> ))} - - + + { Icon={IconCode} /> )} - + {isAdvancedModeEnabled && ( { - + { Icon={IconFunction} /> )} - + )} - + { onClick={signOut} Icon={IconDoorEnter} /> - + ); }; diff --git a/packages/twenty-front/src/modules/ui/layout/page/DefaultLayout.tsx b/packages/twenty-front/src/modules/ui/layout/page/DefaultLayout.tsx index 555e068d6290..0a05da36515e 100644 --- a/packages/twenty-front/src/modules/ui/layout/page/DefaultLayout.tsx +++ b/packages/twenty-front/src/modules/ui/layout/page/DefaultLayout.tsx @@ -85,7 +85,7 @@ export const DefaultLayout = () => { ? (windowsWidth - (OBJECT_SETTINGS_WIDTH + DESKTOP_NAV_DRAWER_WIDTHS.menu + - 88)) / + 64)) / 2 : 0, }} diff --git a/packages/twenty-front/src/modules/ui/navigation/link/components/AdvancedSettingsToggle.tsx b/packages/twenty-front/src/modules/ui/navigation/link/components/AdvancedSettingsToggle.tsx index a4581469146e..e08f60031bf1 100644 --- a/packages/twenty-front/src/modules/ui/navigation/link/components/AdvancedSettingsToggle.tsx +++ b/packages/twenty-front/src/modules/ui/navigation/link/components/AdvancedSettingsToggle.tsx @@ -9,6 +9,7 @@ const StyledContainer = styled.div` display: flex; width: 100%; gap: ${({ theme }) => theme.spacing(2)}; + position: relative; `; const StyledText = styled.span` @@ -20,8 +21,9 @@ const StyledText = styled.span` const StyledIconContainer = styled.div` border-right: 1px solid ${MAIN_COLORS.yellow}; - display: flex; height: 16px; + position: absolute; + left: ${({ theme }) => theme.spacing(-5)}; `; const StyledToggleContainer = styled.div` @@ -50,7 +52,7 @@ export const AdvancedSettingsToggle = () => { - Advanced + Advanced: ` display: flex; flex-direction: column; margin-bottom: auto; - overflow-y: auto; - ${({ isSubMenu, theme }) => !isSubMenu && `gap: ${theme.spacing(3)}`} + gap: ${({ theme }) => theme.spacing(3)}; + ${({ isSubMenu }) => (!isSubMenu ? 'overflow-y: auto' : '')}; `; export const NavigationDrawer = ({ diff --git a/packages/twenty-front/src/modules/ui/navigation/navigation-drawer/components/NavigationDrawerBackButton.tsx b/packages/twenty-front/src/modules/ui/navigation/navigation-drawer/components/NavigationDrawerBackButton.tsx index d906f45aa881..96490d7f0a7e 100644 --- a/packages/twenty-front/src/modules/ui/navigation/navigation-drawer/components/NavigationDrawerBackButton.tsx +++ b/packages/twenty-front/src/modules/ui/navigation/navigation-drawer/components/NavigationDrawerBackButton.tsx @@ -35,7 +35,6 @@ const StyledContainer = styled.div` flex-direction: row; height: ${({ theme }) => theme.spacing(8)}; justify-content: space-between; - margin-left: ${({ theme }) => theme.spacing(5)}; `; export const NavigationDrawerBackButton = ({ diff --git a/packages/twenty-front/src/modules/ui/navigation/navigation-drawer/components/NavigationDrawerSection.tsx b/packages/twenty-front/src/modules/ui/navigation/navigation-drawer/components/NavigationDrawerSection.tsx index c1fd938476a8..bea1d0f8e46a 100644 --- a/packages/twenty-front/src/modules/ui/navigation/navigation-drawer/components/NavigationDrawerSection.tsx +++ b/packages/twenty-front/src/modules/ui/navigation/navigation-drawer/components/NavigationDrawerSection.tsx @@ -4,7 +4,6 @@ const StyledSection = styled.div` display: flex; flex-direction: column; gap: ${({ theme }) => theme.betweenSiblingsGap}; - width: 100%; `; export { StyledSection as NavigationDrawerSection }; From 491fe8013264870d6e237353d57b83ee56357d47 Mon Sep 17 00:00:00 2001 From: Marie <51697796+ijreilly@users.noreply.github.com> Date: Mon, 7 Oct 2024 18:25:38 +0200 Subject: [PATCH 24/30] Rename typeorm metadata table (#7473) Fixes #7453 --- .../database/typeorm/core/core.datasource.ts | 1 + .../1726848397026-addTypeOrmMetadata.ts | 22 ---------------- ...ormGeneratedColumnsAndMaterializedViews.ts | 26 +++++++++++++++++++ .../src/database/typeorm/typeorm.service.ts | 5 ++-- 4 files changed, 30 insertions(+), 24 deletions(-) delete mode 100644 packages/twenty-server/src/database/typeorm/core/migrations/1726848397026-addTypeOrmMetadata.ts create mode 100644 packages/twenty-server/src/database/typeorm/core/migrations/1728314605995-add_typeormGeneratedColumnsAndMaterializedViews.ts diff --git a/packages/twenty-server/src/database/typeorm/core/core.datasource.ts b/packages/twenty-server/src/database/typeorm/core/core.datasource.ts index 0395f8cf2ae1..1f12bb4cd12f 100644 --- a/packages/twenty-server/src/database/typeorm/core/core.datasource.ts +++ b/packages/twenty-server/src/database/typeorm/core/core.datasource.ts @@ -17,6 +17,7 @@ export const typeORMCoreModuleOptions: TypeOrmModuleOptions = { synchronize: false, migrationsRun: false, migrationsTableName: '_typeorm_migrations', + metadataTableName: '_typeorm_generated_columns_and_materialized_views', migrations: [ `${isJest ? '' : 'dist/'}src/database/typeorm/core/migrations/*{.ts,.js}`, ], diff --git a/packages/twenty-server/src/database/typeorm/core/migrations/1726848397026-addTypeOrmMetadata.ts b/packages/twenty-server/src/database/typeorm/core/migrations/1726848397026-addTypeOrmMetadata.ts deleted file mode 100644 index 3fc52fb67ebb..000000000000 --- a/packages/twenty-server/src/database/typeorm/core/migrations/1726848397026-addTypeOrmMetadata.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { MigrationInterface, QueryRunner } from 'typeorm'; - -export class AddTypeOrmMetadata1726848397026 implements MigrationInterface { - name = 'AddTypeOrmMetadata1726848397026'; - - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(` - CREATE TABLE "core"."typeorm_metadata" ( - "type" character varying NOT NULL, - "database" character varying, - "schema" character varying, - "table" character varying, - "name" character varying, - "value" text - ) - `); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.query(`DROP TABLE "core"."typeorm_metadata"`); - } -} diff --git a/packages/twenty-server/src/database/typeorm/core/migrations/1728314605995-add_typeormGeneratedColumnsAndMaterializedViews.ts b/packages/twenty-server/src/database/typeorm/core/migrations/1728314605995-add_typeormGeneratedColumnsAndMaterializedViews.ts new file mode 100644 index 000000000000..28c56236e658 --- /dev/null +++ b/packages/twenty-server/src/database/typeorm/core/migrations/1728314605995-add_typeormGeneratedColumnsAndMaterializedViews.ts @@ -0,0 +1,26 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class AddTypeormGeneratedColumns1728314605995 + implements MigrationInterface +{ + name = 'AddTypeormGeneratedColumnsAndMaterializedViews1728314605995'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(` + CREATE TABLE "core"."_typeorm_generated_columns_and_materialized_views" ( + "type" character varying NOT NULL, + "database" character varying, + "schema" character varying, + "table" character varying, + "name" character varying, + "value" text + ) + `); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `DROP TABLE "core"."_typeorm_generated_columns_and_materialized_views"`, + ); + } +} diff --git a/packages/twenty-server/src/database/typeorm/typeorm.service.ts b/packages/twenty-server/src/database/typeorm/typeorm.service.ts index 0e8b97094b58..46b546d65ee5 100644 --- a/packages/twenty-server/src/database/typeorm/typeorm.service.ts +++ b/packages/twenty-server/src/database/typeorm/typeorm.service.ts @@ -2,17 +2,17 @@ import { Injectable, OnModuleDestroy, OnModuleInit } from '@nestjs/common'; import { DataSource } from 'typeorm'; -import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; -import { DataSourceEntity } from 'src/engine/metadata-modules/data-source/data-source.entity'; import { AppToken } from 'src/engine/core-modules/app-token/app-token.entity'; import { BillingSubscriptionItem } from 'src/engine/core-modules/billing/entities/billing-subscription-item.entity'; import { BillingSubscription } from 'src/engine/core-modules/billing/entities/billing-subscription.entity'; +import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { FeatureFlagEntity } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; import { KeyValuePair } from 'src/engine/core-modules/key-value-pair/key-value-pair.entity'; import { PostgresCredentials } from 'src/engine/core-modules/postgres-credentials/postgres-credentials.entity'; import { UserWorkspace } from 'src/engine/core-modules/user-workspace/user-workspace.entity'; import { User } from 'src/engine/core-modules/user/user.entity'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; +import { DataSourceEntity } from 'src/engine/metadata-modules/data-source/data-source.entity'; @Injectable() export class TypeORMService implements OnModuleInit, OnModuleDestroy { @@ -37,6 +37,7 @@ export class TypeORMService implements OnModuleInit, OnModuleDestroy { BillingSubscriptionItem, PostgresCredentials, ], + metadataTableName: '_typeorm_generated_columns_and_materialized_views', ssl: environmentService.get('PG_SSL_ALLOW_SELF_SIGNED') ? { rejectUnauthorized: false, From 249dcbb2a6e690a249a6fa776583876ab2a78cda Mon Sep 17 00:00:00 2001 From: Thomas des Francs Date: Tue, 8 Oct 2024 08:50:18 +0200 Subject: [PATCH 25/30] 0.31 changelog (#7463) --- package.json | 2 +- .../releases/0.31/0.31-advanced-settings.png | Bin 0 -> 751015 bytes .../images/releases/0.31/0.31-search.png | Bin 0 -> 223356 bytes .../src/content/releases/0.31.0.mdx | 16 ++++++++++++++++ 4 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 packages/twenty-website/public/images/releases/0.31/0.31-advanced-settings.png create mode 100644 packages/twenty-website/public/images/releases/0.31/0.31-search.png create mode 100644 packages/twenty-website/src/content/releases/0.31.0.mdx diff --git a/package.json b/package.json index 8e62be709810..5503530175de 100644 --- a/package.json +++ b/package.json @@ -340,7 +340,7 @@ }, "license": "AGPL-3.0", "name": "twenty", - "packageManager": "yarn@4.3.1", + "packageManager": "yarn@4.4.0", "resolutions": { "graphql": "16.8.0", "type-fest": "4.10.1", diff --git a/packages/twenty-website/public/images/releases/0.31/0.31-advanced-settings.png b/packages/twenty-website/public/images/releases/0.31/0.31-advanced-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..d6f094b5b9cdaa73ecda447632f9479ba921346b GIT binary patch literal 751015 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

d}neenhK9^zsg>ZR>9yE{6A7 z=w(eGM4FR7817$er?DyxuQ?7jE&>2G|u^d zu!!kNAZFRlzS2&ekR#`%I}`G_8fFyb5`A+F^I7)f z*oFC>80Zr-NZw}gZB9(=Fl%b$8q6%#@Ix5yn2FFc1pwue-TnohbKcDD)Mj!1;j>bW&sm~X;Q0k{5R z2MjPT-?>1+iaa2DX98w{T_3WHTf+6p86X~#U-YYG=eC>YOrgrFTDv)tcnc@i#?ROF zhT4LvD`0=NUHxX}8QHbG3n{1je1HS=(So|0iFF>LKS*HU+~4Cw82wLv8sX2GGYq-M zB6cWD!%?5I8KQPup}x5O=x+2v@#2ag0+G_&_seefbXwMD{$sIZ14)YVr~u&^ifhdV zLJoe@TC`_W^BGMffz_IdmyP6aFi-ldyglJG+llQ*6>MU(19iW>P{)810}f^S!5C2h3wyw&{SV0=kC0~o$GGR%vUWH@rsjSO zPlcj%UHNN~%`>lDP7U{#&%RiA0ut&g*gPS7?9_SMFaauh3k-g`-{&R&txx$t!eOw8 z$Z?0WLOh+ZQhl@{*8X(wss<~@!tzNri#dgFhCJU)i%^$rjTSTPr^or`@qat1acVVt zvT+LP8i%YiOr$vk80Xr8fz*2+NM@46F)+!OVrsmd9P@d$O z-}Lf@prY_X)o~H!{fJWcdF3?DOrJ#@%CvkJUsdG1*{7aQBwQW^hnH1Z+^-x^uqxD( zVgCKml~)yx(RPMovmGzytRa949(6Cky`xo5U#k^08sMr^AX%s zrHVa#6HK-d?em1@d9{)Su2&sYka6x4aWq^+MA*YuSRJ_<%*>q_eXnUu?`Res2VC%z zLPwgA#(Y@${eP{|}!#VR&UmtS4iXA2<*NB3bw^RbqTd0)M zuG<^cg4a@U*b8W|=RfKI$f{Tuj&L`l5S0Q*fLNhV?J-POx=1L20?!L>I4SKfNfQeS zgvNNw`!BjCVH^kl(-TDwD5ryt8GRMO|Hst3$1}nA|Kp5R+Epn#$d^MU`KasT-N%ZWbA z7Tc(w)n#t<$TMTuyl8eOh7SCm`&!BOno2>CgeUM7VK`w1a4a5I=yl zRBIb}f(8xMO@rp7ejN)w{|K6vEioh?8!X|GV-&e|t>u0S9G|0bMpr5(=72spz~6#L z(lK+qoWPErw}OCb$8KitE?w=?nX9lD@LH;`!PF;5iVh6V(g zDeSJFpFzuPJk#B|CNn=y^yk!dy`a3TfB#h>W$yh<(k0>)e|q}6^w|okHn~2IQ(HAP^5%mv<7D^$g15d>GR21mTu+Fkiz=qdclI%uZoob zDW7gaN36kM=Xe=x@d@6bdt^RfXNpZds=?EJnS51bzN++_#F?Qsaw7DnP|2_X!3uus zK}1O_?L%;#5=Lmi`PbB)FTcuW#;KPMe=J}K|er4X(vMJmfD{gk5MUS3`M?rJk&S= z_%I+;N>A$Qx&t)lyk^^(^MjWRsjG^1Ye78LTn4yD$2F~AQNCec1PktcVGB?4`xE zLR_H0ACk{X{WztYa=m2%$Qx>@e^${J?3UHv%NO|%L+t`IZR9S#@Lwe!b|PJLJ%tQ? z_1EA>BLN^H{_5vw)Gd75u6Z-onhLU|6qSU!MKnlyJ;RTC&mBPNk@eLBCM) z7$mQcd{sECSw?kyY;p9E7arEV_t;LyOn3tu?<#X)E(p%O!RIcXTDXEL3AWrUnH-K9 zXv8p2mJGCDX zAEebNFIi_&g^EQDqCb|Kt$miU+K$@JEb#`&Gr)5Ic;vTkw7p`&$r9z~NL>Tt(eYS- z@qPy*$Odt?Ga>Hj4E@E@dUf=MOvvR^&(HP#+P$zYbGTPll7^5=x_WRVHBjaT%P2vq z`?gt`13gTlA=Ab)+Z6~m*t@HC^MHKZOaqhaE03esivImXUbFVi+C3s`Ym@2&AizP% z&t$n_*$d-5N(KkEBJ&-p0L0T0``~|-^-SBG*VK}#O8{|RFOG%Rc{)}a5o`QCD`DY7 zB)84un0(L;`#eO|BH{Nd1dcvptHxCm9tZ}Vs%-K1LR3|i@}SV9!7?g+uavtn?qh33 zrA{(5kE$ZWvWV2m_SE;28=UNk19kxel0w0NL`^Wn>Tr%cA zB$i)ijU#ouv*e2cf?dPAsN61jX3`TKW!KtcsNb^Pkj3m{7TfgUBSjf_96Y8O)lW+! zF1!lYebl=TK5Vt9O4V1K8}b_2_IO(!i9jYzV>4T$<*2k$^M65)^=LSMsg0gM#rFsm zW5VSF?eaanJ5>^DqYD|LBhaT9DCnI@B(5~*kn;Z_)SujTCqskZQlp|e%S0(a$E8UF ze122X@W1u@e?KSV%?iq1ZFN$qG1IUOhjFplH(#&(T(~Pe4XJs_eIw&7E?tGp554*k z5!}>91!(9<51u^wMoqU}F8!t9&X;={funn!kS#kQ%-DMUo@>&d4kc`9dLIhIi_rni zTe6Rj0DT+fuf?8lo%U+arr0r+y!HXYaOP0&l|Uze88)XEGG$iK8aZ|-y|M+S{J7hC zpQ8SW%O{_oXe%<1J+oiAZ+ze>2XsKQ% zl8_3MUIs$l2(R^g%Hl{jUGesb-o|O~l$Eo>?)dF87mZk~&6`x2#B{a(t2z%JjY(fV z^i^Yr51x_rJ;L;j%x~Z~W>YM->o)dK`2Z7<jJtQr+e$ev!I3!cvhE|B# zYzUlw6kIfun6*8=HMe~V7;(dP^|$UUb@JJo87#TQJdWje3zFk!mIs>RCK^0mtzgLw zJz5|UGV?^d#o)~AzwQ!gn_L$8Ea!caw->pDl`=r5y@?ofZBW5T(!IKD;CO0H65fEy zUl6=+C}LG{GzH@Gsrx2x4Zk?VO(D~P2e;rGt9;r$Ty4$Lr6#qrN}b_;cejbt{+k({ zaBNMXz+(F>c5yaW8C-=-^oc1qY%2TEJV@Obll+>@QsU?Q5c!SsvB|AM5n81hEc7q1 ziC^o30x&Y7+zhSe*MFv25gb)94xHZaICDLrPlvdiq+@hMWqpqpvX4}NsBhb_R+FGh zUJNKm8@BrLI_mL(vyQ$GjbpWKjS7}hW&VH*0XE>v5w8Mb2abymIZn5b zMsZf9yKq-V=LO(eNzQ;M5YRGQ>-Th8-m6(7r6Z|nSqfy50o8QdtcK>$V7MJ(9Ycr{Xy5FGy}<0EMt_o&0HSV zWw&JKXzxD^Ph`_5BkmguhKVs?NC0A$cK9KSB-F|D4dml$9(p!IYEfI?b<#ik!TT30 z>KyML2oeyWC&~~<=mXy=x1pDkP08<}FnbhrZ>r{D)G6_m1+fkDkf_O)ncx2y$+~9} zAirBPTP{y+mb3rw;V{WJZk(H| zd<#7x9%nU%986KpGh*#E0%|({bcyt%T9?X~kJ}#@M?72*TmYy|F}f-X{?!JpZDG~V z@_Sp3JZp!5AOss=bfZ;kniVTMLM$Ax}@ROYg&iabRYgP4| zQ4)!wzUa;fe=60#OXfRl(;nzKB2HDm%dspi!M+Ek=!n-LhEc?MQ)#F0DLTbEmyuRG=dcmDC9f)? zbK*MQQU+{t-c^k?Fg?mQA#sr<+6$O`79_z#PfgJiNh@C&k#km>Ys_AS*1p(h95q=y zah>YzHG3}-8hs8*H+WZ3v3(1@>!ymC`vO>gZgqjjZ7d3Du041PQd9N))@dJK3+hNR z=k)xajrFo)v$FjW9}olaIz1yJZey?TwDKsO9t2#5pYdK{fDI)SR{N$YM;8|70q=Yga3I#ZbZx25=q~Tu^m`a4aZNQw zB?JwuZ1mGQSKa@m*S+k`W6E5#*3^*~NvUCS4_j=_` z!OJ!b0=zEj4>>t=q}V=SJ4Vm0N~o+kPa=Mcr?^y)~v=YMhz7MOG~qod>VczXl67t5Ac9X1RZEY z6vs_it^tu9@dEENcE^NrpC$t%dS1)L&@!4K;Xv4Q_R2Qk@$*pgPS- zGCJlz^`m3{pEUn(vdcQq1>m7_Q$@V5GN}zO=3;!JJx9OH$!$H=?V*H?!=&PhcN+Z} zkuSLfwR30%9CC%F+C@`eomjlK)InID@X#wLsf{3;M{?M&u4l-nbUhG#00o#U`&RHl#J9$*kxUw7mpq)FAJGWWS4^KXi~F?q#t&7o^nXYbG}R(*+fVH#bVg6lVWkjM@2`vhwJ~= zA`hoeaYw%NhvK5e9bu3F!2OtU1bgpc@i{T1%ne4Ft0Xi_%?~v^btlR{(Rt#|Qix{@ zy#84J)&$@veR$WH#$`uO zaj4=+EjW0wqni}e>$^Twc0{uMf|ff9$;b5Z7i>n4vioL}3tLiN1nWsIGo#7PP=m2OEfJUXa+V2e47P#pZiC@9m1x0tHg&(F zQsLxIVW)68rsYSmY3IIVo5e`v|8W)~MaAP!g+=Uwz>vtP2t;{YhhggFAA`dNPN}=K znZq#Nn3DiWs}mK&{C!OrW23iHZkm}PT5Quxb9q2h)Q#xe5{+t~4Qmg0QK!-xRtuvE zyHTl_Ubliov*x&{Wo}ZZiDG!h7}qfiJO;YC>!PHuLkbUS#wm%XI8S&Rn;1ik6_!7ZO}g35 zbvm%mbX)Fb%%1bDag}LhFOyz^Ytvn>CJqGvX9s;kkN9n(;;h`8IOi}{=e*0nZGFYu znrKqnFTP1orPlCbRHcDP*x}@UOJdQ4XkuIe`P%%z_7Hg(S^p}-iNiaxUcn4V^AX$= zRMQ@5)qB*I(T9b|nszdg(%Ncr(n-O$@cIlnaPwBQ`uce%uc#k;>qFh&pz=BqsMQiF+@sV6P=Y;HYh|CRcy7-aYnVg1fdMUYN$C|4L8NElxJvP!UeaLsmub zBB%c!*m=`yrW0(K{9Q<^+M=aQ(*6rJP4f4m&W?-sJ)_ulT35y; zExA+A?vZNLKF_D3*>g>J93u}3+qJms{Qatx{(NW8sMRB$O|?W9nDjXVNa6a?^Ca_2 zam{lJcP9oQB7;o~Qr`|=_F7$4|0{N7ktjxK*xCKD68Hxa=hf21;~v?vBerml+WP7C zn|W3-D@h}j)8U-AB&kvm7c_T&hIkkiTI8Z8br?G!QXdRUoSD<_SmPe0LiLn6=hi)RB64#qa5y5w;5D7xSui)HJ^)#(j-Or`<)hcXn)0 z_AewMk*_qUl%ilNC2ZrikRQ(tVET-?C=3(RlvQ~PBO?#4bPWY1Fs&}%OG((rd1UDS zs|11l`egI*LzXxYpYufDWsnNyS&iJYLG_cX4dD2dAJnL!>k?!cxLNd?(kx_0wZSBh zR?jV~Vg7}UightO+H249mNFf~)U}y-qTAZy@c8ETc%8f1RkmQn zy((FlW6I>W|L-}_`{x|gn#bolN*%m3%MbvsAkx$>2bBz_>ezOAJd5oGJhTQNi?4Hb zwOt8ATpvff>z+j%U>C=}laduTP-#M+8a!k(1ixaPY_%h#s_R9Dpbs4tx911?gDMqx zB4uwzBp=z~dsX(Pbkqw`C5@fjAC>_9Qo-dwO2y$pSqa@z62C{j^ZJ6GvvBKHm#l9PJ311fD1Oz@~(M?y4A&3K;8tW=md~H zH~uhas(A%ct(Tbe=Fw8tEo--aixNsZV1&fX;WXBG!9dx@BfF2Q)b3&Qu z(#%8q_;naQ}3NQ19S^#%gY=MxZhuT}rvp z>c~c?P&_suN` z2&jsnfUPeKUu+cN^lbjgYJ-`2k&ZDFv$WEi@+U>O{(Z77`Fnn@lCJE3ET8{A7X3wd z4e^y+cGOG~JLWfaGg}Aj4DbXcYk2>7)|-Hvn5w*n+GFZ`{_|8fy46Yp7$n)CE`;1h z2E#wOZ5(twR5Esm7H5r?1&s{Zi{DUb2Pv!0RKiy}xx2sdT$UaR(Lz0h1qvgI#>Vqb()VJ=UzZw`_6Lis0=+If^ovN{pI45v zvAdq{WYb?S_rz|2!uZ9E(fq@jj6+S-CQRY>6L!K(QUjy^_N|P-M8XCpVm1Qxg59n) zbXY|+C;JSmb}B^p;VC~F3%FTS7vM>)9TTfw09%;V4&56ct>O2Mc*)IE1?4R5rjS+a+Q7)v zsnL3UfmwK#A;t#m-Qd-UB`BX^D1=|B)F*~jvPMctVY-vZS@YN^@!4ZfIT=;0QQ5O2 zA)N|0W*Q&5fBD~+!=RNT^7=_FqU-U@vF(_z3Gdq$(5_hTn(bjD?Tw(&LJqVF163gs z1j@Faaq8`gDvRhpie1uO?)9Cf>m*GH*DK7n*0A%(3-sg`?iUo>y<2J3Q{P9yad&-! z{>_9}iJ=S71!M!2=T)xuouC`9TOOb06*4wtZ0)Z3hW~KQD6EzJqSJ*b9~$q&P9*5< zHtkC3`kND1$v!uhw`$32ke89`GLCjVXj(OY4>NF>(+07y-1+keN@(zk>SLR|+iSmP zG8jBY!XsgzQ&&{yX?`!)f#x>M+nyf1E>#BI>evqNCUl*QwEcTKQ=yT5H=GsbHd(gZ zTKf_?7ZiFpJIX1B*l}IvGLEwe|Ah-qVsovwh@NK!bC;qcHnYv%%NpVghvO||XFEr; zhIO}lJnl_mcOKhD_f>6jvATxi!bwdOU@DR+7?)?J?9}m;{kRN}m{9ZiY3SkN0M(bR)cKX_*tZjtKON2owcqqSwp5}( z=|o44evBGBfR>N9ijczbU9i&Lj4uf-4rKHarRjAOD*Zx06^kNRY~q-aPs7~>t`5|| z>^^i8J5AXhOtF$e=P2J?O;=i-=JJ>zqk0jPPd&WaP=&msB;FDVdb zgKbG7tzDr1MB!AjeI~nZ5r+&HWZ+L(b9LJhD7Z{1zbTX@B0|I5Z}EE(=O+U@xcY<{s%0;_M%QmrONNZyLD*36mivoE#j5C{yui#b?^zCSiwXm z`YfKQH#FH>*&IFNeqe6}CA5#^Hnm4o0}ey)8f+>cQo-@3jiuXbTplcRGpFGjh+vWR zY4he@1C^16VCh&9U*N6T7_`llE1~rqFxRnN%5-x~bre&*vQf@=sLa?e#1CRK=XY2{-l6O?P?44~V}HAM#)?mOa-wzvuH#R{o{t6z^$Idj(S*jLSou^F^C zuA?~(R^WN{V6WDd166ptUbNG^ro48&I<;2w_WNV55^pdYdk$xKiGSj#PMWuPoFo@O z`z+}+uEt}Pf^ihq($UCPfs;dcKJeb{T^B(g#2m@o+Vy+)HC329nx8lp)JQtpNhyIz z42=Q_J^l7(H_i-EuvEuw##sc|gp3V+>554hcrgH{f>sQ;}u6JnEf{ z3>)il3#Ut@WG+zgB4d<1JN=1Pw|%01nfpAA@f_cAkem^6B6PEV1y0w=M)cp-x-;IP zGhJ(*$%=pBd3t3$eCGQ*2HBhLtyJ(A;#mJD@r_>1`XsD@5+B{0zh0puviMHyi>_Cl zvbe>z0c`Y&c*_5yp!n0hDnyAd33sMUAFHh8Uu5mBVG3HAkrL_t2WGQZ0U6e(TpomB zJv6I-c?77m{Qy(~WCYtuCKZ42@VVcH|2DDGlDGy0%RW0FG!Ytp-`3jJq`+u&_cx@= z(rA&Z8a+5COw-nnfVlKAb~3X@3?cS+L2<$G(D9pZH3B*J^UdR}j7EL~t<$J`{O_MP zYl7mU#>8GhPxM}u9T*&MiHYlK^Qh{c?2J?Gx;ZY|GCaBX_~s48(d8bXsdMU0!Mqd8 z#x_#Cgy!U=1LceY%}_HIT@om}wo!h?aO02U^o7uHsM}p>?xupWmR9xyy5;Xfn0gU4 zSTIQ|iGgx6@miJ+bBx2ms%D0loS*_!dmy6zLSP)LVV>rr1}U6-LTgZ-;}>xs9q^wn zEgv@HC{2gX=SSU;*KRLV^k?ddRe{c_KsmmK(n3xb`6h?-ayMigj{e}cc;|LLdBrDO- z-c@uVyfh+bn9O7UD_!hEAw)F@Mh1;976o+FzuLo+}<$g?%9Y&!Ed4*e#47RJb_P1%URIC>=#Tx_|1z@`B?LN=s z9XJc}-|ee8aVBNC$YoBj;sG!xI2yX3cHi``9l3n=j91@Km*I;L)_O=ItpB)V z#`dh7ekTer|EEkxbT&2$ZCJa?VX~+hU1s>C;0j>A*V+iUx>t&LbyQX@=#&2y^x^UT zch+rGDg5-pyOD%P^)e&Cww&~4>;v%vm$P9K$~g;I)B9H{7yoH9eaey@a89+!U0|b+ z%-s$@qb+`_N@_us5b~h4J6~)f6R-Tq#y16$ss6EuP8onURpnmUKDrO|=}af~o0^T{ zxw=E&mkCnOp=j?o^%z(y9~&_r*%@{ZXY_+#r59G!d6E$ly$vWw?M#SuhMz6;+8lYZ ztx7F&lQp`pn`Fk+O%3ofVFKqI_EIYCn)Qpfus1)dP0PX2?E(NX&3toL)b*;0Z?c!G z#ui0mm+YT@m;`A!Q^$T@hw$=&0OJ9_c3W_ud<;U*+z#+sRf%EsN#=1+#Fp>n%pdp- zwu~5>p~6}Sk)OldoG;31rdI5O13ri>8X3r82J7w#%HhL-WYGpWSEc6D?e;p$sQG=9 zyiC*kF376RVHO+wm%2OVcJf)@nM?xY;WwA94g$YAS5gecBB;Fy4Rpf%dm1xJG@!^1E|#gZ<%P7$MLe&GWWvvyq3NwohUt3mze9#Opce9 zJoMW4+F7xZa><>lPc|GM!)3(uixbt#gg_Z!YCuFEWFP^v4W|OG0HUn_ILx3!X3eFG zYk3>f90V23>5iXRM;}K2OQ+gI-gUGz9%X<2{*rB5I}-A>Din0<9zr?ws$BUGvnYGP zeX;o=>-jt5ps|2!r3k_aqA09B)I@kJI})5_N^QFD(96s{#1G(|OYw-XK$wD+CBN5K zgcQ00vh^ass2nd~`y`$(S=eCXsko$8(9rdQr`ctbVt+>nY8KTmU74QJuRNDI+~D92 zr;a5j?+>xtS!@XlI7gb(lD^~G%%tW|DS>gk>_0n(9t8?c_@p@B(Hy;FRw!kQ>u(Q! zsSPMvUg-hG4w2U6P$mR}VN2rcf`e|P<#*qAd{P-s&Z=)&CwBab);4!K@dO3KI$~@0 z(ZX_~WG~wg6;&If=9pC-%p@NJQUXG-$VzE3qtl4rXSOO30m7zW9CaXIJREqQ%{!2Z z7Sb9GTDR74$F&Mu-AzL4CR;gYWANV%PTDAWDXC6=m3*N!FEn5z)Ufcm9fNtdcM4Yc zNq#sxW+W?Dx$h${@#p)0Fv1f{*ai*Dj9Ho%QH%ye$o7A4gI+JQ{6G60^G~aP?d73% ze$C&|j`@8O>3_lUgaS2};519@1te&=a?b;P1_q?U!VCb8w z@cbIM15`c*(V495!{d*l;@Ys@(r5Yu>c8iGfAr!3OFESVR0~A3BK%N%E6?U@5ux6R zKRSnQB=NR~inmvvimD(wi5LxEHlQ)mlrCZeKIRbuv>fw;GVlrQ8KFk+xh08{Cz)q^ zJmb0Yd^=R-aKzaK@LWJaSnZnrrL8>YwBsoJ>a_%xnFDUH4mDpPT-!*ZlOwkRNznXe#=1KyIUg4j82_7#%A9E=drVd^;w{DI z`f1tj{wNCt?1&3ppDp$ZktqDPS86cpzteS%;*NFwURnN47-EQZiX9g#qMQ~JZ%1AAZSku$>fLPh65`6#w{TzLhqIN&k(Y0Q_ zO4D1_?U%NyVU<-54O~+ZH_Dm!6}0d+%txh^&QQ-r|h_keWUC5j-a=PyqxEq=+&{I zvCUCsbz97lvoK1*RH9L_K~rogf3U|NI$Z06V!V6ac_;VF56U20K4mZI^ds){&*i~T zK~#9nzV9jo67TUsz*)Gb%%O(Uih*XOA5Y4h@zY)LN%M8LsMT?ml`j)!j@&kzeF#Tx z4Jt_UQ?*DP&%(x^eNm65$2ZwtV?Oq3=bI0gPyQCtJb7S@$4v5bMz-e_RUY)O=$VWf z$IT;8q5`d0KZt`&zX-(TiCm#QtsocA_B`A$mw*ubP6pQ9d*ZVvqO1)jb9b>hS z>#rM^?A5N*j>#?8yjhD`&f_^Aqc$wsq!!|&&ZzG?qX}x>Jy5Ps%UpX5&4}IX_NXS_7Vi?p~7N9S~YmK{$ClBi@~EadI6m$k^Cp3Wv{12aO6RIBcm{+ zT$ zYIVZfuZ%qvd?`Tc@6|~DMOXfv^`uvW?-du^Rp|;&P%?$tnAQTh@j))UY?Gdx#!68u3I=|T zw7znLWCR1^IxX_h6?!w3?EW*S*UN5`Bx9`}ED+Q0;#hUOS(A z=v}TyP5v*jsIYZSDi!wIXtDTXWIJ)6!TO(b6R~(JTQ#xB5_38rJ7btrcRy78LR_p# z<*h>(z3+_dzN<2?*#F}celQlaFz~^}SWWu(7bjQXZ^>xX;wHjFPRvuw6P9{p>3GTA zw<-tjIrX;TLceEp17gwj=yPZb5b?&~{*oGAw;#(v5uj-nGs6S+FmngpRPVxVHt0ih zse#jV=31=58OvQ#;5Ti(i;`)Q(P=-xkNboaq_Io5Oa2PJ67=b;w)h?7BXuL3Tj_M9 z5WE9ojFVCnH{G~zWEnn2)YMe1s%+XFj?o+~l@JB;0*xwaYbqbc)|e6QI)Ke3i!wUqW*!N3+QuaBuB6uAZFj`{ zHRu<~Xy`{)VJ9wRM(DwUY1=B%Tp_$pYsF^kltjB<3a~r+MeES}J>^^Q{N|TCeziZ# zqxv)5za@53#tl&2!>v|+)iM_qZCW_xTwf1(&1=}w2408W8zqlY>)YU3;-66z* zS^4Rpvdqmfsp7U$qjyFHZCP;mTaq$9RLSV`saUCl#xKAvTST$vM$h2)WOZyUjEv8J zLLPO5O{8JMrn8(aDPgAHD6nc*F^&662=PdkpZKpg3o}r~yQjbB^rMgsw6f@(CnB6O-t`XL)b8-OaeAP0TRPpe;+;rp?8P^ei zb>%w6kLjnq;(5$bxBmvP1e2`{<*7aY@cpPE4vx0LP8@iaCfhc5ghO;2K|fRatH58c zTC{HGOod393?DmiD`WTxS^x@|KS^ISF^gGzOKU_*@TNMbVZ%HJJSbh$5b&xjCWajm zyn344$0v5aU_AVT{*C8Pbwb`q^I8x0@r$)!PNOlURQ=k%=mCWXfDVd@{;aAiX5Zv6 z@u{(af4+O#)a~*Rhlymnv?g7LQs{V+ev)~j>N3VK{i`8J_eD5&zi6z(D(PK0I zqQ07AQphxGoafdBtTV~ZI=RNzCiIUNg)ve}ERB?V<2W-+?g&x+^B-+}KzG-u<~7g?${D2?clr-bM%P%Z9lf>IxXZYlVlYfKy(?DItoQbP z1ahS{RHW!e%9-vOSaJl4cLM8+7WY5n5wx6|q+WNL@whRVE%4kHlhVIEb-UW|id4(x zkFrs_6aSLD-9w=ZCEn1aP8n9*adCqiKbFz&I%(^bVt>of?=v>4Ic_h&k>brVHgc3U zZL?@Q3%x4@yaV{?I5`sCuwtp~`jM*+A3$$+?^Z845ysvvqA1I%y!6Q@vwfe^5^AAK z7qYR{`=zrq+s_+=w?3~|ca{Ef;^5J=M*h*S{%_5;z7!23dH0$d2R*eWhxW2QT|WC5 zzg`=kyq)Q@+ie}p)bq>30Kq+90SaXY%;jppPM4>->6V&F|Y_u-o2trWR%@PAi zNBGGX9FLSzS;K%i2ZOl|W}k73f4EECzM3R(um5U=kTKG%wL&AqCkM_J@$g^srHa3< z*VXi_=de1=sN^~`y<523*+=8gb=JIr6h*(~>#&BliHtM)SVn%(Thu+zIU922pvB69 zs|<{m5=1#^?@-)DdVSZ0Xc#!TDL7@;z@%3mr8{n9%4q7-c`zXd7GshkGSX77i15Tt zs;<#H1?Ind^F$8nf6m9~53e+_CUNEb9V}g=9?At{n96#*WUr)~+%B12%~t2(#S>%b zJC$?JOKvK^m2`YU9?p9RE)`hOB>xo(+6@gjc>cCayrfXa{6NfUFt=I8bvh{I#JcKX zoZhLIVlO4ml~7&Ov-L78ro(bxXdN`w{#h6MTzO)TTD5Cj&eUBeKw@NiJnK2+c5g%8 z{>GNLcJ!qmXU$@RjA^tHeN|YT_eO%D!)l)2>4J1)-mJDNJ0sg|6OaNzI1L>)w#LZL z8j)O=!nfdYvvXsN6KFSD8~JIaL$Yc)5Z7u0y%cvBg*_k`9Jh=`^nqL+zuE;FjBt*Zg!F69QT9Ali zEH`o-MTImleN_ikXC%(1hB>P6YPn@Ai~G^V-;&pF02`IW(RY3+2FavtfW>O9+?Ocy zMqWYiG`uOY4bK; zade8rGgZ2I3_l65GyT0-iP0y3Oy)`N_iDK*$X5 zTcOf1XYM z|0???@rrwW5NF1Oo_`{9dO1M1lsQNOy}_Ek)Ny}fR1_?`+3zYBML$&o@f}4wGu%-i z$w1u*^5rH%tbG-T;$y>aR_(ERJlj7S11XEDe<@GZiPdGKKO5eGXdskTpJdfY3e^=W znP-sG4`IcvEEIVj%k(iUgTafq%tgQ3=q*a}rHCG+<5wFk{VDX0uI)Dd5I2zZ(sjNF zN5Ux(Y?Wy)d+<}el-}s^?S6w_mlz(r#d8NxflGl>LQ)pZXfA5AsC)2?@@qe*rpC+7xWR-<)_PUx&FU? zf;;_h(tkKuefYv_Vww&uo*2R%15Iaj)EeNc8mg``g#-EgyPAEXzQiZiqP01^{FB{~ zA-3b@|KJGf-v+M~l&weJ=GL>>|Gpri|4DJ4oS*@gtncg#Cx+^=P3z}DuX(f2!i<~f zFWQ0qzg}Q5CgUf)e~$h_YZ3Z3o`P&O&xcLImNc3c zE*wQuK&87W<(8Jtp)O6(0G5j~MGL3`5ueySrw`S0J;i!3otGpTJZ7J^dqlGNTngfN zNJ`ttPPvINxP}vGY`1|g277E-huS!7SWcCU!yQltk5uicw4OShyUSoV*_(j<>%jU| zA^U={yi7(4cdVFuu=m~GbH%kldPKnVqVE#WVK`sz-a(Q54h_NKKD08#NO?NqKJr;M z-2;D*#ibkWezZfflyHUt#&di)jaO6U;-0uC8~EyS^$$|0k_CuhiPL^}5qLrZ0v zy;(5gLU(#Qtz{Tuf7u|cV#`(g(TK{ZFfcfzQ+==%;=`;WVhFe={S}a@%f-+9qYI(} zYR)Ub{c)C}HJxO*<-68=_F~9L^fkJEh(Fom-Q?Mnwr(YL{EDS(<9TDHu^P-)(dNQ> z5bK6vc^+R3ZjZGv=rYWs=68|jE-t@kE;=^2sL8wczjxPzPv{BdNz3wq_3VFO=B%jH z%FMgdp8Vmz05je|mp_o)#;@OrM8_#1seWbma^2L!en|$>YcL(aC)j(?Vwq7B(fYd8 zumcN>E>XzYc0`I`G>^Uk_zG&)?3IbJevwfo=E^$otfk=r45DWHr^ z{NY$Y*I9Z9Hc@2uv&+^gDCg38fIB3Bfo-?oe+_(nq-Jsc78c`x3}}3-PnVXSyTV!o z=c7IdU={~FKxqG&s;o-I-HFSshq_LL1J~yz(0(A_vzqO#9{Fl&Maau)UyBt+A#q2x znwj_8l|&&mjHOv+NY6Uh0qr z4eVXVMUHWtVXCwI$SG3;jd01#t99G!v?)xBQx*K4Yni;bBg-t@-?BFo&mK3puVon-L*(BoxfSL-^X?Dr~?NNj$uo*hEolwd)*WjXXd`ttDOMN`2%vWqxT2_Q*dv66 zCzJn6N<{q0vdEvc=rx4X6qHG;x}??p=cjP)?s0>_v$=n1tT(Ln#D1_A+jr$bD6l{| zSZ0UiG;CQIH^JBO6bKzE?BxS z2aZqpL^RV$Eiy!YlgufPX^;UgeF+8@56ttcj7r3Q?r~&J<#v5K)9b@BZ~|%oB@s5} zCuF?JW~R)Al03q$ZG8Dbxm%(0LvM-3tWfBhivNmOPG4DADRO$3?Vv&;K;s6>KAu&w$=3=I(KgR6l64Fpv6+h^S@R=f5)Fi&CMz zzMt)9hJCHA!5IUqCQ9LPs!F6tI7SrZMcp6uQQ~USM5~fegn96%vZD23)EN;RBD>xt zvd_C}BRIvZQuollz|)PZSXRog#tXqvA$(NHmp=bg-U4H`d3i_6XfeTd;C;>a<@?hE z!#K=!*JFVtGYU2w?8^tfCJ_N4fsl)_2S}HT<=J^IM$(uQ2?5VK!_dC9Vd^K9KXAEM)UbS?DC=>^ZKRH+Zj#&OrM3DeC3aA3C)_<;`m!tiV)k_S z1gP}#22^*9A)y-BF7L3tW9ap#9_s`3mNK_{31U4}f2oM1(CvgfHCelwP(*>&n) zxRKV;kIFTO1#4B~kp>m|DY3vSxXB#{v5h|}GwyO&FSdYN4DnYAb^k_zhuh(1jv({SdZpyv70!*%FT+05vwgWtH7oZ-k8Xqtdu2Tq&9qOW60}R(EI2qXh0{Z`B>O6y*T)S{hl_p@> zfJjxEN(Tk$pl-oJvCyO{T?imO1Oi02SZLCb5)cHX*MyqDR;ki!5<*ZqAp`;mkdWlW z?>lqO_b)%*nan%0=6Tn%)_q^Mh0&VlBp=|okXYEH@&>nOwH%qX0udHC8JND7mVsY} zDGO%o&BQs;oB2|>(V}nOFpI)ln%QcjMbB-tzT>{my=&O+Y46GZ@T-iOl$pC%y?Z=C zqal=Y1V$GS{TOhzb4Ov2{W>e_^?Kx+xpE2Bos~QWEU2e5suschd%BL&pp%irSr!PE zOA}rEoZ4@_GDD$P8*yxM3>XDL2C@!zD;JJk79W5XY#Vj!J3ym*2qzEvg7zV{q|tzj z!+yyN@MO%s!x*ZdcK^*ekG;C(2xE-xQlPL$t>(j{#|Xgw$A}NZQFY2Wk$r3sB@^K^_@ zdmiplPr6zj>5_-3jX(izkVT-Y z<(%2n;JwlnUE>UxHNGqrhu}f*yx~Vvd>*&vg>5>Qrd9hd?BJIlk8QK?6{^$fZyIDtfx!XNzD>FB8JaXnwroM4+fmi{V+#Xoxm|9e;4rs3{{SF5nLiBgiHNFp{!~*0VmLEZ2c6kEccWbK`D4v`PKAq@; z_GSO=ef?QyGo(REW$018>VVal8_oe0Rwqk?P-~ru9XjrXR14F>2vrNfLnUC1(C-(R z*ruhMifTGv0Vf^P<{N{$t6_)+??_SsZPMkhc-8A_@m+6OqiXc0g3O!Hs+ZiGaFZ_j zMo=%-*g$Bf#U+v2H4wl3RaKFje3KR${vnWHKaGr$(Dg@ZQddo2X6WcG`=ly=6KWL& zpX-IkMxk47{$Sl1Iy4-2xF#Q5X!d<`DHJw zL@Qg@12x#GLumCH!h%s)UD9(mB&FO$qT=0(YFT})YZ`*+@oxTUsmwLCw-vL`W{+rp zwDqLKxWhyf24RasPoO}WS}@TOIzPR4asPk69Xu>VJLmHM1;^mwV7y%SBIKfU{?hY> zn^tOtX$y9D>|n)drZxxEq_dBdD2aw4-2<^1Q;KNIhmkF;*n9bKWX87QCjsexB-<~@ z?`TdXyVH&C1G_z4S!iP#@7UB=Njc1JG zK2i<>X1S%{SOLmmfQ}MxiDBj>M<}|}lsp(nIE;xto`HCS3eVbBRlvketc8>c`?HX9n(o( zyBC7pO)J1U*1r|$86%5Cx_@_jVW^>B*uHuFR8#c+k687L74<{usE+7rY_BVe?{O=6l&c=Z+^swGVxiqSOmBb8de(}wr^@V*fi2S)G*MWGzG9|<@JED5z>q+ws z-&}FI>UHQtbbNcAAz&2j7s-7+#lniQ9d%a^WlXDZsz$U_dFCDj=%q+R6KAQnVR)ev zcf@fKU|)6W<1zxksTng(9(>&Pc$WHzsVv+F>;2IM^N{x1cmWs~M7Yy-^O+|5zzUg7 zlCs+hO*s6B5$VPnY2O*|tNs5H2(aG1oq}n0U^f|}x3E^$;14NUO#Y<5sl-`{p;xYsc*o%;OK{$Lv0H2D3n74gYZ?bPN2+nLb!RRRdW z$t^TT9jV$xzN6IN?EYDIurBIB$BY=azkk&o6x#--R+!!$a(DX{DB$Ux#Q>us%iEOS z+eV1d>#lV6UlKQUH?jcd4@6t9QNHwjOC^3pwFb(Rjj}j%YW~_SUhF7tgjnabh^nT+ zmhI$<%@)|Qmx>ah<&29ZEtFxyS1t#DgCzd|FHH5Yueb8bxE+8H7a}O|)@oWGw z`6*=IBeKcYZ4j%q3|QLjeMVl1^!T@zC&LsD9zV=v`ZbaKw`!84tOKFXt0T6Gx2E%9 z0Zz->^jbp#jzEM9QcP0JYepla(FZ1Npukk%HTKql2Q*DGKG*c9axJXgz!X6z1evfL z-v4{OD1p9RsO0KLNbb7PW*IHQCi$k63G0L#sRzCfS2t0G1u~@Ek2kYUYqZF&bL2tP z4SKS3T%IbmUe*JOec$cR=00zH&a~6^Fwt4$iiJm4OOO(VzDl&JFPzsOAUh=4Iq-A! zhaR*(M6+nw949$+7m#aKx~Ef9T~Gkhua;Yrigh}>^`@!rFv`JsUX^pCC!c;sR92zu z`GoNrzu>Zm+4LSB8En@l%lssVdJi}0+8W-+0#;YP9cIC~N1Hde2UJ03HCby^SAt%1 zv`d~tMSDLp)8CM`h5m80@B6h#*^2k}ra{M&ms!`cQmkoX4-uvyRTN_2`XvMhB6jJf z_wIUkNoecrmKsNUpHyFolSeT=dC=SQADaoHDm8V6Io)pfA_SqRjldDYv@7vUFZqEc!=B3Hae_5{~7D{)Y z+_+b0OYAM3jhZJ8DoNE@qGqpeHwr}>{>b2aANIv^?IyM2z@YY0o3G*csx*~@1?NAA zWvOca?7MasS+}wOw-AqBpR9mK^YnB4D{u;{xNSA^v6_$C_H1Inf6q(8m2qi#h&cb+$Ex>Xc2UFom3~R$yDM^9KhCT+x6)5{u6AS z)E6Ez>5MzsEBwDO6*14{5b;i30{b)Nmf!vU2r|o~YAx&7(;=n_Ivt2#(yV{UN#T^dcQ>i_JC$tYfc6>wJqD)?A>4h(|NJmYSi!gHA0JEeqR!VQBC)NM~> zc^&qd-%`VDdeTfwcUMQq405`Po+2P0Fq!f~o~Gm_D+Me(xB01Hw%5xEI-7CCST*X9 z=#TOWxdFQRBI-+F;96V6GHQDnuU18U+rmzcOlhLa{IPBKt!zE3_@7qc&mjT56=ccs z^xs0#I*_!}#kbtc?#vMG(@bsb%M0;5Wg+Ps{6M8y#Ms=e?!4u;M(g^LoL#m4i|gP` zxM05X7pZLedEe-JEE>xUWBG-z{cp#_D)As?0Qb6Rr;S}p99jN4{ys^{6dW z(OQQcW?DfI{lfcm7bP+GtS$S3$+p!xDk}$o&ib(F)`o&{Ul;xUzzwp-u?}%X-9Aw7 z?liq?oXOBZ+0qjt1$-SNVlET6wKdNSRJcdPaomK!&~$1lZu&#CGqCz6ASXuhjHhj+ zz;)V1AHobRon-;+=URsgaPdUOX8;vG&Qd`~$_717m zYFI46&;AJSrg$GF+^_y#5T=y&SbRMvzrG**P7{M5nCnPCN5($M?t9^NZ^KegS9C1f zkWt-ebOjLGU>!Tg#nP&=A?V!zNsl-$=dZ?uSs#jP-?`mtXpL&ikf}k7`nujyF5R6v z6xpm!6YDdg7V6A44g6pXw&q#23>Bev(f$T@_Z1bZ(7-TaN|UAGpd0nE_jc#y3tgHT zd3w@_WbV5&cB#={7@lzwlkzgLKXkrlG{&t9SRhGGL15cmk54v*=VgQ+of~U2Zi&q zu$ENrz}VY`{d>I848tMVUzmw(s$u-K?b$ ztqQnbD`Q;TsFn0@o7+pr9Wd*C{VM=6Zfy>Am3biY)#u zxp3nTXrDEe#QZ07A@;$#DDr9n7%)d2k1 zR((*f4B{lOXg?|9R^c9q=zAF=8s)Gv9}Nc+F1utdpK<<6HVs*1giD>*(QF*Z<^GT( zMtIPs;#(s*Bh7V|TWRURsY#Ju4g@?zY^pM;Cem!!a^|q2s3pcCkSl~$C@%*vMm&yT-Cm+JU9J9oH@**gBE-ZT)_G$2DR zv}*3LR0+D_g;#eKkK1Rhu6#Zi*aSvn!GO5Q2(G(T%vI%%k6<%e`q{*Z4u-S|hC!~e zR5?s~E9cQV&`6NWDxrquEN$DNu3zr1PR)#&lPhb+Cks#8Ce4M+t~IKY^B4zGLQ)xR zvE>x!bdSip(NJ*6y@yeca~KhW5q?N){2lZu;8q{I6=u>fP zdS_*YW7*f0-9URZ5Ds*tHK}^~_MP{s`7r#FaHrIHNhN4m3#vVE5Ev}2(%kxuI z++mM_Yrf~%dyJl!-RWGka37vwY3-cpbD{9%pB(dwr>;D5dgxlmZZNH|bKx+^QQgCb zbn5VeLzVHBNi46x)l2z@XUY%>!y7(l_KeNJG~`zOW9bmM`0F@$SP&eXrkaN zR~ABg21ybd+tZ^vNOzU1B@rM5<0`@xfmjVtl6va(soPl<;nRr2iIgTR!(JMl7lK3F zF>#{O!gRtkYlizae$wv@L_YhpnD%y%;NjX7gv2my zndnq~7n3mO5`wQ>uOa3c5M9jIoRzP6Ai-KwNC2q+4eMFUMUbX-k;sES^*=MFLPiC1 zBQE;rrODyT923Tp%+bIRlNAmIcVql^JAVJ?8NV@;<3#4pN*n{qToVRZ>qi^}G4h$K ziT?#42Pt<=v)sGWAglg}37qF_A+M!IWcosoB1go(>T~Lgi)DfApZ2gUI4+x}eUj5Q z?2$2jxD*jVI&UKIj8}~}`f+awH--BH$AHs|jeAB}D2TbS`kTweE_yY0o9Cl&cUp@R z-F-rAUPB_P)CvDuC!AfG9CRGIj?A&q`0%-adzgFZqP>q@3Sm0Cc?0u4D}$`a^E|&Q zgeL8-?C?>Ng{?o9OZW_)Et;_x{rQ#N(T)Te9mMt+0=&&^**CZY@8uF6s0jT2lB0?t zi6xz}*$#*q!h&>qE}DABoc^n&ll#-Y8}alxyz!DtnXr9CbLVq71mX{>I(rr>pdoBR3n+t`<62^l*WMU%q4TVUAy{&-@!Ke>V+#{ss~#}(Bj zD|%m10s~%lcflG+a|fTq#b$++4-}i0>t9TOZ@9t&XnsV^64)$lswl$eWuuiF_K~>4 z-|zGYZz>H5o?O^32hTQTAKGy(P5R?<_WghigB!nb zA!zz@+(YIZB=fL!qfY92mj4Ztj>BnIkaSKW!gQZCq+C6aF=T15XW%ka(nP~Q$h}C$ zNMd~Rz8K?Qx2Q9$bLJC^F2oXC{RcaigJd2s8Hr5fZ5CVTSO)nA4FNiWGiu`SD|L)% zB=zaT|0W*;KEWwcvX%vb$`>SJwqFPvG=Nm!?)JnlaVYEBd~00sGW%6HKR9Hy>hdev zq8_W$h8_du$LR0=#TIh0<3KImKSb8_67Z^-E8CXhqtsWYs*~?8Z@mNeG;#maY0gUj z{*ko>YJO!3jTZUx1jw7sCmVLvLiTI-GE1~MR~Ptc*%c+gVhY$piTnVv|Ehviogt~(S%!XO-`|C}gG<*43%M=C_v1VP_J;iLx=i>Q zEe(~=di;P86#>uTBqCKYKY4Onr*pul`^gctfUsx0l*q6>g82Zh8FgHjZ3F(5^I{YR zfR+SI&u(9RfKwcAQ5tfCV!);PmXcphQgJ^QNW%zPku>dP^0$E>Trsdt;zlK6^J_9( z4tMv4j&~I}awXb@-g`3!kaP{Wrrp8m*+*lYDnLb#l?zMMo5I*HSXtq&uCVk|K4QIb zG#mpiqu4!l#3Ck7%Mg37zkTC&mG4Emv{J+Fi?^vO1SGYNQI*47MIHsYGSF@`fAzQ{ zb>_-{Z2<6p7SLS%a2BE}l`Tzo@ypwVqDQKSDym<$$%^R$zpwuiU4J8bpO?$`;(DcR z21i|j5sWy-5e6cbSU%kHbPcY&vs=`m-jBTnrzvFo&GCi7SN1ruIFS&bMR?vj+szUz z7hB7AA7OJk3=-_2bY$@_j(E~o6T8pGgIIyrhaj&gu2iIqUR1TYAzz?FN(_wj2+@2Y zeDdH@nvK?r$pdmk;R_fOYwAM1}T;@oZ+bK22@Zp?%BEPR!F}-$V#mHFYo~)XiYuaO( ziPXS`XC7ZEmo#Wub)CSixtY?@q0$52)H>9TVv~PpBVs^7x(nt`8hnh}$0*h}D|xNF zFKA(>vD2!OF^YwRj!L3(6DSx1a88ACTk3B2Bek5Et>p0mTN8}&{)vx$k0>6{uXM7{ z&j-4w0?kgXAi_*8b;G(SG!_JfgYxP>rp-er(sjX zUQwOGuUYkGq@`%JkrT50QBH@)Z3Aa1R9vl8fYwE(I}&v65t7-4sdvn>K<>H1=UJNPx@=PV9oWRatqou;$q_G5NA;ktS{e80at zr=fLtZ(Y4G|CXZ29bG$GSl^dQK=Y9XyYB>&Rli({V#!*UE-0;9{thza*XOJJirJT~ z?;>NnMONUZYuk!*9{Ukmx6drv6m7?kZwC&XPAI$yxeR$OaLNuDf;~onaH(H|Ipt^=QQs5XZ6#H+4ZOXvH;hC@$xRc>7)8!gs z7t)C~6x3wG=l;O;bz3nZdu)#Z`7-1Q74om6EQh>4?MMt~2?$aX^cQzh>G;4QhVXNH- z6lZS0J`iZBXl(8!7_p9hcE28#Si53GJ zaBkU_AA=8Ix~C$|0x{Tw7*~*^>|-F#^!Zu$0r!j(q?X0s+u0g{^I^r3=?SC$0=D)b6UM2>bYaFz=Hkj) z3FjH2fu;~0&!i$5B-r@daJVhqjUrc{qAF!zAtc2|USl3Z!}k7j_|Kr`02*l7Rn3hNbCXnZl(MPpU8T>VHkFhM}+vsH@N{mumW53H5pmTvuy zjwV3iX@*&(lnUepm^#a)4IIq;Rl8=t}tcfK9mk$;|1WsbSz zJ5!;vwz+($d*luhiyyT%0IPuIfp^V0er&o0I|bh<9s;R+b5O|jqjBA}Ogl7wZ|NT4 ze6J5{p{SEt*a0^TVjSCvZ(jkbK5Yd17d(bZOdd$v+bL^%{H`6uMHP3Q=h+mvTPYqY zmS$k#OB6&#s8@r4wBd6Tnm~&b-%& zMi7va9^#;kA0cxvMvIgkAg zA~?*RBAq~Hv7!Y`iD2?DS3fQ8__I~~^=(5>=i}-xkwRM|?>K!KoyDs_^KL;;Bi8<# z4q`4yEN)ugOYD<~Ma9pSRzS_cQ1d~GP}U^_omOHtZwykQTZrtMbvc(fq8*11qSpv##Fz{PzRCD`bZ0;~@Nc9&3Q7eN(N~bZYVJ za7DDMi!XjCmC+!ZtRr571!Yb{Jn(A*7dPBU7uP#p)Z(dd*{YBcp&+)eq-zPKIH#Nt zznr)3ts%3<9g1V^ESGMjB+jg4{`ogjmLXhqyWO#{&U#a3aCQ#<_SGzv#o>s2;TyND zR%y8wX@*$|jST=$*@}9}PU$nzqRW51p+w0NClT%5Ch*1yMkdPAXJ|+;YT?jivY+h2lYbp>AraU%fV7wjQ3Iw6n4k4e{z^u=EQ6!{DaAj51_R~jI8XJuBWuWI|%6lH=8{WGf+L>aTTpYdTSJ=ClmbyYx2>yJh2 ze4*B3*2NQd)K6yqiaV46*Dn9-_sxWA&Rn0y38m5ZIt`EFhwhn!d1S#78x*0mn@VOo zLwDmPi;-fX0^cJgr$*b)mgWTCTeE1|T9R*J(&L!8xNEx?+)RisY!bmAmJ|0UmoMGL zu;V|QT6L}1=jvu+tu*-|C$yQ@@^aG}x2UT!E91rm--glTu{sgy^F6zb%wku}6C9N~ z1+=0%O`$c%@5Oo=EP3_B1Je=R-ykGqZFZZUEWjQ_m(*GO9r2g;5w9ZfWaeUOwC3BA zZPBZhu{?k6uN2iri)GH|FnV)B1XXOrro%ZsM3bTfJssl5C=RoO3>e-lpI{7-U3?z- zbRRREJ>{XL!`HZ22OzdtR;!$9Dz2k|z7&d#4_c1(H*%3!^HVlV={>6Dq91`3I>{M? z9BL|V4>Q8QGSa*1|_Z?uC z58xi2`zEnX(Ulk}i-9fgrhyXdWyn9DG-PyJ$G;Rl@1phXc39Q(T^}A@IIS2zrg?H-GqC zzUzT_hItC7oljLpQNscQ$0A`i=;X!RZR`vc@7tO)gO1P4#AR6okSb|4MZdR{9ioIM}r^5viOW3R`5v|k?zo|#7Fv*bj`A!U8cX4 zfwVIv*|xjX4-5ohL=1z}R2&*G>L`Lx9va=;hepDCR2@&#U&ieSgIBrwKMeUBm@dq4 z^;i6Df*uD#YmyKxb&Dhg$pAfGh-`Q1)y&&a1_cl7Pl`$H?K2h{%2ZqWX+sp?%ym*O})FZ zna!pjzK~L{-%fQr-o?=)nb;iWHj+kMu(&&2^j`!^?1zm<_u^wdHk%AhZBlICKHm`7^H-ce*#1f$hoc)|M~yvR zcU!2CQhgJ#hnlW|EmvYazZi3&xay~I2Aqr&|Dr^RMseFS2GF(GE7VnVE_pxTamWoB z_(@FFaO;__(KDhoQ7~74tpS3d7B%d8#oTGP4UANX#tvs#&PX4P!^k3l@THz!I6;XZ zact>&zn%Al@`2?EZ{^JjYRl6Vn>=iVv5wFImPyznt1cC^r@-9cL~Y7*I2|eoYyDN8 zxQW$-kf&yxkN}s>d$G0EQ*9v;Nlztp@>(f=^i4v`?uepCdfP#GEPY^i0q<-$G5+efCmPC$wLsV0x78T&@?rSDRG zVQ~#}$n>9^7a79w-WW+edoXW85!#pu`;ha=?o%kC@6c}mvA_) z%Ki*%;!l#Jjxw5%qw&esrx|e{{VhS zlGBI1*rr7?3ggz~+V$?FIB_f=VqtsxtT+2PdSflG$-ryrhkCk3>>oJ<)o@Hqi#?f|)x`@WPKy|4`T_Irx1-gzvN6HaU9(oo*W(=A2-UV z++P*g;htHlPP1TpQH4AAU$c5G?gcw$MSS~+*N2t0WS4ek`j zBwrvLPY5*&oE1TJbgEst(p~BH-F_vyJg(7M7PvHx{^I4All=g-`@Gsw28)#zcojI` z^@A(pD%xt4$wYPJIAAmIDu=WJM!--C@h$dtM4#oq@?1~l(&Jx!_z|D*;I`Sx+{H9M z8~593Per?bo+;C~@!3<8a|vTTVDNN4X$+BR zzAudkwUou|T~fhU3SO@(e6(GYv-`PgLVncuEQ@~O-&Et{l}{Z9%XL!he5JwyXvwwF z7tM!m8Z=s`?XM`8S)#4iVXhJyK|{ad2(r{r(B;^6oszC9AB+e2DP7YYL#j`GCbe#y z$5>u3BBblvE&xn^^}&9)&s~}OEq;w!RWx6$;xgbZm1_-^YT3{kgYPp7;@99?8w*Wc z9A!%L;Z9_E-_2vw6K)mGcv78A>E=MTPE5ADX5ljhh z`h92WYEL1)Ag__1-xA@W4if1vx6BVzcDc+pQ9PefCY>gzC%b*~^rS4W_cHdRjg*6z zdyZo^&^}(5Sm%AfC(5@;DYkQ$ANB05KjKr=fAdpT({I(t>{q6Fyh7)Ky6GHAg6quv ztwoDN$uo~P9N!Dx;y-`&(uMlx=fxjKYLrdd%t~3D%Jp4%_Cs-&;uDgnXX7?3Wx6XwxV44f;Sd+ia+CJnOIm^1WhTN<}P+_D_1_O}OFHK@9wCb>e0t{sU>hjZ*c&9Aja+ zv_1?|h#uXeTCQZcL-lpuR7z4^%z$3eYq-<&MLin`y*53WSDZteK6VCMj)|=7oU=!P&JO2tOp>E8P9&A z%NHP}H@un14q4M)q#j;P*e?K%hqz`1aoa$K<&)ES9*{3y~~Y)|jX+H%_!yySDR)W^>9fI&mx7TbU87rQAU zyI~r!^9>~U{rbAh=HhGF;zi2V-|Fj{FMq__iT?!FC4AZWg*fJbaL5^r2}19f^rW1; zMU&*{89%8nF*O+9(KDUtgaTp@pj9GDCoH3jaej$hx*+_^oifSuz5!_^J%-S;ne|Dl z3g?#hN@kz`NXDpju9TMw)7b7+;Ki*|}l<$X@V^0*)=2>iSZG z%Dv)`kSc2);S28LkvJZ+Z-(-YW)JH(RlbBt7177yL7d&_M9QT%&lg+p1(YC{?1SaH zB7;lQRZ1#wT#dk<#@ug5;o9F0s8Cu#zX_$-Qcrnd@h5*h`Iw!Psq7SV*GO!=r7%!p z%*`t#o)XY~qs#l=Rk}IG<0YXg`YYCa`zXxC1@(lKw4JCP`wvhSyUh0cr4V9iBc&e+7t;Zy)^=4v_ zK@Bx5h)W9aGMrVvkK9s)Omk{kC46Q0E6v`BDTj%+%sbI3cuBH2+D`nwV;$#jZ!hz` zbFwibla!t+AJp>u%_AN zKetnH+CLs`|9m)Xn9 z$8aduf3gkn<=eHjH%XG_6?;ZZALY)C>;K7&F~VgU!P2Pnlnd)qvLkewk57ZZ*1FR^ zpUY@Q4rxlscXm}>789SZ<-cef_u;BwKQ(Z#Y^yn|R%t+Y)G4TWh07v683cSc8b#V_)+q}7`@Fj~Q$T|@B3 z*+g^Lj>tIZTRm>V+KvO;!T2ZO_fzp0xvKjGxuL^D{{!36ZbxuFMk3=t5qfTs`t<3Ikd_k1#6!4?Kq!~6qMb~WFnd(z zO)EU%T~TY(%XSU>-LskbqotpQibR_HCd(~#KS&Q{W==1XA3P9dBu2~b|52r!bkFGdf`Ojf zIyV?^lcvwu9o>Rsp+xB9ISt-ab};w;Nv`V_BGqE^*|?L8 z6+ChauU`$>Hg4>0Il)gCl#d^@5V7oY&V zwm9e4Ot>sY*u6-_F==s7Aye;`{v5>q=ZqZJ=#6C)MjtauAHS9pca-DiR=yA)z{6*t zQC3(JhM~-b_a8`fCmGdjR>$YchH^UZIme8|s6chRfa$f3qb-@*(S)^!Jj3@)ZN@r! zCez3PD=#yxxBaZkFTByCTu1cl&$x#y|1KeIhI7lWMS4~nldJ-ij$jBE&AH;x!6oL7 zzx##8>D7~!?UkQ6)zEfDk>uAv1k6FIybek{v?dIMIKi7yC-Oba(M5|f3<-@lwNGTw zu2F$DU3f@r!U^gU?xEO8#uuKK++CFyXETuzqR$t$>TXfk3no*Z^K@x-YoSkI;0|OX zborFokQQ@N=!w#>b>843H)3}t;)jSQMNdEK<5e_Ib27%Hnc%jIRt|37oq9Q9PMa0} z4!vn%5pJjk$dD?e%yn}J zJOS+&_REC}=*Uqvy*(s;F{7-M^9RWG8!#-4jd}$;tz&Bb=a-l72qZW3d*Md%1&BzLBcW>ga6XSQ}^q+WXu|wXoI`2}J6tGE+ACjEH{Kb+s z)#0N#_|Hb=5~^x%hN=zQ+I^R-nIE`P-e;ygPJuG_;uziJ_1M47eOjH(arPxjrwf7& z1}*b-0PTSNet7pLJ3XV=m0gQHZJB6_al{JNhZX<3CN;FkPj-yVI-)op3eH(dL#%GHhdu1=zaDZ&?~xkMDn}e}RyN)= zVX>_9+M9D)x#?HA9;|fv02EuxQleiYhyua;?&gc?F}!Jhk=dhKm8=kR9^RxB`|x0| zwYJ&7gWW@vRWCwu6`tF#~(0QVLSkWbO`GB zJE;cILpf{Pf+WVwi~!@udrmIlXme7K#OAc<;LkA5+QUVS$%+&JYBI95&ep2}Ju>%@z%rbq>BTGWN6v;#T4}Xa*uVU2^zL|Hswx@> z7+%&+oPRDHdg4##S!>1F%{Ve)uF3F5c@7l~RdeX+v&D`)&IROAQ9}VQ!<$z|{$3MH zGRZZxPjq(64$1Ciqvi0m-go>s`=P?@AE5WL;f7$hNyw<#dd?lgMPwG%@ znM2KjxLYg=kgZs!_mkeacd4wDt#27Py{EBSXx{Q}<4vRGOuru@^!AAD`ub6y6x)Wj zfpj?fCajNDspv4w`d#)@JSip8orXf~mr_f$O&e8Ty;S1~7I)^Wz=<0d z*Q_RwCBlX~IMM}Yyn@wye^+}A6&!N`xlT6s%;TrUevR)-d~rzVXp;enbh57O`Rt#T zRmWO5BBos|Wbbr`hMRbasGJTSJULa8R|t9-(aK?v=@+0!dK8%YPBBfZ>IQ<8RaYQ% zH{`^=dMx~58^l;03$xLRM4j_KCam32S|Z*vhZ_MIrIksBP+zw{%{bNU9)nJ1&!rDRDh zUw~eI#j?UVTw(&K*J@#s=mdT_M9R7fP>O-u^DGxS3;3z4GBeGObb0-;kG2)jkVE%m^A&f%{s*GM-Fb>-wiZo*`n9ffy3JWDi-e6?H&Q-J|vnpGQQHgj>8N0 z+m=P7K#cbQr-{a`6BK7XcNx_f*a+xv>*W$;OIMTiCqzcy6t?<{rZxWl*1WbFsh02x zR%;En_5c+FZj~#?d8f@Iyk`>(iCiZLU0!}BJ=APtKlHaL^_9HFVeL8ub#sGQ-F*kl z$Fj_C2&ZruZ}?zdSEIWu;jg5xb1tKbH0NXAnxpEvu5gEKv-R(UIkEw-O@bGkq#BF% zuB&mhr@~IQzk#Aio1Ke&Z2O#Ziv7XOcikbfp_kx^c{1bibArJF{nm~?*M4}78asZD z{Jvyz$irMrz-#aBX~nqRGRNrEtUoC5&{{!Qbw68h~gDFimI` zmqG3MfYxeD!{>tu6uu`b2V?6KoWxQLW1*SVFH|JdvSuh|rRCf*2QchDnCT6W4-TFUtCb?NGlY1K1j3Zw%@DwNMR`TDOCdPSe&yL)uSTo){qA-;y=H zJZr#P<90IKr5-H)c#36+YVgO`P+fOxi&Q-rbr929jxj}p>z){lF-~UzKR!ID`%e%s zu=q*7<8)V`NsSCOXr;nZyg2ycyUqxiQhT=z0XbH1GVR)lsHs@mMS3a`{Th$?1XB7q zM;S6doK%}o#HeeX8zawC>hZ42lLYYo$L_xuh!G2SM6=~6`0o<*&B2raB>CHkj``aU zXeq*5Z#7BN2-qka@MtB+`p>y#G^pbsxIc3L07-^3X4;5Wh0aoT##KBiLXJ>Cy&8YK zq*Nt%q4E`q@_YpBFuqS*)7UvNSHUz&Y5BMQ5G4#!urxL6JII?I%}cX+Y+>>|x*EaxeSD zZ5#%GVboN{xQRaMPi0!BZk$XjksDimI(hc5;g)Gphc)&)99N7ELrk~WPzjDF@a!Sl z#iI8^F)!!$q*%hf=MkW6yWcrq!JHCr6qdF5Gi`-Dna`8gWOX-U~jv z7S(*$-o2zp$c&5p<>z#s)-`Ch?Su_6aO2|6hdkmhAMaZq>qZrg5+Elsxl5Xm;Grv~ zkZ2uMpH7~~kHO=%gQ#%jgRBO&Y>Mo;+_nEh(zypRz5joFbD2wSB^AO-p(H}&GA0$u zt;ERnoMLW67!70Nl&*Q9=Etk17se`%9{kE8n&3(va%=NdvzyCjfzCN$_>-~B@ zp3nDFN?FCpbHiu26eveef_B!Z`drxgxXspew)oS<=DQ<))1J!gk9Xy=*rC}pSs7Mm zmy!P7zz}dKkYhewmPD`>Y$}0vj+^9(|B-7 z<>}#U>Tj#~LiqCqqiF5eB*Wvv=0K5u)nW5zOZ)UJccgxH?&m-Tky=e5uO1%QWBx`} zWDm$GH5wo{Ya%`hK|=53`brIlkK`T=>lwB*Iu9`zB>AGlMd+P_NR6^q(oNVU_Y=S0 z5El2OBQ*V{+hS-{8_x00q>m9AmLGje_RB_J|Ab*n3d)66oIQ^Bcqv=E?W}CX^lO?}%?g*Fm3kKbeaMwOQ)e3TC!omb7_yO0 z?D4E=OF|0iwem}4b8e=S!{%tw;S13@FDz%is0R@eCf+Y!e-i)uUF+^U`P>7VJbS|| zAF*+to`vbY?`Fg*&5?rWl`%fQx_2Fq`Q>{w=bPg_`R6}4eh_;g5GQXoy8;8oS;MP% zh6O*?OFf3(-&|~4jf2{?sJ%ARzQA+bBI~DsNtj=ohJ>DJn~Iu4*UgHxUfe<}Jrxq9- zlh$F+er&{wl7;D5-}xibB6Hw4jqKKus|jq7xLf{DL{mV6XV1n<32>9e40Ni_dfKZd z;aVj^%2PQVrPCI}hfzmUchJ8zD>!5rI zNooC)0M9?QN8fo)SY{mc^QWzaGW6;5=G?|1_XzaWgLbRUp*H?*cDHTF-f_Ipzq6qP zrs)0)3ZO#UJVzXh2V9qv0jSZPOAFGR0pah{Ug^>MPHOP+FoX)gUW`IzO=IugbtMOMrFx`9-Z zLF2;+3`IrYo^Eb(Y#E2yq*5kf(K@0VXT6!E7w2EAw_vzs=pnfgdh^D2jfeXE2-nGH zhed~P3R07;zg`&f!w+;0VP5zpz(_r%&+52*X6M>WS16t%TG{t`Q=7bqPRRmerO*Z@EBg*nL2s4{QS?YTqb zs4|BGG7zQxg+M*v@%#?5*6&HF=|VCZmiMmjmEFL=uiuIi;l)3n%2!4HZPR-|Z#_s= zZib8wkP17HmZ9#KQ{(q%olup3I(zL)pSu8>`+6?cPWT^?LLguw>IqM}&_AMEXkEOXZY-#&~XP(HRy1;q|>b(8n80cTb?_%yFoD&YBuQwW^4nT*haSUK9UE2Th zH-4fw_>l@xybxt%$G7{Er#pbFg&yGxi$4&&#%oH;re%hL8f=JJ%v0+h>B$GQHoGhn zLlzfTSCv$WSGvTVucjQ?zhF|O7=rFuJ+7ndbP6y_ELKpi6yUX)EU@=I;NTH-{s{S8m+8++WS_&hH7DdA=+Rv>cKl>2Mes6=YHL{|Scu=C$Mx z?2sXp2zshR7pq2N^>&}MrXGV5pT_pN`%=0CChN8R=uzQ?!0#iC!HS<6IQC2SQ%sIZ zpN=}h*;yyV^dbD|EyMiMz(KJ>K@^pb(rH`XwELo}R%= z|AtNST&Wtjl=1Uz97Hr7Q^IM^5t5lt7EO*P!*4sD)u7F;55e{ZZcymApV6u_NulnW2#?zCiQS_elA1_s7_8?bqtXT9E@EP*#1Ep{Sn zNf`m-@^K^-FmYt%5MM@2+k#&<^^HzeN{F$sDd9LXTUFMG9!Bvz6?Si(ob$r4-Vqda zVvD@devL_0H|Cxm+5M&OD#d~bd}@(Mgj|yX9#%O{qS|8lf=p5O%J3u7Pul}Z>Dwg5 z<;@TNW%tI)JDMe)_Wfe*M;x!^)@wAymX(WM>rPjAntz2|w`|GAtpTYBl~6xdJPnMy zH7`)0S{INh!1L2^HPn}Qdwtd%J0#x2cZy3SFiz)^`|OO}dcQ#-N@Hf6whbx?yI0}P zts=mEM{Hpc@pl*ud}MimJ624Szg!%88#(^r3K9u(&A z?w$BTmqK*zr%O#e6BoFD8PZ1kqj(fkp7w66I`OHlwQLPOD6Vp=q?-+jR4-vYY2xem z(@(hY`76#Zd=G$esNB@b)LiSWC42dD96M4Qq#KhTj{QioN>`wAIkx9x1sN@LxKzMM zH25R4yoq*$Fi6Z>``*!T*(^#V{w2n-_NHEW3`|c;w~lRl*QHyhI2H?tERqGD@wx@u z*&KYD_vuI|UsNa$^MVsR1e>HM9v!>}ep`@ZIHVd)bOul!Y>X9~9KH{^(GS;Sbi=Tv zNka`O4K*3tKGGoV>W65b!OiUCLyrdpN>>#H``Qzmf7Y2S2w9!MGM5?$wrn*nDIe7Oe#k=PCOYry z?F$e_mO9q9)~Y!-pVQOAM~-3?qvmG$vpWftH(U67YxOCBUk+Z!(}y*AK#fA>@Zay` zGksJbJIq8g&CH@0!CmUi9$ur~M0XVZsbpQZ z%iouD<9_XYv3~%$@AsnOL+*Zku6-mkkzA~QxR@B7XYy3YJXcHwHj#3L=jHst2Q7*# zX8Rq-1$=-}Oe9ZihFfE`7WLU((av<}peu*gJoguyYHeZok<3Wcru)+3a3Y^XFMN>w z%jne3J?GHMUb~CWuu*4hQ;#SS`|r^``=T=|VgHjs2>qp0+hA>FDS-Gqb*3ijw*W79 zp_ICgEi*)zl)aq}N#~A`c;Q2Q5Z8sU-7wwwt#*lu8f)_cb@bi#jRWJ}qi*`ieM)ZP zIt`!sqMK|)TAnz?!FMF>Z!f^|CRz|n;0Yl@MxbR@ZZP-cfy_j0Qvpao(&bTE-=p3} zMN9cs?nVxwpbGC!^sjtbBqL`#CC}g->ZFT0#?_8{QDV5O{!%<@%ddLGWUP3>fb!Zr z$#=**cqB}rJxfqTPmXt^nf;JmH{0jOHdX?0zTAJ;l$xu!YUc&mbg*-udU8C%O3qk>Km0H(5(K9trX% zALzvWrBil|mcKbBZ^V@TQtDGW@7QXC&0O77*Jo-yazdxi&lpcds5(-{tt~&I?N*%i z&rB4`%-okmjS^Nk({{d0zv|FUZ26ZoH`joU@4TrSJadsuaKtALN7NR+{czcR0I_`a z+_QRy*F@ivZ=+LS1%Uy}v|3x5*8X@tAsYXBQrSJ)2s>w{nZ~>tr&eGgt-VCiGm!vS zdF(E=7dF>ExiF}Bv$Ek1`_8DS-4K2nkUn!~Xg7Y-=KcABo?YkW;6R@)+NMJ7Dee2d zv=KFyVf)xgT!dH#af8diX1>iK#m$w>c9cahw)VdSPB02=0;@xwi51-9PwNfx2)MP| zzObqALOlfX#Thm-)uaX#5cbK{uHttyZNWolI``HNvRecE#WH5>Q+)^P%^{RO^Ks^F ziyvK)&8PM3U2gKm0h7B|vQNs-&~!N5IR1h3_ZanGWSxlNy2A@yo{&YELtVHNY;!;( z=dWq2AXOIMhjnWW&xCU-nbcx0Z~79uunhK=0NW>+rv5t7>xy&gSK!wRK!>&NC?3gR zOu=X1d(h(fbxrUX)S+0mU%~Rae&nsLasw`eqHFdtFy7Jeh@p!%m+T`4nTO>Ea{e-O@U%(=tnIUPG^OdVKI^D;v8q@Rgp4@kpZp^Nxr; zcCO(TxY>EH&{>vApRM?`U_lnbk#Xt}9xeQYYDr@AC_@*aoyUIEDP=?+U{H(|a; zwhg`+pp$`lH_Eak-#gp0S%M`9FK1%By@?ukB)#mbvmd&3$?oy5rC8P1l=l~3<;3nK z;SC0=6XWgn2iDIx{SDvKJ9PKH8&P(>Q0Q5;;Agg`y`Bt62w6GMc`>AWM;bJfTpl!w zor0VMGk-CIr=&me0RLJ>cMmh${KZw47%cDkhL)?TKK4ovoXHVr_h-eckj`e|DqpQ} zeY+7J%EfLt=6l0azoz9FRS!G&`8=O;gnnq{t2JZ<4mrv|4^{{THhSvA8ZGv-2=^kq zq$*8G)Z|PMgYoVM8L1yA*0du~zUp-~_8=#qr2q};RKhieioG62G`Gxr_-Kv$+g;3s zx0J2yL4P=SvBP#6IlAWeJneD$Q4RAfYvLvQEw<=}S?WIjX=+Oab7Z~vQ7QZS1Fh3X z&PUx5sEy#`RVu{smbQ`=UZuMWfC9Ihw6UgNE3yc%IY}tJsPzT2GWz}4Z^;HrkN016iA*>bJvJx|IIW?oaS9#qqk6F40W6Ikq)B3L6^G z|B`PV!Z5OzXDVgY{Z)_f9nMFmSf_g{Q(8uH@hU46A~ z(G088D-wMCC!&CU$li;f;5Op1!srYhZO;t19D&o5Wx_`$lGeQfVi z=DWzCD)bonpogsMhhAEJ2>yGOEn(+svwq1O{o*0%ZAee_HnwN_r&abGmZ;hdG*t;( zQQ1u#QB-^pFvyuF9KIe^O!cw4urLOGtCj*I;=z%Chl4_|zh-=0sL~?Z;@X;26%hTQ z3J2tywU&P1^lC2N^L6rT(px*=n{<8)!6)@%X49f!&;6z_9ty5qReeX~!<^(vVhrvT z-5JO$s8Ig|X8;0XgglKou7MtMnQ=LDNSD1ZMMeZdVta*{w#eGs1GELQ}|sh`VDk~ z3(W?Z*QA%jy5-68f@lM%Ubk<(j&Xi&j~XaO;&p9VqpAu}3j4UNclRwy4q-mswUjH? zPgxAa4U6w6f+?zvS9`+*L~4#lL9>Z-PBMYiHLrY7kxk1ra%r)PAg0BvOe0yjoVytl*S-JS?Q7-4kWMZaNgs8_z zYy)34|6|i^dnt|<4os|#X9;_E-LkOtMzYQkTRPvX>I|Hml_`5*q_$XI#X)^}$l%w!3D=2Lyb&wGf$OzX?ADS|i2e|Y zu8R-*Np@Oy;|?n55xh+g*}b_i1U8CVRVwb(T--7>=9wnRE(WrC@tlSrv5P!y^&nNN z(RF#ir!ejt2R1g7anQ%%im`E+PaB;#;gF*DU7D&QcTU84Pi{;=Q^EGj?FTjnSFov_ zy^Om_U-9uz&Q4n#37(;|@^S5$-O^a0Ia&)6fjJg40~7!md3>f}%&OdG|8>K?Z)aQl z8X7LOrLJE~3lKYHY3=set15%e4oa;x*ZDdB8$xEYj%)f5qUy%`7)b@u0%OVrCKdophi0C~bfS?D2ET-&+ z`7;DyNaHeLCJ2F&_xL1(ytoi?2`}_-X{6;I|FYpyX@h4vsyE11D%knKVDwxB<&L+R zc!6&4)rG&NuSBfeo|vyiU=;7s&GgS5$0^N*P3s1f!-xu@LryIIq3%Xh%kuA@)tcTc zL`4vQ1{!iS_`T02j2bo9*b2v=83f6@>p6P(M;J&HGs|X-T(+7^cf1Y_AK~neUHHQD z_yJ7t$$3b`h*HAs`BDjS%VXc8-d5J$7wky7KmeiL)kaj8pOj+PzIoLz=rlm#|kOyDyzz;7YPbA8N}M|A7_uy8ci#yVy`sE>@n*UfvL! z*!GCLqeVMtvObp|rPWHixYs6g&}Ox7OGjI0fJe@sY5m{+E<5L~8Z<M7C;^exnT5kmmaxgY{rk2 z7#5J`0Z3YTqnwr$$R(cWldBj9KRlz*sT1ihE)cBJ6?RB%li$2A&V4lr3rNNlR>o$h zMJzX?`j9|uL81jzOjx5&i#OhILw&*T_-MlVGKz4_4zSVD)|6olfJOqyE(jG{V$HTI zr2k&^uZhVkRfcL-!_B{A0S6Aiz_{Z@zU8y*J(`g=we;WIqp zGc@wignsDWq5RSJ+!rqRnEnVBI|XCgznm5#Mgp#1Dc3lvC!<#bYe?QB$cO!Is}?-E z4?fCf4xb=fdRSTlHjWN?$j?R2^-kRTt>yzM7A(|zQDz+Vj^m9_HjV#7if_~_j;_e} zqrrz3o8pbL|r$EiR}K2Hos_^%0| zCq}w^famlHIsTrT6$4U8gX>Yc;Tlu#5x7;YLDaIk=Q-EzyO$Z%c~*nok$SZlk9tL zrG&yt^BQ+q3^cn4RL-50v~$(6f*-@R@L1-lmGjX?s?3WZ4iW0{AvI#-zjw+x*Bf(j z9lJT=xPy9jyn=acif0C+LQdg=t;S-{(z}V}-KN8sOpYfnsbO-vH*%NzxkA`+cj2?9 z7%14(vKs^C*?F}E8rYl5ZPaF?Su|sIylU2I6Qwrd7UziQ~?hmwdcuSq0HRGbYks`*^-IKG`(qx?LF?6{pcoEPr5 zaJGvZH^DqXLVWRq(JQ7 zyGoW%%q{G@3Szs~5lVIXq*FXOy3>X5y+1N=L4Bw@B98A9ao%F6yj-BsnCut5`D4pF2QWiLKy|4c^&Bx-7zGPykg+sDKZ_jE;WX=WW}+2RGRYfe@F2qa>nu0Qmm;mT**}8(GIS;ko@}zE zvPLG(ut6Ly`?+S+v3rH4)UkNMAFD=rsyutUT|SJNxC+3vWIHOoC|Y@HZ?rwxknj7X z7qbJweve~HOH14tgEd+|8T6Ksts5ZZhQ=4p5Ew6!*TQb%JT337YkRz$F9NBQYR-wF z?-BOu=JF|&ref2i!~^l9GwaeMh`~b?!dV%RxnH)bZnj*CLDGCeu0*U-j^xai@9on} zWM|OjT*+fXZoDrPJ37C2312bHt?viog|-%sW%q^L3Yv{Y@+dn#?@Hht+g~qtQxCIr z-VqI+c|h|S{csraI<|84>9~GF02~c^u;IL|G^uCyU|;6gi)br7Qo3D)cBsXV{t|L1 zTY9i$OZn8~P8oQb+njh1`an185?{4M*jvGWodmZEq-=6nQ-CKHn90C)_gtX=t1UCl z52rpYOzd-V&4;}j0WO>^9ZpjvYuHM2K#*D#m)^Az!jqwBy;!+(lTD^FyA6R`tJcEm z5vTB$Zua?ncedLm4FlZ11DI8=qbT(d>3)5lOmdxETS>RiU1VVR_lF|?eN-aJHGi!I zE@npm^6eWqmji2i_3N-nDR1s*K;yCOJG%~@a-UH491Ov$8^&8@zmJT>@)cqY>iwRENhGPQ#OdP*Hq!XF^ z8e<7+0U9Uvz2*9mT&q^p4%;}po9GMdW9dU{Fz(aw@&@lg$r6FSD0P*TFf~qn4V)=A zE+cil*oj-3=A7xze34_vEqWWot&K^b>cKNoTCX%ns*us&xC4{yHx<{DRJTjU)&r|Q z3}w+TtfvN-XbN5{?7^$o{3;L)?L!#-77W16G;tzs9 zWV@SDMpJB!#cVM*H$-!6JiJb{h)!>wbbs%Cd+$AyS`-iG-nTiJC_A_C)of7sCGCoa z1gpf&eO_uC9;!XOeR(YqY(#|v?zT)GYj(A6n`L_hOFdpaPP|7+3i=!)zZP*_jOIb;pLcdePNOoLN~4ao&OqK=Rm zek%0eXiIcu!l%PTjh~f-^K7f}Gu%Z+*jAPo!Rl8%W!Q%TL(8_Im*23i<`1Jbowi33 z%IOQtrl{*CR-si&W3L*85xJH*J&lKv8l^`gMuYbo)J}dRuT3gKeQrTS04M?s^YdAT z_89hUo)*tDz&!9?dFaBHC$h^sDtVJj8=%^h#q*7PD0V9}kjRFmYXrw=0qXWg3M&3n zVql|1DJ+e%zybxsYq)h6iAQDCPP(j?_pPOIRw)OhbaK77nfH6&6Juj?KKc1pvY3I@ zv>oyW`5x0Q`MI>2o$`MuLS%;ZZJ6Vts`_ke?$Khd-cWg5*{NL#Ru7y*&q_Fk&>$h9 z)uZ7rT3r|8C^OLMsb|#iKWwBpJ?E`qe_^^Aqeq*kzE5QZ{%VeLn5|ZUQ2F~))J0%a zw5q%4X_Gz3Ipn&0otTT+x}1kb=M-nBLx7(|i;d#>tWu?If%f$rCzt_2nOUCC^KYda%bSQOA&(oyh5cb8ZKcQXNMmN14&`E$Z=Kshf5ANDtDzPKj;<- z_1upUt3OQMZX4krjUSEQ_OyBLASb+BrI=B0-rPrvEB=%&YKc zYcaDA^-5uk>cedRQ^Ui~(K5?!IWtj}k0Q!SUOUWX;1{mdE_x;6 zlk+B_ky(P4#aVn`C}pprg~GM8^7e%tb4!&4Erac!67|=Z{1=u#ZeKwlQtfh=|5^kI zRSP0?^{7Yf1?gZD_6qrJ%|T)gy3QJH%t}lFx^G`6Blef>x8`nm!prJVWj3t6613QM z)6!TWV~l5RYBh6`nn4|K+(Q$buVjY*tQ;3MJ-$KL5GiYAFpIj`JCva*e$3BMc7bm_ z`L=g#s*L$sLN})^IwP>N48g%7p8q z!=UNwqnH-lPfJk2;y=Y%g11hX-ftT9C;s4!>kW%Nh{ZHeJVCUrzLbOk0z@1-qp}jZZ&GNo& z)8l~{5v;z!2Ix)oe3F{KNX03DGnPE*995*4em&X9|@io63iT&6XUA7@tncg2M|t zJQt6XJUGA{v4Z`4{wI1+Q{cOS`4-Ena)O-aC*zRb#>ZD@5aKnm6i^p9JLF7tN->Kt zZ7)Y3Val#&5tC8XX63XT>Th|$7e(gL^B`C5^Gdi*57A0#L?&avx(1k zyfWv7dioAg%0VdybXV)M+dNLOzQ4WGS;t3go9+9O*vSdD!}{VxYRj9XQeUo|;+)HcV6EvfycL zwTB|Iv`z7>6F>h6b9TXFwKkKv&T&U@rSDrhw4DNKyT(;=-+8T@)#jB^uM9}74#j_H zqT+I9yrKdkUw74Fzcr1ic}UjTc7<~@>;Ahq^UCE}x0&P3PhT7hvhWC8lCQU0&22f| zIXkTT_5dKyC6S4XkuYT&X=*+P_q~d}ZUe_~Vd6FE1=mU`oBN8+EK=9oIhD=zq)Kfa z6bZtK5$ElJ+a#PXHP^bh+@kGEN%bE!rev>OJw~lU)==a{gO$j1l7g;)d(B56ZVTo} zO-8gE z7jIG#;1M{N0mb4H0;UA&50uQd79TP4E^{5KCbiPXDQc|uN6nkUi^qbO0;e|={Id5L zwAT)stkDk$!|5(HM*GE0Yt&OoJRp$ruw0|&{MXNYFpM5+p?qyBblq}$#3pWP-bBSk z0qZLt9@yv())xgO+@raN_WM`1x@jSFXckiSs%mst%H;4>k%T5#+rJAcu3s6vNo)PkA1_8d|x#o-zMNV)g!|)H>PT<58!r4@x zq1tG!dZ?JOje-OBX&E-V_fP8v?1-lg!sm5Au--R2yKet*MTGx9|76;r z0vL??GBQJ=T4dNLLb;$eY8Hi?AnV8vLNB5vUZ27|A9d>f7xvoiy^B3A0 zKs^oy0|wTtRew3*o&AW_`YN7^a@v(!GWMqFbo+fxYIw``C?f@H)%LSVHm*5)J((@hdq*!X;YB)O^6XqkX$J08GSj-Aad)<+QahT<)p9o0Vg1eA7zO#f?jG|9__-P=2) ziE1sLC@DtiQPMwKMD6~PWx9pz0itA-a%p3t(n*E~85^WcP{m5@r0+oR4?VeNzCd#5 zP=qauAS69;b}MAeWZy7;;Ab~82&9t)ql7=h=?xtjovFI|8_gcN#O=}la}P|pOu{ig zwY4WfUeN#aI4|KCL8lWxf z#&gF8pAbI15}SY?{ZPG=ljqP#{2mWH@?E0{|81_-GxnZbYq`KX$iH!z+1wPBHn9GQN)S}v<+BYU}jJqc_>l01sB!I<_xGoF5wljkj%ugCqmSRkES z4{!6WT|jTXBvy=$VSzq#ziKyHhC$0H??KFwWELN3P6}8E1whD{P7z4pH4Y?aIzCSxyyIoc`>*yVc0~8@0#4W z>P}^0Y6D-y)LBz;e`hBf(YG2?ehv1RWv_iUX6VG7>&wATB)F-_moXPs-#s`y#dqH! zu&iA-ctV^hI+MnDV*|(bXq^d|ZXXaoXUJyqTVI4M?7Wq$^JfD~*#SDzun^gIfBe_o z8$EUMiUv0726611j@h$5d?Q;Gc$M2|A5te|{^|cS`ev~iWi{L>t=uhp(}_4C4A*x7 zWufU1C>`wRU*R_4Z_$s({*;F5+>-K?PDqV{^NfR@aP@IDH_43;d%TF?9_AY6jcedI z46&idQJ(O=a>GsG-7eOyFW{g~2|3v86uadys$zCDmB6_vTtO#c`}sRn)-TUo28)4P z+df*el7n+%9R&VUaCU8|)JIgquSM&x1<&BxPPUN&4@YZ374~I@XqPgKvo~(pSpjUi zYdv2Y?T|Ykv8fpmkUqWgToEjqbDclDhg8gGDey@X)w8Bm9k$f&S?)kiHklCcF8jo( z^V{AIHG6G_m4hB&ds51!L7LYMfmce$eia&2E$F)rnLqlM@aE?UjK(my%*Ayu4Gyw> zCm?ZJZGB+oYfC=5GVFWGBsDD;**W9*Y*0@_H!ZiNvbN4ddm{}FS+6$;tvwi!&obJ$ z?5VFaHrULcR}DbkX0ittsCaMwY?COKcPf!WPo=g}*$% zI$`U+JT;rF-Y$176`0f}`@cd#2l3SWvM1no$#xE_P-R zFd1J} zpN4@H{fgUCK=Rx!5}iVy)bM9xI>B~PZ=0_^%h|7S-mh_0dCGByjm3qM0W+J^V=c^@ z_Dv(bgI~hALR^)R_nZ6n|8Vyyx;!QCu7%Ru-s&3Pa#iO|po;G9vNgO2dVq<|Gnd{{ zHB@6r;wRCR>?riPkCx&SPloK}xF7$NIm&!b}JVyXhjrRQRYbOKf5Fz&lvy z#fZjb)(WY%_Gt2Y<;^05!)p1;!^8P-8STwT4Ru?i)g)WkBOwlmU?vcA+&q; zzQVqCd?~X?x;KJO7NDK`x#%BVJU(R^DKh%>5U0EKwm7L>dmMrFc(t~hISkzYCuMB} z<_tNUnxDQqHgEQ7JTU4r8NkvXdiDP&1<^|sJNbv>}Md)o&q92`fAT92w!RTn-`|lyohd-AVcDdmPU$RZl6r*Qx z1*yAEsXgUD-iRH6inW8jwJ-pUj4^YW3Y2^;xnz(HY=;@IP ziW9sSB&D)0+FWhnLG=*1M;&uvIgmA+_v{(!Atz1E>}u>#CVP|5o)xbRw_ZZKPK3)Z zzDlw>z`9zt>?O#dOG6gIyw9>d4f5q&sw%p zIBNM$1=dUrx2F3-Hwuacwzu~pT%X0slg~fg(b~(Xd;tD|fl}}ufe{z?9J%MMj)c}H zgly#nI+4enaC(P^wO!d{N|I*K*Nh~WM*7>#GW%xL8>(H~wA6VtIWUB7x%)dkS$L?d z#BdIOKFMxl#QEQ{{NkL0y!XlJAvMkZVs5*YM-BYZGEhP09M2I_O_-u?mjMaAkQ)le9=9t_kh$$h`-sPar4~K27g^wD1nTeT+ zjADsD6HL3}M~8afY&Ubcz`C_7n%1=qnveiLPs!$71;x>BT!KmvJHn(a%W0Q7uPY1A zZLf725qsJWuP$8L&GX?xUyK&RP0nP8vAlWQlMdseymp5BAg+TOPq-(pdGSajys~!? zaE;4tr%+x^GP%PinOxmm8-{%xXNHl;*Zx9Ch*t%P^QC0JDEmb$|8g?!ADQw9uw$r#p@RR~& z{bQ~=B&rg1Z~t{xf;l;GY<}^9gGan?lqKlAnZA5XZsE^es@)PIZjQNZ03nkd$ zQ8RX+?yGfI3Uate^PKm7FfBE6Y{AvqrYo?~v3g1XMJ3>oIn{=2zXlOSX=%eUGfO!) zyBk5jds|Tzz6r-lvrTa5a7#Ao5|vB#+B@bnBF%s4=&go}mVGMe6K9rVt^HAU5m1+L zA*|tB-@JEmjX`&w?noX1+`8E6ew?0`xbgWcI;0a|(`~iCb7)rkdV0&Kuk0X=>f50G zX}{WXjKw^wiDg$^o#(o2;J{MCa*lj_vLp=BaZ%mgsTXw-W`|a_NA@zG81g-Kkaszm zfhe5YEEzyWfAsxdM`KTN*O4G&&ifXTT&Ky6E!tdD;^`ou1kECZC4?DqF$Cq|Ih(jG z&fn5B{zVMCX&Xdb#4vg5PCAe_)rh?_wLm|f8K8-TpL_Z_;%_Hf{x#WJyZSM~i8qP#+F$#rrc~fdA&jFRri}KTdq~0=e^*+#MUOmlfx^ zHgseIgwRjJ3dEh=hfc zNd*M~wUNt{cb0w@ES_-^JmBA@JJKbN21ggFxXyAHmyQWuTzc>=5s?Y?EbH*$EYk2> zTJh_a)FMX!Ls*@mSE|VF5k6|4d`fFc=922?@*(b`DY7kQI5w043? z_+A_{NsEva+VyAtJKnkr34M_ZtXw1v47^w_8n}yntIzB>8t+0bG>u%A&BSLN4c1Ls|7Rdt8cgnCBxzBX^l$^i7GwGLAb&vxR@sY}jkQ=lw5%arnT#hNr=f z{!qgGp*9B|==643a5ivR;(e8___&ra!g7aKz{lyfph`6PLX-rg-4-`xP=Qjnlmnc_ z*}1rJXYe-B9ETFe#B8&deU$&(hxF@l1cm*}fY83Sou*UN&TX2e{@9Viz@g0?Xd71z z!Sb$r*MK1ZZZx+<$Ss2F*Ohqdt)JLvA-$R@@zcwtkrH>F%Y_VDX$ZFLy$@0n83Wh2 zm_tQTS<9(>&jcKq_5ED>Eyw$<$6J(<3zLS#FMaU7%jwpq87D3#raFhS)>lNZM9}A$ zUGKQZjcK8Oat=3|*H}4gT8C3=UZtBx@RB;QxPxV3Nrf0`NlZ*@zf7N6d^xo7r~&3$ zr+s13D{9*7cq;s1#OG#E|4{86H$F_XGx@ZoP5jGk{Um>F$*GNh9vN{GGAzcdyAhH_ z&8U_xhv3Ha^&HhFLazOcRQlt+&h0V>8^k+}sh}(45^tpnOLC5f5x!9a zo0O`*1=a(zO;I(1QNy5fH8-}$5FZ(^eHWJXF(IE2JDFP0@+9a=bjT9;HNuvBuroEB ze?5W%+w#l>)6JWWDPwI@KKk^Vt|Kh1^XE!O`wabwBnQV`rpnayq9Im{U+%r1@9%$jKh8Ptb6&6KYu+I~(?!~`@_VR0Mu8sJ zZ&=4aIMHrZn5t%Sz6#QC5J)K$PBu;|-m}?V|9*xv%-&;}FeV@?ZM4w9YwUM|?}Fmz zxD~~BvD;FwRcGw4OmF#P(#oiQ)epGwEHa4`-f?mBZ1=?LB4qTR{c62n-Rd7ZkEiGJ zQ#muDioT&L85a=pE+mSp$VY8e&(7{`7ww_8&}aILQ} zHsx$WrQ7LFLCu~DfplDv>s*>q%&_*%n^pFo?0)ufydQs0gOk}q*Bnyc^v`}D7B0F= zK7%$VdZM93pK|zh=o=$rDmm(`b|M_4Ld=hptvTi{UUM_D&rH{SOf0cQ*p^oR;9~HNT6!>!d+?gGXJ#)A0^R(I7 zmiCpFY^}&S#eDb_FnhlsO9lhS?OhaKF-CW$<)N~$cK}$RF4Yq97kyD@RPjo>4^$m3 zyEi%~#NHq=eZq8Mxl&$wirepws>#9#BXrK({hu#XM#^19JovjDnE7wTl0#>nAa=!08SZZq%-IdOgC1=5#=Sf%Qiv*X|9u^jRrf7{* z%jq=F*9ZAqD&UxlVFkT&udtu7AjEY8?g|*m0IrFbW=K05C@u6%%%I>f@<`RiLdIK0 zK$}HD)rIWf6{i*R_-4VP>87`Xo%LHEUTlyXTEI}P>3hu^$qUH+W$D9?ge|>PSZebR zz2(o-?77tZ_}{Sj-;B;LoB1coqhF1k0ENT;{`Oz#VvYA1B^H%{%PH)FF(G>&{UQ## zQz0MJM8+p-Yc_hu;H=_ zeGFm@7#woe^J=jAY>_MUJMaTWkKPK3q(nWW@|4(?BJ5Mm2fOz<`)CD>PCv zJ=`>E0xvssdVuPQJs%Fau+2&~Yur-`lyP|U_6Z3t+Y{}sa0n`EzoD$y$c6K|z1qoj zD`J)2alL}iEy=&X|BbqCT>teJR`_y?k77A(=LPK&;)qE}*sGLE>1=S7CKa+!@P{iM z?Uu~Nij>|kGBvg!Q5Et1qAR}bm1o}*gY71KzA~jSysQe}bZ%pKKOZXx;175Mah@Ie*)8dDVnPP60uNjnXoEq|SP+dM+~Mya-sKDT%m zsf8+9%}Q3QrPjx>)hY=(K;$_cK3;_(2-qSLAMVssLrdLYT@s|KC^&j7-a+e(id#JM z!YpNT750F0eyK!&BnP^MRUiLVGM#9Mju;1#d`UcTwSy8@?H(T{arBU|^4sgch2va< z-^w$5+qWnE*va*&b~&vK12j@(qp`!MNhxearw(h0F)$^IEpKSsBOh6JqX%2s_X>dH zGSctbu0?Lm$J`D+KO&2NO`Ut9yfOUpUDd!w8~^w}3EORK_eLt;6dw*+m2ltM$0RVS zSqr$BTP$d-*SAZt7Ipu&$W7VBGsxl5EgP4PM`O|4~I{nSJ`i zxO@s}V0YHXQB^|fvkO*1^!O|HM7doSq+o`ozwsTQ2^v}#1AGShu?Z(BZ2Oy(bv@(r zjl~CaDH@q2ssc?q8kIPI_f3Rq*?x#SU4rSKNZRGO!Y%5!1->wEwEkt2z3P*T0WlBY zSdftd_zNt5v3{m{ei>!6Y_fSqbS!e*(`ndViauoYxs@eRZOW$Jy}1_E!JIB*I1geA z^Jv^!mZ>b^R_sPjCyJpSfq`EoH?|;rwvHEs%W>To>+4!JHOk1gNHYAT?c=v2!a_~Y zZ=9%E925U@B5du(mUi~x=Y$=>vd+PO;%5u{Li!B-zSq~odv2`vpuaP`|5VD!2@*qB z^hW`2x`x0{8Aim?J(u}kr_A`Xza2Kl9ypL_sfQQ*<~yJt;ZItf1xY~}4@v4`(Sy}u zfGolOX~oaYe0#^K?OkTbt9|1J1_-WBY%Be+B){_kGzRz5?T9F%`IYeQA{Hb0TBzJ@ zw{Y%#H5K5F-F=LIjEsyS{(Y#t{gzOn{P;8p7LbgvIpFv9HYzwah;}J6u@Tpurum*rsuPae=(pJbZ-4XmT%|}whoF>-%o{iFWRcs6JJh=4G_Vq3EV%9^kImpIW_q`j~=s-&m4^tH- z#pn9NOi})%w&d!l_}LqVMTJ9xcxKfFp5A1_rw*h2AQHPY@|zl^5_-s^r}x~ROH_c%xbVKN}d|t^hioRcT_NO$r2#@pI zzYOil>?208>WE3}UJJVV&LA?Y;%tw9>(~XLV5|Eig5*FSU{9Zlnm1ot3D{iOlcG9% z+%v4C+UXL4n#ptdi*G@3QHlU@F`uW#OsQx}?YrC1EsI}I%Ssxctq9@OQ!x{;PV*$Jy_z#^h|X+p+%;e=Q!WssKq{uxEyEU)1L;K8#w=?SlK9 zac{3($!YyOLf3w(`f>fm zIF9osc%UqE>VYx_9YUR3o34+&0}CO~w4!%~C*Daqwoma2<|InwC?xC2%m^9ix^)Q~ zr3gbwq1=yhk1z)_^FJWzMa62qx^R~|gJ~6LbXG7SMc`I=6G>`*XwxgXS65Bs^vPG6 zv|W8*_T@_lu^rp7Htnq2QNd(<0CX7W%^rQ;H(jZwl#G|_e9o}+3|;&x;-NRc!RxW} zsrT5ACz)>mw#F=twyAYIYfPX2q|{Y1dtV@sR&U`mZ;2k|uMvnqSs%>B_et!!(30c2 zQy7?$+qCgK@Ui5I1&j{HCP1e-D5nAjzWJ$aOZJuM`ox~h#~_!Hh~XmWux&PVq_U&$ zd$VWWd+RZ)6^m50I8nYI>TOrLqsrVxzp(C_WPZq`eMu|Pt6z5O4iq0MFTz*~Q$p`= zHDeQKk@uMQNRx1*f*TKe%b3P{e)DV0G;>lKJYRjkMd{ID z`isQu^`Q*$TvP8?kp`hXwD+)$*5vpAiQ01{qlnjW!-T~;f97oe?PFBI(G;D>l{*y- zNX)X%d)Li#)*8JnZD$pC{gcgg6YB=5531VFHm4L8GW||`W`Wnk`D)7a(h`RA8h&qF z61Yy@6kSRL^!yW#VcznO!S=sdYcqQ34X!ihbpu;y8=-Uhd(l8qz0v8!@;76Aj5EL_ zurWJt3E5$?fnL=K1wjl}pkcn6x((Z-ryTul@j#lt>dF>atd;lf<;5Ud*MieExekUj zEm6f9sH%Ku*ux@EEXWIp7M>tLoeI>UZ`&FqxuC333b8<%vBR%g=5n9CT&zuhMt$J1 zJuXnqR?L<|v`1^Fb@A+I%nU-@m+b`J@MypHWyk(}Ms?i0Vp(ElkB@!Y zy%sUxP}AW*JTbY#gH@Of-n8k_@4yU^4&gv2c>XysQ`Z(*kgdHih8W|6^`O>US(t`G*3C6i4`Il8G?U*(_2hzU0UH>ow^K#uc zc8rFV4jW5?Kb_Zrq`?!Kr%$a@Z$~SXsdvsh7^d$LG0juiem$|{KZ4{c5~hPzI63?o z_@sd*Y5!CmJa2P1ZSrBH>h*&3s?eo9-^*vWOAMva{0M7lF{wO{UK9R$ZFH*;sMdK89E}lMMA&$K0_G9eO+QD~D~v`#|`q;jKnHkZ^Ac&gD4!Nl0z{xs-~l!}eZ= zY$`xE@h^HG?2>%lXz$#6Pwa9As`q3Z%x<_AcB@j<`x)@ySW<7Y;r^_8>s8Lai&$0G z-5Rxchdqeju>7UZuo!cfT|Y0Z z;5cDCD}#d%)u2D$d^A6@H;EL0SAtR`18H@BhKSOY^!A8h^-Cn6I9vk}1?dB%wv#(E z=lR4+cszo{SjCo*+$|6{;r{CPhgP_XxnbdNO{}MGzSc+dv!IPJtwOa|WfAiGW$`cC zTne0eU+s@s%;ki`H;l12D)U?|5ID=oNrnKeh%I!1Md>R^?0b(Pur9WCxCm zINl%350%(ioJmAw&>g<a*eK|Ah;<7P7VeirN52QEigAl~# z!Ub?w#zaODF7otlxGj85H^a5a*z^2ulSlN9RB$0xtM6ny+!~~7KQGb8^SC;b z^+u>q;ZJtw-O%m|!JyUJm+LtJM9WVjWnFcL1YfIF1+Yd%{(@_b-ZF^X0&om9cJ-HVLyl$ZwIiXcYRplwZC zH@B=d@|Co`46Vl>9rPyGHS+iB_h-h;JW1IMwm-zd?|Ua~8N+{Vo*{Po)4$tdh4Qen z8C)@qFBt>dx;5#KF9jt}91Qj-bp6;bU~!cB7}wXWw4ae(lO2@to}9D z`{%{4QYl0J=^dpS`wo1|Z)jgICnCvIA6>~=%|D^-JB$tjhIc(@ZcFPiJG&6jeKF`Z zbayeI?*d0%`b)rv&f5ZFnm?rCw1g^8$MzSwMk%t7^Z}-FuynEGs?Xci22ZUXTU<^w z21yE(a%i!2Iv&myw@NHFsBt?sSc!$?t_;0*31a68tD!}@&l;gz@`PMN8_h^}`X{Ig zI*TPznckeOe69^tM+4wCN}A0#$>j}p0cAM*RfiH+wdxcyxox+#KG^=H$ZYsYE9l!* z6}nFjQU#IwkidcU;>`c%KXx6IrgQ{IODew1Jhye(<;hh!$>`&mnbL6inEnJAF%3*9wIXj96JnWjP`ORmG-WoJWtXw5q9kAYn z-nnVi^`y|{a*%Blw>;Lhu@<|~Gtv-N3B%x&&L2$Cl&I{54J==#CmOQs=ILC7y#4ZS zlw_drg8)*1E*$zDas!l3eLB|yygVZ5Ul;&ATW7g9-ZBxiLdju(Pr16?LHc%(>9&W8 zNT(=z!tJtj>+rXQqYmMoWNevtsgmMR4-^p2vDjBkXcYAJj$vEc(}3UMu*Xfg7_^h% zPq3#he+$Yydg8Hh>oP2orQ-)Of!rGWW>zo@8Hr?NXHr-HWuq$U4}(Aln6x z2%f$vDETO*a6Egyn54l-r7zhz)5g82mQsOX@L%~T)gykjhE;l%R^BE9Gus53KFqGp zBtX&+WwvA9qN%LZ%){o^J;JVNoW}E=_L8#c%jRD4@X|PJifC^9y9~2U{k))K)A}uU z7v>s~;78#!vH?5te^nz~_kA}H#zr1la2P)vjsZce!npPZc~1AEv_Z?OKx*euqHooF zi_ypU0U#Dq_$1i2G>Za#vh?r;D!|B$Gs{>&T*B8ZH$Md(XO7UBuo7d_fc48HI*ptZ z`hM}q8WXWZYp-@qHzA>*Z<|w|eX?=*cDwTfemqMFKsk4o0T;5Hp(|9%PZ*W=DgliAjZ@ss zERI*Di3Sb^jXCYqDJTETpprC0g57T7;z#rDi4VPB81yZq6Sd&G6%tinYL&JxgCLSu zofsB%b;=ks7WK)mN~|+5R$xi-E@`Uzu{E@SGD-ex^u!yM4m9SQ zppi!!{GT1oe}y8W=-Y8-LcyQOwK9rH%m;ha_u2LvSMd`Pp`91GrU09^ifx?T{8fyi zAtq)rUF?fbjzFXZv!FYs|nVXQepHJHdXRch%+h`U>L4a)&Nkb|clMDH#`!^Zu#cXQ<~Kj5O_d z+1&VnLLY&fbLywJ`}Nt)-HDxycVw<^T${6C3aJua+$_zkXSx4AkcmDn-=<%DJBpIj zkRLSokp=Bj#OoC6FNLdqiz$-YudXzK4Tbf2+Zr5M+3d<2A5ZI^6`XHyi`b#do9nk9{1X-#SW%{w>^+ zpcqxn5EGvDYrOKwcmgz~>FIqSdVH|wpfy8Bu4c%y3TD8C{b0z52(MnL$LHbnv}Z~S zWLVxCY2Tuoq&%B}=|O@9R1`5E53;L$4psxTCwCN#UHqYsOMCom%z=!z4`l(#d`HH& zvkS3#u|&)EZsphdk}ab?96!&u1>!_%nn0pt7Y;DpgQ+1u8IMCB+xw|(2NE499nY>1 z#Bzg0UMxRmw8Q0M9-l6bf|qTq0)~dhwW&`tvJ=B}?;unCDwT#VkjkLVb=-kxR^=Y;bk2N%Al5w^aUbsb@q4r~hWjJY&gyh^-0q4;SgVeDmC z8%S%fDrlrpj8UrZyYR=bx6FH3>yBH$I^DD7j?guytN8bd1;w>>3qdk24%rGN9ktJI zL?H%>Ojo=0vcCGid)yjR<=lUcwc!k>_8o(}Q|`3cnn%l4em_@iyS^1Fi1aUAlrXo`ntu1{rl)o*Hw3@w=KxO6_;kB5bHc zzIYD;Ui-5ImeJyUt&bK#wK#CG?o!`%Pjn(CH7_|$CC%~QtOT?Ra8*D>5(o7%_K91> zD%xq(>q>QM@orQK1B=@$zyW_KI5`5s$1K7*|+b@bL$F8XhkS$s~u*E*fa8}l@ z|A@R^Xi;2M-}n9YIeu(Thxe2Hv3H1M2k*OW^n9?M7eT5bu%@>;1NO-U^(C`I@YJb` z&uBr?r;v-mcaOkqccX^#fgJrKiXwB@noN9ZU-sCg+V3tz(bXlX?;QTt=)3@>bbB5}45`l=sx4yQOWkz$F4@01?ke(t79$}=Oc95;L|kZ5Uy5~;yZLaGuoxm- z@fWQ}EoLBLq~`F!=$-v#f6biM+~mwjhQiZGArk+3{z6L|fza^G-e98cyoYzG%3mr6 zWuXL4;(4r61yS6ajC{OiCk7pLw`UAs74Q`T=D{6a@q4d+*OTVoyk?dh*{{I~NW+L; z)Qy!dkuo|o;huQhVW?aFxr486|oeDH@79fS}vFQvo5e2*Jvo@GKKlr&OzUi2r4A z(NnD!d%N&l{!%Ws2jX#7yBjXa!~4!ABSQl0=jrgv?0?eR6O(SA3$kscsvvmHI09E^ zOkP%2b6=QqLktfn1>+yk;AY|<15_18S*XcGJB9fddVx^OZZ%T_e);)rp6Htiz@?V> zDmJI(p;orO2wO|0+hh?#8&adU*Q>u`gicpFnt0xsYoI)TtE#=2@>l9HF^wMDMXz1E zD7FLs9iDH!)$P_Uen|FmI|s>C`3Ya$;G4=JpzoSr7Ngyt8X2jE~bl4Y`C5U$tqy5G7))XjBMz% zxkz81Kn(_#`IH*E9~fSmQd9ZY&N0arx)SEcaSa>E(LyJC>I9^wxn>|z;+{lBK2GH^ zEyBg(Jt^(?jiY*hyFlaBvL4KCxynIQTsr*ez7(ACTg)yEc@MUJOTy2i^tm8%1|)q+ zrkJI*|Nj-Fv_JKrUy8Q*K(0GJ-cU(aAo9lgS+D2XI?;dR7vJlE=KfI?Sa+xwttPJU zT>YNVb&9iNVD$bVjN`s4#Y7f5+}X_&xR}MoHiE!+1)9x3*KgVu@gq2*`wBagJpb0a z7g;2G3F0{nC`Xe}s>}Co|6vzV|J)9X7t3-NupXZ)4v%^&a4ki?1cc(6sW{hqZ-xU(lG z7tr|^ew$4H;Wam?Xl&o<%$$m2wm6(-@I1qI%!y2L4!&H7eG2s@wHe&w2rXUx^H-mH z;RlcYmT~+}7P};y2JdRAa*r1?0CX|iIH8q|FN5Wt5}Qd~m`EbrBm}yM%LbtwoXU?D zFOJ6f(f%Ob_opS-@k#H=!bh^8R90%9?y1$W?7$KBhmB$@h4AQmAA+q6rneT5i2D}$ zXm-C8A|Y}&H(?%*tjVukHSH=`Rr4z;Ltf+E%-^U_{W^!>9wN zHdu|Px9Kx%R6G5{O7P|vzTz9mT^-%#Ph%X=-u0sTcxt)_8BpEBi-G5Ai` zzzg_A82^*t=5w3B1z)=X>6}LgM^!us6Th*t>Hlry^KCGHk^P_jtk(x4b9-uwC{3`A z1P0UTUD+C+5a&Iy3GP&mXFYAe8z4)L?_7>&2gf{7kZMvHm#hYtTBcLTY;Pix%rBbF z6cAm=F;FpXXTK~l;SZ3HV{Cz0(P8^-R%nO|=rsN32Ajx$_!{6Uh=+f%3T0(flKnK4 zi@W_BSiHgy+QA5zoJ$Y}1T>Ws7M(*jd>N*o)7keqKFJr3S7Q}Y+HRV*`C^8w@PL=J z64*iN0yu15VM}~{aEvGErV{9AAqr$fyai~`BXtRm_(=rUl#K+Z>O_=o2z6!(8nsWU zFCII7as1&$*mAD-jl)?Png*bJzqxhjrA}Z-4Mi}eji)z@W6yl#vCU1e)3l6j*_2F~ zvT=W%caWrN<=_p;jmx_JnEF%B3+;r6?$6&^*78i~LuB@oZs$^)-#xF|4ABYQ|h3*WUGnVP^&(l>q{1zv>eBMQ2`%Jj#t z3p1~xMk98{2O7oDCE&N4cea;o=3=%n7hB+d%=w<#f4D6O775C|!yx00d-Uwz8UHto zuo68pR=ca)sW4rG+QR*YR4>{4^3|8!8>A_Y3#FK$N`BPla*7~w(OB?%kML=siu-^i zl#{I~v_H{jc-g52Y{aL<#~q?mz6H1mQozjo4ahm-NIT7^TkoXW18h{E+%Tkv4CZZe zSkGGt{Yb2Y4Cd>ujH%D|Qu=IWs*Iq!YF3GaIi-A1IG_z5^CMDeI_sA?6yY@w6 zV#8L4b+qp;ud{Sz>EJheY%0CNp0aD%=kMZ~?{9kv+I~2Q#V-_}7DnPvR@|-ud z!O8~VYdl@$m>jqeXu3(Q{W~amlV1V9EEJ2@n||mtur-2}#AdZ+InV*0Ps4ajN^l6c0Pfo1Bb&iK~iU{wAZy@<76p8Ht{TaZKO%rUZlaP2UQ4Ba> ziw>bH*WBs6nrfA5S#z^pr?N*G0SkGJ%2bDEn4nU@_eM?W$6N!7`sgNxN!o1c2+FoN zWQ6=(o5jkq-;``|OtdV`3x9o%Qa5Bj+TmS)`i)-3wo6r#Z?8qs_{^&rpZ*pjbt3_g z2z{BUICw#eF#o3=mA1qs)g&H}<-S0Hyqn3;E0@@9^MEwBf7xqdBeFknu_rq9l}U0# z`n^DY{4<)DU^$~LMqDgJLF=;Ut9aVuYQDXgDh26|4a>N~L^i6+q^W^C_Sqf=GXpmXY`0IKxx%L3m8*&kU_4Bpwx%@#SEkK0$|;AIS!lx&==7yK3^ zO|I|Ktu2v|zm658qd0My5wcYL6%dcxhmhn|9*~_2* z5d<2o2C}2o$4#l_E18F~2k(093MaMN>A%Jkyie+`>WD8l*YUh64}%wh3QMPr8rCxc zz*kp|9ZegeNJob>^^E}>l7!1Q3zM30|3|T&dXV*B4OzNB(q;ixp;r(J#%I0`-Uzue z^&^-v9Ui;%-WhoImF6gDm=BuFF1mM_^RqGkxQ{B9tymJ3%xUx(?9P6d=h@?LT025VqCb5z&H-xCC|(RL2_}mxr=HL*(#pe zAUUQC8s2Z<|W#q|6rwi@x2_xYs1gT&2BH;8=hA5Edp|}V~1w3 z!G%Rf&-kwqvgJb67EgH$CrVLlbVod!3_eBapx#tl?I!QFN>QsxPbd5f|Msde>%i8% z&#sNvZoaQ;LGj@D{K=HgXVW*OCKhh(*=w%095cU={?h0+@-;>#3zx{ZV!VAK-Da3a z8e2x)W{A{2b$9a9ElC*X{F^f8EkWFp+I1G8$KfQFy@unNBue~QE5JYZ-39Xftt07G zVMsdl*MD=XY(zpe6N&hCba24xGEW7pCyoYiAA5N?CpH6z)d0huU*T{0u5g&=E0F+5 z-88;6)=fw7Er$nt)alo-LH|93PZck_k7|MOo6k`ow#eKt6|~7n@bYACQW(M=A26sX3v?gr@w?J63s-03TA4Ks`h`HkMH z=HnQ7`&@*?=3Ua!tmk_T2!WG*~)8%4nn7&q*LxOL~C5#a9VOv9nx7? zmS9vL`A*Lt@yNoDv`$JY$gEf}N3h%*1cA)^1etkqmvo{xK5|KnQkkHjHf}wSuRE`D zP^aTO*6+Fk$cm_dkHuj9lkeIsd$^DqX;~rVTMFXR^)_9oD(UUioC6T(F8|a5 z&gEKZ;VXk1bUW!i*9iYYl?W^S@J=J?D!t0?_sncLtzpK9mb#y4w99Vm{y457VdUXW z_xYEeUVYjyl$rh+{}KM;1#!H4WZ;;VfCLyV|B0NKNeH~7IM zt3O}wAPPWd`ivSO==l?I{S3aTj4Jd>>jH|ft!BFhF?%V4rpP3dQMYz*r)OIz{2gg& zAjJH=9G#u9R!y#jY?s|v9;i0(Coh%RVpx^G4W{{gPkCj-i_Dk!YWv(C(|gLkWUXI~ zqnJ5A+jE{Tp2vcc5a$zRfWAhxbkpDDpBI&Zj_PQ8 zL{v#~)traJf4oTAiyCj5*Giz;*4XH#9j!(CiIk3YzKRRz{!wV)c-Zpe2CcUmRxRQC z#L`NUR{rbug1L~#<%r8xDm1ahXZpS}%Qh|JTFtK|D;Av;$MvbE%Q@5ZJ0w|^fi;J5 z#hOt2eExUSejY{cpJMS3w1tKvz7*x?VJQ~PeQlsi*#YhP4U@r)Ql*OU2Io7&)VBEZ zj4@cl(eE>~FNL|=wtM1|>>~#0SkiMRkpp`hDl^U}t`ZebL>sJJ(0MT}mTD0@d3ZCQ zm6yQ`@C*K7T!_1X=Z^FxZ#C+j__6h^{Z+(g4My^G_lS0+iwaG_g_AE|W9CV5&v2`A zp}8)#1YQ|Wh*7~eE%Z5}C9};XzifG_*G^{s=uBx|Hn3imJ9sGYF^Kic`Ttqs9)|xy zqVs|T7}0M!9K5n_8?N|4m;*12TYWsH4?}UWENNR>_f?DORAKIU1;Lxy=K%hZbB^G$!PWD3H2}z;%k}%x zD?v@stWZV6`QIC2A3wa*J8`I9b86LJY-`n$b1&)i><=Ik?OL^SY|(xI9Ge^LeH>Mi z7?@~-KDHdgQDj=hf0y`(3yP7cUPu5bC!MN#wD`FVJ~L+_p{fF7fG_H^z2d0-R7iTs zB4?Q!=Z%ySzp;PP6Ln3kraD7R4H^`>+$psE$^bXcMru{C0n7X3cln*3WW~loCY}o5 z*!#)b9M3)Fhsz$?BVc+jc0`nUSHztSC=@IVN*;&Q&M$?&N_gqgM0%XzP?$F7QCQ-- z|K${;4b#9f(xSSh_`hJQSG6k9ijhBKeOe7}=g8_iw48gscxkB;y1kD*Tw1s}Fn)vi zd>lu8MK{|c{^@fNXtWtm=)oE26YR>aOph;p&I%5HR{@HlbR=l4%T)*I5~v8AVI>na z{63E=w?NdZ|KKn^kk?U{N10qxZC(@p3(WS(xNod^tsx7^+TGvPM0|S8=jPxnRaNL_Gu2>+xmSG z*;O5)?2hoMOj%u0KSUhg5&8S^FZze|jgd zdcZ%`k&+e#@`lAJDAK^#_uwd{ zSLwLyHddvSlDeLrak#U!oNTa2)G~7WS~zhOl9gxR)D)S&EUb!9j%)gPO|mDfT5n0~ zJ?Lq+!l99e+U7E*y5M~^+vai$Q=nF5gq2|@kjq%DEzmgbChnS2(5$3cPKj9r2JgR} zA8Dt%?=&8$`FiRT9Q?bpCy)C6+I?6`9g{1u@ya2cU)2>49BluTOvS^1+I? z)#bO|%Z7@PX{iRjUzAO>Vn;q@@6{NroaMQ?wQ@x_K&swt?ie7mK^HJcEv(b*e3yUW zB{;*%BAz6t9V~e%Rd7B)!pEiJz*!640K&HyyEE*jzeTr!N@ijEMae0+i!IV4k+s83 zda{Nqc6-N_3?tsZAlm=vUs)c*Fi^eNY)hku5xe9Iz1IV5?<`7uBekDbrgm#hA8H*B+|G3AMEBg*?}cffXVY(@ z&AwKYtP1p&-;ZuLM+XoSmn6&vgOmy*YuIx45(+YK;7WQ2T>0d*KPSfeA>fH;N&SG` zfa^vK=+P{O>Ktn(o)orRj*IPW(dWIQYu?N@qwtbd7>Wac?Nx*UAK{)M>s;|i`84*x zSo`?s`WIUjA!s9hf3XSmk0MaY!AwSq8t%n~VsLzZrNK6vyu#4`_d#H(QiG=GrtPJG8cT;!fYinH(6&1FI(v z8CzfkM+DE{_b}F(*M`lS_2u#*1#>y;qxU&>Bh&SUAKi)85lXy2K-W_-rNU6c>msN84^lZnLuu9 z(&5uL%9cGOCq#0Y#bFyQvD;mp+uV$|f{g?N5>Cw4W|xsX2@YJND%AvuMF8dmx5OaB zAMpS3b%NO^Q%+HOkMw@kyC)F$CvSv&3fSUjvMNkokd&JufG%5}`2LLUbC%G(W4m)B ziN7h^DBsfp?2sgmAXlPv+$eC>l0+I6ildUM=}TmO&&Z{u0AW4u%B zAW?fhRPlUNIMO3{R>eH#+cfR7Z}BV43YF6b{v5xzJgOrj|F>z0mgFt={E{VTm+N&V&7LDk+q zYTs@c^hS#q>%Xr9jj;xvn3%;kY>?^4Ey`})OIy#X1rv5Y3j*d?+Y=j9KXCuXA^*us zo>n>nb^Nxc-_^5O*y~+h-*5*Lk}l*3FQXV-``m^6k@AHlN@gQ!j(-RlQ~IvovvS`Z5&Q8;YHwRVq)&^uWH?EmU5$z zwEb{TFUIQ*mx9@T5OKas&C!0vnXXz5zQ(bGBm-V~z70LKzS*w+DsQ3cDY9~8b(^oq zkC2qDQ08KuQ=qq`c;eA2G}Y+#{2THnZ&KNBZ)8xBEqRl3{O|EQ2Iewx%hH<%d%L$K zw~OH3mES95(wd6i1Le@(N;3T?5Y0%^vGstOk0b{NnqzxrH}rY4Z;Lv`TpLz5F}@YN zy9lwiV}^Lw(uFZv=kAd*T3ZZUC@qqKg={FYbj1hXpXsfF2hIHxPnz1r0J2zlzQ zB(c4mpcD?iVSKtY`qZ-X!S<8Xc;#Ik;ODV?giVgM?m?np+|1Q~rHc$P$o5vY_jItn zzcH%~ZLZpKD!xb(L5v4%2^WCt3KwXs_~TDB$<_&0heCvV*`q1|sblI35ked_bXTx7 zCJ~8l6G+W40bOaLSvD5vUz#iW2s(}^OFYBbI9uJ7r6(eEdHb~Iwq+=1D#CsyJieu^ z^SU*g^>UwvxTmcOn;)VY#7!qH@X31tIjC25AC}!tE^?UW5Ss7kwdiTBxmnMvj=Gf2Pr6SR>Dh069IoCjz+~O7+V_oh9IMp@H2(;TvVXfVURW12 z^Q~>1;|Tf9)2iV4MZQul`9=fkD{x?cg#+-yitkQOEDK80e8hok(1oA%&I<^7I#%B< z)9rpPtW zzCQ?tN&*(Re2erWiXb+hxfxq}la#MkPp!8uJ3T8C;}4nMlXJ|CV=M80+2`8U<3YF| z;kO5uOM9w#$KL4M)=+*&gqb163PTAh4zwXA$GA;L+qCdh*Y*b4*&|WKk=>rRa7%R0 zJWonFV%(!L5WC`xvmm|>A6;WsPR;!YttJYOY#~9fmx)JdcUG)O8PcTYiFXkul8PtL zL`-J_*{V56eH>}CfunL4&SJbpoDf=RF@yzT!2?`20*iX~Y@@3E%=Ym4ukD}84##ev z9kPj5<(fahwKFPVn~fld_G?zl5ll4*?`i+?PiK*yJSByU!!m(3C#IXi{`5T&@R^`c z+Cx}U$CM1#$0)pPRWIh2z=w^1nqJD1Z2LaFA4bj*yOZQ1X0`<&0skB@S0;zpg!o@< z2AYk8*G%z~!vYsZ;(Chbtq`nR5b9)V!=LXEELyGCV^GnLm%TqKm^a;qGv2vix$lVo z5$~hllO+l>5%*NU!tC4}y6m0w*ZG27uX-GzUztf(KuvZE`zdifJ1Hx&$c#{&BM{kE zc^&#<%wB}e2>94J*bP4?7a9bxMwNSCNC~=Ma=`t&VzqR`L4X))C@rN6N#AcZqyQt? zD;v%^c*^$+Xo4+FWE*&BAsjBN8ya&F(37+?7cPcXAPPobi*HW|O7n9K7nb*uf=)G5+ z0!3^#+!YCQiv@j_#KeA2y>j*iPoSN<$9AS4=nmU!wdEKN2>UjGq|6&r4ekRwoON{o zM@J$p9z!)wBA+Q@A0R;dxNOu}2mj&E(zmb=P-cLeGuOIWNJz4McN|VLS2$%@jh&0_ zbeObxcQ3y)r4eXW^cI=k+!h!^rc#4^MaSAM6`p61;8we(!QzhB?-K@YLNLI zooduQpQ<-r0K2!DaX{R8_pO8HBKyyQrgm+lh)8YcB@2Vb!b@-uC*?!5x?8{Vx{1Z! zViYKVDdd(J94?g6bBmmcady2ZQtoduhm_fK(-uJ`wvM>ReKK0Jj)EFjWP2)t1>fI9 zSdOZFg5!q|;@>Z9wtT&uldxiLZ?|_LBdc*My5G&ZI8vD#Z3T+*WTIeYBk{Bj= z6P~Z6%5L8cZ!X3tYyLC&RjIQMrxhsJ8dOjJnm&TNe|AJ|^lg()+EQLeTVy zl?wmEROP<~CgKT8{ZV^=`=#1#x}o@26#q#dEnfCdDn9y*#yTWEx0O9n)J|_*rG$_Q zP_xAjurLx@4G>6+(qrXM{XTCUvSdiB&de?1E%LwiSdVj0M|!wxifTp=r>NL}FQ_ZS zsm;g+d#*H?Cn@_|9^`$Oh6zdA$Z% zAUq$t#18?@(T zeCuO$b_x`Nd@A(1$!ZMnGF#Fh2T%p}Wj_U~=7Di{7rkdwg=ENdVY1my%lpioSfeq8 zj*@Z!PX@}5dGBdO=;A{-(ut&Jd9-zvz0FI$?>E8WHTd4iZ-6L zs@^C?*~OC%7S+4ZPTIHU*m@IfU1!O?hkC|Z$f|`?q7e#Y+ZxEzGEy&IYZ7r>uGjWX z+3SJrA)l&T4QVsVf^V7mDB?q9>dWZC4Wa$UL&uqRTygxenlxjsPYEhs`=2`Uexp?`#F`(Tctv{c0kw z4HUp86@xlZ3#*?`D|A`_$ow`A&Zo!BuL+TN;Cg`vvoBu=1AHr*5B>S z+-Bu=v5WWdhd1O*{=(<+2mHvZChPL7eP;cV_7pR3Z~1n2gGtL5=gJ+(TP+7iwD`12 zY1tKysfmjDm4273G|V%me*{+_vHa+}3&)mq7ZOLwJTk4_KRVp^h|!f#uD@FygJXsd z%#v&Q{Ad?y&+1hM9XjOxhMA#6Edv+{oe$>cw#^+@={1DY)StLd;RJZ+-cETse=p%% z$Po)kbm6fqIN0HL8}nI8klSX}4mz~d*80-%RZ{eSx(pOmSjzCv@in0LUhCrMbsfMxFS zpHIAsI)Jx)ZZ1zaGtY5;7L}`E5C>|TPSqZ=1ueA_*mhBlNmJ4vXEk~%8?IG(Ada@a! zx}x7XhIK1SWwUr;`Ct{kPA(bARFZ!@GulF{*1S)?oG9AOe-OA z-n(D!sZ8yq>6!UA$d8{4U}ez(w?E`AZVAq#f27^Dy!I z=4=(KH!Pbd^_axaBK(NVeuuTvC32cS!r3Xb7M2j&t9vM}Byn(bNO1|_iCrzl+MJ^p@83TxLzq7G3s49C4Zb}=^%k6jD%otGt9=(t z81i-45CKoqQn&A7b0qWy8^NQrC} zMa^BKRBm~?Q1mdb^*T1|`1d<;k7us8G}FIMrp_t*FLd43rp1-)J$?H&++S)K^<#NF zqRI;Ngg&a~(N%ywLkP7&d_BW3=`eHM;U*ksG`I7+G5RXm{^N+U2(pR(@c=#sDQat) zolrpwGRK!}T~G|hv4yxu`^uu#&XR5JaKp)V5iNVWUtxr9bl86qK(mpp0UW)*Lsub> zoMO?m9W?F7aaiYOwgG=hRWP~8sPJ;_xnt<=*McCsAm?O6DIpQN?vl|0r1(p_PrfnVy}&}*s_nL z4ZJun7nT+Nr>oWOkAExoQAX#yClMZ_2v*fGeGtLpUzdNdE~L?+`ZtTQ{1Mn^O^DI# zSH*+*P6Y6>L=r6{j7kNab`HpV;a5f@fg zUlA3zHv4N?dC;USEx|L{A@*r^Nu(Yh{K13h!C!4CSNeqTO51rn*s*P0)(NZD;vrU1 z@73^UDzOVu$S9!7wTE*svpAt)@|5n5nSaoY+*en)$!4Fb@(Jy!7*_`NR#& ztqh-P!BxO}W@xb+@iFH{qZ7iFjMoCp(3_oD-9`qBoeZS|`=R}<{Z`+OKqKTOs-BUF zb{$&o^L9sPa`?LI-#;xP%Hxwrj(4OQ84_8`ogWV*CyrTnQ>R-xz9ajXG)n3q>9ZCE zDAMkSe;-=1ET(L%uWWqGsY4RQB1@ntcXfx~`G0)f#o~1wlWx5|i~r(P}Ml8UE-{}<&|AwXL6gzACCam|J>j-@F%7- zMp`#RUD05>Fsoi8OUaATxivF)!*0vpjnp0IwIAu4nVB+T*#Faux1CFa9Tv7hncc_CuA!8 z3^B8iGbJ|uYEWv%l=DZDAND#lD}fdE*vK-h7vB;td}0#_8py6$`3_Evz^3-wwD7`J z6Ih*VN<|iTS_v8S+hT(*fGcG9hDnx*GZ2@%&vy^{E^zre(#r8`<)8A!?#aF#TVR~vxgzpp zwh`FXl5kHHqlWxc#4xs1z7+%HeE8=koG?rna{Gs|Gvl?{EA>y=$Uz5TW&t=VAa z`-Yu|Z_BNHsz`1_e|;AT`oWTO&I_c7!`ZwtwfyQ~LzxTAx;KaNJLV zJRT>xKw1*J*z7oB=38N4O=_z4o+=B%J)FH2++l%wt-mH+zMwt1WTJ?!^mymMX}%|c zud0OvOtytWqmU)Ur_B{VOpkjBq<(1{>ia$^_#X_xc-50cx(jQ3=2sq_+L0G1E^R zkxO@6lhu<$#8T}S#P;~ypfZ%dTOr3SB;^;*w$$j(@2m&LnFtBxVSk4b7fUoQd3I`a zu>ge10GjOs>EYg=Otuo4DLdnK%=Q)!DTB7xPRkyf=FOX{Q%AK2VG(H*U3pjXXW8tj z_C?ht8;lOU_d*0mZ!y&H&+Mcw>PPW@x^G15Z2RnVJ*mTG`95m|?WNy}YS8_!uQ-Q$ zb~7hUqMNAOz*Nwb#;yZ|R?C1d z(;|*aez3jbKT3VmZN5&-r#DLsgWsFUs+{F;=YTAsV{SqSJQr^`6SBL+eeX)1>$$L} z9&ldc66|41(BMpNT`K16(E90Jr@>X>VWq>~8)!qMky%Xfy)iT_5 zH^M0{5d#s`!OI?1L^d?r=pPlfw@|4m`n3nYL$yaz_jc!QE1IxaT8!$=Uju;m-Fq7< za9=i0whq+Xi_VYw;JDa@yMklkCnZy|$rFoPf7tvL1P109o*a|S5@qp|CZmmh&AF=C z3;DC5n4!>~Mlp7?9B^w8g5yhg4H3Xu`3o7Gt(Hd?%z6RIia%(a?f=e`Vk1*$Mzp28 zZ`hc?=7pu(y8L8ZRujuD)lmrBOw&4%N0>-*`tGY zDZtkp59_xK9&Li9t1cu~FfQ$RwpHl$ z7eitAnoT{u{Xd^+A>lo|&H=kyCHkoCdMd7CgYqy?6C8qbtdvS`%tFTjI->TzAtXVJ4L~ zv7~jiYOK<5vT7q;bg6GC#g9E(Ohh>NwS+zCa|G6tdB$KDY;Q;?cj)697CX(YkKm=x zt>m&L+PbBNMNjmGsO~!g@ZHfpx?}X;s{pKr33SCFlxBC8k_H?Hmq8pojaK{e+_CYK zGyEq@$NVUC2NX{*kGGLp^BGvl$}>)?%+5q}k4KLw#SQcY9NOA}bFL!zlTK_2IiiO~1%>ak%>5(S+ouWACQet_!rx ztXM_rdgMQkz@JrF5Y3-lmrNan`&Nm;;AuWi_isQ`5IYx~Ft#`-={H5tHqQqf3 z!X9VQ)Opd2Iu=;|Ii&^5>lZJC9z}o0R|gY4X1@x{%TnTK1Gynntz~E`rLm^2+VxQ) zZAmlaWJH6+{Ss8H&C_tIk4wbvMx1_RnoT?}YkaVFjrtOpP`9Zmyb#SPso~qIGOo9A zf8#tpwCfl8JkdT%fYD5SG4*fZDofy3+)59ussb$wu}0xBqWqJHX~R%=-z|<7Ern=p zgL=vj_tU$7oHp%%5YbZbnh#vg%U#JQz>UM1CynbOS;FIv+S3UwPo)AkIgDqEtrwwA zdH&aHK`hwBMUxAlCgOV(jq| zt%6$K7gSzRH9p(swIPE)I1Yi=Xq^;!IXifGmY@M@&IfAV+Xg>x)BCn)Rh%-_?FNuT zDA6asWsh9;O!qLexZT3xz&4i^mh(p6Qawhe4+==B&|{|s4F-1d!&%Nd5)xE1P0+kym#=m{A~^4B=t`2+9q2UI96*| zP}C9hb8W(o;7W7=Jnnfw9J^Y=&}DIul^6czb}ReY>O={>+<9@OT%Sny%WZlCc4?nd zrfKErikH@R<(bFY5KmPt%%OG2_R%whXDdshL_^SMpKZ(P?@{x2afnbthu^DY^VRpK zE~LDnmFE_oau{sT1%By#S8qE1sSiARtJk90u1=9+zHnMJOnaEKD(;c+f1aCb-%eopNcRm+4^qR zn=SQq&Xrln>D6`7ghxGc{#EvoL0xVC!y!6!E`ZK_UIp}0T#lK%n7Lt|6seQT0Twi{ ze&k$q6z3Tmi3%%h3%bNW$N&O-hY9v`m;eM~{{r%eonABWEXA@xyNjAD`_^t?<>}|S zrr`6pI~Q{;KrJ&dpAQZdr;|iW*qr*tGJj@DWVNT5V6qFnM8jh%xASwdQJG<&A#x|v z#t0Jmkxf3doEF51b0 zIvyvsVApqFA`HdQ%^m2N`^S`J#~z@6`^G_Rl%jZGqgD-&IptIR#-vn|#IlK)#Iw6H zbgAs`v5ZU5+WWN%%q@w5M~CE0S!IRso3CXlcbml_55n3!_Dim8njbj1&xJ|r z<1=cQkSK)9(V1z4i^SZTcw^VPn(h8nv18ec+pzu@XGS_0G``pWJw!6iMcX$|6Szw1f%-q4HAcYcx-$+j4(JGxGYwLy^< zvMGw;Bd><&nLa`PChctBxDQmk*1w+194~px`N89Ln0`XYPFcxz{_G!8iH%KTRC9cY z_gUP3$yMRut%}7N8kSOl(o2AWB@Wno1%LY(2mWOaYj&&_D>firYM#@X{?-hf7}Iyo z0M0qdb}yg|!8e^(7o);Gt4Rn#d64ii`_N6m^ekQ-#hOY5$j6u2C z4-|X`F43+DdSv@z9=ms6Dt$bEJ^Low3haU3shj}N36nggqi3{T_SWs5>cR$^z*t2Swo!o{F7#VIooAn-KNB_F1t82{#vbgTSK{mX6-colCJUSkf<l^3M&HIwL%n}=q{|)x8L!9~m#x%x0hsy@X z5;!SF6M|a^x5B<)Gj5ra=v=t8yeu6kmvM>^v251hmY^6&^(8ayT)LkYFqh9YBMf^TGWwoP zIIdpdZM}L2_%Aj!uwY;15V%Xc(FN$jHh`RJ@MJGl2wJZKFw(jJ5%hbZz)W`AL!5cj z;k&onp0k$j#j24EH2oJ|NR&>#;?Pr|^E*w9kVF=kS3ljMS?VR>5K7sJ^w^J|Y|9JA zwinOTC+btDh5XVKkt!(6L-@Z<%Qp-mtyYJE+#cboR&1VMgv=N$Vs!!du zehq3#9C9B}u;UMR&GtU0hg4HLK~w#Ol$?s3t&vGhN==A~ZWFC8dpOEr+wl~ag`KZ> zm90~a?LqLNtxehmWt*efG;=`k#2n$9$?Wd`ttY;47HVbXzFjx_qXW=!wV8`%uAOJE@k|>*htFb3R$tAK1c5f$^MAa96>TJ0Dh31EhYhe=;8eXIoy@SiX_<11Y1 z8K4Nu3tu)5>F!vVQem3fD&5Fat2n`aKgDPC-f@h0b?bvZ)o?)_PeE7Drlv%lvO8Es zHcsxm(vtiM-w!{7cXMdUvtstXl<8$Msul-T9#)z9T|_E zcHV`DKs&aB*zQ8Sd6Kx_`Dmw&ZEdyn6PV-hoQ5`)f(KnAA$P@_5W~k|2_^t#wUc?u zjcj}bXM~Rpl#6h@n7vVQ^}x^NtX;_(wV=ip77~n5GCiJVJe_!3?ON3yI19T+(P9kE zXTi71om8XTrV%!!hfS?chiBGkYCX8wqvvER{Kza%;rfxuT1(Fsaqm~!U1Guk-&e)$ zzh&L7&ZH5f`lD!e7K3dAe*0ppCLpJ@p@vO<7eX}SbL$-E=uZE0>nIDUkM#;YyExSz zG<6bJ=!TM;b)Yc}Rw_b?;!&6I3T@l?M3*V6u}1TO`0(80nKZNGvu##sN4ZOljOw@+ zcTF3_>c8)-h~lg1H#``Z=fIDwLwQ%vWsu#HFm zMHF2Nz66rKDkS-?Xv5E9KF>MtdrwXFw|vPjJidIY7;3lL{9Viq?QAw+GuP!xty0Jp zZU94C$BTEJ<1~$GWCOD)DSFNBvY7*L%^94x+n9mh6nG?_cP$%yTkP~o{jTrAxB>3~ z0b{Z2HH(9A)o!iLU|u@OL~{fGGB_o0EcANBoER$J*xvHsQqm6l-4tu0;jWN$A}97f zSc?5O+mNS#NrSCqXF(^)02$TN zIMp5`=pjic1XL=&ykbv+im%dnC+%&=2Y1I?^n1?OB1;uR5+lGq?9}n+;p1m2L13Fo zXurYXU<6QDd^zOO>rT9u{Kpb0A0_=gjtxpsB>gQczusR-Rr!_P)>3h*vbgckW}?}C z7;t0}x)*ocS^Z=GAi8&&eq%|2v`rgrVxuL8;fI>_a3ldd?$qjKw?;^7Cs&#%-oLCvI3a*F)$?w$@uWN+%C?hsqFP6DRzg!RQ8Z&k~k$LHJl^S-31 zAba2r#Lo;KPm#z!q5}=1ShZBrWC4G5V`boM=W9eudv6?r)i|?Q60b%|pw@(3!39(> zEtxTeDroHxn@rDF&3;Zl|EU2*lr5!|9JYnqBP1s4O=c5H8cB8%;!)MJ#dy_*e(iQ@(Dc0cI<#0cmFEL z(qOFD)Uu+-CItT7T3Q+#&@;50hu>YkW&^+53rMC9>)D46#)XcNeTLmRhJyoc1{e%` z>CH@DM>QU4!Nvf0`p2{a02AA}*BZQy_90)vadCi?CP5tGJiFz>j1yVT6PaLJ8>XLK zHAb3ZHPF}-zUeEiVWLtOEKkg~S3;}0RB;!lnkNv)aWptdA0(>)k=$i*?*=Ax@NmW5j)F z+p73I=NcPNmrlBPe&G~8q!Vbv*x5d%H7%m|=)!E;&8yiKqm;<4$Al8Mwe9b8f_Y<( z)7~_SolFS)Gb4n@-CXRbKS#+>D^tvjU&@;;O%>}O4irB*tVOw@9I+*J%GTb-dOm-&)1#s$-ppQF2;*9l^SB&ZL|^e&-# zaxe}pxj<*wpw5Mj1^6(3Q8xly4S5>E*~kK~7XK8OmMOh3J(gDs%ftq4o(A-FJ1c#$ zJ}V*8uWGv=taKaA@sz#LUa^8+iK(AN;OYD|;Py!T7TYs#^_VL$ki9ckBu)m0-MkKR zh0dFHjz1*c?_W^ik4*9Ej{p2nmpDrzz(Ea*Gp#-yU*_5>2@W7zwEA$lj+kTTUFeHP zEa*ON)4Qb_(`ZGjVuKJokBnSajh(eW4(pk0^tUekEsYH0J>!Oe-^_i~8WXM=;TBRH z*ONYpaFrMI*0gUPg2yW~9sBJ2b|DLFIEt=t^M?l5>i>Fegn#6jZHL#=nCmpzx8uld z?9iEV*vYPM8?tS&w{7J1_}+H8gxo=o>$8#?rMlUCScuwpi=r%bqc+(=-dJv$m3%+eH03h(>%1F>Z8j0#cmVs=?pPi^jGmqerZ$TjkY6 zb%;OH8ZisMwUl4g#OEuu_c>Y-Myr!DNw4<8V|>rrDw1#WB813>$2VIad{S~ z40!KSJ+t6@xkUT0|9kuF|BLVq)*nW(wi`dvPL%p!iaDG8UM88l;3E0}y7+f#n4PlB zkm@ACV4h)FjT7^x^LHfU&T8yzi}@KTU$hhnq$C53MW;E(Yab&lrM*-ERG22Rs&kVF z+~DiyydjflG1tr&6Vzu2xKFePJ_i@F^KwLIYnEL# z{T}EY##WtZ3tA}Ai_wZXsxOeJRN__h8yM$g(?-%c-^af2ltQOcG|+; zh1OJZT&v=($omjVV94qe4}CjBc5!Ze4E&HX7Nob(O#PG!CX`_8h^VLc1pZa!11ce> za>O_2+2hz$3tWymAbkh&@k@z!7^IWz3~1VzbsN3alt1}A)MsYA1(0jNkA<1+EDpXR zo^Hv`BCB<6%r#6j4Qz-;SXmI<^w`=>!d%Z}#`zuL;)Av2f!-9`DT~b?-tWNisU^r_ zok@I7cJ)yee$^V_c(_6<(8gLKRG0!GLdalZMt4scJZ+o6_!M4#G+q~7U@d|3Pog-z z_51!VrGVii>0cY8Qg6LoLWton4@N4)Bf8Wkbksacs(LAdSxe0&;~vj_cM!)lE-p1^ ztlU}CmWTcAbj5qY#Xn8kD9;WcEg#Oew_L6v(#8?gLPlz8Xfd>F*8fGN?x~A-*QS5W z4hpHSS`p&n@2D|qPJgl7V(NB#e|1H;^%kq#KFo#n4wBaOf3_nxW4ivwDfU0diN~#- zujiI)!Y3+*z+U_b>?-1NXT1{?@R|w2uX#6=gOjUt*x#O=*X#|2Q!~%8oiL1{BIgWz zb~CO;5YyLBmzW~eB_0d>@|{P@!Q5OIy65aZ%9qriN$?W9qH{xX20z2!f%S2lhyQGk zsNjsg)r`1}UM2Kg$KK)Jj!???W!LnZ5p2937yu-zV8!!~z`q%8|q9SU+WP7vyf_0ud9wTHSfw z?wW?zUJ%utBPj*z)%cna)#sxJtosmOy`LTDHszj_#@LgAYOue_`kvN&B&{{ciR--5 z#u$|TKA0uEL#EM}YZ@8ivNoqOLkFmfgPZ$1l&Rkqzb%qN4_y0aVCVtUL$RkCEO4fU zrR*dP5dX_ev)H_baF!*-LSpt3Q#&nkE^v;8s$%Kt^9hK(PyYSy5Trn-E(IDPOD&W# zSw(KDK1E3Ml1Wf7CK;rH{XSRd6%gI`R>Flvwd4(5Je(|R5H6FSwuszKmPZkA z0A4Tol)+Y08u57b95ddj=&HP-TjA@r91$hHsMRT0EJFv?vCW&m5wyAZbs{Rq-}U%z z3luw*r@`c)+0!(gi7#oYF+mtrG#ZCXXRDBW>dIZG1-on}M?@qQ?? zh?Te!Dx@gtNdb_ne`*HAekZ$Pw-|1F1N(%bGk0LSK&bq6uYhhFoxqAbpQ z0v=AZdw$N10C0Dg=Dp&^S~$-y>Gqss$bOWT%hTO`pNHvoOVWQ8X7%-GRNA7Q9y9)-;fAYLIC9*yrBV7}jRTF;l%AEj1xFW{bw_}e1n6^$Z&{R+G z9X7JWM^-IC7PQAY#wO9JPLx}Mb%H$nyQ2V zw9H4%JWrcD9pc!(76{X{6AiNd=-O)7bzQGOU(Y!qJ>^HF-I7T&i1KnEg?b#7onm&f z%pX#r#1?NCow%>ty^a1$->anh_3;F?FOo?fZ1J5WI<7M#cPBj1vR^8zLI2Tysadeg zxdS;`qXPKoKo{S>Rivovk-X2B05xuaOm6c3UqzCoHY?N`$ZEV;&^g%nyad1kE*SFn zb3E0``*oYIhlA5Yx0e>(yy9N#BY5F}E5%qeFOL0*O!j++zz+8pGG-pD{F*FORs*q| ztDeXGR8XC0W;<7R=B-@+lk+vvw+0Y<9q9);RyXD=IFIUt z^@qN&@-sQ@vZRHPKw;nB5JX^zqS{0QVernrQ1=M#60mXdRrm9GBhFW1U-+wh^Lvt} zvsh!hXIiz%TN5Gr4Q%!tNCgL9M_8}5GD@y#PrVk=F?gKwSJ&+VYRSOL>tITRs}HOI zNtutslxU5(H zX?ngt)f}~b+V0F%32)M@lV+Rywf&Ig3eP?8Tq9@BM?^U+CENNcN5Ap2A`aOcU7u-I zRH-UV*Q;-JWgR<`vkV3JV>VM9q7e|mghwyh+MZo2Ge zneYAX+B{y=W4B9pbd_@aN;GQR$%rXdmp#F*8WC z>;E;OHH&$;Z$d66HFS!=Jfj}AY;jjh-e&%)@tAiI7JL87*Z!!2S)k8b1I}j^ULT#o z;M}emm;CT`xF<8lD>(P>1;V_Nx&1Il({=Wa=$1A#Vhv+TEY(?PHsI{JhbU!8N?s>a zMB>c6UOD-s;qPTbt7szC0e} zw4D|~yqWXTg|h8Qe?OruA$@Ij^2yQnbq0`{HBm)Pk1j~H@Rm{;@0n~|soL4*#?_g7 z)=|UiZ|+~%^ojT@qo(Uc)LZ;m@pwGLIx3w$eWn7xklAUpF8Va+=3O>IU9`E!#MQ-? z>d*4TEvrF`nI8rtV3>PkEl4^&qk1aTc3*ny|6#Gh60fqu&K@wrjyr`HcoIYbZnYNz za)6;=J6-I3cwKZef0C;uWrt^h(i4JxrdtqL-Gb<|1dT!3W2Ypyw5CI4Jn=ZQBYBUU zL4S`XZJ71doL5Q5K($4pM{;g^W^BDr!c}FTglnyDUZX5FN~s_BUg{|LprJcD$q_R# zZs@i*7WC7No-oA*RnRv%?1np%!$@qav9dpuV{WVbZ|B)z*bPpBDs{+@8(`gnP>$-R zA@%_qfa&UuZmDQERkL0lGEh?~Uf5)sX01PBkilM%l8X#!Ay!-Y^;|K?J+RP%VC0XT zU*=abF3~-dzT_nW>_OrEAwt~wI~EWj|%xKMij!b?$Ka_L=-$ zUF7Klg!bU^M$Xc`t8Vplhkn&=&r$1R`R45eKvG~+HKin+@glD4`_9)zTNc0as0pNU zjx4)OJL3Zeo;-L3@p@&(JszTKH7%#*ekoHvBA?iZ2x_%#zH zMU0Zg1n=ixwL%m73a7MIl^>ASzI)l`PZKfQn~}_0Iq4^m#GH^^3#o)qBVrwYQw?{~ z`)#V0(hT}ugkOh)Q7d&-&xI4dfFfJ89-q!`e9zc-nlnq!Mq4eZ>ok+qL-xm6{G4!dERw(5={yZq&zYk)1}nmBmi3fLU*A39xn_W>R$Wft`q}wd zb=WiqsAV3#0NuDW)$lx8+8h)e(-33We+zJ>{RdnhdPmF>LK`}Hdb)4Evqz)n57ioG%`fBV@6X=CchfwyCepIja;gQywj>=%z9y&DiyhIKa)a?0jeC)(DJZuXCI zj`^tX%_hrlIdJnYXo7?hHH%WH*5@fqyNSbvimta3g=Y0vDh`s(UF+?ECp15vgwjOw zUYdT2=t^(=)L`I`eLwko+GbQ)P;?d4+*X;7YxzmTF+)j-UYw_F4o~Ik7eyTY)4%w+ zBKiqKG(wL&;K<<`^-0CORbW)Pv7^aZ{O8I`(F*Cjo)W*Q$3gO0c!7>Z)f!Em?diuJ z_2CPNMsJD#__dyIwEb^|>AxpQ>#Jb$5MXaF_joS|)IHU)9wLnU{3P#^F%i^yj?;nd z!MW&qN8!A6Pz#5x*fSs4cc6>Fb`UB05$v=_5P1AAOF=!IfiLvS=^Ic_`6%68Dk!Dl z{Pp>1gD5&5iGMxfk`XA1p7-`bP2q)rcLrhAs>7$0?ugB?b8(OeSNU!P+nEF16XWM& z<}i`rSwsQ!BqG`pN%D)3tvvCV*i+Cs#kQoQAEZ$Bv77kB~$icvPX z0C+>}xG~4(DzRpY=045cEwapa3^Db_kF)@?84iMXEO8+z_210-m^W>*{e9(Ba#CGD zj!eD*AxRsR21DQ}j?wc1j4?nksDKT#SL1i7r#Z-%&n56w2)2qh`VW3&n&DeHWR3Jg- zzTNT#rDQW^aImf!Xq?|{>r-5svh$zCau`*Sah+J(xsvtISQ3t5=G>~EguCxhs{RmmuK6zm8QVVI@Ob|d9oo~6s93d^V1HW1X7x{KfE&bj2)+Y1=?e^a1xTQJIE-+uy#B`dD zhw?M>__{6PbHDAk(4>;^@V+}k{$(i&f$C28!jBA>j%ojY#l-AQEhP8_XdFD9!|M(3 zUCu1jcYyD$zXzV5KcA6v%=Q|>U)@dQn|yB|FOs}3`o*mx<_9?R6%S`u1+WH_4!Tc^ z3(tD9kz?T3zpxp@sFwDs?FVj@!D7kI(QzhAlU1*XXV^8kxsoEq;b93xa*7dognqW) z*AiIBkG?p&thFQdlOkHu&ssYJ!5)z~lxX2fX8vmFz%1-Vcc>h!Yl?&TxIlN4Bm_;I zaKwj7BJhL^Wx@Ne-a<~>#im$b0#u0~DR1X(>3yt0Mbe`%$VC}NgI?=-!(ml2H&^*V zY6T!K#6nuXCvVbt>9aKdY9 zV5kjrlVICCxHy4ab$J9@y-X`?2Zz}lips`JbDAU+Go*7ZMqHe-4MMBfKt}>Azmu!? zrjPBiQ!mCRr!Do|tTxeS$h8+{zcKxk8(BRBedX&*bl`+$;u)s*{_O4L7!F@*?wt+h z@T>vM{A+9ak1h!oW;u%hUa-ZMLZRNj7T}ieM4g=@_6A(gV4f{ZZBH?{gk9xIE@%S$ zS5hb34(lR%k(q;~I|kY0v~%yq?XV(LR^l5{Cmn^>PA5=x$Q{wwn!C9y_+hz`^u7ib zy>g(YI|u}Zc9#w)a+Mu5=1;7O0`=WKzN?dmeLN4$S)Q_%hwcZQAv;nOEZGYl#lZr2q)s%#&2V6zA; zW80AD1f7!4YRGG9`N6ZJBW`fD=kv(KbmZ>a*Pk9^Z$d;CwGX&oaIf0ySBb~GLgMW{ zPRdg%bKA!bGQ#?Q>S?G+E0uK_i!o=n2h)lW=JXks6FT(I%{>y}ae7U2*rw<}Wt8CV zL|Ef-YZD-V4BbiSzbzJ6@*6n7TKdt6m|S}$x&yd zIGAK(SZv_@BWd?lw;Sw6yqfm|+%uReq^{lQDIcb~H|MaC+0C!V*u?~~k@)SiHRtxYa=7&_ z##g@J!cYMAnA^ifNAJ&lWD^$e6%4R6+M88TmiXv#%isO`4(uq!G{_8I)K||{3vC#_ zJnyOrNnyxd>=mq)#&f-EWZgZ`bM}+En}Pl7GlGyCH8wLJt#4vpPp84|=Fkuy*c-yd zFNDm&p3r%sAX+@1H1^x5j+S>4d~z}YaRy(&xJ5$m0NljYd-n7+UsR@7Rg{wDSVjKN z&Konlm-lkemYM<_k?N&IUA_S(`%|{xWY}*tsUoV!>VKL*-Fk8EWh#)-klE2roB4e5 z&~c7+&HF}eR38>y1K)mC3421ESwjlM&H_$h2nlG9n@-bQU{OoJhWy>p8x^E2R)5 zL{_#7(W-w`&Fd)51!Z&we2qa%`;2ky_pvm$TWPjIDWcve-*%?Yo$|ZqN7O?$NR4^% zehd?|%Ul({5J6ROvzjU%!JwM0=+i7+JG$ZFWOmqgQ|TNoMK78h!1jE*ENUQV)l%Zw z)IxfA;W54+hBWIsf7q9Lg{%^8CSGyOqgX8|_D%&hKKB0q`#}CZO`uw$06WM(;-`_g z1e-)58vIMujhJJ^TDdhB7+fZ z`H(fPlbpMb(JxuGGV9(j97s8T&a-hI4z)Zj zYF87njdCTU8BpS|yH#v^K@`ili8~`MSUEx4vNLun`S&LhaboO45xQe~d#=2&! zz5GhCPxf8T{;Ha$tC2E@a<`Sn);UT3I9_SwzA{#-<8SHqO4rOrhOWX=XLScO0yuRw zXrXRBLH&_udzYdUxP^VRZ8H)PaSze`~+)VLtzAZW65+dYv_G^^ns3UsDom!x!AV zEQ*K@DFKT@hK>23b*M!gXno8w6qNX)Igi+wj4p)v09yFwZQxY-4Y?im5AW|v1;SS5 z5g4;(t3VlN0j8KvKg{v)TEa+!GRKUB@ns5sH`mo*Rsxzskl~=8QYULb&~cxWkAVy)y4bc#0Io4R7Nos5s>~n4)uDJ*3QRpoTG3 zUjx8RcF_H#by*DqgELKFjaywo3LfoTvEtqLu1eguI_j5meK)x`8G>yjya>I3nP|PI z7E|9x3kCifmp7Qq$zEGqo;aM)yOacl4rJ<`)Kr8I5#23%p34_>3^^d-ytk<;S zKtfAY8C{KS-KZ`#6ldR1gAxq)xUaYq-?%!0bs$zu(W zD1)i!Z7F8VM*hKsPYx~U&Q={F3|WH8OBOLt^-=wNOh7P&x1VcaMmim8T_pEgwfr($ zuGcf7D3g2ENgXHU^em9?%g3tEjOFgQCgXN`?<#9tvY1pQ{+T3|VLW$hj|&vN4n?1u zJ8vua`Z)f2WcPisM4}#zvzY3%LFe1v!^=VyC!G9cMYCtFMjb6h9ckL>GnWhE{@*Nw z^^~z6QQ^TnJDZ><+{iXx2+mj}8V)b9ZkD0)(_DfYClh|O8CDnf=G}&Wff<2ob>X22 z%aY^#uQ`NRFz_EdqiVZT-H4|FYR8uk!9otW)gF(t8ocf5o^E>_r+$WBAfL8Wasr+W zftD6JZm#p(x07(b3>bz#0?DymP!J|dWp8;$gP%7x7iR6K1a;zzUmURUUmLzKe8N)J ztFI(fDBy8X7RD#$&ZI1P6p$5C<2Dld*9zy4J5F{ST8+t$cXT09;H^)0q#lvz{#ncI zHuIICQ-IeixA;wnnYI0{pdLV?%%fm3}ObY+LV?SRn<~^MYToMxTw9- z)+VSOGo%-tR*kA!wWSD=l{}wBdlr?Vy98_ ztD&bT&g~G|T=lZRXScG-GfZ-nt(f)QhFnAJsPdGA&!a`K3EEnbp`bQPK;!%{^W-58Vkp z$yoYiR@B*r$+)-OOdcKTB07okT+E&!U3jo1%VNAS7f38cl{Gb(>4g|8dqFj-nA4Y8 zLfE&rfPs{$WFK7Zh?L{ddjGsf3P;J5YMx)nbQ5C-2mxBV+X3?xfpVQYDIw-@R? zwkphsr4`V$(BJRe@-xgnCieIVDDVzMHAI?dDDki8B zZ)e$^6r28{-F1Q2gFPy+a+FP`c!;7+*ZU6lWn#KMEi^W)vx@+U{Omts^{pbbd2~=Y z`U9dS;?A7W{DxC@B^A1Hg=*Agc-ES

er-Wjb^!?lIp^^s~zbw8^O(v;;2m)(_{S zuvhR&uR7woW6G8b+oz8i*qy&rmQ>=fntijO-6WsRMJu5&zyS7~Yf1@Tpx?(uZn-A* z-QA!0^$yXVBO!_}yBFFjT<+p^(mUR&jFB4seI3f3eRU(wr&g4#DDf5)`=D~1O?s=*QiZ*q>kx#dQPpi&5Uc`w)W^t%-oHehu3A!$rSux(jH%Dcf9)K zJZq6odi6pDAX~-zkb(P1+V<3kMp0kDQ)$0c;odQWclf`EIJt%xlWduROiwE1;tA!i zKCWVD&`PrRyF#6U24Von!S9X&ms+~rt3(i5aFi`H7X8^={i z;bdIZ@NqBpW2?GHym&8rY$g7T#ILG5XthAi8LfTA)9ayl{^|V*N3n&cG1N8yJ#`gW zkK4z$lql>rF0_)3;n>XzwCQ}ElV_{q=1ys6Gepf7E+1&5(=0BYb^Sb!f<)9+gjzK( z*&jWLc-dy%QG&M)*?1;CI_gZyqgvba>f)wP6a$Knm&=H*TlpFeKFbe3qY;%Vg<3O^ zmbSSvLk&z!>bq?}Zaij>Z-TaE`P#2<++(g`wn#vFd~G)^*&%jij;XaO$mp}x`Ss_^ z(-@yrtEj-JzUMASKZ8hb_|3ZxQ^Q?I5JWD*yaM~o zx(0|ki&k)Tg#31gKkvHAlXHQC5CmzI>|T1uBVi6)vGV3hLQO;9BazE zv!>q0y@&XSptx&B3w~T$kbrw;<8_!u`~|MsA0}Z3j#X@5kyL7`I=y2jk=0Qjk=MSH zUH(Xg>|Tcc1cLsQWR*0Ny`R=GX-(&FD~Jv|vD6O3x02S8Dr99Zjp-t^CPKB!1z~n_ zy!6T}kJ#^BhQQC5u{c}gZHZI0mqH77Y2(!~WW9fURjz;DNjT$@@V`xvf83DBTa52Y zys*CZLFAPlJ>oMBU6zPxklc31Prhnf$kjlCJSUTAZivdH`$Q$|n>qR;*LATaw}Q8E zkt5sFBRX<$vFttgR23_e_-CjM}}$k+}78)58Zs-5{JCzcEBG(Yh21a zqXZCcf4jC%E_{fLw~lppwP;SbX-eWKEVs%PO@=8gtA4^0R6Q4aCNitdj2%wn)1 z$TzLlAND=ajp9ogQ%#0syh?_(QYI2*Py$>xUeAKz61AKd)fcf0}>kM~Z{%O1->uaKHvQB;X z{6umHj!Mwz-KJ>9qf*0IGMO$$PSi-Wkq275=QQ0UGe@bJM{i~Guaoh+n#by0+uoWY zdLHOGHtZLcuv~LW{2OW$moL$vsgJn^;UM}L!}A?SbqmKKz$PwMTYpV8Y+zrTDk zlX&r^Wz2xe!up7>c>aE+0`}BAZre|?QVy%$kze~*Af&`8MAxR-2k#_psSsU_21AfH zW)hF3CT-*nqb84h6?O@*d-G4*ERrgJ+W$G5*YdKadNTU@rnJ}NeWoqNZYiCMNNKf) z+5v86;f%JwY2dr9QATt6^;J|8gHyFX{omCk|81Ym0X2}U5!^cY#`bXy+FeA6-Y6W! zhO5V!al4TR#pvv2<3#g=5{}tz?^2Q01s72Pko!V!xybi>fX|pNMOJXL{6SiyRO`-v zeg(USzB@f}b4X>IOmSvJ3xJhfR@|;4*8}7(kD6*g&$9)RcjI*jJGgi1Ym?VL#YMtc z`{e?%SC{1vIWEt`MN-e{Ss?$qvf+R#@c1g-4jFs53OQk7wWjj84oKI@NOn#=aZB1- za!R?1`WwiPzUp+GUZ^LHbhGphE+?0(y-LpU3?&h_WPazptKiOG&1;dU+au6r`iiH&T52@2>s zP}N5J<_Drx<43vJA`^#w8;R=9Q4H18dUh%1Ks#gQ&bCEVes}VkV(oW^3B32~3+y^X`Dc|CSuX`JW2yxC-tlu1HSi4BTcF!e!;6O-(TwAY%Mc}zc z5l&S{#nkb}kams}h|-dc=AGQ+*&^Ihl};6S2GOJPaJh)28+di6)NE%uLxG#2ukNxK zR^i)!ept>v8iA}%ul2P|0ELmp({IldMePM`SUCv?+mi>PE^gbO?LTw8FZAz6f`};H zI}zKu#wc51GP_aNSzWNp1QRyzhuz`%1bm0KjN=6Uea!#Dc0lw8d7kKmddGs}N-;55 zuCtNzmPytNMTg6>Er)i=3jaV zWpWMX$70|AGgf(>SM3%dex9oCdgLmH1BIV$Iji$d6^NVg2RlMFytAn6ZubGidng#; zKHYz(2C+{)Z@!F_#<2G&IZc>8EFogDDyV+#&pXo5wH*EsR%^Gv4CY6%d&^}r=qVI- z&aLiP`86R#dveUKZw|;o_R`Mur`ymXH>2*DH zFtn9VC!?C;HD@#C5)I zfX0(@d9T)CG|tu!QANZouW7i!ziUiVd}HKAXwZ4$@e}eKwdAg5!E!qn1oK z2tRB7bs7yc74_|Rh(9d^*ARrp_BFeW!Yv_x2JQJojSrn}!JSjR`m&jD@sLisDKRLn#qxE4o9j%svFkEbL$aovq-|`!c?fvxLY?Z7pa%ydaKt zEdyBRk5kO50#Bd$5d^HhF_4II+4Bv!86fSzEi0n;6_U*h;Cw$FBB|&LYjPWgr__4p z5Xa4O6RNUC15=NcTPZUQ?8-&~la_3uo zN$@f|zV2+q=zegHgqmlI5w5DT{#W`myhP{x z(MIcD8Fj--v&!)ut&n22=pep9Nof{P7xcBAHl^kHOkTlYhgM5WHsH3z*5$(AD{ofo zY)_ynuM@hNqNDnVca%digMU|eYOb@afo&F=b-F_Bk!3HCx>4&cGZVXSvF{X&v&kPf zHOHLt983(&RgntIq0BE3=nm<_<=DxGyCeBtkr2Wsbj6Fy6~_{Xe_N9+a;a}A<9hLa z{!7iYi<<_mXD>i$T61N!?WEWdj^yTQld7m+d+VPXResURj?D2dHB7Ue_udJJF>bV; z)`eYUCDk&b@-^#e7Wv@7-O2wo979_?tr=te7jyO*UAI z@LqHDOQZ)}_TWtz^UZ{}x3a<*IOgt1NbjO@9EaZ7I8opT-}`ldC2YD5rr6ZzYgFg) zXmxr?6>ZN_w<0vpdA!%h*=?!W@ zGbu8MeJauzP^!=(&3f}0_Wc4DYx7QpF+G$-=Y6ffFpFBFnkf=%srBdgV@mZdZkk0} z=EVr73@0$BUiKlG*lB$)>!nt=F$1ewU&Uf^qaByS(D8*UmNdRuiz`$+Q^m?PBq+4>$>LA&!KGxjc5!dIC;aPrbW(N4BPgWK7+?5~(XEC>wCu^Mm-L z-(@pe*r8wNdG0=wX{sZ7w9iUCK_J?s`iukf<7nMwGH2SCU{A{Q6`>H4n6dd`pGcBQQ?IEI5xH!pwB>9qm zzffKS$EK7bPLsl$-l+23jR1P;vS1w)5nf-Y4RMRby;PHM?9u4KZKxEyH;J!;qc|$f(b^S} z(Ew^CKAURRRs%2G4u64R$oXmA~*p9#p6BkU-2x~WgXx}aeHFFzhhFLyvr zE%Pj&FPl2rf~UMY^9ovtU+i9@X`H$CXQd;ywhIRZTN&knKXzBPIfIvF;Aa5}wb!A* z^5!cw8MVv@0sOya!`zYcr=*@~F)Y~OlA6_*Y!iU*(rK3s#1LRv*?`U(>vwf3da1-MrfqRwT8Ayr3iVCJZ zCi{n)pkJVni4w;w1-%8zIjCqtl(gFrOR%{t)sHZvBH1PX74uLb-c7FSulB@zErFbn z91U=EM^2k%Cbk!HL(}tD10>i6d%^a7QjilZXeEmF1ya;{+^S)GB3^O6`}u7 zn&O;pPGq+4weGSt3r*H)tWbyl4u+T&(z00@ofYa0E1`*R$mo2a8~!$nZX`TX?7qax zn0$s>qb)9uiE;_x)}D4m1}1FFWbLFy&2X1#G^P3ly}GU;vj`84VR_GGTMtrh!@l|IX)d+RdULhC_>~9A zbm;=@eN4K+fwfC+Y|Q?KF#5*)?r68TUK4;HXqhm}(#o>jH>mg_Y(H&3f~c`<9SdE1 z><^aecoocCA^gR(>)Sr)5(bvN1`D`~V}0WJ3aG?%ohi{8P(ckVZB^OGW{J0e2r^kQ zRWVVQS`o#KdWtDyA*SMK_318M7u+OH`qYogS+*Hrgv6F9hxg7X1!VKg3eA9;)l4Nlrso%(a#`Vl^(ZH|SS{T?mC}si%hK*tTfSR#yFc86sRlSY2Q0^wyWI$ zU$@2Mva5AW96aIHxw#*duya%sxBl``+iLt~S z9EL=M-RT?d&YLLGQN@nR*>l3{O}xR>lefss`byP}p#s|u2Z8t#*@~mkh#9;6`_|YY z`g@9c--Eo6*1Gg6@`oen@f5dtr_p!Pl-am6nUe9*EgGwW5c}(dA(vO@q>UmDO$iUT zzD|amTv%sZ4xORl^dg*_rI2VP6fuN0FU6(tLe*(e0O1nMp{okar_a@9dCbXL=hht+2?z!W37ugPJu`GC zLM}jdxsRQLWke3v68Cf>1MPUC$~wEx93i%on1~X9*5rgiejxpspDjBCd;^BekC)nK zL3F8_D$6g7`e!R%34eLyW(2!RF3A;~T8E`}$us9|oE8EW;i|GO)B#Cg9SF3}+CmJlTlQ zRT!ZtI2QLfMed45z`N+)x`@e6sxulR|2;}N7A;*)l+D5SFXgUHSAB~jXxuMQi4x=t zST^XpP%}Bn>{+z`ryH|nA2*h1g8z+O8DkeGM}80^76k8Biz6b9v^TPU&8gH^;={rs zr?Gq~Dsshp4M@`ka=P|%7>k!hQcBFHz>wAvM8NM_JaNj3<=nEocsHDGTy1-mm4T?l z*Dl|2sP$&KT#Z2OJ3tWr@}pe7f&t2`BMkT5uLH44L7T4EZC2v|!|u`5+qbyqzD;*N z<@Bw)f&FM?tcl&i>sk;}TQ~3g{yFA-6}^{QNWVs`jni6AwjnPFlLVE9F~r+%tO+NF0n_1bxp(26!`^h^bAlEyheUO zUJ^jcRP$Y(1mx~Zx&UAC^~?l{-;wZz`~ev*)^TTsPE^6rD&r_5YV{m&ZEaAIgM!r> z3kg5f=CvaUPf~fa=k$?BoeA}lOS9=bZg3~`LXSB}XkyL^c0RCSYp;?B83Tno7_^!) zoA=UW&Gs^3_wgO5XCCfS$y0aw@{b<;8dT#SVmGURnUiwEY`UAKvR7GHS(js6iz_AN z@`ovVW`prrOy7l%UL5~?_%_2Q#^S_GcvF>mV}@l(Gv;EbOu@7sXPi2*l9E}kStHrw z-mD?ml;%S-M0~=Q>e=`2++)6SUg@N9+h^e~!etz?ao0z;o%CnMBG_}m3GR?BbW~&F zll{1HDtO*TSGK6b-O71W&gzrdl z>%=72-8CP{NVlA$bc20yjLm{t%pH-nmM!&b)XQidF^Rg|k(Iqyb2di8c7=lKx7~v< z2G-xESMbgaX35T*kxlK^jd2w^d6c)oyNv#$cFeQ6SQ`Q2FU9GW#55Z`JJL`x}%h{c1&-7cO?UygJ%IYBS|knZAeNgX`3<9 zTLybjsRT-hQw;t&L_lQEm*%CuCW+@~Ze|7}%AzoC({fJM%coG|CkIK#R`iWYa`S{( z^nKq#y+2wa^b0S!U>Bevm2H70F8;@*Zu8XVRwDTx@2Yov<{=#T#_#jhr)*D|hssrH zRm_D(KA?{tFB|Jlc({1J5`)!L?I7LiBN&6ZdMLp4qRAH)@}ZlN^w?oz^oGMsDQ7`_ zw4iy7vrqqq<(#K31YQ5ikCu_!fva6tjW9L<<7C73#eF>xpKs6i;b87dg^tk}A~s?R zW&d0KNc#ORSF!$w+BjuACq8{CW5H)XV^iO+1r*#4k}%u+PoMCAnQ~iPb9Dei^iAkH za?oxsdy1B(Qm5$a=H&K*)PmI%I0CbevXrRZr)4G<&iY)PUKKr4=BRDX#bz<6v>i#H zah=dRPxe2v=pJ-`X3^P+`y6C)vVU?+__ca(hF3HjW(c})s2!Jfh}D9guj0DGy?n^o zmKbF^N5-bkfJV(!p9vdvn5UcNkRx50Fs|&J4k*noAmH zf_sDJB4-*3-W9w+l`9hIbV**1nEm6~m5LV@lqjZpCYgscCsT5&(0iRC`CO3AJHk$G z1cp&#=4(831(4jP`}M9}+WQBp zP0DC=^WnKSbZx)>79Ae!I>%N$QSB=+1QQrvnsRhz{Gjble|=$s&ZMmjN{v9 z7*3CWh{MdGL(Hf;--4%hW3r*f$7Mh6F|YZLorTHU`kxw#rVyaz30*gT^Djql#OYZP zb!H=azoPOr#xzgJ(i4eW+u`zvN^&ip?%cb~9}Ky)WMba2`AtP*td@6a|3_&GujY?Q z4dHAr&55s868&s~m?v!8izX+pSLO4Om->6u4#RZEU`cwDlmV>JqJ#7A?|o*Z7AN@4 zT-%Fu_i*Gt7&z0$I^l?a%}XXZZ?@Lic{+Dnfi|%xN4S%t=Idu;4i44s3 z`c$&~wutC8Lq%$~zXu;z^D5aK=O-}5t7T;XGB;9K^0kgrin~OX?z$3iMew}sGHh0; zG`=tXZ)nGA`%x&C;)tV2f>J<~#a>uqR}@$`_2Ge$aJ(rfeM4WuR9)@4PDFrvBui-8 z?fCT6#;zA#=@FLBxn&Xk4Sc8v&SIhrAM4vY+)EeY<1V>MN8Nm3T%KU6lHi@Soe^DIz8a%2iMDfO&;5F%R8_%{oy zFDL+w+^V4EpCOA63?_OrjvgBHsVH8bOaF?!xb14)P*Cr6SV{36y0EWVGXV%ZFrSA` zRfDb~Vi#58DzpU5?P!zSc9{;$Qx)GcoDv$Do@oj6Yjj3@$Lbwx$c$~j7wA_w$<)`Z z#lhi&IyY!EKb$>CGB-(b%(JCQMu`Vi{FRXBHYe;m$L$^VbgU?|cf*u-QG`p&j&%FDuuDrQ0{T zid)u&1^Ft0p|CT;G$i<%Z+=G_G*7Ke>)b38>uH&!FPoU@<6{2-r09hH(`@sfP0_mF zkhV5>=}gVXmMsaS4EW2rIDiMiZD)yJ9|};D*pqk!{Cp1hlJgz-gW8Uka!-(Z7`hS| z@BVlHe(cG<`223({%mT-*|2Bs9GF8bCzPxE#=wL<=4^JPeyUN|wB7guzmWRpcX6_D zQz&N43eRtzs8dWP$Iy4I?k30TDGpsWaJ??LC-chQgb4Kdl0BMt#=FmFX0d{3f_}O< zXJrBn4;DKuL#!HC_?6F;Ki&%W1JBHakBo9z@OugSz8=cJbvmZOoRdxo?4^KzU+BfA10J z6|Y!iHM+^j#pU&QIJT&-1M!vCr$$ZE%4k)QRGWzdjH(bUqnhVZ_BkKh#fp5%+_Omw zQQr@oPX&%ywX2G6ULNZn!Ztek#EJ#B%F@YqRE-+xuW>UjPw5T`kPREMt#b|+nSW2uxssZs%4%?3RNqt>+u@LRJtzF_pW``ClD!@#uBlO zxzf3NNT=`hj1DjZiO)uSqu20?GR+{{-|x(h#3l!iVf7G%TqN$CdY%UoMb0*bFgB-8=@ z>BPv6)kvs zji*P<{;qstNheB8X~Fe;ME%Jsloy*}gIT_R zcMIf`CeMSRR-03y*;)!RUWYCPn9cc!_hJ`iQoEe{%A9cg)*H$pAHlX8(uZCZ6$~i9 z?;g@yIWu(XxPQUGm(Vh`%vo}IQJO)nv2y96hExFPnXw1;Nh{7Qz1EZTq*=?by*jxQ zH~0{sHndc}2i>hq{0Iy0AVUwgLVH5{vHEijCpBm7U6uwSM!L(nc&he_F)bb8?ew&K zNRK9b~qGN^2HGbirYUI!7wj+tac zl?GxuI7jeM+RVm2I{}!R-b?Firx}w*RVL{a6B`t!bLr?LC-Upy|Ll`n_4kiBQ}~c` z1noK>My4&CQw9tAsKnU0d#9}UYO|Dpz{pTTiSy`RMw8QFpge7Ka31|1Cx$aZOCT;; zohQcH=7&d2=Mn>$p(*7Y;D$ZbZ~fqe7)!6_&?|}5Gi&^69e=*g+m+F^91W5NmV#n5 zngqr~EUNv+uN4n0X?M42NeWKsW$;zO4$pPJ=@8HyF8y4GeM=LYt(gV6fcij};*A#V z%-`wpd(=DJZoG54saI(@75)yG33&r*xek|p{|>{Pmqw`qjV8`sk}dcPY@d4@9r;IK zQ}a#r4x*-q&!>5^%h8qp8SdIk$m^M~)4mwg*v>gJAp*Zb!7y;ZF7nnL3vk44O7xRMgsV5v;1he(xC12U3HrB zomw2jZ4eB1z|dAt(_$8dacpV%~qSaBUFz2{#FfamTjF7)5EX8Ak2gb1jO z>+O}6gI!G7og>ia61S3g{IDb-t^VSO@e*U6i;kwX+OskNXAr zD%>Rie}u1?>Q3o0LU#jOf7AiPfKtHbos{iyUxeOMh;_X|Ts>s>Q*8LDyX!}h#tNg) zUf3vdhF{;eP_S^ZQM4O4_C>ONQ%3O$vBNa_u^w+!uATu*DG7oYJ1g{!OiOd5Awlva z)0l7p#`g9cjLl-U(%cU)E;BF+7X3wPYbWdJbJ2lY+|`?)MxHHuA+LZcli0? zw^Gj1_XhZ)9*vG0v^6WR*wwX&%68Q?%v@q){WZ2U!EjHJr%p**PO|*dCBIiHa#uPW z#%#AAw9fpvbnwAcQb3yZZi*arO9?Jq@0_|&zU|E+#_20Y^JC$D_Z*{CQE+#wd8Q!x z6g-_Nu0d_>P1MDf7lRRQ@o-nH8E^XTp(S7xitRY< z%X?4IUR(9dS-OJSG^&0f0saK|Hl;K7LMzBdEnRiMA6EB2aQ&S~Ib=%??>t?@;j;uj*-=oWif|&Ufwok)^9w; zNn;43aQ_|q*y7)NHof0l7TB}rllr=5KM+Rs3fo2zRUy`qXP+ep(R4=tB5cNPiuCyZ z#)lT;KQRI;brc|#wAO+!-RQU(9##?%%tsR)Ne<4zhkn3~45n9vI5}&eiu^K6mhyv^ zZYULc{2y)mUn2L-m9GpB@2G86qAHFu{ZkfRCsBZU?!}QA+`;uWa^)S`Y~O1;E)-H2 zuidP3BAv1$M))K4JwqIq?(X(IpB5Cmweym2@bWuJg-3e34+H#}C%X!>0F<#1cL)2O zDYd^m=Cc=`2MWL8yUZJ92y+EVVPu-`0@EzhyLy<$I`)h^_b$T}6;EmvXtf;hd#D-6 zl2(B_Iu@tGdpk32s&2oP{^s0KNqMsh3J#+c=cjhIsiuc9 z48{6$&-Z>B*M}|!CIxSn@_|r2&n)-{y zO?8d4rzj;(b(dw)$lf9nc6JU^e3^QUjLH3>1bL!4C14j?Q_%0N&imx~Y-{^w%le0! z9t&N5nyTU0aV^+!!i&7pQ0x_e!GAppRZi0Kjzp?PU1~f>YzB&-)l=8tUh{8V2~wi{_n`-HJV$@0Zg$}YRs2s6Vxz|Yza#XgBXB|IfA)l zwktnDvIg*Rl(tvXp9g;j4^6>tQJh0FizMo~OVEW>%oRefwMdB8XpTiv5br@+|gcNgVq z{o*b_2AFo3&v$|G?MfR5r2*3jC$!iTJCv*Mj&aA5@!(SN@#;Qm9HbBJ`@1c0?S6nex@quyMbG@jOIlUZJURU#0y3T5C;izc|o0E#gFKvhaxha)CZ$`Z?-S^Z+@cG)1FelAAY%Q zInR{a(%yjZj;%<>#sqf^m%LKW`R@7b>CFp{lbS!r+ zNXkaS3ZmSsBT?U#gSyELs&?s&0bc%rGSz{q{D4(95&~fBl|PQmV$^p+G4y|a`N?v+ zd2G>i#)-inC147t3bWS_$vVf@HaUs!fe!qHQ?vZOY9&Q&lZWg9FF2)PigI=y zI5OK5Ys!*STmppN0A*PJ);+}bmlo*oncJX@-6$@{{kb9b;5)h5Rz{1v(?dA=EKbas zzG346$oljg37K_>TZ+$w@?s~d|#8q#gV#;kYJ$-cK4699qcbprpm0sXB>Ytv1sPA=ej4SC_h%@_-myj%u zNfy~h53Ky>3bevfLD(l45T6-+_qjHLqf@nc_ICjSNlu&Q4_ zuQ+dZPY$e7F~rU2mC7ivf|0m^JbWmyXp~|@zh#}LyTlGg{D?ty%**VE^=|a&_jn#Rb+22xRD_MPoT^){N0kE7M%zcJPqlUfR;jYY&M5l$ zNw0V7bBMIS1w~`4XM?}4ee;J@#h_2}=j34jIyphM6gj|^*XH+4|LT;K7zcZ^^l`ms zeopemmEzg~`dl{>-+q0w=g2$^u)*L~dGimxEIM>7JDBDfpBuQ7Z1?BSxC?z;psV*R zOr>c9rp_Q&*Sj}e0G1j)2G?`ji1lx8cG|)JzJwj`%C3?njXa;xbN9)V2fWbSl`HSt4HrjMg5nkXhP57P-gCWzwgxS4@t7q2v^-O5fffn3g2+oU-PyKs8 z!Mb)GTL83=BNgtH`(1AAW+PU%y|JD*u}^)82MS5p=IW+jx97qt%_ORbp5@H6Pp(x| zNFV=;RCQ%p@=)`mo`@mg2L5-bc{bZxPKO+WfI3z(VdQ&Ft2*9prljNka^mIK#_b7_ zUCT0y#>LDzi6~O-+QJ z=4&k7Y-usbxi0UqD*7sE8sSUpq%h18?CRk`rQZ2XmE{TXb=4WaPh|)n7BvL-?vZ2c zPB#m8vNmPPPGi&~>R>UE!Pl1kf0E;^|6HViP^JySm=W)R4QN&so(%t zR}%o#a2ny_u&@M)mtC3QO~7rTu^c~0&!U_4)wbQ-?Wh^~Y6#Pb^vP1bsLk!i{*AJC zkYWH1c2;|h9e*K>g6->;TYOVe0AhiicJMJ*L?RPsr1krwTQ;%|5EA1>wd?+oKK{ZC z3&c*n>E4?9&SZF-au_RQlQMe+mL`vNUtq{I#>eZ<`4dz)2(hcFv}Plr=PInt^n=wl z)o0Lgfb$1Lw#s1F(b|)BEkV~K)f>CmMlwS&j0uBqZ&-I5Q>VnTTeY_e{8 z{6SOCbV5B7{LyewtleJ%DEp4Okt@Is2yMk4go>|Syya5tB%>d99ryrYXeV8T{eGoW zrymw~JgD+D*ji%w!)AXSX`Jc_|EtChdiJfc^Px)#fbCF$1wh((OGTvY4)`Bfrr zbDs(LbJTynE!^6mkv#JxM5TV?p)0c~OVg@4?&ilWTffH5=YwN>#XFgsPC0Q{#ex5a z)lk3AH5|zNr0W^_n};#iH_?Iw2A7nHbQA@$y;wDE->YW}3qo#zdj~$lZjdyYIoS`c zt6c=p86m5)$NP*O7DJ_*2^<~#V^sA5&>T~ zvd0+!!4;-Q+=-w622w5&qBsQi;W}Q*Q>3v62|kQx<`YXYJMR7b%-yGoEuEpRK<9P; z@ajGa^`u!%J@AP?H*MiFC~Aa~I$@58aDNXoL%lc$lmVW`4Y3W4=sh2k>sH&{&`+)- z8_IM-YYw~stLfW3Pq<<`R4Wn#wQ^_ zi|cclF8#GcA2Uv#D4g^*7I8}jLF}`b6YR46<7VE6)!q&_y}MdIYvOaE!dZJ5QL16A zQK7$NqjN{-i-7$Euk^@qO=~b*7IRvQaTTih)@}-k>*b! z?v<=IPIo&M@-(kBs4{E_rn5J>iwArNT(i2+>mSqV_FAHY+OTO7fn^~*uxrocd)tet^)p6ipa`0kI>gl!R`aQ)!~~xZOcxVs`RVf>Us70k-EQ3~ay>%$O|K*d zkbOM&@4dU%=*4xc1H20L$3veh*xIWa(oBzZrx=4-BL&O4d05Or_qm>cW!wTTHBBnb zi#oEy8KndcW;?(9k6v~@V#1pZ|I=pkxiOa3C~l*~seCp3P7K$S5^4Zd$Fd5MpDq1b z@C>=4m0Fll`SxpmWU2vovCZ-tuzCB9OKCmHlijx`yT8Sc(6Kw=2#{2!wBl=6 zk8jp>LQyNz-7Cf@SFYW`xcQUi&Z8`j{UAs$(@poUJ(YoinmG$Y0ZV~#)pu-3CfOQzwE1h? z%6Alz%(R4ePOsu+0_BxCVoq<6SS!o4O7m-P%}<<68PHy4ek7TP9#15^s-|4JTJ>Y^ zYwr9r4|1Tl#SKz}KaZ1)KUgyLQGV-itv51(z;%VumS#)ZsEf9cp8Yw7y0^c)RDpQF zcXuEN>r|Q(Xm)b7}o8cr8xN4h1C;6)Y1Q%|4KC@Aclr1C7sbL zXHYVS9pEyQcf1L5P|t5y5|#qYR2l_GsSRxl`R>vSxue&18jmLkEr^|m*cPhC$?trz z?hQyYskK|Ce-2PufCd&r(iFo(N}c<=S6`W8qhBA*>T9EJtX^1P^h`pS#Uo+(ZjM85 zJJvnSh|){!QwWUl|EFbY?tR>vF{-5`XK=f^t|T)qwZG}>#3o3JmnWM~l2;;oI<@ZQ ztZ#EhRpt3I$SN~3;Q=qmLBCuYYR;BccFZL8G`eN^?>OVQw`-$9Rg6{3!LIh|&SQ*K z7hHx>Z)(@4dSal1ocAF8sj(*7f$wGWiA{gWa%~mp&P&(JhWMUN@5_{lN9j}lLW2g| z1PYX{F8D5F=5$=F<=?qpkm^sQKO^~#Oy+aiVXpMccln2`v{H8qSN@9i;HmLA@Y#+p z+$3_EK4wVojr&&oabErJ=B9KiyZUAs(8Z}?GZhIh^LC;>%P6P!8~>QFg3`lak7Bgx zG^!}eRY)q}HS;&oLmnby3?ev{GbN`p=HClf(@`fopyC+1eXxvW8_MGfd*$JBOv=g! zlOy2k3-f!kp!a$*9z*Je0<5gCa|JpMm$aRB9$F_v5gTKOcGOapqF+Ev6+ps7LeN)UEa=5s$4G8*b02eotaHfpsS zM1gDNwSdI{DQq=aOKJxqII=9G4rjhik4C7fI+4T{Uz z=O@Qnm)yEEwL&`kqjHaiDxxa$ObR-$JzSljG_v`mfij=GhCmTg;%E4 zbr*6NTsJ?FqXR6%WO@jYLig+pD@DlXqqUIsabKX;%xj#<5Id?9@Y$eEfkc!#4U>Or z;p1EA0V~&IYj|bBG&^f=WUnsx$kfvLGQk{&ML0a?WTsJ@nGEMCjJ0y__x;m?MldNt z)}!ZD0d3yvnrJl7J3V>Xq5Wre6^Oes(C z^8rocrd|Gn=l(TqMha(AF3CAES^R%gy?Z>oaInSISoZrNTHlhsZdTOmK@7r zPNSTb)0`?Dk@I;(4q?u7-bgt!=hHCde3&teZP;(Uf1mI7_xb(jZ@1@O&*$TMT-W_F zXYF-!C}gtY?h6o1G-dlC%*CrR$(R{($^lbnjeCPmG(;C%uf4iKPvsjnvNB<#pYf`} zSv70#EoI=4pvVmwIB+iSfQR`$eABkP!{FZ`vo5!U92od$$-5CW|osp{~}|F^H`~m}IP%9>lvJ z+*LNS*EwytlHsQZf1L)WE!V|w4^DkjU$29rn@$EzPWo3 zN4yYwF7O`w^iS$XdZY~JkMMV%H&lPteG&8aMd8)xh>*I@p6YR9s&BG%pt1c=HJ6OE zgWB?`6Z2_n2V0*;JI1&|dW+xxJvYYCY&xJdC@!e3sO=-`CHl9B(HY2~YQ}f;(oEW+ z9sr9Uh?`(`h+pRVTY8leOy%bgy@25|T+llcYa zD4B#zT?NMYxVG}xkVOeF<5%Vf*GDemSq&_sYfN8C${4tODznm5m~crN7sefS_=bmi z$}n_to+C8Am^~-5F&{y?0dC~-&!P?xjs_GPOyeAp1F1O%*qW1z1Q+=3Xjs$@J=P09 z7u*AC!yom``VXi<)Bvx?neb59O6z8qEsSXL8tK*e_LI!@8qjeJ`2cyJu>t_Ql>?bo zoScH_vZ-0N77{!zq*=}An)XTzHWG6wpX}aVawxXvNfioyd8+#G0>oG=F;@J$jEW`E z3`7wVi`mMUHK--zLDvV4 zmOHLvT67KX6;+1O9zP?8PyB$lJg_C&5A!-*{@OTxzUjEPsZ7RsYTqjxFSqGQ;QII` zS_5Y-Aq8h%j4wDTk7BhYbv@4TntG}&YudA!yIha}Zi3YqO_MAYNMRwd6B5|TJDYL` zLGjTFb=+$(gT)NB5r5Y;s!fkFgl7IdGvVH&L0G=v3chRA;SXYECo?B=cmJL;xp{pq`w5B-!{A(Q5 zQhtcvwQ)&tKD{-3lrJ-%z_?r&(p#4ak*oQ}0c&0W5>$Fu0vMU=;$IFKZ#|7AK4ykWs#59bpB?Okk#NN`Msjg=q*7id14576Zuy|g4~cfSS3ZcYBNow9GwIGS*C)CgWLmsRg-!K+tH#D9?7tu^yGFZcg$L~tBD+lxk zDvKu{9GP#_Kn&)%GgoDnG%2TNOy^|mz0vm?gmv7~CTUN`L(xp8hK^$s0>ki(LgEw9 zddtYuDYGIbDN;gW%YL7l3tV5j2&ddXo|Ne0Pj$3M^wvCkzF=w7BX?WnfO2{dTh=w_ z$FWN0&7z^}TL0fRoPSOMzYD8(81mVkz-9IsM%(@ju7{zOM->}gI#R@wqI!6k>r2BJ z5P@1$bFhx|do`s4;Ab`w;dEWBHbtMdx;>(OJQ8i5I3K;Ve%uX;THS6IGUH4vi)0zN z!y~ZNYN`5=TZiLE8Q=zLLDrhBH_PkLYx_y)3RbsTCz^O>JLW{>Db+K@!nVlQdC`a< zdUOg9kjCsOG`t4Re1Qh&sDzKpqHp#4GyVj_1jQW$bgzcfQc(CO2+a!HtTk;AH0-td%gUn z)fM|Ne4)z^p-$EGpO~N0C`2$PSbJ68#7gZFZu{|ToU+R1abfcda5f!Y^=l7?UmVm4 zdi@bWEJZbARhX34EgPUM20D+i53JM;(xAJ2KW06{%D6esVeRhQA$~kIWwqP8XQ&tV zG#H=rsTCEXA0P+DKEq$pxU5Znv<%F26|~Z}4gDTl*f~~kS z5DBtVB0v_BbE(&7N!DVv{%7qreWeInE0Zo(%J3iJ78Al7`D$h>>k}}mxt&l*H5OO% zMXw}0gw6K24Au_nN!hz3K{Xz?avqM(A@GZ*WYSA^{y*!<7US%YT!jdi^JzK=TanxX zXnGfPe;=^a(vOiE}LHuA8dJ4^i&y`vbfmgqdl&S>^w?asg* zEmwnIfPFP1zQQTRaJ3L3opSESc(!h`ah5ZFijE4Cq*r?j^ZYA6oJx~S_IF*peE|O5 z=IOoEf&h=RIl~ooEJ+Z@9wisO4Q7mnzU5qRdwkUA=%%a$^ zHah?T(?<;$TsZQMlU4haE!hT&=(U?o@Gz{dgPwWmxBscN&Zj4s6+ardr?5!A1f2Pz z@d8c(V5eF2O=~Yx_@lUc{HBxavYZKo9?KrVaXG00Vp&Kup5dc^ zDHgChrY+6g=CctTHU2d#6o|j6#sw$OwgH!hLeG#Dj?F_3OG`d*nFt7UspDfUvB(Ba zP=icH_Lw*NE=(d}vYb@Z{A^`5tjD*`BO0>MbnO4Bvg>Y|b*IEg__1icsJhkItzAXT zA>&eU>?yZSxrBU~;)C`-FLTjY82*Xvs+KclC=hphEC6E>jWjK(T9dEk!?}qKFU|UO zuTjW~);!7wAG7}VODcO;ZxC3)r5d-X+k{aPpIqw;6xKR;OHccNqx$IWv^l)oqC~S9 zt{4`G!laSeT`l5fpA&oxSm=uUo$jkEo2N6y`MNudt&rQ@&+L9&$gLtT@u7&yobV&R zif@5d5w3Hmw7U!aub?$c2HRfF@phZ`IO%-r6?s|8cxLxyg&5iCrPmbEb0wvQ>4};( zHX=C6gE$hAlh`i)ImpvWSw8L7)a{$#IIe!qv*0WjZ1L2y4G?SzGyss`yRuV33N}WF zTLFi)7~@6gbeH>8-<$w?OkKRL^5S*rYu8eha1tdvrL~($zD#kES(OR7Hhf06aDA;P zJH-^Hy*_`CT54FUav+b{b$UH!QC6@1To%6=U4x}j+oiR3J|u|G^(eoQa#d)H<9HL& zKM~UZ$5}pjY9|QOYC>j~+rP|bLne9CNRIQtF4Tcty8lIn*M5iJ{#6Zue|!1QBt_VH z2vxF?IR7_aopC=lbki{!)Us|74MJ1KR*o9|Z;3CDR(5GL;=>zHev2DXuiUMm39R3SIF@uG6~dyteCiR%fKcGJ*lrHHEAv zb`hn3Oy}+DQ1p7qDny+z7%K#Zbr6<3En0=~`JwsJB6h#w_(`1w*_ zG7zWndV~Md)J{Ktvn)XaOyYoRrU#km;Be){wsOVpI~*`(E+s*Mm zH5ZjReMM4yMF(w2XK)mcx41zadTWSAm@1y%C-i50_dyA2y(DIWY4Uq!b)+OX&W0q1 zv}BBD>;d1?XP96dWHW%%n7U|xw2z`=moo90|CDeM6y4NEVK1r)VM)8AS)xwbBpJv! zXfmGCwciMcGASmg_Fj>>$jm0p9umpE^Ux5CVi^UY?gi?{4lOlP zLvaV8(KHh71Z$P{pYQO5Xn)eXf_%v3{ipMYMLdIzN!lvcwZ-B*u>N#WK(H*C{(gFL zYWSK&@7WvXIMs6vsV;00vel3mQN`S&({`q6RvhtiiIkCWFSal)ksi~i5{OJsKZE74 z@$8tX(rc_PW|jV*elSOwTh+h_W7 zo@k8siI%lqM3jFvx`gq{NVq>df#f<*f8wjx-osyA;_LGci-)<>q2z<4ruD`^YZm5b zUh7T0#U>E%czsGcUYdvtTCwyRTDZnAiJVY)EHBfPLE9-K<9r^>RjWPuZ+4sp|8FKg z+g>J{&O4FO6WooKk1k;-H&tzUJ)e5bunnm1uxA+?JfG3h3|@*DYt^H zl2U?@Gu*8Y$naKuzmfS81*LiaA6z}Yx7cGt@)8(g=@|y(mQdW8nU@)Cfia(_k;Kd# zgI?3@XS}vrjD_QlT_M6swJ0tJO&rtVJ7zmA;@4Oa#%TEA2Y7uVW4u+%4Y>Kkb|&wey4yp04loC+^Xlkbbza;yH}2(OUf5o&=+w4VVTt(H2@b=uGNfsLDnbrJ4lOfY~F zi7m*}?9$sEj=&(fAy26$VWmq>bMZ2fH5Yn48xl;hZm(B&QOq=R9(*0%pJlUG@37kI z&HXy$Z{QVIt(ukOR}*c?X{7JkK7a3dqC;P7S=A}D6=A-9l$8rJ2;Q9{xe+HIxdD@E zw>7C(L)j_xiBdNmQsLFS_)7-xndq8nyLkyzo^{<{eAF}nVFeEwh3-QDHvipV67CIG*p#y>>01V zmf*q`m#**3Cn$9E=)$xc)6L|%s2kkPnemUJ0*U8EWy4Y~>p*%XBptBT#tAr2T_u7^ z_+3%Jrm=$)!zT0Hs^8-lR=R)xNnmSwSe800@^4D1HMeBIaTTn-|05>YzR7+~HIeG2 zIa&>gM$xEfnoUk!8ZGZH;(_yHzG|fUWVW4#QP@A?w6R86V2Xe~xP?tN#U_TuE5w(I+a7;~-4mbvAjBiSZ;)4`G9NZKa%U!MJoy%e+1FSj!w-ku3u z%NzPFUmD*y{Mps@#Tmvk+kZbg7 z6XT~35H~IiuYgHS2*1fb4gqq}yG6>I;tCWo?<|9h)t~ym%h!n~FVBV0KGCm@0iEFj z)dNQ!7n2}X9wOeMU(S&EPvVy-6s(|agiAw0A0(q9T(Jb4+W%}65zX4Xq)jN*sbzJL zWGtQmrIcM@`weVW5IZ=~`W+=+A)d1GE)}**D7EgDkq2Zq;1~kJE`cK6@pr9OL$s&A z_Ht&~tYcALZHr87H6EYa%!9E7mzVuXl&9WIu zWI9{XP=Ok9xifdwrRdlSL2lOZSd^Rm-cp=m9_~IToGzEWTn*S=rok!ZVe8wZI`py1 zf~9ssRp=7^CAc$PIvsq_gbU?@E!pBXZRvARW!^1pf~tqr;PlbIdV}_lr5oJtxNC#9 z4puoht8PFJ1!c811e@?F3$Y=tRr#G(nRo}FsF#G&(?$&1QF8r-t)YujSEiS49E*g{ z;ho^%=hl4TcCdIj-jhftOq{;cQhYG8VMQ%isH@6U5Dfo_0^IO0O=Bd;!u*HvL7Pvl z=!Iw|@lYy-M+ux{uJbCerfg^W$856lE}m2s`oPJx^$8Ga_R~kLO>!dm(tV2ibQ5y* zM@CntTDnE^+^MkHx?vQhktD%OQ6^W(f29@Vg>cu@Vk~${=AW_+)y9(4D=$(Xh}wCJ zn`>9DE57O6QuHHp=l{|gGbZj+dde@?zep!kq$zaP9#2eDT*|7LWyk1umoTMgxiZ`uH z)nSeyKqkGce0e68^-8o+9a|^&@D(_#R`6-u(&^@#w1Hm2-0j{2=2amZ5Q!%l6tu2e zdvwKvtz+tZKAF(WG8nJVJD2g|REcf~-Hr56##ZfaO3;aKE?rfvyNco#hIe$8|J}G-Qhr9WAVkEPBCrP2g_XVdqY^e zix~`g+~E9@yVN!|F%5)x8bfznK;h?i%(5$)*$koN0czI$bvpf+hh=Fw*mCWtlXfU3 ze+bXDTHA?%HZRl@^O)2a3u`Jl9)~R`!xnC~(DvxY2Eo`|jw^kC*28waPx`ByAD7n< zCRM18x~4k6MmwbYaIyHEIEHP;0x^1SK?}mT*Q16ETIACL$+21) zcVE`ldDYBC+k<3k;0j`xy9UBTIqsV!ZTCXo5QPE{?WnxY0@)gcC80?{AMNYDU=%60 zu`zK6{pH6HREBqyI%_-;WzBU}8q(`yb?^+?5^4od2MU-evzj!Pnc)oWtqF7#d)B&Q z1gEo5hVLzd=}r22OyXcqX1eG@> zHZ_@#&NLLol7J*dVza+0As_t%X9DbR@iZRXZ&hj>2$-!!)$k^YkxkLE1flwM)YJ6} zA4}17m5H)XzM)bEduh7G!bA@SOLP%@n%+)9F4sf@7OTZ*Wfm9zkFKHqfNwF?p;P|o zr+jA9iS|h+P334!`?wHeoIO>u2Fp|Tnk|ViwD)BgY5mC+AjNR8-|iR?BFOICdZkO^ zFix|BMM^=()DB?&$Bjoz``&+VTVH4QoTj#}Y~3^{GrQWnxS2G=9J%JRxAK*9IUZ>% zcC4)v2wQ8OzrdGl?685?Tuu}Zut1AQQ6oQ2$w-I9a^k|jF`r|B8 zaHP#uDra-NJmV=y9>i$sP0+Z2q2>k34Ys0H4Xf@-;wv!0N!oa??c57e?pOk2WE!t};bcAAv$Ko|1`p^)>ZvoOr4 z>A4k}CwfeVuc|+>^;=HeiK8>NAO(yfd7w%4oX(b=iwzt^BeN?x_QO0+Cm~P#CcrVJ z(;OR5vcJkN#qDvIvKPpV<=!)^PPSV(Z48i2?EV<|Yta>2P9op!CW0wKebHw`px3$?)m` zo3u;eb4dC6%^!@A3Z^H2E?PG)CGg+<`YD0qu@_Z%xiFji*K6CU{igMwijQBIezn+C z+b{BWqZNQUJJ9znt-c70)_|7;Q41xFp*B;|gm;~Yhtpm}BT8}^egL)e1MW!n#gMw1 z_xY|y$-F=7s?g;+-*wv4eocGFVZX%6bMtv+<NJZ}GHLICpWM%A;heN{>%QWLwvzb#lL%i%edEEAR7`y=cO_6aXhE^NJnpFa|X zH)T4!R=3(u>TivJymlHBZ-~fcoM_i0-ab61H3r!mJ(4Wvd3RrwbTczE=lFj1(4#}E zF}A3x5>g$Z#JfB?C3{|6-mW^w7IICM_7%pC|5#*VVTtSzuDB3$i2vLt?$=JP!QeIV%QxWKc zU)GGD#p<+oIq7iFn}+s>-TI%6wjYNp<$867?#L#C?--MKHUIc$=P*iP7-eR^g@3$& znw6cv@Lnf&UYALyZis1{~aqV|bL(UoG#`pH@XaZ^n)}&eY)ApIiKM z%O}~CZJDQLtU8hCbn0vyC7zG(%nRF&TG`Yf zW<~Xc;Rw`Fa1|Yv$xw8{jLbAX0iX22RS|<})lW*xtE(3B=(5L-MjY}M-g$2X<`Jn; zw_9>G53hqL3$I6DG*1O0zIcKQUajwN#+|!SBMNo6KGDeibP5^5USxf}_qna>%Snw8 z6EPRFTwSZkHx~F*pMdo{+uUllG7=Z_SNz#=WL&??DbFA1R1IU&%u3* z^W7Bx*B-q3`<@H|l)eL{YZ}Yb^HTKbAa*a4z8J5V7H`9&qM0A68MCQq)}Pz7WjQ5s zr2KwE=Xe^>nzd2=26js(Xmta9vJo34!{(t^qVrytxpzz_ejXClX^WbBEKYz1=|x`T zW?r^#eHJ$vL3g14c{rcX`va2G77@G=!2f;+<}LAUD>HXeR~W2?JZ7O=3VRI5rA|p2 zM|2Ld=WSXE@s`?FnsGKOwski{S$|D#pC=3zz}uOcs_r5RoTyP;Z?p8ShX zn>p{QSJz|N@sslqr^+9`1&(RL?4&Gu(~+b4%kq$5R=)`XNqXl4V^V(!y_c1_Mm@G! z9b;4&xViIIKIG4iqT=UeO2*t?fv>`|+J~VP@7@P#0{?ryou9+QQ z$=9m)G0Iwo?m=3Ag!&L~iQ#?d){vpvpi0etbv=aE!*mHao9OHL%~=ia`M}NFx^XII`!J+osk?C^NPyCap6Cl0@( z)|UDey7icROB70V9_s!~P7?3LJ3*|zCwU%~XO#nVmuE5Mbn37ge9~2Wq{_BiZ7u9K zDCGA}@PPQv?CQZkHr1=kdVtGTx;{zBNuif+YPx)q9Il#6*%p_XboMQS$HO9Y!OJG$ zKSSri{yjFmsuFq$9iHeUMb4VFRc9@F>O^`V8&hlOaRsRna`I0Wd&HX;+YQc!SF5?4 zDxbQ(+3yY8ZD{Y|ws~4N9R_VVJwFatqUCn!!+gsk1}|bHZfJ(;Q*UAgHadC=CwT;a zxo4M|21-F5QJ0!&irTx1U^d)C+P2t9do`4DV`sdrNBLAUG&^#m1f>Ju@=7S;9oVI; zCqMMI7=z@Y_7e$}w^0M>U719-;44d=aV-5W!a~_*5xR67rr<8sIJ>k z{k_!+FR;!e&E<0LB3z;y z;0ivv42S4S^QcxM{3rGh(>RR&XF#aV)!Kbd@0ZsIu;PgpMZN13EXOmI5M+(fbxh(W zu!eP|rhD|s^{DIZhOZ7?g7a(?TT|UnjpU0D|AN`~XM4;u;9{Mg%bFsxNMewoa;#)= zt9JtWYQu{g$1yHe{~mY0+}%>Z ztp85qE=fOZPoI}Yp{J32tv!vU-B=l_DUis^e50pRg*nAtZ%78E%GJ93j#i5JI3?tP zOnz+2{n@_-u4C*voVj~fN)Dp7l(DD3MSvYN@p^|*v9T-htA#@BaNL6VH!9=4G`nKX z46|K9sqd8|KQ5Lyy-Hn3XS2|r?IWhbfxk#Z8W=M(!CMn!RJ{@5Z(5-$d1Xdtk?ZWf zJ((vw@JE)R9p&d}gI(>AII*Ym)L>5u%@&xG&2`St%IF`HI)z7Vl5GgVJz5h64L~Wl z(L`*a4WTG(%QjpizHq6!%zwNEhF*GMcA4TOjtkH_YH%-yzj`P`HS2jiM?{d))STk( z%#B4rUL5!~+Pj3^4_nCR*fpLboysfUYX2U>p@j{Li?$=XH$g&^p>;vk1KhvuolEo} z(p6jG6^&_7-__8b^dwPIFHH!4o5K*5FSJvk|Hf%@g_xKnp zKSx^k=!O4etZn9avggpC+nW7F+H8~|yY-DvG7jd&vdp`GUMQZ)lDtX1>d3%5LdObz z(xASQ3c^}!=xrCbed76m6R;K?p+<&2OouiX?ry{YqnDQ|s5@CWy8a!g{gvAxds-H)L^#G)*c%X(4qD~pQY zxIV?Hha*9%XztHO6%&M#ir?dX%~=fHbQ=ldSF+}cQh)a5ZrBy-?^wcl2F$^K(MWX% z0Fjc0?W{D$mpRCg3$-t5xgPu+aTJyy(X(t=|p#4-9{jNi4e@? zltwDOMh*@m5VF>A_`vuA=T*5c1$t_|p9(#9sC>*lb|gq%GWkj9@SN~3?Q_zsi*F09ot7lL>Png**C3G<8LGK7wN(Di;RsTkIRpLNiAE|olz7YQoHS%ze#C8 zrcJ_nh9VTH9~uZhM3^2UM6H&}G9~2esvZQ9u<_m~%}>&6elHQyx=#;A+n86sx6lo< z|F-l&w`+cW*(hP^gjud!5opm@cav4MNL zNz9jb(W{Q)=)%Ar!rq5K%DK)vSxB*^HY~TIb+Z$3!I8XwO2FIQ?GI2F*^YVQs{KFE zt&@{UADn%qd{@?ddyG!+Rm9oadt_8MS4OeA34ONh?pFF~T8IyCZj*3+u2tBYYpxTE zxdz^NlMiIiwjw3lrcBT@cYXPP4WGB%Z}e{lKtPf-+d9jtfw0}pgJ+_VPBPiYIGtxv zABdx5Xcj#vuIC-PVU1y7032~`YnAYxJ)I_pl%fac>b7q6uYV+SwXA3o8eVGCH?l>` zrLk*9&fTQaZvugRvI*r!J>?o1&u5V8Z2;Z&Tn?SSWRUh@l=kcRI&+dzR&y9xp0@Od z9`IXvb=%1D6#L1kJ*|_&g$tVwYVqS!B>IzYJyp0Cb1D);Es4Lw_XLm^w_N zf>Pu|f>^t@E1Bq)B(F@~r$8^QSN|y~!N!XB*LH!~keAOpu2+8<{5-atFm*VB>{oH6 z=qv8Hbr>St(ZGhs=yC!>S61#A=X-jQdDki}C5)UBd;10f{5c^>kY0xlr+o%l_uWN# zj+_??@d1dJ@EhqJH!BhR8Jt`<>9fr3S?@hnHl3iHY>!;?s3ddo=W_=wbG^`3C2;ya zCl6beri#D#n$Ez17O658sCC%JD{8s-PrU_%4>3gQH24^ZMt+B#V(?EBDs`W4s3RVR zZMN8!BCG=^G$-cH&DDMX8lTMTb`5_1Y@%h`rF-e;dG~&$roS#4V%j%yoa2kt*q%v! zozs!`gALXZdwAy2$H51VxivXoFV*BqR-E!S|1i79@@zTifHrjm3fomKf2EC4oUjST zwA7a;HDs?e5O!XD@vvDCay%;E(Ve0sg!e1umKqh11>aRjcQO)C+;nI zel;HMTf#F3E}UD_k<$s$sZfb6>dYP0`}^N!>H5hg{J5HTlYiqDCP>+Efp2fucY1Bw zG;+To?6SH=$lY_jiQqr#OFi~IyZ=r1U6Mh=3(k}13hqSqEs%b&td-v-o|?tof7qCc z1xf!nj;Hd;B!DFsL4Bafcb!|Fu|kP^C5EIE)bJ+RI4YexRC@IIBLLop%R!9 z=$mZpo(4)>r&q&MZz_87ekEcOJS8>ADr~eId75-H(R4qj>AWQgow)tVuCkANL#r~- zOu2VrZ?5E6IJw!+8br_^?lQ3rg3{)kO{aTWVP;`z87v zJ)*W#UZ!2sU-k}Osnq#EF-N6q#|AnFgXcbD0@`0`QIV4g<)L^FkW&}IGkQjM;-E%O z&U@pA!`Wi}l`TL0weFIXar=;kwNF_A({6<;8D5SD`pdG0oxUlLDH8*jvr@aYvOg#h z^nH2)@S?gVbgx2PCuWW5s>x>&b$@fsE)icJm`Gks6wy%2;63Yx2XHj;ojPqWCe2e7*j0 z@5hX=z1WkX+>jEAKYHrm)!b1TdcW@a$*S0KUUbt#uH|s(9p8W~2zd86*5i{%auNv<7&k5YPEHLXBd5t#R!7*7-D$S5Fa9FIVm7B%& zWdZh*^TY8^E~V~DfZL3*G^xt zkF^UMvnb~43e@y&!6k+2SR@Z$tMn}{C=c0++8-mWS8952RaSi?DX62W5ix6DWx6q0 z^$S&uzG`3hb=}vQ6z%Y_P(`Z?bfQp)n+`m~_5td57phH9q1$@y zRDT<&?Dyzs7c|AE>yvy>9kCsf$j}6gQoo*JQ<7yY#)Ar~Hd&bkrIJH3n>xh)rol*ShHjzkp zEnjm@W8m4+7eYMX=rd%cA}6ySzi!xFCYbi7bk+`Xr0YJ({tdIL`)M6B%GnCfl4vQ- z;z?M^s1J6Urew8&v)Se``4`oh7nHicT6+ifTJxZ3!}gSi7ij;CT6$?)vrX$FRAt&S zPUL5$Se1Fi!Lvk#L!}(UP?ONb$0YPIov_2i)^k@zTy->P>!v+@?|59vHlGK*SkJq) zD^j~(PTNOoZF)Khzc@MOf@@Q&wSy0P-|oM9^XqDS#4D-|;(;moAnCceq+ED|~CH?SiJIdSsl2rw_;a%`xG3fX|u{VWwB2i`^*1B_}4D$6geosa7W3UBwKitzEFtBYLUj~Y~7 ztXEqj3QS?e!ei>|lJpXSY*pCy!1?iN=z5Us8aQ>a&;A zV;Fi~`=468?wq~-hd1o-zP`lQMkePa=I)s7IyzX5&2A(GERt1GxP7SdXmN(`#X9?Y zjUcYkn;-Mszxj%YcOC`{gmz_W_%~hat&x!M+5Q{*=G1+mp1%ol9}%Vl>7NS&*t$$& z`DWLF;(SFye|x&!mi{K1d?>levB%H;QYh2utmK1wfpC)=jjw<2s_4fW?G@7Y;Haud z9N*-Jt_62+M1)Ppj^sGQ73uC!Emh5QQ|X1wR)z9-MmIR2Z(GiMcYEDDN|qaZI>I5P zyM*cL2uIxVuWU@qi<&SaiC+o|-aVaa^GV00d_<@4R`K_3H^)I_ar=STPWhn*Gtn#N z2s5OYIXYb$ZXQ;Y7m$BCR`Hul}L*8A&Opx(zwDdL#odjG@Tt)!}DOwOa; z&YG@`9?R3NvIf7mWo0&e-R+GM2v*=ET}$qz;4Sgo>$Qm2hQV7uy9jCzwg6p;jP?+c zJDXvqc<~C?rb15N-HXS%F=3pmv@}e}a>Z^0#h5LaSg)+2!#V!8C?N^2O{J%WD?UYy z`c+j)LqnZ@8?z=0N`{fD;hHKw1wd&l!Sg6u7u~=;G0oNPb1PtR$D4*n1F5GAF$d&6 za@ACAeD7byT-WBgFK3S5Gf9p*cFbJZS2RhT3;cOBTzH>Q-Lq${hj+v)+t2H=*w*8k7S7u1fs*H`mL%;y9D2>j zJs5J*A5G~zsYA=qmOD?d`<8Z7Ue@F5mgM57*2X)>7av`)k{?~`Cf~Iy;Tt_5=`IHQ zyswd+fz0};^OW-?shiD!qo2w9EmoM=*7eJ*6eW;=;?T?xwk~>W!IX(Qe(&f}$NWg9 z)B?_Y^>(J%cNJY9$sx|8f!7Cb{c!pnXQ%iRU=8}~1tBP^A1jKXv>D}ge7k>G>Rn01bRWQ#};F(;Xjj8*mir{O_lhxjH7;@ zId%U`x+Uw}g`z&Ch9DRq(b}?bsQKwT*kel#z?+hH99^aicco{UOE^rF`W6%a-pvjf zX&B~cWMl<=WJPkh3w!Q<-;phZ^YtmRw=2YlMY5GGyz`$mlj@5Osm_GNYApY3710fe z3Ss8&=4<<9c%Dz2hj5g6ej{pWsnFS&TqdF>s~pRd_BwUFHRe__7T?_(*G*BZ4eg0b zsY!uGI;-Bf*7@kSt^%-jKV+m*-9Ul8|9Yy8im0>!>moV(p}#NNhmDrelf0^mou zTPhb>N_n^8S*jP;p9Oq#O3}{*Hk+Zyw12<;>nH!vpV3O}SD+TWu?{_muW!IYlItT+ z2)QaRPEK$%YIN^kiIiYKLz7|$r9+{CJB@8F%ZbhZib*o<-`BdWyS6q#Dj|Q>eNQRs zByxI=dr%_q&SKg^60svo#}k|wO1@rXH{U$KB+uX$vb=Wtp?!70nnM2!iza0w&VvF2`eN>M>2P7gthO7Cfn)n`sjp|KfPn;Ff zcN_`W=W2dkW&yK;_w+S7P39PX!ag1wZIqI?vyG~s^&;qP!eyNR-f`!RQ2&NM zz`{@s>gVmAN;j+t*1C6WhkL&`XoMKOszkJP*lNEcm^U)8$rGn;LIsMe<7-BM-@*xe z&R>Ub(n0TlCdJ#_uSFcP9Revun}4^jN`LPwHeuQI{uE>wOg*t12sQs`q;TOGkTFU1 zETMVTdB?=@TbX0AN$%%eWXv0%N#85#<^^Q$p44Ew%|vz#T|C$JEh{aK&i6;`UL2_0 zJgb&s>E9At7!WkGnkynMQ{fM|s7lU|B4_WBY=wZ*AF>wxu-el3wyK>U#6f&M{I=2- za(bXFL_pZ~p+J<9aULHmDlOA9ILR&Wn+W^++nVpBbMC^P-8Z>j==fM*A|Xi4NXjfZ z?DDRsPM?FE^8}a`T4o-j7kz&{rbG$kaH9>(q`LS$sE5A+W(vEeyk6UGvZS1R zH{8M`D>d_>ES&L{wzApX?Ouk@`>{AHHr6}EXf4E>7$!d5%g9ejeW?@7Bmtd^H#)`; z#-G-R!LhR$3>HxZeIqf+$)94*VJ}RdC7KL&kyC8~5Uu;1;EhE8mLrxfO!bWJi%!d* zd#+_75$D)AVy7Er)D0T-{xH!KG_?m)nrBa=R`Of`d~A1H4wBny{+=#5rN$Jt;O1)$PbN0x)3j6$HN1Q;Gw-`3)h1dg!EF|j5%BfDt z(b#FkdJFK??@w!fj*hqn-%= zwwpG+^RVuP(wK!wQ#x!$v@>V4Z2Vv`=o`1K2<-6Rz%l z2>)YMu}gP)yUu($oh?dQ&CSPVUFesB0m8l)ccpWC`ha>A99g3}!?{F%6zxYPI8?(43a)&;E+Wq72ZEK7gdNCw^ zm?IBB?a~I%n#q-Ce>PE9=Q?eaa6dAaRgxQ}gcl7~c>~5PB-I2m(0kY;E9Abc<=#&P>~aIHSgaa&EnR4WzAm;Ak@I+@RPPfpN7Ovp3I(`d(=ZM~Ae=*pTB`D{_T32^^@OLLa=!8cv_E1e ze`MA`*Qa#P>KiZ|PExs23Bx?`b8ct;0wt&94wX+jaP>YbUH`c!KbF}joXDVwGSMIS zHn#pPv3OHHVeMYl=`5vYiN4DJ#c|qw@@OF7gx% zrp?k_-sM0nKiE{{S{RYeXp%V&9PZV;nEUIv2ZZt|QbyLsVO#cVj;gbc7U+34Ug+02 z+Euy7&goQ>lK~uA{X*Cl=D0yG)GVyQF&vLGi5%C{)~i+a^zExVw#PrhX2lvhrp?&( zf}s3wdh~%_+`Yk==D2S>ENZ^>8&SxHh0Dor-Okp#2yY4Gnh2(l2(fr6zxyR-}AS+Vy$ru)%L%df}Rd}f|RM|OtSG%QM^1DT(|4-85R z?nP&0MQ) zM_ikacPP}Bu=jrLLyDb$xQ$lJ|4g5mmYt`w{vNTv)@J;}_zg6``?!rDqVCZn;@}hh z%c?C{p3bw*BKH2265}7Uy=v^C_TWci)l#U4(5uIpf0+%l(@teRn7vx%LlSB7oOy1V zyLNV`tYXD1w(dcLf|M~3*i`r(+MinJyVAxRtTbJtC`Iu%0n#T1+d}JCa0G*e$-LUD zKkBAWkGxo3B&(6v?<(h*OQ&R2_(nQ~hp#~aduyg)L9&jm>L!h<&lQSR43VI%1`Q1p zhime>BXJQAOp653&BHsof(m_-!sCLv*P=8t=aV}-PVr|JREJk7&kuq}zVh{F_&eO_ z&pF%M6OtwciZyWnN|RV)RKG&i#R*2$I_VMYJ)aaL(MB1+nz<-(%64k%Z*y(d>NCTG zQ&QGIE?!Nef&`swLxO`fcl=3K&_X1C`hXyK8p*=d1dzA75c3dgk^S_7&5}oJj}P?N zM7#`(V*FhIncA}g*;Coi0)j3h<%xH!P1OG%j?Oy}>i>`9Rz{hrB=Z}&jO>iNb0{Un z5!o{%l)cU-6e6TcKAH`Q^ABxqd&iga z3n1=y;|=+{Z1(Etk-ALjJ*WAtuj^Hoqc{cg>P7#D)4qmI5c4c2u(p_y%Y^d;N* zlMNH^Cg*&>pqsP%z76Nh{IzNMK)Y`2juFQ!!^^kR^PC!fKh0*lepTOy7_#lRc}9GZ zqww@=*|N(5)mqBlXa#2QxRH>Cx>FlMd!hKoM%i*c-LUT$9Pr<^^?%yzFPXRMopX!d z4b)@T(b4XRDz*J*$Z|}XG=KcI=$v{QfHwmNNvJN!-cOtJ))=jS-w6x7dZvT6l zCNQetUA-;-LSb13p3!@V?jm;i(C!7LJF*vUmje?l^Ms;r`&!JYvwBwe7-08Ach z?9=-37hLV@Y9H8x!akb4Uyl}i-!@MR*cgQq z`^|5n?$@8SClc2{&=sLSv+S!3fA0BKW~RGa5Bk!G^s@K~-tGe)2xeK)1ICjX024~( zo$3jk?bdg^)c$l}8A>Q!(F5&zet>7PIA^y-qm$rVgAQ#dFSQ7bO~1sxpu^w+cMd-j zPJ?2w-Lx%jf$F7~k0vOB-oHj`zabIvjz3}{BlXZ@gc@!0R`0VRydWq&`)cwB@Arr8 zK%W`+Y+!x5T;C(mD`H#`dX)KYy-b~GTDYD4o&E{O$vQTx19vedyuV;O`be_3E%5s6 z)-Z^HYlaKnFAhexuAe?D+Y)Si!JNn_xX%HA`WU7+g$ss{m$IUF&T+78+JDS)amaDw zka=;-nE_l zs)A~t2Ew@5^as&c2qtslTcA1vP!CNIkPT=^FADln@z4Z32H+Ahf3OJ{=&gqmVKLrS}4~uTkrn09O(Bk zkqiCFXsGuq1*n&@x?e>-+~@l&oiu?s+dGo5i7twu<(b5}fixHieaB>{7q z2lIx;QSe?<%@b0YR-4m(CfNxRVO*;YWPJR^`fKv{r-^$#@1jZ``_)n!j!1zq4iMVN z7qbb=8kaPTFSk=EH-EORw=Z9Xgw-+0D+U`-RIA<^ucAD;-q&vL^P`aw*Qs)&6Qt~u zH+qlyq#x#S_x2zDD0Th}{)1QYqfbEWLP4)*e0aFj>|5k{sDxIO)Cvt%0qBJGjKfcd zs^)oSTob6!$!PUP;@orf49k5-PR?A>FT(a=*2z_vZ2+7BN;Z;}9n+A6kk%~)E|t6k z0=TCX>HOy2m}a)o?>V};=Jusn-l~+oiUG^Z4c2u#f_v=mskwr>9M@&$#C7IG1?H=> zZ%|KY$sISpIawnayd|g|>MAxYeI!>Qj2jRV8Q4Jk&6T66LMhzKXvzzadYlzzddh{i0qyU z2&23q=zOzdnw5u5Gl{ufL;SzvcU~TtoN*0Z$p(+S@Vs?hNPcsnz}MdeaSnQ$?RI~c zf@cURz~5cBOCYi5)!J{3i#a|&HiaC{ZNm@+s*RF`9?MX0>IWOv1ua#4T)dEg@_+MB zmSH?QKQ+zTF>Zd{z;e$}Sc&F^1dqeF2=bS)H!FMp1@M)F=wz46?i|6QTGhJ{U{o2 zFc=kjP=eIBZtq=88lAtpz&({*i+Ir~{$#-^mr`dMK9}!ss?>u)vqn_rY4X(t`oUv_;iK3`$x{w3o5L9hb4c_8VwHE*K^| zDqz`Ljs0R=cE3Eo!o^FdsSCB&k1BCdBm<2P zT|;6dT=2r;Zl%ok4*$$w#udh``j^mLX{+>gjA#JhPndsirFhBvhI8@CC&o2#0G-Yy z?%ZZSd-a8io+kMz-RYJME(x1D9&65%pz65`Xx^8SMIP7>nZmAJJ&*|hcvB!%$&O)l zwHDekbT4o<@o3tB7mp!7P;FMq=Tv`TORsJREwkq~kmIl?(VZ~z4TVk5_$T}(xVc#h zf6dURSp{S(*+$sZK95#*cN3ER8?0MjYbos?XIruUEvG^;%wM_+R9(P+; zYiBaUi|zB1tdMtr zDc5)H;g8K$uJE`YAMv2+{M0tPG8;tTA-x1JP>e2483FmabOHxGGNA<$io%^@yv+8t zna3MR6XTJvjVkkM#?r?UB8v^*yj2S64%^&~#K&Fx2$x?2^ c+yZrTJkNsFJ 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

--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

WVowv%2AeU1syTHQ~Py#Cc+J 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

fp!&ABSM<=Z1o+|!c6OQJmDmudp_QN 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

oHiz)9H(~8T@t*(18H{9gpFv5HmC zEQ{Yq3}m4?d`~%MI>!wRmMN65?9x7!%iJ6^R66A-7h?@zfs}gwm~(v)FG#d}pLZh0 zLfaGJ;%yAonE0TZ#sZ5XYmEev+EvDa@TMzQVza&RZ#s4d6#wN5l2{?yz5OqHnoJru z{~)etG>mqTUD}m7_onid_p8+@DvzXVJ6a%e7jxAmuR`I@P@^H4e{06a35B*XS$FOx zZQBsf?H?a!Rx|5cTT$Qg10M+20uGvz64-<$5*QJQP^G7M=iygHUaseR{TEibHUChJ zwjg4%|Fo(wAg8sJvXKAa@ZM3T_FJ<2BG%n8Zeb7ESml9jjnHYDEMT_|JDc*sU|SPf z^-zE5YUx%!c+mZA@snR%benLK9oGo(y9wbbU{7|`goVhT=Kzvc0Z_}Cm5qUe#r9Q+ z3aQj?W(n8ggeK+F}n6q)YQdPbw!>RCB}}> zq}+Ehu-*?9sy(KL^~mY>Id!3%rX!tYT#!9ws>Eud&=-KZ-dNqU)&+sH&De-PwZG^5 z_dwr-`;$Av?SpuiRO#`j-F3dk59)t-Ck`Eb>6H97_PyRcB7WKU=&Vm|mE88B(rYnE zh6WRF&(6i9FU`Oa4}wpZe?Q^$zmU@dZcYo>nzZ6Q%`RdzYf7W5Kh~~5S0K50b)rUV zbJJj-EgmVoMx`<)%-htZt`UDQvf0>>2NU<&Q4%q5+1npwb|=C8bOqW#ww6YfPsMND z_pZrBJIX;!yZYwU_?pi6jB4et)6`e9mvo@V-JLum|CPv~;=EFf9h2win7ru{S=V@l7?><|3<<30L#Sm7tf- zqEoR_qTS_rC_1K1ixBt!`9Sy0&RYMG_n18P%M3QL0s$K!!4uR@zRpO^R>LwI@J)1 zf=BP3|As?ZIffgq6c37s*+d#sSbn=>gO90QbCP$+nie>%(W_q)B~O%->U&mF{_Lp3 zNXWZ)qbJ+X+3*PS8 z7K*X0G>rQelDQ7*uGu;%;Hb7A1Tif@hJ4`9oxq;0_h{LPp|tJBE;3xY1UI#W*8|*H+#;M?*|DG-Oh6G#bAGm!W z+&(CAjvOm7{{2*ZD!2mpF7Tj%m(vlhSbau5Z{^qKWW@{SEcMS0|LPxHR{G4T8-|Uy zk~+fOp2o0XPHqdjZdcCPQwJ6TX`jiV9Yi2`^f< zAsc0D`aDc{=$zYmojBocu=5psk|s!N;D|@D=Ux*t=DxHRC>pU1F~oPC1_?v5)vNqy zp*AP;9D;)(RvIZM^t*R9`V)fBAnXRT=e5Z{DL1mS0NdOWm~Omds7C!X!kGFLTY9$1`mEx~6 z2n%ZgpihiZYpv`rcnH4pkHpj4EmCylZX8a+Bp~7%K5BrTvJsK@xo=u4%0rYl_Z&?@ z`|OrTKCf@slHBqgceZ3ler zb8ve7rBI_B2!5!OCpQbEPc~_^%MAaLiaQldUQ!p;^;ceSXj?M%A={`iFl!)&7_9D7 zZv0(@a5=XkD=bB;#H`BUc4D>KtL5Q7J@t(o#ONfpyzp)`Td-?1?~zdj;net**b|9R z4f9+5ywvCRvuKRY1?eMl75q4gf9NTq!w3pXn=NDQ-jXuf=2DGvUJa`NG(Sl3)HcQ_ z*o5_LEUV{-UlOEw1fY+ZO(0eKQYv9V-;M4Gz{(!^WA6+l8(%8qWn(^VMy+!5HSs@P zC_+R9p_%T#<+<0^j)W7M>W|l%)}|zQduA)zR^Q9!7!o4=Rn>%tHVsc*kjk1EuT9!Fj} zs4$|+p@l=xU5|y&rd**m@;IY_lqgJyNm(uuZ1C9EDkOO|D zDBs+-vl;5{N=xXwm*?X)y`d6;6AgbOCatFAP0;A_z*u;HkD*84JP-c^u@y18#zYVQ zmmt99#7hf472Ut8>gtC{Je?(Z)p7upUo+D1wX{OV3Q@?I9IyG5?BF^rC{L(Yf6}&c zWc-T{n6g-ZF{lHe_w{l&3U2>ciO}~7o$t>{Sr;@pCPba@l(Pc$y3hRR?h7nd1_pDg znDe_i3cX)Yt+OwbjR@W6!kfKj#sq=ne;y=vFsJ$pdtJ?jN@P)HO`+A={8#+kZ2r8{ z>_GJp>3@DAY7v(V5X*vqD*@8mAg1u!ysCwexGIJMoD^mG0nA^pjsFIL;yuiL*5OgV zJ{Hck?3|L*ko73$ehmzGko(?G=W*Cj=*iCmn5Vi6F8*2rL_Vc%8XDayyBX$I4ZI+g z`yuN(YtwdZ>x>nDKt`)rj9dUU zS|YQfP1E%;3H=k24(!R`pWsF0GvFkn-do$;D)Hf2vGuiwaaE>u`a*qTy|;u#r7o3X z-p7`^RZp3(X+^BG42YDWwl{zG>A zMx;01Q2uTKoDW9cs*2{hQLt+fRi|o)mepU=a}@GxZ7%ABNms7I$57v_p?@NmtUqN8 zrM_3@oiy2P4T-}#@gfd)Vf+sY$RhM8_lPv*oG|vEY*Ny#*S`K}>n^H1{8Q$~KEK!zP>lad+=+rJ-X&qiH)2=J zGF<2@rxj#BAGu&S84~SxT(32n`Zy!eJ4ex_{5TesU0vaUF5E*F;26YQ0vS7U$K3ly zy|Nway_fu2AEHh<8X5iLVRt7ogD19pmh%daCQlHybyJ*U08k9f30mVF(kxK#f6Mvn z_dx67)}6tq{`PCrUgYNTYcUk9ci5E+D29UTX6Q@g3RH_~nu3JCy@U0pRfjbdpnhvq zDB3tVD@sj=iQbg%S-o7jz{zmu@M5CQF6RS&R5p}SFp7!ZAv7iu9qOcPdGl>4#0>oR z$S)-x<#R8MihQ^Jw$**NS{4qU~y4FeG?h zmSv7N1kMe@l9%-Po$cJ@z%YpAp2Wd4EQ#O{x&Gaj-}f>l^5;X{h7c9u@xzlkF8L>M zfI^=Lp@*!Bo)@Ht8Ot0Y(i5cjMqjA+U`bWyM^U~EY3Q+zr_jgKZUQCjBBwJ=k>S?X zhdr;VsWt#Yt6#+7wed|mI#M^J?qmpbBBbTwzCqHvj~>r2zX2xFnE%Q*=~(q?O1M0* z0elXjP^>=;27e~kxUjt>_`|Y$&6KhJp@LPmODC=T;zZ6H0@pbD zlgY1-JMFt&pef0SYuyth%=QJzf2In*46X)}KZ#>pCe(gK(3(C$IwKBHl4n(0ff$a6 zSq^#&Hy_Ap)o7?VpB98uNl6Z{lup1S6I47ahU)45W(|jQ$ z?dU}A5#3k^<9|cTZY~arNA;W27EAy$S@Zyw#^$|3G@M$gpkK}zocYsK0#uwkb{h!$ z{V>G_xoH#~m=5-HEL9fMfxkEmFBnePL*i|xYNxGzmt72@OWNEMn-5Q^;I?dWLB9Io zluWt5vXKgj1#8cNUVW`|C!vRYX5KSb?&sq!+w!|xdD@Kp727EZ!u~$mgYnAVJxUzl_E2LrSuh3Uz z_Xcn*N_HH88vj?x`12ZH#f~#9h@_ExRTAsDzQNF%key9Fm8*{#6MvQjB6%p+Ra6O) zAlPJaTiD@}_vsbFULlI|G2vr--!lJM!`Nv+^aT6WJ@+GK`az_!_GhD<72Amf>!HcS z!;PXg=EDS2M(%Dew6LmTXQ1RzODB&KB)unXHwfZ0ywQ8tw-Y?kVpB6M7RTx)dpAzU1!Ne&mF${$=2GzIAAVc+)+1vfdMv61_*H76B zB^y%9fZSN)ifQCe@bB8z$Q29XP;hr79gzym)$sOIJA`P9QW@KMAi-cgzt^RKozdMc zk0;wFxE_YOM@$mPXAGpdM=G32p|wE<_?6XFw#&b17z=uPI%QB2JGO<%=de~`m5qBg zmNH|tZMJNZ`wSBGTa((>GOm+n#PhR8>pzj5)uUD=KWy+WO_}s2KiL(47?*H;o`LAE z$O+}Widv)kQptTfnIq0Z9PR>?(_De<*OpXkO*URNwVnBaJsVoSp0L#FhT~ELUT8)I z^UFxsPTeYjoAr{TufO-Zow}qn7=r>iI>)??n})vb?(aD|e2bb;FT8BI>eWgwoOOwO zCLEt+{0~So&T;D|4&RH?Y6t&Xr}_G2tDmgZi(7^`!3hgDbzB~Pu)cQP*|hv zEzrAk$tiWkBjxpi3ZH$tj+#3q$!@}f0K8cRQ#A0MpnO>7GvXAWq)K-90zBrkJ*f38 zVm(#(o=AJd+I+azVkZvOs5#>%rxlHv%*I+&k1_))WT)ipHU)4fFi1zNU)N7?)i`%e zB`EArQW%&39DXn0DrB`p^wQ0sG0qX?W@ZGAZF-wZy#kX-{}PiZZM_x5+Jv z5So_F_doHOOE6RD^AvR+EN(~LIdwgqDuy&WXJw9&gV=YTk+^CM*x2*gpZAedfVB*X zL`BcTk#0nDNGs@mQ629g#>LYr9K-ZmcxjQC{IJY3C4@9o1k ziY{*dYa}#fjX2XHh%t;6d6^y)KIrLC=h4WVYfDxLv&tQ6#r%Ai)!yC}oBgLfAX+xw zB&Vm)_t(y`XvGe1D5oy$pcbz}QMhvMvu$EWv;$&}?k%)0Muvl`7A=-sv4*7M0@|yRteE98YAxE{74@$67GB|>4gTzIsrAo3IS<*_&|rwrsX(@xvEU+Z~Q zM-CUW(A}vuI!w^0G<9r5gd7oXG}WqCF5P3xBZQl1LCvP7_Zz=N#diCA9gAw`1BI81 zN?sr^yeiGys*%q`#$aB`*xt4CJG-V!Xu4yl$nD3 zJH*D6Nlf9oXBdji7{|MSs6D(&kGY7=H$5iotU?QJ*4h^erPiCg)XLI2koc< z{=}Hui=CJi_N5{pW$AV*X#a6yNcfUO?jE~yfX>gbV@X}uVd#I$tzmT>y@*<6wZ=CH zR$f_5usFZw6+A`}i}M&ZjTuyrC117mu?J{HL^q5!2Ohz^nS~g8~GJq%~nM>bGzri$R#~=+w8&ZWgYlS ze$;e1^fLXuPDVFyd*}K|{9Rz7spQl@-YcUvG@G96vwDIru->9KmF~AVzK!3SU%mIB zEFNJUD@h(U${aC*?T+A2KenqGc_F5!_%c`Ezp(3q`0;Lj&)}vlAd(y#;BCMDhxqS# zCXaE5K%Q?>y`ClVbA)&esN|h?WQ|XKxhv(c-scraRI?2q0gk43;O2ldvDc*%k}olG zeIPT1b%*{>FfizPfdY(tXLkQjAZrZO)pf%OB2D!7|4|Je*?9f9?P+?dzqM}bW!{~< z&sp#`wGQSd8a=igy0gw_7sLw#Vz-TS4X>0vwoxr9FV{DgwmO8jL<4#^o%+Ldj8P5~ zKfvU+Q@u~tit-33eP-$kJ->kN29iVfzCJ&6#ZNxY(03@nD}enc1u-lb^>FxSsw-gR z+GY-SWIvbUoWE|EK3hE%6!(2>GRs>XK7PgE6t$NPr=OG|X42oOmybVP=6gMOUSesH zI?)QkECu6nbmxAt>u`7m6R@aRAPDZdeWssvCKU{qs&icMyCuq!E{$3Dv70s7Ak|+vm@6{gksZE70z9n4ASh9p%hJ z>`qUc(@s!?U6yOB-*a#M6u)NJQin0n)E~C))}f*Mw?T}Gb~1z3hl0suuY`b_N#T{QF)dVc&+wpM#oaiXr|eR&m79!@8icY+=bCJrwz*rg zXCKXY?~(6hiz-5em?Rv;%o8*--V?YwN^bVD7QAIkCTYu-Ta+_%S4~zn)pL&A4l8-X zA6$n>Q|G&XZh!U3T=pj9BK=UuCFR-NKafE6eBv1^$zt0ZB@yB$nhPLXku;{{4KE`t zC-^9njWN)P%DdxXs{nc+cfA!1lx~p&3V$Xh?tifBI9>Xqzl?HBE?xLA6g~2z`}mCK z+*H)hXu~W^6Qs6&D*hfxc*KqslkQnbi~rC~0msJvLgW2fy#mW;L8&X)LNCzzDiCXJ zKO^;d{&K(ha3br8*Yn8ayF$0Xt;R9=ySww^sVEe^m4>0d(Nekvc48-0?4k5Z=$^#M zNMhY}nQ@Pv!{`k!Q_*-uQF6SEuiwsKF|6a4WCGqEM5FWe0SF-HjN0fJfEiAS;r8VGtCltz@8vM?X>b>5oP?;7=H#s+R!eIa?ww2B`{*@VK4!tq>E=M3XeC8DR zQkU1yJGOlAV!YU3dXjORYFl&!_+vW^S}t3CFs$*BPys}6#W$lmcw@*$_*DvA%nCZ3 z(w(ALE^LoO+~rD+E6@1gD8UWFdJNkTkm*^!-o5=9ZfuX~H*?;MZJWDb6VixYuRNJQ@v})i zxEMhG6>bBwwzMtb+7Pb|_ub<}ET@qIETZQ?&d5q#zu{N6@IB`lCG23>x(AP;m6KwV zseCr`^h|@Bu(%vvTkihW6a2GAV*UD=a#Ewwk`1x@rVcBNB7vDi+-<9+%po_=^+f0O zOlnUbB%x-239xeoE>8iWwm$ilq1i$Fqeq}7#H4XGnnQF+2R3`SM@9YFLc|Az^KC}d+!q?*WW85> zd1=0vvw2Q;r`ZLwdf~D9PJ?mdb!+21%oOs&`~SH4IL0^f$#_70>H8a7J0~27P4KSf z=psv;TkKHMN6g++IG)M&c4?cYEG5%Z^M(h5JnGA0_YDGuw0gclXZk zp4n?#Xco=^41}&tYt2a=4tlGtkFt2sK?&Y6_)j5YWp9L#ZcysA`?uNb0_WyXYsMy`}kr4y$@(GA;J#nw>GDPIN<8w4~Yf>K`jy<1v@Dz@yU!E zdHblv0DA4?3Tsj!-lni4yo;GC9-uY_&Zk#A?)PQRBAqn*Qes>+4Vd|ctp3MX|FV4% z9BnN@TV`Ne0&V^3$z7@Pl4=vP@CwoMnWmLnUPbzGIjcSwV)wmlpJR8w0ik}qt3Ay= z(n}Evf$rLgWtX`{0YYQc`GGcgiroy#9P{NFD$U%|eq3w!L`463M3|z|_fy~Chb$_u zR2Ot;ivElk9*1!Ac5jpke#OmmGfd=FwPnRL7D-PO?J0d@FC0lzkR0YNb|jH)2IVbq6d_$)C0cxR(mb%d}vWZDw>?w^>CzDq2LiLXm%F zsYtY&dY&S@TG49f<^x%dFfCY(PZl8eE{NiP?#4O3uTK6d1*!Ls+dc61H*!{_GP8yliy7UFycm^XplKPW>#uX za}1&TY=70*0D=2;w)W>E76M;JQCoi>9pN=i!x)TCZ$NH7{W``7*hz0Q-OO8q@H>w* zCzF_ZdPVGMYv}~7qh1%C7F^V{0A3S?X35p4%g4NxVurfIwHol%wTJZjo_?PKG@rgB zft`d(mqE|TL^i`;9M`!ZAd46czgBbn4(P;w@P*;SC9;oam=n46Ai+{-#vt#Ita}7u zr9t?{`pYGA`E`om3L4^Vg!TbG>3G5Bt_8chEF{NDCl6Zs&d*C{${?{Ta|io4>M@Ca zb(n>GQ@uLE=0vY&OD;yP?S`S2py+mTOrgg;TguMTtXvb@E5P^S$?p*ZYaI1pXylp) zRx;z6=mmMVhY<}1zSCdd@}b?aupv z{1%A_fu}q71p@rpl}*21`<)o}C&r&%>*aa9a0%ZCiSrZ3n5u8TcG2fJT8ajyejlo& zOe^Pj0ZSC#(LUieP#x7MaK9hTB>B@4UVF~w>?L)var3CP`~@(4l)D2!NCuj&O*ARQ z49@`-H$FMMIqyEJO92bqCtus zQ*G}$Dj9j}^LuAO-#n_quF|GeS+149uwRc}4J(BzTpWu$zpGen8f_@N=!6s2H=l1; z0Dr#B6d}}84b->eSegRc&^`3GLoHvKOh)e0#~YxJ z59tcOV5#gyqMP?N@Y?mJzrH8_urM29_MY+9r@*&CVEpSexuipB|2t;SnqEl<6Sx^t zcTXw2%FXBa|7SV;q^HnT0Fv=ut+R`3Wd#s4kY2Gp}CB3E{qvH8aaT$Ro5?Ramsz$FdhtI@N=}L&}A73DVUM z*?EX~2q16P84icnKcQ-G9vTDD$LBU@HD;bg-RK)5*QFn4b4ImNf<9Lv7QZR6VGQ-0 z$Aa6P8eUirTraYLGQW%*>hw>!M#il(<$Cl4#sW)ZB?;N0Jai9}R1BH-&RuH@%hDr1 z&L{T=uwPvlE}01=sJVw}pIeBGR6J52*NrUQ`7De{9}q3~ysny#oefK&0(IG%k)G~P z&zlfhA*Lb3p3vNc%Ep;0_CzRIcXV1vB}%m3iZ!@B*>k3ss93e*X*uEKkExEa4BCLbgf@oTHkM{OS&{DJe(*Rue| z=cPDwWeenpkDad{7S2(2n}+vg!8rjEaIr(va6OAxzP2Zuk@>1glEa-hlx&nd*Qx^y zbc1tcWa|FiN_ql=cYRa0^Z719ZNJoY2gM!kxHGO}d$MxSH$UTlARqfPTOq$bp~A;z zIH5yI$VE@W;Q-L~=E_HJCD%atxT>)JWJl=@%{kg;U3|^l33SVqs~KvX18QXA{l>T_ za^m%Vfg33sWT%G-k6mtT(<$m>)9L7c+?=1agasLa3dMAqL+31%i!8;e z2hCqUB`HMpBu}xaAYcPTsIUHdNh@s6oDFNb@UKML}ib}0O~2R zSdSC$LyRLI!iWCu-I14c!9;>IB_&2AMCOO>cR;ZnB1RK+8T%${Z%-pi3Or!CZRHfo6I($ zL8LJ~|E8=L-1u|YFySJ7@p<`P{~3b{NaT%FU>KfMe^P zT-z)*>~bo-HYzT%ID%~X(9H6tRVBlAEwX=Yg`r>)xz9(h^qoQbJF*x*jWW0DIX(vr zTzdn;nzFKI_I25ZSAlD2+nZB`eN_L2yK=I-h>a1Xqn-yrsj!_P@s?8X+%;*tNzM*n zYQp=vaV9C}V3o#eHT4CHcH075_6490X^Q2Rb@FcKb4$7<@7CTdQ$cgu77!Cx$6V3L z`wT77>(P;IyGPpPpoG_|1n9@|HNPV zDk$fNGA~$D9F%AzWp;>+lXqbi!?^(`#0&ravH;;okmvHhutfnEt_qSggU0+r@(>*J z)D7m@)tO`G36#nf6~g}<;wuv|O(ws6ACUCEZv4j9FzHxL+3RqXF=HR#Wm_Zj;r&xV zX5itO6Xq^zfYs;}VhgS{g>WSmIz83qq_?yC7kHUn@2!>XSU94gNO#~6pEpu|HtEDp zLbI0hey`T3Geh%_Lde>23Dn>eRU3(O{2fLNf}!ACNo*>pEUa=Z?V*!Sn=%3Vw%)Cg zDe(j9Dj{FRBAaRHW|J`FPFg{vWXiMe+W_d{vB=VT(%Uaxz! zI_-Nx;FEEpl2--;JX^}Pn7N4c%!i}@?0D|xXk8Mf-kGV@dQ!?8>TUbNmmv?jJ^Np$n0#iv%_5V&#C=NH(#DXPmY^<|QEdSFvkn0U@1)YW)k?56nadw<0PAZq&*R>t;W_ayRaitOn?dR+9H)A48IGZ?MUjP!_KoU*ARA z3ba)$ZNX8K^+B&U6Fu+&!8gwPNCRNb*qYe7nu$GVC>$3B;(|X19BpGfLa#e?$tmPX zSRsT~#WH;pUZDhLs0ry>jdgUv{I~6MA0+v<$^MWB!;z=##BMYsl?+bo7gM4pl;LJp zQ`9WE&(nWJJi4>`uvAbApmW2kRBt%(DnHQ}W_a1p(!)R>y~4iLWx|%vvYrejWe3{3 znE^jfXgpV4EHK_*@(DD-wA>SVUb}6U_O~r}lMbbc-D`FDZMHTuk@nIA@(NBvU1xKAo*}ETN1s$qP#Hxcb{pNEr%!Mu? z{z*<3*kGrsWYu=zq0eRZKgy?NFVPKs&GnlQf}2-PrkT5_(wZ|RUdd(|Rp-T`(@Vu> z8%=weoAQCdYdvtVb;?}jm3ig)t>ebnI2)RF-NF=Tzd$iDHrPK}Lfl;nAierikI zf1P>&%3m$B0=r^q0^yT0av}QBtlP+*vwNWE1*TWp1so>=7xF-hv5TVZpym##hIU?@ zsD(-1<&}SYhE~YQx_#^SG5f9_@6s)&?VDv!;?8cI&{x&{tSi{|6PdW&#~jwMO}HZV z3;r%$0j8tg*9nR|?4BB|u=MVc0_kGs#kLHQf04i^{#6lF&-DNGa*dzX9R?L`l701>%v(7DO6$aXkYAS!W5Fe~ts1vH;~R4vjRei8874^1th4g8fG|5Me>mT$C8tt#&X- zcK(_#0@p$d;(4ECa;(O8$;KKm3gZTY5ueSTzr2l&_k&b=$dd_ij-vk5O28%a8AWco zN+K@8F4-Qv`<-bDo}_dHofuWlMNtL6=QPKL{Pwp2`$akkplMw?c_zkPN;FMmwx z>v4~imRP>XO?#WjrR)yR2$&ycuuUWVc3;wO2HjMw8CqdC`Lsm#tH}o!w3=d9Ym%y1 zORr9w0x1W^1$o^S@fEFwsC3Q2G37F92$qRlsR0v;i32{2vXFMkst|A|XSXrP3-6ZV zGxG*MaMQqYrp0kA&B87qqIuqD9~!m0Hfzm^-!kGRct38Ga^G#K%uHY6tx7i*1rh#i zt!4NnDGA>pINxfp|8ZCd{m=Pcfx}mvO3P92V^I5jH7t_aRZ*q0@(v7tFS~Fp;d@^b z|89v2KF=6Fk9?6ah-7L`ZxCwX;VsYB)K_fn>Xw~PINrT^jd-W zhcA4Me}BRo)HFL2Abws|qW80QbOcvaA^~FcQBM9>t|#iMy7@(T2H$uZ7#vX|Y+Q7? zOv~gxaQKvoLaH+=tq@zFNoD!P^hb@GF&+kP@~f5{h?V!wY)d1mcvWuFT+9$ldH8W~ zbg52Q%@&#V{!fnJj1$_t+(|IIl{+MYwq*jZrCIOfUyeif1(+Ra8YthdQzw+Wlc{|t zmQO6-VEM9SH)dxO3yd#}X>~*{8YFN>!TRz|2mh8V_o`2r@y#df=Picm13C-f6WiCf z7o4!&FoPiXC%Q+Jmnqd*72-PqwPK*Z@zM-{m<@AUOs_b@;x6&2?+J}-r?0(Huq01o8`?^|fv`zOV*&8i7jvo}@o>wP@q$>N zG$7!_Z1ZSd{A7);U?{<$KjY@QEyk1{E-L+Fb@OqW{B#5*BNDi?&Vn7V^16N(J*Je{ z;amA43I5&Kn*hpNNgn$4Bd9eZ{o5#EZ-C%+Xy9q%4|Ek@Pm!nGaH)7Hoy8DOv*q6~ z1RlqkuLAGZem^51OJy>+TVDHp!1_sxp$z?;-}DyVgXQmixY{YE(|yWw_LnFsbUIfR zj(WmiLJ9Oq;04{I7I?$D@(Ru7UlXd#&Rd1MtA9l=mC;F_|(@C<)z@JL=6VMmbJLSEeywIfkJoat?>tWP2YpUimUGqtjMNf0 zRxsyiC3V2~ot;%@4ua_M3>VF5H};Wa`r0cWt1R0odTgtS%1Z!`wduW$hG;#T@O2#5 zYH&~k^j7sGK->^h^`0b*YHE2C!jukzK8zc=>sk7uK7;$8>)7Cn|fH`IYI zGYsbsGur>{j@8HJkr=(LCZeGa=oYD!r$3-vVrFBG$AmqnrQbvVW8pF}!H$6u_GnpO zPF2COK$^1K0jSDry=_Q0JSOg|$1E%&scv z6d(f3l#K64<+xH?E(Q4l4E7b*U$-r2Yutj}H0&`jTJG}DJjRI^4$8T+<)2RiE!I0pl>h9AoCSiG$q!;a>At~QmDDak22i*ou6dhB&!1HgXZ&wyFCWV zs{yj%z|e6m2zYHyH9Ab4U$dRb8K&3TV%*hK)kCj5d7rcG^`)CDR_XTLxKjOG&C0CZ zNtSx#drz^UTS|EFjU@q=0>MP^BusiL=+e00$KfvKp*Epj_DG$9hhwO!@!_jzKdT#+1ZJ5YD`$M#7=MM^E@MzATup)6=!S3cvR*T?J8MHB_Lf+!esSD76S$62*R|J_p+O#r~JD{|@FP9~-=~&1+&v~AtW?T)z2}6e5l4bK!7N34%n33Ql1psy zaWvL=N1raol&g_mMbtYDi`!Ulm-)tORW^rQ`)_@f=3p-&hcU*y=x*E@ZW+_U?>9xa z9>+AK@8v)%#~7ZlRITQGv`AMgPbSbSLTx1CH!*>9W$|$T@~dJ#nJU%lNYrTAhtRQ> zuULzjCoNX&+=C(b2J@-u1IrhYX z!0g#t{0fb(we&L?X9bM7^qG=nZkcM{(d;GXV|r79kBH-!2ip9ypK8rZ%uriUn7jn# z2&_-*4^Hk-1-@iqcS3CJ&s^ee^?_U~K+Zb3#ib+B%E@-nQ1$FjQD$j5Ap-%6Cq*O6qtC2Ejn5Et0(t!3%#g;w zyd7dZaxryT&S|0}&M}Uo`{ujryaT|6e-Z?|{1m;B_w&}yP|*@GTX%)u{?JEkbdh$XjJ6?}Q>lQX5EfYS`$g2LWli0{K@G&1> z0WcvEm@Bs_-096R_2RE9sGjKOR*Cfg^~Y{b+!5bxs=9R9Oy43U zJx}&8V~8#*{&X_wnAv!?Wu^Mu6~A?9+`9B-D&er)=je^}g30=&96k@DsIY#kVCQn* zNlVQu*Q9(es9}+(F1^zQc))0ufBecrZ*pR~#wTpvJU52!Fm9JK%C@`&9G>B(f@!s0 zviK0uFgwwWNdvwmr}b357R}l_e7HAgN;5P`q#m|{36|z1Q~Ey` z_IGvP?Nk-K9&P`4AibGQ%?oCmhNqoC_#KQ7<%NKkik4^M9ieXvzTo$5DQ`#<-2?wyKh=5hi8M*k$wfc z6UHHpe1PiY7*O^{pay_V1=E6>EjQMSa~a@mtI8ZzJ#5dQ4;D9a%+l&0O!_0r*yKCjsN& zF9nY;MlbD7;`rSKzC2<|uQuqGfHZA)o7C~Gr%XwI=+T2+U1SJ77V-r#4zhYd5BN@dwTM zT9s$+RB9JA67NpHWmJi-1@gfv;8~q%dPlmBR|eeZd#K3}Y;3?2Qq~bA>6i{Iwa%koIGfOY?Bv-BHB)I@{phThvMW;D!T1KBzs#*mubtOi zKC$+~aR9e=apBCkB9NZtlDGp?TQY2krOz||dMC?*uZCr6^3vYRH)qv}hp(*}@{LQj zf$mgdo9MnVxHB)aXY=8jWc?uR2k8Y+ENVt0hq~Wn%FEUM4<71pPsoZ@2lVFDnTB9Y#^~_7dJSq zOiZ19{ZuqM$MskgYp4^7uE2*x|iLb%s^jZVGM{RVlZFq8lBZvThD%)X4% zvd)o0GH1*;UbI{q)3yD!K+`W)z^CnXRMk!W@>#i)rltTJ@cE)`8+;|EAON=Ue;l2A zAk+K*$B8V(RQe`&MVyW#m*z6pZc;AYk!#JJxih!9q?BaJedd~?a=*=Oj9i9cB-df& zGRzEPW5a&V@1M`#`{VQ3`|^4|9}jTgW&Y1-Uo>J*eeAcz5O{D@&xH;5Dux@dR9oPB z4Y?hUqn?>wQRDxl96omnz@H?cNf4FGCs3jBN(#oB$sLEU;l3QcmPJ{w@=M;FhBm_o z?79eCTL~ZAboO`+$pP+Z{Wr9)XgY}aFVUBBdwxBv+oO)3?P%LYA8k$uP!oLG3{|l#@;a$!|28=5|&jFvwu@Pleye!2rqQU?~Vq8wu9Zg3RPyonJ#+ zbM_k9O?7qZh{9Z9>Er>wriA2}DUU&#RZd|<)@vMwFd^Or0$# z_i>sqZ(#%8s$B>?1E-N$ki812N%8QVLeiwSk3fJ)4}^eFu{5f|3T@Z_hI&V)u%~mp zAWU%wY`#;A{-`~Jwj$i?uQhF+P)A%Tjn(DY(vR zcRQm(*Y?Q$M2;^q%3u8o&PhX(oANBjs>%D%TcQXgDsMZs@7PfDG0@&B7jz&t8qhT7 zSufqr6v{9kO%g^tVTWy*dMj$Ca2e(ejA*&eW(ukI(Pz@Nxl}I9)(*d>lesPOVzN#& zZ0_U%4PD};0skX@kHK=5Bzrq1kX2ZlIyKXqZHAyps%rQlPard|K=KY)7{fCV)R*Ou zcj$KfL-sj<$Fxv#{$EjmT0&xs-;?Wjvy*(i_orj=2d(UNjp2T$QmyApO$NJf&`r{; z?4S!*_far&+q&>m4Bw{Nze7WmR!zr#7cKG^&3l$meJF*OfiD zR$w{N${o_@->}p^ZEDneF}TAMK1TJEz)%eHT-^CWV_%Bz2A!nJp$fN!cS1fb&Dw3; z9IG!g11(s2zr3|4Y`=+Fd?y13F9o?zrS}7plRYO)*s4Sg_N0Q(9Y0y_1>UzxvPV$* zA_3ls6=}fJsj`CY2HMcfsId)`v~74~7t(*N5KfNZ6%jHks&@Vj;Qu1e{~MDUvnt%$ z{7V02=c?fFWq2jVI22N^lbH40;@^p+h_#pfSI z8ovYl{}>)?-M**$8BVcUUbwYnYnEgK)t~Ir3XTF^9-35@Zs<-knYwj2YnqmjGg5FPUyc#U$o;J|BrVgH1T=r!Lh$qgwWB8q@u;N zP%VAju4CTee-qnV`t192{^*eVY&#BX%p2;I;WE6GrS<9nblenb-+=IvJK`^Ej3(-c zBO&(GtTVSly8X|}483hr;XgYd!=K&m;R%CT|7!58OidKNY@DoZk32Q@VM0HrBPbxL0x!pJ2aN-Pap~@#}VW2VFU|b|Iz68&OFQpt&k7}t38q?DVJq%G#RDCuifE$AC zVbtlaZYA8Jk1XH}s*k8>O{g-)71MV)GAqXR)9)C9eK3zGJ$2fUNOMB=iqjz%jDA|v z%C3)dgl5&rG*aSp0YV3H{Vw}QptYbu%#jS4cBQ8khA$^h2Y6)d5`#(u@8Z1sAcDyV z^>PiYIcs9KDREGFI%0XO^78PAL#AlasPsBM&0@G#VH17mA?42Ek!k|zYt76Xhjtj` z!4tXrX|{DvDJ{qI$djuZB|6^IT-m{VS(%7^^uTSz3v{3Iwd$2IbS(uWR5Nn}8azWf zsKalNmI@&C@R-2yi6jwdku`@jGna*KUG-?G3u-25T%_jlO3e281Mf|6w>}I`1@sCl zlt|8nW6C251Gnb_HV8c0y}6TAgYSZ0B<~6}h73^AueML}(F$hF{tbA^_%5sz?t{>6 znjqxWn2H~RcMXdMyQ+!?fjWDI(Zq_WLFX4*=+?y# z8$T$#m~?+N_B!W*$C)c9d5iy7^7sqrkpRGOF>!ye<2Gk^_<(SGqXHuE@J~n7-Gt8> z=Uxc9r}{li`8wHk6Vw$X;yQit+zSnlQtwD+)98(`evcV~P5hu&i#a*FZ?A<$|LF2D zY>Mog*bZp~T@T6?-);l~kb`4}|J$G3ec$I(P9_c8W!-@4);uU6rKC7Te zc`r%1L6xi8<|!YvXifw@9eQId)?5z_J(LfzuzmzqB^A+T4ql>~CXhI(ur*Bk>q9dR zIh${BOs?808$oyt@N((h%a)^SDB}AcloeEC)LWu+0(&aom+!GRhzG?9wS;#Tvwy$7 zj`Y9%*zG09BMclj*UMbaT#PZ^>37-8?wL3Sm9=7jL&@K9f4Cn)`8w+g7uHy$sbo=?6oS16YWe@(R(-sZ8r?#Le2E_FdX za7_%|Um5R)s4)8v+)JLaLOu?T4{Gx#NQyU>vAn{cLabJ|eqCUny_7|u6M1Rq3| zoxK2@3HE#`X~fhSifz%fyLMP(&iPc__0RT5<1Fl_=N_OvsNBz-vkaz6m}ZPS*8`=6 zFngnuT9oX$dwP>)>_GL=WlMYj>|pu&PHk!L$DJRcb1sEhq=d=iZ`Qp-yh2g1h%&}# zfNuysgS{3Z)$i?wG}&qg`xM2Vog zWmjIn#`?3*H|)Idgy3(rJnF}ufBYnDpp+Q%o%`~h!OfJfwh4K{sx@P88e@QE#D_zN zLs8RRm4<3M3OSXZy^f?7YqzYFs4@u@(*Xl(u!)eXO#?C6_19i{}N6)ax3GLf1pt0`u~nky$*5|#()5hA+8Ty?LPgf z>GKYMD~na#z%Z0*NS0jIr!1Ud{|!H zq6l$zmM`?hC?@$mL&C9%)-{rwW{uBwTWv*|N5a04_Wf)l25@=74qgpA9mknVVm%ft zO{V+`G`nW4$&TJuv&}WC>T0tj+~6#7ABs28`{dIp^_;-^=+w^`QqOv}6}f7D@MD-r zI%MFDKdlNXX7+20*-J8a_D~{vgr8rL=avl`j0*E98?B6&yYrASzIx}7DTJOHJj&{& z7e@oLaXwHVtl9rr-)3Goa}TM}vYC*MVYGH@Ywe>Lk$;Z}viBpG;Q!jzI5d~r5uaa@ z9zWGvYrD+9%iac5LQTgjf) zTC`F(1Y;iX?&X`URnEU{&)DPwSAw6v&x1|3sl+-9zt;!_)85wfMJtPi!T6 z`TRKt&!(vzxj@POlagbT=7NNrPCGLF1&@gS|Phz0~tHZd%m)_lUbJz8tqE zGj;VAH`T0ALB@0f-KLO{dicjH1u*V6Tp9{bKBxhDhc;iHl^~#=qs)WsQ9^knL_>34 zdrh5*mhsAN=i*iC1l;$g07aoeK=9OV{r>f*iN#M4vLBj=6;kX8S<$xyxw$3$31 z`Q;bWKTMUICt*29%`e-;#HfB?(AqsMoCM;OTO>Zc-ZP|~Jetd>26g6sJA>U@3k&~X zPuKj`bmX?6+++SjR(Z8pwso{$n*vg6`juwpTA;w~ToN3+?yNs$2K5bej*vEuGQliF zSRfQ#`rn20Ertt*fB%RAjylx^I{G8lV3gvuROg5Y#js)jx{bAb#(bOtBRxn+f;zBk zfBY&%<3P|-1eFF|y9BWQ4YBRa?HDP(_1X zmZ?u(F{vJe&6eZfxFD}d&txzVF%1g>iO!&LBcJf>8X2n|AZ1wRU5iKk(J?jl#^;Y#k z`E9zvS*dDjZOr4Gd_+rodmxNUlN2KT#tCm6L@zeX-mIH;^Kp{09GFVm`voJODDVB( zJX}48>KFqCtO{<_8FU9nvkgekDkTdZiNDgbmY%gzPy&J1793Y5qqpxWIQpD*T$9S^ zSeL^(?`)T-*4bFu>u^U=*P_xWf;MDtgeN=AdoOJm7D0yPz%)IB%G#*spPE&L&4{bw zUVTpC!_oF~Xj*VeT?9od#7f)Hqr5^x`tunDDX2>;x0so3@;#SIBhHAm$!@q9eR2vfV+PBvOJ270R5Oj7tTpd6GyO7NrGDL*EMGTUo%rN$azWjs z3-P|fx9?%g)YNF}o2|t!6YY)-0ME_8(X$*_t1HSzwn|vJJdQcMCA^_(FBadgK;zoW zmuBVD7mRiyd;7xfI4g)W`Gwjwz_Z~<{L@i+tAQKLy2gWdoDFF`d$JS7?5>94!)$MT zPd4HecbNra>U<+;R`UH6tZzBvqYF|7Me{#LYL$oqIc@y7l{`l^dEbZlJXDRm`ch#= z&M-rrQ~Sog=ZtlZT*&s2kus^=apq5*dY2o9d)z|9xr$mMATfg7dl2Pe%S}DH*^9yN zy;y8+8S-1+{kAn3VF^I<-li6^NtW+vMm@vw(?6}f{3-F9+~L{iY5O|c#w|&)9W4b} zk2(!vk1lQ%f!p6l&k9;;y)IQ!?ylf$s!0LHy+&qU$H0wu^8FyJ%%DOc(0Bm#!Y|+C z9SNfA;Y-d(kug*A#G-#FdN5B%+dzR|)zo)R@ZtVr2R`}-B`ZsfYsx0d8-@dGPqJmN z3rf%l@bhI;j`3HOYke03oyx<1tRo3LdjI0LLAGRX{6)>WN0=*5?7f>;cD6dT>eG}> z@2787vxZoS+dYBm3bSk@8Yg4=J43KAzWh--4VHBHJ+~0hQmofQIM1Afm3b3QQRRs-#Xc zzgf@LmCpRUr1kkv>IvOQcvxK8|9-nX1U<4ST5ctc5f*dyJBtsn^nFFMABK*LqncCd z-M5YMkQV#m(qq*tWjjM~+1V|V8#}>|2|X|AL_^uF@#q~itF~%Tt#T+5P-eOtlGGFQ zhW8w1+U}uk!<<;a>d!=AP2L&S-w4oYzlRb$Idu!Zjl`VMJW8?qr%(q&Ez0ELYlOF_%2n^Q?iYH~jw)CKalb!j8>YAx|HToBHDau8sOovuqp*i{@b`STX@rUNm=pL9>j2~Q1!6Ns4I6DYbKS7Py{>tJye31? zvETE>Qif5vmAZE<+)-^m^l+*tp#U)#bj0wtMFCV6p}N{SAST2Dxq1CyEe3>r6ta*b zvXX}0DMsUoOj+G;*NDCS%upTYrpG>ED4~CBI{5US>~XMdHQ>ywS>fr;n+=@QR!n8- zgr4%Xby82f`Ei|nljGO^IvgBaGF$%pH#msYJIB@E)gQ+P_;Nud1=+#p1kR&2w8PSF ze?i{2lK$pIz9}9d)X7C>f{3D!M3|nlUtsEV}G1N>&pwRNjq~3WUiz3|J+SO zuAVgi2|CzdK|q?dX1IUy+Gt$wx5f6*BMF{c;iL&iZai!8VVcHa|Jykr3++5$?^aY0dbTXLN<7 zuxl)y(^p{=^o1DR?DkmtNH_EsGK1V=jbRVBTbRwXta~U~%GPH<^n)T82ee4eQ4~eD$+u-U9=rPi^YWd7+iF{)+qSI!maNNRbdfNp z>nOR@qa<%|l|i#l zeDDn$kR!AABbW7q?v=EMlIz7}MU-(~w5w5NHotc7o|dlc1fHer-FdaJ8gqb#9QVYx z%0EcMBfQ-SeMbz?YaZdhJ55Ju$9BbOXnQPr#0u^W=dsHeS;&Omr(D0ZBNSkwuZHj)yyPqt*29bY&S*@ORJ(d>o?_xHwTh3j)oDIjoM|~7rxGW4*v?y zF~c=NtQT7#cvn(<8kYj?fT+FHVkeijb&Pj@iBNVr0$=dR;vi99$h0>9;K>Pjm#MLJvb@kq;at*uehc{Bp zmtwFMkq^A>6-$+FrMZ+@c)Q_@J#a?-@iIbo4lh|78n|e$>%Qf%x9#HdzmJ1E>sV-8 zW-~PuuMRVUqu-74k2TF%*qtvKCh(a6A|w87t=Au3IL?${OYLkLzFiHc5{F0zPSi+P zz3;J(o1W1W_cd;zYx3OOCZYr1(4W0jd%8%`DzBmBp4HnVS*{#*7Ve{}Pe&Y~jwB&T zuq+$<Txvpr|dp~F2+zsjO|D!nW85MH|G(g1t?Ct7DW>=-_#4Q#%@ma46+N55>b zOyNxcP=aJ^JY>9@xr~NexT}4O%p4~Sv3qXk+`;rRx9_ZU@t`&;<=C2x*Op@ z4SF!GI{HjDO>#Y^F0gaa10Q^z{o62paUgV{LjXOAt`n9E+)t|n)|g;{5+Ig!k!|8) zyQ;fRh!^5j$TYQ7@7L~|7uZ@>B*TOmf5fm=VFk}XKWCMB@ zcY$WRw^j{EWTxB<5$3=G83BE#X`R>M2NF9vjByB=|Kf13j*O^F800`DVW|Nrz?zdj zoTICN7Ugi+VPx=KGro3>m=! zUel}Aex>Bb)gUj>5!p~5myGFKJmWIM9g5YZ#GJnC3A$HIkABDO0;FQeJE%p*A93T8 zP;l>R1WqS;Ttl$U3GpUov@1OVBGfC*eiQ-Ad!v-C=a-TMIoG?ve=u?7mBdFF!0H<6Zacl^w#GNT zHL)KaZsDELeqLFoenmU?2{u^=Z6OiwvFH17VS(T82(QkD&(BO-&pdiv0_|DIr|8gQ zH86801&a~$M zypz}cNx_X0r;Jx5l`Jl+)nOv{1>fC)a{LT7d^F;4!Y6J8lqn8myvnFXwl)rYLB}BE7Yu)VH^5}I(tWYiZ|<#0 zt)V2%LRz47Y%Hw5epFuC5N_k^*LOFBj@vH*?w22{g``zaim?9|LHbp6-Ybi1A}d5V z*4p9WW#q^+Nz4mhDA%fh_m!p@6l`H+(HYP*Gn$`c=RLY zm{1b*&roQdY;k$^pr2N`C2Y$nXU8j3sas9iL|^YK{v;rrzR0jk={eX>96Dtu^&6R7dL;wCeW@|N{%3wlvDUef@`#eBG^K z;_OtiTrN|5KPGZRs7$b)e4>0W?C5|^XmT&~LVz=kFC?X+q)|QZki35T4)9#qiE)ml zvqJtMlXFPYmu|nYJ8>-_N{<$X%+?+G7L7Eh-j}WgM21gqxlPPkUZDgk81Oki3x^(O zsl;^T=dXa`f;TE`H)qAQL@(&<>MH*X!bVM8e3q*o+axip;Ym;sTp}b(_7i5f10%&EY=%iptM^cbhWBn4<$Z&` zQ_z)^4V?p2QAT3XfC%P^z7o|O>yphWf2te*0T9gy%vdJdn^SxIP+|pwQ5xTiq>g_WxSZXLa41kF(EBdh9!)ChL1NUnGh@V8Zg5)CT}D zw&t}R-H5sYmIzLGJ(*U^S(ang-7d+!fvxkkg#PgL#6Y!tvTMeevX(9yQfZ798k(=- z*5dJ#Cx z&q8A^QtD+Z8TC6&lH?4Nra#(KJg*#m*9uJ`YEaR zfv2ZpC2w!S;5Ou8U^8&g&|7#H_}s)L^07ri9RR(A#8-w68a_^VB^V-Ds&F;$0gnUN zK*)=nXjt#&Iyrd}b?xY-vT*T|3L(cht*CzH=<5e${w#{8hineg%e8b`Yr6P>dUD6J zvUVEAJBzrv4yX=8Jcrsktt>v85(Idd_3)dHPC%5El;zUD!-FX;&m+GV8%7hkNt4LQ zt4zr(aNIH@PXW3UTrqbhPR{l3w9MeNG9n23QJnv#&}@jv=f%lz7bc4B+&J#s=bg0G z)gBj7F6VuzjpdrvZ?r)l^0k49QoimD&2MD2@?iI}BEpXK1$_X4@9ng5-UA}|B(nZ^ z8+hz()6-t&89q|@sMr)SP!nUn6S(wlkA^PhgadW43=b^BFHjG6uHS0!zbZkwMB5u` zwGh-ViY9#OPx=-df&ImpP}YpQ4^E2@abscZUk1VJ&GZyruG{`Ff*1B1M-VnG277j` z?}EUpaR+UYXLCrKk|bYNm-l`b-d5C%s~?d%0awLkSpi#}o@eQYdjI7UKS`?qv;)!s zLP4gUEd&OiD3V=`YTsJF@YOgm+BkUN(aUwt9~EKIwb@OB+9uM}VfTo{|16LhprvN1 z2*5~+G%M6c<9biz+NDN!sT)$WY#lYlot3)9U$p58!Ra8`7fa5Sgk?V3vr2&hvu_ik zj@S-`aP9lYgfKg$-n#QU-iQ5ItAkpixZUY@=2fg4GX3HzTW&5~(d7m*_ zxw4-?iz!3=_^3d=gf|WL%MKo>!e7d@W15|boo8SxdiS zq3<@Kn1^Bfz;IBGyNxzii`_i~+iT|gzwd|`)q_GPlxt&~Cz(x}{ehP_=o<(tog9B` zzBP&RD&ir+kTXwBbtZMCnhq5F=8~i%WvSb?^G?rgF2| zugInHmL4}JsZnZtr22{=xen~1m2SfRy@&PWqo02<-4@@6LT>d`R_=Igq za*md6&eZ~5w2NRMmc#x!QU(92_DAD=*;u+Q{9FI&gyP5&yF%JDt6&>eNd zax3pEA^Gc%tru4w9db)V#VBRvB|nEsw|m5VFkA_Vnr3-HD3qW8o}eTk@A89WH=tw4 zj9Gb)PSjWKn19xZ4_|#ZwNT*B2OMyb`BLpF-#jT*D-{Ms>PBtwcAvkE1f&b|@yoAm zUtdj$IkYPs56X{;v84CG{U0umd|H3PGs<`KTW9tufz>C;GBBEs--HN2Y5TLR^jd45 z^zh45zjPJN|K_pcZh7ZH->qk>E;aKgq zO72{?TTWx7l;gAYJnNmdDjTiK4W7;4l*<26r!~Ses=h^2TMn$;eme~IoHkcSY7{<8 zzRD2iN;dN< z@E(S5_1V<*iA`!y#{L{EX<+v-C&LiQnG61ab2_KIM(o!Kj-49tVGY}|%y-hJQYOEf z19IMw#7Vnd!}=^E&T=@kcfTLIr$Ol1x3U5?ne)l7=nJ3FL*w@)wQ^+##o}ck!!B5X zDb=2#J5g-6nRau#*LEy3PP1(P*5-0^oM`$Yd(A9(tr9nYMco5YXNmj$Wyi2y#+x%$kn*oEiG_r2@&BWP)L{sCCC0J=QZQ(N^|BFHG!C; zIiwyI@=9LCRXT#zedR0zVY@smu>z_IIf7CJ=FC=1{W04R=%FAz#rK_IBI+4&X6#s2 z(&TS$+!LL55^ZCX+U!y4JvDP5GhM#rTU%8$pc<`Dd3dZ6ki6K1X9PqDCFrq+679C& z^8ehG|Ch&1o5|BRGrAi+NM$&vU>K3+He%S`N( z>xqJ_%UVepyaQ`_U>)G!X=s7Qmeo&CCt<`COyaLOr4AxGW{Y(Xv+&UwAy3=q?EDO$ zw@0m!**5re>DjrKCXThVgvAZeQgvfh&uyIJI?v#EChh19*@mxLZV4@!tu#Jxf$$_! zR)rLaQf$xp3&SttNe?)tpgPNj;0)|~0Uk~JLuxq>V7A9i_Fi_-`N!jceozpM1{E~& zWjE!yRG(VM&U=tg-{q<+M>Hov4q@nGT3_Yls()3N z7d89i>l6#bJsT~-LBfBYk6qIpren_@v0Yg;SJ_OZsb72q_hVm48b&LrXD^8K_RW$M zkIV;l0@4(8Ow=5Ds~@cH_bEpPyXTzGT_v{XhV^*YJqz`0lQurBPok5N*L|dm3l>rA zczPB=N&_O6={+j6(8Dha&>e;2ONb7?2*TIWE}NhKBF@VP^wQn9dWc#V^395= z7k785a>==yUuQ;Pt4P0`tY2ME5z}>(AIic#^jCyQa6aYwXQNy}um;W%Oh*ZCLoKFu ze>N>T=oM!{B9O{bTmi2_=r;zrh|7nEEBXgT<#L8g6UJMnuf{PH7_(E@qSZvNZy*lI zJ9oKjhkGz@AC)akzqwBt=kBmFa3LWI@2kgxx zt;)bR!xXOy=hC%u{eRH(lKPxHvCd};ck6S};yU`YNMszsxQjIr@)>OO4!S8ZHi$!> zVErfbQamUUpxO9bRk=>RM7A^3*mf$a+?(Ov4|n;bL*OhN={$Pljek#$MTvv+J;4BZ zEj^>key-3NNws9d>gvwxI;et*!~gyT(y2s?k@ayVH+^a&SYB1$@Tj;gYrp2`roSH+ zutqy*#=^WJH{R;as_c$w+DKvm zd;$E)m*^UhyEAuQ4+#A!^mKq9lSrIQuPa+MgGS~4D5sv>T9qbP#n!2&7Ek&R+m-J6 zU%f5uN+hJ_FxY5LO5nb=M1qF4oA!-}GW~0u`$ROc{)2BWB=4pZ;GjG!Wps4tcTh1& zCp$5p#z-q4beT7$l!qiV1|e3)qvJE=I^37ZU9fpjfBrMM!L&%P7Ibi zz#Ao@TB?qbxn=ad)I=eiclo0!kAHMYcB%t!!2WcOWRLmFA{5E@4ggnJkxJOJ`235b~f|l>Wfrm?t1W5)^AV=KccnNWGtvRqNCe-zM zOtu@qhI-1=B2%tfM_cnQS;zRX_K?u>FWy+;f;4a9KG^u0hUQy&!NY`jc*bUh-qW$G zk?V;e_fg;K4$jT;y6`wr;sAN0_CkCvoi`ShC=63CqTk;*&P1C^+_FaVifNJb-e+ko zg?BEnqaHz|GptK)0K1RJ?r$Gev}lvJfs6a=1<_DIm&q3aVB|vL{^w!R9ypTh2YUed zA{z<}?;i{QZ+ERXt-_<12`RoxNs)p9+W*Xsx@jd{@GKOJGU-ztD1XDgdIYRt`5&xnbgT4)FRdp#K^&GD%_Md++16~0H$N*m?XX5b)7clhzt4pW1U0FL-fyX zjZGUBN%Y9O7)64({8=`GqzrAYoKkkf<{mBk*S-lJoeVgdb{?Mf5Ov(&o%}T8-K7qc zux)HVOiZHbA%IXzo%G1jFk{dq#pwV&yNY?=4BtBHjWVzDc@=gLTajWgAIKc>n+9#V zr5snLK%wbJ(IWBkf{Y$LZ*hnxWFA4aaXFY9H5wxw?vzJtozR%n&1R^)&;4=rf4EX_ zD2}8kt#M$*2c9X&-m2NBJo}6UR{e%MX%6x?So(j0z zC7)aKi*(o9L!_N}HmFfEs7lH^s1IJ&GL}={k6Me#)tDL0N6+1f?HVIZTj1o;igiAx zn6f$)*@}|Zql5f?&6|nQ`F*_KQEe!andPgDkc%Mxq@2>8sIHzO?Ihqo;0&i!gXGP1 zn11Ot@E@onYVBu1L3o0h@H5*uTH^&?Lk)$qfIJHeki_v8)WtUzv#WYTcViwcpDY7q z0ncj>mPuq>TUT)Ufzu%dJxj@@COZLjB&ROW%D7;hvhr@$x3I{QH>D2O6pL9p89uqX zu0Hnt;=53(M!5OydNZMa{%uNiqkrbT33#eQ`I=NN!kIk9#KAY|ONxt<=QMnnTBX3* zX)j4|y|=NA!po~dyc5K{3zLC2&cQbq#J0$(KdBmUwe>O_11Nz!{ry@)WE$X@9Tty6 zcWpytW+fjFw#Hpi=&P6mUXr|!V>YIM1hI#1M=iF7PK{`;s~v1^+KpZbwtQj8<9c)2 z^xjC?pV7UL)$961Wy;CzSUwX_syX9$TCTiI_SI;Sv{P)!=MRZ@qu&wE!|avX3$a+W zA;%fiOwD4P=GfePKnbz>!ONuI+rDQb^!(h86h&oU|+IX$BZ(EI+gaN_43dSUEu4NH&~t{Ll>k?z(uk@~Z|&E;UbTX*^L zdgNrJ;oC$0zo%7IlJ%ORo;x#$j0& zoYh|c;Y6(nvME!Zw;tgYaQdC;ZVQdwqPX*W02AKgM;Y&}nPYXMUIuUe|Fm!V-Zv_y z*g2@a&+7~xGyiHbu&NatD$#DjDQp&PjcgMMZ)-pxPauu+KZoI^H@6~pkL)SiVUaXi zbH@*!P~v>QUSMq)lz(fizFQQf{7vt3C=PKc@yh%V9-UVe0hPR8)_}sB4d$T~vmyYs^LCI6z z;Cs#{Au07@8@&8rBh6PHWytlY#RA`Vi>Z}MQNrKRMdBoD3r^N|>c5+;Tlx@dJLIuC z`9(?QX`>1G=S9& za@?``pu%j=iU;oJN!0WS8}N(4szm0Eg@+p6$9-DL4jJj4z=Bu5P6@N2UPPau7k7PVK|Y;-!KqeL#;xyuy96|fB!hkWlq zB}wpH7v1MR&7*LlC?$9P!|(MI6+&1?R$C}8+@zVQ)oOhzOa%sW z`Qk0IIKt9lEUv3Q5eqLi@M?wW!bO8!JW_a`!8b=@*;(mj1b?p>ObF3B;vjifN+TpN zGLwtJ`_>|j^>H0)a6EGVS`v2>ms# z_Xor?&i>1K#Q3@;Ujv$o_Sr&dALLvh&b5>@tHyuqD}w0=1Rwj+Q#85Vdm)C9(3Ns= z^KH0;nk$Ym-KG(kd7f_cx7mnmRNBG*D81))wts7kYlP=`PC3R92b|TmT+9SW);_sr zzX$u<*}|m*jo+)$R}b)k9-s-6eC&-G9U`Cew@2{O1N06eXz9@8Y6izdCy?xrES~yu zouKlJt`TS^ogtCwS0JA3vrmsaB;@{o0O|jmm{|{N%C`2#A&J?^N&XD%PL1%FC*@AA zXAehS22XYJO3oS-KZp$Uh0CZ3tCsQPW$&S~uSNdHTzg>6)u-}^vz>c5Jp7+VJBK8z z7I$d%NI!05B0O28EEIn|1h2oJg;pqt;G4IWcaA+xc& zBAmZE<2!VJ?_H3v%&2m2@VENSn3f}^bpK~}|Bg|Uvl9fN8MVEwKzn9jI%5WG2+Hwf zoa0b35?lJrq9%;DX@}F;CYxv8F9>IB?e|jcLoS~W6!)suo}+c29czQPl6_^vFw9rI zeQ=!m^59@Q_;w@fy!M1XICj(PsFz9WE)#hWRR^bSzI_u-&#B<}5Te8FPBufSrT#^3)PY45JJW=_i&T_W}tOgJ-1V}yhe>{qNKT~YNt_7np~slGTt z8(1a;Fe293vHzPnPdc3cbU`5oY7NKWJr8pkrnH;Xn7~foH3KLJvsu~IHN4}c67B0H ztuek1RlfrFnmfO)5!}UpS}~XBSG1BQvTB-J)o=-Yf3)pfjI6-33kV%;{fIuVuae2|Bv@u0;aFXlgE?KLb<^M%06Xuj8*z7jn z0Z`1tc+DgJh(3Pc+9Vhxv0#AZbK_HZ*w*>5XdaY3Sl@HSyDQwkeneyTIVl7f?zJmOe^;mwe4rWvngT9!{x zN>V=*LasGtLwwFX2NgEny=T>{tQ8Wf$SF; zQ!sk6OX6AWLn!!u7+N;XeAhFi)Mn?s{QNwPo|RlMdU5hw!s=bBF7-3!F0i$;@|WB> zviGZxqQU*-wcE(AL^(<6kcH14Eklf$@wX(on2Cm07?;0MXli@*g^HGbT8mF3$R%0L zM|6tQk-IBQmXwAo^rYnS$7;ovGfT4APig88VzqqE+;&r#ARoH1J0va|gkmo1(4ac)9u zolN4eBO_VAkMMJfyVfnXBDw9#c6Q#a9R~}O6;z7UDsha?#D?P2N z^Qdh@R~iNVVWMnQN++2K=husHwi^MCj`Fw3+R5?j1c}lc;CoB{^7ov-_#aArm6X$a z;URz5`OBN5&);by>VTB|;PZs z*sf9n_PR{_<-Ugkf^}avHZ2f^posGrXy7P?)sS$xjG?MA+DvsK%;~=fI6b zHe$JcsB^PwUMbzJxr`*-S4&C>%yO{yvI>}TY#FzM3SZ(u4E2lSfh4M|F2Wy-Qrdp~ z`>0;j2?vXvYA|Kr-dMl%h>{6=lVwI&%Y6aRevxZpTbS(hEq6Q;cXr_N2>L02s86qf zuc*~n91wT8`z17x?{qvc3HYI=?_C4p7W3ns$E}g8{{)BS%jVjBe>P3KbZyLvgG~_h z;KV=KA%z#4)~uysmFB~aHvdA$bc$sw+&iuxg0=%|V)?{*Zj2`z$oS5)JTO@%m-Z-B z#_SqbB1Hg$xjz!9QC~fTv+^=q`(9pFFi?M&_kviIZ0x6k#uNW!sf)LECvE2msC%jY zIhZ(RIoxX2G0?5!7YWD;56YXBiFN2Stcj)+-q@C`kPy%eS&eJ#kJIdSulnrL_%jBC z*x)Ww)X8?qU5~GO27~bh`1+L@NAn#wxzK11O!LTK-CC%jNStNv=za9N^p7Tlb65vP5-U( z*k~Ydc@DMM#whc99`@#HbRA6lD1G>?_arE^HJOvsI%@@(W!#Z+2=j?5`<|o5NBZvq=7Z zlO{JY^lTdDZgM312rjwuUz}lamE9%v1Sj!-B%Oy}672i7HBB;C<+q%urD?-GaG+J2|!=j=TU0I|AtMD*nx$u#j#;+Tr^R%kZBSpNOO8&J1%8nb-K03)yMA(-Yx5S zx~z^n-bs@lvc0A;Waysfq>znt5o8RppZ5T(xK)S1` z3}o1d#t-O4v*=s_A4DrcJTk*azV5Fh(mZP>X&`C;aA65zUFM0FLoe??0OQ9K#I2it z=DLiWaD@FT!6{6S`mgNiW5#iKc(x|VbwdEMO8rPkxr zF^=ZbPGyZHos_DXSZ1SQ(?+;XhN7Q1q9y$;A_5r8B37P88?388NtiY8_jB%qZFRc> zbwar6e0AGZOrix#6t8&4pKVvZ4Smf0VmL1zf+nCA$~cz23s~PIyk-k~9dHI9bF?m+ z9bYu7WhEjf!XNzMf~wZlzaReLyJV#>JXccu$!q!%Q>5Zt(cs(9vCr^_}!GJQN$=6)13y`=DlD$8#H$; zFBWw)O}?q_B6hNPC1UYcBu(NkS{oY^JWOtnX1h)4I2r+(ZJK9WxTHl-LdR&lUv$zC zu{AAELXsbh6Yl|PC{n3xAdDwgF-r8@!BEfPO`>G2>GY7}-;*E~65DR(X zPh+hn8&8U$Z%C@-+iZm^$4bK@+dq=R9@EW{Wl1VPosmvwls1^3Xfm21lhUv|bGsse zjm3Lbsq*>_1y#X6_OBHREn&2_J$~_pzuZ%2X+W_~-52fFGWeB&!2;J|?7{ehrq<~# zq2>JmR8J$Dj{58rZ=Er19e+%`s|3rpEetkyYjhd?a z91}~{rJ6%huHL0Y9M9H8_SI$0G8=7jldS!1oEl@2o$3rF2A>!OEPit7Il-$2PH&@6 zro_Q8Ob84Uw(zsXvuuE1^hGdkU}&J$aC(sa9NAJgrU9b58$eOtE4Q!p$u6i^*7(_? z@@hR}=0?E(QefxE)gnp6u}?+m)9Kl_YHuTACOfh3i3e}tl>uk9OK-2fgjEe;5nI1< ztGz8w+b-%l=yo<0Z}-jhyfI|RfZpmVu$+;pvybwE&4nH7*2LJU96qxw=t|VcL@P*iuqa6H3ecrC>+TR|CGBgr8_e^e_JisUJk2kJRHI%9?J zgVD8Y*7ow33aB?sh;tUP5UA>kP@6#@&b;1dZqo1;+VC5;bYMN*Z`S#5Wy=n$`Lh?yFP-fy40YqiFWoghPx}Jh7kXLq@Oj=*qkQFQJ8zx>o7wucEKfwIybRTJU2TSF zIe#{qxtx;$GC&QlY0ha=(NHsUnTUT6qy3bS z;Lr0CA#H4TTPZyn89u|){95Bs_>?%7rg-%wb{qT<5uIBFf6|x?9PVMI8-vhVo<|Y@ zpu`n>T3vHZ((FbC;iHq-OZ1%NasEsTUt7%|<{bFTXK(X*>Th}QRX3gWA723|>Q?tt zzhzC+*PrwPPvyWhYtIjIqSK|ejt6)-RvpAy8Eu%I#4vEHYsaFTPgvg?lluQ?s>>MD zg&n=mJ$T<20vq=kc+8sLnw*Bgwqd_qjpVmLJXTv8C$JiZ`Qes zhb}g8tmqy9PUkL%d25?9JDY~@n{tfn_S0XUPzfjaR4(UVuEDR4r;->`he+wJdwXG< zLksz*M@+)_vhd)DsqQwLuJ6%0^Qr%K^Q+M_X@r19Ow^I->DqZHhxAQyK~q*}peAMN zxc$|(EC#ATRuJXWNcoje>5W&gDhG~*7|pROg$6{m@#ofPMv2a&E>>)?%r_Wzq;8=w zC++aX8+Nq`HMy!L`={2gyXLCAi-V4YE9M;<8wq7YTK|M?R}g5gF9dsDs*9H$B(xcQ zdMpl^#PZ|9C-5cbGU)IHY~gm=@nG9}wV zYw=36$-#AQ!;B71W?>}~4)l888{qWN1&ru}W5KWtN#yK@f{5ABfCxIkT4 zjo?uK%TEQ_aD@nLU)f^Whr8wcrV+b@onpV)$cO+l5xJ74!l3=X{?=~V9>;Z%3>4Db zx*m%z(DM1eNqrKmr@gIYF>Ej*%x>}tlPxGnFZ*8hH2mjvjMZ$YrV@$*`VvGfkquz} z1!oz?4?l>#C$f7}H~F3jY$FX=F=+_a?0|_hmw_ty-P@{574wi<60a>};y5${BHJ)J zdZqbAeE8mXyCZ>ZN@AK?+a)7G{_m9w9oY&wSakf~ZvBMGT#heTTAi1HCz|L4ksA~= zZ5Pv6w}0@ST5=Q%@ERp3Xa{X`@Mybjvf$dw*19MrIr_2E1i4P*BdvVr#&krA(5Bi| z_v|en(vP(@t$Ev6-$g+y%Ll+_aJ26yH3DZ~Y3Ib+LgNH-Vyi1}OMERWH;6I8N6AMF z)ksMMI;^%qPny4^w#&JISsjJ)#Z14~09!@6YV>)tzg7?Y&av|GV0znoEjM>$mVfT3 z0*ycRnvtsj>?Sx%SMQ8>E&^|Y+IH{F{Ovm_X4Gx4EOWu!!BP&HM*Gg22L_ZY;u~)s z@dHmb-;^`vU$Lc0R7K)f{K^%YN_lsXJLed++*+Wy40{LCdr>(4g>F`eiAB+XB(5wQ zB$uUF3G_80vU@WgGtN28RBQ7YT??>VJ;5`t&bs!Qwu03K&br0o!+oUJKX5KG% z(nbAS*ZN9=rQUzw31Ms_5RExn0ec3=%i$zUgR9hw zvG<0Is@`3ZweI8!bn@zBp?a^UXFn4^+1k=!ES&B~<-pflPj}Z`Pjh8Vbtxlg)7HT7 zLpF8&g`srO`EEJ7Szcr@Uxw-IlUH=?R5yWPX{mTB+6RqPwfh=pZ&SAw+&m^Y2J^SI zsq>mBe_Tf7Ltm)1O?i?O1tPfpN(#&(S#*alD1D_rwi-u-_BZWdg2ZtftzLn2p|sS0+2FB^z;uvX~s6&k%xAZQ^XJ^+6!N*(E|nfoTjv^ELn%f$17 zNbI2jLw;^+s|Ow}NtOHg5Bp)!T${S3 zY(?OJ`QBUh0M)q=)olWxe?!i##KODN)SLZ$m{P!z2DHWLV4B=k8N*= zB*A+4S(qwvQay%{%zA*#$z09 zh&aT+w=n#*v0g?^Db3Y|nSGwV_z*0#EYT8(=r>Ds`REB#c)VZ0z#i!9l9M(Rw0dUR zD)g09*CNd8UttvqGc9;e%ifSXuSrz1Xr`vCQI>D&BL1wedO68{jt9=EyTl4a{5~?F z?`t*-@m_GnEl&dY>4B;2$rt7@oS;5|`V}95dMXmU) z|A`jYW=}rHD&^vWU4}y!D5TW338(h;=C?A{0@c%C8 zKHJ4PEWbYu{ZYN$#_n$SoA*HIwbiAo)3mvw2Yzi2dI$NkHdb}o9KW;|-)&Eopr?Pu zB&&`mwXZf^`A}`{qoLuu?IY=qepxiu=Gc}j&V6vS`L+Qao$P!m)GRJPR$E4X+EnJ5 z*F(|)DNpB6m4G~d#p*8K7S7M%S@@B9(C24?t^K;-f55i@c0pe@0jkIG=&0qcMRddF zn5*#{UqgYcWV%`_EdGhhNbEV8xz(-hWGB%ZcQ5gZK9ZybL`!ZWV*YpVqO7@BFymU% z%*crTYySDU^LE;BDwap(8RUzP*-6_(2Z%bV5a!=b|fU6D4;P@)jg zQD?qxt!IA{N_U;{ddzOTnhXW{ulP^YLd2iW>`RYcgy)O z+DK>vaI6>1DW^i!oFMjISSnS3j_p3j6P)$Pn>9V`wM&l4GMM>^O$0ugQ4UpM2sPd9 zxMWF9G|h`up_N18gFPw200(B}FK@qlAER{RB|d|FNeHjPH|t?NZQ9EnI84${AhT%Q z1tQ85)$2q2DrFpSA;g}5ZoiPU?d*^e)hoYF{bd)}kEHhBU*dI{|&yKy4)_?WwKwFn{$k2Q6O&e1ZQY~6b{LutGqcLo7#Ym5|0-^n8CyjIV zmt9%CGc&gl!)UW698Lb;y5Do_()^8*^fcDc%@9TzAqce(h}s5}AAXK8TpkqHNK1O# zpq{Me6M@GMCQGRQ6{EV$y|iT?K1E&L{fNbZNXhgB-<6xWAxSP#qwe0Matl3>~9d7 zI`;r~Td0E9V>6onNsntNh_qc$C#^!OXIC>n+t)_1CVa z&{+~uJxj*1tO`t*I7@wwd~iEvV!6?X$Zb#9;AFPf+6F#FQVzPD4DcPeGdb=iosoZ0 zbz<}kL~N3`(1LHD1MCIt0W61Z-r@~Yv-PO1v)CLhbDMS`SVvgc`U;^>mjxKAda=ei zGl@%>7L*Hkb|&)94sK6G+ZyF`xeQNBafK50WW|lSRyfyBt#a}E*TfcP3OGMuE2moo z4{W2Xv(`U`y-Ef~iD45;lMt7^Tgej`?-Rmf_%u6{yRrH2+;%^8K0J%HBc}@oOEA=EeW#+i^T&yI%tm#%oq@ypl$@Ya6mqu{@s@Ad5 z5^H3g3U!`S1I#2%(xll@vxDyGakB#EfpcP;0z*ye@=ZDQ>hjYRx~?p9iYLc^b_%s> zURLL{B>m{SV=p5Fj8|VnQ>3~P@2`)Ix8C+daSDfj>GOYPhofpZat;<=#$+q*4Cd^< z%n2Iy%nq3|7ZrYYbjUHd*|Zj@+P%$N%%Q2rro2A2`f?`lllM{hb#LZh>-ZQ;aj+B7 zFe!E20jF>0GUv^49`zUMjn)X;b~ws_q% z9nv!UL)JoGlCWats}JC#<+J=IU!UeK0T?r0N>z8lg5hbr!~I%M zHGenz4;>NP-?3*Jh_0@B?ooq4W5fI9&>zQM1lC7$gFyAS4Ty)$e1NT$o z^e&4nXZ&zkdHFtjBQD=31eOOV{AqsEM+sOz6k#a6!^xW<_uee)Q)2{ez3JsYE4p;o z(~avU0Srkd_ue3e&Yr3+tI2MZt~^az`95LOgr12ul9NB`h zK2QPt(l2?waezh&<<8~Upbo!Mm!TuFDg71>px*aqD?O*iy%|?nj+IX1W19r5K0SRA zMFKT$_mUBCQ&kOg8;wVoZba*>S+q(T4&pY8aF`b5%EtrI;{x795XLrL8D?}BxAOxT zAS555?(pZkcl* z-)c7K*FS|mJ@PtHdzzGmFCX$Aum5)8=b<UG(C-q!Nd)k!rNZ-2JdDXsi(6xt%eZk|XQ?J$GxC zbB+al?4O(2{U^3+zICnnpRs7qIW-#M+c=L`lgD3P@yP7v#U}nob~B4V7};R+x}B6s z9us+fwWQO2_YXF^+bVYc2`{vL4tJtiZNO6j6%Oe&1px6&@a3pAlGL@TGmzy>w*JxS z#>F27E`3azJ0v3I=K34;6wR^0s>$ey#-&DJXrp{!u*f;p3pH?!(7GJIQbQ|Ju=}_~ z@0{TsoX3STkjZ~J8aI=c%GwiySf;kCOIT{Jr|{Pq&>@$4_O4<*EWO%HHAzUa{nFp? zGugtSFM>rkVjlta=A4D9S}80@Ri$h^9A9v17dGHrg{L_1GSqC1R&ajntDE|CPi8n` zv)36~@9t<1JsHuZZyiZ_UDP;q)2GY?-RU$@#ru4_GUwJ@ziH@%tIegc#~-daEBG(< zJRq*Md^#@O#6Wlg^+@_P#4~;QqLU%HR)G7L}TGSYIgFSslnF3qS z3W@J$KgXYrVuYM-5@067gHqkilpjGpikLV!<;y

7md#%{eCc>txu!Pwil31&X!> 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 z

+PW(AZZiN{>mJnYYGOmR?~GT~pV(!SsZzk6#j3DpY0xui~aH2-))!!!Wrw85$R zDrB~h|ITtH-4LHhIoO=ywkgT9#xD5a%;KC5QF?j;``E;1Adpa=F+Mmo-xe>Cv(!TT zINGs$M<{6m_WDlWmHNcybPjSXU4Mq~pK4Om4;Q|&v@*+R-ya=;kA&N{a`CC-30sAa zp!b)$sriVv;m28c+_r~!U5gKV1S9MuIuZ6?#Hh0<^2`s^+skI4RqJg~o5P=2LlM6( z&%~T}vCdCp-$_^MC?beZz4w(nZG69ob@~2zc*C!Q-_;)?h^Wu6a{=ilyY=PcqMjdd;TVqSkA3x;ZG3B11b9I%&o^T^#ftp71?Bg z+=IEb`~YiH02i~h?3;5ADPXtl*bmzPQr+nF0r+>{P4=>GYMIS@ccfw0!7o(EdZ6`b zPhLUBb(+wdM}Lwds4G(gP#3@1dF$G?)J}&EKAPifWQbmCPp>pvVdZ}I8;96?eZ>Hd zlmPKoOdD^DO2f+>uSRkV3Us4P)~B7CqFtP*b))v!DsI3G&rPWrqArb^bPEwU$OwVL zA(r=QZbWtqfF%z^{bcM4BFix6a5md&&Q0uUE|g!(;_W9s8J!U|nG!ET=%D|AxW-{N z*JQ))Cxly3?2p6Q#ou(V!#x%};yXlqTMvCQT*X~lj}G{GmS0(<)fVArNWMA5n(}jV z^?PoiK)s^-`jJSJMd9bt^{@EtfNwYLtHmkN1nPkD1gj??PY2u_`-0Zq#AAFaITMSr zJ?A8mHc5wu zq>$d4ZzpI0T}51_hvWH%a7k$o%Ep>&wnA)IIbiu&0z%t(>QEr=*fgX?gJbv1r-qXb zftKyP6I$!(mlxtk!*PQK-08Yh>xA0q-k99VL2Hf-o2m8nkTwL$0jqQLBVj#%{|6NZ z8lawUnewg~7_F?SEjx^uAGI4qHkp#y(}5C&VE>URF&ijlM&QUMOI99cz1Ll`h(cc|o<}6k?KObfRrBrSz z<+e_48}UnR2&Qv>!89+crM9}hc7|gFEa4^M2g9hZY~PxW!Zs(8nt**T{dVqTp>Cj} z#_|{DmA;dzAU+z~Gw>_EqD~ReQ){6uN}>P=S;?a!2My4ABlHW3C{2G96$0suRDb~sUU;w2 z7q7L_n_B5L?Hh0C9SX-Cm+kT9>j+@&DOJUQwoxR)hXc_yQTGR{$5%wmJC_L`%w393 z2rj*t(&>v^{~u7Q5s#VB4^8F_V!06+TPLle)%HW~MG3Y7q<_y^>?>4(qK?%s4YroHv#1z=LBN$j1v(}&)oOsbs4@3Yz^mf4B+gn=sX{K@7s(z*ELu_(j$_fXkShqD* zN64k+4DThTL-Z>rn=_vET9u-nGW^l;Grkh_!rH@sMXhtgW?8diYdEY;BpO;x(mJVtXfmShjpvpz?AgGrK-mY55Y&Y#^aMa zsAGt1ox;(o^U!9M0)q#*+`A#Bqd3Tj3=PjeYZvn>y;8iQtfSLd{!z93hgFFY!&hkb z;i<~M$DnMe6LiZ%5|rt7T7BJP8p60I%_OwTlWk3mEX;v?cLZ`H5(bZi=qV;zA&!YM z_|oLeGD!s^!81l1u?0b$kg>*5)*6}JHFZA|D5RMJE^h3-^h;qGGDLf*z0TxLKD!g1 zWIEe4^Jn^-G+wHUQ6ZaJ+wyRq496N?2+j_@^z+CEhg+FOMg&cd2LDqxIZ_$3=A!#J zqw!?@9~f;}{9}}3#AHo%X?_maa6Q_bVM%|iRkKxVC}JmOFnbs;kR#@=lN7ahJ^`AF zQ$JW(%=fDUdgp#n7$%%Rq8Ux2ab1BYf%Ht|^nt6r6$9F8q4)O=FL4|a_@rY6HoKC& z!WBqpS z4WoQ|M|D?Jr-RX4wXVzs0#4(ZDI$%IZ)M>5LZTvx>TseA zK3f?Cdjvz`y|^oPehxER*9()E??;KR&Hu+GaOYA}^Gx#`?z>BP{FOYYxm)SDpeX}6 zKGyD&_!4sUpqsT0-la6ew}Rom_Vg`olw z(@!yXO;0wS8|-AI+9X@A)@j-S5*T(z7Mq3~8u<-p<$*@wui3Wg8p6|oZ5~IBeBEb; zM9=<{-5kC7trFp=Q~$mNp~jPO!+_ZjJtC(4U<>%ps$8pm_2hB6jIyXrI%4?kO0!dc zV2C0V=$p-BH6yR;=F2@b8J$cj;n~e&X-+661$_7G9BAb9VhinylQEYwr;69INv#Us z%S@_WTje3-8=Jqa)xm8zU?P7&WnO_}?2+}Eb2GsskkY*xXf^X8bRdMUxoxD%6WLaV zuM5}nun`tG$Yx35Z%gLYt}~8|X<}Xt-dz`!v`7Ioug}2CAT$+Sii!fkWt7vbjy&^l zIRCvT-bcZAD$wPmnXRX)!yb@CX_mR#Z?-P2e>Y+qrNquJSxZUr>*FAQh3u8?JSJC= zs=`o3y8{hVLlnVGoT)R zO$2MEv2tleTma!?;xEjR&*AzRe$y-b)!-{mU%VkYj?eID8u|Jve54_0BAf%(?&zB( zSuuTzWqmqxd+G`{>3=uk9n;OIrVVPKbyOPT;A+eMTSUv zGIOFc@-CtwjYt)pp}#A*u^}TY7$fj8x|mEymG5?7ghd4T6wYCfOQ9d=u9n`&pVocP zbEYSwiDqc=*v{2{BM$G%dXm5RbPnScksp`I`6UK}+zc|u74ilAm^6A*5zxhdorY(o zBbhM&OV5)jC1tedPNpQH7i}CR8l}0pm=3)*_|YqpK!ntBk-@VSxmAOgK@oq0qQd>| z?4M6BjkoqW<^_x6ty=kPvm)H4?+ekIsN=b9GuK~umsn}dS9=s0c^+S)%@mD>S3fDt zB-f&y628^9?4SPHD#ITfR4Zd$4|&MQfC(1_M8B9iqm;_Z5VB?bS9X{K+TKh$`ji-( zVBmC?^bxO6UUu+nY;9OvYq`X@uI%wF8Lxmds5fF9UG##7Mo>2|olbYiX+PY)na#4c zh-NwO447vXO#E2&Vk$?##MgagH9RZ6a+m0J!-sk6jvcG7mg=d8#Jps)kC!KF2n`Dz zX(_Hc5=ksSS)+D5FR;K(y0ms2Wh~;>@@i0H9O?g$qjT|Ry8Zt+ktL_f9m%oC>UPQ@ zhdFmr37zhcW6omEXEvu&3QNlQREp$$+MGuY!!QhE!!YNW)7aP?e*6CZh0o)0JwDg< ze!pJNC%hj6D$UCFOu4MM{9oMvF(pv<8)%%xLF(NN=Xd#v`HTA%x%0$(CRCB!_96Oe+qLPtvKBI=V82rE4LPAVZJWsE{-13`&cmVCDr{G z`~&{@+o;Q&!7)Yb(8YGpYtfB%XLOdtILRcgtyg6ZWMj66tk05dmYFW;AC?x7Ekk`p zwETcl$Bi1c36MfN*5;@Ak@!RscL7pYZ>YIa$I?526|kfg7i_BinX*!B${LJ_;pZsq zdI`XUo{tq2Gm6+OIuaDTzIc&>SF}7~2VO|90y={psKOeE7mr8Hi20~g>q=fjVX{#5 z6K#i+F_O4@Uf6UTr4ZQjhHQ<4Gym?!L7O+btLLhd6e9Wy4!Sm3zQ9w%986BL-;*!3 zj;nM_!PRAzEybp)=iip5ODMW#=U<_5PgdqWnc-GPm8JfdWdF`Z(a47IX>EBjl)KR} z2Y-_~wo8XFt4tKF1wi(bG^!$D0v(22y?8Xucur)mHOZywZru`_dmc7vYC)T>fP2i0 zr`qT&9~6au1)0>jW#8xE|I$P{~@Ns>>K3D%@LfONVs~ zU7o#V-Db5^Hm@8cBDXbi?eMlIR^nCAaSa;7fONg@9NBlEN-;{Q%*1tSqLGkvT(-Ec_Lej_WIJDk-0cLT*r#w0?vmc;@CN8QY-#xc>V)jiEL`qLq6&sh_8OXsJ6Q(7;(pD<2m4zdZ)yS zU@bV-I=7uWQ_?g}liRT&=-F8B2hd9_pO&wIz7Lev3yasFGY+%uf+t=3LY}bYWLl_s zAAK1gFw7wGgZ8J{+A+gGYX8tI+VC1AxNYR(udSA(CU#x5N~mUiEl2RVrHB7SzJe<- z3(Er0YSfxqtnej5YI-i8e9lmfr-+e2rGj+1zwwfTH1Bl#(vFqXX|U)E-+|a`>3c|f_PylWYd}72hQWGVzBJiv_ytQ?upwV$#)h~kURdhgsC#>vu z`Gl8c(v1#(aUWa}6RVtjunZ+dmP*q!R@io(mp_IMr(?8#G}pvJ2RVnP=;(pDu_=G+ zHExXvMeuoQ)=QHxOa9M+YnOf2jqQr2WaJcFYdD;!5UYM`e0?(|VG(zTDEEAV^bVh% zXy5kPHj-V7!~@7<=P%hIYE}xa?Wk zbt0-DW;gDdkynNe+-(f@lk9p=F(-9*-}G{n<-6q3s6g@ulKwz%OYe4(e3+V8#+hY4 zBf?tfL#8#|7_Xq6`@aDF68%Wca9&(yGh$i0VtV;Q8LMd@c@(O`YJoV$y2Ln9T_<#z zvFy|j%uc)3m*UkD?xx+YsB5l?aD{dD7$8T&ug-X|8aEy5R_; z?uL!3BvkgS$E(R;??BLf zyR|vc%2rI(lVPdvC8AzG&GIo!P$t_{52*h;rKkCU22VcZN@~q+#%-{PxO#E8UaP4x z^hHE3+3?*5WWIHjGKSdJJ8K?}& zL%V%92JDC1l?S``&A!As{=3p7{?(l?QPeH;+Iw^I+y{w~wbxXX+Elg?pp^e*ql&lj zhbGwZbo2`Vu;;D$Q6_w;%ACZ6F|yBuz50^}rP-b+Zt${K3^n&Y!V=?Ee72u@Na%c) zx@nT%z;S)8Cc8mF(x{!v+B%p4AFrGY4RZ*gQ=Hj#Al-21N@r20D*(cl}FaRv7;5u4&+H)LMK3bvMCSlnPu+eslnEk8L@P>^vz^_rrSD!g8peGs# ze6%Saub&SZ+_u{#sBOu-J<8qtK;F<+FNrmvI*QKv=BPKsNmh#gG}ZT(1nW>zlAl&6 zN=^jHj2&wow*$uGngm2mSXu5fG8K%9DR!Ao)~;)HC@!4F0|&#%i^DRN;1aMlD1T?; z0l6d)wf%{S3Kq!q$Z{w8ErmoK*H^%QrCwWE)$9uD-@)FE1uTx;iFLjdHle2lt!Y*p zp4G(hT>Tf7`=myP8H%!}i6*5?NnW_y-7Bb{D;c@M1m_=duf! z(T;;p%=odjBtPGj&0zZ1euMRZRX)-F$Fq~${<2sO9nAX`y~slU*(5eh-vdz~5btd{Y5iWSI=5nRy2?d=;??3Va`b+?kN z@8aBGI*X$B%k)YE_Yh>FXOgf^?M63fsd&3~W`HvqQcOA;2B6}~O8gvV>IAwmM{0xL z!s!)$_I8{$*H5a`TGk`LNr-k@mLl~_knH^>X9`tIP?}ES?1jfV$=*497Q|xA0eYK* zo%0V7_XAUy&5=f@do(6RBPm(dwA+4KISwOM<2+8?XGLq9o6yk zo_nw5wX>g@o)9E1oC$@K>om#|4qBNqy~)t+^CV^C8>3qV2Ntu< ze4A}TTO0_RGd9k@;NeMwOpi!PMUHxUJS>#{-d`ZevhV$XT|<8|RQxEY)KPy>mv9e9 zR4ygO@trVE7=4U%#*YC&gOU-QH3O1RtM>);v?Ui%4Fs>P^PhY96tDOoBuY0CfO_A1pdHw*T*M-E&>sk^D|zmwgp}ITN_hen9Ol< zK()+C^>FGdDVhTWTBa%i(qJbEy9>FVdbe|h9L-#jgWkn{unb6dWX1^_k#Ogt80nae;Q1oMfj~A|1wPh6G+!#wbstHE_!<^Hxut$-3%S)lCS-StmqAfOD0eHK^CW)4nWwQs_$9lwzyQ+g_+8e>YL8&-Wsj zugraWlf?dqv@b@Y6QypFItpfb9v zM8OGHPmbnuoRdyznrbWP%mHn}8EX5^T`in@W)lqVk;qq1w9#zE(Gn%|k}ire8(_ck zNYBY8lzZTrB_wQvprmo-%qTK<5R&PE1D2u@JFIgyFg-3Li7OOQ%B`|BNHbj zKI7bYwZyfw$2=(AaqhLMoN9^D;MCMYrM){S_-pGmlGTZ94Q6-x5F&em?Ctnp9Ow+0 z^Fb_w?+sh-Ly@)YGp1tA6K5v#Lw;4FLx%VUO&IvC#uixtpZmJ%Ke~hcUHEI)r!HqJ zvjuJ$>vCLTvHLn}x9u^#eA)^8rmSMK=V!Oe^SoJNZ=rfBvCvF@(+d;qUPl=Q5#=>& zJ?-Zne!uL;@B~1scu&duA9)=c2vgZ!X;%?`Uc%fGxwXmW`#e}6WJ%gc9djB9aWP)iS%_Y&R89$9my+QthEEP*+$_?hk{goaGa+ij)(y*5kZxk3)Iw!KbxqR?b0Ed zv++$A$h=Q>4i>Wa{Si$RZO@h0{eb8=dn1TB1PaYZ7E$zzFd{cEB~qw``xvHj0gR!cAiFf z|5k_|KTWTIPE|>1hE>O@uSNp56ZLWJ?>lt@?Ol_fuH0*y5F|gqJPEeG0~s~z2ZTJ0 z1xkU7!PmIE6C#KzPha4q*Muot0%aa$uHkr%<;hv-Qf0X;rYr~62 z9WM`I`fLIV;P9OZzhj%MwMIF8R^SZ%i|lVF9)8I+jks1y0U%8Vt&G~YGuzj zV>$(|s#>aSO3i&xKm|+Kv8QSg{w!JSQk91>|+n^y8~?8Y?D>Icgp zyD;=^k^O(?ll6?PB)rFECFhopnIa70MBk?<1*8=+qAaZTAPvmwiCd{_d)baAwE;E< zb*jgXDcjfR%Lo5Yu3l99^EVB;nwC4WlZvor3BwUNzRm6u<8*ebem*_Lracc)>Q3o) zb=j>*odzeZ%5qQW`U7Hu9U82ogk)inS$|9QYSHgBw%&M-4xyX$sTSXQiG}=yEbRK5 zn_qE8_qAR>yB65iLkFhR`?Cz*k{8)0EVWnrYXVy(u4`9Nhj7d7mip9(V# zfz|m|nv?40=JJ2>XYCNqx&l9jq(*;VU12{5@r+uCE;|_IJio`1tW&yM9zFt^MNH!u zIj!1PFa`&Y?5PV%yr?)1v$~@xqTe<4>9^6aS%)VZsx%W0hKrGV#+7*VtgL1SaSH2xto=tCPSLZ0fK6m?(i># zZVnl~lrKnKHGKs7uu~*xI8?>`R<<=inN_KeRs+{V%e5+tZPX+YJ8(IPbIBh9XZZ&u z9$!M>Rp^8tN7G$7tlz4|&{5NpL8ZzyMXK&f7qV?e5cTc)`2v^B5p_WG! zgFh;FjyBAg;MRsgT0zhx6cDD#9!VWu6R{?6OKecTQaN7%pXffRYqN)LXWGR(tCOJV_A4>v{Qhr!KH5h1@Rn zx{O;g@IYG!*Mtp!c0>-qcbXR`!j|r-jKAxnjYh9OJ{Za@E(Z2*yMKf z5#%V5*->-2l&-U0j!NKQZ9nA(^ZYwg_b!13&s(XstL3R0s^rnhoW1|UNqNv+Z@&#r zV&(r9yq9{)GH%{DY5r`_bbRb(x0YT5=h?bi&M+Vggp8Vw0WPnJiiclTvTLf}U-)s6 z>4Df3OHNr%dZ$p+efnU}qL}85^`~=$HQAD5NL(9Q8`TPHF|pljUbu)~N}?1GKv-GT zx(g6-4>sPeMO)L|48^#|YBAQVkb71Yj~Bis!410$YJKd)Oa9YCmyBC#V}kWvvsN0t zcXEsZ$0Efb#0a90cj+;m6%t~P^$?WGnwy5I+WV^f-eeP5wme-|Et@wc*);^Q}YQhj=or6S9^7{OnuW1&>hpH>{s zBbI%$?)74d3cqdA;G3z07Qv*ze*(XLr9KrdtcpEXA+(6tuDep`wa-J*Jy))i8flaB z#x{$8Nr_{&sQfAYIY*TOTNOu<;#!otOk?)f?YGH5>SIam3DcLM!B`z__Ar3p)`jfs z$Cdn`Rig_t)!p_#jM}uWzl9E6oR%`k0zn@4C6{aX_-b4EbU`Ze^IN#yDI!n1A5Xu{ zJaCwvwKNORT0LXRT1@1FV>wg-e+xr_fZ|y7^lTq3dRe2JME&7;yT^B&3ft{DjIqNs z0=%Tx7+W0Sr)wfF$;bc3JHHqp(9^ou9-&V8m%Qf;H-mE@w;VVLwDkv*3jnJ7(hD<( zB9%%i3T1SYpmdG8s@eIs!_&@BoW$DSFNg8zsRdQq+%jEET>Q{Dpn;8LnubXi6xIY@ z%DiJ1vM|j#ejXj^3=fOR*=dsf*L$m!W!!B3)J7Ws0s4b4+~qKBbkx{SvJSa0QcE%T zGQo5BSQ2dvMs8Q;)F^6Rd2P8B=o576@8O=ROix+t#&fVhz~)nXBW(*$M|o@%sd|3N zHQ9Kp&c?v@HzDOk-6sL(=#QHjrb)Nfi@@l)ZzS%0)BZjOuC08C+3cv2#*Nc@yTd$> zKK$pYEhcCgS9ruiur#FA=7qE7MKxB1-@sY!PR%d}Cp`$C<$No_M}BrE>-e9%KKCQ< zZ7=z;>Lph3G|Nb@q5kVjN(#E^*cdc@P#S*mWCVzl8lbcK*yGT>{yb!P!menzXcRQZa9yHQflyCG=SdRaT8j>U)Hl z1L1JF$Z`~zO4z%}l@-Jq4Q;4e&iW2UxT1QRe?r!Kjt;-jz<_w*g9$^GNY!YTm$qLC zcG_4Uh3A+cfvW`VB|uOq=%0--Gv1KbM0GE9)4D2-RN=m`c9B3KNz&OD@7G+Dz300b z2H10A?e8W^NEjMwf9&OC?kH41!qys>!h=r@9onDV$G$vT88>GR9b~2Dp6nryab`wa zdv+&#Ma09bNb0SKH>!PEjLg0V6b0Pnw2Q%bbxfie^p4)^aaeMN;CRjh`r>Mk}CoqcOp33Bc z^b>VmgK~Mh29N)zX~aW^`izAWW+0eoM*`=wExaD0i0jaMaYw0;hN=lDGaKxucxhqP!VEjv<; zO$Oxk61cai3{Jn~N} zTWY;)H$Gn%(NfL(Bus2#;yy`rmT9RavsHoQnu(V`aE4|{3&5TI>P!r^S1tg71IZSV-W5$DdB~6 z6*fADJ*)HEF#Wyop5soXTt$hng|kQGPZ2G7sjdjenLWC!lbW6Zo8^(dY z)HD_YYv8;Ub&70v!l2$l$#YP5ma3EV-Nw`RTFBq1=MDcw0TZIY+Qy>`sDk zp)WBa`0+EAeo6bj$kx@wB!NC@RMfXDyaByquW5Rqyul{T8k%glEvQIuWG_tC%KeMO1hfNiM}Rmp#7SDQ}338(C!iI}Kw4Prb#MtN@Zu zHJC=R@*fbPqw8({Hl}f2aiRGfSbh~B&f3-GdX)X==z0t~$j(C^@iTQZxC_5@lQR1z z`=D0ZLsxuVWtaqC^)}b=%keP1bnA1WDd~mL{m2LN6Azl80!{|0?%lG;+5|@>JVG{KH@(;v4+FC<>7Pkr1bIo<#fR1iaA+Ox zH{`4<;YAB|AtUq_CUmEGXUy=|_GE~?sMnO|dru`ffo_q>grD36A{!zI3+p5etX)VGj(xX=MS=W=CXVm>z%n6WSzIz(Aa8IGv(!L zxe4Az>TB37?i2Nzz^`V&CD*O82w{(mvFodHW_z#Q0=IWDz{u4{M9(4(yxO##mhx{6-B6v!>e0}dW51hq^Qk057-;A|EG1N z-m>s9&V(Nh5JN;|$k9HBA6F;3wRwFPDL zSQ4UzX!A~a?rW{?ay5_qO0VN2x|Y0?RTtFaFJ)f5yalC?dE2R(2VPcl?u^2${n|I~|{*n+Svzo8Np2;_8R6g}MKo z!ndNZwnpwZhg|<(KzWqG3OfD5@rv0yPD}mjCMFdQf}1wRo?5jnzP(L;ZNG9c(@0Y@ zwA1*WvY5?(D~5ICm3(xp`pcp7kDp2olCIaUt+5dcFu6CC2hbG?D+>rg0V<$XhoqX7 z^FR$b0OL|l71X}Bkz89`6L=e?x~3)=!R_eepG1aEP`#h#dHZq)oLv>Ko4ts^_0>Urb5Zo`vM4*?##P6 zw!TKE##oH&ZCffsm-9Nq5M&~xDcV- z0Ea|4SnjgVxa|)ZoPFpc4c>d6J`i;2)#uJyFSVZX!_4KSyn}9k6VS_6llOQibtcTs zy2LK^`Ie8Tz2#(t7YyKcp&ds-$|GoLv(|@?mq&ymL?Y-tQmE65#Rr>rrHA4lF`O@F z1i{M`1#&!9D|2KzbbYwIfx!)~woimX<^ry`ic&An*6(+1XyRP0tryFCuH0H-L=-_g$MA+eSZey^w(85EZYc|%Uwch$@)JP989H}JJ@&G=CsFLF+=B+#5mN6OfzYhoZScT8!o}<>-g&fwVw2n2) zt#o`#RDG?YREW@({7q@HhzNInoi8{uR-(`fw^@_)Ssu*ss5*QZggw2ibV#U*Af~a1pwrQr?kYK4hkPHHbS- zd&@WKIm-2NK;=T3RHl(>pSs&JjQvKvX8XNU{SlO?q)pQ&FYZ6I$Qb9a72%}FSM*d7 zjD(6YAr_d1rJWuz=j_@0x$V*MJV}=fT9+jRV@#U04c(4N&3*#MEpM`ZW;u8DO0IeT zI3>Zb_?M13R1jcCi&X#Zl-;*12fNmfOS28IQqy)7(?LYbF;ZvXV!O(kL30qcwGBRm z)SghW8F~&CP`g=|O<3|Ytg(A!eK`9ItueQto~VjbILVr>9FXvF2&w5Ezm|*GXwW0g zGj!)3X?>Z^vHxRM3Iljbg71K}2ZT4qfFqG)fupIz)AYwMynN7 zey<-Mqb{n=JGd_d4AuQk)Vm_M+ohblI;YYT?kI%rTtAh;c@;d!*(0+!g&diIl$PDG z#TTwN_dZ?pEFtVHY$}q%g9WuS^=RR#frNCtIF4Hq0T(x_B~pkko3L_BhIz0A)JZWy z1>V4nr+TA;MTw8hm?3F3o(Q6qz9^u{Hc~^}y0so0;BkOI*L^D~_M?9w?L$RsytKHR zxYe|13vb=Y@p>>+x=B=l3$C2z2qi2fo{XoAIHhFGsOG|LXd2}OpDcCYT*47MXuIPb zDm_EK(kn)q1pwquX8Ho+?M7NDQrpIpS`K8y@i;N8p`bIscgoH-)X;_$j{fY`N42 zZWMTataP%7j9_eR9&cdJ_b;IA4&)*i`=KOIV5rn`dn36>;8N{n7kr_oc%AQ` zcBdz2C9|X|l~3m@?Y=>_j5Kl}xK4?Jm#{{X%D>Czf^HYICzziLscTp@w8RJa3FCvJ z+$(FmN4gKIvWN4GQM)I{#JsO*p$l`uHp!xWpzn*(MF&;aUjLEq#zcPxXv=KK?o-;j zj^12A?aX$v)#H7`UD@gxr|Cl;Yunp5gBoS_#rNAc!LzqTvtrft5$sQ6CHn%|<~L0@ z_RoARulsMhJ!g0(=JG#p4NkGkG+gazN;93aqVOr@PRa`?Sce`pe zbiwaeYIvT09q^*%uAVwfnC@M9TFu$?%*x|HgZJAcykhF0b#aPhAll(7F+8Y_IV^$s z+#cQL+BK4_3LT~Ya1$*4cF^tlP9%5sdEu5=IR0tBD7E@9{kG>R-3a8C>D&tr_@!4I zMUWe{8`7oe=Mzj>Nsb+?Y1QJBl`xs6-C<&+M+ORdG`^F&z^de?b z7T~{%2n28ZORv@rTtY$UYin@YBiw*_eIDP53C0>j>+o~W36xK$K$PNX=J%7F+Nz&1 z(t}e;i7Zy8W-4Im8vU#X>c;dZ;y(l*Sk-n77_E)6qc~zu@B(&nxrGIUz?xAOMdg_I zza`42h8s4Q=45)CYmeT+4XSgb=6=df-Myow6k<|x3XCRZ4rcD+KP3UtoDYXrcxzI_a#&3@bb*3AKkt7+oqLG$!t79 z?rVpPiWA1_|3<-P`nz}Z13>@Q>~F)4hxI|MByvTQ`tnW4r>xMs5X^Hv^9pguIP&o% z3rUVWS#~UWL;f(F9qtp3n|=gdf4SMiPyE)j;~;0IQ~p#t<5}1?;#fWd0j&-&w5LXFe_DnNGW}!N|`# z_gOOk=+b!;{#4!biVFEHf^PiKq*Gh~%Tykx_fgGFugkEIm%gzAXpVZYk{H}G<77wy<36OJlEb{UReqXlhb2xoW&~B?Hta*3} zKD?I`g*cpmh61&>LfLa2bSoe?62Sx>)p|^Q_SPSmx=ATUpcV_=jgwKKcs7wGA>u7T zei+!VKPLGw{Kd^jdzwpE9A8RU{}GtcnLmymh^Ur4CBP(my>;_z$~yhIqnjtLUDsIFfs4y z^@)6Dw@P}-Vvo%`ysH6$EtRw55CMvVsRMoD6yr$JI`kEej!r3)2-G!KE2rt#PA~DN zKGZW&S`$BrBy-cjMhq{cG@)tE0t8Qj5V~PIrD`+fxEXLQt2bKM4c;IeM`9zf<(de| z4)VKoMhcC2&u;hLGPybSXS36lw?-ZZcY8lAipx+nc&^&fob7`2bpJ{tT-u$^99@A{@i#Yg0a zOm&OwMp{iC+AxXhgCs_aT=3#MYkpyaH?ud4&T9Sw8g!qV3!zNdcz)ieChc%31wMQJ zU}l!(oVfgCe191F+(}el`}7I?ywhW(nqO>3e7T-JQEo=lep7xHOVqtVM}OtZ%At(I zfH)Rf+&~E*1>@6BdAdT0cXz)pKAX$^XYr>gkHy^SE<+v45wFkLL!Zwir{LgP?K!Md zruewXINH?|x;wUdELU+lqisIeRdcRwp@|z?fH}UUSyQg*%Ws0P;U7Z9TcLk!|F+F| zX=Q)+M{JdXoH7&o1QWJv>y4KozYu&M$CEw~ z3HYxk_jOFs%HcTfXkGKW!q%PVBuX2ahSRC!wOnexxuIOdA3xnneZ33WVAfvQ#~<(i zBSM;lvhf`HI3QEjWkKK5D2>9^N9hXa<0+~`A|WG)&uKuI+UG|Bc|SM8SNZdtAC6OG$HN9|H?&=b~Fpwn7XFRrEW?*$Ll2%cMU z%5u}ZM1c3~aJS3~I9@iwiZ}cLQ+^Z+pZfQ`>CTJ`5#IIp@1yPV+ti7jCwhd<30O=P zzLm{ZbUsArtVOLJglahS*T;YZD;8R)2kY4(U8M*!TC-(eMH6`J;CBk+ z=Ww3=)!(f*A2 zDsr-_FHcS@a@E6(%C%bzHN6cvG%xR69=BUg7v1RjreSXHIMC7e2^k(iJq`d(=M%cR zx?Z7t0-HzvsrPV&M3RyzQm50!VFgx;d?c?U{7JClxJT`cjg6Y>=GBkOafv3E@4zKH zY_%;z9?`q`1k$XdPUn!3kh!SGr*Djt(1Vc9aryKYgM}6@MH6%a(QI3XxOe>!tkvn2? z)62uoX!~$r>xF)@zC|` zxPYmpkJh+|suQoA`6m)!(a=YvftTNe5tA*9I6Ok(zUGebuTZpXOf3h=^JD5a!1%;!T3VlQavll7l{7ba_!-gQ{PwFw8tfhuF#j@M1-Jb zIo9dI%{xpk|2R~<$_dRWJT{9q%PYBo;SpB->h9W@fug_`ByU;@!yh(?w=x~&VcwUr z`~3~{-Yqw2*B9FkzXvMhq^tW<4F0MJDE`XXuIc|Kyj9GjQ}`*cuU86Kn`j;@PCf_2 zR`T}imW#4jHh`}Zs7A7$_`+4;L-oX{PevcqsyZ$Bx#UiEmt{i0*@EuyZ@YJ<89Z*A z_e!+BJqvfq@Shu2HElKY4v@6y5B_2&qv%dXx!+oKBzA88b!@Vo88z2RHiqD0HK1zt zKuY)IZms8-B3kAJPkP2SkpmlrW9@HVx+s!xH;#CR#H}sSn z4lH5b;j5fkb2)$OSDLoG0l^o(Y}T#rI_AK$CukGhx61uiH4lTrH$-2S$11_Q9|9I&_xSS8)~sJva#IZq zO-u462VaFRx7etPd<`^tQbv zF}3z8mvw?peq&5z`>oJ_0Hww zq4!rfePg;(Fv(1wEGn6_@SDL4X_+u@yu^i0B25%LYqHdSVwvs``8pl#jsA-IQ*I%k zlSCLlVPY%qRP=c|+s6_iVh6^|i*$Etm#1g{O=J_9texU_w{_k_6U%XYba7Uj6Nm3*oxcc`br_C>~n;DKj{ z!Z*T$eO@csaGz>k8L?02K1~s`2m|K7_HP>byX$K|6g6JGcAOuZ!n3^0XQzYU+F3!G zO@*)FKaGk0V`DpG9Z0{`eQjTyng_&ld+;p$S4D5sUsBT?<6hRt`6=|m$t zwmZV0qiHpR`))YSe@UQ&k=`>$S;9GD0jFM0N=0kqj4G0O$~7`P#kYSL27cju9eevk zOH*AQeh=FJQLuHZ2Vyw`;tqz8S+Hrf7&zbWEX~RY4G|+rD}CG2>gk1rGmgWlAeNW* z_6K2w{Ng9z+n zQDVSiM~#{fitLz+3_f~vg1x|ZRTU3{Ez#v5eg3YmFzFAuR{xcozo-((YTO31L*_0H zECa1i`~|%ZpPS%nUejh_%F^B6G>&z5u*?MOcZbyz)lC;Bq4i2k1mm}Cw77qpB;$^7 zA_v`*$kRmm?5KwV((a8nG49z_^rxGSZ{L76fIt)TccWgDO-+G=hl6~FrAOKB1mQ0@ zC`T;GbYY0+30yiUT0&NNT603p_wYYaM@crXo|HMb*(?U;L?K-$+1wgFzGxv2+`r(& z8`*v&gmwiRJD+*=*OmH%XT4AW$rHQk7;*_4g!0{RDZtN!q?dOQ7*&&(VB}+vDN3UZ ze#wCfF{jw=jMhOn^$&+u+h1-5_|J7Prj?ETJD%EjK?tTDl<+$LE*uZP*YdHv86g7g zqvlm{7>yOu&um@E3~a0a%JmD$EYIFYfD`A)I?e^R)QX$G>5b0~z`VgFC!$G9d;jEt zoJtGy)F=IsqL0TTQRj@p7BB07?Kg6RUlfryuaDB3OQ`lALp_kr6VVOIrz3~* zsoZ!I313r4#Q)YbtG>>rGDj^)I(-lrC?87+rsmL|)3io6e4y zM3C3aD?xxgan8-*!*;SpzT zb*#0;5+w?@Jez2lXSz%)pR?RV8t0D2yj}?%P2c?CF}i*AV)e4UJ08Ssm!sX-+HT)K zfvng!l;pk)`eVHGJY{Q9kXyml%lHcq!RVv|CaXB`exzQIeIKe{B=j35nd!jn|G^h# zAL*6Ly_SXQ9)pdwo2A0W!RW+;UR|Zq{LMw>t!I(Ow96WVY1z1_)0wx;2`^C6=6VXf z3QVZdWz+4eIT~vF$xm}RagyrEXV%Abu?;~T>QV5OZ=ozNhcmjDjd>Xz0coVL9pQ?o z;$n;*V}{?lQ%+IK9Nx2fk4@r*w|E-(W`J}wD(E#YL6}g5U)xv+f~=?$t2!3ToCPFX zyS#gTnps-{hOe3K?vJw94{96a(zvAMXm`eL>3kul`dj-D=1aD zOT6ZS{SS8NMVdFbWTC< zm-HSeEkrE4aIcUcTBeTo@*nQ|xcx`KbIM7(Vb6K;`U%f6n6X&}bKAVstr=eKjMs|$ z$sdt<`pXUK7utZLpF<~)w9-#O8Cxl>u!l_fkB@CVO%wKWWLP>JyVkXG$k%lYB% zH29V0>+g#aNfOJUV)}oHs|A~DstFPF>@i>1T;TeXtj>x5#||-2C;O7b9-!BvRqLXa zX(ZMAc)$Zj|IhB0aYSt2?xspOp9~-6{>I@ex8qby!RZ&!gl#R+?mm zp_%9V|K~HJPso6=FDGPBI8l#36N1Q2bW1E0Z~QhS*tBuB?uUx0@U5ss-vDflui!e=dsBVLM{2pPG35;4+&D}xQvm-okL|o(yHy9Cjr~<-(27Z{AVE4LuHVw- zV;W_^B_+WuHXm#_R!?sfwrDE~%AObRFN{r@DNJ!+Q7-+&XPexVM25}^!}7Q5hj4mm zZZ&LZpZxEAh&&w2@(Xtf?t;_m_rNLogy*w0IXm-pbLyKqzAE})<{R<=fXbF>aoitH z0&B1H@oe}TJ53-894EA99ZOBQn%fM%w{BP24kJkMYlY4oko2W-M{)!O7-oK{gcZDDFvgS>W>kiNfz4asCSpDKQM@-=ouzb8G4)Yy#p(;qZJ z`%ne%jYRp2>b3lK*`K_AQ%ySQ9gUh})0=69lH91N78lx)TIk)DI){nRU#<}ZtDgPij;Og{$ix;)dY2@({llclm zTCvY2t2WCA(}h!!eeZqUwRZ`7XJN}vyKy%!^5a1``x#Fv059r|{dqVUP@&Q~_k60) z1EslS?mpYPmM13{H|!XTE2L+MZ?_DJM2#`@yF{-=q4E-?i~6PEOLQFvwB~J+<(Z6k z$@G>@$g&x-_NZ&0|ANqC3#p7#i5d)_$VZN5%j}@d+7pV-2v6ZR$CZsxE(ln~Ynr;} zuF=pDd5k$ZSk*>SwY?#|T8sbVCarp(P>_(YWo=?8AFdmdO2r@XA*IFP-ab{(iI+pb z0M^I*usRn~OqC#fS1|pZr(eA+fvooq8Vg)O;Jii2HpQ#>jdkQp31Tv&+};0Am-3l050lFr4E>HYuXm5?J; zI=NHnSe@L{<~rR@>bM=L+^=)Dnd{t#6i05Aa%V~=<$l@RFNt9o<~}p`+srVAF@8JW z-yiY$yx;HF>-l^i6RCSq;Fvhk3xIo-0J-8j1O5Cdo86iw$h+q@Ut{<*SZaxbo>$xkKj-$I zLIQTP8&~&J`PyZa#cB4s9{(JCNxFfwif4`h3H8pIkkG_@ z=c;32^8Jm*Q|>3$Sr1!`9`6w1LA!RTBYmmnh(ARJD9yiAF|hhb=8fkK7ZRuZwk&s5T277PC&PLO z?Zb2PmNwf#rB>>HCl`gpEZ5cVDQ<*sAD;OU-n@7|{U*sV#@$tYf9lE=c`d{7k-*(DtpxqpHB=cOhA&2XBygH1@U(A zolh|XV>m^fAC`JJFxF^H{SQ7wNNxxL1HkBB*)q;*mSt5q#<9*WA4`g8yqs8=@)Ng* zuS0a)r-&NjK*_N6y;Vq+Ybt^DK!mv8g@CgnoIJIUU0m0MtRtd58GZi^d(wLfX=l5N zt*z=*UK*^R{r9qjlW&GZ5A#%n&526MPj0Gfysp|UZ4noe_lJWb@X-oCD^+9k-94W1|&-2>2+eeZ!oQP836Wnq)x~qts8e3Wk#TMx?s7X)gD|s zk!#aZPQloS=Y7JDu;4E)6K8m|R(LK~M=2UTYK@nBK)WaPQPbX|+#acZts8Y%6?Pv$ zwc@(J2KTMyHo&Ni{H0{+jYWIgv6fA5qJJ%OB9bL)s;Hq!yN$l<;lILj->wU@o4Vq1r;acL=EY5wDSjw{NDqG zA{XQ(I!jUzA9`kdKVDEx46pBFbHxjn4~+4bGEWSz+~eA;?$unKT8N~*q>?a|=Nu+f zPu68U__1&NsnSe7naZYR?hrMvilj8f)@PxyisFxhEE=rrtTGP+w>)KL-cE<865vh+ z!k+Ds>vb}uiwwuNl;B69-k9Xu21z-!h~MY}Eg}!3^o)EG8r$4k45ysJD-~hNBH4q_|`{dD{?o#|8qR+Pkd}sW| zXkZ`Y1~1c@Hk~aYy)}u_rJfpo;qzXhFD4k~7(S5O(a>0~BHb{@Rpg-&YJY^dI=960 zTYJ+V$RfLj=agZjd#J92rgqwWmz;9AOlQSbT(H@+NbFBq`VVF)7}h?vnQn~c=xM<} zwB^G(VYjp7L0fL>64ZTLcGIdo>#ng$aADrbXv@&f6Z$t(OUW9_4n?`XW$qtK5mzcQ z7}~IS{NrR8du%$kZ+4<%1OX9O{}mbdsWKTBLCl)=KL+#P7!^Ajluy{_~F5ohG`5@55Q`D0UUGfx_M( zG8C!?7-=Wlc3}2@0F+XDr}NZ^#c^eWim;a=z(b1ztPQ5oiWijOr5JS#%t3@b*P1-2 zWTa=6{-fzt1}oUE*bVsaK3f-NNjdF^vvhX+qCA%4G>zyTxi~k2`L**=ZqkYpQ&w)j zLVF|-ov77`d#cZ>;^N#XpX@9?z50}z|5Sm7_V*=x^^-&R5wzCNx4RTKY*Ws9LCszTtrWL3d_0cbs;ZVA3?*2F!D~&SZiIU*9Oqu!7L>J6bh^&&TB=fw) zt~#QFJ+$MBN8e@xLK*p*Mq2Zu-1kTn+M`_O*D5q& zv3Au8LxYCMS4JT}H+&S5bv`W;{W;sZisabbRAHi2x|CjeX?39ju&zAA%j){>fBw9? z5%6>|F0cdO?>oAhgq@mj#+iUEzi?^*>^&`NOR2F&VxUU}x6|jY-?@suNGuY@F=^b6 zho86ORU}285%?>uYycZ2GKu%sPa5xeSb-z5Px)C}pdh*{0#b=mJ!Zzah7vok_qY#C zY&In7UNv`?RK)J$fT2W?(*;ds4D1aIBP==Ky;kKtC^cSPWP>5J8~gn{Yq_06yjmSG zfwx6)pG=|73WjSmSLWPRz>dH2ELfiZ@W+VGJfh;)3z(~xi?n47e?HEyC_+^R^Os}0 zbBj~fAho7@XJot}0JVr84jvxs=;OZZW}QA&Se9YD=;}~}^3^$nEwuQU9ze1a%7U$e zZ`+B(tNTrQO&X_?7r!cNN^5;lLSb~WtQn+=7d|(SB*<98r1M+0_dKlK$Y$ei|Kw&_ zM75-N>NaKncM)PEY>I+DfmN}=Kf41IxN7tXB8n>xM`Y#-mMt^S`WVVd%5s2rXS)Bx zsgPy(uPY4;-$4Ev4GbR(B-he8veH*w@<}^?(9kC?{2uvBgybbTmq2aZMb3?v9$W#r z0!FUHB3E`A6e5n2Pqv6yBo&)$%dvsxM1Vlf5v$L#?siD{OUc53zEwz2VyGDdV# z;R2*rp;b*Ovume_2Oy9c_SF~=bTs5j?`K?(=j#1wZ>x5Hjc>79w$74waDmGgBE}7j z2(b@pSXoFF1{$8*e?yy@4ZQVHXrMV6e>z611VGYc#H=5mCk1D88xOBqJ=x2s<7nv z+;eW`Ufx^YO5~r1YR-}?I@^v;Z5VxpMgYYvcswN}KZ*f~#e5Nf$R>T6u-n*FUhnN2 zMa-|@f{^JrquI(tzbu}pWwub|lHljK5`z`ScwAzQgO%{mdbJWpq<{ zsb3%a9|{<+l(x6eltuoscWyeuoYb6DQtVH+9jOo5?D11XQ-EM@vqK!p_>nqLMd7?w zfvR0LJjH_X6Vc9^Sf~hyZ&oOj!tb9E2^!?d$a>>{l*-@yZccMwb4*2`IHlQz0~i4X zT}`Vo#^|KJ*bq3nY87Q0Y}!%#p14i7gG|scgdso85hOMjCWtf8_$jl zhTiu*22-oR)XeZ)9OCjGYaodpluX&BX3^nVhhme^W3GBjp!Ui5K8d-33koqHmeemb zLklNkaoCa_(GDzg#?sDMTjLXoN`2q2yZ?#kJaZq5>CkS6ijO8$H@iEttRBz)<=nPI zVUZm-wgd6XWvaVty4I6HjGXT ze5-4xd3PmNB=;i`5N>d4&V~`*$O{qGb>o>b3_5fko*^PG%he11o%Ln!tg(N$L$?!5>dEdy;3}yoD6f{oyHJzzw<7rC8yivne<3U~lMn ztGk~)t|ooZ-pnt&D}FD_7Q^*vm&c>}Ax~smy`KxpAK(4mkkCX5+_<)<tg%1rMjN`xvNJYPgfdy$TBdy0e!ZXa6e(2cwPiqmd!}rH&FZW}I@+yW$aqn$qx|P@t4DG@l(NS7w z)*{vA$M@K*seogTOsR=03^KC-)9Dvmqy>0_Cf}gy#~$?ICphds`FFh!y7?FXpe1uw zBp)pdhf}S}7P=Z;jwWXnfKxjyn7#^*TRmK@0Lgly8`j4} zyrunmZ!3c~Gh=<>Z?0mw&-z($~ zO4+S*Z+=XVOiB6b38oph_#aw?gs=N=trs0Gzn=Yl%n8ANZdO;dC*4Rh$dQZP#287D zSXq3-C&%PmcssSCcyK)r7ccFv3X|8*M*JE{#LcMpR}7z$LEyFe$z}TC_eJ6w&7E~S$3Kx|Nprux3ooLhsD$Mkx9~CxE<}A2 z0RMv>zbJytppX3JMDcxO)uJ1P*l`FZeNa}c;o2E9{ZqQ(sFb|<;0cZ)daOo=0oIdY zw_)vXvwSe6=DDJz=8o!x!H>w-!ldzFP6e3{HOMsLP5sLry$NXV}@4qgA^3>WQB2@k}MAP%T(+SXZI_i z6m7RNZ(G!--B|C$%4rv>%YCO+8x|3i`#Xyu_vwn}qN$2JnJ$Y_G$D52wT5k%%<CXJznhk<-PnjnG2kY=(lewnCO*K_&nimOK)xWj`)_sKXbW& z!e$`q#{J3Zr@Wg>njM0_Xk}|h{qSsCUzSsywob4i*g#ebY}_2)m;Axo=by!2?}BGN zmvqCe6!S#*ZsK#C+u6I-A2<^bVi~T)S^_nv{O0UgT25~{^5Q>16?or7n@#;Rck058 z`K<&*u9=XMJnn`a+SpidR;JcB85gDIu*xm!)TRn04csel6I0vzlDF7)Ut8HfGD6fRZueRDPPbC8RsbD2(M-Hvf>}1;^}K}@}%6=*87#en1jGGA?DI# z88z^SK-|UA(<}zR3h2ZY<)9Hgwsd62(mwPwwy@Q5cHOxH5BY1Rp^5Z z47RjnHJjNfq@ZiXs*dWChm(7~flBiKgnj?Qfug{aN&>aVYES9%PLJNA&+tm4pw&$^ z25Aw~eF>;to(r8zCYe?CbKI}m;yjrdqj%c1S`4+O!{^@oLp@&|?rrsgA zpAncQFFpJlPV5i+e&j0@;o0J9$!J32!c-~jx&t8b3ouwBU$uPV(h0LL{GN}uUCqxi?zq|3hz-Gq~=>FXpWn)symiM(>hItKdk_J#+GeSi%DXP|sU1d~1 z(9dewDm^OEw%)qhL9;ml9%Ievn8SjMMc)(!YU-l>+khHOhYE*|P>M_MB!_7Xofww& zjv1ar#d;>rV~@Rv5sU_HKOIuhS{+qa#=<)*Q7@6Ikd@W+4I0=>Njyefk%l*_3cks4 z6stgGQaGH14=1B97W(PZ!Pmf!)IH0k#U;wN0>wAvkVHWud&e)&VQwv1_+9(-dGh_5 zJ57L{srTs*_|UgRxA6U@1IFaPeTc)*#rmv2irbmIZ&1&4gP(stX=)zP9b)`<46ZB^ znSvLTA`N_A{p7pz_V?1B*Y~dm|NAQRi|Zn;tG6)aegcVGSR&<)$(uT)p)y4+E(@VvX2yim5X*SjY&wqf~X07YfHf;h68+{XDinz6-V-AOj_h_^S= z4FM;}cVyD$2*1;f`>otzIqQ3`3;nkheTbhBM^fF_IR)SucTLkmB^QuTBPoOXF`%Te zYgVfL26Gw2(x&B1ZQmF@Eu!rI^MSS~$jI(80T6v8ElRqu)6XXf z2rl8DIY+>VkTvh^y)qWL+n6`|*Pr{53GldVg?C)MBwLZSbPz_$W*BC_cB7GY6*3CE zZ`ba6u=$nPt%lEnWzrNofP+!ZWyF}j3J+*{joxHUXtq}Hl-mMkG!Pm11*&_m1#IF# z@?ID_@M7KJfs86z$mRJ(AJcN|j;n-}`$r+HH!V6ou5~4e)rRFwurEWv);*Xmt?+Mt zR#C#wXd}!FF?FXLtbtI0C7>YUrJyZLceOr5D(G2Go)ClJ5As5jt{6WTgbGCtCihk* zy#T`^ng#~>%C}nkD`%kLUlm)T$d#{Ao86{Yl-B7|9B=Y$!>U7A33kNJJ6bwb!BG%r zCq=B_RDSx1RhZZInZl4X-^KU!CpP)%dXcrNSGsu-y^nCAENKi|IkrsAGa&YU5B~?LZ+N zUg^Zr;KAB?Tg|_)a64b!<{C_c6PvbOSmH9cFp1JE=xFRtGj6_ttsL+}56!(7(o{{_ zp}_c2)GL9cZ%jH9Bg^DnVqYX2h37Zze%-bV1EPqI8GmZSAQ7Zznqzk3iZ4!@_#!DI z1+q=bHlCn_&}I5=0rXqdwC^h?qo>1Kxo z4tcP)k_-WLlV#Cw<%A-$DrqzRb6sqWQ;wJPWOfLmwgqVQ&k)u`#(3O-Zn8+l>FM+J zDbltdx4()#Bz%=rcjIjd?!L($pV9g^$}1oY+~hE^8Tgy`HAq2$`^ckDT$kE?W9Hjp z3H&mJQM7H=>wd_oJB6ovf7}v23i7qBHF{rSRGb%oV4rgb7FDP$3IfC$#P&P{gc-?g zg<3ti>NDS+Kf6kDhBNbi#k*>>WUGu(h`ew?OHox=Kn4~HgmSbqH7i#tw$2FU->n) zgE5@ghh<V_azPQIumJDOE^5!JC>;@`bNz0LqCiFuAR`=}JB5b^m|$J5~T1R5S#w-Qbq z1m_{D)Wv{+DjKQ&lv&G|dbhR@dz$3F@B46@Yble)uIN+(czGqCI{~?{mjaJlCEzbqDnPbjoBChPeN*cS*e0^ z)g7(8i0Ghw?`CHuLl}j#HI3shy(BLFt&~ho1jN8o#3&5cRR;|Zox>VV2qmojt~ko8 zvmtTJx~ILTDy1_uB26}D+m(8GZw_W2(y}A3fI+T@l8p~$kw@h1>RH|}^i!Yj$76+F zmDRtu+gPR|^e82=n>(Bb9-#Iv-O)BvNy1pX41pX7_GbSZ-r(aX`#|JLYmGm7p@=!5 zd@9sAmdb=&Zi#k!3ySJ36nPZH+kIlje`8*kvfl~H7144z?Fvpr!Jf@~xy>6lTcy&S zOUn-uCVk)HrlD{!Sy@T24z`JS=-x3pVnmDLNrD-q$&xqdq|N&OKDKB7eQXLG zZ5b-OZ`EKHBz(v-hk(8umP=ATlVdPh2fXU$ZG)SC!y};_%7UO=vvo*!-rJ>zvO0mB${%|XaP9G`*{5= z>_&ir44|M_ADlCTU2l^m0lmkaeqg>TiFNWkkf6?DygLIJ*@p?Bf?5;p+06~*$#l>F zmzEO}I6Hfs<6lfrRiH7lwWluWjgq&A!9Vz3;BDCDhxU@-+rluyU3*1X$ueiu$_O}2 z>QU@S5y8h%MFOv^6sKYMx~x|RYa>IwJcB78_Khq9^P_3oa#f@`Uz)x9u;{;@%)}-; z3&!50V!Nv?%S779NmQxy(BImphOAsV@Ll_kPL6qnkP2IplHszHL(N#m=tvVfj!qd7 zN1AyLR`Y)^;l&7lY^I_^>?iW9YSmWtr_MB^TiDkinaEEsq%~Ii9wgu&i&1aJ z-E>=KCAj8P85uj6{<6k-Nwgef2nLh4?h-A7~T`6nkJirb0XlnsHc zfe8h(T2?s+Cu9-?W!c$!9o^22ajh~LJsIjd8sGd=2F|HOCUgpRwu7O>lb@D0tJ+Zq zs~GXoK238&){1^~2!dVPAf;MZ-{9cj zdF<*;N6t2hzX0v&{*aW&d)x%OJhgr#H~);PU5x-udEvvJ{6`aD1Wi*Tb`x%{N{ly&OGBzDOA!u#(IoWbf7XOH|S$!#l6 z?WfZhYo5mOIJLS4JNWVy3!pt^v!`Y*|0Qgc%1_GO?q^?Dvbn0tW*-HSY`i@j6A_&S zVJk^b)-=_#LlgS0KMpiDd7C8?knlr>8v?d4YvZpyYW{s?K8KYGiBRp2!MelKdtIU5 zjD=2T2_u=Om#S7B#M+w06sdow>>f|Cc6V84u~qUfW7i4UYBdq9IQ2mnii?CpZYHy) zu(PV(Oe1ePb-|Z%bS=VWr!pzn+NqU!DrmjE_T?n}>1iZZ=g3Fq2=Oy4{)Z)$bEZMF zpeMab?U1lUSw!o$r^QboNsudT6>i@5qtn-R>YIS4_Dp?^-YA4Ppb86um911&V%fjL zuS8au>_2T0=GM90h~X#l7K$s#j(qBoieHm1i(j2d3RlXF!TCpyjfw@$_i>@C4$n5r zCASiM;zSmf;YX1&fi4H0*3e_ZUa(LXM_#;am;Xn=0r}YAN1qoflje9xo|$k=x`mmj zk-bdpAN#JKN-(r_r)wC6pWOtGPOrE%m}m=N@m2HM-$S>y{Unh-^ogLUZ6`@mvIBWP z(62aNA{^-TRsH2nHcW4|!KWIxP(O>c`JSvs{_H+GzK`t|3pmdeKm&xKLaoAvwy>d! zOo`TK;98k6QkbnzK$hW^M(^pl=D!=RFw!-X61}J>X4A{2N&np^sY#m{=uj+ebABgc zUT@V#oUES&xs78*_^F`Bu*fh<<>WXP0#k8wF4(4XBEeb5SxgB<+Y2|7HDi5H;d6Za zH|*FWcHy!-83c=+<*!fJoAQWW)I6H?wbO9K4`1YSt53hM=LMCkg({vzTJWj5rUxv> z41^U=PhNqm)xl1G;{z>Q$uW?1Ua`b16A@PMv-js5+Uknbj@d?NAm8 za^rox*Ou;=99XH`hPbdyML#@v7_t6*yNKtv@`#Qqn(Y1S}N@! zTy(r^=@s4nT_dHIi~pvh!<5LhbA6DFiXSanB{`9IZFG_XJbzR7kA>xcyPu4yuz}`1 z58bw|0xV~e7gIG2L%0aGC=nmcx#Oy$0AXy@|+ryc8Aem8q$+ zR*@j2y%0)^ci!q6wK9up7gojJ1GwdC=NN$k7p*#rZzlPWP zVvvB-Y_ZbL)3)}EyOZXDky&%VT^p&uhGnq0?5D>}nC-c5hHBc0T9JjwY-(a6)KrX6 zx#%-f0h;u#ADp*Jlaw(1m(vp8+B^iwb1})|oz3xZX+lq&z#&>zBLi&STEVW={>i1Z zw!h_O>cUHn1@C;mZ4D4}I?l|!%s^`?I zqNF8pvHsI8{*Mhc#nIryiW0&dDO6C0_Q{$*m}lGV;=*>@9W(xGZwgTx5-g5BrSyQN zIg;E*w{WEru%WG{lcS}h8?7Kx?aE94(dqvA?rSjWmNuFbMj%$iPH>liOH3m{NRy>F zMHE8=RkbEm0CXX~mmS9AC1}*K)k2nU)(J>*sl(-t&e*Nu zkwZhQjBC3MP{)IukEHk51gre-gR|vyn#kuCJl20$8;wp}m{^%8H`rR3h!X{fXwUvs z87Uglg+SX{wtSuq)@sD9bYpYKSF)8?x4(`zq-w9;5y-sY@lVyPbBF})p#SW9-FD*~ z@tqB|J5BnaOWw%ysk08M8#CXw=UL#QXS~yqydig6cWwmnv-Tf#W;UwhX{-5Ti?h=y zWA=IGit$<~bWVy?L10+vg z*1UppnIiClx3ZJCm20_C?lHH(*~N0@12 zt>C>Q)$RN|-?u5j7#Ul)5`!-(Gp+~sI^SA_Tf#1DFVy?2=I_Z1RnzCxX`f|wVBS+5 z8c2yTFZuGufG=(tn!jyQb>$^&B~=Wy<$UjlZ%hQ5xzz9fmSdoVyCorGNP*pn#Q7OO z#z7}g^)-n)SDhUC`U=G{zUOqI;O%&DoGN=uFt%=t2)_*YsS~pW@``zbQx~5$ER*2B zuls>skmB5-Vhq|$=UKWR?zp9Tes>}@d{PUu(-5)(AqJEFCbbxK!ss`5Bbd9{_R+56 z_1g&6L$r0d4qA&}q*ar0n5)hhFAtUN`}jZhnRN16EvfJXO`dsh(sj3R;ucaeHGptb z2_uC)gbc7=cKW?K8zPRxKVB>f@nn}6-%%7wc|y8U9~RNzBH@(b9yT51-tI0jR*kmq zkP#_US3+hBMH-;e2-=4acH(vJzi3YHj0w(XblMS}=c9bwPG(FFd?S|f=YuKBlbw5g zlwp8q=bY1&)RM6`QpGtyxs^BIYg8&rh#6Rw|sW%*MKxi?IV^wj!zAoIflTSiL^^?-KAwG_@`sB`woN%A`7znf!>FXZ&E ze(DKY`(PnuOs*A(P|OdTq;!I5@k7*JNpp#^p*WkjxzEp33FjK_rxOev(*Z_D z>QVM!3vftZ^_vYNIgDu1ws1B^2Y%ONywk zMaFd8;TP_-xL${cBmZkC$!a&CkT)49)eHcYUJ@Z zI`ToC{jlnmQPNk&-uU&FE=@t@j%O|<40cH3pK&Nf7pS5wFjCTHg<+J}l5DNNk3IkM z9B-i1IIl5lI}W%BC|Ar-#|7nH>SuZ zBK(s+t~@L&_f2>CB>hUNf;6WXZ+@WNDQui;rn|JZ*sd3@v)@$%9I5Gf;4|47z%HS$ zEx-H@YTjTuh4Z(0vxld5Y-} zUK|gOHvhupL&gN5%pMp%rB7%S1!qyV5>C)creh&5ku?gM&m`s3q;PC?=AL#xy|b8n zvl07AmX(@ZLgY|*|I4K$a=+7XNxJ^IOK<@cg>s#%@8v&(o#Eql*(OR=SDAVuL%)R4 zr~9M=)xjGCcrLB~;z1Ja&1JcNs`nmUsU^4Y@3Ip7?ENac$~D!?qcf>S%~~o#l3ooO zXS7c9Zswi~8N0Q~3Jg4TN?*9*?nX1^Q$Vu&fsZl{uA6x($XiknEt!6r4vfN9sVe-& z8>e>#B{`#t&KYq~KA1@>3)+(3E~|a4Kkrc=GPmyZF-6!^UZmCk^2g1r)}GyB(~SoD z?Q(guQS07#In^nddF4{rdCe6ZTy)wnM%yUx4bXw_r0E-PF*2(5z;inERe5()^v(4* zfmy83!2FuBA?lONw&w)ID7ic+a(w@7I1`pwi!=+GABp z<$?^e^jjoF^9XTU{E0Q=DFA6oNa4ks0X)_byoI^4 zSvL=IXG{AJe0U0W-z(lbxwX_pQ?6WjWvR+TP?rie{yysT`hkV0sA-w{j- zFNUv(@8}`JD}ObA^C2QC+ct$6zxVUv-Ou7q*hw9^x;H6_yCy-Q-mzK3Mveh-s%u2gW_tR7|JKi3+PO-g9~Tr3k;Z4R zd8?QAcG?=2)*B?1jN1TOa;h+^$cepuaz{I|kf8YJd0`P;!Xs;9OK5&LK7Pcw-Vn0i zQ$h+bAmxoRba2ll3_-znl0W-EKHfp@*=> zx(;{1iWwlg^ecI(Jh-VkY2Ot#+9l_J*T9>ZAe>5X~2rHcrTk z6V82uyxxNx|ri2`i|@XtUGD$kq5A{+9s2WFeaI=er= zFMba=**0i|DArK!`7W!&_oKNFtk}rYJ8mG;nJ-FkG19E-(06~p9r2{@6 zg$H(dQ*lPWvLq)zL=Ox!zjuu2O2-s+#%mf4PhkA|5Tmskm>Fr63fMh&JEXV^9=4c= z8C3(p6tFQ44K5AC>FtGt$Ue-7>hlQ06Q=PSa=l}2Cb$c23^Ly<)jX5M z8t)uh6^D_Tx-E%`^QvmYn@f~#u7vc4`#dD{kL8B%kK`Mn`Ql0lFtP}zHxmvjosIjv<+1A70 z@dJ@-p@?&JK1p4^iwNxM3Cx*TNZL7hf&fWWh8L>YmM86mu3D0oYX`I&1!5*`vB6+i z@_y4+O?Z%jn@PH8dx+82QrX(3O9N2q77}LK5L~x^0k^R@<`Re=reHrZC5)3;K=8<{ zz%hwc%Ng&#u^r`pXP5^U-fljb=Wp5MC!lg$K@+MGx%c{O^$50z>oHIH1=DruZ}0Z* zm~hSeBpx2!oft)k@J+S)>01vZ-N+C0{^yCy07j`QfD#iGN4DPEuy0@NZq(KK9B6kp z*Y$q4iN)GGNuQsDef9G7Zi$)PIqrm8M(dgvC!Fr5=o+tdtQ#6!y%Y8-8qhjW(+0uq zReK2`;H61*8U9j<<5QiQenB(K|BvKszpVw z+D~5A-LnV@t#qEsY+OBCA?%Hxz4Ff&PQ~dA`(f_DUE=o?nfcW%Xneir1#n13;z9*L zbB9+uEO2x7sXHucmhq^~KX$sn0icko*M2{g;lY0sHZOp3PN7bJqT%=~fbMkMpEj$L z9lNK<+fz*W%OkuN)4hIcp^ZFIE4Q^eK%wpMnQeEeJx}xObJfT9PV)IQx$7;>q*f#_ zU=ISYTUji^&Ay=(g(@%(*Oe~OB;^?H#7kkPLi3|ZP+@^~r_j^j-P_YQP3m8rr25~c z6}i?bKn8x&lec(y4j=yw_VIHx6iuxT^#J*9DM)g?2MCU0DSU`q^#64N!l_@B1 zaiKyI*Lqps9WWVAd*M#UY!FmmlAt+lCn~wSWXPbBrmICoqJk6*q%G$kV1+N7*T+3g zl+x!X$uJssD(yV9+v&2llclf%pES~lq8GS*@3zbauHtfl_TzwweNC4<0;#hIUZ_jR z@<1gL#X2c_!>e=CermZDy38o*o^hckIFDs3+8co-1(_bdY?jc6hDF=8TGo0B>El@m zlj!^{&eYXQ&0SYQ`c0ckwZoq_#nGRtVDj@XGADUn(lwV=OF&0&joodLk`u2DPe^Gk z*kmT8R)Fr3g+ZeIPvd>TE6#vQQU)v+iz^ul^rq%20{o^Zly!;geZX4HdNhE>}T_fDdKgi#uK-wK`kSiOb zB`Ckfii5(Tr4_A~+bz3UBXx7wK@9k)%cZ*iz0hQkjYhp;AjY$K8l1H7zY=VSh21OL zb}t;!eik!C?#{XdIVI|ea521A=k$l4vPMgeHhlr5IkmUo^)}H+Kw(cRY@%&ulbj}1 zO)(y74iV4u1_f>N|B-0yp!*w86UcsFebWxpT_Y@ySd+Iu?HPEK`WTq0SNV^t^F#W= z`p5jVB0rgIiRz$=*sokl+dHAp*KTHcUtjf&*=>t;{UywQbhI}Eu)t|h5d02xqUKW9q-pwu2msn2qN;QuT>WL z=_}e*Ov!zJ=O4aMjiQpR4L!U7t-hAZ9Ff6y4my1mPPC2YL1Tr#V?;3UEQ5M_&rOQ^ z{9nAJx1)c>&J-L_9^DEfeef8$jjbYA=WIjr4d4q6o8B!Imr#q*4&~Zog_z{v>?d#2zaFC5Cp`2uP&2#uZwyD-dVoe2jNLBH`H_WW2 zope#bQ;$mMxsA-q#Xw>*G%MEtr< zfgG)UJyeo@gWG)@9nUVHSuNj4m=BGa@O_vi6gI>xt7^5P#z%*g*jEZu9(S#486|a+oScXS+f(XN ziT@9Z(B2CB^SxT;oK5^kn$%TA#B<=K9RDu^MqV>tJ)Tp?1!Rs!>P=uYyNk_!AAZ`r$A6IPGQTD)iACxctvtX zb~D{87uqhX^bRICDr^(ffdcd(5T$04>)CB>5Sv+sw^8J|RDf-8w32`=Z3grD6X{+V zPa}hz?3oY88#qt!T_xhXPgCcQrmtANjbDABvavZ91-PF-i}4B^bK}aLn&4DMuH@YuaztRb2;8ZO zuCVzfEufR-E><4S<)XBdfz1tSAWSy(EmhofJj&7LLJ$*=k8|>AnnvZ# z<|prjuG|RkITKQ=2!Rz!e*du{lN}tJcF?&$^J}ig?rL{HC#E-p*=l3=x6Wpf!Hbh( zp&Pq1rp}k9gWG=jd~=wAYyCx5Z`g5e%>9CqdX=2YOG;V$y4tU^7L~l){uIA)GlmD_ zFaqkt*qt`o5T@UgVN}xR*5G@P$uT@G!6Mn&|=?+yw zRW{>}{0oyR@*POG`JC|laJd!%)8(tpfda8<+5xslwL#SvRQ0b45wcReaz7|QIp~ck z^YQuLA7e|PAAzZO(t1MhKpFV&1US3-!XKTOU4gFd)LGPr_mJP~AxBnkU=N-+4`o{6LTB_D<_1dGi zgZ9?mTU%{iEzwqQQL|!}h}a{fYV@krmRdpDYU#3xotOzVg4jV2Vhdtr|I*(%{&$=l zdEfVWzTeNs++_DHby*W<6m;-0;{v&GUTemePx;WC?qWbCsNdX2*Lr)^}2LgS4aluk}+`$j0956q*as6cGjRfx75eFrKAP!j$yE< zwSUW>`q;84`9F`WXirAM#DMcT#amHC#w@;RcE7B;FU%-> zdB>75ysyIna~TO=(Z2Fb{jw0pf1O9ceozgi)Y`Ow5P7(9^Y47glfv;6|0TYN-3fg}dX!PT#RmOx+o5CiathYxjqr>SZNJQjPc!tkFn#_nR`9EIp-u9(l0b2h zysDdH{(ow$In}+Y4UjP8+zpeR0J-IP^Rk@{Q4yDeuQOJW$6kplv;t|bvN6vv1=eyU zPwwl;lNiOCH7h5s z?41}}d$Y3+#@FsXLwG^AW}3o);$H{{LCNBMUakm~MZPqj`;Z~-ez}4#)GdVMAFa~Xf?l$*?==u{;0pv|tsP_g?f z$;7H0BZSEa^SNQ_O_n&-{DZH!Ts%sdl65EGmdOht`_C7Mn*J{C!a_o3OKk^UF&XDi zdI4T+!(;romV%8ssSIg(?60u|B8^_(2S^p?G*M$=rHNHCiS;MN5qbpc932-?)f^Y1x6@Ya;({I`Tuf{6j ze2;$yG;&KS^WtT!n5FA35x{q83*ozjq_FjEIR8Fb>3Oj6S)C25Gyc3y>5h=$Kd`MK zd>6MeNTFSAU-;!QtrLxJ+@IwutWPU$!X3f4@cSQgX@i%)i{8p$URZTyN>@k#sAKhD z=Kjk}pA7@y7x&B!ufQlxkLuH!gWm}`%i(wVe=gstUk=TANItca^%tK1X`5ni#!@Q~ zLTr3EyQ`;0d87l9OlOzEvlM#~9w=tepl0wHL^nh{|gZj75htD!A#J!uszrEldWidzzB9GUwKqpKOPK4PaR4WD}XmLq~H@OQ*x6f4f4z!#)&7? z{x14I>ZxyTuE$%yevFO%s95!r5A}qwYV#ghIT7XTnJ%Pd9DOb!YBp!6|4fZ$Y5#rd z0OT1fh~={Rt^BXJR!q22VX^@;@h&;enmTnCj+yh3f~z=s?G&Njv44s>EA1qSfpv0; zWaAJkRl4@ZDCd&Bwo&5fcwLkn@v!fDhewpBQz&BO8+$D4sBUSrredIJMB%CbbIOr( zgJFA1&55#J#llFjVtmlJ2|HGr1tKcz7Qcs3!32%oijYB_;lLr31h}I~XS^cQW$aJV z9Im}_$4?qZlG4GR$(#!59ZSS3EWgKIf~Lafp9@YzexbaL;qKKrU11pxy?3zcCWMyV z5#X&KR-9`f2Lr&fxB~2Kc*Rb;+F_lKo0I-?FWS@!SoR0I&bUT@SQ%!3GOW7E{VSZl zv%!sRjw8YTl>kOe^l4x?+t#3Oxsy9S9DFs@0_c z<{aX2%s!msQio2YbuM1YltVRzu^GSFp@pcu`{=!9^>Zlg!a8NoY5AjAc|F#za^^1~ zLt~HaJm}?m+-iFJZXp*rYDD&Rrsj`6rh$n`?y5yqqxb zxqiaumh*)1KqlaG+6iIlHsuGQ8soA3Sr@8;79}w;Mk7#q7YdMrzCHe=K(dT*VC&h29nw=JQ-I$4GH0#%^ZaeOJlcv62FLkb*{i0k zk`fNhl(YONtG}tp6}<$MXH3x2k1d5c*s0~t_*ZM1SJxI2RYT zYfF|6zo6-Kd;NAIdnTI^j~elvTNO1d2=}|0HBbFkq4FzG)_E-SAx`k66FMlcwnDDK@=k4OxgLHJ+_aL%P~-Wc5}b}UiR?{Zfn%-E%n7~S zxKg{GIjZ@C{gOLdMz1~zV0jcL#N&X)_ZfuaM!8Urg-O}siSVc44-L~yn!)6Uh#&J zu-0nrCAg2#)d@{}5hMbuW&)3qoAk{_5`xDMYNBf>^!ecyCK39L8+L1{ua`7*ah^3Q zjgU^ABHqRSD%R!RozJKu|BMJlNT;S9*~mR8(WwiK$k6Te*(`>9RiQV*;I`GVeL$S! zmJX`~y}NOmy@vL2iE8Llk_PEYMOEWGb*F9j(e=R}zXreyM`3HhKr^hekw18{7Mh8v z-3PR0zq0WhBB9yioJh8krAqb3?a}g>{Z$dpyeZVoM929(fRqkfP>fl~7y0V{FXc5O zUo1D{A|)JaSQhx7bXi(S%o_J+8dIge$9bnpdxwV;ndBgq)+*Cv6Y9$K@IXmlGI9E=fZJaVzTTGc{w? zR~kJ1cO4Ru;LFzQ*X~O8uWcLcQSdD#4Pv*C@;2jHWywHY!b4Rpc-fa~2GS`M?H}Zh z_T~F1dsv`U-CvikBJ{)7KQ48*NTIGPEmbwkRL3TuziFhDQ%v#nRn{E&QM%KK7O0aG z&uNP2tT3c4O7!uoFuOBp?j%7<(aV@xT}K4k;jkR?$kQ7Z zJ*~iT=yNx6#6d$jaHt=v*2$x?grp>Wo^a`KoINvu{H_)pl;y*OVw;bm%Oe&qn1maY zNB6?7$+Fh)#1D@u8i}t}<&K3nd?O0pr zEX9JAo*D^cW4CLqmRE_}T8SVRIpV=*wGgHi-QqdRmFF+g z?o^<){;)dfu|0ga{*1nAIRdOMq%(~)NoMeJLOH*WY@3G4V~@-=x^A+l4_oyCX5rHd(cG6+^)|;`mNmkkI__=U_mDf#-{o8oG zK%6Lm;z{jQYA`=O!0TL$h;VPrN#kOoTdFhSiCITgGG|+d$6_00Pm2b*>d3rT#;4+n zF4Sc3&^>;lj*$C;)yddmQ@o&^Q)`Fl)v3WU)pMbUy=C_=9u-TQ&bOHLNbKT%h~G4&iwj~$qI7iPMfA&3=zUNml>8pC(IE!75;XJ3Q45Z_7{qU zdJEiL!znf0+FUPo>qF=nfooPZwA{V->Ik*nq~m^=&|Ae8Dt;#dN%3RI)_b2`-;u|k zn`wOl-dk%bw3K!Y83fB#nuH9yPClDf*$WUt!Tou%>&c88zwjM`TvWZfKa zLKa%Zd-MX4kckPSb`yVn*%TycH#}^bG)bWr>+U;jr4#*qn?RnWl!;2NTSh7y$|8`*L8o$mrP7EH7AG{%c2ln)$k| zl`X;O@VHFz;TS4>wD9qmp9|7t8nfMyy6P6ykZRA-?ir)OPm(h&6mUQ&8DcPc9W#m1 z+Q7?GFs{=UIZ}zkoumm*L%A~4R60CuANT&x-g3rus~;JooVK3m3DZnx*=1Uqt^Usq z0tZY-_t^MA-7ig>R*W7ztV3exWG+HnS-#O;p!x1yBG*GxK>T+|v~&MY4v7nX(u9%U zJ_tJTmR-PeU6?$>EZjkH7-$Z&q31uyHRtL-b}~$98D6;(67^ov!^ogrpqREGL20FV z)e3CDp`E1;Zp6tm=SGuzSG_R#5ex(y52G{PU$qb91nm}aVT4<8I-T|XSnHiRy=3ZglA-JeorgW~KuMi!HJ zvZac7;Sz0I2VojD{Cpk#5?#5C0J#&ohw!~!mz@{5V$zt`Grxf6aVF?~>v3JC@Gj`H z@mpl|#L7}*Vr{c`RV#=kQDab}pjCe5s+=S2IK7$YbK6VBq1jliY+;*+ZfwBDPq_SGIuvU)wLHKRH5az{6TEFH(iJpb_ z7oCs%>c5a?{W@Rt4BsXlg&<5Eh+3~oEOSs<1NcI>D537EWaf|H45{*83m|c53>tF9>;+`#`X_9{q zqI8luI8C|`S1TQpTfN^I=p|io#rwmRWHhxvb}y|VB^gqql7%G4LE_2LXB$04?WSR@ zcRph$lu*Qe)dQf-pt0ETx}$XB;L9!mBEQmT#F|zpj$!HDUH`EkA2~bG9zy>KG6(GV zj`3}~`Vr8|Cc#RHGUJ;2HW~BTf2{)003(*z;iQOuJ2|Wy zJ`8a)mL~MoM4--3l7(#Y&mAd>(Hti`?`~2_}RUQyn-G<)jNqNNZc*dj53HP!i87 zRXE4er^w}B{th|na$$A_p(n0WXY_PT_zo-<^2(^JLk^n=vl`%b{l_~{e$*$5_Nf{3 z+Q!L@P#FHzf^AF?(d0XOrd|v;wNO-+9b?;2&(<9~5lnZN&o4bavkCraeFw(&Iz z4UiiKtvGrH(=~GHJAvT)Z7|u-HB#(3{udnI!>rix&41fHn25o zCuKP?%If;Jl0t*%-?nE-oPDtSMl4J$7RBsEGo@1dmxpXn*10I=gbFMRpoz&}lQL{; ze-+_vPtCE}z@=t*WHI(RWD0rRz@LR)>J6x+%xYS*qBCp>_p;Zfe&5~?cAMp5@6cvW zqj_%CUHQjrVYTsUp=gaig}>;}%ooCO)mO6AghwFnFxwFxb+N@lV!$z<(W^Q~%4vxu zO~b62?eW2?%M$J;YBV{bYI>modeqqLA(A*C2`TZU1cLm4oE^rfp0JeGmBRC#*JiOgvlpkDn;B>uXw&)-dk` zz*F0ypcO9$-v$#YzrFa2U)_6k@ua|Yj1TH?X$EROpd^~ua`PH9pbEMBoPec(cBh;O z$k;4j#VQGbMz`w{y#i$8FF?r;#I<;=D$)LSTyfza+g=UE!=s>u$4%gwx@p-q2ikR& zLO)3uwJpglJeB-1p|W8NCF%XD)^}78!?n)lZZ@gOa3_>)DFUHZ)9wqQguR5Od4L9o;vu3 zJ;A@1-}ze9y?S+B05vC2mKr7P+)A;2z25*LVAzCaZHh{f%VxSd2oVi~_YT%Qo2Azn zH=Iuy6LrsJM}7}}EzTzhL=y_t$dY5(&AWTsKz!(2OgvuE1lo95Wxd8+T9U&%aRo3R zxS4hEl%w-(inf(1fjn@1!y%O~1g;kpF%7P3N=@G+ap6x-9hVyG_HCsd&>G_kyqqx3 z7STz1U71UUTTSL}yUX_*dhAUlof5ySDmmYrP zDr!uUy=%Qy=yxtrmdNZU8XfK^auyNI7?BPK6b@MKIp9Z67hzn2EvDy-pSim24X_m2 z*419IPc@WCvz^4;@LO>kdA(#D0xv}r&b@}!Q0QOCw* zp@4}Ggn7b)NOP*^>AV*~tqbDSQMc|$ui-I!Cq(X9zdd4SO(@C92|x`kLT*jhgdM}X z4?s(tQj0l));#9cf%8Q?J5r&fxj6ynr@|XwrLTs*?YwEZ9#*pdr!YE*i|H$2l-Hll z%oVY^?Vs_ZeUhl>t?2gmC1tqa4e)wN$aB)DrAl~GPVdS8U`yr9_r4l)FVjT&s91qt zC6qMPIq3rfgD4IsJQi<4rz-QSY18$M72; z1m#P!k@mugt)o5Hot=r7KW<90#!;h*eo5=YI8~N%xhxc}IODYGlmbxrbO|8iuL@5H zMJ}0~ZNDXO^rm@jAR7NM`LxxU<7SK%QpQi!?GY#vaKmss;jRs|y^CLQ4X(P?d(dZ* zqipZ!GJf)>M~A3m?>U&XknBoOx&?nob3F;=eSdhWX8%NlwceZ0DgZ#0R_rlcN?i+Q`$GVbqtpAauZ#d$oiad zW#15Kdhk)Uqq(;K5Qh3G#>s#Rvx9WA3g1M&fOZ_7qX;h7f^MxzH1Jksi=+|n(Vs5>_!bSC{SHJ$IquZ9K>*O1Ys6j^xqAtORj22?l z>vzE(ClNM1`nv1t+%P#k$O|1!;C^nDPCeSlAGAr zY0Pf6k9LSw8W&vu?PJk_qb76HoC+rHZ63ajM*ZHOJC2E7xU?}N8RRg3Rmvl!(S?57 z#d&et9df3vQogA@gwGA2HaU2#PEk+WvG5;_Yt;|E2U|PeMG6Bz6MlUK6`=G}wC{*J<` zstsi;GKD^+hQ*opKJw@jp0KE7>YW#_8D^vE2c_uAd zeQ#cUIq1Y_DYL=!aJekpFWmAF@a70KQ&k;yQ9c6U$}KJz*i&hV+;wGMs-zx!lY99p zq0kB`4Q&klhFxS`%jVq${wc#)$_3u32jG{TDi19G`u0dN?16`~LEEc*TijQkay!4^ zz*ic;g>nKwk6z2o9A^~}PPmZ%ZEDvZ-;AF^x3wL#HZ39fuLi0mBz!^XcI|b6J2dfw zRqhT>llwa?&^bZ2T!+Br?j}~ID7u!m9ZQ@JJ2zhP_fNy^4>95rE9ncTv{i+lX892r z-q>p~({J}Zs|!Z?Fi0a86;X*pZi5li?!gE>Y0hbc_e(phBv<+Yr@dIQKDLta&MEe6 z$IB`jpcL3# zh!PYt;L8j7*vTa&lAQsDRyOTQgaLPsgIf zaA+Cd1I`0x@bDs=2BXYjdB{*GO>eWsN2KvBA0DW9Xw zPYym5pwo9Ec4u-9kq|pMqLX|q<3EJC65fmC6LT0Zpm@zpXO z9I<>^Kuaf_u$XI7KX#cnTyGm)@>wOr0)w!&M%5)9*OR+)y&gAV(th8G?~iF}=g>gQ zO(|mk^6=oznE4Rby3G%~g}dMOLY>}uVemD&atT8L!|7pK(se5L9Ag%A%QeYdESYd= zpud5HSNgM(<+&*>NPA>ZV3uj`t95@11;ZFa&yKbvfo%RV&ztT1r(G+l!GWE@UyUqt zu@Cxgdln8EG#M+bEG{Jqbw_|t1hPZ8dTkcFA#g6(f@AD^8}OcgG!_K-EKzj8eP!rkJZ%UL}pz37{cao2lS?!3Hr zPt#|;&7b4JZf++Ad%_~>l#zJ6B3J;J1}w*6fK zEzL;U1S>X2G4FXR#9WgGpzliqxMi zU*3GE<8%$^^|;JvBc>4%TNw(q<8bRBX+_aq-`;mXgWg$BtOPbx#HmDRJCBHTB1<3Y zLC8k~k;@H<(T{1S=#p~%;|mar5ARW#QHTC2TBEvCG2D8?UR`p8bAv|9dXOyIA4ufQ zU}(l9exz2l6ZPXZZ9R}j;%QTlrV7ZL^46Atwn6E=UjD79og%#hcCl?j1l5`=xYq2d zi~~VDK541q?wjJYUn3X=zR{|uSyKc4YI?}8>9qp`KoYrtH*HiQ)*xvHIkWexf}W|n ze`KQLyTzcf;R6!bYeu2tiyfq%wwe}y$hWah0gaob{tXiEX-NXJSHfer? z-V?j=G%vqWG^{--J5zsW#e!$QQ4>FYEr@7gWF0Pbb>ae{_05O5NxEg))x`HRLORb; z=u_o3OliHz$^J_x{5A^gj#<+~+`cAVJf}ryx(fZ&g_(`DeHMCRTr2eAABBFg#j8$6 zDym?G9>$bmuPB3HS5M ztlV2AeL`Bq$wF44nMM$}71>+&rfcs>DYEp^f*YdyDfq+trO20k`d#X{2b+4Z{c`pw z6>yd>b@r6tCTd<9HUIp0ClFVbU(Q}DM-87^i8`<4==riuoAC2j5s~MaiF(^MwR^R$ z=kAo{4a3-@lU<^3s+xEWN8=0QwER?Wy78EjMqd0fn%;m|3!V4h>!9fS>?Vj_waO6} zr)ID3&D^LGkcJzt`3SkcHOX&170R|W_4^CB|5mVd=CfQ(yP|jTgmWxHyl*ABv2}iC z5h**D0)jh1xce_5(lg?7=@jbrPsJo=G+zA3l^sDcb7@^o_;b6)ac3sb4UyO_v*6_T{NY5VQ)mn~{n%9&dXLI?amq&Dip_`5Wc7@&~`A-bIeuOBe z`>$7~Vd`cA46{Mb$o}-d<;e-G@SQ}!%)h>}8pf&=H1`Am1o<{Lg&z%>MOy6)L=kq| z9}=F|-@lJXAEs3M02x?tho{{=*haGtre3aOZ_}8lYQ2GY4Scp+Kd071NQzc0E16jt zz8p0ZwqJ6{eFKYq-+G|%*1%%WDoa2yG*s-yJ>YCE7ZVx?nSK4*cHEG3J1p{IQO?M81qP>p~ zyw6w#${{?$J?DWK4@*VT_4F+;CMP=s46Sn%bon5}BzI=6`sCJGRkpyw!1ExLg_w5JK_|*yRt1-SkMaMnj0UEQ>WjTStkF2^b?RN7yP1MOGq*QM0MTzJV{M+_ zXrLq|6Eq)Qve0HxhdZw6JZ45HBI5ioS5`waPwu*hNBKR@u#frc5-{Q%(c+LCz-kFG z`fGzNuW~f(ua;+`KAvdhDMdqUf;>eolUlN=pN|$5Hm( zPJJVLXPt5^BAlZ=uHct-b3Gx0H{>TECU_hT(NO)E8|Oj~_`{89+(SL_HscBV(lNhW zR}m;2T5WWJ!z~@2CVMOiJ-;gY2aNFB^s374LWf7LI}js*?XOUkgz%RIg?7)5W9xyy zzU89Nv2lOl@mjBlg&}tbUJAE;1LXDo|#@M_t zf#gTM@jEqpDau`XfwFSNNGG~rBiJ;ixMfG(`j{c1H~n`f z2Xfe1w1&jAPdxa<&c;o7qeTDrhT*=Gm*nP9s|#WLea2`WjMnq2?xeDQG3#8Dh}bG! zGfQK@H+!)UNg+e5HY{p;MhA}?XBQ=hrQNr)t5$tJ?V30EDx`ux5R5s-TjvXXX0Pf} zDv}2OfE&X6K^UStm4Wr>d;hV}^Hoj(Mz>`N0wiBlo;+Fh(A(GLv3xZPDX(t)?NzB? zthjT%y0xE+6eA*~-Cx?T@EK)lHt7N(ww;9S&t0yC5PU36>1(&tOIJM&*N5J2(v#6~lFzL1v#1;MQOnbv`}+=aCQb8RX%8f<;)XlZfqA|$7FF}= zs#{lL^#w$$-)L<2Td1$xZZ-)zr?_Pt!>SMQrRT_!T_n;Cw#qit%Y(k&Q!0sMyiohyqaIB1l^j4 zbD5|jth4aGtIol|og(Vn0jF1}>bG0m@i#0wB+s)9cX1>iAVIq-RD!S%&pC7zG&ViaIP;Wd-_Ct3Hjw^mp&mF@ z5stn4od&QR?8>}Wee9)NWX7+|w{@#t?j34Wu9ZBd#OXwyq6a+x z1%kQ5xno1G!WK1hcRn}qf8_ls;V8p-sHXL$Ned*HzY@|uEea($07vHP4~;Nm7~Td< zPt)^ck?7#vSp%!9jY4WW7k&B6XZhDVlX&!~h)}?snP`Vsed}aE4*R_>b)e>y++nT0 zPC8$TQC?!tk?1AhCsJ3}C3{q}V_3VD&%(?u`jqq%{=BIT0krnHp#C7{oN2@dsfwN^K_s++1@ zd$m+uzpo_&GAhoX)Cy1=l=b>+X{2s8=s50)-Raz8QDPZnQ3v}-DY0~X*WGthH9_*{ z*XuL#mDK!_2fm1C1ujen6BTw7CxJHQ25wFj(^F*KTvC^#-#d^!i15YlBoIE3vM&B# zHFX9!6>89c1(TNU2;g6_Ev?TOEuDoy8jl(_w#Gd)d8p{Kw=Lz)(gJYBW#Wxv=ClCUYZVcGjwTCn?2l`fm$bGV}%{T zDG)8mDrXzqF1DVqIFPZnW((w5(^06F(I=k}VQ)CdDy!gc>;Q~yLZ$lQ3NGoCnAD3V z#rDk%P>|K7^`Af&h6*EWJu~9DNmOMQt{2gmF;N5lhJajCB8Np=6ZW04TFou!F44`y zl|vm=$QV$fZkD)52y}~9hw09IvkZ#9ui-Sy`H62n$+EZ49WV_v6Z1pV`_Eu0-2QU^ zI^{Lmr@qSuZe_G!?&I7TC9_^|KV&qx#!>&;Q^$Mg;pNi^{T5?^3kMNFPf4rh0+-Ai zUl_NMtsZ4!;~ps-=ZKo_h}wp~W$wAfMaxA;q*%00DfA6MNVa(n#U-1U?O_LAu!CQr zdL|Il>JJ7MN56CPc&06k-hxe7);^hSGe4_j?qwHq%0fF=T0@ zFl2Ic-WDI>ntMu0Zs?>;N1aa;ff=wR@{_ZKW@cZ{@qFkNPiRZk<7Q1+*jH_ z`7&5+dc(G)Z}nBbv&>F?W$Mn~E?fjK$Sf7Yp!+VY~(V18oIXd?--`0K#0dbRWU`}ASX z3aVTZl{!#s2pvoRo%PRsVzQ)ogDi=#YJ3`NWU-@J$$#&kD!p)OXG&6XGUCg?$>$~( zGLsXA5yxfZO75ojd=>q-FrE-jTkPJO?2m!xx^WhOuLB zlZr*dN9NrH_u`#x^0nY6R5x1dMP^S5w*q;l622&G_jedb@wEYp$38|4J1vv=Gid9s zMA5Zm%Nr8XF*8k2a&YN%)GqJrdoN;L^D!^cA|d2VU4|9m@>dJDl^1@uYznZn$7dO@@;nrX&a-R6d6H=L~mU z*vJ7&G0b}}r(ZZB+$#thJ+-bDZSO2om&04DZ&Lfx=&adO|7k^*edxyq>*x#EEF9q2 zOgc%Pire)=nU!E9(|+{%V)YXxr^XUT$n?s%EXbU0v{J{|I>s1z-NA2(y=mhe7i|t` zIU*&9-6QQ3u6c96JU#?dF^Wgaknb>?|9Y3x7f*YL-T3Zeju;%Q7^|Z@_db+&XrZGw z*<$83o1k$AY()sl1F;qfhfOaw1U@CUhAHL_kn-nNyW6y&WHo;cKjcF|xBt--^HN1j zf6ZqQ@XNJXHIF>d?jz&Lqt(XIW#vK*w6E@TdBj=*3?|nzxyP6qM;$Z|_5tme=|)Yk zbCcT>n>zY#ibfSU;s!4w;ZN|V9Gf$mvk&v#xwy)?uC>-KhL}z?QY6RxPpcDSKx_4A zC9{l?g4;Vvm-`rJd|guDKEy~K>g7PM`K}NwWR$edF$n4HUzRGCp27eut{RjY8s}o_ zXuKQ~DS>7gkvT8(?3ps7mVVPvN6go)JcJF{53A%Z2=i1AA+u)nyq(9M;9f3m2Lk97 zLm$KChDwli+Yu^rko1)(cWk75vIVkLVR&N|p zd#RcS^gz8UI;5mFOmOPj=pXu$K=VyX0#Vy7r<2o zSazh zbsL%KJXKIzR=*cgRvcYWwb{Nw){ktXhpxGYUbGrqaQ}lf`^59`eaJV_QE8^}3>5Mg zy1)?`qt2fj(_A#lnz30RSd^?0EuE2bnB9Houd~sKVdhMOcUOY@lYUIup}@h&Qr!aM z!sz2#Boyes2xO1*{vQqo#Bu;+buVu-MX>_;-ngM+a`T$gd7lL|#rtI_;POGGYT+OC z#Hlw^o5P>@eL9vaU-T#S0@B(llg_@D=Xju=Dj4V=Q}Jt#RpsrOYq&V>vU zLy1RLPR{ZEk`*p>(5Lcm-ukz$@ZUZf3@x~j!CXes+@y4_9fyvIa3V+;g{GAR>$X;T zFaQES7!5xG6)f_YF!>R4bhU6rk8GWB#d!5abJX$E(3Z1ZyTSuwlK5Xp@M}hezr9?m ze7>a%V-aLKKeTX>6nlN2wbd|nf}q{OLzEqt*rK-<#n(Rjkt$CFNBKQ%)Y5^tkoCXp zdfQnN8fH658#n4UKcP28>7%B!NQNFArjkI$o+KC#?(@K#pJLM zy7!8I(~}sY%{U|G=q>e|pL-qMh47H$X##@W-Kj!={GOvXBIa2eM#K(+1s*V{~V6}!ITwZOLjLy|aEi9EIYjlx#EX$(?4YhV#MR~WxS zm_0yZ+XV$nH7V>^6{{*U1h*bzY+IuGJ!;8n$vgBX=LdJj1b}U%vnr|Nq2YRsIsHv$ z;Y7f;N6O@m=@I?Tq(6GKejZXlCrm178|0iQWrSc*h0PG7byhb+LY_ZTh} zP@v1XymgZg>1$~*W&NLecuTkx-Tl3yJK{%uApjLn;2rKm{4Dm*5qMW+gsO0|v5Maf z$n-z+kjG>C0A(}If{%0)ZE?6Abp1YDc5<!@Qu`A?#Vs) zXYG{y)dw7$r)As*0l;ApPG})ieUfrGM!|}F- zdJ^2lpK_VY_eM?~D3CwshkP_e0KD^Ht(ND0u+(}K?1D5pGI)BiU5aIBp2giO<;G4% z%@ITIK`&)P_KDtf{Y25~~kzJ=}uRoJiv(5_- z+)Xo>m0gVC3=nCC%XqnV5QXRyHqmYy`zgyDW!^<`yT- zSEdD==mgU6r2WX=P_S71Pn*Q1HqSV)80kezk0bu8g~7&MB4s|*>ZG)bYUmiB%uvsv zQ6;i0{I97ms1y1D@A7ZUA2oulgFiU2US<3&c8F*l(4^O~K)Xf!^4=TSJcio`dIxU- zx1j|{||>8LmD%L(7p1WIMcN3ufP{OhGeD(6q=2SY2m zpmQYm$E@UM8`0rFz1FjlPs*gR7X^y{g4`B2+*}8hAAvaQ^n)ejmBhM6a${D+7W~zA z>dx!BXlvb>9AXv?GdgD%p(*=DeDOmKM5cdW?V9s>?Vsec8VS?cy4`K(U29~H^RNIi zw{nU3$L4hrE#%>&?&fc^;|K>~U6`k7^~^fBqaoUKtwRfGI=z-HcA&@%HFcQwf$i%> zIwm(19>EINUCT@x59V@x8|_+xcX3sqXe9*gc4*^^IilQn@V3{wu1;M`C~LSoJa}NC zk$fe@0IlsL^osLK`VeH$h_-+-)a{Ch)yLFJv@J=cZ_bAx{1$S}h5BC}tAWSw@R@AK z{t(wRjL~qW7WCV;n#Kf)J&`hxoQ{~>z1$^4WmZaPZu054=6*gHK|jtntcP(9VVqSQ zGuJd||LW9k;!a(-_q%Pbm;EIBJ2zP(9SI>Ad4x7o|NGdml^qRd+bqveVh*+0)`SS$ zDaGfy;ZCp&A-N>?7Q?CpDnGlcXTJ|U^~3&xhNX>+;*Iitg@L5J`7iPeE&hF7qeBTz z#>&*&1r3iQ69Jh^VHuwhr&1ysUv7SURv~*aJ5gkM!y-C(r&3l))}QL}+J%&3mXeT@cdX^p98dI5in)UM1O3pHVd zpE-9z`$dY+E28WhVKIYmI!j8ZRnEt6 zqBe5l(1P_Di?xJHD?&m!cGA2@J2y)1PF%UEM&999Yc9e=jRJWKC3KGT7I^j`=i1Yw zFRXCGza#tpfn0OpVbOp2$5yvCc*~|qY-B|%@XH6Qr391dFwqIZiEf!7va!6fs8Yzy zHj=-9c1^W%CF?4dWSBa$J6 z)0479mHmx4 z?vjjBNv@@=a=+v@*ZP)}OMUxB?lfXCbKMMck1j5i`(>txZ@J|<*CDmJ4=cA}0DvZTs^DUi-FI|G*Ko&R#U;?`cRW4mbaFAg3M!t4?0~Q6{QE z7VUVU`(-U)(sw)py61Rk!>^Q*V4~JHEw)`}CW^WY`Yp&lLH49DZ&}J%L3ZnOdTTmh z0bd9F4PNT-IkoZc7emt_p7sqtJqJ4W+YKAb#dsEohgp7o8smM;wbbncJnz7d&4;a{ zqs1YA?g-3!%a}TcZ>0ydH&P7C3ObX)q8;wxX;%0VJ*t3Kqg&YY6Dz57dtR8GzRzeD4CUuf{HbcG-jJ-BYf4?e zC&v`BENZ{<21+WP+%oFwf88o6(Z|IJy!?XhEn&3vQP?pC`C;BPM77o93Ll?!`U{-q8&RwLgWmV!(xwHbev6Qf0vfu)IcmNO5U+W)-Le!N#c z!pcQ7J}oK}HVrs8BBQ$*J)#(!<5bJ5BnPgR)fNOcPe``H8lT!M$~fu3|1F<-el%$X zw(#AicXt;Zp`v!DH|9#)zba{c)#qw@&4#*s|~e&C0WK? z7X5MVoGX{+%hy7HZ+QQcZ@Pc{>^h%Nh34ZUbg2MGv-b7gf%RPqoRf(t2}22A&=p{_ z=i~SV#~T*6qA`i8%;nAtq^|OdpxM4%%YVr_WYzIUBeoYTEf06c2G&QyDoI`(HC<7J z=!$_4R>0=Q>fd3XD)`E$$F9(9lVrlC1Iy+PWF!(gC(hFI;*A(fVgRy$-VAoeb9|^M zMPrXj5=<_NlBx#2B7?s^fB!wIgylH~5qarws@%TyI5J6luKnbA3R&%e&Zl$XuN-03 zO`4Faf7y$1>YuJe`EBC$v!cC`h!EO4C?`t$HD8!1&~{;pCtKqY<7oo)P~37lGu&h3 zt!Q-H{i7TMzbf%V_47Kq*RW;SFxKh2^XRwGALqBo)*1M=34{z(D{;@s_a+YI!2?g> z74Y<`pYaln-BDQRvp!Xf^u%zM9+ym%`LU&E5o_45cPHXkE$s@V&y8d#gW7Dmeu3iu z9Cs0e2kZh@1bB1x-)r^`M~#P)CzT^BJy(Ag?%3FmbY1&~n4zT9zx@G3i&&qR4Asp0 zW>L8+C(1yb7k&4@DfUJEE?^a%AW^<&={Xb!d_X? z0~h|!GDE4SmNY+U9Y$31AVYn(5BUn%er&m5cFT4Wo)NUN`>4r_$v+(WX(S=^=&)9Y z94uakk6UmRv)9grwm!g)Q}=WkKaPdt{t-SgN)%68y$3@9yOHbl^LQ!>*f@0=y$(1^%xA_%gv}47J36hncMfsFpCnA^<#P6*LV6q z2TIxN2x^3Dccvn**NYk5;5UW4oELdM7{eBg-zOaH$`FAz!AH^LoVAiX6|lFzU>J8b zGR)06G%@@?03}9jc`=4pV1%;Tt{B$a^mt**WM*>pN2;x2w$M+;nXToAGbN~+#BXa9 zJ~?PU=g3!uIPhF$K;76s+ANN}&9H*HM70OWiFx7AOb?7uWJLP;a*YVa1)ObccFKQ~ zLN!7E?MHbfYT?xPXUE4W6Y|)+qb!(@jii>0T_Y4D6{X^2^|7fJt0pJ+~?FdZx%DN|)K*N^IBN(kKUR{bjAw#?IlxSh6?1zP(2316`ts zwKi7-jN_Sm+&1$1;y6r{a?xwu`{7#btqslIa`MYd!9Ui9)~54YHYk$mu39p=|BOl( zKfc&53cM_Y0Lpcqfy5Gsy z?;SYo;_AbDmQPJ{C%_5c>4#WRS#x>$r>wn-qrH+l@BW*+QmH{cpnQWR@=4H^Bi1Br zqexb8U8rR>mI(KntysD}CQl*lcyhXZP`B&`C-*Ys!xnS8e({t{)sl@RB^~my$HEf7 z_MKbK!0$pmscf@j5KhO;OS?tbLA*+>m~zI0Z^!R2FpLOA|EfW&^$+Ch>G3+Oa+`Yq zuZoZOTG$&=GPE@CSI#|;pXuyVOzN|28I^WEc@4O*+*udzJz%`X}tfiX5*$)^9Ki>{xLeM!m#xx z?0}g`v@31`7ltN(Z5gp6Y8c@q1A5i)lHhQ2%TIt`L(1e6O4>`>73G14!|XcSMGgLa zbFpP_G=&z}uyrnM*6bO`*QN@)?aF|I0QzejdzrGY{C3`F56_p`FDe8}8e;WV%)mW= z^-Qcuj4$If04ce!teY0M?5B_kjYR#t9FIPmg*(nS=(3tn2ui3-k+fGX#f(CZ?pQOq z+s|c8?%Ymp2mC|QUNgd;%ezUB5k|Q-{a|GqF1{+AUYm6l`1c3r8-utc&zwFKWb&@a z4jq}r6KG~0TEqdbd?es}%QI>lF zA!_LtLxHTAt|6MJ1T;uOYHwIF{78m`Cs$v!u}A;0tw{xc)0go+$kucWw+^~J5>{-) zB|hS(FZv_U`O#gx5%bN!n$C(13eDzkk-Ll$sQO_trDHX#h-qNTx$inf|92-$cHWsZ zeVrrRC^O^~&A)JodnpIzkWS`@h5Zr5=-Ay$r;b6s&yO#>EvJM%$nGVdIk70Em&Ginl{YBayKn(M#H^kby4bCiqG06N0_}daHeb>D${qziR&JZnmHrSt7vs} zg%tz%cwlO@H(0PClef_?=sO#%;(ISo@*EZ1YTi+Iy|1DeZ`3OKa9Qp~HAn$m23c%Y zK>PdoHJ8*NtNfrXF5)^Hv5<}nRvbTeBo3B#a`=7;Cn+(Jl&YfnDt0-+%Vx4|K>!Oe5rspF>p?`gAE?kmv}>-i0j`?ugpo2NJzJyk@B@WubZo7*g0$%7Ol1KONi)$M)je6sn zdiXJjA0E>}%ErvAOU-8n56-Ki`+)FLtpf|}0w-y-U50d0xBb&FBqouIBu^BF zjh)vwfk#Hty`0(OD3L2AKF@-Y?ivRskxE1xQ&T^!QnW7o-C3X{1dtazEs3pCtBtJXxuID^uu2Rw4mZIL7^y9khc#?oGy%J_; zSDuomC;k|ZrGN6bYikCHe+C=|h8o~J`J3-k^w8wRIt$UbUlN9Ow{;=mo4^Qv=5gSu zbzHovdmV(E1p!R;bawCAZt>~_%IMYWc4g+tS^!>V9PUJ2}27+sGc6r!6b?WE;l_~ zbe>CNf7+G_Vvi2geQvgg{PfWFaS+Pg{{Cj+W(3#c*0N~9LPTWr)IiO0!<1)U3ZD^`xHx&p4RX+Lp1||-Z-1hcwEq74X@MX&hswj#`cmA z>f#r@WaRkE6ivr%Cun}gonh`{gn-<8)ASyQLD9Wg96Z8`m`wm41T16Se|^n+BIPqO zKR{Lf3}pgy&xbYYkJNsGtx#2_)k*oRX2{LolLP)=sY2u&t!v{O(v zsj*~<1jZ3;TVYffX_Nw_=CR*w?l&zBLW9Kp44;P)UiUIq0n-;shokg+UW70MxH!Tw z`vNC?F?VF=KlCF9HL@ZCDTLQvz~ZR1{X&bevB78hjm--MsqEj*2fv$=!{+2nA!m3t z{H&#Kv!tooOs>m06NJ<|&YCc`Ex%stm(#>6#8ScD(7p~-gcu}rLoO0!A-z`Wdl7!B zM$)Wt^v~eAqDw)stwZ=4724ccUIwtSX8Sm)?l=(x9(OCfa?K;h`{GeEw<#&UvSpdN zyI(J9_|D}#!pD4GTv6LjW|Z#YoJsx7GRMfjdOvN=q?)h`vwaIXQK4q3Cq2Hs&kH(^|}FM8^&x&JXWGZii^=F@nq8* znKl*@phDU;qv?Wtd`q0nxVJ-};8rm`HZ%9iz*N7YRbf&|%f+zE7&3Je2|&|&D>a_q zXq`C*COr_|T0Okk=a}yPJ#hbtY>IeK)c*FeZ1?j|yvY_I;F*6bR|U4pxjaXbLVf37 zotjHriYE!=X7y^d-UctLAB}%RR~5m1SI-3@qu+90Q?>A)j3=RtjC<62f|!@|pU0&6 zO;kzSZRu2pAujS8#Nd8#felnhL56=_Q?;Q(3)V>~pjzaOUieD5Z1K`bu^*L-_8$Z)O+ zD3zjEcc>-YU=Z%na!bPR&EJ+8bgifT4GxSfbY)pi*{lQxqG&Gqi2tZBBNfWVH%}-; zgs$p{3^w8i0zIW>BTERvni`ne(i($j4mwWPMV;{9e*uyeNPS@c4|fVH4eypeqc$XG z8`fmdhl5b5V)WujCk71L$Jvo?y5Q-Z*|WibE2B_i_x6J7SrI| ze@6~nFOJo17B5Zt$2|Eu=iwT)vLpFvzLK75J7yei8lhPemYIhMc`iP5fcyRh*|HIE z6ljQJvr?bmD0V;mb%_7WFjsE}e6FmY-#)$g7a3lb07dp`l%((c{drB(N*n}vR&&JC;>E_CC%!a z#5m}ikL##cr~Ii`NoM^5-Q-%mtJ+#PAqo6R&!u7Vqvz|FGG99OV|c9%@q}6GpsCEH zjFi{-m3Jl-S#XGJHWjJ=VERhLDpwSr?$B34ouBHr0@Tf<32g<`OfxG_N|_bljQ@g$ zmoHaI`$lZ(SaMv|y9_e9Xd|nx(QQ{6z0}OP(RnC&^%rCc?fIL* zOMFmD1%|`&tk|R17x!=rUbyEGpG=q%K@#yxTBW|Ye8BIzl zr7yy>eCHhTfA7V%J&|p1-$HYz3=Hj1?&mGss~M1w`pDCw^P+E;Pu=oN@TK6a22`|~ zlkeajz7B?y3ytLALCIK_uK%Dkg^_RozsAQU1tK)HzKR0bg z;q+%L^vUrjr6neE3%bbT40Q2NE7xmhiy1Yl>yc|+7?K{!O6v>35^pwU5%-!rb+R_? zOY$aUHdd4NP2DG|%j6kYVZc&h`O0!41DqWwkaKkQ*bDjXHul?iOK`TgD z`fz{N^EQ?|^CT^bTuc50B$yYaC@W-0@9!TW{*g9y858$#@Z{fO`rW_gv4^wCfwwkU z9h4%;mR}$QE(k4Fbutm0`$g2PY5@G2s8#3rcIEBIVUd_3L$V}|0zb?l{U3bM4^n|6Nz7F}%3(9@FubIG{%bULe2qo@BK zzfFFIP}lw=ADNXojw`6UZ1xA&3Ov-Q>J*&3*@BqbUS>-_R&riF`^}*$V9e55(zDc| zu*~T_G^;(-v$L2q$B@~NiTFkzSvR0AhX1xf{XQHr-^CdEIX{+8DT^y4UTF{Xw9DjM zI|9U!v^JkQHKEHidO;;-#!M7b6f%7Yv_ZDD*jq5|srI?u2CjuBm;uS+lS$V>jT2&z zk2UP3Aw0Ms$6-vEL{;hOm$3JTF0yP^Rm0r>e z_$xYo1x}GGxD12}H_+1Er`tofwuX1zPQQ;~D7A)27J$cIK9jx^m*eq4nVBfQx7JZ- z)&y(9pb0F?_SCp$$2g4DW}K$|eEG7LMW}-%#W8LrcX6TlG1|TcVp~UKK3ypAFRHWJ z%2}VQrdnrIWhgc|?wn5?2i!Es#k&WQf#P5^30zBXI1JHtB)PsYb-9{cWC(=i7Ef@W znXbQ)RP$n-&wGSwOTW-1laXgN|6w?QQ97jUHWPorzh6%`QZyVw%bre*nw4L%5;n*31c z$}adYD6h+kHuKr0ikM3uMT~^e;gvirU<~CI4Y;M#i74cT~To#H@GXFxr`&fxsFuS6D9mI%U zrqk~6#79cmT7Nj7w?;HWV*NZl95N^=ZVc1Iked(%H_|tDI~{yB$0{KiII)IcFu=lw zO&SjR>jSQTPsJsqscZIXFlXFO)TQ|RnKg`QViTL6jfXf?UH%NI{A|ogf3|3BA}gA3 zjCE;=m#cYJkB_|6`Tm@pknLDn*@{_8joHX{XnahB%=UX(cN%-?&!0Eo?q)AT)d;(_ z(N`Pw)ud4clVH<>1%n>L-L#NmDOn!>396Dt@wwlQ7zX#zALsqIldWvTk&jhG?goq9 z6Twn(eqWt%33TYFGMk1-udET{o(zLHOd9Fa117$taHIg`rheWO$2wi@=OKk~hM_nS zpodcCFVNIVjzhrCrm`p-Fz#NJD#u;Q?@)ofnXSSIUOX7j);i;y7I0&ly3V1!06 zbv86+$MlzL(r+H0C!cVOz9Z2KEL+Krmj@oAK{g2FMd4)H{^?j~mZ#%<7!;gIFIMv* zRBdwyYDgs>72bxt?a?BV*5DTr5%%RlMmta86xf)dQUz2aGYQZi+2sD0ug9GTtF_{A zwd4yjE+4ehD|}3;+RpaY$7T!j70F##l?KRVX(Lt{V)$uIIy5nZJaItBaXMtgRFqRF z2FlkJcJ5#)b@`m3pAgA9B2b*Soe6i+z-1*9;qK+e>u=SBlQ48N?mkSMsL}Dmi`2Bl z+R{zaNORpU+A_eXDVK!o`+N=9M!g_?Z4SUSVVat6k9!!x5Lr^P0#SuYO%#>m&b@lE zllcTQ9_LRkQorcYiZvM94)G4rw}RFl)+KDh7OoC&0E`i2`EXwuONPF0rLwnVAHq+k z>b}gqNKPt*r1myy@77vroT*d21HJTw$UonDKT0NrbA3R3CXPjMq4$z_v90W8)}?nK zD?63X0MF@$G#aU>b!8z-?0KN`)~%C!nkE7yG_iNa-!D|zn2u2P;59hBjkRgr`^`Qy z$52%mx49M+$nqjU%&aC*#@7G0vILpiTX#*xpOmDEenIy{G3M=w?MQa@7XawKXjxFN5O# z)j*|C#?*M~t$>CCGHy(M_v5Qpy%Z-wLvi*h{$$_KaA!Rap?)1l@P+&GYRfdCnb#Fq z|7K7vB1q)GoXrL+U{|3{>n&vTKX^wd8XuX~RWrt~yL_o%3fZKLbX`1&*eH}BHfuhf zDL&t!w)OH%Z&ySdd~}iz*m9JwUq7?unx>3O(U*Fc z4`ne$eF$=19i5Dop48}|RLCIw^>#F&1~RHg(BzdN)y7~E-LGLN9?Wgv%ByshqE;j9T=NnM zp3oksDm=CmX{y`Ud9dtwuTDkZ$Iei^7%$amCrvi2JVZQf+l&cu#JGP(_MoPAqPFA3 z_|2gkyS`IXW*P?c!|7}HW&L|m+!mmR27|ej1=m%j#b-`Ix>F`%i&8puW}Re9`+wmof&$L=UbL6Tjb6{IUs`$UC=WmlQ)EKPU0&?Oy0GUM(p*tZJDHFLHeEXS?_( z^kr2J7INRV^5dA=2kNQ_Cb)P5dx{7o2w2rywQ2y_{~;y^!cF&n`J&(SGSxe^O3P0w1K4apKJrv!+`6yIYE%!50CX`)ng!;!$_F#Bc zPXtX4n+AF6StUmV2R3?jqiFPBr*VV^jK1HF2Y&(m4TNIM1TV<(7zL+Kzag|j(jCnk zIA>Bd_q zT*TPGfK9;naLJ|wt$NgX{|dgXISnF;Xd)qR;0kQn*!c^)^s6Q-wsd6~kr)G^pj?5U z(bwTGKGczaD>$vz!zV=#55_EwW=Hj>pBzp94zjpE)I5S(Xr2Jgybi}=30DVZxg!nx zTmA6_S6W(n;WiAz-1|#*n^2D=hE7$p*N$oBEdi5To`_ zeRjLdetQdNPPmZsXSABX^X7*P$w39tN{91Vub(ZOHO_UtXuL21AJBam>CJ1iI78*p zoybe)tWgv7O>$Ym4=a%1}jX{J;AYH+23>2tH* zQZazQ1|O2Ug;t1IKKoT5?JOd6Np9ulo`h3%f)~3O;&t&t1s}FOY(-s9gcOozsGhf; z%^1C_wpOPb40D7z^zl#4xE{>#P5%4td8#aiF~N-3dfH_mXxM#SJ*G*( zyTn59v%g=>@mCJRo9GZ#>4C;22q;<~VwyWSKoayc_aIBA(k3B&atb&#b0XJRnR|WS6wDy_F$neXZAt@Lmvg8 zsbfyUu4Y;^?ik&)$~iibA9y~-D;Lcc)NL6 zEueT@BNJu@Gy)n-rIB;joRcdqqzvByyx!4UI*x(XUG(Mu<5-XTKGtn`i> zg#w|M3%sqcdCoqifwF&r+>#fYtlE0&Z_8PA1LyxbAnuoe`RVf-(zshdLqEyeDzh(Q zdT3D<`#AF5h#^8^0mLPD7eIVi4sqMxB&>086YfWu@^eHV1!@vSqs;BpT|4KxHlJbH zT$pc;V{KWLoWb9dl$m~{a`%hi-UC8)r$DlV1bVAQ$Qk6}tyAVXtZ%71*@{@}Z8A|z zwp%ba^=XjaG-2e4Jf@#ta~fNzEA$yhw{8U_c;Jnroz6RUM@vR6&UY5W z`7SWFv}Y-Zc%G-azwia~=TKwqcNaOP*0a#nc`m{HuU4K#QyTl!Ussw<@gxkvXUFt3 z_g~A^#GKIgGVl;L;dmLC*J)cc^qi|^0ksl0tYEM<>L}o|j$ZQAg`pPwMj&Og?LV7R zK6u!fz|d<2#OB7y&6*%__pz)$8@(D4ds20L!B%>oSU55J8i2nf*a})@|G9SuW`Oem(08pBF~BL^@oToxpx+?fz=?yduMx5H=@e-q zY!EE2+V{4vJtZC<|89InjJ4wnT)Qx+#b!L8H!PE?T6C~@I zlqqWomh`Iw2@dy<7(M;nz#~xQJV7ED9;6r1lgOerWDk zZ?89zHEN-6t(lLVJ7SshhdaV~^ar*JDLo|-Qoto_Iahs^ z39J4}d3(kh98FpMG`j3X<|(UA3f`Gw>U{iIJ8v8L^WHBKVsK-UVQ*+pv{Ya)l-rZ{ z=R;S!6#uPE=vzMAeO2Yv5#sv+c39Il+9=d)u8{XxMbx(oNVxLI#`01FQkz44>;rU# zx9Zwkj#n%3&n--S-)Kl3T@YbeT_kefvdN3O9j($Hu?&kSCRU4_;>RsTDROeSntp&4-M+j@{MM zPdGYC4zt#yfeI>F!4}cIqW&_;zQk>}y2PD6uypt5{{ZT{5@i|U>M z9bc7-68&fbpI*9RJAz~ASMGh`=LTWStG@J{EJ&2ft2kvs_2NIXZXbAA;hIq9l%H| zpiZApO0jL@yq!5gi3>1pC+s_7mYvZG8Vh%ZY9*_x@%nC{$hOSw@|C4M{nvN- zklxw2bQ>AlAX+59uDQm?ssZI-4wuoQ6~S}zptsA0DmF1} z9KnWRmuzChpjx98$XJrOj%HtHgpXs>q~r;mKcD$=b50^x!r<5h;sMir@&HxhNS&kY zlzXmHMOB(s&#jdhl0Tt{?Lgas&3^TdK{4Bx2mIAld7U5oNY58 z(spKLf)Cmg_qJN%;=D?$sM|~u|ImE-yXg-&MgTcyShS2$6waVuhvqW$|8unXPq5lgs6l@tXHPv)DFh6q{6xZ3;8sAl296G_g3;UL{0^SlO*8bCI z&6-KRk`1lN%!JUDR;h>Qch*38p+7aC-=beM2CgTlGrAsKX*Y^XMaw%?E*W}rkCYra zU|C&BH<*_+U&#F{|hC*yol{xRIBxu2L-G18bl2!mQ?-ibZV@Ssy{yPb2ci3GkFEBULLJH zH7}Z(@DO{I_B0I)ETylUFh_pSYER%X+NB{#i0=%z z$pY`y|{3qxA{sk6sNY8=`DUtu^aPsv@WJ^HcnXffXI42gs*E08DE@cBP?x2 zeJo-gYohTq=`}v%&FxAAqx@Cbrp*@G(_lt@JB4r`8}wUv5>^sc4t{}gC(XN5Hwfu7 z>es6Ua_bn6%4tq3sfw3fUj`rkDNWQMnV$Q}$GAGodRykjZf2{4&gy7gpVehOhDT@p zO71h8)Vbqm)ngv6k+Hzi-FxwUq{*Cfgs#PM65Ja3fk=@XnO|^Rm@Jbph{$i|Dfrte zNz>mpE9S>i-{9Sa+67Za6sx_lYunB=XRUWeUYrylFEc1;6gS+^Yml@DS+$xknw)xc z`rdSW+Y`o}aBBal%|f(*J`W-ZP*5iQwhPnvy?T_JXE|!=gyM+Iz1HVRxuG|!nkG!X ztbY0f$a=z#n$B^Q$~{qi@o24j-D-30-x`PeYw9Ze288Mwjj#pBJC^*1eLbn~+wLCv zOf@%9xuZV|{NOp7K&Lq7+QyE|j)i$Oo$}1;0h<#b>CjmdN4AHUQSt7se|=(T(l=IHRE_%+Zd6&znK#A$6M zdp0Z`6<*-rtNirdD1^iZ1;y%rq0K%}%^q*tSQD;D+W9L%ef1X+Si%uHKVLKcF7SLp zKi&8(uvJMX%d^QGWN)6_Z#7BFU*WieC8J!kvyy14vCh2|K;~H1+#$3$PfEsFXZ9fT zh{^JyINcBnF5njAd0h2r<1Dp=FurSH zX`wRX8|ZUV|0PD5?$3kn%aXs(rY02_DFlZkJd&x&&K>rn`7`a8*z-2Zo<1HyT4z;wB6mj>FhI;oqrdecg6ERULn-zeH}R6 z#cJ9ke8B_$f1}gq1ZC!bX!-CnXK?c>2b~*EE!`4XiIQ~_h0eW?)9LB#VUmt4w|=tR zV83I9f3flkcGzU$Grm@;Xjla=9QKYAz5}$N)JFFw3b~9~VX}?d5-Fp+(-0(S^LG^} zLL4-=)b&0n5s{hioDa?rrt95v8Cx@qSE)zzRdsVJuh`6TL3;&{uW$<3J#YWcM=zP9 z7ADi*7Ji;w|4R5uhO>8mHz{znNVL^)wK~F9oEUd9z&Y)Z6PfkNP>RksCzy4iNf*)m-cT#g zU1P_;=YF2Mbc*pw&AC4w#D>r)*&y5gr^#&3tH&oSb))f7Q1vcuqI)}WQ(#PQ+p(wC z7=G^9*zhI!;GG=A`DkxMCJB)p_{mQYS6Km80p5EDVo!MVr6dXp1}%D#kMYR#bTw&# za(C^&*213-zV*QD&jFcDj&?q7HnAV)oh4Zx)0W;lYF<|fP~loeN=u)Nh}V`{tw)Yz z2@^jI@BGqC56(k&lsF$Oqg1a34M{Vim!{mGA8sa6b`#^ndF`yRLLVsNJ^z=MV2b01 zZ57|CrEK&8-t7vVdDR;x|F&2F{&)Gxi-tMk4%x-o&GcUK%<-Z&#k}J+EPE14bolHJ{FjU|d5Rt)ugXbv&CG7>hov@G70#DoUCT##U zkds|-evSR>$3+E|27agN4Tos2^B)u{)nsOV7)g?q0o}wdy0k5Bx81Y2B?@vAypPC92u*@Wa6ZW`-D1?~lnk)I*lOx}|zZYx8%$Y1KqG zPu5zP0Fp51ccj0Rztw{B&o#57>$36^7)#{4dBiD?6^`lRieYT^2Hf^TGS5?y=99F%#5$yIS^PEN2Q*+Lj#`5;IiK#nwanU8*#3&xs zGr^voat#!dVu$4nH1Pk#vjZMO4wMZ+-EuzU54e-(z+EMD>|8u7{0QC3Kmel7$Zray zyM2dc!H_@dS1VoY9`SFc9#XNukMLhP%G1j(%G<%}na%A_W3wH*AM*+n&(w#1Fmtx-UvG)*=d%von3Uew%@!``TGC`FyCge zZuG?-6;@j>*<&nd%LwC<5h%8!tjF+0PmD0lpKCbZ&UDXW8{Hky&-gMaCgx@TX=Wm@ zob=8Aa`{m1a_fRcD|0kEx;mV?A0>ucf5`?%bfz3P>vPu>y4}U%d+PmWmwkRqB2ub$ z(Jm)g>Tv?H#@tCamv`if?E!`QzBSENld4^h=kDV`>nW7V$q7ET>(jOwLko$g>#nv< z%OIv8=v1jQtkYzT)&IbGZ^)oe-J?L}Z$z}L?KXz>gecQzbG&?z0_a;!>2yKkgJe72 zYCWS9vV1~(&lvaoEWE_=hdQC%@yO0^lYQ;Vxb(ys{mzMYA|qp(KWqTSStxwFqW8hR zGU}kDb+05|?q|_P=4L%JwqPcB?T&(yX^130;aCAW&vr2$pV1w@Ul$PH*%#WL@x>vZ z`$nI~YIkRIUq~&qr@5mnGuifHC7DMG4qIB;7)ed9$A7KM&W`xwn9;O?kD0e71@!5(Zwa zB7ivG-5|RhY9I6+MFLO36$5kfQJBHWI8MwO|1Rl(e1E_)$4uJoDu0c(;}T)bnF+yJ zCBfDnd-BV>&%~~zwHp{p)PoAh&kR)$$nUgO-r)${Tew6WhVRHyc&NHclJ<{l77t(6xHc-G+2MCh&fT+OwMW6i@lrEU<&SIv6!4 zaFzDr;DUq3;6a)*EA4>CsAT);aeJDz;}N~}=Qv)vcukLV-G#+R-@5O+IlZ-g+LvVc z&&uD)Wp%>(T_5#HCBVKzZv$vCE!F1(e}an2trKofUbHa{bSt)@R^^H#lZIQTG&hum z*11i|&*}um;ex)-Z|Pb2%AhK9;bj=8h}Et)aiF^tEJ;oE0DTXvY;pV6k%x;tly-Jf zbag5)NVlyMH$U1x{0}!KaklVx63f%=5K>`6+3$Q3%5}!2UDBBcVc_Cvo?^!plM*v_XF6( zMR_Epd1BszWj){yAAb!m4kUfqvnJMULet3GT4fc#w%al!sVxVs6*XU^9w?weX;u{P z&y4ERgh|O$pgXfqFrkXtPSUf`p2lN9M-^-jMY=NZwx_fsK~w|?S+gzZ<&&Prv!whDW81R^#_w1X@oQ^y+X$>O1ez*o5zSvrG>F;t^OiMHhk()&>Q zJBoDj1luE(D{C%(~AS?d*enM$5@|m(>l7LnZ)KQ@o>y2R7V+d z(F<^IPKDOL_GVQ%%24W6Tu~(iOh8EZOa=V1n(f)Yg=}!XY`f5usHT&Kk_ zNeiQbGYyK*07|9o1Q-_a!8H=~n6w)YoY=|J&^8K9ngX}YzbjgrY@XIzZOUHG8`l|A znX~1E?lrj%!OFn*5I$LG0&R_MuSdODKJ$eSNaq;4cnZaT0%WWoX)hoy;^Ks+7Tn}& zX~FS+1=_MEEdysozdf4Gza>#!_Au+z4ru+`V-I!1F5z-1HxB0t?;l-)< zw&Gdu^)gG@x~OMiRb^AYtOP2}$3c>xqsf34R%7DP3{^Fzd{Lx7T;Bj#ul{=J=Otmng8Nh|h*yd$)IF~S&{D3g<+jeV@rqOor+Uw%&Y;wO(sU-z; zQ{dj%d*P=xSEP~vi|uMJN6)~&VR3x?pqA@oE%)TB{8uFvKPD!6&^0f?$RFx-Lq1J_ zU+s(*Z3HYX%vLs!es7*u8-o_NEc}Fr*EnGfeF1KKs2DVjI&m z{n)|Mj;XA_y02Pv_bu;@zD%c9(n@bzh#sy7TzE#f!to4!+o^j8aH~fjUbt(!IItNB zCsx6ezS8%XuNaS`b>i%uLvs|Ju{yUdlnxnJy zbwu^ z9p*nU>iWRW5TdQQ?IU1yH?+2b>{gKcJE@GL31hc(`vJ2RJq}kMkghOa^q(}f{!|v& zcg*+Y$k(06zCXL}CsD+Yj8?#3b|QhGESK$FTMS_s8KLRKj1?zm6O!+m393M)nO#K=ZAB z25NG}2^-36qM%Ly1`f?@0uFtmc@{9()&pAn0|VQa!vx2x1MkDkOd}Rjq-++i?kOq^ zhuk{r!fU&7hF;a{(cNFDm4TxO#}2c4-gC`7NGh!s9SI7}aEg8+a9JETZ;x}A@%{vh zwt;{8Vf$Vyj;i}dL3FzFWD>h-wX$PUkLa&#Y=A2LA4g~Y$n^ifaraW8Qb`O&RPH0! zoT*S)CHEad%xyDgC_Wvo+{ZRjRPJkzxvMSao_jX;ZJYZ(zU%uJ_-S76*X#LwJ|5rP zq75AyHDV+1czhm^4JlEby}=USpdJy~4A~qJ@KFUYc%+Tkz7epUv`4(s4bO?^%ku#J zB$lr(R86!p_eX|ta5CcOx6MvX0L*lybu&_YOYKaSW< zdm`MdH!yhh7=W0ynX(dB|y1k5b{(_)450%y` zqONuEeO+(7`8D=9Nh>x!-cyC@dlZ+K@Mc6Vv>`3P1b?Wt`uA@El5jnosL@RXoo`6U z$Lqvlc~8YoXHny!i#md;W9{j6_+NeVQJ_hL02)7dHQr%HrF<(-f{4LdJZw-o1lhwpH`fRD4rP`8hv~6azb>HN2Y*(MU}z zX@d%E)xBf04c>84_*8|ZZa|a1sbaS=$n5B)rD2b0j~Ki$GPOK96<-Mbw-LPJAkX0Y zn!%qzq+1BQ%tU#?q0GUJ;JnU~zE`C~VCrlen+rB;aq6{y5Lgq%s`cjmyvVhEPe49` zRGIiBd-AYg>Ah^h=qB^Z&oqq9QHWZlc`(> zZK2L$4|gjO>`6(v`y$~*llN??E+?j29`ANq5U1tx)*5@`dG*JmxVT_HSIW=SLW^GoOit4#O}8KR#dpt45Z^p zmd#1u5>52RU3}qQk?G*`VOY`D#N;Gelb!~AwWVcLt<~vvb?)m0lIa>N@9@TF$K31Q z(NSU{4lb#uP1E8{FUK1b*u6zld&e72+?#jY5B=bLayQ@$pozK(0ngEqZaj-A`CzDq z`VUu4d(6vzmqjeTddueIxo1avM_shRf0u5TQ_CfG`yLAnb5LsCd65fCrQ=qg^GZac zjxLMz^c;`(Q0P69#N%>1P6b2mYX{U92~w@;{J~|9b<0F~q+Z4J`XM*7^At_ z>ZaYhp|sU9a&-6nIieY4re$R@hv6JU5Kjh0kr+q1x+cf9WptTX{MDz7>`UvuaBa6y zdc?Q!R}SU6^sH7YQOa-a+<0UEwV>SKPGTzG*L%&CD}Rqi~e|dyrImA-*dVF_UJC%&n#7W3|6tI`mDI% z`B4D8#2smDrSKmlTlfqA(ow87C4v=!NHii~IoyISdA7Pm zU_~+}C@+>$;7PLggJ^HuaOWpfg4&#GSAQU8{fN}tEzH!=z8}EMSn+Krs3t64Fm%taxg<{Kac287M0>0l7gdbUiG_c)0q-IhpfL3s z_dK4_t01}?s`fnI>~K1Hqr*e+na&9(dg^k(n?Kl|<(F$LzN#(v`6K}H79E0dJE_m2 zk8CN*?;Y!4;ug^L^G9Y8$p#Fn-_?2TqYZ3HxKx`6Xh{XL0~6tI+$&KZ4xgVcUtEx9 zwnolEG}yEY!bj3SZ|YjQJ~|u zWNZ7^m3qCb@{@nvB$D9apOW((lRZbA;TW3A^h!+FV$2Rmvpb?_7H^bA*DFC{gzxq; zL$6^b8bC7P?3d;*4Xrx0mt3ZOd2A&YeKV`SN5!*CZBgSMNz|nbhr-=o*qvrtV1*Ub zP9(zi)VMW(r;X>z8uNg7Pl# ze0}X+TQ^(UT+Wq!UOxfNp;pQyQvs(@Z}gJI%2)EJE5>Q<35QJ`G|09n+jUf1)Cda0x1WC;$`&O?3h7~j%XRCwaFn`DKC`v- zF|X@}6h#B0qvEZ?U1PzLjwOxAaIvs;&D3s_FW?k#CJ`|HW%8&% zy2nSVe9xeq*$(yd*C#EJ=X&*jwQ;0zq^Gu)$FCd=6lhdWbR`PM*V{2k7F3#xFkaZz zf!_PwG`Xu_q

Ik6YT?6=Yx7lQay2&MJYpJF80ri!r%hD3KY}qwIUP%8lQEYvnYR znG}xA#l77&D#&traroRC2B`PoGB_AIXC`{ID&~qrfASoc^s6sUb{z9R`JvXYgdlPP zyiSp8zJeLLSuUON>iMGTwVxAt&NULYELsPslE*qoYMyZrh5k6O#9*eD#d`)>3(=ln z{0zxQKCN!!l5q{bN!EU&{}j}rc_*vAPmNuUkE4XB`{-Kuxka+Y{R0i7uVR_d%h#Kw za8*mf3ZJrozL2e|izC=XH~GG<4+GpUhl&16G>AlmF35LW3F(BPWol4kN}{T62cy;v zGB}|lcXVtTt$sx$<%J!Fuxbf}?0t|Y^&XRHL08^!yrs(TDnV{avVjSN=uE^*wVLwb z(Cg-`avpC+^f`}TIw}5c-&>Cl57A_I{g1g4$2H-GLI}+pj#a-abh}W-d`Z`W?=);; zCYAniu#xUH6ZO%WQnp?Tu}x_~*P}U29pxz2@%F-F&kHX6e?{Jshxsaw0Wx6hTuJhykJGJ1YCw4*fx}{i< z={fF@D7J18YkkO2({(GJO&+0cw)f(L z3=)QR8@1#GOFww}XQ1V+0ky1PDMwKoXp5DpkxZlJuv_18u#eARJF&T-o@l$YUS$H? zEyVRX{ZcgI4l5z5QZ{^{FSd8{@dNYfbR5=2^B9k6`z7lGr7+`TVY zfg%G$Wq%CFmDS&3c5~!!LC*l~WNQESx%{bTASr2_?7$u)znSxi0+&XCDkHdk-3=v6-d+9AHBsRDI zK)k;ms!r)xR9quJ`Uxyou1231!d`PWmpXJ6?66%*G?2^T4n)c|Jg?z^1G1RH(tJ%Z zuR{D8jxv4aE+U06n)xRF^E#15RhkWlC9p>KQ#I|J*>f5iCC&#~&`y~WwO16insp@2 z3YW%6`NSEg(bl4Rld?d)0`lHW%jw9PIGS(do}}C954j?kJM?mdFmkp#6=^m;-vJv$ z9LA#Q)`i4LU3~W1@lUUa$#wc9(kmSIbkiQBvI#0YIceA27jvu=&q#Agw9Bzz5v70S;&l)DR7WeC_q{4ytWg2UM08`z$Sz?9gdAW9mT1;%d=i&r z$FD`IYTz&d;F*~gv89Ai@={_?lh;q@axrXbK({-{_3VGwRAuIyG7kP6e=wLEF(QPV zebpZ>ML1pz+rFkmngZc{7m4RMm3{jniqNFMq3%R1qvcH^M0aa>>}xJ{-l0i{D-1M( zlshO9T(Kom_JQ#G`z%_ny7QWbwCH)e0|#FjPwn`9G=5BDw4=s^e73&CB(vn#@o!p+ zP4(csd`r)nIgQyDnxtp z*N1rYhLWve{2h8;F7#1y)d1ET>0<3k3INY-sN>w7aSv&tQ|jj+*0y-5h4*TInKJm- z-QigeZAN1=S#vFJUnC0oifm)M{{~BU&PeM%no38_x0Pt3JvtmE_T@Hqs#!$CSY4Qe zX0xau4h5t6;z1c|TtPHav~Xya(OrX5IRS z(wK};ZSVZSbyS3#a}wTNIR0xr?2I5)!N#KBW5sP|U;Fca z@xtY973MydNw$~CTeG8)A1Bl*y>)n1Q3!TM@D2m$cL*cz+#2aIPW(@-T@LI{6?Y{2 zXGF(<^O4F>t{DyP8=tUHi6CHWt^@<_NhyA+{$WiBKRaT7#xSz7*{Tm3o@x6PVmYI* zo_Ki{h8agC58})NO@hTAd*^d?#!#xtr~Mjr&+hx-(spe%W~LGa=37m_U>iANCiMja zuY8SVpW%wXZr9(2>cwj-Eql&;OtMI?R+q6d6yFr6>dzj-UF5yozVg{0Zb#( zv_xaKOc+A@(&Cxvqbt?^hm*m1OyAcGg^mJO$U8?_N?x{oHtO2BHiT|w(OFO0?C*Kf zU53y4wE?Ab?sPZ!j0&nWXs|F&3c0||d;hTVCXLv9Ox)E@z}|7D$FkCzRTB!1FV8Cr zf;2ZIFcMAFl_pPG!y8W(WrtdqPT#0H3FD(zeN3o{y!rw?17t?sd{7 z&iNd`1ax{Alc>EG@3XlM-2%y-!JQ~X_`La~FvLFKKpJS!4o!X7SXt`q3!cmustEYJ z#9&wVX$b+VO`K33)2L{4zHS+9F+8f_W2-%^PYeb&bWjV+M|# z1=e7zXLq||&wkxl(26(&H3$1du7BZ3g-a29-)JlW<+{Wf0n6pP<=n2qip+3z)11Wp zW(5Dfzx^k4rYGBG`!Z(frS0PSiX4cmx6q{k9OW|_DH+1lm6vqh74U*6jF$c3_d0l{ z^4;)*sJ!(Q8zGoRR;W;XN|ud~67pW^Oo&aX+lYcqpX0lgpN&?^0pwJ>*fi(*O{nIp zPJjELeo3j*%gx2)d+B!8(4#YKAezcbV}3Kbcd6iu~P3t z_I}exB*}{YvB1cp%=r}oyvp6X;plVp6{;Du%+jk0iCSCTsprz6jr`n4Zm?T36blD6 z=p6DJI>U)G6Pp8Ay6aOgB!68gc75l)0bEYg@aa1k`&C2VZ_a4}zaAJ99R3I%V+d%j z7D`qKD>dHDv%LWCXECs}W2nlSH2`si%dfv(S*$09SxBD05xY;8Yd<1~rAp-;{+!Fj zS02y9k{V#a23b^^J{xS5gNJ8DtKsk`0VV9m7lUpU|^CyPwg zof%93@pR7Qho4Mqh5zf!jITQc&hSkHKH$pcqz;3wta%eDs~&pZf7C9Q$)_z)^YSm! z8aDB9b@P&YIUM6l7JON)5Z~^Kq(9>3Uc;s?-mYSItEzM+8sr#xa8~&Xptzf1m~hd* zvq`F}LJuApX){EsD-NmWk42>Vs>*PUXd9m9Hz=1EC<5#{JY0Uj+c+NrQYL>uZ(Es` zi~(IO7_B8lO$&WR5y%R^J0XI@DGP49S#%_ixXZ$36A#090|<_!YOvGhUCWCWzlH_M zE8zPa#Y1L_{)P&$B;_~?btkTBv~#9}@6jitBUJvLxgcg_8SCjkbOGLR__-If#95aM z@?OVL^{%9|$Ov~P{89i0>J4q)=44v*sFT~i2fE&w)r*rW=P}CB3A)Ip1s__7jbf%1 z*IWaK(ArURRdW(cZk5ErgT6T{@=hps>XX#={EM*f``@2!7z31Lx{JAi-_gjmw-dhH z{6se2U@Oi%tD?LjJ~0bo{cnGta3fA;BHWhOd$m3R6TFpKgz-!0WVB$-;wN8JI>tom~s z4Y_lZZO}ezwb{#FNW|K51tvQ`?J<4SR_9ZDIdpL6{VN-sNRR5N2o3S-%hZF9l9>ke z4mCu`v>WbKTJ<#MiX_@~pccFb4J*LMy)j|=4mtu=P@^?v%@zdURE^j~%`(fn~H&IENjLea2;`Qe9)qbkl*+=kC z!Bm=DR=9QA!o~UUmBCb6Y+f$j8$pq-5O^)Nu3%IYY!>Q1ZkX2XHNm`8R4_gf3!qrU zB2sJI_n}8&gV2>n#0Tm_hPwTAT_+9n*CKZbMJ`p%S`c{Q9vIyv`>g;tqMsyz82gJ6 z5VyfSR=kdrRQ|@S=V+6aN3dHWDcEyHL@ zTCu-A4Gdn5^_y{0r4RlTR@9Pbf-G-5ElJ_vwgR~m?=)IQ&}duLDH*`K^BlYSgkp}X zpj$;Df=Aiq2`I;P%e9vVjH2d?Dtx8ujmt#%lrf>YoA@ zlR*6>VInRRZhd&JzD4FrHZyAiyWEGA|gmyBB$qJ8}0y!W)|z zhN@qIgK+|BsS|ZEE|Dx(I|T=rNla^(=3b>e0%$SSo!^`%G3d8w3kp{DUf}08m|R^< z>5Tt1U3y&Ij6VE_a<#i7tSx!aS#jYnXQJBzcyYUU;-DDA(=f>z<1%E-UedUrPOGDv zZqX}$q{G%V1Qj_0g9kCrDRYg);n0Wm$-ffyhFngnLZ?&K=GCzhG|Q&x$+ZtbYgL@f zKC~RRjViJJH_Yd-~fNAAK@Lh2gLLIg{ zs}?VvL3H8<<|_C_$_+NA8Q11V^gx3}@*X{P#Z*+P`#c}*voO%HQ5sbsMHqDsf_*`V z4z-uys^%;Juk`?ip`Xq>77>#diW-m%H^+}h{{RcS=R|x%cp@%%%c0mRT4oBHmJ4^nisX<9&(rJ8;yi>Do-Huw? zA5b!GVau#LKRoE0v!qDRwsQqGPslS1*bBF11(it;vfjsMK7!OJqZVw@yPZlTJ2s+o zK3{;MC*@EERTDDtxksE=ZN2r*$>br6IJ`W?^K)YU3jG>PU`0MGCLDV{PRzxt~($WNAuyB{==0YHQM?2%R8H8(x- znCIMFtU=5qUPYKdd~k)k~i(7OYD#G>5xi<7A6{XNf2?|F&a)Vh;uaJ9_VRyzCa_$j;Z zPB7${qikZ9(xSlSH7{y181HXOLV*bJXO<*ZM|FW7fj^Zh`vLJTa>fJ9_(0S=vU~_ z2D@JKg|#!@xy7+h@E*fTQyey9$~F;j`Ci9Lcv!#@@3GG0e;QUm`T1ZMOJrRNfxbCc;m^*&Q{$g#w%8(-?Iar%>k;ZVH^3HCiESZpleHn!q3QfU z_4yMca&{jAWczPBg72D~ae^wA(Ts2x8#Vo~l4Bnj0<_9KV1q z-Hs+Q_YR}wL1&!CiapE^Isyo&{CIfZk{FSon0NTY`QULk##V4$-$Em9c;~Co@yX7TQLjiZc?0HDbsN`@-;}@#9`veS=g1ytTRD#6lfr zBd%tB`g0sRs8B1b`~cH5^zAsrWVk6CAQ-f|C%(70iE8|kXGXDV&ohQ(ZFsiUg;YL7 zl@J;#Ujr%}O-_@WiAxLWihSW|pmsBSJd2bWjxMG0{mBKgaeBO(+^N}Fpz+*&dO;xG zn6wW(Mm0|YgC*$L1n0@X9|I`G?2qB`>sKa}$b>+T<9o434~U5Bf+$%Gl=!2)BVkdWW|a#t^N|6l&l{d^&W6gZsFp za_&w1_o{9blNxn1YzS&exN`8c1pe~#lSX^jX>p>@{GCPClEM@6XINPH<5TcnfJ%}S zs$bC>`QwyMwLwa)y=4*#Wk2Z3Qrbm96GkmQYY*XcD2cU7`l5k-ZSK#XD!YE~DO_Z_ zdU=4SOjyN@|9iS<=j1TA8PYiaN?b}Q>*80}4PqPw3Gc^OestKFRJFRZj-hRM+d!+{ zlmeH+$Z-%suHO484U?}H$~M6r-%=9XoN&4D-yzYTt2Qr=uPSVx9S(`{D$Z_gXZ*k% zSIz9S`zfZhsuBLuH#PDcM3$D$Mq!YF5M4b0b%ZP)Ola?SoC6Y<@u9MBtvo)|qxtiD zpuK0Q+4qHD(d!ltjm~p6;|6Idr`YTb z#!HlUt|jX5r8vVhLYW-lK(3m(%pckvgy+PMMfdhsv|@9K`dLhbXWG3Nk!ye2_N{=s ztWBPH1;)rQGdcKGRaTSgiTE#w}xF?FMANMw-g9p@DOgm4ZJCR;T9Z%yP=LKMG~K ztb&wwlN*|x-w$|<(`vDlr3dOGid=g%jZp$ny>LX9dbo;QdJdF?iRz0_iK8V z7?vvxdtvq0(rjgP)X9l0!JrnzP{gx^dlTDCd<4GC^x@c3k*M4#p4ApXeP&vEQx_&A zGj+(svk>wQP0ZBn+LeqEQyEaKiZY<&c(-&McELTfB(}* z*HJj;pY7_`{PDMqIGnmnPa3K0I3vDvenW0sso@DpdDV2K!O?C|+GqfLb(~9*%Xz*j zK9u*+4uc1w)GeZYt~m_%oCV?!jhl0EH57h8On zkx^={2-!dy!ztg&F%4vi7oT7?+9aahoo6Oz@^E*Qqxxq&5px3 z!Qh^J7=$Y@+Y)9p)4WgYeuXzAGNAAMbyU~3Cal8%$@vzb)qbt_v3{OBi)m%kB-6PN2={R`rS%W$3(a)iN!F9O%pXM+iVt4wAK6X(7Y%BWB3{+ z$SB%r@Fv~gQcr%g%zoB2hEuNUd6{tg2ZnERYS68*B}ndw(F^e=t#iKo^NeYf_vWDX z;4hwzEsSSPWsEo@6{T($;-O@<&9h`Fypbp9EzyC=;6oDvb2|Z1dm8aM9BQsZxT0RJ z`97$@D7=p?nrQzJsih0hn)W^+(~il{zESBhkQp`V#r5j;>ND=cn428$&)iyG%$!l2F$JV5nL(acL4quS6Q>+;(JHWasc5jtkvP-n?FM zX(KmAK(&`M$N*$|8yC`Qu4K4`59yIg(AxAGQ!HizA?V}040j|Cfif-m0d|o}(A*VQOY@-&wyNU8970vs zT+4?g*U@Dt1~~MPuyNMYnbM8uvLp3V=5XOnJ}Yx)lK9t;Hw~dF*wjuhsrfj_1$E4qsbviOZtMHuMrweWH}N_*sr$VbNg!<) zg0TNsP*6dy^X-8{f1&0YCSXleL3)~2no1Z7S4W%r_Jk1C##Q_GMm;?cdix{ggzR7S zB@23xzI(&w`^3gS`YNc($MeSDuiVa$F_tPLlYv?o|M8eAt`JHm z9wc~UrfGwv20_GDM}gPg!7il7Tl4I}SsQ^Ls35|o>vNxlK-SGa%yvPGA5C9Ds#NS3 z=wr$#Lg>67oi7_QrLhWCI{ju{8uSh;HH`C~bInBUXP|h2Se3E6;Soh@@tdmQ{J*#X zf!T{0EwdJ)_x42~WS{X%{$4ShJ-J-nXAfk3myYQ(OwY)_x4TaQ!uaed)>PFlkn$7r zb#>kwQk8DR)=T&rsb3c?17r&Kt5>%DK!d6_k&Fb=nbEl<%#ATE1v**AXkk!Y8aV4F zMjU!a6VPP?;ihO;s%+N+-Tz)>9|EWPNa3Bcuv=~`2@DZ@t`+rF>N8)RaaCDd4f$^# zVXdV(&HGd*^Mr0sRJ62SkCZEVTu^%57sp<><_cZ`3I&MdIH<&~uD|_>Xy-N;d&aX@ zfaqGV9t)%6b#;j97Dl|EHj4y8k5}x%bHtZ&^jFNm;}XF@5g5^6VK9zw(~rio0U|y| zo>2uhEYHZ2Qu7zS4omb{Ly6Z<=uB<@#Vv9Y-d=Og2q>H zYNiYw(`4sPs3A6<1-rXTq_?=`QJ#(Qu5emYyw2wy^&r+$bfPIF{ovKz!tKqU<0eG( zn3pAQ+7_)WrG^q_WE>I{e-sdI1=!12;V?&624DHx?Rdyy zX=LcveWk}<9yb<@_$L_+D_LnG;?*t6mREytc^xm`#NH99so&QG?tP+4s2R{=LZs$tuYg7dw(OCJbKqWIl_F5~k}b zjFw+Ajd0(dc{~~t85RHBoL8~<3`MO%=#RzKHBSc6wc9<;)%PnRA&|nuk8c@si%f%~fGi#TJ(MvnKeBVmN63nQ5QOZZu^?t(J zH~RbyZeUX{tQ%1Gc=k+F0L>MZAIdkK{}BHJTB6)L;7B;qSnudCugvp*t^4Mq4YBXF z27_SBqq4cObwdp(O<}ecRpieBB<`~bjNaN{)?8!8Yb1=%Y_DO3!}Bq? zN8TA!hE^3?JFCB57T-d$_H}%|fP3;NR++MLC^wy8P}c;r4;ZirY(k_=cEj*fgRDCP zG^n@!!V59T@|z}LL#h}w+bDr_wW&6J#~?xw@N5!X6M8F6>`e2v2*dT+ks`N(e)=4P zi$=S95bd=WotMMqxa10$q`uB+?cPeg!><%6+&oveUK#2@W&xtbLF zsrYgl;w_}`;F{42-zESBTn)^D-XySj?|cob_~zz9d?CP$1s+**%2mSzMv+SlY&6R4 z@>sI(@Hs9Iu@Vo<%~<^X)Oru>+a7tq@FJ;5>vYcUWKKtLmh-|g>@+YtL-DK60g}(4 zmnI4-#(P+s?yFzTOhc3s%Wl==9|>^Tm@QcJ`F&KRd?zh521@K{@8CNs-|3`j#%}93 zE2xWFDv|hN=*(}@;}e4hnQDBmQS1A8ZYgow^swEKu*iA(1@BK!SCo-sra@ppmMH{9 z@BUvKPJJkDo-zlE=F~C>ZThnQ+mV|yta&+&YNxr7wC=V~oEd~zx8t?qeKz2^|KVTu zNn-v}zF&;km~_e(Yfy7hkScI>Cs#;$9*j^C*#22*AHKyx&zav@RNY-fI7U#dXPw5W zXLv9is?hh|C4XJS4uPF1gu8vg5J_roA@vkP)L?BU*((;Ga*}TU`5ob!8`5Gh;9t@i z^Y6FUJ+?D@t2ZL%$e9&-PD%VBSm9!k`mcp)FO8 zPf1(>AX21t`{S1S4QAMw0(%h1Tz?{PWU7DrR?mj**@aH1;QA^*^`~gv@es6qT_6e$a-Ps{pJdSbGk58Jj zt@^%F{8pfBqwL*jnSxVF*~+?8W|hP2!ENI9g0#_EO~afd9&r`Srq;*s_?O+mlklaE zjw^&dHqRE!=T0w4Gu7`8fuRG2@wayU_+kgj>qW+J_ea+#vaV~_n8zmZwAHo!Nr0yE zP*#qaR8{veVD?+6g~};;w+U9+Tp#Lrcvlb;GamQDfc&j!@Z0>B@cwP_Zf~hSY|pX6 z@oE(d+i#*Q7*_;9S16O4BbCNI9~sb0LK^5o;u$HRi0heBA@{CQ^--T75Hhiq%sP+G zq)~bmoTlB>RSl);!@R4RhZL&04~D~!htnYROiKjb{4dND99R)@+>`N@#Ek!A*aBdRrHi&|0VJnxZN@Ck*$87ND%y@CIg&M*l9JzdJ;<^G zuPs%jhNc=yM)ie<&6ke_%+~=|JdJ6O-h}}_FSCvGZ>^pMDJnzDA}ms{>3OqkIoYKgX|l zfh(r@$I;kzkxe~NC=J+m0?`mr-yj_fDdJzN!9D+PD2WNS%PxROu3(1(Aa;4;LC;+9 zODAf73dkxB{J{p*rLXR3B4!`#1`}OlPan@4&5X|c+kY^x!Yf}CrmRvX&uT;E~fe*p!2QT`x*1^ zew^kohmNwvi;cvXoDX0bk{4*eGf#UFy0I+BBN39jKg2}exY=vSh4Kfkq@-FsYIVx) zv)z@C%hlY$os3Xbdf?sq1-qvl2^js6Q2UH2Svg*TRO6%VpM!63s6+myXw3p)kQ!D( zhq*8>u|fRHy5A_&Xj|FC;z|AB!(FXNVU_8-+EL2U?3YIp8#;PEgv{W*q`rH$yoc~E z2_c>D8WG(VK1tuJ5zuSW+=@BrrHau3u_d$n-|P;)k^bT0^U57~>Cdc+x-E12w0-qv z7irX`zkk==XKRY^yMso82c6powQ4KvOZR;`*5aZRKk$9}xY?3Nktw&eCM_i*EY+WN z(gqVLxVaE;^X!>II>!8TE`9gkZUh}XaY(K?6|fEO`)FI$e0qB! z2Ik$?pdZSz0rvuqRS9!6OG-=3m~o#D(KyhtK_(|1ab=%abOCqxpO$r3b?E~4yW7%= zzK97qjs=u`RGg1TaL=oIRHLO0g~wKQgnl(vzEP~Qo-Z{^2?AsWlr9Y_+D|Z6PP5{5 ziQ#BI*EF$>Uc7?Wejms`yBnId^a@#_;TBAW=kjik%!>-9#TE!i-4^@HD1D8KfK|K% z=QCT5WTRFxz?ARV$&fpHq?9T;xBdc!k|;9jo4bSNh<@;XP1CMCaXO5PR%Kw3qIpb( zJ|8wk`nA;7cIH#IPHH!TpygPXpN^!;W8xBmNov0et8d-#>6Oh}Gce z26Q^U1Vnri*o9ygV4LM!5ZujLV$%a=z6_G7!j%p zC}1~Luxw{MG!`W}fCz5cX;nwmhrCq$&@(y?s8iv@QcOpF<$i}-sG2&;b=*JQBfZ4^ zy79?zi#JQkHmCClwgxybSI0RFwz5fE(yc4O;NI*zyhhR4xWmr-7Kg24k5=khAHOQW zPCm{@=qS;*El875ao*~-;I^)%nz4}omw9kNhWArm|3$?_jOr${TywR3<{1MA=~c}J` zuoaW?32_3YW{KJk65BwNABjsk{HFPKe7E<7m8TFY%GzDRQax!2&rwScvux6cGm7Qz z?-aMb^(Xn&U%@@JiEIj-_xv<6_Tkwq8zP)Le!{{e2X3h%!lp3}l>UDK>Jy zRW&s3s9=1Iq9+k2#PCBeTKwnzMO{r*TeTAqM_tWL-LVlB-Z!=ohV2LM*RinEj2=pD zgU?JLk2T<8?hi!RmU`{82^QrK`6fS8U9h7@k54>TzF%6vduGt~ku(dc*83zikjBPv zf{?B&GOz4<$X8>&Fe{9Z0T-x9P4q}fJ9|pN7&=LAfcu>`F<<c09 zz*H3Jh{h>HuOPyWgiH3T>%nK=^itdRpmysaS01!?8)V1M8iw!M2);QSpLutrA=i%5 z$6P-p1Fxr3^%yR#Ewkrr10b(D=ez=vhZN9mPfmP0P2!lWNEXZ@*FHCYJr}M^y%l(= z=}mzel#)lgcBt&DG$7d+q;qWgz& zN9CEd2MCy?FriBrf~xE49jZEG*aesrw0LP-bF$9#1zM%t`w|lq7W3-UHaaOdCI;rB zq)vYU4zW1h9+_2g3)XdsJGe(8Nwdu`0pIB7*A&B~YKxXY&AB$3HT+)InCy}oH>%uq zbVp`?wXmlNZU8B4NjE$Au-0e>f8!`|_l-6@R;c!SJ#i=Kld|+O)nCe`&?5@QPi=p; zlf1GdcW8s}d><}0X4oudslaKo`}GN2sn4N`n-8v#WD@e`juAE)bSeb0+op8RcyOwvJC~MqEQUV^O zFM47M4}Cx8Bdt_X5IGHXC67!+PEXMB0EKbvs)D4Ni*4-bm7Wrhr-VN3=oGq7O_AbO z>F_NN+#a<2IzuIv)V)wes2mcsYViMnrjzo(Jc0dGhW2kc29GazGB87Y4=jY%NX&Hr zH&A|Peg*5@Nt0uOlR(4gXp^i^{Zis&N}1$~B-G3!%e}EtJu61AEosNp$@G<}C7djN z*YH$PB&0zH^o0FG0$F_Odov8^->AqIbVYWrsyE+umpv5g2X+k|*Aw@cSZcE)$e@79 zZmb-!)}mEDEu4B!0WJ|M-!wqglPY5|Nna0RU98C*z#tPDZT@98@NRr8#~zV0pY!eh z-r0D`wJ(OFw%NkY)4xytt;Atp@{2+aq{W+z&8RDSV@oB`V&|qA=-{l0`ooUWqYiO@ zcb7SlaF5wc-PHzXiHy=5J3QYe3hyMb)m^J46%{sEXj@$X#2vkbj(@yw6C(HOy33}> z@v7`dQbMv|K`3;0Tsj0_6M}abe#Fdpfws4NWrjO21fZ(9;Wc-ji>09b!n{Qs=(TQO z@S6y?_?2c_131<12?U(@hnZF^U8`$lq zUMp&Vsp95@lo9KFa%(kma#U)qjbry4gqL;1Qm{O?A>!j`G(nJ zBwbw~@wgHUQFclprS6s{8hiS>0b>nXGn;V>8kSkVM$r!UmuagHdRGv2P0|=6X~;|< zP#`2d)x(GRJ`>K00#z_UbO z=8EnAaK*yX%BQzYhy^rt4bz#^e;=J^z?KXmg=)M{<8B5=_S2ZI{zT3m{>OZd&Kx$< z1PNs0j9AFqA|F%UeMPbCiTrib5tjjRFd-its6)!0$`zmg>Uc$fd(+f2Lf=8hQCxS; z4R>aX$&7&VC62Z|sE${6Wxf#}iqZq;$3`KpP4;%Qax#gIK<~m5+K=W_vao}D^B~ZR z9Z2(W#>|0W2sKyI7-Wr_hWxOQEVyN%GBpAz;uxw@_;au)wk7hJD*J5Kv3MR~R?=dn$X7v>!|O zjV%ERc^0}cHpA7j#E!B<1mtaAfza7Qa(}gF|L+yl+-z_@zlAWp3<`V%g0rFQYmFGO zX$`Zt4o~*W>2Qcj{$K2wA;g+cB01xz9USIs;D{5e)#)(-PUWTkk&J2qL98hv`ftb; zJlC}jSu*K#`mm|90zS*(r@P^&REk&l;nW%F4x#YnP9J?^K2H)xhY5Gxf9>v$iBOAH zBjbU9Zt-E=4NgodA!L4IS647}>$bXXT6HcN!)(cu-&3#?BY16>GK(7P^31{x8|iNb z^_NJ6@9u5aqN6}GzXlWRsF=q3`%rtwfFmm%D4m0+-K=>+FX!ZTYOQ#JuXpJr(T`}z z$JzvjK0O5S`WJjgobVMYyCPkc@g_zV$GmyQGk~ zq}pqvuCnlXMT+Od_tb)C_cZYRxsY3rCZNtUXfOF(kJSQ`wZ#LR#=aqfn)rxfN^gdY!bfe;JCRY zToz=#Nj&&L*l!GnsThx;;fJtaKkD=SjgisCyQzR<&wikB{g1f!MiA~=Dzj8i2(qK@ zkmh%KT+XM>76d*FE_Nj2+L;elDzEijRtH1D_PJ)PICs2sDK4=bR{ zu7|D=t`V0P*bCm{OpjCsU4s2zFL>5~+>gLp2=9?dW6FvTVLKb7SfE;SP>&z`B3lt| zf*acO9R4lNNR*6qp+^?p&ENnqWTo8IDj$-9o!InAa~Hh4Kc=Ku{bOnVp;#CVtrRxt zj2L4G4Q4F!@kG5{mj$m6YZn;Helul~o;xd$@6|9_m2q^MLX*KT&ot&rQ;=qBY-DUxeRh`HO` zua)Dt6}j7{lqL83Wf+OY+~>O4hGCeQ+stkD+xPd^{@?BWdB0xI=i}imJ+8B~go@Zj zVJ|10+TJGceB_)bPg;^)4kZPsai5G`_l~+ubV9+Fgz|cS;E-Z?21ru?5nXhAWjwc$h*#Ia{VX>xvY|W(Hr3}g;9>t4^IH^Dq_M;yF}Wl zkRi*pSxF`CAzzQz16vQ(b7hKea0A)Nk|PFM(7Y3TYugWyC&zvH{urJohE2`b)ef|W zL3kagWv2^my&3iSiaE6PKE~8Rrv1P)Ni#uN_-3?3{Sb&QMhD}Owf=e6BR-F;;K)9% zL=5Do@!_XPJn`)s`ZS<$F>Z2^!;f{sdH`FCDj_?3+FBeDFl10wGA^%VI!r5ly z&%vZ?Uevk{0G?UMDblqppIHPG^32Mz?~Jof+I(?G{a74zT!zhdRFe7??X=u3;)&EifjF*5>o+Z1fPOtOKhPsbIq-?Qf@! z@nL9sG@U)R%<@C|D@LL}inWs^zWf^_OG}-*#d5yI6eI_{a&2#hA33i5dD<@7$Tgfk zTEYXcup3FSpv|up$C5z0lD7qtjMS2?RSOQPeWK-dzseDKO=&OSfMa&kK<&uY1(1re zV>V|RydMh#@1%l*u9~a7kH7-SJ{obAD({-%AjHC{CNJLgv$~NKXwv$`8Q$mA0{CvR z+O@^ksx9wI4t)I9H60^(H--DzNOpp=RCchmVii7TmEQJA(6BQ8eQSJ-yZz(oskc=0 zP|4_zL?*B1;g}~-?FlQ}r3K-^5#x{SAKZ`;Fp^zjtJC*NQC89~&*so%3@UR2ted>x z@f#HWchr^5#HvO8kuiv0Bz$eYrP>tFV?mRX#8qFfsSnjCLFKCW+O`B6|5gr!9a*V; zG^tgcb#sm+G0RT+G>;q&Np0`gG`AkSBlF-Fk{D`0zlB#m*7e~ z$;mrlc1BSDJ|StbdVX&{V?IYDw*ZXV$7kkv=O6-r3GD0UV0WE2y2b18Z*2!+CjbpF zFN(%TPAKc(ORh$r1-EoJMa>qm5kTTC$UFa7SnPIU!|FO*Xsffon7L#%_UT@9kKZ=^ z8L+Pq#>2Z=+vow)ChD!N%&D#)+TZm+2FG>^f(x2z@0qiF#-PStcQKTf{6U_AIFx~g(je4YC1FMIOjGEAq86(MftiB$eQ2# z!P#R94rQxa$D0Bop1PJ|WlVDH&IXv?7s3E0OQZn+S-#`N-nMcG|*fhCKHW z{+c3-y{_RW_tl&6qW08Uo?E*}<6Kq$w+Khrv1?y>I!}UQbxgM&q`lSf1Q}oU<+Fy5 zG@cxpd@pCaKU5%bcW8IGO&fkph%G!EpzMfPgh&Y+&N(2CQll46s^^}ZAME)D(7 zUVXv@|J!i)uOc$Upd)57TA%@XsCJw+aQ1*#f4EeiWz619nm5)WUE zv04%p)48n-{5naQzezvD^|V{uQY$z#>QZ9W^j`}rF~Ijtw7}1nVL}*PP2VyBK&9;d zggMpA5;f9+)jYY|KQWu>rnT_D_;~pyr%REkxfGP;h3s^4FCDa{aulOwH(53irPeDx zYFC18rWY`tbbj0+1nM4n74mPmPvm5hIC+8xhEcXE#vS=nuiCD-D$AI`JAY25Enm18 zIV~i)$!SwaB}JDeKqd?&sf#UZeY(5qpVW?!%LU%AtvVdwA|~`@%M&(W8@Mk8;JR)t z1b(me&qjDBv#V`nj{kUJip%RyWr-rR!SQmC{WX>FgZfdgC z6--{T+qWO7@jXGVs;yZ(>zpwb7T!l2E)YQ$ zjQ!_g8oSk-hp+QS26`VYFyRbTFLnq=A@;nwa<^>G%PlRp_WywuwIFwkr%$VzE#{Qk zi7(c6YqLC`_btKbhcIBHx23bIeDYqTwzvB$jzJX6;rVBF`cgFfs7gj4z@zAw+;- zGyU=D99-saXZyBhjA`m*+MRNT2U|L#uE#{=lBLE9U>gk<~H_ zYfHU%azL<9|DKgBaXCxb;DCa?KVjmTUYV;oWd+dl5#G@s#STwQpSl6xb_abgZpr_! zKa7Oo!!#3&dtF{tl2yKFDBTI|bK)^aDMY0BrW{ZPFFC(O4v z$hKA;A0^`ID4c+ODAgu=-J3YbgKai-Q0m)Ci(=cf#uaeux?@g82ET&cc@7W#I_ z^Lp!T{i5(ZPuEn8_NHG{2sHP~zbXBK!sA!(QpVlfCce;k!Ws81w$uK0GI!gWjXXEg zYCd%t_8(umkeKf6x~beL^CU!eYeqca$a=AhzWZ>R#Fdi0aZY-Z8{MCF4;uBoXAE<| zvg#DnNIw2)3VZi5^zmaa;XJFu@v1H;a(WE(9nI?(IH@~bYu*{3xX7Lz3_U^doBfOx_ud~uL`S^x9QV4u5e z2=UZtm&7MZ+exZH(BJIzMX{e6B~iGxkJY8+`xnD-mehp<=B`4}7Q299G@&~Xl)&HL1rn?Qv)yU|IYFp`jCA?I zSMtDncpKdi$tHHn=8)ljJs#mw(tpnA=q~U%`1|{WQ z0q#ExKu6<;Ln1xSUP9&Yo}+?ot!vObrIIC5Ft~=t;ZIUp2u+j zS~9I?3$PhIai-L!5*u7YJL)Ow*2P?Ji->QLFqL8&C!6d~)R%SM#yfQYX~Pv)UFx<2 zo`)wVnrTg|cYWcJ!m*xRvgo#zxfeyW~nJR zEE-jF$z~5+XY$YVOj>%Z#H^%RK8B{>3ZK1cK7Q@S`TS1j?Ah8U%TV<4b*!re4_pqINJy! zNH{+mu3_d`HiuXwhnb;wLz2tVg`sx`6)Y{Nj#W)+U<3E{TJ_=e7A%-i@ya|e*%z;+ zT}I6do>O!P8m>(jpEs6@(`@ns-%rx$9yH_epui!g-)Hg|3dINJQ|*0?h@Q;!@O1QT z%QnIG2u>L{fIUeAu~%~{Pn~m<&m3s{9Tu|T*?J9l>(r|2_G&D+2{Q}y|EqE)HxIef zyIRgu~Sixd0_1e*JPKNEEmDm8Z?Ns$`r z3*2~k2x!6co*UT+i1iS%L_u~Sh^NdOUEMM_$Guj5WLkb_<1a|5LAd(o53({QtiVdr znBv0m+BPL1s&;L%a$vVUC}y3X`1DJn$E)S6`{DQPz2zNO?BZlGQ`3&`S)Vo4t0_4!nUDWVzvd}Mtv#63FL}VpBPR~t$hQ0YJ*#Q-BAz6Z}=}#!2yf*^-!68;q zYYUr3UWU7frl>Q_@+Vy5Sjq_3uMITwJwTA=vVhz@-d*&ZpS4Q+=7OeqK$&;WF5_q^ zI)H1&xyiBr;hu9cli>eLxroVYW?(RN#lHF$Ef&>?q2jYRxujH%D#_!e(fNNrlMcsY-Qy9%Ogq z-zy+b0^7PrJdIwUU?pK#L0XfAmsGbtJBeUuItBIt-QOTdCt%N zBz}dk-hZ{F8LK}i2`KtSB>a+C?rd}aM(w8>YDOA#YU=sQ6kize71>Y*==RkKk8-1Q zNBI_0pZVwUA zZS&A6nth3(4Z!IKUCZn7%CltnK6Gg+G%KOrpiGJNLRfW!RNYMsNU2RexZw$nym{D^ z+jWC}^Nubqhezxc&Laf6O}xz?52y>(Tct9HmnjY8=hm7jjK{Y)3~31VtJ?$Fq!V9D z_iGd68Q%paxlv~v_sgZw)ywN>pqvV~uIo#3EKMBqa0Go8vqI}G6QQ5tOC_z15Zij7WjC?dH zq3yo&il*G({OHG5hzPwVGUgI=Hk)lK$371^{8F{ntd0zLJlPLGe^fICEC!LAdDmBA>7aM4k8)eN4x$?jij0`@>Z#l`=L>sq$pC;aftxW0=+6IF&L&Y9X zgy;20Uv`!L)Hd9H=@fwhM}7I6AI<}S>;2{2OiW&pj3EwDOLu%K&nWCLb>Ve%k6d(d zDL$w%w-7FIpsd(P7U?fw4zGAp4>%o8Uz4#Z>*Su5^CuiM zrzlH=kF5^#v4i?0fSJ&Sce)uMY zg8M2fDWA4Gyr{pkL_N_I+;`}kOxF&%Xr$>~km9BJGrebr2QJQ?SY7?o%cHBh2^)oO zM$wtU3O{CK4m0wcQ*d5vWyR9wmp5DQj%=bxslN{w-)$S*38IPA!ArwVe*iNch=o_< zyYWRfj0dg&;jl0t6wCl3=Qr}O+gXdL6CunCV&8}$Kj)9YLw9|B=Wk)27GSSdBXSkR zbhrEen@kF?>*{j@Vr6=~iHqt$Na$e04weT>A~dM2Ar?FR0zn2gy8qyqP|aFu@gC9t zV+;A#w86){oJc<^;XZ1wt50!gDvyc|I{Q*vHP8l;O`F_G2hLA-ozwE1Wq=Awi~ob( zXbW>ZsG7XxWqtV5Xi(mrO&i{9RL-U$IH6536wu82Z|%p5ZRUa1LAS#M2gTh)Lb?CD z^pXB|b=+|^I>L6!RHzOh=%j4+-dVU{{_)WN^x#{I;DfbfCgMobTB6saa6oB}I( z+iSk`j9Sy+Cvou3zk)-CY+0LCCt+8+vYm4Tpd)^lHuD<#>%88@Ucl`^ma* zo*NqK%9iRUHarX(@Tg?z9iCF3Ex>-<``f0Fk=i8UctUU*?1N&mBaY zH~*`!cqu=esufOM1sN{J$_6j|2SS2&JafEQ;WJz_U^7#V*s|OR$6}PF3M%!tawrAR zTP-#>=IAukf_K?fSmJvcLuJcol-$19=cRd;D-6sv9WDvjZ3DqV%HX4U@T^4)}T;{7nqTT(j@2 zMucY<#-ci_ld#!BUs=-~84L@1=aKu{?VjY2>GnCMg_Hk`70MxT(84Jo-mFM%#bw{2 zJym=@c1y1AxMxWH2IzSnO$7xtDV!rkT#;3SU2_>A$0s_o#qcAqII55KtX-kRv}#}aAyVXgV_9ewnd9M7MtajL$<&6kd%I{ zll!mBigek>08Bk-qxLunI)tVWg2vXn6$eSkf|H9V^vOxHjY~Ula-ZJ%$$tW}_G?1F zIiN;{lmRBHV-VYOY>ECr+Od8mOddQS9c#nB2P7|G7E9%paAEQd{yA#AY-dCm7jAc^ zGgiiXqGN3#KUp@(znfRj2~I$B(myu_?4F@3= zZ+W!2EiZ7SS@ei0^8K+KC++!^&hKBa>hI0Wa5fr7Ibcv)D2aDC=`lNdvjA`ds$Wn? zvt*;jf)eV4t#l5f>n5uwFQ!LGklKVnQAQ;Z2`H?V^R{&|xVyGzF%*(fgIHU!AYK^F zDWy~|tzVPS4arEHW6hqJ(XWl!*iLTwempTBc00%36xdmbff-;}_-cuEXD8;%Qo`ZP zK)eQDu^dSiqPQJWhoxr9WE5ajzoU+?MzeD1uWeh~)17zv?Bt{Vp4#Qla?28BzLpGX zi6pC&zwjtE6GBJAF2(q6&TtHfPm0(F5a8DhEjh2WGdE1lr^np%p*`Y>?ayKZ!p3fK zG*$f%(rg=}t&&;^YkQvAA(CHVcBT}S5K*jW1m5KvwjpeJyVHz{j(nP237aJ zS~uL}eTL8YdDgmyMeC_GLDg{dl#h^s?)FJ4^0JvWemwOm(6FIOUMxFYa`o4JbKl~g zi!Zv%C6wGUXLnLaBkzn9+z@wzGmJzffR4?Tsg%+PbK8=)`QfcaCv4=7J`REkc zm21_WQYPcQB5AIxFHe%QkLs=}NCSMI!khhT`LaL~;_33A@DpH9P;z_g9J=JJTBo@8 z&cHy^T^j|!K_U>-pgu|FlnQXs;ss~&comvr9v03x@7Q`KB|Ch-_D*83&WMg$*0@e-hf;iv=}|#RLTal zDA_JO!hJ4)CYXQqMSQi8+#9sOxn3g@n1mq@x`g}KMG1nIm;I3Uki5W5-hNEPs<F?hd1F=*>W1_6lrtwB5D}ARcz@!nuh8Sgn3;j}Z_?Zez zmDA>L1f7UY_ZwT^D8+~)_n(}F`S3yCh7@NP{5?eXO}<40m5y!x1t#wpW9s|&{sM*? z`$=B&UIDPJD4*^Jj5oBC+MB__<&cl6djDrkDlcIoVj!bHp5BrZqw{Z=W6C zWOu#w*ezZ4)HSKs-&$7b*W13zUSH-?oM-x1EE)DJ=Q`Bf$``VBNg!4&YzZ63EMVHP zEis!j0(FbF2-0;7-gM4$n#}MFHZAXvv^!XuxXU!tVom=l^>dwIK@uU<`iJUW1eJUm zw&*5=mp6k$M{3Q~yCkSLe%N)DxUG!OH5Qu@oxCn^Ep&?ZEf4^weJ%eTPQ$IkmX#qh ziYSM!+|ICXy}ybrn$%fcg*R*7VK+k_)s`+1mfA(Q>91`3^^CmCw@rN4FVs%=WwnV8 z?OGG-9hRqV)*dxmUF?VrKj=7Wbx59e?3;Z+7T=M(%OVK)6x2lMT($PCbt#mwsBqZ} zXSFwgf09wTdd_7FohAscCl|Llhjj{zMw~a{nvG0|=pfwO* z=jH)}OufX{5rH93T^s!yIzOxvb?|zT_-Oeo0N3Q18w{9;ii}$G5{~b8=UF}gR~dB{ zV~hM{_rYK6Qh(w?GOp`3yD`@cIMCluTi~}l^N&Yqo=_0}MTEq@WJf5vj4i?qp$0P^ z)~3FNbuwE6uP>N)cJP}nkdtP_j@FxgO!NB$OMOK;+#|Sotr8nm^_oUpwFaYm+pDiNaZ+~N~7`lQKErkPkl$-%Z3vd;FA1#kOad6vs< z2-N2nRoMye^Fvfou71XiSK)t~J!8icJ2#{)+J7yJJViM3tGT3v6=slb9#^V968JpK z^>oPGaj(Gk6{GN3qs}IsnRfv_BZ3od8(IgQ6z%GXt;iV11p@~?Mui#D|5Mt!w*vJK zWP%jx%40=4*ZGk(|62oKaF7Yeqz$+|BZ0L->?GDk!Q9U8)&xRvxK8r)=gPUx$Y$S8U28J}#A!cxa3WVnoKaXhaY^+laQ2Iv>9F+(ln>P&%iA(y7q2z>>m zg?625bs_s@gocrD`hIO$?YgGf3fM9Jz=ryjf(Bdp%~(*8`-%ueH*f?K4qHOwkcgV% zEV6k3LQxozaB~%Se8811?ixXcqkL9>Z>;t0`G4Rk(T%rnnE(y8K6G8<8pxaA&{s-gb#SMOZY{TwZ3`F|y*&Sk(8~wg1eeW$mXS06A8%^c-|%m8^|- z;T?3m!dvZ-EIt7YW;({D4M|FO8hxMC_ok|Fmy=|ScUGtxjdIC{u8*ifAFLK9J_Sn6 z9E%i#%Ay&)?CP;1`d5ACv=Dw=quYTZGkE`-PdWZC2F=}ARPRqzbj$N%Q?B?;LYICh zYbWuV-8aX(JHpf|;>J(zbVhpxL$Zc`y!gI`!?799A0%Gu&6 z+1`e~DQ-v{pj6WvIpqEj+v;4=yU5AL0J^ISfWjDNZLjr-){VvURf=BbPZxZi0z$6P z$WKJT){+g%$3-5F2f4MFT2IVCCxfH$0&HxCTY#>{4}Uy*&|DG^-_F#ysTp9h-UU$xs3D9 zm>x;Oq;*lozv6Ps-pFn)G#fMhWCP`sr-Z8)Gtlv(&!sV5XG?jwWFM}5{u5gtpzF%K z$-H+r{fGYGOats^D=?j+EX$ua4@q8f-zwbBS70t&CR?68tuSaHZ#p? zUX399yt8)Qcf*dx7OtG(ytMa-Vs-v1E?geHNUL>PGUAfELsa?$CLm*cv@h-pK8x$- zYx_%kquaE-FLiWpvdD@gnEDDn5C|eSS}snmtboUK)`IZP(p)rY98pO23-nJL)ix`? zhqlJATr(cl+X4jHhMs^>1jH>PM}=?&i-ZZT%U)J!UpThDSP935@lL zmZhM22ii7Sc5}xiO=~jf z^>2ui^y9LA`FmNOwF)C5?UXARUNmGJ{Tc})zwUIr|kR>0GWd~wokwCfGwrC2`G9Mkvk zJ3*f0&3abga)n219zNT_J2ysx>Qm#`8YWs6aAJts?P%13H30cF@%YIkOo*KJgKR-- zTTRw&uidQhISvn|1N(oKIsX@F>r@#<MrH~cz32Y@$gO@8#I>yQrPdjbOi=EQ%}Pb%j~?=$Y5pHFjJM)x=W z{C8ddfW%a$qC~#4K1#Z+iUGTJ2^wFU(j{uwhzjM2V{K`jWdRCJbK#X9yoV0QV!v#$ z+Kwivf#AX&u=86QQI#{KDl=3e-xEf0>S!8vBQcAZ;hH0ZJG!RC$MD*<=XIPqG5TYAx6Jw$>qN@@h`a_$i7wNKyRi}%J=e%FI?w>WZVw=%j*i=lg#iPj zlthZ5F1GDVCB18~NN=~F$*1zD`fKv0ApJ#_fym|?Kjlr`Vj_2gj27WKk;?Z$1R@&s~f^PD1sj z9>$^gcvKbhWK;atxddVbu{TwG9oFcX;}g&To!w}HUDUw%I~FWbHp_290B`X_Y774( zQyx6H5CiY~tI95+$1&C=4}Lq0H_zWHo8aW|V7<^}z4gBbEy-v0$&|eiHan(i;hw6l zASBp?c=)Rsy8)ZBp^^B>FFmXUh7)t34mcs#n_GYTLnEXz?0dbM86?4?;6~e}@8WK; zGPCm`8IUjoIVm19{6X8oZF*9=XsJNt+iHnMDRE)^%LBCBRR1V-wStMt?;BNB&S|Y- zbYJsg20A9ZG&hYpy^BR#^%T`!O&qJP|Euv4G@SE+CsgOS@66PCf47Uyg+vIx7WXL= zW4PIUQd^gj$~d?r*MH<-6%IEFySDoW+)1jO=+F5GA9dD^0DHaAr*Eb|l4$ujs;a18 z^8x=orvU1y?=@*PwI92ST)SbF$4ueOtXCNazDME^{=?6(ck7-bBIi)_oOKh%N-zqh zxEdn-N}vSO2nLY1HcHVOyxWztsdJt5%aOX7wnB_+|F6>doe}Mqtd2rZa1%A6TfL^{ zRR_$58j)g`D(%zEn*qZ1y;#&G7?=*)tRh9m<2}+S3{P3>Hr}Lv?t+3Yn`u$K5L^H) z&f9x;0YDqp;_v|3!DCJ6>wdqvr~BdR2dMpzek`u#d7CEhUn^%o)ln|v_j!LloF2^s z3m%{EGlnt6wm{0i?( zOhUI{h>*&ovSQD)^9I`_sBh%U;DS)Gh6Jd;P}6#UjQB;op(t>zKt>tCM~r&FIXeq2 z2(o&Qk14{fJ&`7*cYRtgFlecB8Ud;jTr2Z0?_@0(L>N;K;0yTMBr#KHYvzGiN^wH! z9f~F2tX~}$iFS?%@3|vGk~Ap|@|+|&@aF!-0Ol9E{FVCO`KxCbRZas*BTtf%7ndz_I5U(Bb#2(cSIs*>FQ{l7&|A;!I(Xj(gM{8;WkPh+)AU)ffErl=na7J~@QMO8Zf~up^S-Uc z))nHM8z)DlNTnm0u)M#0p1>#p%}Tw}V3Pyxax*YRLU|;FQ!Zxp@qxTKkn>1_=ufFblwnw>HX;sa5#cTX z-q?i8Vz`~!wGDSkvj#l!XqU!jhNoNLzB4>IEn#$x(p@iHDbD8XCoK$kHoy$uSh9{^ zpYBz}2R;(5!_B-8I!sA?6p+T3DA72FpV77fe*^Xl@2G|F^KVUBS zmGtJXl#;@|_H60es%hxAdShSQO7rFb#PZbSbYP|GXpV8;v5d`u^87vJIo+1axn+#@ zF(?(@&Fr+#HVZ|*al-t!^^m4!*5slYuG3)PIT)av^`b>gdLMZ?^TOh3l@%QJU4sPV1TQ#PTZG0&0I&G8X`{vO+gKP z+Sz>GDFbmw+4SH@3F9<;*+;B==3B1=`r4tX_9C9W(>cvK_N&{31Yq@-u^ol_C06F5 z27d%I61HbozVv%QW&C>b+3jZoyBpg*;Lan*uX(kMF5*j_`9s}ALxYF@b^&mgs4oHv zGHMAbr^NwnlS!;NbHc?ar_j$8>m=t~S5&Wx^fNJ2T=$2dvAkc<>3;_PC}?Mn3q4EA zpK&9!;E`I%l7E1fIA4gT4>W}wTB+|B#^x=~L(>EZSC7HprPIMTm9>Y%}uccri$7N=;!mV|Ehd>5-W+2vf5?E ziFs4&<~l^L)4zOLob?&PCP(a3*=FCy6hJ~s+(f|3x9f6qd++1RCSrFHjN8ofn57-% zdb@9iSbY+5HM?8OG8o_v-d`kXx$|00M#*LHT})b8?Pm$I4zCM)HQFYXR7&kMTC;Ir z!57$K;slI#)9Y~4nl~;D$D+B%xUs@=dhODt)iqX?BoC ze&c?)d;w&{wdY&&!#g*gJP(7X*}{1mC+s#b(vi#JMrWU8)E0^r|G<~pdzl(d4xpuxNOsR82cg8BY4!Kpvy z(Gag4``xWI#}0~)7%$+5P#~cB`?u>{n*F7viFN4O7)&X zbvvGv%l<~YT`I2<-AWUp2V=cnzD#bs;XYvifKs(QH}USW#P5Cs1eDgfSjGoPrc>2W z9NiN+E)4gvsY%60p9w9LtES|aO00wd5*A%9s6lZWKAB;QuE5z=}H z6N6=aMQNSVxW5@^iW8s)G%bds4Q}q(5-LEt6J88zO>fjJzG&fC8Ijky2ktr%f$FtXUsVxES(wI_+k~C%Vq-}aJ><9h zZO1N`)75wNafT06MzjAR$s`ldcu9f3Nc{9D7jJ*?7opU~&oWVGub4e{#{XkoLT9IPKHou*iDxR3bNh^c2L{d%;*z|-%OdG7}Q z8~sDLF70E604`$cbJOM@$jGaw8u}>zDA-r)E`5<)#8tZ(LR_#z`H^vXGh;>SoJi{0 z-u2`?$5Z`Gv(2w??9!EISRy>g>|Nj`;Xu7k;>Xa3!&zs|ELUkFF7O(h+QDJN0toDf z?zO2m-&0SS+V0fJAcKze&AVa77BS(0O?>OCOQ}Z2htCH5tc#3mo+EY{EzHlB?99CZ z?^6H3B$c6UXQ%86)1#8Iz$q)kYbsXMu0WFzx(xMui^DTJn2T${j^u)%0>g) z8$NKuGhGxAiY~uv(>WLqoFaZ`?zV~PI}EiCYzGaAZ7%dN5AT|;Naf0_9WT!(2dvzi zSICzVyrg9|GqEyc&bXi*Fx{m#BSV;^|6cGvdV+94n4TbD$98JixcxEcT@ZaXbX~DC zjdCC;?U=2yRd~FQzOn2cGBZ&5O6Prx*?>8Ju^UyyAZ+1^-yG)(GD$SMyo6EFV&)G! zzb8dt0spjC7<&?GLSI5hy)fY48mrMxkSL;BxY;S9xSH(JXohNe*?ZKF5T_d%H9e+l zr`ey+s20EI?2Z}gfa0Bg^+w(Q8!Z$i~d!*Izf&vL*e0#;>%y69F0da@09@G>rYcWtw(KGbJ!pF#e4F!VL$d{%UGR zA`9Djyz@Cxz@Gf&&kN|QCwxMkL2 z$pvI?%DKwn$92sJZV5{-CY=?sS!^>c{g0!VXD&-s>{3XqZ=~OQ`mX2N>$VmDP7%QV z)wcL%f$v>$LU7kt2EdbmYgD7j$0(x>PVDdCrxUZ!94EWNn( zXHdkmbMc@#<|IMG@bBG(y{Wr7P2&~)j}Zx_5@mFD_PJodcNu{>cy6SMY|L>$#IQ1> zDP|CO=aBm`bZ%*Rul@y#hK`=uBHVK9V z`*az9vx^p<^g!lG)c#d_&slZ5L7g??1!DL6E>b5gGzVg?#7ig*SCtgOr|}xT(fwN$ zPVSC$Y~f>!C~gw4IBV4UxIjCDTx(Q&8N^Q$I!k>LbX_jjyQasiD=?$RbA0rrChBg1 zWQ98t;?igl{4)1j(wZN!_Kd~v#7bHEY{+2Idaqu&Lxp|F$$noKx!(Y7V!@qwLa6FO zknIotN@vVVg7!7i2essyuovMRlCKu$$*6y=$!H7g*g&M_z^jZh5_2YYu9y)#DT}Qx ze?1YvO;sAwtgTDlQ|!G^WO$h_0BQ@5TU#Y+`@kFLjHw2DuQq-k6vo%DP(n-ghgBO* zcX{?v#l17c3nHgo2eHPZmIRs~q-Ks?>qGeF z6U~*z5un51m-l;I2$`WB$>E#%u=pEvjeoU18Mu43RP^24V!0~OL$uzTKAzCMu9bGv z3q?tLp5cd1OD*ghtSO|-gfMEho;O#9%O$#3N&%%ui31e-@OsdW#-RJRA3p0$w;l_y zvU(VdLuRuc=`FAeWis460^bv_jt_dw5KEgc>t}a1(6I*rygUZ{e*#%1@Nk2M=3bwh zo+s@r2f3T;(b}hCTf|Kbm#(S67vn|8=> z+rR#l)HT)^tYqMzk#=|Zx>oZ-6_qu3&n)1yc;|BKAzRC!l-(;<%6?%_eqp3q;cwCx zJ%h8wO@}Mn{U82%N&bn;%niJ4St2!1z?8me?%LiZi-WPq{x4ahrB6N11ZLK);N$Gi zqVrx!5EIhWs=@m2`iy;B<10s>1Ae}f+wJ?LF!otsw_4nwF8EZw=3qdR1gsKfAbCXT z@)d(#Dc4Dv-vfL^@Krrh9k!R*Erd+Fi3788m6&e`)n1t4n$W?mH zvdZS;=g$938g;RiH_Gwc(qwsxFa6!9zZBZ3t-(zYuZ134X#_lVI< ze`fX29rxej%zB#B0%&?Tv!jvOagpkHp^l>R;+)Zp@SBs;dgShyIlkOHnASV(x6}O~ za{Pjlnt#O~lW!$Yb7I$~9F=)(3>8HI+ zjsCQ~tsV4wojbaov8(e7xF%$)%dLskZ$8e zX!#Z9`^Zkh3)eAb%`T?MVb@-CY$?Kxq#4RNg;ZVS*65DuW~}N)yKhDq#dPCOlG8@= z56U{4=U}_)VKnw|2K6vkd7<;=9myN-yh=y7ml2sCw_=Py3qL7^3_E?|bDBx(2eqQ4 z4fW~>k=Pl(-y#58VIEfFT5(2R$nE$i-ZP$2F*wlcD0jq9)6Ri`5KY%j=ImjK3($So zZ{qAz*bKj!nn_fA>LJg5;IMw2Uvz(e)yfs0qf^Hacg_38Bn+gcTXJF=O`nZVPb_N3 zbzK=m3r*L+)Ycc{3Iue4ig#jUfG0M>AO0FCG*8}sRY|{_NDM*8fJNoSDSP{+eBtR| z6~OQpZtJm{*&d9{Ny&P2!p^LZdb&c2vcOckc7mdFQw(11^?~-<-Af&u?QltUw+n7q zWy-yB9hCaP%-6VlRhY{umDqNkxCcu>18$|3HYgK(*8i$G$r3(3{TLE9{Ake=`1^O? zAtc{Y-@1(0LbPObj=Y9)kCy9{-M~Pre=Vfk-usX%tL>4G)Fi>u@?%0OBUn-`A(or_ z7iveSE^QT9GKA52Qth30=aDIXtQw%h;`bteOt|DDj@9C=9XmkOHLsw${ScE)n#@D{ zf2*4fH8}^T_bl07yAuasJ!t?$NnmQo0w7w@p@VOZ*Z6^)Ye)qX`Ee3HQ9&*{75eP) z3Z`tnC>k^8LIM}(|u+yO$?xSVM zn0gcy5YZ^6VLv&s(Pd^f2CX*<|2u}Nln@)+4Cv($w)e)6UmGi( zQ_9?JKvDBQaR3{5n|3Zr%fV~Q>74w5^`70<}l2mHpiTe4RdDL=ComB`|b06Jbr(|`|*BV zuh(^5&l3beg0DJa(Y*__2pa+(;3PlL0#gGIWrm~P#hC93EO1yy<@4l|D;i6joW9Lv z_q}ZxQqCV?I`^?<%u%ELcd@KK}Q@zPROhh(W`cu738w13&`F<$Wv=-+EN3Cq+R!d`5leR4tK(*qstP^F>Nh+Ji zHL$g#mRA3&i7cMl-mq1VXYuv3}eeN3U-rVq+_Wc&@pE5)K zgV635FidC4pG?lpT4?r)o_su+{pj(^jpc%h_%Pu-xJ}NrD@~1mcsl!m)VTcvi5GSW zsZ8a*AqRJ4zj(ZDcOF0bPtIuQM$T zlt!o{T43N=!)GV=1+JmbxJ~WIO%dyZQ7s0kqxBzqI+;uxN=Y&0%=g-Qp1Mtdd>5$sk5~ ztTV^8m``f?g6BDf1x{4wGhrg8Jo&33bDg>df2vL{a)#MKuJ7nl5ChjZnJ}>qEA(cX z)*b)zb-*E@8ROps8G{Cw`|Y>o^xU?!{t3YN6gNv<+MZL1#e9`Kw;T3gX|i=Sh|Idf z)g6PJH@YZx#&rF>*|it#oo|d<2Xj@zr6d(IxQMnYX1Q%hORM;KF^gXjBU-s9d|E|Z zX6aITxE4a<{prasu(b1zK@O4+rZ&}?hxS$&X*(~DrIH#&b2=)HXNeKg^wc~oEw1xx zU<0icA~E`Q{q_q7Nxs|d38@M{ETXy_Xel}ECjq8EY8U(dls6Q5stDYJqk`Lpw3oQp zv*}Ce8=>FYA%`C!po||mZui+5fr~#wXpU!Fi!1;V-yPCX6pf6k;~{T<2vH!AER}*B zXY%h-UKbYc@Ow1R>f1d*9FS}<;NV#drl;m4VE|_D5@tu*uhU}4nQ+CIAA}ni`ayNn zFZe}0HU6>2dHXaCx?YMRGtQrZTUFX9#qD!cYdoO;aZedarsVuUq z;A)WvagEvE0UiNoZlX0)y(X<)3vVdhut(P!6FN%B)!bH{-}9V9(O{6{hHXfXM866pA?Tf;hg zwlevH?6=6EImRD8C!fiwhEYEt9fr>2wG~5w6WLu>p_VL4ykKY!ljNDwAta5OFf%p> zr61=I5K-D(L!TuwvGsGsly6CNx4@O9qa?Fpx`+K}URshojjtOh4l?B<;S3J?H4nF@ z&N1nXpED8kL#kJa+NOa)I!{SujJh8QCm6^jk#N63zPN0kf&K_y!!tBjZ>AB4i1k}_ zRQ4dPET~6@cO3{${R}GfE%N#P0hND1v3lp|&^`;@$yHdn#S8I z<+!UDi^{FfD1byseAOqvxn;eq=bJbC;rH;J_Hz}Cs%x!hXsNf9=RnEbxcABN+<5(v zFV>YWxRxNp`?u?j{z+}>JOnt3!}a%1|Aa>*IR-U#x*E>783s8MR@F;S;v-^*4p#dV z|9N39)%`#Ln)X*=&_Z`Yr>K*K?X(Qp;Y5$r`n96)mDvZMU!UvQTxuxF4)`cMa>N-j zVRZinM#IsbaOXjU+M?gW*tAM~NPA<@yISDHW#?g9nUBAeKanU!q9m`Lm=`Wn0nTU>ogtV ztqdZ3(&b~OPc`bcmERAmMVXZPAMM!G_t87xAA_PwE0LR>fK-BkV9OF{@Jk+NB<1*D zlqEOnM0rxCqA5&N6}O}ZErLG+D>wRX+~X zlttDwPU)hrJWjt@72Ht%%+1>(187OM@BrOG(&8yr^IEr(chsif`R2HvK}YP)KevGcU>augC1tM4DwULKDRaN=Y$yiChKQuT2-AEJe!)peZhJG2RK>!Sw+49<_1^-L&kVccAqeqeVr0B!=bzg z#mm8;l9X)R?HJunKN1(?r40A~@{snsEK*H6H)dcIV7MV?SM!}I?AdL_MX^>kwq{z} zB}^rsTgc5-bQx8Q2aasb>P-d>_TeHkKt=&mOOyzk5SeS;RU>FC(Ki#{jf)kSY<)l3 zSJt^~+$-8k>Fy)+F@)XJ8;Nxts%q1-du!kx>vwD5jm5(*s7%(F(INHA8AW*;8#Lpg z0SRl!*Gx7L=Vyd$6X3ia1n0?}w!8Ec_Y=8wk!foSO+*K|Yf)$&C8M~Wz+Q>)?MHTV z;7wbFY9CvKxBdl(sSo^75oUS(?IN=@@}d{rDdZH{hR|c<>|LMY{SL+r#cvTnK6#}l zo1vcNYndq{5o8e?N`3s_PP8+Zn8UgzJ?$$gsOS(M4+jLg5?q>?PDo{YNeEJi72_A` zz(b)}dC+s|DbT{L9dh_qy;IS2k=7b=%&kdcfQ_Y^e`_n`Qg1ES zeJY&$GphLaeV~+ju~8}`idlt=H$hh|ZeUkz@L^@l&J*-fs|8g@qfu!6WDRr@+BDdi zr?47JIh9Ny)%Yh+-_J}HVjX=sIiBk|&HIzE3I+HY7^NwhvR?n?q-h;v#X{#IlWv`~ z6TAAbmX-S-UnA%t<5gdr_qyF7CAx{iWwrH-t_-Etw<#=M4JXP?kT~f$i=u2C5!%X^ z(*Su;I{SR(hnl=2r++Id(KvE_OCn3bK2|*Xa-~fce*U znc3{!o8(g#W;Ou0bm%~P8rZ7NvkEw!_1$(_90M?)>U^Yp^CRSv!f>eCR3Y)_n5Ow+ zxQtxmTGqVpPze!Ks)livDAa_yA8%^7E@g=)Kl>V1bi0OhEH zKzG_*XQ}iqWmnW$pd7A*O9S3Dh937Tk`h7dd?3dC-m09`$PA4Zsn2p!^#hNMX2tc3 zp`PKAyhl6+vPAE48xnYj5>e^u_&Z~~Z*y6ff$ zp_?ss1+`{=CPu$`xHKap{Vm~Q4VRz*`pzvZ+z2u0?-oD4Ue;3&@6uT;qXx=h@vA3+ zPZX+C>P`Hf27pAMvKf@-{&bW&`&E5(K#=2Vg8-XWq9zMc+86y80&yF)Y1I!SY!~z? zKAwV1L(9y_?yugk%s`h>jh`{I0#okYhXVO5CZ9txjU1b~IyuMDo#x=Q z7;Bk=U{l;&Yl>d7yR4tZfm1guhJuCWtgLPSYCx4xHv{xbOC%|k;u-OlJrCteg|^BA zk+Dk;(JR~zwqqOXG^FrbSmO|NX(fs_QaJ=b6Tt35jo#lM;6a^lXxhJSm}|J~2bc18fjd`e*Jkd-1Gx2R_~K>$pQZ|(JNK0qR!imS@-x$VfXw-El9jT8PsNYDX**XwBOsDZ31ZX-u2m;54q8TgXCJu-c-L zcXVh=F0tS&ooA=B5Oe{BHl+J69pBGy#H$pH;2#+s-vQ(6pLD`?W_VLpcpkSF$K~^C z{nkTS`4erP4gD26W124)JVtD`eqYh?HMui4T=Gr!^`GpWV-UVEn%Kqas zyxW@9U%3pH`_qrxOnCTaz{uNvO z$XzcESZa{j_i9r3LRYAGyYa0`@R?h}~u6-jJz@euzO;pg6u0 z=}ntonkk^H;D!y;J5lhnl@%nE^Y-sqPKn540UW zsZtse$+yojk5|qDi7M9auy&ZJ290K@L>QOr3h9B=J-S`I@xjj;NJW(>PhrM_#eCVH)i?QWgQv~17AJ_=r`4$oPyl7BYyL+EVTufidTP6{J_6B1GDp0AP2qp0?R$! zU&_2SNiHl=@SL89i)f;O<0Bhqt%llB99e_0$H0qEWvy!wnH%hiD4EJ|hVW&t& z9yqu{jZ?(_d)<_DtBeZhdd+5rH~R6xpVN93o***wcacs)FN&)O&}r=k2W5p?_TN;6 zP3P|QS7cf_IrN3D3pW}2PTW*YJmAUEx&y!(Fk6Exp{pQLdVxPSUQ5A$$eX=8Mp%eWbD42s8=DA z+$R^G$;X<$4=_n_ziiDi z#z*bOFr=Mis8S^ zD)~L1UCdtDDylRE3WEw+m$hucf~W*Nz$7Ia3dannHD{gaz&!-=9AG25?0p=V87Ha2gVxQ$G9lvPQge z)s3LaUkOi4?!Gp485<94BgKjzgay`@?rHs%J63U2SOGK;RQWQ&hf;{IiOH&vdcUr) zFjH99@c}y@YB_r&x_Vaal6J?BOT4Bc1}Hb#`9wJ<@Lv- zc>XwLjs@X8KN->^B9^3bLHe2v09ZWDeI$J@C-R7m*aXPPLp|2OYwlX__HvsF2ocqh zhYZ%Aq5ZU57=~RDSX0hax&PugDg^%V1XBSGnD(-_eOmM-Yr|K#vehb0(^2pp+sMy( zRML@ah3+)uO$kchk<8J=i>;&Lxl*GHl7wZ4GzsHbgDUWq(d+R}rS9UAR$s)(;2K`7 zY-}{qhxGL7s+a7EmU#5{cV4sN^KMqfS{&~7gFUaE8m~3z;HWpF{<~C_Zy&aicW5tA z3F1WhO*)yW$xbV*2~o_Ak*e0^eTZ4fMkOi{v1tx~QsZ2WoH6~do+*?AwJn5Foclb} zZ9?1Kka7MwtYqa|m?g>tJ&0|^jzsRjMl6)@8SRlZmby)zL(Pf}!PZ?II@0CucJ%x^ z)Cm+B?>|}nq~Mi%%f>sIBbO7WZ|zUBzeS8xh^AZCx{uQd3aOJ?FBj4ylJJPq<_ZG` ztPj4ien9V#!=3Dg3K^)tD>L}Xp^`hC5dKEZ^SLN3>+Bx6p7dRd6@o<1Xn7m1dbcd z{=i4T4$;-PSUrpSWVZ1*LD^_+ROh*zUAYsMDVU=y)`-b1NmOF7@A zUQC~vI)y>*%IrX+nx_l_dhfJTly)a*-72*}!=lJl8GK4H3Pb`2Lp=CnyQ6aW-N`e< zFx<^VGpc}`k(TT9j7w$;)~W@FvJpN;5#p}Oy~?T>DoOBVklg)7_~!1EzW(&kN?{ZBvRyluqkMVGY%UVb{Qp`5_?ftOyHq zd#>iWN4@^Xn5!YDJ?`Gs`&5+=EC-M&c0m8?q4h5V36d)z`oL;^-h1!OUs5(?uNO%s z?{*hmrS3zngw}e-xB}=oJ>^LQrOdF#6MrP1Jjjki_^hc`tNra9s1cNk~!=r^Ow>6YM(O1!JsW?sg^sJm3DVI z!|J1DnmVaAv#>OdOw@Go$42) zeKx<>H?+Jb+bJnoQVH^X=tMw_40J{2m7J={^)POECw7cKmaEh0#C_sqsr5<5&w@mL zFkh=TV&obD&l&-QMG{Etj>v1bRl`dAu1*S&3*14`9I*QiQN%d%d|zYM;-P&+0~He#zSK?}zLM_2%&X@fntf9|=5qXKL0+ z?fDtT$tR|(w4X9Vd3yWf+~%iBUSHvv{@K%Cd%~@z!&4>87e#wcy>_NtPJW&JY14BO z^m*waHFS6DXdi9o1amWVu%d*q9U)7BsP2Mi3|U%x?|Ju&w|u!Z3MmIZdkN`jxep&Z zq8k`kgwADK=SEw6OF)`QlXz=I2gFzP>?AE}ZWbCbwCg*-7mrUjxn#{9+601fKl3HB ztPMWXeUm;UDu46=`Fp92$YreBA}YtQNC9rWC2#PI`@dH~Dfi&So0>zj;@JS{N4t>o zKi0u#?>U1a`!7(-Brvm{FeZL`mmYxlcM;oU zUey{clB0US`T8gDoRw-X4w5CKW4H7?dS1Bmq*&b|-YP3JX)@U__mT99XZCLSRfnjl z8OGsb2X*k%V#E4pv{}F@5m^xBLeoPwQ!_0>z<;J?0(teJEYO z+oV6uD!Jr&Zn}RX>$Z5nljGc@Tf;_>sQyE+PkJQnD|_dOl_M{wYI`E0 zYZFUSOnaUA*TqQiwUxk$JiVN1NzcKTC$<7!|C4`RChKCinOp6^ZcBw4eM?+P&Ad;D zd#{_rzR=HL{oIAVdX zQ=Gf(sz^p}b2yI7qmB~i-a7>1Aqi#H=jbq5Q`%5P1_byqw`;G~EAU}y@WenQDXyCl z?0Sj9gcp-~O!HI@FOiF#@`Cfx%d&MUrbA5$`e`}FAbHJe^(cyS6k_Hx(V(5qWdfs}_f!9FWLQ(k8m};Y-CY0^6I9Y^XukWU$q6Si1 z%8A+*T{c5-@arT61M%Kwx2Dp8lje1g^Q73%3d(u!YXVp)R$}6iMve0J*(qTll*f5- zQ#Dv`(DH$7JS3@}SeLcD0qKXVSc+Y&{s8OeB z-lPx%uL?YyhnzDKN@~83tn}hl_t@Ed7i(tB|L6V*QF#3uk`LVQ8ZYN5GkuFWRT5-N z2Tpm?*`<`p$SaVAf-ov4jbEO3SWNm)3yC@By{SFD41M@BKXZNbPQyZHHS+j$13@9D zIOB7zALX`NSLc(iUE`y_0ybY3VUS4-5#6B=1vG&CyLRmCu8Y z*Bq*JYi1r5QZ+%`EF)YewVX0WT-p1?c6KbHTIV%;9lV zmfBh%i93$k1Fai|Ui0%Jal`~OCL8f?QVPR}gSv<l;9FGw0A{$)-B; zJeKGKty;6y$f=$i&@vWZKo~QQP)3-leB;NZ6fsNA!|d)FGKYMF^1jP5Z8P@*P7${4 z8!+@KQA*Mu;5>s^p?oixw#84}S{`hv{-W+*o`daW;Q-kyewY2QAx=IzROl$meoDP> z`YP1pc#VX_RMXByb^*3F+z(am^iZ`apdireY-!S;R&y%`9w_DsHb>6?Dm;REut|aK z)T!6jbo+L1K7$6JG~XLd>Ety%A8f#S6Sgd+Wz~tp@co(HUk9J0((_ov&&`xpX~cuI z(6)o++=*1Wk3l$G3;@|>9%oAbd3PxV7tT`YK+fJf4ddg4Bc?gRZac_B83XzK+P zo;a}ottQrSlKDhf-(OeVve@jYWNovEn@2Zt0f8@TLP`$DH9(zL$MQsqXktIOF?mx> z(8Kjnwj#UX?%PxbSmjJDr+;a)Z8QfN2IU4z%X~Hr*ZqAD!5*&ENQEK~-Q`Qj$Z--1W?KD}g&-wn-_G4n4t$V83O3 z#0-H&J^KP~!bGF+x7i4GATd#aC#8h!&nyzyFs}$dUI-`gwjk{AnfRfupyG06~rgs67{WC+&9^P*)Eh?Q9mc zcnb2GMoKM6Gz!FB(s_`4o#&sA)AhxtsUh;ZPjX{*&(57oXjs+9b%0s}xhjLe6SV^g zJ~8FA`bCRBNJ_Z=$=eDNg5vPKpkP!VtUcIxIBLE951`@UgRJSC<25q49vjccQxBTW zZf^AiPAmLM2LRm87NmJQ?))U1-6EIeycerB9Qe@ecp?(>M$2SIxB3#Qeo^aQx}Nc4 zW;62i)Z7iHUZt%m?E%xyJ-5~uj8Uv(04A{ig-62;;4V|)%X%Qa0oo!AM`nf(oNBa; zIpPXg-)%C6jE1|$F~MfSKUACi?!lVv6%(z}=F^o|ebV^rnH92PysuY{A-}c*DTH>! z(t|gP-~&qK%4*^Lh5Zh;Lu#)drG69N7&!Yo^1{6`i9ZN1S?>ExkBx5Zuf*kaQ*!pa zS2U4)I5H$+WCP}!1VlY7MCI|j1+Q}P3h zubL#>Lwvv@`Dfici511AP@9ceO+25f@5=OVbPhSzrn|P3xWpWj=B|n+8zVNJa7`NY zk{3LafH|ox!I}FVH@%766tnsz?c|*`Wz}5EQ0Uc^QQYw3ut0SaNB-BTSecOM0w$1L zjUjx8cayTDGJ~J}7xl9k8$=`P`X~3`CQcABz6PUBkNK&~LE;%0ko>^+5W!G@YxaAo zjNdy=&+~6{Rt9kocX;HX*i(>;s?v}oirpbc*ylNgw}-EsxodTs-qKVsiF$h>9|Lik z)T74$L*EUbt9aPH>@s`d%tq*hUZ}x!J0mTEs(JRS!#)=<^O?d#joo|2owA;UgNx^` z@TOVMY-97GU691<>5^Sx?|QyaPjr@}fv(<>m^<1$6{JNF@EJK!X{zLz?`5W> z-&)O;DgvY0+KvG%FU)1c-;e^_95v3nB%(BD=?u|pcLsclY>U>q#($~QcV0}4>67P{ z49)>*^DP86e(#WTCrf?%0w3-bpB!>)8{bjGIo(?=-BY!SR&A18Jh_WJ)tbOneGka? z4*Tj`r!<#n%(lJYfgTo^JB{70Ljm@tCx+BsIIJYuhj?D|HL4=)GL zc1x+6wEe&$WTOHqEbL@@Y=}bXkGc%%?ZavhZsz)&q}PIq$d5e7-NIIDofdinogJud zI&?#ZkQga1Qg5>y9T82cR&VM(iRQW`6IZZn+4Mf?G5i?bj+!qX{*qdeGw!Tr%f@dX zLS_V^G{fz%NT&PMVa3gkUb7>LraFSLQ{2T1?DshD*2a=be@YI%JN^k!rm+xnK z__o7-GBpl~k%=cu^$rXkXm*JdX3Kc3D81tEJDE_RZUn?s^+Fm^qD_XvG;`v~wlqw6 zr=?=SoUIa+^D|f*Q(ZtyjVamG1-aH3_8@o49R@4ft4Mxh{Adjb{PmUO_2&AJBW)T9x!LRng>b~%SWXHj%jBFRvJWQz~ZQ_6X zAe~UQ_#1&$^it}(49hFytyYB3c--X=`7Y0hfWPEH24BgdLJ}ODnH%|;@RwcW_gn)A zp}!R(rDAPxh)7`{qaX9-X5Y6%g{ms!3PSWPC{7-cU`v1?hRn&f3;dx3KY?vHr_qP+{Aa-_i+O z_Zl)gzWN$)VG*-89h*q|ZL2UAQ!G_mJ#hF(SWHeGid?9Kx2VT?K~unu{)E|Bq?{nX z!oG_m=CnHAIZcEaoym~7?IQ>GxYK{-DM61$5e9tdhV4FaaKGSu*^jsF7IaV%lrAba zA4~1;H2cBRI`Uclh@}eAry<4?1|i=45lCqoq#4B)NAg<^;+yKdpK( zPimoa*vSQ+GdsGbxJL`n36^{(|!*5#K)0 zrtr%H*}CW;_ZGCsepBlga0jT0zTPR?U09~i*rfH5dohY($4CFpJCdK=6@v1NqU;#| z+`%=vp8-DR#n^-~_11O{Wnds{4{IYIjB3Sqlb!5&8#4Xf2E$Hm-$tn6hcjSa-8mcT z8Xe-`Q4sv|Ut!w`54*~*w2#p!f>mKZQknP9i?DfbR#;PQKFM3D$ToPkivI7xqbQRG zo{34b-Qlp%v6O%pP)eUV_x+}n1=#oXEwbi<4G8Cg*}r0yuDG7^$6D&#d$Qzqbt2Ac zCOaTl$&|wkV7UDkvg^dDOD2R%l*6Fk{c}a6SevFs)@ka3Ez|VW_)_Spnr9%-w3j-mABO-%m)Qdn zYSUhn8nSbOj7e&f#B)aCOX(Kvhm)fER&J;j$p%t$DKjb0gmRVq6toz#@El!{moC2A zQGMlK?X1&Yb=Shgni2iS0fbbxh*o_1u zEHFSd&fPv`15y0^G!%CA>g`$yTg5efM?}M8^jc&dT!piihU~yBv?B)fy0v|HV;Sp| zM5W{e+x;(+kQe?+4VD!m2wXrPqZ#hA=TZMz{fTJaVS!h~--T&JpD72i{U^bc2SerA zuUaOtN64YyJBC$o?{~P2^=P!o9rtQPx7Hi_nhKxAN>}Qxq4~-CSig1k%kj^Pg5LwP z?CH_8i8FzuB6@EjdSwf-Glk~!`mU{I_X!j=lj`>{)Z}7!KR9l>8L|Bxe@K>S(eTv8 zy3hVF?O)mp_W~oPaT^7t|2T_aGCsOl7gC(*)%LQFAeeOWnFUP8pdP;oxOL<~mX-ww zv%m7s!T5;Z#{#|os;tk>g?yn{JD76Fm81^R{RmuOnufv%D|9#byAA3azh37EIj0K} zFnvPSFCvN8T$74K%7jtn`vx*W8ER+-^K>#|;q}&^wa~$j<_MokQ$`e^3TWgcVTv6@ z33?#$zL;#8Yv_YjXA{mrTHd}}a9qe~h_;6Ri`KL@QMDI`azk|ov@CfSSKa!4(~Ryj z#lHhA-@6O1$~c>N&YlFTG#RUsSt;hK^HaufkGTy}fTdaa#ZR+ZX|I-QiA?dLu(@+@ z5-#JDbhB2|tTA?6I=E1CN@cN`Go)-f*4lt*)w@4; z>x?4cv2o^$$&1r98sV-T36F;e)td~DP*E_UT}Skd1oOA=^u#1@G+uS{hgka6?vt>H zGpd@^Ggd2`1|McUDeeaac`L6`hv=-E5BEG3W}AsZC{>_07+BKSg6-zH9PEjHm1y)_ z6czXslR^LmXNwQ^Rjd`|4mf?=%P;&xN-N?+#uAm-Oiccxcp8b_Ca{qTZi_YA&GkL~ zarVe+v6q(dgW*bw0TDYqw-M4^xX`0*s4j1-XMxW>@}J=TYT%PEO51lJOOZ zG9q0LTm6-D+--`eTxxINVV&z!RLgR@wCpS0mJhL!3s`m+ZzuuRB{psSx<=Ef=VE`H z6@4Vm%FLDmBrvUOzR9P$ZV9IaY-bwK?#m_i43@zT&ADo3U6@tR{{4-@qXGc&Ntd+i4Qzlf|xiAc6*DXI|=eTDK^#-OzLJk_= z^8~3VG$Orz4T87l4UP$jcc%0QizVe%$)t{U!G-T{JRy+9e{()q8DRdU7A9;&C;xDD ztCho>{TcdsZc?ByGwQHwQHf(V#c%izCftlw_+wi9o>YhB)3asq@kH^bUEvQHzfR26 zq9cTBOT%pR++S;^84gYCwxz1d?J~qc?w>ruMz6I&BJcX^m)wn-@XNLiERR(4wf=X| zAlS86;#hx~#J{=zR=E5X9eU0kr?9sj+xeE#ukyLo-@1UI-MEsd?z}J`#ZRe_JAY{c zj&v*g`~Uk>=ncPdXlUE}$q&?-c(3be0d<-Ht9(3>d8o+Do+4x-*Q9BHpf*p%X3HG? z4#>@~M{Tty=%iBhl2k6b|sN$fZjxl@=>CI5d#$$w*zJeDn2ay03)K|3I@91${x+-BGE0+&&q*b2eifa zgxAUX>O0lm2RhAZ@|bmP7Y?MlIi1a(@pBbWY^6GiD1NVIHa zFuZmtT(iUes9lAF%n3Pwoyla;o(IsCJ7?vL{9Y|*y?159y-ntj3FRTBXSC^NyLok) z50e31`G%dMu37=)lf8*MDGIBN?#hf! zX6OVWrOU!ylV!pRIGpUEN`9>OKX4Zu^k0Pe0ec*w+4=Jahlwx=R$GT}2egStC9kgu zgaUIWytx9i9H~r+drr(h(UgrmRlaxa6|+)EozG$8J@?Zczs*S!u#&Fh( zv6Jp6(R;tI*Lck|(OVY&$OP7=vhb zgi&L>Rad#DkQFjvJzIMHSg_X{7wA>VWSG=96{}w7sJs^!c@38v+$+RKB>?O@gFqp} ze;fpsYHx0Fo58dusi5~2sLHiq(Dbi^!4`P9mgrOqP~f#nQhDT_=&cYG(rHxN%+-39 zE+w7UxcWOXm_LEk{vCN0T&Nqk^z-q-Yp-~V%=Gks7>0XK>-C_RH{K6?QOuIdL*v_} zDG+Q#H1hivCD1CcrEfuh@&_f|)xQa!C!_I|DXKgd=ML zd60hx)1|T?+WMcKG@8956aG#ul5lU#ybC3Ge$0EgD^fGO3I@c9JM1k+sjbr~oML?j~a|=2kQgW3BNODJW|gkz>9U zR(T6cBzP1%7r|wOrtw_NJJ*Go>T^u6J$3tqX?ksE@fkpBANaf6d7td0JpG&F(stOc z%UkKI;71SkpL-SDqT!s5!ksHl|BU;c2njWk-&nE#YQ=7 zF#GTilCAG&Ygn`RlJb66A`Q*;;r?(y>7&)FhK9^{5LY@!9v0~Y?9GPV#4B_C-AobG zRDz8XaHcx#<>VRT-zj^q{Ayct*xrFmNvvJ zL&M)e_Z#lru-if#JALlF3^1E)cJGYZUikSs?KA;%Q(t>WHBlBbZ}l4&?Mu@~`MvAk z7p8U&4Bg&~MOP;+)Yd&0bI+>QP0dfB(X9XJ&@hOQuU^tJ+FR;u@%>JoQ#G`2z9$UvvYzClU7OF?>Y8vD|yP z2vn1i-uTw$sk0k(&$cX-ww`8m=xSJ22lZ}yziR}QP)igrZqi}2I<;@lC7&1iG&qD>K=R}*uCi;^weYlg$K0zUO_b?WwP9zuc8?btJ!v?CelXioJM-jh6 zENZ)?L&r4Ur>>^{To+dYSm-S{Ti+lN>%20M?F+{EfgflXl6B)hoTp&9I|&%?qSBT)b03(T1# zY%96~?RkLV%Fb!JDw@4BkXeLA+_RhIZiglEm<&sJjpN*JZvqW{8Kzz(2irrN{4}yQ zNz1W>v023{{8NsXmxh`!xyYCf-O$EA9SiXPJJUncMWSyQf%d8RO%-Ic^P+*eyxO{3 zQYA>ZEiF%UqTsudTty2mK?tBA?K0ftoyFWiX=@9^b%Y z8j$mHeX2kt%ed8}(#L+o5R>BnxmPG!s&$dNN=kK>wFDMfrol9*nE!^10g^p2swXjT z#Bv%xA17JfAdHz_e>n9iJ56?38K&3Vp$2=_Hi&q!x|$_rWVwa_G<&U@tZOp?P38OV zi{FQEB{^LYUD-VJbw3fsp)t-)XUkU^_(fxS_}^akvB51Ka`)_hrZ<$fHe%c+LXAGf z|L||?3OuaQP5N$?`<8kue=sU~p&jfd6Pax~sx&W@cQZR(NORs6>;qFj34K+msD-^H zM=A93KoDmu74p1v2V7Vl4Mu-Y#5T&DA*Tjt(ceU@8a75tci1ako)`UNUKDf184&Sw zqG(4p`kRb_cU}ucuXo?$JETS1iFgD&a6jA1F4To$cYsYTmRw$|TnJ#vHC!{-JUZ%2 zDhl6-<|Wx!z3sON`2-%vHg5~y(=@G2F_a?|bsSb@6>xm<*9l5p7p9w}YL@~k!rD2{ zZDNZBBljPU&?DhSPoFdr-fGPN){qIhmUCSx+!}duvAtezn&|5AuYvQ8Fu+zRy(w&K z7Za3zisBS%6Lt8+WKxylscNS)lHd0RWSk=dkZnYvR9H#b9*;AG`^Bp@Aw~J2x7b74 zGvT7dR~o=ysQ1}Vj@4@I(I%ObX8?`9(GDxdHK|ywfjTyh=V`+{iePmWbb{rmB~vxQ zCM)<&mmDPBLdRfb?rXBw_rfsd&X5kGN9%eR2(`nUtXu20U%GQ!RhB^pz9?ue{nQRA z^8K(w7KmFlI(LVsf>CWal4i};!vm8SnD0(2Wt)*dHHlA@PCtXC1ke1Bg<}L-J=|e` zXyb)&mznmHXn-qNXeL4O_Y-xMdwJdxMl(*+35xF0IwiF&65^$`=3uT{940gE465<9 zRK+&Ut)&6dma?HlPs$2=B{(_4j04nNV~_8$AlxMwaznFaWYSVk5l^sdzw_`-{-fM-stR`121?iD&4(U0)UQm4ttXO;u}no2xX80z5gFk@8Om7 z|G)p|%6ysiDtc$`hDp6rapfLuvlL1jF5IT5xCIr#9A)OJDEG|L%)M~nUZl8jf{Kb; z5%&PcmpdbNqs$ zE~BlwTAGUBAR}-}rAG)a0qrhCv9Hka_Ts~P#8c=DT}-6duD+sUwC0cs7&l0*y)n-7 z384LEFELDKZ&9UWeY?Km_;?<~Sk=L2Ip29%*8%ieB4K)%jsLCToHcA8sW zq5`3mZM7*X({^1_{$3acw}>qAnc*{NQj>X+?I z9H?AzefxgXkK;Ndn_N;O`ggAVk9h(7>3AJM-+NHnlAhAAoT_S$)SJh3sC&)Xz~Gb* zUOlQZ?h-5BX;PGwPa2IbqMG5JoWtz^sRWBX$7!~^2E#vu1`goY`U!;i=z;8>mqS2= zz6R*LpWqF^9iV;6Ow##KaGjdkBNSL$wEd%?q+`#9jZkpm+IPL%B=VWCWla5PRkJzA zh!)-wlE+&!L6JnOw-(@F13gRN{ebiBWnsIRNRra$u+@R$$iyA+*vnK$qWze}*1D?; z@ey@ap*;^PcoJB9bD2<+P#4Q%SI;*ZTR6UcDW%s*L}216FDN+ybTAP$$nj~L)U$vz z{H-TJ%J3&szg4hUyFkZC*b`|X-GaM7(1yNp%n^*#PC2=`jE6rDc|hty=Pf6TdQhO6 zDiUxN1O7F)FDXa9cBX=6wIS6d_cSJ(D*e1;k_69AUTVts; zj|WYST+dC#2ND}w1lf3#y^jBsxOTTiME*RACqE_jTo;qXd^cc8F;_IO=|s~L@(1j| zp*rMkK<8SK@2>l9_Ma&&s9JDNULn1X+Mh+wx35$_SlBh1Ol0CQsr~iaj(2?!OPPm* zv5dXVvEm@Nz+Ki)Otf9oHgEz5kJ#QWzBY%@1@kkiJ*3Q-=;rWQfqjgV6d`QhMQrj z<~ngO=|VQt-D4wKVXGKHLVRBht@FDpBKc51^Cln6VKp=!d-p(1Xg>UQ09`f!WLRba zJ40QXXt9Yc9tJ(423PMNVy53qeKGrabt(d z84>ykM+fhfp$9E(Zwn#6R}S#|R`syDKG{Q$jTV0ME!JEY4XgTfYM{HCF~Tpb58tbs z4Ps%wzOX-M+9wg?+Uz>wQ0WSX_?;;zmtV6jshGP$OIXpKtRA0iLerehToNj373ymq z_v}^6w`{HFn9jts%98j@)%6T1>Z7W4$jvYGE=l}|49L|)Q0kak>04qg9)o^p`;c(; zPeNfiv|bZa-kj;Y57+1?Opg-s5yyK3ooN2cz<`!Dbq0KYX&5=&&`qdQGG8M2b9=k4 z8T#rU*4VMieJTcic3=00l3WSo%Hge)X}7>a^!T=0jq~fViJyp=HkIu_Z}K_Jbs^MFr8c!r*LMMM%QbU zt~{!&r}p5b4upr1d0AcM2>WS=?c-nFM%F-wzZ-T1R}Y5wPcS%M(D&+7At~*YB6--1 z)+K|Bxlnm!uu$K8vaHfq=S`Xh6r7Swi_~Q*d&qXM)smp2|Q- zc7b#4#-3h_+RctjDF;D2vcoMiob~tHYP`>Xu6{3-mvX06-z$H^v9>VJ1oAc(N!ik6 z%@wj#bo51l1}R&`sltStH(V|+)n%k%KW5!V`)2glEEx-|5_g;rS2Yl#3$J*!CZv|k zvJT8oP!BddfPaMTG#1<4Vo2?_G5iVTnuw|Fb_d71IxBy6o3zvyjX1Mj0vNFmiC)+u zF^Z%}tO{sBec#D1D-s4bkpulliJMO8QjI67xCgfGtEZ~L?BMA6JS zb`5wg(Z6fd2h1`0t4)(dSh;TYt@M$F#jg{HIAq|YPd}do;8Kk z_lL{S?2=rQAZECjv9OA{5IX;)>Yr+-Lm#y@ug=Ds(oDN#=W{mepGe7NFD;!Y3y>w> zgUNn@M^R!!mV$TGb=0S>g#cyW1|-R~el8a>O5rQWSuQD?Ro8`&k?YXYMr#}MVVty) zo{cw6tvhdizcy3arelaPeD!Tv09T_x4Q=maSH@#yCo`aWnbztc*eHvS(OY7W&(FwDB96`eboqN+z=dRe?=P1U)?}Age>2kH@6d18LE^Is^zSgryI@&Ud|^&9 zJi;C`E#@ufI_ZEJd7ap^8pfDY!+plUQEwJR(-JUD;phZZ%!aCN z*POyPX!q9G=u5(GQr1lgzS0S-a%#LU9Q6=?)WX>3KEZ!dTi(!rgqk>qjWWAaV^h1J zr%wP3_)yU=(qS&z%tXO2`YNobhr`TM%yrrs5u+lG_r(M6DPfRmjnQ_pBQcn=_MUIE zTHUG2+5DgJaUj1sHZZs@QbHmurRZeY z=*a8iI$}6C$rZ1>wZMAOL&qPKyFcAGqa5{Gk*$GQmukE{{Vb7YtIcxjIC^Zhu3UR# zsP1~gT6_m+A;4#8*!Ct`m>1f#*&iRhWi4#9=$!07PQQI-v9^P7J^4v4G)==_e>i$i zxx9i#0jGkt)!IV|8qnQCz6$8!HEnYz=i%dliQ7fk#-|5=mkI6DY~RSnY@DSw^RWJC z_}Jg=wGdU%*D&O}VwL?p+PpL5q|e=y%l5|H097~d69_(Lkd;(~4>cw@G<-3g3y?ir{E39C=?9r$ihfrKg5`Ku!CUI|7s)H}u{+hSD zq)@^yH+9=SQrAaJ!&ul@Wm)1s;9L^c8Tw;Wm7XnZJUrncR@CEOBEHt`+`unYW-V0C z#)JPNZa;jw-2EU^FUv(DF?}muT4TH1Kr#te*X^M4{6(EXrj%yVO4@-1gv~W-KjW*p z;DB5`SF>k1aleNbFFtydWAC93Z0)-4BWnrQ*kBiuHBl1lYI}~-Q=@Cdz%+W z)JNhyS|m(VR<6}FTATKMKjs;s$W{xx733RVq}Xa@*Vt;a802VK{djGXO@g4I=9{(| z9EJ?b1K>3W6`@WqkKRW3jueVo>QBH|oI-*}1K ze3yYT#VRqSA+1)r3#3SYEFOkkypR#KdUZ*0arT?=7fCz&&6Ox!H)ml+xrz{* zqG&2{#f9vh-1wp>YJ@5h7fz71P3+I2s9+{Z*c(wnjuie2vai(wzVTFPcXWB@Y3&+U zJKCUeuFTNq_7R>tnUe$`l4D6mWbHZ|xH{05q%+adXncd~Y=ekq!1=by_%mM>4{PI{ z{e3^Ti`@CG+hUX4BDGVZ^Q%*4Z>6+HynUhS#76P`^9B-AeE+5+dj0#^G^C~d(&0i_ zu5y;W#Xn;c1>G*tlTpG42sz??jk?N=vbGUZSc6<EE@2HmQmFj%&8RmZ6Ok)~{$#E1OfYk{v=J^+{Q&A6Tit#EE>9)U|QG zjO|5rgUddK3`T0QLNW5+Cga31S$J~ZZ40onKA!?`O<#f}G*J~;hq7@Apu1$~0Y<)> zX!y$nit+MYAyw@8mbh7%SWMyVQBc~}1+?1wb2a7KDUlelyU`rL{}Sa)?|6DN`kz5^ z-CFo(V!*>Q6gTskv#byHW)iNC|ryW+nHDpyQkR zVI5-TELGvXIO9M-fnmg*y3%MwibkZ2Y3>~8a&Elj$q-j5X-`P*VFbV z>a|lZ6balGYwYnZ6%|(5Rg{@l=5W<`h!Q^=@UxDd3*ccJLB7eJCZ}@zF`)XLjNW;O zBaVNyB_|Y4a9gLf24CFi#1(3mkfgIwde+W>O&>)ZN2lv57a)IuT|?+HX3br zF(xI-vKRX~7DOCk9&C{ajIVn!$9pk&fVRzEBShl(XsH4zackvZZL128c&f84j}#;) z2kdxFB_axLZW^jWoif)4!rosC5GIX3$%bkX-yKqK`$U*6+8y^Q^S5RccPVA%6goHf zuDX|6E^TK|_ZC;xcsSWiP(_?Y*L|A0JZ8!+7cbABk~-42&6lOK*r!-az(Pkk9n z<4z8)eLa6?y1A(o{MJfZaO9Uk_zi6|-3R=i+|9&`lF9m>(`h(O`R&l(-ER?E`-?LG z_onk>%PvdY_|iha4$l5so#IFFY#;;cg$S&rw$r~3c;Ca78b`oRML|=cl?L}z z)o7vb8HyJnSy7-~&!1`sP6}e=Jrs7tmEwDse>23aZLKP zjd#_LOBw4AtDx8;LyNFRC1m zSU3~#!Hc@+J==uRZq*zfOu#F|;ddx8*6$5|_CdD&sK0sBCEvuBXg7 z)tDfIN6&v0T$Fwtdz!>AH|h$x!ktR z9%?54iWb$Tvol&gTb{5@7=mne%Gc~WObivupCOHJ+_4k~&eG$;fBvHIV43XM+R0e| z$F_~|e{?CuWd6(SrFZxIR?IH0bHx&aA(Y$l0@JZ8i8;j**oX!i4Lp!VVr@__#J7Z}jUdHnbg} zlkKVN58KyTDz(*`{>B;|za<;>FeY7frQm=1x!FyUfLaXv|1ga`{Ol!RW0UQ#u9f5m z+=ECt*(JT0sY4309&ljgfLF~6u-?E6jqo5~F18V*dUF~=M%uUrAq~_UCuf3y<&vk& zW7&2-DmAKlZC$qiAwa59e=Nm#!eH%}8&fr-I6dN-!3|PRQ<#IP3e45iS6>%Q4u1sv zZ>jQek#TqOKnNuNwJD4H{bIupDxPOC4B6vrvx*sGJU?Mv(+TvQWPwYR<@+C;KHP%J zO-@7Gv(#v}C$?zsB!;g{@qpJl4-p%M{Q-l2hfMa& zQ_4@jBwYO0C=X|>=@Aefn9;?zvQFtj!jV@r8@)8h9FN1VIXoYT7lBl>f1&l0} zxk{vSbPFlH((HdXJ^~bt*_wI$3N(1zbu4N6)~;eX)MP0>dnZc)&_&(_Yk%xv=LG7t z%4z6%6097Watg_j(e4L1U|^Hiew4QhF^h~4_Zs*(nXs$h zL06D?gOjLW=Yz;FqT&#EOVC%rfqco*U0E!_H>o?T9Ow(EJ;6i@0ZlGR*qc>=2La~5 z5RprjZeKp8UWkkPIorLsGkS!MF7rsQgRSB;s#GlaYgqkyTEo05QtK8<&R@pPkT(oX z%x0xQvHTs-fBwC=cX*cHS4AIS-v<9jI@u~T4wHA%*2A#b)=pZoMOp)VqmU{|Ww%l# zqz##Y&X6Zmr=}ao)ed-D;dq@vY=4WteN}oVxo@@Qwk9s$9m-t&9_mpldk?i6RiL`= zoG7BZz>uUqZ!j~-HCRL0T;e+7N|CES5EHuc{N*8{en_vQKUL7wpYz0+i&xPtOl+Nm z*~_#kWJ{&C=d*-zc+gpcRIfr$a2h5pk`A<;Q{O5$T@|e&{w(HUIqaVG5rwga56A(5 z(txA#(c4DM zOFmLSkbO?i8B?}$^{?qh^U_I`CuKD#w%SFP>?LX@|7M0;B0%*A8|;kvQDOt8FAeWm zP9H0cqI@fjWugtPpKsYPVpA>f;*;i_@tm^-Di|j}8XJ36+;FA` zSJmtmM!3G8vPRjT)3ZP*;pZyWce7dKZz&jw#m<55>!XR7UGg~rDWPO4ZNCn zdE?FHGZtO9z=@0e2O2rq$r7a}>cn}mAjd&FG_r~*PSsFD24cJ+TzbF>mMgbo(bE^+ z{mbhsUj!t%lZ|i0$ED_l#Id{--eU0o8Xlp{zdfv&QWklP3iA>aS;*8=W^<4IXqC;x zO0{z{q17ZNyr za_I9dnp{$p7h;}Q({R$fvFCvM`L`@8txwbAjuL-tHhmC$-$7Wy0z9x5${tSQcrX%( z6x7m8bospPVk+r%Z^(1WE`FaZ`D-=@(^_`T!}SQ2*V~$HcEczo7t;t?mfjnU>(ho? zYwSZ&Gw*B`qVy@^1F4r7Fl&IgFobeeJ0)`W4EucTN|7#HH3c8m2CQW-H>-G`NC<`C zB1S%tzk?q+#pHAKdImv6)UJRN+Ox`a$U8n;bzA1M#+S>*N2B9kO`M*>eM%#DFkv)j zQK8q^Y4bw!&2d~a#^tWW^ZAGQZTAL?!*#G}A@8+6+xlOcZ+j}9ZCk%Ro;_(^h&D_8 z<&1X_AARF5jg3ikv^E#HC1cebLQjC%iQTCGZHeRCvbFe%8KJaG^-HO$y}C{9+-xJ| zCZq4p7OKCj3j)C}_msi$gL}UjC)C)#)X&XlF*|#^frsoNjSK63cTj7Enq|U?yC}x5 z@o`2@_w}Osy@I9(gvFy7Viq&2et&9Nx5oJ}7KR5DwAxlvwNY?hk`@7KBt(!j(ure^ z4QhPZ?q`0Ppf4o?4_DQPrvr$_phcHMKca!^s^iXu%9qD6F2jE#Ci7tqDJQJ2&WwAc zT4`!__8?uq3;`6ERKth4xwa3C1(=hiSc@gUrizBj-au@nBz-J8YO;G&NMfN(>Z>Hk zzaBd(^-AQDaPwGnufjl$|zYb|GDGr&u7`@Do` zv49A!;V7(qi;{d=2bO#`WPb*sj?>eQlo)3IxdObK-STvHfM4{CXqQ7^1(+0uow#E^ z=V&O`*Rh*4wzJ5+`KMBO645_u-}RcjVe^~dQa$Jj31{iG$v7D7nK-!cSIz-M_(y8p zs&bNtW2y|+jIGAy#VyP&sjn4KLG*ao&^s=gb^R=Wf3i3A)FR|uhLslvhAGw$)@kf9kA)e`HR_o$oHJU51)D#4Ni~e^jdF9Ub zgsMqkddh5?GmaLeB_TeC&Doj-*u)N|#K^e`Vd+|M-wcAn0*^J}No?58Y_aw0t~llf zjN`jDrS77;h?d7Ip)%2Ys>{FkVhkeMPkQxuIzbD&L(3+(aChfuPn z;GH8*E3K2u+YU&!X+Yn9j1jj)c{H%9@+!%uBByYC+u36uH&um(cqe!4c@1};QJ?pJ zk`y&AWsclThOz@9*!n6-HfpwP6|5X{@o83_u%J0tTj^#j)USi7GK}ysb9Zy(X*FRr_|?=9@j$NfS1-K0A<^tqUkq8Lb^^&yETQ9Hp+P-kq*4kuu%70H0ZOWA=i|hk0iClyv2z2(VEx7kPDBXn`33P(wl2lf;e9vXlh1fqlzSs( z=hIa9qpjx?`oJ<5mC1+ucf`)8V3jw()L*AYp8&k>w z{%`A^cv&tt#StEqct5G@r%Ey+#}(|&8juuqn(hXYzzclojB+ALBg$5 z&ZLNfE<%4l(~1Sh&l4(@iYd@PS@&lP!yy-u8X0Sx@qnD(0X|*QU=0ooKDaH8b+b(C zttqoT_=;SaMBW`d8!wI%m{YW!siT_owtiUh1mv&cu_Z8%q8eOHqJ#k_>e{_St_`aM zWr5DuWFJc~r=l!NdF@&bT#Pf$b>c?;fkVPp(~Z3i-?sk9qhGJ9Zd!<=;CCA}{ZmNa zpqi<61?&9Uak~rp#U+c*qj_5S$7w5DWtI2E$SUZDLECkWqAcTdYLwAo1+33_VAz>z z5W*AfC3dzl&4+>VgQ09qPq6-=R?G>Eaz(ev6d1Azd8+QXlmOJ3IG8g(v45)3znXi?G(X;dxgEWoyf#xJ9l@9 zHo9s~QW&kR+Ut)I2Ws0Yc5|VSt*p9piPDI2c|Um+?&zs{p&!CJ!2s=4*{y915))|frz)ug^(E3Kb(&( zG&MCb-tP$qv3yT%DBS(2Lz{zQeI7;D1GIdnXT;z>o=#-7#lD$`z_zuZVxKRRA3yz6 z4Blox2qWleSlm&dCp0k5-;abJ8h~njzBHCN3zzBajTgr`fPFt5th7*lm91AEthWd* zU*1k^@Ivk0KhFk+RM2}i;DVPDQnmf=P4_Fj7558zr!d(VZL=w40;`9MkQ+(c+Tk4+ z_K>`+uPbSsEjO!3mwzGh17<8{9XVnYuW&5R#4q>9_%ZBmZ~c;1S%;~)Y~*WZp*z@h z8GC+lI&}YYEgOC7jr0A3JEC>v(IIoPN0s8fdpx_7;Cft287v`P9Bv}}$zcuWDs3hI zgP(*GnRBM_HuSXPWiO7LNs7%CZ8u%M5M%h=oNgfat&xs%q|BJ<8I<4r zUW4{8|AyN-uFi*tYhgM8J#UyZSivs_yu@($XF+4>p6Dx%&7NndQdOQhKP&d>CE)1c z*jS4wgJqxypudjxkTTryFMI&xBf2(Vn?LS2&K!)@?RHAi1lR2rCm5|*RVl)yiP7iK ziA3O5XDJURCY~-@boPerdHwTI;Cb``tGqZ+mX zkgZ=`lu7z5TYe~3_>nZ=YWwAyuxMjg|MAnk6!vfiidXt`{AfI6Cne_{d60fuccI0XxE|5}m}SMONFwcbwlZMC5H;6zsGq8V@=T0AFM=B<#) zXFz-~+pZ^8L4Al!ZH#NM(NY)oB>+5qZdGwq#JS1s( z*QpugR**N+23qL$-MnP79-QyFSGasfmQ4zHsHa<_jTssEr3Z6=HX8NHwnQ$a|$E-Qx-_PjgrFr-)*n zA~1k3$*Y47;GEG3-0#Zy1UUNLfRXrBJ5QF?b`>e#)kW_!y{U-p`wcR5@u{OPy}n)4 zZ09)ln-Yj^#1?hR*j!4@$;D4bbns?f6xR|La+mUEy)G-T*&99#X8k%^Iq)TD&$=Pp zWzHgIqn9KWkI#+&z07rV%xh0KQmCn+1OLy-aX0pSP|%nARJhs*?8mlXG_gX4N&&=7&cn-NN<<(}S4lAuC=7 zPKxznoqfB*^wm63^Ep@6m}9#lON6cr&PtsP*^vIKS~pj>sNUCFH|YaD%k+XC|NoTV z*BJN(78?e=`j-X7I60Df$%!aCSQz6yo+HMJ&Pid$#c()r@%OY2D#-~f>zLJT$uK^~ z(em3FWl?jLAHDn#1IOp0Wcyq4f&sCq(kO+&2cw*jlH>=AEkl5n3a(zZZ5uFv{ZDE)mD}$s z_}IWxJ!9n|j|iKdh2BpkA`Dll<3fwv7km+(biRcLASu+X=VePJPvfdBlHI3c6%1Zf z9;RBjf9ccH-mK-bbX2;&o%D4Y@7MeAt@b?TiS{Q|kMqBx%eRz#kwt#fk{)X&n2p!hZ8^xZ)<4 zKWFTHM{YJ;pdmu}sYb|bMiKu^Ko^3*vCRoOdU3G`0H)4A5OG!P$Tzt>oP>0IQ>8mBW9C|qNoS7ioiK&y*^t`xjA%}El#?6do?J&m zXmIr)un_{19tc$WtU0O&TJ;Sg)Rp5VJi=g>VkLC5U6=ZCg~TR7VUcQXJCz4C zu649KYSJa9&x+|R@&xmp1zk1?#IL!+$)YigcMKcWmn zyK!CBR^s^7*@1&#srAb!3vphUEa{5Ur&3lg=rYLEDGz!%ZhQWH z^x?%rb`v*1Th@0-zQv2YY{Ot3Im7DD%yfR>`{T{y2n>VK= zB~*=%qH_0L4$GvUrF!D{h6I30$#RPY=!)UX`Ry>`=h;pKLDTzcx9b10(ub5gc15ii zoX>}M_iCOsRVIdR)b2c$*dn^3sJEa2{qKMHV-1HmC^fQ|x1O_=`HUL6?3SXAOA=mj z>~QqR1R~89J4#-HoyO^W-JFIUzQKmZPVo>i#a2@r2BK!Tl!iQsT!U>}_g_yp0-=@> z^K(z(iQ7G%!+?|6RI?#uJCyi-y+U(q_dl8k`;9mxRtz}5d_Nb6=P_Bmd!MCFv{Z>q z2WZ2sggiBalFiNvEB3WjzhAw2UxTH-pQxSMseTttYN46nZIe z^_j#!hfc4ZcJnqZwt|MDJ}>2VE-%%>$9_;^(QPey;_jtT6=)Fi%34ugBZxHpH}2@o zX$QZc0eQ?F`Lrp_1;r~qEVG4xE?GJ`Y~0pGgXws& z-Nj{HbcIZFL2ZuPaos=#gVABI0h53pP%LyrKmo&3{i>-~|1a!SahClM{{hGe{&%p- zdwRug)J*d0jOpY9&i1!A8)-Y)MiTs*3G~gO6f553Q;z35`LcQHR*Ms)20Xr?RrSQns6@>h8+181OY@&n5|HmCjd?^j_CE`5&uLPPj}%H=B($+&VMO z-o?p@Zwzp1SDu+5`ae_~1jJ1YS<`GWW{9L3#WYRC=C2@2cs%?YR^qFVO$oC z9M|0@Wa^PNPo;>znr}SEG%cu+YoG2MK+>bvxqVlUE~vhCa|XbBTy&g3F1Au>lMhT` zlgj38@I9toTs5tN4?%eftduG3?WZZ}Bua8;OHC$MK2(mxdN8h?{A@yrX2(Ums1>f1 zu(feoPPEDK6VRG_U|ao$QS}`~3h!E3*X=XxvPPP=h-e<|Bqg(>hb;Z9sz66hb}pN$ z`$oeSZ?9G&8@lx6kZR=DXWm?!*7r)!C_EZ^tx(i9e30Ztna2t=M2ibmaQ^0kJm$Fz% z_4`R0_aPl=Yo8m>Zq&sbYyKU;(>rDo-w$rn4eDlxs(Wr)ipqZT`$u)B`o&x#3XdpQ zoIkG=Be&giJ6#^6s_)|pLk2@d4wbg*3M(R)Et%f6&XdAw{snpC{S!X|68Bb#n8!LhNn zwkH__?Ek7#zg+Va=(ue60l1sm8KT$|F{e@k%1=JcWl03@+t&H?_jC`h?rf`mJ_ni3 zy*4?`^J#iIC3}c}^PJkFg5UQiYa7BbTLWc2HjP`HaX4O?TCb}1|8=O1Hu;k42~>Gi z_Ho@E5GHH%#Z&MOUS<;yntYU%k?DaGqszjH%4okhe^%O;1k%+gz`M!C2XJ}>f&L={ zUhTnsHjNt=ERZ}YuU$Av_{oyrhvcpE+c86vB zgnuDKbQG-i-fU90L+vC@+=FMfk#;t4uNk%Tr-W$xT&y%d} zy$V|F5In$I$9rJd%VYf8%~X{(>98A( zRVs$xNdfW6dE7b;?H0sHfPzKm?}BQX$1RRcs* zU~dMl+xr)MIu)KH(fFD?k~Kn*izdtMnh9^Tqt8>f1+!B8{@DB?JWKl!pih%$(0B9a zw-ag^+%sRT+=9tWbCkSHz@Ydm%q^67?&4D2?;daynE#CUQ#g7y2frUTUU3MtA;TN4Xn9B-{NHpTviN+ykS*Xc9!2jlFs zd3XgFz2?X=vcw-*{*yI=2tFGg;*nAKl=}3z8-AnSdDutF0*u}=rBIdUL54`8eu{&9V?KcisIBU z2pxw2P5G1Wc$+{TA;tP-Z*^8+KV}T$gl~*2Jo|7EdBv?n!J8`UXGsYrTy?Bam8f)9A@78uv0Z zHl}z4fj`*A@2-)p8>T5F0_cY`I`xbH@(DDG(h&dT|z=@+EH$JL~vlPB{U5&-JcliSu}7)XAoDgRS+Y z!Cc)4+pI9y;`#s>?*cEh@29!ec0dm&?0RIdYgPQ*?>2fpn|+o8V8#-*@pk6|T!v+M zznuf+RR$6jcAsQ3bHa6?avn{INBM#L2dApZ9~V`8vbd2M{Ku0K63Sxiv~v|;c&-+b zqK?V|coh5)G}rqfG*iD&HPZkW!& z6u#?HdF^tdAoz(F5o+IFoZwLwRidqyrIaSa!d>43fm{;LMmMG>Y@^wo2=3aP%eG-| zIzsGZCxnO9yof?a%wLTHqR>ti!y+tEbavrcK2YD0Y*y|6$ZgRDQ4w?k`uGDVfAd1T zug}25xwIH^{2GSO_hy~UNNc|l3-s>z?~|ZMBbNIAS%d68VqY0?=Dh#x40iE1T+ti& z`ftYB-P-gB(cN7JW5&UdwsG4VTr*_7FGLX!!HOE3#Dmrr&s2d84dVKT0PWzD$TLG& z^FWnxHr@QZf0hq5zX=We=3nn=JCwIOcA3(>prOVgDJ{N%SqvXtYz(6!{zI9UNFd^ z>jUFSq*8*!wqp5VR)wIDR6=p!wj1Tm<{9m+P+|D1I(E^NN(?`_zaCz+-S5Fc<0@Q= z!O~Yr-j1i8ST^;K@fJ6xXTkt%sBl|D_M%2#Cr*S4({N7QPoxy*RYm&@mKEvuMIW9# zGzJeLFJ}1;#M0F!ja%2F7M+;1&06Cg7E*O^>YXrnYI6DFvpC)PZ*^a{`EG&Izolx7 zvXynn#5d@0H_xXSQ498Wt7a{!AlVZH4QXRE^p#`WYKrhfR2hvan>6oR1KG7onicf+ z`F>YhH!3LK^w==%T~59;1^;ubpfGzHEugO;w@$xVVu&%=jQOk0fFx26PUZb?uawxS zcLFGu+~9tXojnduy|FPq>pU5qTm$p~-|z_@#%SJj;cQk_+ro- z+VLH!qLD)r8v@V8A;2e|6EwVG)b{gVZsvlid_fj>LspfLp56SHCx=3RV08*;)masO zLl2(NKe9tWRsDZ<)BooqV>y&7_4U>@FeldBlamxqPYF=xpck9QOeO$YVo5%QG47ju z0vCrnL)sC74n$$!1Zu32JF>r`86(G?svWfv8{m-EdnO;L5x%8; zIO3|YP9>xc)+_HnNjo|NU2(IVf3C&em~55C$6wQJJqqATm^m$f-c*ZIzs57s6>!Ue zRshjz(RFM;O0+7Op>^ZvSAEF}JAUu%-}7oVnKfIyPb(%d&WxoU-W)!dIJf)?vg`Xi zb3NHU;7cp>5#e!iWR6Q=kL%@WjL+DPpfK6>nvwK{E3aE@HJAPoHUUcK_MV`A5X(7q zNS>s|r9&7`G^efwdvVN!)}L@3TQ`Jnk)P{C%bYe^@#ohppQzx$uit)^yrjiTo^Q#W z2n44U9G~CVxiWc^=5InnYEYcx;r(AvZ_29bKt^JG}4%%tzoL z*zoQx#zzoc9~6k3?!;>g{EP$kfn5^f+)5nnG>KfpUTn!1e80_N)Y-Fz5g|`cynGvz z1yW^xy#phM!T|cQ*2Ic^M(Az)H&{MCMwcj~B&0WBbZ;XEYz%(*d4GTZ?y)`p*yBF# z^WJmLJ*V!^-)j~+SMLZ8+8=g-)({}y0nw9W#Pl_^^Wi+m^;9DC&&AwQ6t>9kiF~!a znRi0~EGubsqDkz7{~pI_b)}E;Mu{Vo6fsDsR*V^KelsJXEMV@aj5ugYnw8FQL+|_+ z3Nh~4C^$Ltcrjiox{$ltb)FuAbrZ%Hy}uB-sP8B$#a1|80yE$p+QDujWS|Ub7P^-7 zuD2F%+MXTk$B|?yJ)dgW36Cy|2?M~x-sOIaBuR;HYhe#u#DUiO92T>KE&WMY!R7aO zgR@szHWq^RA-ozX<(eN{3`7bh`QXg6XWX%3&ogu5>KPGkxDL<0`|+%LE|4dE%^?R% z-ovz<$1Si5@(NHn;N8^ar9^_-r5xhG8vhTEPP>XG_IPUeR0#TMDPn@0Nb>%Dh->l| z;zy=DXBM3Btqy5Lw@p&X$O-lz2e|zK*m3n&%Y3tQGW{hbpz~LHZ#+6Bl$42o65Z6< zQkNOy`Sh(SfL^pit5+|s&jtCGPyWG&m`YYDPU+pCmmw6FUas8&*@C)DUl#f#=_!}s(wczi)YzjO%lQ^dlFm=vGeSCJj)`2KQ&TGyH|>$Bx9PHv;hcCkfY;fXoenIc%}+MN?WmjOZ&HS4-#uI^Kx!{l zi~G@L&r)XoSLY%>^ZI;xQaXIgRzw=7Ndq5Xu-tAw8u)xI>6u>Is z#4uL@=(7AzQvBia9D3}-XF+-CLp!pva}bnzE2bP@?lu`%E#MBnY`6_+h7HjF0U}_vco*pvEbqP{5>JX-HKJf1y;^6d3 zdEV14%fhoBE7p$R8;O(C_YvU+1e#ya|4;f&-1!%FbFw>fcWCO`rGPe(NR#W2v@z-Z?Au=s5S5(pZ33V#NVve3MhKquN=V5 zvAEYj2L;oDa=|AnptfQDBF&q?mkRWh;tgZAF~DCIUQfF;-*%ECBa@uR_tJ}O4=8oj zb%5}om(AXk+l8?}7c3IuQPT@?B7ylE<5&}BLn0Z0h}a|~on_Gq%wxY0p_${zi7Ox< zaIl-pK3p&CPJZl>_z5F#W^v6HM4*XCt)=+{mb{t@J8-@Bxac<(OZEJo!szhw0@3@^ z_q<8y7#%1A8RuJ1T@(#4D0gn&4Z4)Ckwx9_Gn|z%gHbBN{kt&GpMN%`2(5YFG}k11 z1S8_geAoO+1D3{4^E{m=WUYC%nVt`o?$VxQBs9PwqA%8u;K^JH`)aKxv z#h??6d3@-h1Xhq`b5SyhYW?`u-1uClPjiLsiTC~#-$@f-0pc!AJ%g@HS z?_TsUAT(V+w~H1`6Y1TKUzyuothR4WxdioVZQqB8&NU+a(0x`?T+T@6$ZN4TX9+9a zqCE8;MNw$n{g`dEuP!hGWOdM9tdn2D!!aX)iu+3w=mc{L?!DW(fgQVX2^6s2c-WFJ zE+eNbB3#e0;3OY6Cl&irc;H@*W6-Dx=B)N?e-1HCKp`B+u=CS(_(^E{)fK*|DN~Ao zOBa*>U7g(G)5&XT{?IoiN8{RN8T@Dt(&7(xTI| z7R|a`JS*Mhx{m}@*D~0-n2~|zte#1UPHf!lbtGHdtv^! z`al8et&_qzK}}tbUJ7VZCoY24=ZmS|n%|ey8n9Jh%$i}qI$i|i|Aorrs2_+T{0z6d z{$y2t3M(HkvCXXDv4kP6c+4otXKVpzQyz$y)#0g?6d~+#f^!D0WAqZ+sg7}?RKsFD zBSk(asF}tm;SS*_L}^^OS>=?7^){){xn2qf$d$RX(2li(F~j5#UZLk@7qzqL+-vW7 zV%MI*i4J2-r!H)lSjD}xOIgNsZuHQFZ|hh(TNZi#mUwzY((vw6H;CNW7`CxP;D`%g zs`N)!92~f4SMvqiQk|lVg#eq>1-Q_SuDVx8nSg4aX!CwWOfrf;)UA&4D8%Ht)bXg( zLRlS_Ylpdko2+SE-b;K zQ+;Uoqu5{Y*`oxUdL_f{oP0@B&-+NGDhB!7GGF~`{;jz-x(rw5RiT02`mVeg-G#Zt z1u5)Z;HJu(iC{r;PH$$SfY`v}%ngeL4S8?Q5p-Vy=n4GFMq`Wn9ti&ROWfw>FJAvl zYsRo2D&UYYV^&|^qzf_IClV8$fE{-!tjMrV`-p5bet%f=5q@bsH;FcNI3;~oUNgH; z)Y4ZroFBpCrb_Pru^O(FGoIBmBs1_HkQV}n+f6M)S<;oVsv3e1T8OhNbFV1-hF@H| zw@dug%<5OQV`=N;9w`QVXve+hO^go_Nz$#dDFDr*o&zgg3>3nvbF7yS?>j|ZkZ`(r+#6pWKDwBi-i@e##N&}nB}%E=$pO=5*+8=y;11u+TU?@Z6RVkdj{-KVm?*S zC&xuKQ^}6z1fKGSgVmPH8YBKqa}A2H4CSGWGGAcP-C6&qFX?dE z4bDEDj2Nmco;^(v&BDR(+n+Bkrar9V8>{Ys*vIj?&geeY7XeFa>Wmn&%RE?rt|IBN z_S@#9VL;W=WFdP}5KtX-y5}RXzD;@=-1Z<{V0-=>dae@ey(3_mTd4DyMu$r3W>LrA zD@1L;e;c?yZ{P{H+yebQh_B_cZE)tHZ;j7oR^MQyqdunaDs-$OY5p5WqwE(*cCjwX zQ}Uz4-O#ZweKNjZh%oVyUDZBA-~(U(FjDe=64DtC?0A-^GWS#8_m5pb@m6nK+lD}0 zc>H5IPL8}43UDX=>)vOSM;{0B3xuK_jpaVwNO}nf|MgCwOIr~1=mCEQXhd`BA^l6a z!-ola4V$Wx!r#n1iW)h!k{`%J-S7AQULOxpI#WJtzc3}8Ojjp)nZoPpk3+(7VH@aX(B(3IhW+A6i5ms_;DGpr8S|x7a$rVz9oA|Hm4)v1%0S>CMie2KwbMg3iRM z`Pjx9oozjVQLQ&-71(zl?4HRcL@I5Q6U+x%AmHPBTUw@cJI&vJ=2-Rc!PKl1?T;qT z6ZVbhoA|k?iba)u{5mE;9wLj=g-DZJ>raAbk3H;_bw4sH^x~6@;^H+Nrhz9-$t+3E6zJ&QbS>O6}mqsJpACLUT|2k=TO6PEx)Bv`$nkG z_I-G5EeD`K3wNXWu=6)n?}Xb9RqthDgv3m7htawf12;GYKfO*;tt_mVifF*wqpj%6 zPqqRoK|!Ke$k^obL*q z<@2y{Db$WDV3nl*AZE!#!13>$E*WK%mF+l%ooz-AlcQF5jzICLS0Qb$4EbH$2vRVlGKc36VZC`+4_}&|x}t&8Z7OY7Gylta$cBgBs5*L0D%Y?cA{Vc?^4QH0b+@Mq z!;Z@nL&|G+lUJg78|6FAXy=qG4qq!L*3@3( z++wG+$FIp6yATW3?)FQx74g_>L`)^@>hycnO$;*6Q%z@!+BN$ngTGMnl4T zNN(KQEQJ;Ci!#T)@~iIvp~-aW0m?P@H7hbW6xm2^>Ow0`H*TQ8p@_e z(M`bRwYcAHH(tscttxBcg^Vu;N=U31s11om;oiMhX-in1 zE?OV<3-fnRK{t$byJnCkn+nuggmzUFaI5PB3#oHgGh&~Hy6_kZ2>cjN>a>cS zOD)wY10f6|ann&0P}@x($JzyVU?=tB(LM4Xkdfq|o6lA?&B|fhFB{e7abeyW6`TH+ zz@r{yTNw+FqZ*2XYxVsy+2m(3#dvnf*gTf>%l{#V2P2QnEAPh-$6^|!|;*nXY#DnU{+5iKjG z-cCf??s)oX;bOHVl}wH@73)rW;?I8nc7?)#sZ!_m=IJUjl!F2#1e7Q%pP+zQ)!MZ~GB2Ju1ukNGHcNJ!Zwjk=J9;mu`W` z>PR9flzf3*#>=%IR5^|n1to!U{VebS#>3BAVsMuUsRQzcp~J}LY(pN{k6c%+gSO1$ za@3rpb4W|BSix|mZG({WWq&Nzvm!~=Qg&G7_l;CRG2BQI6H8Fu$Y#uJ`S zht6AF*%p8%25l49tM4eUk6I5!86lSVWs%h7-e-bZkX2%M^nlu#t$`w6*Oz*P=2T$z#WeN z7Q(G$x?)OHOH@X`y>xd}-s-(%?&~CIcZtxe29AD9jirmmo{3b$8I z4qp$rjMPIqWWU6q@5Hk8KdAnx!P{56%EKgAu>fy-M@cOA_nAV@rnRe7%?Bkn_{de2 z$2yjdI&Vo3?nc(Dk?d9{3C%wY&c~qxiVU2=vu56J^O9vNV}_w5i`sBvt>s zTXwcSFLxPCHs#}@O@N6JexveQie^t2PkRd?c@UAKiV#pn!Q3H9IA$-we#hzdfF~?b zMZmh*O~=$R6m_Qwh1+OY)=VjVIzx`<+rH2>50G$5AxkXg!$EY2D?yQFnSl_Yt(k!Ig- zg1_$mW(r^QXqO&w{pi=gMCPKf-D(G*i>|z~UR%{PvN|~C5j8K>cdGpri7=mmUXXEE zA=0Io_Y=|m*_WXu*SmHrib_3d?JM7ac?WxKVvYsJFE zpS7lGHx;FDj%}wK{KQe(uU^>ynGD60$h_HhB(m(7P&7l%~51D%i!AM!61zZLc5Rcii zG_UW_5gCBQ9bVKKx5-RH&k%5JHXI$>r!x_?t-`N}X$UuKq55RM2s9&TuKt@?vuLT3 zc7Q*{Rt3sNi}G|I9A`br69H1G&{IDumgidns!Ddh!@{QLbe!}x$loboh(;i zVAG0vp5Jv`_Ks_Q&pGM9DT%d`T5<0efc2cm#~nu7+xPhcu?ca&6tC?boZK7F7+8|X zA;6?otfIjvF!eq=8(~9APs;v61EP9;9g*u6)>o6QVrm4m3VhR?dGgj%AYIU8Sx6!L z(;3sSDOXucnH1FfjXk=}ms-17az14P@eJvjFK$PD=C?2O2zb|yWLeL;@RJv^1ngss z{2NTG-B-KTHbs@)mofdVbeLMwJJ2{>7+@@0xuZ7oJ{h{QC{@n4oQ=Qo&R6*H0t{8A zqPwz#`>`v{e^RsGfe<_@Vk{>6vIh*BSLi4TmR>E+x8M5IYP4Xx<=8TTH?T*CpWnQM zKmpeyo}={oKXcvns*5~>!|76yI4X7>&g_?T-b=u#Ko}~1oBeRV4R~+$Z}kHOhKlAI z(tl_5G091fGd%0;$c4*qd|g5GE8J_Z$9xq`sv3_doGd1Z#{@q)w! z)|PJ#P>ncMmFBM0BA+=Ldna*)m6J|wUp;rJ2WS$^g>NYDIi;L%c(Q_5W|yT_QGEfc zzDMdc5)wUr5%us5zqXODNN=?^=bjL~`FdT_o}d)I)8oqf7D!zmE-2;|!IV&2>{3I* z;u`c*F(txhnJY)Zz%mi*tom3*tLn;)^l>tx-6;k!dw$rmsE>=e`ImJQ!UZTae9~0J zb0M3zWATzJhbo%!kSV@6H*o6%lFsel#8`yR3(VbpIoy$Y)SlQ3wj>4ak<6wJ+7O{* zMaC~1GF$IDwH~-?SsikIxgd#7t{h`u7Sskbr$h~{-89kY>DU=Hq_jO^iofMVt=1+a zZA);bzJFNQAN{8P_Q*{YNB7ylRpAS%gg!oA{i0F{4u5R4MaAt~eoO0AGnyV-H~nw) ze!L3m@}m^u&F6&KKSez>SuCs^xTB(Hy(kWHw2@msu+9-`=&cP`_L=2QXD6By z3V5A-o4;3rUwjA1)2zBJ2|`Cx(O{^-3!4eTLtXORUEV7GhZrss^lzan`5mQh0e7V7 zm3xvA%Nt{b+Wi*cbEj^mmR4KNGaPbbAAZFpJ3oCT@3Pz2RX3?N&;+ga5p-}+WD?K^ zU#;qij=RZZRu^S~UdWy5>#%dufW_LaG=n|+vSbSsj6C$MO(#lP@52q~kEbJT3OpLO zUz}=w-PUESD<1mQ`Kx}d-tO@@{(d#awdrnmit|YWbE46{mS;ZckPw-2Aq0UY^~(hny8tKJ8I*my{i>l0u8DbCW|n<@tjxEvLu{H z?pr;8)-seJ7+RonaSNgs^)%!;U|h=V{J^j@Z_UDb#=!luz5ttWUqqEfyRJETlPeaB9tL6<+x` z3(#}#Mf%e_dFKxYbPa{EGsb^&J(8HRlZy$?kfzrYw8=vVS<5HUOiAqt7Eapo2Ftgb-xfj6Gh^dwId$TY{$#Icv%y5*J9O3^OqEPvzCOY>ySHxY!q zAkgAp&6w$L5`~!eHrhr6rSr<=AZtv>{JDLNV6eA!K5R>B(oTCovA+V~-E&%|z|^OO z{(!7c!x=R5^dd>dw{jfCMRjT43H+|NKV^w&_jV*dl*N{!%dv+(sF@$4J@ng%^XUkW zAK@c$3<8#A7yrdHh$QXyJggi(orl>(I7|TRdHjB=_r6Cv-2YEDLpdlav zx`PJR4e1;CX6m$VULvw=-DaU}K}9g#j%v|3)_o>M0EaN_`qBNHkn%lcpUjvBUH#{{ zNBHTT28eBvZrr9<2rAiAL>^=jt6C>z2SSGKAVYR|MFq_Mub3|Tm(H=m6XqxXwC-;dyCx_q1KiX-w&M=+2k?Q@1RjMj2 zl?hW51)QM035wS^j{S^rOYpYWIc=}QdHp?riQ*n%)Ip8$tqisL%Qp{fVmnpBsFFBP zFMT@)n@Z&RSkNBVZhTfkxhBJFvYcV}T9j_z0Omitnit`=D2l~-Vjr{L`ph}5imnT} z+cI*YZSjt$i{nalNX&opPsW;uU325)h&plfR>IDzErx?oCpOuIxns63U=cwQPQAYzi*^(c&X%!tllLgUh%B^KAOpAPk zQT(mVUy;?)`x_Jc0;WWwVcxwLb09|MCM3TGvhlE-vBJC^S@#5MntP~<9oUWqmi|f$ z{sGqm!qHP`o;M7{0{ZUVuRA*zQcQhK)j`*?YU4pWwwjgu$kLq?u%uwNm;GYybOfV2MZz^W;yvYZ_0{e*V;qvvvjG}DEpHz`GN za{KX;+AmJ&c@#f*aZ0WSaW2ZtRp|IpwC!=RUWD4?DQ5n?FE8h@_rJo=e9yDokbA}M zrSciz2g1Y)y=AEI^|xcrx;bZ$|E2+tJ(T3-**7uVxA$|iPyeR1d*8eASNwV2Wh48A zr0oE?mG~6O^>nK*FjDJEqj9N$O&O{(j)cE*_6YS2nRn#mU7$2NLlG83yo%hRCZS1!95I%N)$-3K}CL-x&uE}Y8 z!PJk|(dlRf$22Ys$HsrU2%v(ui(A#BBa{Y03G2Kv5%RRAW6Ej;-MrdRDdRf>M%!`; z$ThoFb=;xjaT>91-}%f5DVegcKdTi%+hMp#HO%!fCzg1B$qL6vED%*4T;4;+n15U^ z%*L?}>M3oQG=-NZH^_Em)|pmHJe!a0(tLC5Kdq#0J~3?WhYc!~(8ASXYIt1C2k`TT z*_QIAyRWkh;85+*ADn9)c7bDA)yV?7JH>1gOaN*j5SgVg2;i3XKD#tKOQEMW^S6#jN(GcrzEi z=DPq@*v}G}eI9g*lxiBRQ(#9IR3KjNu{OjK6g$j+Nuwo z-|uAq5#G49@_raSg)n=ITf5s%Ni0@GrDOHE!D~9;GRkK04y#RTYbMLdRW7L8GUsVbx*KiOrX#k(78_Z<6<`&qK8?Wq@2UF?@F< z7`XXONA}~4#9U)h8%Gqeo#tIjC4)@mRvr3B8y$GtoZO=70xg4RZArb#;F4;Z_jfua zFzO?B5pZtnY1dVDONZe(Iqw#J_%}w>*N_pyg9TJyRNOr^a_{%tu)?_BFSKht^s9|q zq4iO5(6%vN9=}eDW^a$Q6bYqjfo$L&if~O&z`6*Swh`!z^ePSr1hgcy>wIz#w;S3E~Av z-q5ka2D0I?Fwtoq%aYSF{mVAfi`mDfEauYG>$&eHAHL(_yt_#LBQ9uR>4LSxWBUI! zG5h9;mEU^eCN1VktZGZ_r}&1?GsJlvKjl9~Ob(n&d#4_8+MK}jP@im<;J=??%rEd1 z8OxL^8Fx<{ZVWTa*xXauh)ukvoC@Gt%PwZ|KC z*A%<%#9TV|%1(uu_TTkfZ3?zy!TBt{;x&EbYsWCRCmjZ`3Yw^BepC(N64bE%ctLOW zFe&xRnL{a29kpDjEcwZ$MyrTiv0XpsXxtyC%dSgBV1J~Yebf7Zdo@ozfrp1|C-NzK z!e?ttb}d1gXmQnbt2%tW^ZdVn&{)3YbJh0$SW(jNg#2(c`m~M%@f6O0_V%3r4paqrWgDuKAbCVNfdFGE6E!?zqNQo{P5K~nb z3zG+t!~_edT7Ng;U7BmlUSIovWN((CyO%KYah0sI1nl0IZfaRI6FCLYg&-XI~`nX z2qiTPhj#4#WMFl54XcW+4!;h34z9|1Q5lAs_*DKlBB@Nmv2p3Jyl{9zk`$$yF}QKB@X3#My7 zkypr}9H3&O68kD=*GhS@KWC$l8KY;uQefrb?<83f+Z)wCHbMqF~Z(>ir4W(g~|Zpy6Pql;5p2RKW6jEIxNSf8IcW7{uGny$Ajuw zY!fOG6Q0aI$~JS1{!vC`o#O}d%QC`j>dK|(r30EfW1&<8K8Dq;r>SSwzdI4k(5FGy zFSek!nJ>NQ-{)};v!V6VWGjZ5ADox>i0h+2%eKCBe?lWw-Mn>Rro3e|SF8Z7#tzra zdPuDYd*>t4BrK5Sb!s_l)H?!`F;`LML(Xn-;my`ncs=EQ!C)-U#`X%K=3l z297C={@B=q^e^|Fdcb@`y-^)X?At*Hp}83;RJ~hVyx=V=4#?T^S%fU5IGB)qms#d+ zBPD^llgfg<*K5_I{{>e@;cDnrL(6tRulBh9bAb@WD@pb_^9zn-SS8deaVGzbE+Htw z70sx^RmG8PHis5QQlqo;`_(EztnPkq@|s1o+~+hqY{2NR1lufXODew)&B0x?#y4g2 zMN5E{9`%h->%C$T_D6ck5yJi2dMdlBuz^zS&a$xSH_?Ovy+a`ii2UJkYIuIkxnO4^ z2%Vc;$(xaHjBble9~Z@3`9zxU^*U383*8LX2V;X6nP}qKw{j>oU)23EONAef65k&IYDMD}U(Ts@b{pBZy-~*;&i6lCD6jlj*g&V}DcOgtquLv+?~6SP zxiUs|7IZsk=aJ8~-g=(r^Qb8D2l;v8=}Ceb@^{@ca+Gn&_VH*4QJ*x-IRKd&Ulsab zitKmgGq2oC|Ar|;ZHY;cgI=J=1UxIpBi&(zq(5N2@}($9Y&=xgW$=^da>QQwDPBn& z>e;%2oX!Yp6Y~+G4Zs=_Qy1H;l&4~1A6^*lw3yB`8>`}S`eOp3dFdWqKxUeI@&v5Uh*p_M#qKx7*G?ekp z=GBU#|BzApj7NXNVxZ6vmk!@l(vj(^=yd$@<$t*@XsqJ#FmTkj?sU=v1#J-_nT1EKxKd{%{Zj|yvcZ9ilSPe()Y7HCzMiOU`Birrp)<_1P*!QYV%_4q%(wo* zNFHN$&PcPKo!`8m-!Ndf1%4HvhmpvF(n7K zOc(Q%*NJ^6_8lWOo=ECS=ME`>fuxX}1A@+F1vQoq7QX6_%SDBtq6{iSwyB2iChS?* za%@#UMN**0B(pDy??|d6d$`g0<%Fjc=oIy>l4nYLhN~m8wjG?@F^l`Y(S<2WUoTc0 z<#`^GT?DfN{vakX|AoJ=vWy>wwZ=adaE1I}{a_nlvSyE^yhHQKrl7pnKCNmMNl%W zrXFZYh@*=dCf2Ef+sj6*Ukf^7zx0MTsPN5%Fvi?cFP<`s z_x!iS^1e*JP)VVQrLslg>cV$XomT#?Bj%>ht(uH3tKbyVx~Z(h^lMt6>b5>pk77qG zmTM~M(Z@dwv%WR?P#|>2@Tg?!v8b{z1*W|(WaF7{ont7$t$cVVR}&pP)7t#9Mhf}U z?W(_H5Na~IdfH*93a~|(AUsgQJzVw6_M?rH{Yt*;r^dB@bT5FxA1&NTJ)V-VT8!g9 z(+FkUH4hD8VApsaXZ(hiAi-7If}haUu3GDuG7WLDUDYN2>bFPtsENv}T4IG18e)4w zcJR~%6JEzKLV3^M4F}t75MLD7$RR1!E{IF{=m-^4-HLWqxZUbT(rGF|YJB$PVF>{+ z8$lvx$9(5u)|ax5a#A=UCyqMd{b$IBK#?-H2AvXGh%0i$@cPDimxhXOM=CK}yijD> z`&eeH7cy6jTsw@O_7{&!UnbL){lotMjc8=1_62~zU4h9$+mSd zv?J)e=BMZ766&2P5T`(xhQLlL4=$@sZoH3~XG@W{px z(k}dh*bm(lM;WsAcXzDo9ZrYN4%YqA}y*Zxs4qs zOR;c)o3^p8#A+2r_f0;Oii@sQz371cTSi;|HiQ^`nW@`=A=z7BO{M&b?de~+W*3;H zji$9E_qBX#lb7bk5;dy;n-<#0oYq*8N-ImetpQI@cZKrQVgGsZOdwRH1QM&%^r@O~ zWmM;l+f}p0*C{TBJ&X>Fn|WJpu;%6bg@*l6rnyrGPb+1ui-~hIVU!|-J11F#@xhfv zTh)NdH=0Tj6%nLG(W5$1_U+gf$^pvBN$1cfc78vVWG7n;-Y^KzQYvkIo&?%-d?KL? zxbb$UjF}Z@$P^5Lm5a{^mJc2CtN*r}=$X7IbeRo17A*mJar_5mPEsF|(Q`F#MM~=A z&e#_X#uJ<|H8pbRH_AWGQUZ|O8(O@WK#=bbbEL{B%mB!;q_!8Z?0vG?9Mh#3;;dvY zi!$EYK-LJ+l4v_xLO0s0>|CtZ?+*Uf1sJR?7ZA&YB@KtG3zE@r=VROHA2%hJ=57by@YdcT`01Ry+W!#%+z*iTASGaf?FIjOW+xUcvl4pQz%x^6-mYgqdX{WdrBK-YmG%HTt`b zx{PskoK)50ZU-~a7;Y*(D%jy%h1-PeYJNHWujWMa7SH%`-x0)38{n}Mvcx(}qn(3} zUgpJ2E0s5t*D$~&PU6{<4|3SmTQ|}IlYLzHBms3g8RSG9O~|1~A3}P;NqhX#I*Fq9 zmn8W&7bU8xS`hKt!jVnp`;+xV3V2?Bfy7+%tcSz}Fks$yd{3iOpTjF26H=sm7sxUt z+JOagjHT+>WM4VUq%&6PA3RAU-G`ry{}@hf_=O&~4`{pALMlpL{2CVQT-o2H!Stl) z5$@RqAV@K+}bfMjuc9yn!H>)4-Vyp9E50*du;zF7vsBZPjpt6<5 zZCb0XGQ6!h6dA5LbDU!E5J%oiFL-~>fDIDCbZ)qgs{vkF;TS~cQ|83+7YFIK%!8EG z{R#O&Zd%SeVz(bd#Nm7PaA_h_Cign-Av*|1e@Z{U($_sx2$Wp&&6q2GtAI1f_bGy+ zFLYvZYb+iXR>agNl*mFarWmAREEDX2V07*dPnqAE`rpg=MJ|;z?#6VACSvUWwo^;h zI3G(9nQ{M5Fc{`iT?FIRh%P# zfMaSujiieVVo^g&QB$&PPrnHlaAhO_i7qvHjFzI$(Pq!z0+>VlXYvE2F!5`>hJbvVt z6-1jD>^DnP;$#%(R81*BCaCteF+9n%n zJ>xs+*${GEnBje6Wyzt!>%+$dwfdoFAY1f=^)XM*qnj^S^Xo7lwarqoUQb-F$AO`h zO7Y8EUsWBp_2eq>f%oLWBO2zb&2%+|Wwn%NprF}&aAfwnS(C5F18;%(C+iLQ z9|1!XDM$-*u8hzzuW=cu z7yXk}qabrqKSWc*S5a)k508_-4SRFOW$U1(ho&tLXJsqr>amCEUwzyxHk1Z!byn`_at#NaRlPiv zC)Azu-^|p&8ng9Z^z#H&CqWFzlAaCL4o%Z(!tjk@(i^yG-R=3hgJ5~!qn^{d=Hzuz zw}64gayQuaVix9X%_jrQvhpR08|2cgv#EoB%sz*?*uG#r{yZXg34OGUO_a)EOczbM zByx}EMe8yzD%PshhJ4QE|6#!9-=e<(eM8TX?Sv0hy{*^DShr9TPhK^HdcQATyYuQN z`P0YLi42EyHlQbeV2pYz&0a;$hE-Q;uP8=-=ZXa!fknJ)_@?|6$qIg|I>4<8eQcmM zQh@V$P3)Fz0Bhu~xQ%=jjrSVpT~pz)hG;wMB7yjJuMjB9qDPl7ZX>*QY%5XH(v2XFbnhQ zb5qg()W893>6uabk?N@rbW5osgb`5ZvyQGw5vavJ9g-H~>Hx3~9MY`@6i`9D=&m$3myB#kNeMQVqD}x1F;#*{P?A3_+ z$muvftI%=^Bm8IXlz=Tn-0T#-nuTB26kD*UWn+;y84B{KLrn;V{n+u;&P6MkGxhfn zu4RHTd@2~2m;WEUp*0F%%gS8V!^Q@Gw${T7eQExupTwP&p}vS@3C+qj9FA$cxpX0KR1)_s^3xFnZ9Il&o;PT$FUdzJ=?gz zj%{6@&|0Tx2Cuwr(TjzltQ!o_FJ=f`amwJ+;UCt6M*_b=Gk02!Bm&7MvvGTfT2`Nj z4A@_LsANU)r*c;$;aw>Dcyzkh#Bv4UU!66tmq0F@&RCm`6Is<_9UtTOTOn7F(*IDo zLvp_P99iP%=(_8ZK5=t$o;+RM&Ga?(-5J}a9-=bf%(qRfX!`)C;aV+K zUA?|rW?wNZf47h@p@;6hwsT7wYCWXL2)brdF|^8!9XToFVR$zahY+O=V5|tLq{s+l z6t5_hy@C=pv%D=njaErGf19=9^$h}VXe(Qh@=f>8j{~(M+C>K%=WH?vUv$6ag4;{* zdOL<3$(1yZbXe%)2H+l|eZ!}Cz8lm$2V8p9#x>3mVo~&yRUwKQ?BrUV;p(WY3&uWY zYml^4X#}U*>Px5@^qFLBIzAGt1YEU(oPD&U8>)1uJIL_k&c3+b8 z6I4}DD@zWk5BupgaV4cE(}B45agSG1DG)aEX}MxXfoyI5z}P8MzmqYIy19)?yR{{1 z+mb3}c5O`e!fR|uxD)Ks5t~!5qJQOuq-6LtdhgdCR zc917Fc^v%rvk+npZ{cJ;;(K;vzd8fbYDs||@Ztrf&V;6VAD;aIY9eFoV(>!}Kh;ip z_jVM4Pf-kemDQI$v4t2p=J zWmBg)WJhb_luBEe4lps@5m+X~#B`s#`1N_vHOcr{dEK%Hg!3L3D$foI728a`{UQ`D zv~@nqu+W}Tt=GmZj)^k}1?CNJOd<)-v)C7R1@JqUIxd2Lgqt$H7#G-_R57PmhH=m7I1U3)QCLrf|{veTnjMqFpV z@)E~bFj71773Rt&92;*&u8?LWOqwpG!v#MWv?1$0LwZ{%b2CX}VpX~lpdhWx3rv^S z&xTDy$aUB2uX=Nd1+&&_)^5U%LHEZ)@CLW!5*r|iFV~kIA99;pqA?m^o5fF{Ut^Ffs~4{ z2nDIZG2b!10?oEjcXQ?qG>2T)Z=b^|vFFC)^L6lqS>Jpmub6Cjl@VVVkhizXw8AYh z;_$o;aUZ^oE~vKp8FPGD!Q$sR`!9!_4`9)^JadnltyRkU`XQ}ljrI!=a+LGCR!8`t zP32*&4%%ZoCuRlyHf+^wcF?*JzPykOsSK2EyosR$c|`Z!ITy~Y!xVxAtS^YOQ5$EkmXXC7}RrwpE1rsi6y^?JL5f--am3r|!=w;E94Zo6KTeQ~h zEAg?z6#YCKK_E|LL_Ml-+UjgV9BUxeK)xEh5xZr-M-a7i-+Q+Ot2M$zTM-_7_gkAL z8c94=6gpQ3YcOtU@aPU1NWI+hOQ148fW~QIQfGE(oEFW}MFZx>5@iBjJ3ax58DAa3 zK1y*D4-mH-o(ZD$b+lS59}!eiA|=H6FHhE4P)19z05u>NpBf6Zz86P-*y7lHp85}e zN+pJ#%#-ka(h6de3lXJ%f^ui*Uis0LvWDo!M;Jpl;-RK}S5iGcmfPGg z%eSb8F^ZOR4N9lBzXBT2rcsAUsU z?7e~{H)g~u+XHul&PZhY`#tqVbOqEN+@PAW3AcTFNfv&hcvZWB`emL)>kx9fNJUZg zJ&Oi&+$eYzZo5THT-)w8VVs!eYUnzrc=ETqWjN12djNV>+%b7H&|kv>W~#rb2It7? zR0+$B6{xt+Q+*e$$|!t@dImqNE$tW~*N&a&FvyDRjc&w%gqX?<>WA{k(~&WYQ-Uer zlv)>iA&oNYm5jsI>gC587%xg-#TXJtLCUgz=r-maIS#xO%-G-caRZ7TPfYU>6{X!0 z{LASQ@}328(*DKMhY2p@jtu;fGy8Fb<$bQ<5R2cu0p;kjHot2IZyc>NNxSkG2ZO%J zA&CbeXb?UH2Z@P%OTN%CVu%zvX^pyxyu8|)4=$u9#uAY|O!|};8+*Lr+l!^RY-oTF zLLr9642M1lf2}-6dG4zA%C6p9*tZP3qMH!WsGa-FoFoVNeQYA%`<5O*ic8u+tozjo z*#FrdyE11vm$Hj>2s%-ytCp zJuQ(VGeroQbKUX`1WF?UUcK!!H`vSs8R2>S_iPJFl#}(m9U%VZwO<#_-NF_aj86>` zrhfEB{3G1mp%z?oNAN;?))B}14tv;#^rR!&61D(*Z_=#t@sVAuB6VjZ;&0|>gfgW@ zxoMEU%vimGu8be}&9_iUgQ`Uno*ZWp+kNGU^AbN}-G zKI5AtXVFp5U}Q{Zz0DKtw+DF8?DsS09Ps{T3BXxK7#?q)`;#agG->Y|a z>|{1G^Q^d!%bg!XZo;?fSiaUd53nH@8{<>9=ul3hb^_%7IlEY#eHNn zS{w(1H@qrI-^(f_phtiKGE&(Te4BE-p zbz^49Lo@C{ax82Hh*zGm^~ycosG_km|a09YdXJENrkBxsyo|;5u#fx9`eTtsWVOG z{m8i^(}28ss!+jtzrrdoGq0>x_ey?oL~T8aw?x3R8G;dy^&}?}dmQ%|g)VxvZ8fe* z23*Y0Cz4)e>Qb;(IhG5->yI)le})p&W}P<6z<2C^MV3!Gz5%3@9ZyC3*cbi!iddG4 zopn}^mEKv4bKf)7ZmM<5ET1(Lku4py0>4p#QYDFzd|lt z82~9BzV^B*-LzN88lSV26|`Z966_uT$VYH2PA)0!HT-CrrEdI)P}<4aJ^_7(<(~?^ zvNNztpA?b#Z2{9$M5p>LdR$p>a{j%8WYyjWyy5{nVBVg&vKzruE@rXI8{ka$DE@n+ zxr5@I_>9&J9JO$x%^Jo~yeH7+(j5s~$gm&$#(l(0@se+>@Sc{&Q=>SC)Z^RHk_P zVv(x}@pfPLx4z-0Ce3WAwUFYd?w|s=60f;s&!`te@MGT9hrTN+gI)>~qflyXxrzDL zh>I>F@!Lhn%_$q)_hQQekVn9}i;>Gf7= z(zh3(Nxs}PNM($!1gxEw;DYkOq@Dr5XiJ;1mt@CiEw;hLej0= z_xirMN()$uPzT>i-xNY5L_j_vm;Ue_oE0lg&FA5;*IwzzB3W(qCtS|1c}DF%-mp?m z#PY5>NVX2elDd(bEBk#)X59A^9FMFNd8L9KZmh~54krsrkgN?5q=IuJ4!g-NdAI{= ztY0(k(F>XxN~it-xYB!sBl*Sy*fY?Ayl0i4e2LvYe=sd}u_6+%-7 z#04=fc9W^4!w@B}-rmoTfX58Z^xoI?oaRJOx?2kNiv^|pM8EU6&L-9O-A}B7a*#MMmaAy=X=Ip& zr?Lw_iM1+aFJG7?a_Aqk_e)MX2Qh2a>Ib;BD~WgPIcJ(3+-Nzqe)@b3!*UQaQv4~# z?V$XN1=xDyhM7)kq6rYRATk%Su6kdK?pr{m(t&Xyee)|@^pD^;0Q0Bo_jQ^gEx%RQ z1E$78W^9Vd1+?A2O34z}X^N-Y0ST3?Ng>VYHXanCoxJju6LtxyN}w`YZC%2iwbQwY zlz=Px6SVJnL1o`9%||(vXeA3U7Zcfpq+_~pZmy>$+Sifdabx8U)DE0Kl5y> zt!f`9wQUs>+VDSkE+W(@*g|(#YPzXs z!-X5y>|DRH+tYWP`DAznsozq6$I#9HcPQ@rSN4z_K|brA>iN{XY8?q#$TzRSMXb@3 z-14_?tC%KihMRYwA%X6I{2+p+6Q==3KO>^K4}9+oQ`fL6iieM{599k%PJVkbY{L8f0o{P34nU^vnVG%TJ;pztKhvfVmcwV@gi|0dtyqGt*vt6lAp1v)*dj$wD4IH@KKKl9(rYDuf z9%kzIy$H%tzL$AL*s%XDbXuT2EwFC8h9QATm#N|7j=0H%I?JzGKDiZ^EtqO;Sg*c^ z>|Resm|CBnwR<~?T$q`}?gZF4$9kW(*9{(oHWmOJ)UY%3Ge{n4aK2u>HJ7|~XHKUb zF`XBTzK3=&CV!o-xD-FZg{-}ss6O<5ulA>xm-`pS?fw+OIysRmgR}r1;^xp{EqloT zg{kOADKTnO-{?aE|x%X$~hZPmN8HL}yoAnELW;DKldm%#e0+F>WSpNYJ|L+FET~HC&s*T{hwH zz3;Zj2n6z_9PNd=xtpi_iW9wf!-66%{fxnXuOA zKCI-e!zrvtJ}b78B5`k7$?llK=?8f-yGjb$io#XpboM3Y%p|$5D>klOUG~`$$7J}w zG$=k8bND;2vPr&(%4Mx;6p4m)3YA;3;PIGwjAgEJFCyCu@-ve-wT$a zK5}Y+(tSd6!xYEql5n%2{y)aO4Fycyg9=(MU-(d(1EF%2q5iz@B;UOYpw|?tx^`z$ zU&?7%Wjr2Mo^8p(M^$>8>79fmwm8vM(myzOUU|F``9ilCW(q^E%-gusp_}P@Sm@M# z@103?I-kAbuzOCjSj=Wf?m7v-RVu~yN_L2_<^@I*sPj{H(NH7c?l}Y4{%jeRy_Pl8 zNnps6BR&a?F63{F&ST`V={Q|h*ZgA^Atr=(d1BD@RQ(9{ zXc1kLQBg*Oz7W_JY(Ad@G309qzXf>l$L(|GgBjV#L1dC2agh~{RO7uFfn@FjQ?_UL zxz5t()ct1pU_d@&+V6=c+A@_Rs1I172Uabnrfum&!BAS8Vx!NI?0%MP2A%Hh(?pP8 z${Uwf*+O{`jET-_xIp3jiqyFo0fR$0=0!=uNi%MOz&u8of8 zQHSjebs39ylhMh`_qNQ_&{ss7CZA0}8|CzAnk3(fJ549jGo4STRq+r-rRrlNKxW+W zFtrHRdx>Vqc^&~?8Yki&Ej4zAA*o3lXcO&TITp7dlftZ;fsrdQ0kJLSECdb_#{x&6 zN#B{dT(*ll8DvZ?=IV4c$;8I2GZyzJMrNBmHJ zU^ctO9#cpw?)s7nZnYkOON$z_;=+GF1yMxqsus%8}5NUNf_vEt4ZaA z%k@OgP00fR;Ypfm)2wNFQnk0gCWpBjFHb7 zmQRW>(yr4XtyeVBJprdsHHygQev>;CZ)16-(IUtrApg$DB^yEm*?rB#s-Y{S<7%OT zoY212r*1==yFFQn0@=m0KB0W4v0+tmZydEM(jM!_PPy3{P)fnk(|MsiV;e(JzD2+5 zDt1z)Z55|V@@_O9kv+kc6jj^jeMX9P(PK2h-w8TW!CwcZ1#X~tf(L2$aaqVsU9?Lv zE~y=Hcn;8|d@$&?V8YA%?T0n()3r_tTCJ?;ZomcXyyVoKn^vm9*aO_Bs}!qJI-gKA zL!#lbS7yF68<~j0-RW+VMnN}bixK1cak}3pZg)MjMt^F}tspGfddFIiLHd`{H&QTr zjn>2CmOJ@(0-yfA~Q>-XL1}zwmhH!4KqBb1Q%I{Q{jxdk$0{s0VU-aDkmq zQ12!OyAwVH_>^AA5-Y0l1^I^5Nw3qperRITsrOD3RQ;orFGuAO<5~7(X{X7?^Ups; zXD*Y!>Z@|$lh=aAO80gj8%`BOvs5cChJEX(85Q%dO&>(MW&RQcVqlGoM+xXb07Rgi*k z=>f^&{OKkFK|l%Vs8Tbp##dph$*953#5SGDP*LkipEf#0csP!B0B3_Mtry*bonGKG z8oWt=H49_4+y%7ea8i8>y??S)kF`x8Pe84vXqY1+nQ z@^bHdM4JdU+}*cgHDSlN zQg~)urcU;oj9MMs%icHBQ-O&KcXz*XfYmJh%jfcNY`Y1%v3_6j*F0{#1f(41%AWe&e%-$7P4 zv~a*}jnS=!0DuJr3wv5B__Kr<8;5nImE}LC!10H;h=BQkwr$*|*nk*yP+WSe4PeFJ z@`rY*PP85G#_>S;B0z70*KGmvfc=3c)qB>h!7shU^l(hb`Z7m`(Ye>X9%F>Tk}HP} z)f)?y(5vj(>JV3>3payz-uVCi$Y}2Qo?+7Z5sx$`|WLZq8XzGSBzvF(h zeW=aJe3N_Gf*$lXPLb6O!kRCA+NH_lU5~{YU1NBjg{afz-l!Pnhur5w8c>0gATEy8 zF*400>Zsg+#2`W}%f;Htg8~wtDos_@{s9YDpV@!aWat*$=l49HhoKUkW|L&2wLQJ} z`V`Wc`T79{nfB&WG(@l`o?O9e;`5#+{e^ooWG2)TYpQ~G@9>qc%NalPZ>k1_+v3OL zDqc4fWnJpVN5ybKW6T+}%TX2+?aNaP@w}8?w>0ug!~-%nBJo{zdPwHC3zp@FsUQVB z%{$v%XkUC(XQcWhd?084HL$@}G$E)rCbO*G??q>YfQiq`0G^TRw~d%YIhH|<6B*QE z=$<)4QI{t^N6g=<)wr}xe&Zu2inA0wP^Wl;f#X9L^1)Ndlc0C#hI+qTT8vFXt>W&a z?ll2ygTTq5IgnoaX6kfhFiJv*nQ39SgBDTaxHefeb>v35JeLBGwOsA?iYY=DiWl2E zHS}sUnCb3pKxEyU$5Ra47hE%=eqR;E@?VqnI~((>TprwC)m@ExReEeqLN^Nt zA|YmqJAZh|= zN|dc1rP(G)bl1`ayOTssvXo0vFCio-T;b^V?9uP}5%}@WJeC-;_dydv_vPra%A2}u z8`pj|j~zB6*dPb%X$MYx@4O+j>e9EDEesr>?6RQcbysRJ{~EUhz2F>rmUMv^ubwT* zwd{I#1C_kLf4!qXCw z&p@)-yhxtQKT&%-{uYRSg!w{q41F}=at1AKH>rL|Bnk+4wY7iUeW)_H%W8VYX{SL5 zTuA+WNXc4M8$?N+d4-_Uqt6;Q+Hf}4u+aA%N{BmN-M4Snm=eiTRfXhm$(Mv)0-8Cj z{@R}p^(me4j#72T?Z=ZwLG)pwsl6FyO0QH>#i+6$+XCg zsoB8oRl4s;_RBSGZcZkbCS4xVELgXJ?DIC49!BALI6g!N-h0_wKq+JiHdH@$p(Hyi zXCn#}RBiBJs)*P`f03W-ISd}e?MB>xGnUqU51=~PF#R{>>8?fqWUfZ*DRNq!cxQ| z|H8K~@RHh%l&8t7M`c}b@(LDk&HM)xmo=Kv3Q3Y#p3Emq>LSpk#NB=MtQ~XvWgi~Y z4e0{Q()Uo`%0psmE{cPCtN<>i99W#(WQ(2FT=j25m5i649rLDm&$g|c%MRf9B(J4;1dWkyK6ZPNd+Fy80KA7NQEgy>751#cuM7y`9!vHxZ zFj~Q(URt&WAM~MAyG}fB*wC;Oj=VOKXq(sZ+nrfT%WM;UemCDOx*RS5{h1COdVVe@ z_UDvtIsj(QZYc5%?vt`S_ps-LWMN?kLx5nnXuxvI&2+*Zp zt|22*z}~mapkbaww##SMPycy8z;f~W^9|oU0X|nXU~H}~L?ga7E}{+Das$2wasLo0 zLC~v|SmMrJb1`g1mRi70_vE!+3yD!Xv{`j+tE#wX-TusGdW|z>^vV8fx@y(qaUVtl zWa)sU@@grjj>K(Zgz4`Twr!BRu?q7paf~g``W2to;8#EI>0tSDcPE_0P-6+T;UVUiy-OMJC7xMDv z*N#6SofhcJSf4wC4$zAalukbvEgEmxGEn9cuDVB&A#}9@dsL3ya5XdYtXE-fgdyZIAldU8OBBbFrQ_} zT<{li0cAn1mE&c?UuV~LSklXzB-UkNVxxwSyt~&$nSN z%y)mJlu})7{rl}?j~-s-+{^x-2$XGVA3*PPmA3FDV7JWKD?Y6j?H@M2yH%%`(p*l%oV@dng7 ztc!JWQs9DWous3h3Ud16h{4rj? zBoD1t_wZy`@F!}4B^O)4hGAaD7$~KC+Se(n>Ka7MzPA(-PePWtb+5kiyFoKD|-#JinFH^EIK8EK`8xrY@Vc;g5;l3q$P?|K+Pv zvl}+QWdx3Pz76TFMjr8)G9qcX;=_kJXJrwAZcRg}gIgR$60;}oX~dgl?1|? z(#Br}XZ8}!6d@l*GfK&fMUh-S2uSd6@$b3DmTaEBr@3M>`3z zO|+&@EMzNcDKhS$b!(@tElA{GYhgYppGX^aA4dPJNvx;JwmORbH<8C*aQyFz&sOdQ z2r+2(AU6K*0`0b!>Q9BaVzoaQGG^srew-_@YzH1*E4Esh#k;ZRf$hmKul%f0X%#FKA9kwLk;rDlvD;U` zy%Wbn({nu;wS4ys2^1q)u2^h(A3J(vsUsdAw+8+6W05Htw@QMC*}bcx$|PU94^Sd$ zJizl$3hLc8ox2y06jfzkb3ZRha2o8CVm&8v!s1=qaEz6jY%j`wQE_4C^5~d*nfhRL z#~jUKnxibKk?h69Yp8xC?$sM=efFM)Jw((-;-oGI*$_Y~G?uz~%a;IR;N=X<544OSZAwLW@UfvZiRogrHJ0k5gtcEU%*?1>jYq%NLKQ|2 zH4E*gx}Ju!BQZX*iT`a&2wS3DO?7XUMd)_G`ZDet6oeEC@|p?i4`5S z?Ufd~CT*Gj$ES1)rVs?fedLF7lDA48;9t1=6Fh6gHF)ck{rK>0xU|hywD^}T$hzHn z`&MhD##)N9Pm$~4g(UEm?VCI9A=?=f1G@jG>vZPi8;+u7#d_BW=8x@&i7+cDZ3xji3t8?>5C}b@qxds}-41nfb$(ZNKyZbRk1aXMjZbKi06u?Kr;x1HQmz>DLLq%)x|F#J z@`b4-Q%o)wMD+^`-*r2ehDBa_T~-JuXI}M6_c{=^kBSv<}iVOKDclJLM5^rqT-2Vg^ABxSZ1A8PJib zRV@9%q96bdxzMUKq}Vd$rX3O{zI457C%k?8o~A^>uF zKh5jGRE{-rI>~zND{(756RPZIfp+M4gEO2cRo<iR^`^##qGL8yFMS- z4SmGr3Nn4KXFC;mlo0gPL1-l-VuNNIGxV86HT6d`#&{E~|L)hUdfJNBd3`jhETGo2 z_4HU>sKJV7A>HDnosq*rBkY%*8&Ji~wsFC>ufj4I&|PSryA_vqi0BH(3CM3%{WIxG zfz5`Z;f`eraZTx+sMW11l*{o6ZlalpLvSGYTO3&92epXI0Y?Q`KB96Zx81TgoHBi| zG!aUj-~jBmpE~!~SV8Mwi1|hImw~eE!mO`$nUuMzX4oYJ+lR70*|_!kRHL(Pi|HfA z<_1}7+O2f226?3st#sBqO~UMi`zPl^7a6W*7foTavniuVt z-oN0J0>3eEm1n-f#LQ4=FX`dy_vXOaWHoCI;?R18zt!^gOfqgkSzebU^KkdV-x$o} z(Mwch3@fMP{TzgoI(s$w9M^9BGq*J1YFDrfo~8CR#`r0+-p_kEw8(BGJ1_FCYR2ZM zjSeHJp-nYDQGjk_&!<|~nw2&6ao1Y|21(KEVRGt`{1f)fh?BC9iUnM2FT&kr-F{uT z_y0Dn@j0-mrH5B9zp%px_C0|(u{HQH z-*BmCpZFTDL9MFwb?xObG4dQVBjwJGl;%nP`H!Bfmb$MoMPk5D|5UU)idx-$y z`YSG|p7^HQashUao|=EgmLihdB1>e)BiZm5u3go_Am#c|yq5QEtA8==_7cr_Wu+4R zCS@)sXv-~HVRG5k9ajgK^jE6@pJssJ6868YI#&2(CLh+iQ(oKp2mf9hH8e!$Vdau{ zJrj6b%-uB$C*!&<8>G};_nr(D@kX^AzUoTTsbO6BS8hkpaFpJlo7(y8bo9FYGm^R$ z3ETe<<&!FR>SEviRQfjvX9>|Gvo+IV)y`2_=bZPF7EyKbX(j4U9-2z+Iu*_N`7iX}XxMuLZqf1f=-}|L* zW2hpAm$nhBTsFyr8$+LB7W(!buQ|OX+Cpe%Rhp2d+jhfvy!L(4LI;Xrp~D*B;2*WTBxQN)kuytdB)a%<6=fT!=H{ z7OaeHTqt^+7;|{>4W|m1Fq@>FvqGD3wlC_hHf?RZG)CH;G_-YmQDufy8TXpoWwXL3 z@0^^}KtMo0^=>_=y@8@C>*MvR0E6t2E0kQBv_xNL)1&Zx$6SY6eVkGXqm#b|wD4IyF1?`AZ9^nE} zGf83@&m$G<+X6!2YnJjQd26~b67VF}B=A@Af-Cw;Qx)7eC6@bpp6?}j!UtxdtGV)h zdVWIpYg2epx7@hjQSY{aF(sm4pJ+$xI~)n6wrPnx*BUcWKSk!%Fb0=mvxKEQ39%2Q>8^mNQ1IW%GMX+*xkr zbeJAi?0>Tw7iZ!%KkMnnGC#k*d_nsRUX8lYb(AASRPJ7X#Q{;o)6D$dwfS`hkdgzOI#+a_Fplqq|vjEEBLLom%z$ zdkuzu{R4iS9O%q8Z{oU@W)pS%DW2c={%nh(f3Frc79jW3sYZ?Q=o!$s7Tjp*)W*1A zG(;mZ*7x^w0Eao;uTcM+LNSvQJ>YobCbFa z2ZIH*TJIpz6|xuAo~a-#V1Hgd>h8{MO_R>AIDWubk~?sR9V8t_4E5tl?H)pU>nbq> z(VH;cV;UPx@Z!`SSN76Dr1wKe@E{X0ZR3*?^K8ATHT6Ru#)JyDv1CwqkPz^?MU4`@ z#6jd8%Fn&SGzpiqHN@K(@Rj6=rWK~4K;|Ys=Xa6gB^Hkkks)7P58Uv$;Qk`fx3<+z&-SrWj&`P#M+bpxPN*?@n=y`&hq^#!Xv*lIStR;b_6 zc&u$-ucS}8$}^}V*sr0;-tJe`UG~O6P}8_rQXXEi5=~lftsr>ZlBXoa_gK&em~4yc z;&RAN0Qbz*R&BsTw~R8qQvqdp$0GzQdJ2-@uvNP&-j1XedsY&}4yA;AG9~AmzU1us z&rD|Du`NaVTpC#zP?sp+7@)`p`h6k|Nsl?d$%|Pq?e!{KlyOap9_9e66E*ry1Odaz z_XLPu-t!UFzx=yoz64dbqddLr5~Qw;;0MT!!oAGWhmY6C#p@z3Q9N;ehv$M-Y9}vz)^-@OK{g!%LtQl_7WTK>l!YFL9Pd-vGG{as{(rBqLe5zm z_^$BkP?s0V6Zh8^?%uWyBOdK?NUZQz&X$jl*>=6Isea(phj~KniMWFjO|=1iLkPviBE?@2l7Pp10CQzoocT VtCaAavie+XwTkb(+=0MaW5zW0P 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�LsF^sI?eI4w#=k|G7kSk5WQPiw?AI0h*>(s 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%0DIj5t0|CHEN$`R8{ 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

Z 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">3*VsKG}x?JM0kN61!?41K1|kCdgk$#le0Q@ zLFU_?L+1SWMX_IXp?gbV?J!n1>8>zs!9uhg`}}L6>5}P7OCkgmv<5%_RNVhlKlx|S zK=aM&-p-v;{Y&)MGLK$z!IBY@B@^~fiRL^Y&#CtwjsNKpAV`2U#oY&=7vGm|FB_j& zc{)*+`5iXVH*=4NLwS02SYS@>45YM5j5N<;7N=r8QPwDxFE5BT2r?pe3>AQlZFJH? z&|(X1My*85p-+*t=hU1Xo;w#V$xXua*C#sup!V0S3%e#~D5taj8LR*x*N!f&RZA0% z0XA03H!|MtaZ#Ra>4?Ncf4rH0Z$RGLi(2@I49_TZ>0Q32e7fb%x;vAlO%)rf34rGt z->Lc!qMmT7t1aDGI8XtRRGcDZJ=S=i2P;ldWLzCb+6Ez ze^MoXyTv#(7%1K6yAzSAH{6$K9JO7F2{~obj#R5&Y5iTQkFi{&Ie&2qv=zMW;=mC9 z2l4?Dm4AYPtda$gcx&;vGuyLm@Df#kv>h(^7Yn@ zAFr&&S|%0k7KxebY$Oa-raUyPk1Tv1TOXw5N|>a8*=@P-Uje}=qdT#Ai@h`(X^|bq z_i?7+pp{8R<5-|V9QcLlHJ!5M>g=C-Oc3xQx*}t&=P3nUYbA09IBv{1*VZ)i?kjTZ zbYk|%1j(W525y7^UFpJ@ov*}Eu?Oma<9Fe!WOXp)!cnB z!jf2}H#?#>JjNTZFWTry?ho-`&8B30Oh4 z8#3}fq*jU{YB8LV#N3%LL1$Rgk!Fq`erqQeN+R)^WKPJ73|3$5#W$J8!(WE&>bZ!J9t(z{WW6Jaj^ z)$8Yi#_;QX1Ck;xzODD7pf_)-t?cFAPNzCquvg8&)=Th{Ui#8`8bz`L`m3ZLxPEar z%Ke3Hz{+g{TztqTsQWE+`eb(bl(#&JI#kQ#eSBC zF2X-NTP@$Hd&n`qu)B9}&-H5Ip4o-GAA5&XTX**u5L2|itOGIK$o8m5(;Z}c8xmwc zmq{_v(?u9O;vKNs3`?((+z5RMeruFbVfixdUWOsz{mU1N>l}8MT5zr%Uba#ASbFNM zCr~m<=s%Sx7ih9G4DmHdaz;V_oQ@m8cAo1Wb@{r-xr-hUDwDjAas8D$e;iR5uGxT0 z-7?%aA)Z2{hb0OPIHAuycvqX*p@QNreOfQI%+gvECro|x*RQ0bcX6$TQ+MGqW_ z&5To+Knqzi%z+Hdoy=~JoyHP814FvOXAxKmem<2Fhq{psJDOb=uW#}{nBMgt#cYk{ zcn3jv%-OWs>q}C0YxA0ivGgBY|`S-&g|I zl1hxCWA8;ZrlA0Xn%B^%Uf_mBBPv?p5E&u&J?6-d`tLWc(l=MS0CBDRNV;7aU8Gut z&P5g0%AhaCIc^#g`tvS+y?6HtffZ27C$`SAmboMqc1u=im_q zDLPMF$SJIz3ms8y7x&x8WQWmnn2wQ1z2?QKW*$ocELkuvB&^0&%apqbElF~MPBxep zwt9}1zOb(TnR4xibxw{yzuzHj@i4#f{=l9&K~TEPBi^02cz|UM+EkqyvuOQQu;D44 zzm6Cb@Ov=dSob1*cCz2rpipPS$+Dswx|a-IY)l_#TJPjcDecf(*tkW{NYHTouewsq z%C(*78*GG0+7FO6zm2nWxcsOyCUw?;TmU}X?H+-RdmA%-&M2R{=S0C=oZvyM*-yvX z%H954`19#D`E7z$dE&+F!_nVo@s8tPItM32dcbUQd*EYhl-M6dG@bdxh<#FTi1CX) z*GNLgLz|WCDyJk2-yewM2+xPYhnz8!WTtx}l8IzP9!uM@Rft_$*fUkA{{nT$Zjm=@ zE2AMqdE$TM1(P`0T|m~vl(M?j9mG=>o92MSHeQeS^4%Al9Ll_+q$s@oF{JteyZ*Y9 zeVg}6&3Ja=L&7X2orkXd>OF~Bnnex!0xK)#Lb4bVZE-gt zps`bH_@&?2Yci-kpOGP2l|5S>dG~t5dHu@<4vo2(Oz4-1`>U#66bIV**a5?PNxJNJ ze>+9?gAOtBs_<EEp=JM}6s)V@cyS-f2t@tJ{!{I6NyP~0$01|< zQ>EKky1?s2b-qt(qC(R)6ACK;hRIma)@Q7Iy9s`w-KkxsuJN4p1ql1*pI+p|P zXFWeOSE-Ak%&I7m6Pq_&9p#|y%DV46{>dzk>{EkVQsP4ZYk z#ZosZY2+7wXcq6SJpO;+2OzQ7y(ZX?x&LG2k@3w`9<+_<5DMCWyu;vrzh2wbo4R>` zL%gQj^d>(A_!cLLkPQ|fKIG>5-ivtxxgLl$11nz|jYRnj8&1SJ%we>a%a;F?Sgm@< z-b=8X(7RpSzJ+Kmo&>L2mK!IAxkF`Bv37&-+ag^tXklw2_O?)4Pm@?`={u z&ABrO%Gg`r^6WP3{kA6`E|7TzqFK3|&e?|ZJ(N?};0)V5mu{8EfSc6sr`kC$Fw+de zSyFba)9L4ZbWeM=wVsWyK4zHFFfYn(^%`cC=|Y>*V?=QuSPos@KYf?5fY+8kl{Xv=fPlXAxAh5w$EWjiVIm<@-~=>rW(4 zB_49UV6|lKp5J!|mt0PgHF~watG=>sg+LiNHk31MSGBKtd9N^udUoAtK;`2j*-(g+ zyx!?-TQAQl`(!;&23=6N_nk%@yeA&`0{!&Hp;yQu$g8%7WutHfHHi}zZ-mg!SqU^l zOwHPWNeuRS&=mM?53@9$jF}~A(NE?EckeHjg+6BfZR1o^b)3SJPG4l)w`5DzKCYxp z3;Q1A5o3A&G#RAeoxhL&7gKRnjqfQheGodE!weQ{b1U#5~~;;>1}={lT@h<{cBt|b@kiy{E{cyIKayVMRdB0ecfv2u3eSMG zylID$Hh53W305n#1-$@=tBYF#y&}aP6uI){vjO_YNJJt1?M{E^Z_6?FJiX(5x#sar zy{~UEuvS`_+cc2wt=eR~vDTb?KUc!d;aYofc5ufHr}7c$)1OD8i|7&UWs!UtRV40EJ{O_P4N^v4q6+~8836XC4bD5fuoz)_zv5rTaV@ZBej z2t41m+Ri2Q&@Dx*2P&s9&H!fi3h}|rM5Q&MtZ|UF7K@v@{?&O>WFZ2H_%}{Bj~wM8 z!&q4Ovxq_zsoLv6moPHE0>#x9U$YdyA?qx8VW_*uq~TaSLVN)m&nq%gmT(rhQO>E$ z;j5@l#!|PbJz~Zk|U9Cu=GgV`~=sYPs0gv-Mc4Jdo;!coDPXg!Tb#2WyDA~!EO;|P8I5Y(OKth`d z?fxHE?;gl>|Nf76x|6%&E|pHG9F`R60!7k>@w z2%ob@PYwqe)~@`N5!ttm#9?M{kHT;?u=*@8gN5OE7OZ4b^U}J{v>l+4DVgz+u_M7o z@$$^e)b6v4t>075DeVDymsed4=fiLzc}A0GR~}*)k8yOR6|BzDW6e)n^m(&nShyuM zo&d}#D*FGF&VZ8KQ^tqoq&ZCS3!i{13oyobe2S8$%IYon&1d)znmBF%+>Q#Jf8OrY zyV#@^0On4g7Ax-`OOZ!j%ZWCD#uGSZTi$Ey9&(xRhgw%9cq9n!k04QXc;|s3ydif8 zA6+ZL8itAO2*%>hjD^gRXJRAjN1q&!SOhNg-kgN$A7P)FOop!0vN69TZ}B$R_ODxt zCdo0w*FD14=R6E0|IM2?wvh;$bNJMC-VDcaIp;cFxw(K|xqCPs7nEuL==n9H=U0%z zS!a`{AH^OO@`o3;dUoj{@68a^S%&^92RfQAHHE!div0q*JK#79J5A%MeWpGOysRb< zH-UJYg%4h9fP@(@K8%iDcNXnRu|^7# z6cFHUhDtqHniCE%GG+AWT8j(nFE6USHc|ecMt#sHoegXRN+d}pDg_h16)>oHc0_k>%u^%z| zi~h(8^jWPHEoao7n!#>`+{jD|7!eYETJn(}a!o%@%;k-&R86V_7;aaS$*3Ny^1|>L z8uAuq-zbiLcDpy{Iml9_ZxcjAp3vIuFQbckiR^4T|I$h)YW(&6*6}+wd9hkJ@irIp zEk|4?(|tm*#8Mg;(qo&c5(aCNkvL>>ew7;(9@(a-yB4)L!IY8ZQcW~%)c4huQehcs zq+^`$eFB*IOBhro){&-1)425UHqCcINc&rIcc^NqjF~L5i^{b`smUit5}52D#PRem919GErS zNO$ITe%FnuGds&yYiR!SUR!FF&oiW~vU)g4XU80Mgu3JYRy=>{GcHt8aX$E%s zWBO(G|Jb=aEU$pt`!!X*)}vCd5VmXOMTl1xDYiaRGlHmG+R0{$B2LeKmrGLZeX%{F zyj`Y6Eq6Xs^h0KY%5nPvn>m$M^tG@W?eQ-g+TF`jJC`+=Kg*zn$xCB{*s3pOw1PBv zR=m`>?|T^HN{hpXX^ka;@NJS~86(}sX_ys3IJ_J)-KLmY_RqNNe+&Kpq>=Qn1@li7 z*82iwK0@H6AVH11Fj_)1QLW-b+TcO4;C^Zv-TPoXS(Qhf>9XM0m^Fwp>ulgX#9xAK zsZ*rvbTQYn={`#bWnMN`w+D$~z3_d=+7V_1-&|YgKUq7P-J!j`#Y{rBio7_zCRw3V zTORrL>K~mbn9lk`&fpclijy@#mtM|ganDC|W(|ZSM;8{{OZ8put63m#H4ZIW3Kpq3 zg(;ogaGzjXq@=L6Ivu4&biKIX)ryL-U#GM3$xscyB~p|qk3xY{j{dlQMbEh?TX#VH zs751cIzlTdf?kF5zZs>sG?xK|6c#3io_ZHrqsCqsjm^#4U-%W+L>0ytP>3FYi*H}tnOYm~r z$IE5mGd+gCtH9q?J2c`yOoV@j2%b=4KfzwCXt211uop<#HK3|==)f-N{y6?G1DC~Fz4GH z4XaUYe(n1z>M9S|*4jKe^1i#&F+pJvy}eo9_g%2>$vh?3rv_}N-nI>ssOUTC zE8f>;VVgzuAlV{(@ABDm_`o{>J%(Q3X9l`|FMNZUK6?AXd2};kri~6Qj?DyYg_d9I zaC6fMsq%gDrEwgb59~x8)}YKHCWe|NxR5e}p5l|Fi}a6Wp8)A21qnWXXBqy=<#t;K)wS6rUK!iuCJ+u<4DdPi|%0yiZ`} zIek@qpR>UnR#14az|n%^Im%xt^w8bCb8y|A(3=4kyU($w)i1!}sr-p!q{bLP+Swkq zZjWbBl#`N$9{b??GTaxZq*R@oN%BplVdmPhvt1WZ(ZyHSk>;&YnI^9OJw020yoIV| zkx_e$7SA=J-e|i%e_e8_kjU~#fD?gt$!nNu_}EIAT*fJ*pTI|}i4f0(hWyl}fb$bc z&n@^KV8Y3qe(vZvxxl}(az~>wb8ai@HDS+%7A=HPXIoR5Al@Bc*H;(Fy$wW#QLJzY$3%_Pxx!!9ig?t!jTqV<}X-@nB+4$y*Q=4Cm z(cls;MN6S%{U=3z{ZGfs9ww!90DebNng`9#DBPG+T&|TwDsE~`FvnCkKFGVjCm9rb zD$vYxAzz>(;~=A#S_)e8gMaS3C^j-b4^~@8E)D)JP-CxuH_uaRsd_9^?ZjHxHu4Y{ z*4J94jmKA5NMyrioY>hKa*(nxER5_PYXlI;I`V?EO5QzO-MUOfcgl2uAB1srs@rAG zw-AF_8R9o?fO|e?SogdOsV(~6Fy!i3dz#aJ_ZADx6QjDRM60y@(g6+rlX=KJY|`x{ z-VVxSpXkVP`}Ekyg8(h>f2Qrf>kVx8KQ0l3qvEK(Z5POcL-6Z?DkpaJ|Aze1KoFud zLufr6Ax&Dmb^RV!IBR5=<^d8{aEcj` zY~sSp#6q$ylT;t z!2;zHf?>{2JKGF+_&0?+%uJ27VLsbbt>l0*t&|=L|J-#YDU>r63We!tn5HKXm}&!u ze$1cyEc(t%kIvpWlD7|?(K108omVV-Iq@7SuaIOv6O+r1$PQ{brQ;^Bgq;T{CoR9&PO>v?>#Qd~pNUlLp_vg!;BJ0qC3Gz>>-FaXY|M zQ9>GDFn4NbM0BsiNQ$_~ zMX;_PPh`+`^Rf@rkY761v7Kw7+a;Y1G2*AY&W~OY-1Y)R84SoaWS zMoT{ci^mN*-8-;kPd}5L9iEb&-C==JI=Z1e@ohnPaJ}l}SbRf79xWC`qcgl;zm6?E zp+0fyXJA8DGUymrYwqu13!}ps)P)#&znjMSs(da$0cET-l3_*$Hy=S2szo^%vzSEr zl7+kQ-4lAB%j7SWh7qkv6QGt^$S<{e(KFWLlPwD;@JDTwMctq+r4=mz&jI~(<0rtZ z-M*oS^ExtngH6snPm(|5eWEysJxGPX0>CxEs-%-cSoJt`deD98+UK*J6{~&rcu3IK zeAiXq_FDYS#{Z_~|3(6*#as$Dvf&RS2Q1{v71#P05L`hP! zG`d7kabzUb6-$1L@B$;yOEH{xlm1Emi+A1c`!-cn!~}9xl0?8gRKpuYNM7yl{e*cV znTbhrH&V8xKx9vCKA>YaY{fqWx4)=ab`unLhY-B=r}Bq&sT<88a`7=c#)>fL=+n-O zVn1HTNTt!;;>R)g?Y8QN?{%g+uX8asSCjj>-!=NcViltNdbviR(^JqP_7@IK#WEW* zsALrhiLf|PE1M(CSRWmEE{$`MRfC)aZ}+s7XMmUESyL824n{mK5jL)5-pJjzX21L> zA?(jGd^W*nXmIk((=S<=L4)P;qgDgU1F8bJ)0^O5d+`$n@`5KGMJl$qQtshKk;KUI z6C#WeF9~I9$Tm@^hXd2!Pn|hF4nAW9`Up=^@;WF}5PcCDp8e5ywQ*qruw3bEe&T;K zHa1|j3@QFcWXY0~WXc#KH0|u6MWs=3(WBS`!csy~sc6L{d4{CUvVi{>xuH51HT4MO z?nLC|5{aM|Lj?4sN*M&ku>G3c#x`6zyHXiYA8xTZQn|RRQ)DsLU^N`PK?*ngruyFP zjmgV8-V=W#^zF@8{_s>1T`LaKFw9Zp?WJU5NkpZ@2eEW>L z!>w%y9mtt)=*(y?t&iEF*p-QS?c1f^^E^aRMevGhJ$IT(+#*=-`*MI@keVvSk+0~a z*RXyvAT|Li$DQ);R(7`e@^QD+@Pj#V(EUqPN46->Vw@XGl2buo^PDH6@j=dtVVaU` zVm6nLWBnByc0^NDbmgY=kUFPv%B#cYHO(@2^kx&QZz)h7s~+7?k|#T9ySUs*Yc=yN9!m>@2}L3QLjqhPS0f( zh@0lT}<*81a<-ff7v(uoB=ylyn78EL{*7jdu-E zid&rzTr#wDRg_}T-C;1ozYX=jE#E%{G;}Epu~7=wkn}^8xRnRbaAc^_TZ|QDQ|N}j zR-n~aJjsRBsB1JGSF`Ird60HfXx=j=oQ@jHy%9YE{HeWTU3gLwu|p#rEYWP7egn}G zgYXq!xds|NGX*>U#-Dnjbbzp?cfC=nrFn`GSL091G|TO%frIb-N4agLz#zYZ6J2=dQ^Kjbxzc|Up8P=5Mm^^m|rQn4Crb;%V|uE)<8 zK7klPxuB;;a7chS$|sWb9j++{7G-B}zRVqx9MW30H)vSNNnBA6y`_pQ{laSu%0MY= zxPL$}BmEy?fAE8Ja-nwFy!?n#z+8(eW7F{eSk(OgvuU6p_A(0NC$vx^k#QoN=T-3m zr0@>p7rNpQS>Ac&l~D6@L~st+>(OZKRgY~FT1=IJyf7`Y)zm+{abM|Cx62yLNPGnA ziyO&3R@e#};Ov+IGkAD}0a!Jq{H1d2L7%td_~~l_C&pqf9TDVl?||MnvlRb`KHt>DO^tP+ z** z?_}z!kMm%DLbyR`pMb50&r62yExf;TlJnEG=lR0S4aZQkXT1@Alfx%zH^9HNq^DuG z;7HwPqpcp`h+Qy@Q&J?VX10pg1~Xx=_vi3>j$sV(e)lc_850m>MF2NG3=wYhZ?CbM zXnQY{TmSLTg3C#+umT-X>Iq!dwUWc3-OrX5F0Sj%72qd6?mBK3x#gLlKqu%Sen8Q( zrztIwKe~Il4Sgsx((42tdJp?7LR=1a)ge8_@wmDp5(k#Z*p-T910u>q(GIX-m=BZ| zavOZsaLra@W%HOz$?`|#uBOCjsJ8$+lJ6C}tILtTyQc0c?IY$8=}j+hyIwgq7pvYu z*jI<%CUaEI@Iy0d`|{cGI$0lH1{w0Sf($>^ggjIJPTo+wSal2U5wWinC}_k?)bO2O zu(s*NCU#7Y4m;0dIyzgAub?7G5a5}wg3_0VGv&4GtXD2hDsE7Qb}@Zl>d;ua&yQa; zc1m#7v<6ESGKaHM<$6a_@8=azx1-G?yiZK5FjuZ8AOGU|J`S5P2Dt%&rOq*%unk@v z)d@9OgLorj`Ts#tbp8pZ;6I!y@N%i3b**&N#(9DIBRKBa{Nm4)ZxYO3!YhL97l{SV z{N=`*lVxlyV!U*Rz@L}0MUcRn4^jzTf&-}lu8Z%TiyO`JC}<6NU1vR$14aB|M_vs; zcT6}cp55_RFTF9{3|Y31Xng3sv*YL|yVru)snN57b8z&#oi2XK3IUzhxRDwpg9DS1 z#*W2_m4~i2Aq|d4XeM{)^`9L+YnA#+``ni>zv60m-9%ejS|89TC`CoFe{{n!PEgSu z^*IM0>mx?=33tKCHWHp#58Zm+t>B@s;|!a*)#O8*(5@}fz92zYYF!n&d+2O-G->bt zNtc#wWXI4NR-sGF9}8Z>%5#tWrMZtFvzV7htEmy8x<_Bjqle8AwpjCxAZMDXd;*r8 zbK@buFD!8+7x4W9Xy8$M0W|O=a7gXO|0lctZk0z>s@-R?wM$;gW*=RfjdiWjJ=8kT zXGk7o#=l>+G;H%c^;^k!&4cN;xijD>*8(z}XoxYn`qXR*1nrR{r76PpAsveMPsQIRFc4y2lG|jB_$TK0g@(ZW^3Q zDM8Mczg|e#(rstUiyXzD#of8U-YBOb`z$rX@jky?V4f4L{Yw5d?eC2C$tmB_^^=+5 z?>2(rDcMu+ygVZT4VMclXCAqVQuy0;7led$5lRcdF?k-$EeeL|%ouO!47id9| zfZ~ml7wY53$p@NbQ#hkB${?M((h<7y=NBywzozSaPM;Ny+D&Ux(I4WZUC$V)Nsdb( zLM+xAWAyjo7!1#F%1#)|N*Pl)@i~r}G0Qc~%kCS3R&vDFIkHksz)55Pq$Q35x2#g3 z5OS@n_*1nnkQ@HbBL+kn9{6feJFX7ZAEpuRlP3W-lH<9Q%X_$-Zk`?77&q)x_RyES`pSLTDmoeHL<`~R zZoo9dMOKQK+`4TFtxzZqfhNSu6qocQ4(TrF@2t#D4&6Zfk^A3{*w- z^8Llsn=zbGgR?@0v61%q_lYxH-2qPHMKBjM7q-uC;5wL`(L@3Jgh)bhyVv7b;WN5n z3OByKZR5XfE);HRg(w%|=*Dd)KO^Nr02@lr522A=RHw^!as40WQ>L825r;f$R6vw4 znAvm)ZarA$Pk6@$>^iF>aMrL382rd;De2qA{2AY1WDi z&2#y8FOU1JXWID{QRCO4W*2ej$*h=M`SSoJW8}a@>VCNifTfTD@!TJ1d$C5jq7)wz zh^^6aW{f1Y<>u+s$)oRabdxv!>LNpW)u}{rQ?cz{p|Jv*O2You8<=c0ZFd$a2@WYH4d!vtdoi_e|}!bbhHK zBhC0t>H{K-?f7rxWuzsm2bz+$1V?3maS^sdKI7cXOWg-dQ~f5BXPbgsY*M~Gzr2#t zXxcyjF*g=FiBQ4%q_@1)3C1m4+uu%+b(*ph#8q3FtaQeeJC5q}MDvMHx^-I}BgV(h zSI@~k-S88Wd$!0NzJU*dj*LE@0(9Nx) z1Cy{G%`;y>&DTNheDVup9D4i63N;8DyEg&_31X>9LC`nn!jq~w?L&>Nc6I95eA&OI z0}Ygu60vQd(#9jE`N+~5pEl%I6@(nhsMa5dE`R5Ls@!otkdTql|4!0=4=q!rz9aaR zVPT|em$4((>r(Zm22r5a(FBT4khzAa)BWMc0MV5;_e1?!_5(Ne36e#h-LIqxYgDidR={8LcC&o~_L#2B=}$O19^C&l3Z?Rg19g}F#VsAZ$6k(T zUvrxYX(DV$>OH<(Azz!0)wrfoXe4XsEUT}vTiFipF>>qm%SFov#Xl|MKkR!sQIROm z6y0g4!r)Mjb#__SND4;n-14W9u_&WQws^IyM2*2FJY$lXPH`eGdECfXtK5(R}n2d2n z;6vbDzObryApvML7MEtL15ll$X{r67$HkOog52KvT7yB+rOMT#HN~0r{ z#4Ho|oK@rue<;~-VgAp~qGE16c9n|0>Y!0w)epEj{3A705vz3j=CcN+MRkCMqCt$* zl5j~pzt{Z=H|~1`Q97=-z~_B@WgVGD0&MzfL$>eguvV#VOv=2yz07s47H3?<;&En? z)Mh(@F?hKc=l>Q1n8wpax>h-bnttc#)3COxsooaW+q%w?hlz-N>fUH04cp-`mqd*d<6{^zbh?L; z&+wFnI!sbTNSxD9;`Qf{XwbKA41d{uh}te`sVM{FNi~NMqWT?<66H+2oBiQ%f69x( zkNdl!z5e~n$|zphZ#RbDf>AZ>ETs+b)1vf-{(j)c4deeo7$^o?CG+1>|!H&##tv=M&hJz?QuoFjY ziD0TWoxZ19GZ)xCUH8zvRmYhCU248=NnKqhx?Wq8@m+CkYnO*K$zDFi(swbW11bBz^D|Vqy54qSN2>NfS zAB?wrH>QJ+s_*Nlp6cafn18NZ2|T?VP=h#OMI8urxI}XNuvbhn;-f+SJCQhL&1Z>Q z9u5o;z`vFN8F+rj$6d4UCg1Bc5-n8QMx$`Gd|!)F%GVT z;ag*!ze`T+|J5MMOEklP@B#QQ35ngYBnb6sr6PE`jwpJ;=R!XLeSb2v<8e7HLo$*S z*k4^T5=|mA3xcG)s(F6FFSXk3$r%f|M_Fb8sYa>2C9|w2Swho3{I%I{Jkd-v0YxjwYhvc*SxDAnDX$4{70Z%$x>2Tpen*+uN+AdfG@;o76~=2SvB8 zrJ^_iI_?^+T+`^_b1sAFJ`!#10(_%(@;{!cTyE#=noZu2MnFATi34kKl~S5ubt z>f#t0c%S~RzCQ%DUE+k9rI{9u8)Y_veM&=Itu7PS5*shPXv#jOp@(3p^>>^elWYD_e8 zdOWwOH||w0?^V`}#CBFq5a=^KdFSvA+v~>_rb;Q4uo&M3$)9uMf#azkX6rpheC^w+ za}2QE?bbUOzWxWy(>890Z=_*ML{k-QZbRL?@frqlk{cvAOfnty(JhQr`LXVy+ttbx zuIxu}*q&n9HO$%)zti9|fcc`9KJv zJ^ujSIvMJjzz?zIfF^3$Fv3+vit{TXM4hFBx;-hu2UP(Fd;y6&XQrzup@C=^!U);j z5(V9k99ldxi=T7tIL$*0;cKrt&kzCwCi`)|u;kwWbcA zLw_ueg@5+PGuD@%-+qinlC9TYDI_f26fX%L-<69^W;b1 z?Qy6L_npOaRLb0eq{$8cD6W_8Vy^Z%Q+WTp1>>`Od*E57 zYuv)zJGI>2GbiZN#!^8v6pXz+tf&}F-6BG!@8G7-2(!yt0ovfGV1Io-=0l^!Fx;TxVo zB^G+j%neJB$7%0Vk6CJ@ylVbKMw1h9mJm+xnH$ZU+YnGSpRqIIymeZOAjD1Gj@=YS znW70sd(|iWUb43%4F#c5@g00MLV20Xl%@X9MrraWo6+gu5+>@;Oi0jt+}(lVNZzp;`bnd zMmcKb%}Tox%cQOJKfat1{~3E0ugcw_sK0>{e2k+voiwwg5g9s0FcE{U6h~P)(EpIf zs@V%39&Rx!=Zqv#!_Z6aH$VS5|CG}`IcU^JC6XimOk}{H^N2V&Vn(^F)T5%0Q={yM zcPDg?6k^l{z`yJsr{r`@2DXo+hP0*`cEWIxSxK*e1!5nKxb~rvMqA_1!ca_?pCYzT zVeR1_(~WDpUGDw>djgi`qoxbA2&wn&0&IW3c=TO~Sx9@;8K zdYY086pnx*PUiP@C51B5I}w0}1*pnjY?R){m;#wGlkI&H1uvdi?kc-cuX0@n5ZIF7-G1A7rBJZsn3$`vcg^^VyjH5S2@TH__rMCKdSn4iAy{!TA3hghCHGM-y@E6{}h zbMfY1k^ANpWdq8)ozUsKQ;#BhtQ0gg4rI_ghM0qXCzjLmKu$ zCN(x=rjKs2YkDt=M?WqANj_*ztp|5}!dWn|H;j)clI@=`JY7yeyS%#VNgoD*sCQASdkzJbi9z zNgfF2>T@z_xWsxUmXXQ>CORkKO7ehXnvv5g-3Pq->HyZs6dkXN@FNnZs+;F>XWrei zIVV`@xMw0r^!O~_28ME+=W1eJMrj&qc3&6gQCDjHIvPcT4<#jBwVbrcuCY3MN+Y&K zGX+1I|B(#KX2tqFdYjeZj^6Mi_rS)W*KtZqIP=5-W82N!BIT*(6y^c!sDr7i_^`3@ z&&(~+b3!C~F`1dP6rAy>mb)8E!1>7i0 zovZ$X_6u(q=;6g@dSZf8NL`-)Nt=(f4F`Cz(bUJMo`xz6cb{cVb~kqn#K!vy#O;;v zIj7W02Qg}qJK0b^DlqO(veXA7?87|U%rm+MM87n2lb53Cd49zZ&f#Vh19E+MlXR!H zAUYEmSX67BSoz0=0(+SPRu+3L$4E;$e_K@iezh|^SDzomGSGuZCu5uuW06AZ4u`;( zLC0R~SQcr7OeJW>V|nc)`$?J#xRx%9rD^-a#cc8orwpPRRLvl#cDqu&E(fs1&{b7Z za5OZihCSX!fnu6w01lvd-Iv@0f9&v|N&T?q^$7C-d^-#zg`|YoWo}PAYn!m2ykeb(%Qu7MGd|EcNRTB`ve*m z@f|Ox#i??TbIx18EBP7LXoIY_i$A8;5_6`^h5b9E1CTMjByQ7f9shh{vBYwzRt{0n z28fe=r$+ySB|VB`cmZs9m$|F$gHnCqmDd8UK#bISRh2I_ugBhU5&Q~CqO%CEB;)dL zYBQ2k3wpay{W>LKO7q5tym?LNfF?Oc^GM=&9i_P7+mhYwE^XeFkMV0JioL&HnoMRD zi}WWRV*OIxs<>++-WJ}uj5lA$Cnxt#U&fn~?iaZDY>Swyr8ijYjm`XeYpsb6GDF*2 zOCikPOkUgLecirO%NPY-N$||9nZjlblQ|EP_PIBJ=QT`Yr8%;A?QwR5x95mtxd+`( z51j6rIhPuRvV4#gj=AIFI%wfG!JK)la{eE438c;Z7~_UWmd^@2;VH2Uwjc z2{H4fsWxZNvxmcP`#45C`nD4^(@X)RUN+dwJJ7vUe9_O{*6v}gGC)H>#=ysY5*-NSaYFo-i{ zL?KyLqChYvAy*M&zq5btIEHy@w8@{NK5^AUlU(^%yZVN;_L~pL?sgm4mYTNyVG`j8 z3FyRYI{8<3M~>`cg=^ZB3?R$*ZmAix6;~d!hFQm3k5`6wsE5cU)Fnd zw~Rd#97+A2mNqU9j|+DVAaj$Z7cQ6B<L_t)?HDkwF>5o13wb5!@w?!?PV=N<6k&MsN*S4swrs4na92mM3(!itN2U7=X zy?R2i8Nb<5I&Qv8pa%-5=X`{G@*)=|IUJ$yejilI3yu=0p7Ri@lkzm5z+IX*Z&+-UoILCVFKeLTr}0H+&y2b)zHTf%Z>Bp%tzefu8z~OKwTgs zRl@&1kpBR2SAO84dVmaDdK4(RD*b0!)$>9n$>e(4aDxm=P|)!G$7se5D!pQ6dNO$_ z8vk&9WY~0=+GnqpGmI4M;_Str$`vA_3DHwyj903Bg+wP|X>UFxyz)EX&6)Y#?cRIXgQSk`maEv(`1%4 zA6~4fu_rj#&1|-4IX`OESCxl5WKa+e{H<48(Ek94H`S`;s+(`jP zB9?j;jZ0vG;U;n%&@yHUO+3PhKHE=HYGVn=0$(hjAnBf7ud?)M60pdd?yN#CBw%cO zf|c-(^sjT+A*lqCu=uCZUJyd0Dx9*~YwWiuJi;@&K}~)>dmDa8QVUE=avQP3-IaU9 zDq5>R=x=-(h(DAj7+K8`RN#J=G(Q8;e& zMd^6-q7or0=(Su*{U2M$+in{<4tExngj_q{b>6fx6$81cR-4_Yqj}}B&iKfQr2U3`;O}7I57X)O?rmatsZQ=e(I97S(KK;dwEe>e>sp-jQl?6P?TZIwom3M^Wfey{y@RVax~b2}ntR3nS4h%#^I zi*glX3dnqcbneB>WCZDTmo-bWeNKB<1pbL3(2Xq{8;)m;PPHdTkACDVu-W;~1DK?* zd~+0X>+gSw?VTSjqpKve$-Swtb)_;D4E5c0b-P^Hbshnr2khm0GBRu6xBQYqfVClq zDl@D)EYu(XR*%UMPwIK5_lu3TGH0?5JJ>x=Op zGfK!p)TKSldow4;Z7+^LIiI-V5QevE&mLE28so+oLeMtUA4E)H!2 zPI`5cRJH4yiz_7yKunL_o|V2t{42ix4OWc;TkprKS5XA$B>ylE5EHve?gc^uF9Fzb z(u9`*%t)OO)%U!ma?o~^d+=3GibdvEEsX!c$!9*?Dd%=K%e>&WyJ?&=5#Wr9xfPUe zM1K3xJ9XNi5%NyujK+Ryj^?YQ1_TW-89_tYDsQs-%?pSDqoT=(G|k zs$}kCEq%5?5oQ03=-w*W*=;4LCiCAFG$$Q0eh?q6NW4kX^M|aAPv|b;f_nrrI1sJPT3JJz&9Axp$)|XM62M)N5 zvy*fr!#V>PNt<-pMls!iA}x?E;N^PSd4YJ9{H|XUu}y&~><~qTxT_i)}jm7L)<3`ChrGuq<%vwBKpA_s2HWmwW29CmovqCo?QKxTW)5Wl_ z1&a@n!0=}-b~B^f*K%A_K9n3;*^cv_@PsQ*Ma8#kZoPJ74W%o%w9W&l5PE z6*E@Bxx9V$+LM(hH|4Jt%3x<@a@}AL*j?+sC_6AC)f}hAgSll!bY~W{h>Kd(*y{(^ zyB=teZJ7savk`}lX&D=7q->=jtt){=dOk_f$GN>IUWA>w!I?=c!a$RPTKxF6i&4V$ zt>u)OmU9C~pv~+59K1Z3x8V&= z`C{bS+NuVFPx=9QIMv~E29Uqz`c;o0D`8w^gIi%4XYEKN!_jdn2J@;j6ys?yZ2riQ z;uQWjimtO{E**GQA>%Vc3LBN!9Q%|#a#7X$34xDuuy9ydP{Sl&2tY+1WGyj{eSN;(U6ZD4m=h3vPRsZd=4 zC0VNozO}sRdN4=C2qGDpa7=!QLrK2GGLqm?Ac6TRC_4t(x=palzx{dPEjLBpsq90_ z^2b?xNN#psb*oi$osVa+dq8vXJg(K;Fa%h3Gt~mFtu@5C`E?$V`B>+$|J`iI3{0%f>qKs6qun`^lN4FWT+*zks;~fOSR`0B&=AAIR|im(n8b$Nl?fSm?WgX zj^IQL;}IX7?$@zmTqNge@VImEhWpHuA?eDIYx5?S$MKX+f1z%mgU9?P+BXPU-t zBscDY+KgTOrm$xf;!a3YRQ~hYaOVLFagWcam$>#{CTxjk$l*fubk;% zxU)OA;@0&yA@2}sG!@p;6IOVn*sfdjdpmj@W+Kj7XFcPPRXQU|JNl`XL1k*b2b*V8 zdD->^wns~|;h#gBTQA2(D&iw|bo)!bQI_+n1#xzhu4tRO!q##0z_>4R z;Ue+_X+(+paYyG|J$FfoGNP7YzZh`0$Snw28&IS|o(EIr?H!Xo9XWD^!gg9IN+2TV zPa`YPz^j02s-kWn6c`0f<{vpy|tI7Tx|?Ksr~qZSi!ZH8o6oaue3gT!qJ z3m42EU$*-AO8ns+)A#DKY7epFc6S(UrsDQvDFPbCP*6uKks6#kd{5T^_YrU;7yv3E zDDYvmS(sd%&~Q(r(qp6$G76`%jU}7%{?iFG+m*ZLmnsjz80829yyBQyK9(4O4;qX; zVHKxSt;6TAUx+~}p=Y9M9V|7XEBe151NIjwnR#*g{{o#O;22Mgj`XhIMdP4gM=D`4 zCd1>=ZCUjhz6&X+&)YfSb8nRnN$wq58+H0-hX!S!C&Z(p0(ARyfUlPmDBSB?Sw_E$ z`0%bU>*&`KMT`C9zk)DFw0H%f;XE_mZ2iOaM=4J018np*6$I-L_D!L3DFbV5^}cd` zp-I&jPKXu%IHY~F%i_bu{o&oe(A+3ie%O6A^leiZDJ@HHuDPIvZKublOlFb2MJYPV zDG8j{!vy%T*Ap60noLP~561yFcdo|?Pg!J0dKbaiac&=krvT-p%nUnJp_$caX7f6E z{t-y!M_W8=k%?h?Umq&T+<_H@VFljx8oa}`ocTtmxDf>DrM)(+d^*Iv(N0&i>DJ72 zcs9UnC@)IYaL(&K&89S9AB{MWT`N(P(z!|oOaXuDiiIJnybj0wK6X?Znw2u3S1&y> zJ{K8>o#SVJ+}l?5j=?||&G~Ja626-+ZoR?}G{s3%9`8UZNos!1KCh~&!p z-2hT98hekJfBx@3yFz<46VJbjPN#J62y;Z0rYJxD(322BKGLG9IFZcHji^eddjpz< zEu>Zl!wgAt@xaOKPz%D z+Iw=Qw|tK$Wb|)P>29b={#FytBDlV8YhRiI`vS{eRX*vNis3rN)fkK<3+*PnYRPj zWgY2QQ|`i%o_r==oQj>hF?2T?Bjrk06cbds$-7c-3Cs}17x(erB97yEd+>oBwD<%S zEkuh9zpxz2FOYQQLrRr2*m11+C`=omvw!c;cK!dl`p&2(n66tD5flVOr3#@J>4J2E zAiatR(j(HOi?jeCQ4j$UBGS9kk={E|T97I=^hoc$Bq5O8_3`39N1+N73E~P}xpw>; zyzJIQ@XW54B^yBjSbTWrxe#>={YI_-P2xtg2CU@9CS!+hoU1w{(_AN0z2(=ycwTs( zi8%F19JQG4FW5ub&!!wUwYq_VMu%xbxWC<)U(1(i+M4uxr7^kR_Uv}xudn9hy$YB$ zjr22&F_u|3{neP^xtZmzzvu^*FI$EX-ZD>jjNo_53`8xMoi0c%t~->5*ZR(Y>v5a; z;9wWz`Uqa`i7`dtC*` zhwAjbWpjKM=in_%bl~?s&1ZMVm+IP<6xx<*uul|q9YyGSG=6>Asf{?!#I&r@!@q#2 zcW|FF2-%50Apc+Numxxv_xuh zn{rL`@_{>xCMUik3$XEtzUJ$Fv60W(H5Sq1*0q?~ET6e*{@PaebADLqtGg6)CkYT# z$Bd6((ZDTcYZzY^ADfh^pKnvu)`a!=me03 zEbv*Q;U&{C-ui?=w>3z7r;Dzc($gK1b?P+9bSGuhYlptbQ>no4WHbt8J$QfWFb$RR zIvu2=5fr&{cv2lTgmYe49LzfkdP$-Y2}@L_{xcb9%d>{*)$PFx^;@-a3JG&@u@_@o z%}zrrhdE@gpVxc*VZ6I~0xp({{LZ=xIUi@=IWa#N;ZmJ@kBSa1Xfma`>|1IxVMBE} zW1#DCQ{JzEX7t5wR8;)6xfp4{i{u|@#j$t2m_0d&O}4kL&r`5Dm`+RIY{2K~@^jmMa~(QE1uzt%lv4ND zuMxG^d_)f9RW;qrPVm0qg2TZHlBGa5b|yPVB8?=c{N-_NkbU$~s|X9pD~u$t2H{AT z8VIq!aE}Izh*?{b9-{9Zp*x7~w!QwUWBhZjIaX(bdm^Qa&b5>q=eS+xjam$z zXEkJ7?EDj~VU(UdFp6rf$ zC6sVvU%@B~1wY$UMHnLd zxzAy+8KS>}(psGWcguUa=5Xwn<9UnDYZVcev{GLjXt!5 z_H8tPg1g18g|cY~DM`EDpqg5UD$T zLku$KN~gxkk~Yn!C)#_g+B@ggoPq|tqiE;F+$M;;ejpF~R{q{uW!>h!=2BpJX{p@;mi!x5Zy%3dk?XUx13xcLU`SQF-hFBv*3;msNU z4oC*wLnj)atd}B{uu3F9AhVl1sFWuq^x-INvd#Gyk1zRM=TK6BH|1*D?%YhY9?@1b zL(TY~PZ1()X3~_Q3d9hQU%8Tf>nlId;k&Ijh;vEh-QuzeW77K)Q;bY)u20-LS3t;V#V_XFnI!wcsTDsNzKP#+kC zWs{p{M~WFtj$iuh9v7ZAnL>r;Y6QIOe-vd1bAkG`$YA3|#WQ-%aa`7#Y5NTG?O5dS33*Zw6|h8QK%(;{=M;m)Q_y3L?S zkP@Gn!ASOdV#SohL9E3&r%$-d=I;gJE-_p#=4MgMjLLJ4bk4$MB=xhpn+2p&$&98b5beb+$en3&ZzvM(@GF+ zchhq}7Yz^0I=3fbWM^s!J34HdSjzX<`Gu|nidW?Ao$*2Ho&C==Csm$G*EZSqz{s$c z@wZhhl;5p)LIgJbl(B!dRx~5LxC7L!gg4HH1$Ve6h zp6P&vw;JUCb3^<$kLHr>{r(ny|H(Rm+x$HUS!+~v^_{-jht&?+q+og4P$W;}fd*8& zn#hMS|G5T!qP%HJZvgDKZ^_c#51W%9`(3f81rT_gJsfZ3XB5tbZv4FH<`CtEITZvx zTa%Wdwn|zr4(Hs9>m=6Mv*iJBv4BP&=yOCA8;5(I+Fk5}*C!*+!#V4}?{umMYHIx| zcWRmYu)QcUwOB5q2>CFpt3CH_|qWk}bQe>j-98D+ttE5Cd5 z4m6Yg84`Khb428(qFy5Zy$m!=1=j_0!l3&(mDAC%dL-^b9gaWQJqkK#YpCAo@Yhv_ zlqYY_+xga?6S9%GyH4rg3(FF#rs&8dV-RCywonO~v)%DBLWR>lwqO+46z}fJ(>zF} ze)_Alz_N0k^ssh9_cts#FNlhxt1zU5L1i=T+PZ88I`I~&2rrQS9r=3PApUP>vSWI` z)`(V*AE-4xAy3-JG;f|>f!)B4+b?L*|Hf>deQb(M*jkZTC99+TUDI{4Uk7zx8THw2 zX=;E+9?mE1sKn*Y;6i<=YD-<6Xa~z1&ZyCA7;t*VR4xAIUIOSO1qL2i`bDvCk2fOX zPUI(oWH(n^JQklfvPYRb^LEv1(kSnsEvD-WEaomhJy#@ysTLjh?HtEt6$`pop^sGi zM74QrUR;NgnexzcQNE@Qp~!td`Sg*{lzp6*kh->6Psr7UUy5&|uL}9$#C|X8_oVGi za#VP!ieA*N&B|fYyuWYFZ=^Iz9$mz1qsz+5zL%95&y|%M-krGh^U7iHhQ`W9^Ux%6n1Lnmd}KT^$ypAIfTLy&(Hc6at zxzi#KBNx>!3gJ=8B@{1VSS#mR2V6?+HiRC=6^XwBC>Ye&kV-EBe047B;_~b}nruaI%cHl)2UQe4J~2ck9UC>B4Bg}3 z3;XNu?kS~X;iFs4v~h3nJIRle!oD1Y@s1Y6zzfRkq_oMJmsWW4-^Xe*t zsZ5xhj2JxhxBK0-Yb|(FLr33+LN<`(oI8EN^9_?`2eUI1S$9U2&ngcCe4d{|a7@h9*rCDn}<0r^xZ+#qz zI$ZS@X&E8}v&`~U%P&Gmm19$|$S)W8vY4)9Z#;w~KtV()S;aTB(LHcd?Ru#U{LlkfSI-YWWVgQJ020*pbR4b0xn~?QeR71@kI0 zP-0I<7fM9=lL*b*uRne9p@8!j--U;3Q!j;}p)A7hEzRAUB%;>(+#P;433uO=nH7(; zY@#)9Rg>;pIRC;l?t9Dyn3AtI%F-+<|HEiqww8Ko{gHLbGM;8e0A%?~v{Byym7L%t zvaMVkw~dP*e_VQ@8GuEbBL>~YxMY&)YO+7hc$X%#f zVhU#bNr;5;Kfy|h%rhgxU#v+$?;XWn40#ZZ6w9bsW!DbX>}u-fLlL6y)wiPU>v~S; zOABsINyDkCdP2}G>=D-G0b1BYiK*a|4bQ9dTimJAZlw`!yxHZRtW}DJiU(K2eI-G@ z{&l6v+=M@*%8ph?(|#s556N@(rzTgV^B6|p6HEt)a4T?z!h_FB5$^Afzg75fmS7)h zigQFMzsLJ(LMTY45K|pOo4M6K*&2N(?EwkwFRT4H+S)D}S5+CivclSuGPl1a=fx?# zN}9PHBbL_)@u7c^SwdF@nH^*mxy~kJb3Z?SZRGaljMgU( zzFSLn!=9`)$i;c+f%kii?+?OCZn^gd&B(}0nE4=2emZ;19VDmpkGLyTb=7kYujTqX z$miJ_>b7}TNM)g!5j0}ZgD8F~ge4AmS_$_J>Cf<=moxvZ=rXf^Rw2Hp9g_!UjhykkxEO_ za@vE8PTiL9i=+M9aeY5g!!plbmtNq#A#6RQeKhaTOU|COn=0`AgMLA|<|$xJko4Kx zye{;@n^`y};2Bo_cq!NK6DqSpO1O-XtwDd^7ytUjVx*YD;nC99;Q+r+>Nm^!N|fwR zste6h+~+(j{jb_>NE@J?ERU8qkc7sYY6qxPJ7f&b`pzOH)Q1;xI^~2|g}0O0XZk*x zhV>9K z6>R;qt}?J!M-1!_ zx!3|_Rmte7guS-pUz)J=-02MM->nL-PQWYe1sL+bxZKSBMORQwG4o9GkrlDI$M<;X%+)d$A!9%UJg>JL zbhRI!g&24aqR9x+&5^9^piiRBRl3|`!N3KFMi@qW;kn!>Bh+Vro1@^SVt)F(E zCw|Z$vJYKYz5CQfIURtOgw2wPQGz*>>E3m<)3Pg0-u!KcZc)9|0@!U>iqW=!+~f|F z`_vmMNRGgEiTTa5u9Al+FNe$SPwum`k!sT@_%g)^m&x`LJfTNv8D@vYpo{MTm}c}` z%eI49+8Ap)b;Lb0j=7|pmSaL!Z-V3g$aAX2_g>-rfO;WVo7NVniQ{azC+|~;C&Qoa zY?YNBXD_=82Q3`q9E0^HGP4zNEIO#Z9Zq=}m*#sYfpULPT?#)`BEl*7H*UY|i?{@LdLu7&!T3r*)EDIGew{-Y2jdF<>{fbH7U z@iPW7i*Pc;g_P-OTEUMhG*Gb`reNyAI*iNKo1i%JtC@)UN+D^%=FAIUvYuxck^X`V z{^S|FWjVlQ`;nedF%bdsCs`mcJ(hkZZ6QqwgY*>D3oH9PU>71=oNVIA@717v49iSN zImmchst_V2v12OL#gN4srXHZq_QJ2cp)AKBVQXd&P9?^{I&fUOKRg^?uDQej1VsDk zMFJS+FA&AZ6>p^OmEH(78ocXlW1nWhjL-3lQ?G3ctnKd52{Kzg!e$*p0Mf$Pul0zq z=fe)?sR$65(ySBd}(%@_u2+SyGGuwzY}cIJAWjrsQj5`6TS!d z;bS8kb7DdrPws4HZiAmj`FYJB#Q48I+1g5;GpuIJW^7$owqy6Uyl`3UL5(_uY5d1uM^ZZ-lQ!ZXDgod+Tn-80dA-&;tIr` zIJy$|KQ!QfvH`k;vi=DCmm6rVEOH>o{R9T{Mb9(x5PDH_f7t)P{Y*!*vSv^}Sr`+smI|JTQ zzKCYua!+Qu<;(tK^|_@;U18Ho0(0g{bj&r7YY^G)7FaH3g-nG!nek&7p8TEofY~vJ zsBcTl07KGRz$9^hTrT zAmU;tW_7|NPWv7mPq zSOM& zmQ#?9YsBGeruAxVAisrPdA@r>jOHmiNhA7VNXLFp_6sJNZ-n+m14*F2q|_^^d2!{n|I_EcZmNPK=OUH3rT3jOrV!J0l&4 z-HMO=EM7_7WH2>Af4b6R@$l*HpY43r{fgj{#}BUBfQvSIK8qov)2 z)p6@H`;#Y|)n0BBXPE_V)#-bf>iu;yki|nU-F{=n7ZEV4_`{TOg0Az;3=L3|QDe1} ztA1cGQ8x8qGz&f}q3zUsw9NHCvrF9eav-jV!%6uPkim^FAJRNUJg^ZIn}P*HrvCHG zA-@`;fU+w$VJId**oLQlvaOW%CBVcoa99`!DNVKCmfgD73-L~G%ff(yl@3TkFXAWW}nCmX~b-fqh%7?gEOaOi_NSmu(%vJ za5Hq;Qjy>f5a)fHF6*_Z#k$b2^Z1y?{s2mV=_J_BjwV)~PQ_uk8BPwMQ!BYL=V?|}ZDXH_>}uyhg-PRkxgw!N}2 z>Ub+h!)^WOTG2O0o&4#;h%U}U!YksbcgtP>HuqfG8kwLfCi!b$&9!d{F^?$S_r6$E zj^M6aZwh#erMd4-ynkJALay>DYf+uF6No2Y4Mn#CC@M{?56jV`v)ZQ^qB~F7Usz*4 zMh&nnWmjeICf04A{8Y>2=o1{X@=T1A5B$IQt48cxgBKjg+Gl~^$wKwSQiHqe_&&e* zG?X=@W*0csP_Pm$(oJ{3SsTr(5uz8r>v$Fs*lfH{07op9y*B^xa{akYz>3o}E3`a} z4G3unn33Nli)+2}W~w;PkLur1yGer2 ze>(;*cy+rarn=QJ1JMAC4Kp;6Im@FCba?eZa&EHrQvZCMHCdLJgnebv3E|R0x_*H{ zhJ1z7P$taX^H^78n+k*tx%%1n%C!&9wJ+T2u0?{j<#%kk4oi~4Z46y6{{?U|GQ2*PrExK zU*)It9Ca)@0p4hG-Pm9H7%Vx3ee;?L?tBI>YAi`F8`5>7d0p<&xWYg~)vEkR9%nv7 z=|OrU2xp%=rOGask?y+PNvG#aiX+kH?J7r9nf2Vn1Y6{_i;Kijdx&D1Y2O_qh48zk z>;KMO#7-z6D@yG$UMRqB zY_R{q)}*n1lPOKw(UJ($QToB;v~+-3o_PSr-A4wbK+o0RF9uRa zD&v;pq9?&E-!!7I_8RHTxxNCcUN2og?oV^|P`SoDim$Yb{rv;?`X12Jw34f-uC41+ zXN7Q+Q}n;H^Ijk>y6Zq#;xyCJXm;X zYTKFgv)tCL8mD!SnSm0JT+};kdVqb`k0-mM`N?u+J4Qkzf(G+N(rHlYW#x;U(u?m| zVHBona_$lA`!w$^UEzGMkV`+M7(5kkW6m-Wo9b%Klj|lmqw*>C64!r{pekjh@BWgD z;><_o%*d;!5)TR4DRy9hS2k^qIpwdGCk@_s5+5DF`8V|Su%Z^^X900NN56XZ=iV3pDO$6N*jHHp4C}Nw@T@nIZXWO~P=z-GBED%Wyq#Pd;L;Xm=`yi~gBTCc`lJB^nEg z{{16UNU_YE1tDxZ&%S^BBXRUadBV5O&(TaFBxH)?Q}S(<9VEIoz!EA9bkCDeu$uYyI2=4j`<{3$ zRb8LOq}Hn`Pk&zoszkSc0Ee~UdY`vFXq=KpF$>weyy&qSIX@5>Z0TN8PuK?M-_cwV zSLw*2a?=rwxWNR$tgyrTqKZ7@nL;4-i&92>emDNbI$}V7nJ`%YltR-EI%=Xsy0ebz4BjF?$*TQx1Q8 z4i=J%O7;1^!qJ~cek-?8ynf=n!d^@DZ573+{gVqnZet}C9y;-dAD&2Nmn zLd;&c#=J)MewSRcWz(zS>(OA5D{~c!Brmkoi{|?`LO7+B&s8b|Jj{{4wmCWcLR~M-L7SQu3P9#K~@2x9QjFdSO*^I*I^dOUna|M;eID&dvFk896ee1sp_ zA8>IGQnT6;2-xE(ZeDuchV6%o(TFw5r7#$SiIq5~+P~vfjfm#M|DJ-*Oj_1CYVyUX zEhQMu>&2T2did!>w?FqWM*{MWAGm#jBfmF(a+R>L)`>%Uhqo7m!CP`FUyaq5ADO@P z?rIChr)mO%ebgs*&^!F3EoZX-=PXo)P9=Mzf*rE|b9KiP7Id^6XDD4vPF4S>{J5*7 zO$R>ygyFK8{z^lh0goh07E#YLHfnrH!{`-|)R=Nq~I-FE0KuVn@*S~$cw{7i7}sGrlGh0n_yomv~y`m z+3BJ={Q0sc_ePSr;TUy5u(zD1(&!VMH}^XZ7RihRxAXCWMs~m}&833JB zqge#0$w&1dpNrW>@3|TqlC}XzB~b`JTrx+s0NGaXOU((1lcGX5Df9W+4YjrSXDT$3 z9sTkng-7I%S!({*49`UBo%g6kO~Z?G;7K_xI(9#+BPfFCO2{yLqJM_+TVyj@mSpW+3O%FcOrL}gW!+A&#kVed3v1gq0#5N{)n88C8FzSlkEig z5cf4^2@k3_Eh2P^Dl}43yomv!FUC*J-_z}d83heKDO0nec@Yv3DN>hQo3-b5t8nA9 zi=v#FRnMIft*I#a(n8~YYVpHYzZTUT%xTq4{@2mqqE2JQdllJDt`ZUwxG&#%NtcEmdt{uMG&5p)9?2>^^Yoyflo0GFkmo6_yUT+qjmwN_uZ??Ty`E5Ezu)K`X1+ zy`A_?-TBA+nyvNcJi$u#S3Rs(!JNxT(s|}P>)7w3ly8drn{O%K5YBN$wU5BDDdwI& z03bY|m+ktUsj+89$mJz<8_wF52>Bbk$LDoJD+7zz7_WN`3j>=HJpblh&i7`KfE>Ha zp~yW)W_Z-KVI}BnRlMUyhZ{S8bT<%Juk0xVv2SItTTO>vM|57!Zwf(Dyr&gTQ5m%s zQD=qSmDH=9ZeJSsvF$eTmKPI`*_*0fQ`qqXS#pXw*BjSf;k*hf4;(K}Z4JUm|Lyyp zN@84P3XU?AWvaaODNjQ)821itG1n)Mk#vV8M;pH>hXFcpIip_n%3MLe^>>ZNzN_TK zG?U>}gZl~;2uVX`F{_HV5{Ar>d)|m@aY^A)^8d0!&dzPDmpZH6R$649-+ey9SGn6_ zV8BX`8Z{7(XCMEr3uA@&fCLM&qY%X z4o+KUEEblusx?X?FTMQ1nmecX`vxa*gh#c<5Oy{?$a?h=b>l%dYqJTu96>l+J?s+$ zd38V>(wJVzKq$>B``7gp+Tc!}i<8T^Zd^u!AD9yFJwJv}pX3V!N-Ys9h8tYotm_M^SU0YlXCXN&7 zWKd!*?94q4;_jm^Z~y$<%2dnHU2W^~k}KhP5O3AhAdxik@o=fZCi>H0WSL;ID3D#G zr_0@&vR%kqC!1g0*O_k{h?{O9H-%?mzx%JeXT#WijivlDa6hgK<6vhZT$FbL$w(?EY|g`f$)EMZ&aTFP)7sxp zt~VG&J-ebuCtr%drPqlwJD$@O#9&fhfYu0vP#iJ-(c<$Ab(0jnMEcTJH&826eG&41 E03C3P#{d8T literal 0 HcmV?d00001 diff --git a/packages/twenty-website/src/content/releases/0.31.0.mdx b/packages/twenty-website/src/content/releases/0.31.0.mdx new file mode 100644 index 000000000000..f8ffb6c5f67f --- /dev/null +++ b/packages/twenty-website/src/content/releases/0.31.0.mdx @@ -0,0 +1,16 @@ +--- +release: 0.31.0 +Date: October 7th 2024 +--- + +# Advanced Settings + +To maintain the simplicity of Twenty, we are introducing "Advanced Settings." This option consolidates all settings intended for advanced use cases, often preferred by developers, such as API and function settings or security settings. + +![](/images/releases/0.31/0.31-advanced-settings.png) + +# More powerful search + +We have significantly enhanced our search performance, making it feel instantaneous when searching for records such as people, companies, or tasks. + +![](/images/releases/0.31/0.31-search.png) \ No newline at end of file From af4f3cebb0b488987f1b5f0c825ce6d5f03999b7 Mon Sep 17 00:00:00 2001 From: Weiko Date: Tue, 8 Oct 2024 11:21:11 +0200 Subject: [PATCH 26/30] Fix restApi should not use TS_VECTOR fields as mutation inputs (#7484) ## Context Screenshot 2024-10-08 at 11 10 59 Screenshot 2024-10-08 at 11 10 50 Tested with https://twenty.com/developers/rest-api/core#/operations/createOnePerson --- .../src/engine/core-modules/open-api/utils/components.utils.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/twenty-server/src/engine/core-modules/open-api/utils/components.utils.ts b/packages/twenty-server/src/engine/core-modules/open-api/utils/components.utils.ts index 7e34e35a31fe..4b1910e1c08a 100644 --- a/packages/twenty-server/src/engine/core-modules/open-api/utils/components.utils.ts +++ b/packages/twenty-server/src/engine/core-modules/open-api/utils/components.utils.ts @@ -109,7 +109,8 @@ const getSchemaComponentsProperties = ({ return item.fields.reduce((node, field) => { if ( !isFieldAvailable(field, forResponse) || - field.type === FieldMetadataType.RELATION + field.type === FieldMetadataType.RELATION || + field.type === FieldMetadataType.TS_VECTOR ) { return node; } From 4156d7821c20685360ba55e8708398a733463db5 Mon Sep 17 00:00:00 2001 From: Pacifique LINJANJA Date: Tue, 8 Oct 2024 11:25:42 +0200 Subject: [PATCH 27/30] Ability to filter by composite's subfields (#6832) # This PR - Fix #6425 See https://github.com/twentyhq/twenty/issues/7188 because there's some more work to do. --------- Co-authored-by: Lucas Bordeau --- .../MultipleFiltersDropdownContent.tsx | 10 +- .../ObjectFilterDropdownFilterSelect.tsx | 154 ++++- ...pdownFilterSelectCompositeFieldSubMenu.tsx | 98 +++ ...jectFilterDropdownFilterSelectMenuItem.tsx | 23 +- .../ObjectFilterDropdownOperandSelect.tsx | 8 +- .../ObjectFilterDropdownSourceSelect.tsx | 4 +- .../components/ObjectFilterSelectMenu.tsx | 87 --- .../components/ObjectFilterSelectSubMenu.tsx | 102 --- ...SingleEntityObjectFilterDropdownButton.tsx | 14 +- .../hooks/useSelectFilter.ts | 8 +- .../states/subMenuStates.ts | 15 - .../types/CompositeFilterableFieldType.ts | 5 + .../types/FilterDefinition.ts | 6 +- .../{FilterType.ts => FilterableFieldType.ts} | 8 +- .../getOperandsForFilterType.test.tsx | 9 +- ...ts => getActorSourceMultiSelectOptions.ts} | 18 +- .../utils/getCompositeSubFieldLabel.ts | 12 + .../utils/getFilterableFieldTypeLabel.ts | 8 + .../utils/getHeaderTitle.ts | 14 - .../utils/getInitialFilterValue.ts | 5 +- .../utils/getOperandsForFilterType.ts | 28 +- .../getSettingsNonCompositeFieldTypeLabels.ts | 10 + .../utils/getSubMenuOptions.ts | 4 +- .../utils/hasSubMenuFilter.ts | 3 - .../utils/isActorSourceCompositeFilter.ts | 11 + .../utils/isCompositeField.ts | 8 + .../record-field/types/FieldMetadata.ts | 4 +- .../record-filter/utils/applyEmptyFilters.ts | 339 ++++++++++ ...turnObjectDropdownFilterIntoQueryFilter.ts | 597 +++++++----------- .../hooks/useHandleToggleColumnFilter.ts | 20 +- .../SettingsCompositeFieldTypeConfigs.ts | 190 ++++++ .../constants/SettingsFieldTypeConfigs.ts | 199 +----- .../SettingsNonCompositeFieldTypeConfigs.ts | 152 +++++ .../SettingsDataModelFieldTypeSelect.tsx | 29 +- .../utils/getCurrencyFieldPreviewValue.ts | 6 +- .../SettingsObjectFieldDataType.tsx | 6 +- .../data-model/types/CompositeFieldType.ts | 21 + .../settings/data-model/types/FieldType.ts | 3 + .../data-model/types/NonCompositeFieldType.ts | 8 + .../types/SettingsCompositeFieldType.ts | 8 + .../types/SettingsExcludedFieldType.ts | 7 + .../data-model/types/SettingsFieldType.ts | 8 + .../types/SettingsNonCompositeFieldType.ts | 8 + .../types/SettingsSupportedFieldType.ts | 6 - .../utils/getSettingsFieldTypeConfig.ts | 15 +- .../utils/isFieldTypeSupportedInSettings.ts | 9 +- .../hooks/useUpsertCombinedViewFilters.ts | 17 +- .../utils/__tests__/viewMapFunctions.test.ts | 1 + .../utils/getFilterDefinitionForViewFilter.ts | 17 - .../views/utils/mapViewFiltersToFilters.ts | 6 +- .../view-filter-value/resolveFilterValue.ts | 14 +- .../data-model/SettingsObjectFieldEdit.tsx | 8 +- .../SettingsObjectNewFieldStep2.tsx | 12 +- ...dataItemToSettingsObjectDetailTableItem.ts | 13 +- .../twenty-front/src/types/ExcludeLiteral.ts | 1 + .../twenty-front/src/types/PickLiteral.ts | 1 + .../composite-column-action.factory.ts | 1 + 57 files changed, 1425 insertions(+), 973 deletions(-) create mode 100644 packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelectCompositeFieldSubMenu.tsx delete mode 100644 packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterSelectMenu.tsx delete mode 100644 packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterSelectSubMenu.tsx delete mode 100644 packages/twenty-front/src/modules/object-record/object-filter-dropdown/states/subMenuStates.ts create mode 100644 packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/CompositeFilterableFieldType.ts rename packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/{FilterType.ts => FilterableFieldType.ts} (58%) rename packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/{getSourceEnumOptions.ts => getActorSourceMultiSelectOptions.ts} (67%) create mode 100644 packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getCompositeSubFieldLabel.ts create mode 100644 packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getFilterableFieldTypeLabel.ts delete mode 100644 packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getHeaderTitle.ts create mode 100644 packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getSettingsNonCompositeFieldTypeLabels.ts delete mode 100644 packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/hasSubMenuFilter.ts create mode 100644 packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/isActorSourceCompositeFilter.ts create mode 100644 packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/isCompositeField.ts create mode 100644 packages/twenty-front/src/modules/object-record/record-filter/utils/applyEmptyFilters.ts create mode 100644 packages/twenty-front/src/modules/settings/data-model/constants/SettingsCompositeFieldTypeConfigs.ts create mode 100644 packages/twenty-front/src/modules/settings/data-model/constants/SettingsNonCompositeFieldTypeConfigs.ts create mode 100644 packages/twenty-front/src/modules/settings/data-model/types/CompositeFieldType.ts create mode 100644 packages/twenty-front/src/modules/settings/data-model/types/FieldType.ts create mode 100644 packages/twenty-front/src/modules/settings/data-model/types/NonCompositeFieldType.ts create mode 100644 packages/twenty-front/src/modules/settings/data-model/types/SettingsCompositeFieldType.ts create mode 100644 packages/twenty-front/src/modules/settings/data-model/types/SettingsExcludedFieldType.ts create mode 100644 packages/twenty-front/src/modules/settings/data-model/types/SettingsFieldType.ts create mode 100644 packages/twenty-front/src/modules/settings/data-model/types/SettingsNonCompositeFieldType.ts delete mode 100644 packages/twenty-front/src/modules/settings/data-model/types/SettingsSupportedFieldType.ts delete mode 100644 packages/twenty-front/src/modules/views/utils/getFilterDefinitionForViewFilter.ts create mode 100644 packages/twenty-front/src/types/ExcludeLiteral.ts create mode 100644 packages/twenty-front/src/types/PickLiteral.ts diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/MultipleFiltersDropdownContent.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/MultipleFiltersDropdownContent.tsx index 28f82a4e7c73..81ee172b3545 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/MultipleFiltersDropdownContent.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/MultipleFiltersDropdownContent.tsx @@ -6,6 +6,7 @@ import { ViewFilterOperand } from '@/views/types/ViewFilterOperand'; import { ObjectFilterDropdownRecordSelect } from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownRecordSelect'; import { ObjectFilterDropdownSourceSelect } from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownSourceSelect'; import { ObjectFilterDropdownTextSearchInput } from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownTextSearchInput'; +import { isActorSourceCompositeFilter } from '@/object-record/object-filter-dropdown/utils/isActorSourceCompositeFilter'; import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator'; import styled from '@emotion/styled'; import { useRecoilValue } from 'recoil'; @@ -98,9 +99,10 @@ export const MultipleFiltersDropdownContent = ({ 'ACTOR', 'ARRAY', 'PHONES', - ].includes(filterDefinitionUsedInDropdown.type) && ( - - )} + ].includes(filterDefinitionUsedInDropdown.type) && + !isActorSourceCompositeFilter( + filterDefinitionUsedInDropdown, + ) && } {['NUMBER', 'CURRENCY'].includes( filterDefinitionUsedInDropdown.type, ) && } @@ -116,7 +118,7 @@ export const MultipleFiltersDropdownContent = ({ )} - {filterDefinitionUsedInDropdown.type === 'SOURCE' && ( + {isActorSourceCompositeFilter(filterDefinitionUsedInDropdown) && ( <> diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelect.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelect.tsx index 15465b67df7d..5eb45abae62b 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelect.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelect.tsx @@ -1,16 +1,27 @@ import styled from '@emotion/styled'; -import { useEffect, useState } from 'react'; +import { useState } from 'react'; -import { ObjectFilterSelectMenu } from '@/object-record/object-filter-dropdown/components/ObjectFilterSelectMenu'; -import { ObjectFilterSelectSubMenu } from '@/object-record/object-filter-dropdown/components/ObjectFilterSelectSubMenu'; +import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer'; + +import { ObjectFilterDropdownFilterSelectCompositeFieldSubMenu } from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelectCompositeFieldSubMenu'; import { OBJECT_FILTER_DROPDOWN_ID } from '@/object-record/object-filter-dropdown/constants/ObjectFilterDropdownId'; +import { useFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useFilterDropdown'; import { useSelectFilter } from '@/object-record/object-filter-dropdown/hooks/useSelectFilter'; -import { currentSubMenuState } from '@/object-record/object-filter-dropdown/states/subMenuStates'; +import { CompositeFilterableFieldType } from '@/object-record/object-filter-dropdown/types/CompositeFilterableFieldType'; +import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition'; +import { FiltersHotkeyScope } from '@/object-record/object-filter-dropdown/types/FiltersHotkeyScope'; +import { isCompositeField } from '@/object-record/object-filter-dropdown/utils/isCompositeField'; +import { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope'; +import { SelectableItem } from '@/ui/layout/selectable-list/components/SelectableItem'; +import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList'; import { useSelectableList } from '@/ui/layout/selectable-list/hooks/useSelectableList'; +import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem'; +import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope'; import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import { availableFilterDefinitionsComponentState } from '@/views/states/availableFilterDefinitionsComponentState'; -import { useRecoilState } from 'recoil'; -import { isDefined } from 'twenty-ui'; +import { useRecoilValue } from 'recoil'; +import { isDefined, useIcons } from 'twenty-ui'; +import { getOperandsForFilterDefinition } from '../utils/getOperandsForFilterType'; export const StyledInput = styled.input` background: transparent; @@ -39,19 +50,33 @@ export const StyledInput = styled.input` `; export const ObjectFilterDropdownFilterSelect = () => { - const [searchText, setSearchText] = useState(''); + const [subMenuFieldType, setSubMenuFieldType] = + useState(null); + + const [firstLevelFilterDefinition, setFirstLevelFilterDefinition] = + useState(null); + + const { + setFilterDefinitionUsedInDropdown, + setSelectedOperandInDropdown, + setObjectFilterDropdownSearchInput, + objectFilterDropdownSearchInputState, + } = useFilterDropdown(); + + const objectFilterDropdownSearchInput = useRecoilValue( + objectFilterDropdownSearchInputState, + ); const availableFilterDefinitions = useRecoilComponentValueV2( availableFilterDefinitionsComponentState, ); - const [currentSubMenu, setCurrentSubMenu] = - useRecoilState(currentSubMenuState); - const sortedAvailableFilterDefinitions = [...availableFilterDefinitions] .sort((a, b) => a.label.localeCompare(b.label)) .filter((item) => - item.label.toLocaleLowerCase().includes(searchText.toLocaleLowerCase()), + item.label + .toLocaleLowerCase() + .includes(objectFilterDropdownSearchInput.toLocaleLowerCase()), ); const selectableListItemIds = sortedAvailableFilterDefinitions.map( @@ -76,21 +101,96 @@ export const ObjectFilterDropdownFilterSelect = () => { selectFilter({ filterDefinition: selectedFilterDefinition }); }; - useEffect(() => { - return () => { - setCurrentSubMenu(null); - }; - }, [setCurrentSubMenu]); - - return !currentSubMenu ? ( - - ) : ( - + const setHotkeyScope = useSetHotkeyScope(); + const { getIcon } = useIcons(); + + const handleSelectFilter = (availableFilterDefinition: FilterDefinition) => { + setFilterDefinitionUsedInDropdown(availableFilterDefinition); + + if ( + availableFilterDefinition.type === 'RELATION' || + availableFilterDefinition.type === 'SELECT' + ) { + setHotkeyScope(RelationPickerHotkeyScope.RelationPicker); + } + + setSelectedOperandInDropdown( + getOperandsForFilterDefinition(availableFilterDefinition)[0], + ); + + setObjectFilterDropdownSearchInput(''); + }; + + const handleSubMenuBack = () => { + setSubMenuFieldType(null); + setFirstLevelFilterDefinition(null); + }; + + const shouldShowFirstLevelMenu = !isDefined(subMenuFieldType); + + return ( + <> + {shouldShowFirstLevelMenu ? ( + <> + ) => + setObjectFilterDropdownSearchInput(event.target.value) + } + /> + + + {[...availableFilterDefinitions] + .sort((a, b) => a.label.localeCompare(b.label)) + .filter((item) => + item.label + .toLocaleLowerCase() + .includes( + objectFilterDropdownSearchInput.toLocaleLowerCase(), + ), + ) + .map((availableFilterDefinition, index) => ( + + { + if (isCompositeField(availableFilterDefinition.type)) { + setSubMenuFieldType(availableFilterDefinition.type); + setFirstLevelFilterDefinition( + availableFilterDefinition, + ); + } else { + handleSelectFilter(availableFilterDefinition); + } + }} + LeftIcon={getIcon(availableFilterDefinition.iconName)} + text={availableFilterDefinition.label} + hasSubMenu={isCompositeField( + availableFilterDefinition.type, + )} + /> + + ))} + + + + ) : ( + + )} + ); }; diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelectCompositeFieldSubMenu.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelectCompositeFieldSubMenu.tsx new file mode 100644 index 000000000000..a84046570924 --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelectCompositeFieldSubMenu.tsx @@ -0,0 +1,98 @@ +import { StyledInput } from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelect'; +import { useFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useFilterDropdown'; +import { CompositeFilterableFieldType } from '@/object-record/object-filter-dropdown/types/CompositeFilterableFieldType'; +import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition'; +import { getCompositeSubFieldLabel } from '@/object-record/object-filter-dropdown/utils/getCompositeSubFieldLabel'; +import { getFilterableFieldTypeLabel } from '@/object-record/object-filter-dropdown/utils/getFilterableFieldTypeLabel'; +import { getOperandsForFilterDefinition } from '@/object-record/object-filter-dropdown/utils/getOperandsForFilterType'; +import { SETTINGS_COMPOSITE_FIELD_TYPE_CONFIGS } from '@/settings/data-model/constants/SettingsCompositeFieldTypeConfigs'; +import { DropdownMenuHeader } from '@/ui/layout/dropdown/components/DropdownMenuHeader'; +import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer'; +import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem'; +import { useState } from 'react'; +import { IconApps, IconChevronLeft, useIcons } from 'twenty-ui'; + +type ObjectFilterDropdownFilterSelectCompositeFieldSubMenuProps = { + fieldType: CompositeFilterableFieldType; + firstLevelFieldDefinition: FilterDefinition | null; + onBack: () => void; +}; + +export const ObjectFilterDropdownFilterSelectCompositeFieldSubMenu = ({ + fieldType, + firstLevelFieldDefinition, + onBack, +}: ObjectFilterDropdownFilterSelectCompositeFieldSubMenuProps) => { + const [searchText, setSearchText] = useState(''); + + const { getIcon } = useIcons(); + + const { + setFilterDefinitionUsedInDropdown, + setSelectedOperandInDropdown, + setObjectFilterDropdownSearchInput, + } = useFilterDropdown(); + + const handleSelectFilter = (definition: FilterDefinition | null) => { + if (definition !== null) { + setFilterDefinitionUsedInDropdown(definition); + + setSelectedOperandInDropdown( + getOperandsForFilterDefinition(definition)[0], + ); + + setObjectFilterDropdownSearchInput(''); + } + }; + + const options = SETTINGS_COMPOSITE_FIELD_TYPE_CONFIGS[ + fieldType + ].filterableSubFields + .sort((a, b) => a.localeCompare(b)) + .filter((item) => + item.toLocaleLowerCase().includes(searchText.toLocaleLowerCase()), + ); + + return ( + <> + + {getFilterableFieldTypeLabel(fieldType)} + + ) => + setSearchText(event.target.value) + } + /> + + { + handleSelectFilter(firstLevelFieldDefinition); + }} + LeftIcon={IconApps} + text={`Any ${getFilterableFieldTypeLabel(fieldType)} field`} + /> + {options.map((subFieldName, index) => ( + + firstLevelFieldDefinition && + handleSelectFilter({ + ...firstLevelFieldDefinition, + label: getCompositeSubFieldLabel(fieldType, subFieldName), + compositeFieldName: subFieldName, + }) + } + text={getCompositeSubFieldLabel(fieldType, subFieldName)} + LeftIcon={getIcon(firstLevelFieldDefinition?.iconName)} + /> + ))} + + + ); +}; diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelectMenuItem.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelectMenuItem.tsx index da2127ee08bb..a1a12802fd1c 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelectMenuItem.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelectMenuItem.tsx @@ -1,14 +1,10 @@ import { OBJECT_FILTER_DROPDOWN_ID } from '@/object-record/object-filter-dropdown/constants/ObjectFilterDropdownId'; import { useSelectFilter } from '@/object-record/object-filter-dropdown/hooks/useSelectFilter'; -import { - currentParentFilterDefinitionState, - currentSubMenuState, -} from '@/object-record/object-filter-dropdown/states/subMenuStates'; + import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition'; -import { hasSubMenuFilter } from '@/object-record/object-filter-dropdown/utils/hasSubMenuFilter'; import { useSelectableList } from '@/ui/layout/selectable-list/hooks/useSelectableList'; import { MenuItemSelect } from '@/ui/navigation/menu-item/components/MenuItemSelect'; -import { useRecoilValue, useSetRecoilState } from 'recoil'; +import { useRecoilValue } from 'recoil'; import { useIcons } from 'twenty-ui'; export type ObjectFilterDropdownFilterSelectMenuItemProps = { @@ -28,24 +24,12 @@ export const ObjectFilterDropdownFilterSelectMenuItem = ({ isSelectedItemIdSelector(filterDefinition.fieldMetadataId), ); - const hasSubMenu = hasSubMenuFilter(filterDefinition.type); - const { getIcon } = useIcons(); - const setCurrentSubMenu = useSetRecoilState(currentSubMenuState); - const setCurrentParentFilterDefinition = useSetRecoilState( - currentParentFilterDefinitionState, - ); - const handleClick = () => { resetSelectedItem(); - if (hasSubMenu) { - setCurrentSubMenu(filterDefinition.type); - setCurrentParentFilterDefinition(filterDefinition); - } else { - selectFilter({ filterDefinition }); - } + selectFilter({ filterDefinition }); }; return ( @@ -55,7 +39,6 @@ export const ObjectFilterDropdownFilterSelectMenuItem = ({ onClick={handleClick} LeftIcon={getIcon(filterDefinition.iconName)} text={filterDefinition.label} - hasSubMenu={hasSubMenu} /> ); }; diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownOperandSelect.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownOperandSelect.tsx index c710d8f23334..b33fcbc162e3 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownOperandSelect.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownOperandSelect.tsx @@ -9,7 +9,7 @@ import { isDefined } from '~/utils/isDefined'; import { getInitialFilterValue } from '@/object-record/object-filter-dropdown/utils/getInitialFilterValue'; import { getOperandLabel } from '../utils/getOperandLabel'; -import { getOperandsForFilterType } from '../utils/getOperandsForFilterType'; +import { getOperandsForFilterDefinition } from '../utils/getOperandsForFilterType'; export const ObjectFilterDropdownOperandSelect = () => { const { @@ -31,9 +31,9 @@ export const ObjectFilterDropdownOperandSelect = () => { const selectedFilter = useRecoilValue(selectedFilterState); - const operandsForFilterType = getOperandsForFilterType( - filterDefinitionUsedInDropdown?.type, - ); + const operandsForFilterType = isDefined(filterDefinitionUsedInDropdown) + ? getOperandsForFilterDefinition(filterDefinitionUsedInDropdown) + : []; const handleOperandChange = (newOperand: ViewFilterOperand) => { const isValuelessOperand = [ diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownSourceSelect.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownSourceSelect.tsx index b0acad0bf247..153abd72b506 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownSourceSelect.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownSourceSelect.tsx @@ -3,7 +3,7 @@ import { useRecoilValue } from 'recoil'; import { v4 } from 'uuid'; import { useFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useFilterDropdown'; -import { getSourceEnumOptions } from '@/object-record/object-filter-dropdown/utils/getSourceEnumOptions'; +import { getActorSourceMultiSelectOptions } from '@/object-record/object-filter-dropdown/utils/getActorSourceMultiSelectOptions'; import { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope'; import { MultipleSelectDropdown } from '@/object-record/select/components/MultipleSelectDropdown'; import { SelectableItem } from '@/object-record/select/types/SelectableItem'; @@ -55,7 +55,7 @@ export const ObjectFilterDropdownSourceSelect = ({ const selectedFilter = useRecoilValue(selectedFilterState); - const sourceTypes = getSourceEnumOptions( + const sourceTypes = getActorSourceMultiSelectOptions( objectFilterDropdownSelectedRecordIds, ); diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterSelectMenu.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterSelectMenu.tsx deleted file mode 100644 index ad5d8bc6a5fd..000000000000 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterSelectMenu.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import styled from '@emotion/styled'; - -import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer'; - -import { ObjectFilterDropdownFilterSelectMenuItem } from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelectMenuItem'; -import { OBJECT_FILTER_DROPDOWN_ID } from '@/object-record/object-filter-dropdown/constants/ObjectFilterDropdownId'; -import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition'; -import { FiltersHotkeyScope } from '@/object-record/object-filter-dropdown/types/FiltersHotkeyScope'; -import { SelectableItem } from '@/ui/layout/selectable-list/components/SelectableItem'; -import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList'; - -export const StyledInput = styled.input` - background: transparent; - border: none; - border-top: none; - border-bottom: 1px solid ${({ theme }) => theme.border.color.light}; - border-radius: 0; - border-top-left-radius: ${({ theme }) => theme.border.radius.md}; - border-top-right-radius: ${({ theme }) => theme.border.radius.md}; - color: ${({ theme }) => theme.font.color.primary}; - margin: 0; - outline: none; - padding: ${({ theme }) => theme.spacing(2)}; - height: 19px; - font-family: inherit; - font-size: ${({ theme }) => theme.font.size.sm}; - - font-weight: inherit; - max-width: 100%; - overflow: hidden; - text-decoration: none; - - &::placeholder { - color: ${({ theme }) => theme.font.color.light}; - } -`; - -type ObjectFilterSelectMenuProps = { - searchText: string; - setSearchText: (searchText: string) => void; - sortedAvailableFilterDefinitions: FilterDefinition[]; - selectableListItemIds: string[]; - handleEnter: (itemId: string) => void; -}; - -export const ObjectFilterSelectMenu = ({ - searchText, - setSearchText, - sortedAvailableFilterDefinitions, - selectableListItemIds, - handleEnter, -}: ObjectFilterSelectMenuProps) => { - return ( - <> - ) => - setSearchText(event.target.value) - } - /> - - - {sortedAvailableFilterDefinitions.map( - (availableFilterDefinition: FilterDefinition, index: number) => ( - - - - ), - )} - - - - ); -}; diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterSelectSubMenu.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterSelectSubMenu.tsx deleted file mode 100644 index 205ca425e77b..000000000000 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterSelectSubMenu.tsx +++ /dev/null @@ -1,102 +0,0 @@ -import { StyledInput } from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelect'; -import { useFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useFilterDropdown'; -import { - currentParentFilterDefinitionState, - currentSubMenuState, -} from '@/object-record/object-filter-dropdown/states/subMenuStates'; -import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition'; -import { FilterType } from '@/object-record/object-filter-dropdown/types/FilterType'; -import { getHeaderTitle } from '@/object-record/object-filter-dropdown/utils/getHeaderTitle'; -import { getOperandsForFilterType } from '@/object-record/object-filter-dropdown/utils/getOperandsForFilterType'; -import { getSubMenuOptions } from '@/object-record/object-filter-dropdown/utils/getSubMenuOptions'; -import { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope'; -import { DropdownMenuHeader } from '@/ui/layout/dropdown/components/DropdownMenuHeader'; -import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer'; -import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem'; -import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope'; -import { useState } from 'react'; -import { useRecoilState, useRecoilValue } from 'recoil'; -import { IconChevronLeft, useIcons } from 'twenty-ui'; - -export const ObjectFilterSelectSubMenu = () => { - const [searchText, setSearchText] = useState(''); - const { getIcon } = useIcons(); - - const [currentSubMenu, setCurrentSubMenu] = - useRecoilState(currentSubMenuState); - - const currentParentFilterDefinition = useRecoilValue( - currentParentFilterDefinitionState, - ); - - const { - setFilterDefinitionUsedInDropdown, - setSelectedOperandInDropdown, - setObjectFilterDropdownSearchInput, - } = useFilterDropdown(); - - const setHotkeyScope = useSetHotkeyScope(); - - const handleSelectFilter = (definition: FilterDefinition | null) => { - if (definition !== null) { - setFilterDefinitionUsedInDropdown(definition); - if (definition.type === 'SOURCE') { - setHotkeyScope(RelationPickerHotkeyScope.RelationPicker); - } - - setSelectedOperandInDropdown( - getOperandsForFilterType(definition.type)?.[0], - ); - - setObjectFilterDropdownSearchInput(''); - } - }; - - return ( - <> - { - setCurrentSubMenu(null); - }} - > - {getHeaderTitle(currentSubMenu)} - - ) => - setSearchText(event.target.value) - } - /> - - {getSubMenuOptions(currentSubMenu) - .sort((a, b) => a.name.localeCompare(b.name)) - .filter((item) => - item.name - .toLocaleLowerCase() - .includes(searchText.toLocaleLowerCase()), - ) - .map((menuOption, index) => ( - { - currentParentFilterDefinition && - handleSelectFilter({ - ...currentParentFilterDefinition, - label: menuOption.name, - type: menuOption.type as FilterType, - }); - }} - text={menuOption.name} - LeftIcon={getIcon( - menuOption.icon || currentParentFilterDefinition?.iconName, - )} - /> - ))} - - - ); -}; diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/SingleEntityObjectFilterDropdownButton.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/SingleEntityObjectFilterDropdownButton.tsx index ddfb5125b9dc..571645a5c81e 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/SingleEntityObjectFilterDropdownButton.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/SingleEntityObjectFilterDropdownButton.tsx @@ -13,7 +13,7 @@ import { ViewFilterOperand } from '@/views/types/ViewFilterOperand'; import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import { availableFilterDefinitionsComponentState } from '@/views/states/availableFilterDefinitionsComponentState'; -import { getOperandsForFilterType } from '../utils/getOperandsForFilterType'; +import { getOperandsForFilterDefinition } from '../utils/getOperandsForFilterType'; import { GenericEntityFilterChip } from './GenericEntityFilterChip'; import { ObjectFilterDropdownRecordSelect } from './ObjectFilterDropdownRecordSelect'; import { ObjectFilterDropdownSearchInput } from './ObjectFilterDropdownSearchInput'; @@ -36,14 +36,16 @@ export const SingleEntityObjectFilterDropdownButton = ({ ); const selectedFilter = useRecoilValue(selectedFilterState); - const availableFilter = availableFilterDefinitions[0]; + const availableFilterDefinition = availableFilterDefinitions[0]; React.useEffect(() => { - setFilterDefinitionUsedInDropdown(availableFilter); - const defaultOperand = getOperandsForFilterType(availableFilter?.type)[0]; + setFilterDefinitionUsedInDropdown(availableFilterDefinition); + const defaultOperand = getOperandsForFilterDefinition( + availableFilterDefinition, + )[0]; setSelectedOperandInDropdown(defaultOperand); }, [ - availableFilter, + availableFilterDefinition, setFilterDefinitionUsedInDropdown, setSelectedOperandInDropdown, ]); @@ -62,7 +64,7 @@ export const SingleEntityObjectFilterDropdownButton = ({ filter={selectedFilter} Icon={ selectedFilter.operand === ViewFilterOperand.IsNotNull - ? availableFilter.SelectAllIcon + ? availableFilterDefinition.SelectAllIcon : undefined } /> diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/hooks/useSelectFilter.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/hooks/useSelectFilter.ts index 005135444a9e..c716971dc010 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/hooks/useSelectFilter.ts +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/hooks/useSelectFilter.ts @@ -1,7 +1,7 @@ import { useFilterDropdown } from '@/object-record/object-filter-dropdown/hooks/useFilterDropdown'; import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition'; import { getInitialFilterValue } from '@/object-record/object-filter-dropdown/utils/getInitialFilterValue'; -import { getOperandsForFilterType } from '@/object-record/object-filter-dropdown/utils/getOperandsForFilterType'; +import { getOperandsForFilterDefinition } from '@/object-record/object-filter-dropdown/utils/getOperandsForFilterType'; import { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope'; import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope'; import { v4 } from 'uuid'; @@ -31,12 +31,12 @@ export const useSelectFilter = () => { } setSelectedOperandInDropdown( - getOperandsForFilterType(filterDefinition.type)?.[0], + getOperandsForFilterDefinition(filterDefinition)[0], ); const { value, displayValue } = getInitialFilterValue( filterDefinition.type, - getOperandsForFilterType(filterDefinition.type)?.[0], + getOperandsForFilterDefinition(filterDefinition)[0], ); if (value !== '') { @@ -44,7 +44,7 @@ export const useSelectFilter = () => { id: v4(), fieldMetadataId: filterDefinition.fieldMetadataId, displayValue, - operand: getOperandsForFilterType(filterDefinition.type)?.[0], + operand: getOperandsForFilterDefinition(filterDefinition)[0], value, definition: filterDefinition, }); diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/states/subMenuStates.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/states/subMenuStates.ts deleted file mode 100644 index 5f0469a2a678..000000000000 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/states/subMenuStates.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition'; -import { FilterType } from '@/object-record/object-filter-dropdown/types/FilterType'; -import { atom } from 'recoil'; - -export const currentSubMenuState = atom({ - key: 'currentSubMenuState', - default: null, -}); - -export const currentParentFilterDefinitionState = atom( - { - key: 'currentParentFilterDefinitionState', - default: null, - }, -); diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/CompositeFilterableFieldType.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/CompositeFilterableFieldType.ts new file mode 100644 index 000000000000..0bdf399feb6b --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/CompositeFilterableFieldType.ts @@ -0,0 +1,5 @@ +import { FilterableFieldType } from '@/object-record/object-filter-dropdown/types/FilterableFieldType'; +import { CompositeFieldType } from '@/settings/data-model/types/CompositeFieldType'; + +export type CompositeFilterableFieldType = FilterableFieldType & + CompositeFieldType; diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/FilterDefinition.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/FilterDefinition.ts index 7f7cb678a5f1..b516bbeced7f 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/FilterDefinition.ts +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/FilterDefinition.ts @@ -1,15 +1,15 @@ import { IconComponent } from 'twenty-ui'; -import { FilterType } from './FilterType'; +import { FilterableFieldType } from './FilterableFieldType'; export type FilterDefinition = { fieldMetadataId: string; label: string; iconName: string; - type: FilterType; + type: FilterableFieldType; relationObjectMetadataNamePlural?: string; relationObjectMetadataNameSingular?: string; selectAllLabel?: string; SelectAllIcon?: IconComponent; - subFieldType?: FilterType; + compositeFieldName?: string; }; diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/FilterType.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/FilterableFieldType.ts similarity index 58% rename from packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/FilterType.ts rename to packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/FilterableFieldType.ts index cec0407c5177..833ebbd3a24f 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/FilterType.ts +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/FilterableFieldType.ts @@ -1,4 +1,8 @@ -export type FilterType = +import { FieldType } from '@/settings/data-model/types/FieldType'; +import { PickLiteral } from '~/types/PickLiteral'; + +export type FilterableFieldType = PickLiteral< + FieldType, | 'TEXT' | 'PHONE' | 'PHONES' @@ -18,4 +22,4 @@ export type FilterType = | 'MULTI_SELECT' | 'ACTOR' | 'ARRAY' - | 'SOURCE'; +>; diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/__tests__/getOperandsForFilterType.test.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/__tests__/getOperandsForFilterType.test.tsx index a06f8455d1f4..66ea29aa06cc 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/__tests__/getOperandsForFilterType.test.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/__tests__/getOperandsForFilterType.test.tsx @@ -1,7 +1,8 @@ -import { FilterType } from '@/object-record/object-filter-dropdown/types/FilterType'; import { ViewFilterOperand } from '@/views/types/ViewFilterOperand'; -import { getOperandsForFilterType } from '../getOperandsForFilterType'; +import { FilterableFieldType } from '@/object-record/object-filter-dropdown/types/FilterableFieldType'; +import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition'; +import { getOperandsForFilterDefinition } from '../getOperandsForFilterType'; describe('getOperandsForFilterType', () => { const emptyOperands = [ @@ -51,7 +52,9 @@ describe('getOperandsForFilterType', () => { testCases.forEach(([filterType, expectedOperands]) => { it(`should return correct operands for FilterType.${filterType}`, () => { - const result = getOperandsForFilterType(filterType as FilterType); + const result = getOperandsForFilterDefinition({ + type: filterType as FilterableFieldType, + } as FilterDefinition); expect(result).toEqual(expectedOperands); }); }); diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getSourceEnumOptions.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getActorSourceMultiSelectOptions.ts similarity index 67% rename from packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getSourceEnumOptions.ts rename to packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getActorSourceMultiSelectOptions.ts index 7006bb1ed8f1..b116a6fdb9a8 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getSourceEnumOptions.ts +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getActorSourceMultiSelectOptions.ts @@ -9,54 +9,54 @@ import { IconUserCircle, } from 'twenty-ui'; -export const getSourceEnumOptions = ( - selectedItemIds: string[], +export const getActorSourceMultiSelectOptions = ( + selectedSourceNames: string[], ): SelectableItem[] => { return [ { id: 'MANUAL', name: 'User', - isSelected: selectedItemIds.includes('MANUAL'), + isSelected: selectedSourceNames.includes('MANUAL'), AvatarIcon: IconUserCircle, isIconInverted: true, }, { id: 'IMPORT', name: 'Import', - isSelected: selectedItemIds.includes('IMPORT'), + isSelected: selectedSourceNames.includes('IMPORT'), AvatarIcon: IconCsv, isIconInverted: true, }, { id: 'API', name: 'Api', - isSelected: selectedItemIds.includes('API'), + isSelected: selectedSourceNames.includes('API'), AvatarIcon: IconApi, isIconInverted: true, }, { id: 'EMAIL', name: 'Email', - isSelected: selectedItemIds.includes('EMAIL'), + isSelected: selectedSourceNames.includes('EMAIL'), AvatarIcon: IconGmail, }, { id: 'CALENDAR', name: 'Calendar', - isSelected: selectedItemIds.includes('CALENDAR'), + isSelected: selectedSourceNames.includes('CALENDAR'), AvatarIcon: IconGoogleCalendar, }, { id: 'WORKFLOW', name: 'Workflow', - isSelected: selectedItemIds.includes('WORKFLOW'), + isSelected: selectedSourceNames.includes('WORKFLOW'), AvatarIcon: IconSettingsAutomation, isIconInverted: true, }, { id: 'SYSTEM', name: 'System', - isSelected: selectedItemIds.includes('SYSTEM'), + isSelected: selectedSourceNames.includes('SYSTEM'), AvatarIcon: IconRobot, isIconInverted: true, }, diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getCompositeSubFieldLabel.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getCompositeSubFieldLabel.ts new file mode 100644 index 000000000000..36c6f04a46c9 --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getCompositeSubFieldLabel.ts @@ -0,0 +1,12 @@ +import { SETTINGS_COMPOSITE_FIELD_TYPE_CONFIGS } from '@/settings/data-model/constants/SettingsCompositeFieldTypeConfigs'; +import { CompositeFieldType } from '@/settings/data-model/types/CompositeFieldType'; + +export const getCompositeSubFieldLabel = ( + compositeFieldType: CompositeFieldType, + subFieldName: (typeof SETTINGS_COMPOSITE_FIELD_TYPE_CONFIGS)[CompositeFieldType]['subFields'][number], +): string => { + return ( + SETTINGS_COMPOSITE_FIELD_TYPE_CONFIGS[compositeFieldType] + .labelBySubField as any + )[subFieldName]; +}; diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getFilterableFieldTypeLabel.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getFilterableFieldTypeLabel.ts new file mode 100644 index 000000000000..69f9334e0cf2 --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getFilterableFieldTypeLabel.ts @@ -0,0 +1,8 @@ +import { FilterableFieldType } from '@/object-record/object-filter-dropdown/types/FilterableFieldType'; +import { SETTINGS_FIELD_TYPE_CONFIGS } from '@/settings/data-model/constants/SettingsFieldTypeConfigs'; + +export const getFilterableFieldTypeLabel = ( + filterableFieldType: FilterableFieldType, +) => { + return SETTINGS_FIELD_TYPE_CONFIGS[filterableFieldType].label; +}; diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getHeaderTitle.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getHeaderTitle.ts deleted file mode 100644 index dcffda68384d..000000000000 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getHeaderTitle.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { FilterType } from '@/object-record/object-filter-dropdown/types/FilterType'; - -export const getHeaderTitle = ( - subMenu: FilterType | null, -): string | undefined => { - switch (subMenu) { - case 'ACTOR': - return 'Actor'; - case 'SOURCE': - return 'Creation Source'; - default: - return undefined; - } -}; diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getInitialFilterValue.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getInitialFilterValue.ts index 3076bef96d03..12c9ecb74d7d 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getInitialFilterValue.ts +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getInitialFilterValue.ts @@ -1,10 +1,10 @@ import { Filter } from '@/object-record/object-filter-dropdown/types/Filter'; -import { FilterType } from '@/object-record/object-filter-dropdown/types/FilterType'; +import { FilterableFieldType } from '@/object-record/object-filter-dropdown/types/FilterableFieldType'; import { ViewFilterOperand } from '@/views/types/ViewFilterOperand'; import { z } from 'zod'; export const getInitialFilterValue = ( - newType: FilterType, + newType: FilterableFieldType, newOperand: ViewFilterOperand, oldValue?: string, oldDisplayValue?: string, @@ -35,6 +35,7 @@ export const getInitialFilterValue = ( break; } } + return { value: oldValue ?? '', displayValue: oldDisplayValue ?? '', diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getOperandsForFilterType.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getOperandsForFilterType.ts index 80ac33bc660a..ba263c173c4c 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getOperandsForFilterType.ts +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getOperandsForFilterType.ts @@ -1,9 +1,9 @@ +import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition'; +import { isActorSourceCompositeFilter } from '@/object-record/object-filter-dropdown/utils/isActorSourceCompositeFilter'; import { ViewFilterOperand } from '@/views/types/ViewFilterOperand'; -import { FilterType } from '../types/FilterType'; - -export const getOperandsForFilterType = ( - filterType: FilterType | null | undefined, +export const getOperandsForFilterDefinition = ( + filterDefinition: FilterDefinition, ): ViewFilterOperand[] => { const emptyOperands = [ ViewFilterOperand.IsEmpty, @@ -12,7 +12,7 @@ export const getOperandsForFilterType = ( const relationOperands = [ViewFilterOperand.Is, ViewFilterOperand.IsNot]; - switch (filterType) { + switch (filterDefinition.type) { case 'TEXT': case 'EMAIL': case 'EMAILS': @@ -21,7 +21,6 @@ export const getOperandsForFilterType = ( case 'PHONE': case 'LINK': case 'LINKS': - case 'ACTOR': case 'ARRAY': case 'PHONES': return [ @@ -57,10 +56,23 @@ export const getOperandsForFilterType = ( ]; case 'RELATION': return [...relationOperands, ...emptyOperands]; - case 'SOURCE': - return [...relationOperands]; case 'SELECT': return [...relationOperands]; + case 'ACTOR': { + if (isActorSourceCompositeFilter(filterDefinition)) { + return [ + ViewFilterOperand.Is, + ViewFilterOperand.IsNot, + ...emptyOperands, + ]; + } + + return [ + ViewFilterOperand.Contains, + ViewFilterOperand.DoesNotContain, + ...emptyOperands, + ]; + } default: return []; } diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getSettingsNonCompositeFieldTypeLabels.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getSettingsNonCompositeFieldTypeLabels.ts new file mode 100644 index 000000000000..67a40d16400c --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getSettingsNonCompositeFieldTypeLabels.ts @@ -0,0 +1,10 @@ +import { SETTINGS_NON_COMPOSITE_FIELD_TYPE_CONFIGS } from '@/settings/data-model/constants/SettingsNonCompositeFieldTypeConfigs'; +import { SettingsNonCompositeFieldType } from '@/settings/data-model/types/SettingsNonCompositeFieldType'; + +export const getSettingsNonCompositeFieldTypeLabel = ( + settingsNonCompositeFieldType: SettingsNonCompositeFieldType, +) => { + return SETTINGS_NON_COMPOSITE_FIELD_TYPE_CONFIGS[ + settingsNonCompositeFieldType + ].label; +}; diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getSubMenuOptions.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getSubMenuOptions.ts index dde8aedbde3b..0c3bfb1fb097 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getSubMenuOptions.ts +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getSubMenuOptions.ts @@ -1,6 +1,6 @@ -import { FilterType } from '@/object-record/object-filter-dropdown/types/FilterType'; +import { FilterableFieldType } from '@/object-record/object-filter-dropdown/types/FilterableFieldType'; -export const getSubMenuOptions = (subMenu: FilterType | null) => { +export const getSubMenuOptions = (subMenu: FilterableFieldType | null) => { switch (subMenu) { case 'ACTOR': return [ diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/hasSubMenuFilter.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/hasSubMenuFilter.ts deleted file mode 100644 index 897670457d3f..000000000000 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/hasSubMenuFilter.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { FilterType } from '@/object-record/object-filter-dropdown/types/FilterType'; - -export const hasSubMenuFilter = (type: FilterType) => ['ACTOR'].includes(type); diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/isActorSourceCompositeFilter.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/isActorSourceCompositeFilter.ts new file mode 100644 index 000000000000..0d1d5046ab41 --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/isActorSourceCompositeFilter.ts @@ -0,0 +1,11 @@ +import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition'; +import { FieldActorValue } from '@/object-record/record-field/types/FieldMetadata'; + +export const isActorSourceCompositeFilter = ( + filterDefinition: FilterDefinition, +) => { + return ( + filterDefinition.compositeFieldName === + ('source' satisfies keyof FieldActorValue) + ); +}; diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/isCompositeField.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/isCompositeField.ts new file mode 100644 index 000000000000..6de44cd44e18 --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/isCompositeField.ts @@ -0,0 +1,8 @@ +import { + COMPOSITE_FIELD_TYPES, + CompositeFieldType, +} from '@/settings/data-model/types/CompositeFieldType'; +import { FieldType } from '@/settings/data-model/types/FieldType'; + +export const isCompositeField = (type: FieldType): type is CompositeFieldType => + COMPOSITE_FIELD_TYPES.includes(type as any); diff --git a/packages/twenty-front/src/modules/object-record/record-field/types/FieldMetadata.ts b/packages/twenty-front/src/modules/object-record/record-field/types/FieldMetadata.ts index a2a3339e1977..c6994db5a5f8 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/types/FieldMetadata.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/types/FieldMetadata.ts @@ -177,7 +177,7 @@ export type FieldMetadata = | FieldArrayMetadata; export type FieldTextValue = string; -export type FieldUUidValue = string; +export type FieldUUidValue = string; // TODO: can we replace with a template literal type, or maybe overkill ? export type FieldDateTimeValue = string | null; export type FieldDateValue = string | null; export type FieldNumberValue = number | null; @@ -225,6 +225,8 @@ export type FieldRelationValue< export type Json = ZodHelperLiteral | { [key: string]: Json } | Json[]; export type FieldJsonValue = Record | Json[] | null; +export type FieldRichTextValue = Record | Json[] | null; + export type FieldActorValue = { source: string; workspaceMemberId?: string; diff --git a/packages/twenty-front/src/modules/object-record/record-filter/utils/applyEmptyFilters.ts b/packages/twenty-front/src/modules/object-record/record-filter/utils/applyEmptyFilters.ts new file mode 100644 index 000000000000..5d4890f42e8f --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/record-filter/utils/applyEmptyFilters.ts @@ -0,0 +1,339 @@ +import { + ActorFilter, + AddressFilter, + CurrencyFilter, + DateFilter, + EmailsFilter, + FloatFilter, + RecordGqlOperationFilter, + RelationFilter, + StringFilter, + URLFilter, + UUIDFilter, +} from '@/object-record/graphql/types/RecordGqlOperationFilter'; +import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition'; +import { ViewFilterOperand } from '@/views/types/ViewFilterOperand'; +import { isNonEmptyString } from '@sniptt/guards'; +import { Field } from '~/generated/graphql'; +import { generateILikeFiltersForCompositeFields } from '~/utils/array/generateILikeFiltersForCompositeFields'; + +// TODO: fix this +export const applyEmptyFilters = ( + operand: ViewFilterOperand, + correspondingField: Pick, + objectRecordFilters: RecordGqlOperationFilter[], + definition: FilterDefinition, +) => { + let emptyRecordFilter: RecordGqlOperationFilter = {}; + + const compositeFieldName = definition.compositeFieldName; + + const isCompositeField = isNonEmptyString(compositeFieldName); + + switch (definition.type) { + case 'TEXT': + case 'EMAIL': + case 'PHONE': + emptyRecordFilter = { + or: [ + { [correspondingField.name]: { ilike: '' } as StringFilter }, + { [correspondingField.name]: { is: 'NULL' } as StringFilter }, + ], + }; + break; + case 'PHONES': { + if (!isCompositeField) { + const phonesFilter = generateILikeFiltersForCompositeFields( + '', + correspondingField.name, + ['primaryPhoneNumber', 'primaryPhoneCountryCode'], + true, + ); + + emptyRecordFilter = { + and: phonesFilter, + }; + break; + } else { + emptyRecordFilter = { + or: [ + { + [correspondingField.name]: { + [compositeFieldName]: { ilike: '' }, + } as StringFilter, + }, + { + [correspondingField.name]: { + [compositeFieldName]: { is: 'NULL' }, + } as StringFilter, + }, + ], + }; + break; + } + } + case 'CURRENCY': + emptyRecordFilter = { + or: [ + { + [correspondingField.name]: { + amountMicros: { is: 'NULL' }, + } as CurrencyFilter, + }, + ], + }; + break; + case 'FULL_NAME': { + if (!isCompositeField) { + const fullNameFilters = generateILikeFiltersForCompositeFields( + '', + correspondingField.name, + ['firstName', 'lastName'], + true, + ); + + emptyRecordFilter = { + and: fullNameFilters, + }; + } else { + emptyRecordFilter = { + or: [ + { + [correspondingField.name]: { + [compositeFieldName]: { ilike: '' }, + }, + }, + { + [correspondingField.name]: { + [compositeFieldName]: { is: 'NULL' }, + }, + }, + ], + }; + } + break; + } + case 'LINK': + emptyRecordFilter = { + or: [ + { [correspondingField.name]: { url: { ilike: '' } } as URLFilter }, + { + [correspondingField.name]: { url: { is: 'NULL' } } as URLFilter, + }, + ], + }; + break; + case 'LINKS': { + if (!isCompositeField) { + const linksFilters = generateILikeFiltersForCompositeFields( + '', + correspondingField.name, + ['primaryLinkLabel', 'primaryLinkUrl'], + true, + ); + + emptyRecordFilter = { + and: linksFilters, + }; + } else { + emptyRecordFilter = { + or: [ + { + [correspondingField.name]: { + [compositeFieldName]: { ilike: '' }, + } as URLFilter, + }, + { + [correspondingField.name]: { + [compositeFieldName]: { is: 'NULL' }, + } as URLFilter, + }, + ], + }; + } + break; + } + case 'ADDRESS': + if (!isCompositeField) { + emptyRecordFilter = { + and: [ + { + or: [ + { + [correspondingField.name]: { + addressStreet1: { ilike: '' }, + } as AddressFilter, + }, + { + [correspondingField.name]: { + addressStreet1: { is: 'NULL' }, + } as AddressFilter, + }, + ], + }, + { + or: [ + { + [correspondingField.name]: { + addressStreet2: { ilike: '' }, + } as AddressFilter, + }, + { + [correspondingField.name]: { + addressStreet2: { is: 'NULL' }, + } as AddressFilter, + }, + ], + }, + { + or: [ + { + [correspondingField.name]: { + addressCity: { ilike: '' }, + } as AddressFilter, + }, + { + [correspondingField.name]: { + addressCity: { is: 'NULL' }, + } as AddressFilter, + }, + ], + }, + { + or: [ + { + [correspondingField.name]: { + addressState: { ilike: '' }, + } as AddressFilter, + }, + { + [correspondingField.name]: { + addressState: { is: 'NULL' }, + } as AddressFilter, + }, + ], + }, + { + or: [ + { + [correspondingField.name]: { + addressCountry: { ilike: '' }, + } as AddressFilter, + }, + { + [correspondingField.name]: { + addressCountry: { is: 'NULL' }, + } as AddressFilter, + }, + ], + }, + { + or: [ + { + [correspondingField.name]: { + addressPostcode: { ilike: '' }, + } as AddressFilter, + }, + { + [correspondingField.name]: { + addressPostcode: { is: 'NULL' }, + } as AddressFilter, + }, + ], + }, + ], + }; + } else { + emptyRecordFilter = { + or: [ + { + [correspondingField.name]: { + [compositeFieldName]: { ilike: '' }, + } as AddressFilter, + }, + { + [correspondingField.name]: { + [compositeFieldName]: { is: 'NULL' }, + } as AddressFilter, + }, + ], + }; + } + break; + case 'NUMBER': + emptyRecordFilter = { + [correspondingField.name]: { is: 'NULL' } as FloatFilter, + }; + break; + case 'RATING': + emptyRecordFilter = { + [correspondingField.name]: { is: 'NULL' } as StringFilter, + }; + break; + case 'DATE': + case 'DATE_TIME': + emptyRecordFilter = { + [correspondingField.name]: { is: 'NULL' } as DateFilter, + }; + break; + case 'SELECT': + emptyRecordFilter = { + [correspondingField.name]: { is: 'NULL' } as UUIDFilter, + }; + break; + case 'RELATION': + emptyRecordFilter = { + [correspondingField.name + 'Id']: { is: 'NULL' } as RelationFilter, + }; + break; + case 'ACTOR': + emptyRecordFilter = { + or: [ + { + [correspondingField.name]: { + name: { ilike: '' }, + } as ActorFilter, + }, + { + [correspondingField.name]: { + name: { is: 'NULL' }, + } as ActorFilter, + }, + ], + }; + break; + case 'EMAILS': + emptyRecordFilter = { + or: [ + { + [correspondingField.name]: { + primaryEmail: { ilike: '' }, + } as EmailsFilter, + }, + { + [correspondingField.name]: { + primaryEmail: { is: 'NULL' }, + } as EmailsFilter, + }, + ], + }; + break; + default: + throw new Error(`Unsupported empty filter type ${definition.type}`); + } + + switch (operand) { + case ViewFilterOperand.IsEmpty: + objectRecordFilters.push(emptyRecordFilter); + break; + case ViewFilterOperand.IsNotEmpty: + objectRecordFilters.push({ + not: emptyRecordFilter, + }); + break; + default: + throw new Error( + `Unknown operand ${operand} for ${definition.type} filter`, + ); + } +}; diff --git a/packages/twenty-front/src/modules/object-record/record-filter/utils/turnObjectDropdownFilterIntoQueryFilter.ts b/packages/twenty-front/src/modules/object-record/record-filter/utils/turnObjectDropdownFilterIntoQueryFilter.ts index 323e36e2985a..ea849199cdda 100644 --- a/packages/twenty-front/src/modules/object-record/record-filter/utils/turnObjectDropdownFilterIntoQueryFilter.ts +++ b/packages/twenty-front/src/modules/object-record/record-filter/utils/turnObjectDropdownFilterIntoQueryFilter.ts @@ -10,9 +10,9 @@ import { RecordGqlOperationFilter, RelationFilter, StringFilter, + URLFilter, UUIDFilter, } from '@/object-record/graphql/types/RecordGqlOperationFilter'; -import { FilterType } from '@/object-record/object-filter-dropdown/types/FilterType'; import { makeAndFilterVariables } from '@/object-record/utils/makeAndFilterVariables'; import { ViewFilterOperand } from '@/views/types/ViewFilterOperand'; import { Field } from '~/generated/graphql'; @@ -24,244 +24,15 @@ import { convertLessThanRatingToArrayOfRatingValues, convertRatingToRatingValue, } from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownRatingInput'; +import { Filter } from '@/object-record/object-filter-dropdown/types/Filter'; +import { isActorSourceCompositeFilter } from '@/object-record/object-filter-dropdown/utils/isActorSourceCompositeFilter'; +import { applyEmptyFilters } from '@/object-record/record-filter/utils/applyEmptyFilters'; import { resolveFilterValue } from '@/views/utils/view-filter-value/resolveFilterValue'; import { endOfDay, roundToNearestMinutes, startOfDay } from 'date-fns'; import { z } from 'zod'; -import { Filter } from '../../object-filter-dropdown/types/Filter'; - -const applyEmptyFilters = ( - operand: ViewFilterOperand, - correspondingField: Pick, - objectRecordFilters: RecordGqlOperationFilter[], - filterType: FilterType, -) => { - let emptyRecordFilter: RecordGqlOperationFilter = {}; - - switch (filterType) { - case 'TEXT': - emptyRecordFilter = { - or: [ - { [correspondingField.name]: { ilike: '' } as StringFilter }, - { [correspondingField.name]: { is: 'NULL' } as StringFilter }, - ], - }; - break; - case 'PHONES': { - const phonesFilter = generateILikeFiltersForCompositeFields( - '', - correspondingField.name, - ['primaryPhoneNumber', 'primaryPhoneCountryCode'], - true, - ); - - emptyRecordFilter = { - and: phonesFilter, - }; - break; - } - case 'CURRENCY': - emptyRecordFilter = { - or: [ - { - [correspondingField.name]: { - amountMicros: { is: 'NULL' }, - } as CurrencyFilter, - }, - ], - }; - break; - case 'FULL_NAME': { - const fullNameFilters = generateILikeFiltersForCompositeFields( - '', - correspondingField.name, - ['firstName', 'lastName'], - true, - ); - - emptyRecordFilter = { - and: fullNameFilters, - }; - break; - } - case 'LINKS': { - const linksFilters = generateILikeFiltersForCompositeFields( - '', - correspondingField.name, - ['primaryLinkLabel', 'primaryLinkUrl'], - true, - ); - - emptyRecordFilter = { - and: linksFilters, - }; - break; - } - case 'ADDRESS': - emptyRecordFilter = { - and: [ - { - or: [ - { - [correspondingField.name]: { - addressStreet1: { ilike: '' }, - } as AddressFilter, - }, - { - [correspondingField.name]: { - addressStreet1: { is: 'NULL' }, - } as AddressFilter, - }, - ], - }, - { - or: [ - { - [correspondingField.name]: { - addressStreet2: { ilike: '' }, - } as AddressFilter, - }, - { - [correspondingField.name]: { - addressStreet2: { is: 'NULL' }, - } as AddressFilter, - }, - ], - }, - { - or: [ - { - [correspondingField.name]: { - addressCity: { ilike: '' }, - } as AddressFilter, - }, - { - [correspondingField.name]: { - addressCity: { is: 'NULL' }, - } as AddressFilter, - }, - ], - }, - { - or: [ - { - [correspondingField.name]: { - addressState: { ilike: '' }, - } as AddressFilter, - }, - { - [correspondingField.name]: { - addressState: { is: 'NULL' }, - } as AddressFilter, - }, - ], - }, - { - or: [ - { - [correspondingField.name]: { - addressCountry: { ilike: '' }, - } as AddressFilter, - }, - { - [correspondingField.name]: { - addressCountry: { is: 'NULL' }, - } as AddressFilter, - }, - ], - }, - { - or: [ - { - [correspondingField.name]: { - addressPostcode: { ilike: '' }, - } as AddressFilter, - }, - { - [correspondingField.name]: { - addressPostcode: { is: 'NULL' }, - } as AddressFilter, - }, - ], - }, - ], - }; - break; - case 'NUMBER': - emptyRecordFilter = { - [correspondingField.name]: { is: 'NULL' } as FloatFilter, - }; - break; - case 'RATING': - emptyRecordFilter = { - [correspondingField.name]: { is: 'NULL' } as StringFilter, - }; - break; - case 'DATE': - case 'DATE_TIME': - emptyRecordFilter = { - [correspondingField.name]: { is: 'NULL' } as DateFilter, - }; - break; - case 'SELECT': - emptyRecordFilter = { - [correspondingField.name]: { is: 'NULL' } as UUIDFilter, - }; - break; - case 'RELATION': - emptyRecordFilter = { - [correspondingField.name + 'Id']: { is: 'NULL' } as RelationFilter, - }; - break; - case 'ACTOR': - emptyRecordFilter = { - or: [ - { - [correspondingField.name]: { - name: { ilike: '' }, - } as ActorFilter, - }, - { - [correspondingField.name]: { - name: { is: 'NULL' }, - } as ActorFilter, - }, - ], - }; - break; - case 'EMAILS': - emptyRecordFilter = { - or: [ - { - [correspondingField.name]: { - primaryEmail: { ilike: '' }, - } as EmailsFilter, - }, - { - [correspondingField.name]: { - primaryEmail: { is: 'NULL' }, - } as EmailsFilter, - }, - ], - }; - break; - default: - throw new Error(`Unsupported empty filter type ${filterType}`); - } - - switch (operand) { - case ViewFilterOperand.IsEmpty: - objectRecordFilters.push(emptyRecordFilter); - break; - case ViewFilterOperand.IsNotEmpty: - objectRecordFilters.push({ - not: emptyRecordFilter, - }); - break; - default: - throw new Error(`Unknown operand ${operand} for ${filterType} filter`); - } -}; +// TODO: break this down into smaller functions and make the whole thing immutable +// Especially applyEmptyFilters export const turnObjectDropdownFilterIntoQueryFilter = ( rawUIFilters: Filter[], fields: Pick[], @@ -273,7 +44,11 @@ export const turnObjectDropdownFilterIntoQueryFilter = ( (field) => field.id === rawUIFilter.fieldMetadataId, ); - const isValuelessOperand = [ + const compositeFieldName = rawUIFilter.definition.compositeFieldName; + + const isCompositeFieldFiter = isNonEmptyString(compositeFieldName); + + const isEmptyOperand = [ ViewFilterOperand.IsEmpty, ViewFilterOperand.IsNotEmpty, ViewFilterOperand.IsInPast, @@ -285,7 +60,7 @@ export const turnObjectDropdownFilterIntoQueryFilter = ( continue; } - if (!isValuelessOperand) { + if (!isEmptyOperand) { if (!isDefined(rawUIFilter.value) || rawUIFilter.value === '') { continue; } @@ -316,7 +91,7 @@ export const turnObjectDropdownFilterIntoQueryFilter = ( rawUIFilter.operand, correspondingField, objectRecordFilters, - rawUIFilter.definition.type, + rawUIFilter.definition, ); break; default: @@ -355,7 +130,7 @@ export const turnObjectDropdownFilterIntoQueryFilter = ( rawUIFilter.operand, correspondingField, objectRecordFilters, - rawUIFilter.definition.type, + rawUIFilter.definition, ); break; } @@ -372,8 +147,9 @@ export const turnObjectDropdownFilterIntoQueryFilter = ( operand: ViewFilterOperand.IsRelative, }); - if (!defaultDateRange) + if (!defaultDateRange) { throw new Error('Failed to resolve default date range'); + } const { start, end } = dateRange ?? defaultDateRange; @@ -484,7 +260,7 @@ export const turnObjectDropdownFilterIntoQueryFilter = ( rawUIFilter.operand, correspondingField, objectRecordFilters, - rawUIFilter.definition.type, + rawUIFilter.definition, ); break; default: @@ -515,7 +291,7 @@ export const turnObjectDropdownFilterIntoQueryFilter = ( rawUIFilter.operand, correspondingField, objectRecordFilters, - rawUIFilter.definition.type, + rawUIFilter.definition, ); break; default: @@ -525,7 +301,7 @@ export const turnObjectDropdownFilterIntoQueryFilter = ( } break; case 'RELATION': { - if (!isValuelessOperand) { + if (!isEmptyOperand) { try { JSON.parse(rawUIFilter.value); } catch (e) { @@ -570,7 +346,7 @@ export const turnObjectDropdownFilterIntoQueryFilter = ( rawUIFilter.operand, correspondingField, objectRecordFilters, - rawUIFilter.definition.type, + rawUIFilter.definition, ); break; default: @@ -603,7 +379,44 @@ export const turnObjectDropdownFilterIntoQueryFilter = ( rawUIFilter.operand, correspondingField, objectRecordFilters, - rawUIFilter.definition.type, + rawUIFilter.definition, + ); + break; + default: + throw new Error( + `Unknown operand ${rawUIFilter.operand} for ${rawUIFilter.definition.type} filter`, + ); + } + break; + case 'LINK': + switch (rawUIFilter.operand) { + case ViewFilterOperand.Contains: + objectRecordFilters.push({ + [correspondingField.name]: { + url: { + ilike: `%${rawUIFilter.value}%`, + }, + } as URLFilter, + }); + break; + case ViewFilterOperand.DoesNotContain: + objectRecordFilters.push({ + not: { + [correspondingField.name]: { + url: { + ilike: `%${rawUIFilter.value}%`, + }, + } as URLFilter, + }, + }); + break; + case ViewFilterOperand.IsEmpty: + case ViewFilterOperand.IsNotEmpty: + applyEmptyFilters( + rawUIFilter.operand, + correspondingField, + objectRecordFilters, + rawUIFilter.definition, ); break; default: @@ -618,20 +431,43 @@ export const turnObjectDropdownFilterIntoQueryFilter = ( correspondingField.name, ['primaryLinkLabel', 'primaryLinkUrl'], ); + switch (rawUIFilter.operand) { case ViewFilterOperand.Contains: - objectRecordFilters.push({ - or: linksFilters, - }); + if (!isCompositeFieldFiter) { + objectRecordFilters.push({ + or: linksFilters, + }); + } else { + objectRecordFilters.push({ + [correspondingField.name]: { + [compositeFieldName]: { + ilike: `%${rawUIFilter.value}%`, + }, + }, + }); + } break; case ViewFilterOperand.DoesNotContain: - objectRecordFilters.push({ - and: linksFilters.map((filter) => { - return { - not: filter, - }; - }), - }); + if (!isCompositeFieldFiter) { + objectRecordFilters.push({ + and: linksFilters.map((filter) => { + return { + not: filter, + }; + }), + }); + } else { + objectRecordFilters.push({ + not: { + [correspondingField.name]: { + [compositeFieldName]: { + ilike: `%${rawUIFilter.value}%`, + }, + }, + }, + }); + } break; case ViewFilterOperand.IsEmpty: case ViewFilterOperand.IsNotEmpty: @@ -639,7 +475,7 @@ export const turnObjectDropdownFilterIntoQueryFilter = ( rawUIFilter.operand, correspondingField, objectRecordFilters, - rawUIFilter.definition.type, + rawUIFilter.definition, ); break; default: @@ -657,18 +493,40 @@ export const turnObjectDropdownFilterIntoQueryFilter = ( ); switch (rawUIFilter.operand) { case ViewFilterOperand.Contains: - objectRecordFilters.push({ - or: fullNameFilters, - }); + if (!isCompositeFieldFiter) { + objectRecordFilters.push({ + or: fullNameFilters, + }); + } else { + objectRecordFilters.push({ + [correspondingField.name]: { + [compositeFieldName]: { + ilike: `%${rawUIFilter.value}%`, + }, + }, + }); + } break; case ViewFilterOperand.DoesNotContain: - objectRecordFilters.push({ - and: fullNameFilters.map((filter) => { - return { - not: filter, - }; - }), - }); + if (!isCompositeFieldFiter) { + objectRecordFilters.push({ + and: fullNameFilters.map((filter) => { + return { + not: filter, + }; + }), + }); + } else { + objectRecordFilters.push({ + not: { + [correspondingField.name]: { + [compositeFieldName]: { + ilike: `%${rawUIFilter.value}%`, + }, + }, + }, + }); + } break; case ViewFilterOperand.IsEmpty: case ViewFilterOperand.IsNotEmpty: @@ -676,7 +534,7 @@ export const turnObjectDropdownFilterIntoQueryFilter = ( rawUIFilter.operand, correspondingField, objectRecordFilters, - rawUIFilter.definition.type, + rawUIFilter.definition, ); break; default: @@ -689,85 +547,107 @@ export const turnObjectDropdownFilterIntoQueryFilter = ( case 'ADDRESS': switch (rawUIFilter.operand) { case ViewFilterOperand.Contains: - objectRecordFilters.push({ - or: [ - { - [correspondingField.name]: { - addressStreet1: { - ilike: `%${rawUIFilter.value}%`, - }, - } as AddressFilter, - }, - { - [correspondingField.name]: { - addressStreet2: { - ilike: `%${rawUIFilter.value}%`, - }, - } as AddressFilter, - }, - { - [correspondingField.name]: { - addressCity: { - ilike: `%${rawUIFilter.value}%`, - }, - } as AddressFilter, - }, - { - [correspondingField.name]: { - addressState: { - ilike: `%${rawUIFilter.value}%`, - }, - } as AddressFilter, - }, - { - [correspondingField.name]: { - addressCountry: { - ilike: `%${rawUIFilter.value}%`, - }, - } as AddressFilter, - }, - { - [correspondingField.name]: { - addressPostcode: { - ilike: `%${rawUIFilter.value}%`, - }, - } as AddressFilter, - }, - ], - }); - break; - case ViewFilterOperand.DoesNotContain: - objectRecordFilters.push({ - and: [ - { - not: { + if (!isCompositeFieldFiter) { + objectRecordFilters.push({ + or: [ + { [correspondingField.name]: { addressStreet1: { ilike: `%${rawUIFilter.value}%`, }, } as AddressFilter, }, - }, - { - not: { + { [correspondingField.name]: { addressStreet2: { ilike: `%${rawUIFilter.value}%`, }, } as AddressFilter, }, - }, - { - not: { + { [correspondingField.name]: { addressCity: { ilike: `%${rawUIFilter.value}%`, }, } as AddressFilter, }, + { + [correspondingField.name]: { + addressState: { + ilike: `%${rawUIFilter.value}%`, + }, + } as AddressFilter, + }, + { + [correspondingField.name]: { + addressCountry: { + ilike: `%${rawUIFilter.value}%`, + }, + } as AddressFilter, + }, + { + [correspondingField.name]: { + addressPostcode: { + ilike: `%${rawUIFilter.value}%`, + }, + } as AddressFilter, + }, + ], + }); + } else { + objectRecordFilters.push({ + [correspondingField.name]: { + [compositeFieldName]: { + ilike: `%${rawUIFilter.value}%`, + } as AddressFilter, }, - ], - }); + }); + } + break; + case ViewFilterOperand.DoesNotContain: + if (!isCompositeFieldFiter) { + objectRecordFilters.push({ + and: [ + { + not: { + [correspondingField.name]: { + addressStreet1: { + ilike: `%${rawUIFilter.value}%`, + }, + } as AddressFilter, + }, + }, + { + not: { + [correspondingField.name]: { + addressStreet2: { + ilike: `%${rawUIFilter.value}%`, + }, + } as AddressFilter, + }, + }, + { + not: { + [correspondingField.name]: { + addressCity: { + ilike: `%${rawUIFilter.value}%`, + }, + } as AddressFilter, + }, + }, + ], + }); + } else { + objectRecordFilters.push({ + not: { + [correspondingField.name]: { + [compositeFieldName]: { + ilike: `%${rawUIFilter.value}%`, + } as AddressFilter, + }, + }, + }); + } break; case ViewFilterOperand.IsEmpty: case ViewFilterOperand.IsNotEmpty: @@ -775,7 +655,7 @@ export const turnObjectDropdownFilterIntoQueryFilter = ( rawUIFilter.operand, correspondingField, objectRecordFilters, - rawUIFilter.definition.type, + rawUIFilter.definition, ); break; default: @@ -785,12 +665,12 @@ export const turnObjectDropdownFilterIntoQueryFilter = ( } break; case 'SELECT': { - if (isValuelessOperand) { + if (isEmptyOperand) { applyEmptyFilters( rawUIFilter.operand, correspondingField, objectRecordFilters, - rawUIFilter.definition.type, + rawUIFilter.definition, ); break; } @@ -836,41 +716,33 @@ export const turnObjectDropdownFilterIntoQueryFilter = ( break; } case 'ACTOR': - if (rawUIFilter.definition.subFieldType !== undefined) { + if (isActorSourceCompositeFilter(rawUIFilter.definition)) { const parsedRecordIds = JSON.parse(rawUIFilter.value) as string[]; - switch (rawUIFilter.definition.subFieldType) { - case 'SOURCE': - switch (rawUIFilter.operand) { - case ViewFilterOperand.Is: - objectRecordFilters.push({ + + switch (rawUIFilter.operand) { + case ViewFilterOperand.Is: + objectRecordFilters.push({ + [correspondingField.name]: { + source: { + in: parsedRecordIds, + } as RelationFilter, + }, + }); + + break; + case ViewFilterOperand.IsNot: + if (parsedRecordIds.length > 0) { + objectRecordFilters.push({ + not: { [correspondingField.name]: { source: { in: parsedRecordIds, } as RelationFilter, }, - }); - - break; - case ViewFilterOperand.IsNot: - if (parsedRecordIds.length > 0) { - objectRecordFilters.push({ - not: { - [correspondingField.name]: { - [rawUIFilter.definition.subFieldType.toLowerCase()]: { - in: parsedRecordIds, - } as RelationFilter, - }, - }, - }); - } - - break; - - default: - throw new Error( - `Unknown operand ${rawUIFilter.operand} for ${rawUIFilter.definition.subFieldType} filter`, - ); + }, + }); } + break; } } else { switch (rawUIFilter.operand) { @@ -908,15 +780,14 @@ export const turnObjectDropdownFilterIntoQueryFilter = ( rawUIFilter.operand, correspondingField, objectRecordFilters, - rawUIFilter.definition.type, + rawUIFilter.definition, ); break; default: throw new Error( - `Unknown operand ${rawUIFilter.operand} for ${rawUIFilter.definition.type} filter`, + `Unknown operand ${rawUIFilter.operand} for ${rawUIFilter.definition.label} filter`, ); } - break; } break; case 'EMAILS': @@ -955,7 +826,7 @@ export const turnObjectDropdownFilterIntoQueryFilter = ( rawUIFilter.operand, correspondingField, objectRecordFilters, - rawUIFilter.definition.type, + rawUIFilter.definition, ); break; default: @@ -991,7 +862,7 @@ export const turnObjectDropdownFilterIntoQueryFilter = ( rawUIFilter.operand, correspondingField, objectRecordFilters, - rawUIFilter.definition.type, + rawUIFilter.definition, ); break; default: diff --git a/packages/twenty-front/src/modules/object-record/record-index/hooks/useHandleToggleColumnFilter.ts b/packages/twenty-front/src/modules/object-record/record-index/hooks/useHandleToggleColumnFilter.ts index 41d4fc49d99c..f15fe3ea9661 100644 --- a/packages/twenty-front/src/modules/object-record/record-index/hooks/useHandleToggleColumnFilter.ts +++ b/packages/twenty-front/src/modules/object-record/record-index/hooks/useHandleToggleColumnFilter.ts @@ -5,7 +5,8 @@ import { useColumnDefinitionsFromFieldMetadata } from '@/object-metadata/hooks/u import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { getFilterTypeFromFieldType } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions'; import { Filter } from '@/object-record/object-filter-dropdown/types/Filter'; -import { getOperandsForFilterType } from '@/object-record/object-filter-dropdown/utils/getOperandsForFilterType'; +import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition'; +import { getOperandsForFilterDefinition } from '@/object-record/object-filter-dropdown/utils/getOperandsForFilterType'; import { useDropdownV2 } from '@/ui/layout/dropdown/hooks/useDropdownV2'; import { useUpsertCombinedViewFilters } from '@/views/hooks/useUpsertCombinedViewFilters'; import { isDefined } from '~/utils/isDefined'; @@ -42,7 +43,15 @@ export const useHandleToggleColumnFilter = ({ correspondingColumnDefinition?.type, ); - const availableOperandsForFilter = getOperandsForFilterType(filterType); + const filterDefinition = { + label: correspondingColumnDefinition.label, + iconName: correspondingColumnDefinition.iconName, + fieldMetadataId, + type: filterType, + } satisfies FilterDefinition; + + const availableOperandsForFilter = + getOperandsForFilterDefinition(filterDefinition); const defaultOperand = availableOperandsForFilter[0]; @@ -51,12 +60,7 @@ export const useHandleToggleColumnFilter = ({ fieldMetadataId, operand: defaultOperand, displayValue: '', - definition: { - label: correspondingColumnDefinition.label, - iconName: correspondingColumnDefinition.iconName, - fieldMetadataId, - type: filterType, - }, + definition: filterDefinition, value: '', }; diff --git a/packages/twenty-front/src/modules/settings/data-model/constants/SettingsCompositeFieldTypeConfigs.ts b/packages/twenty-front/src/modules/settings/data-model/constants/SettingsCompositeFieldTypeConfigs.ts new file mode 100644 index 000000000000..4181fd65e807 --- /dev/null +++ b/packages/twenty-front/src/modules/settings/data-model/constants/SettingsCompositeFieldTypeConfigs.ts @@ -0,0 +1,190 @@ +import { CurrencyCode } from '@/object-record/record-field/types/CurrencyCode'; +import { + FieldActorValue, + FieldAddressValue, + FieldCurrencyValue, + FieldEmailsValue, + FieldFullNameValue, + FieldLinksValue, + FieldLinkValue, + FieldPhonesValue, +} from '@/object-record/record-field/types/FieldMetadata'; +import { SettingsFieldTypeConfig } from '@/settings/data-model/constants/SettingsNonCompositeFieldTypeConfigs'; +import { CompositeFieldType } from '@/settings/data-model/types/CompositeFieldType'; +import { + IllustrationIconCurrency, + IllustrationIconLink, + IllustrationIconMail, + IllustrationIconMap, + IllustrationIconPhone, + IllustrationIconSetting, + IllustrationIconUser, +} from 'twenty-ui'; +import { FieldMetadataType } from '~/generated-metadata/graphql'; + +export type SettingsCompositeFieldTypeConfig = SettingsFieldTypeConfig & { + subFields: (keyof T)[]; + filterableSubFields: (keyof T)[]; + labelBySubField: Record; + exampleValue: T; +}; + +type SettingsCompositeFieldTypeConfigArray = Record< + CompositeFieldType, + SettingsCompositeFieldTypeConfig +>; + +export const SETTINGS_COMPOSITE_FIELD_TYPE_CONFIGS = { + [FieldMetadataType.Currency]: { + label: 'Currency', + Icon: IllustrationIconCurrency, + subFields: ['amountMicros', 'currencyCode'], + filterableSubFields: ['amountMicros', 'currencyCode'], + labelBySubField: { + amountMicros: 'Amount', + currencyCode: 'Currency', + }, + exampleValue: { + amountMicros: 2000000000, + currencyCode: CurrencyCode.USD, + }, + category: 'Basic', + } as const satisfies SettingsCompositeFieldTypeConfig, + [FieldMetadataType.Emails]: { + label: 'Emails', + Icon: IllustrationIconMail, + subFields: ['primaryEmail', 'additionalEmails'], + filterableSubFields: ['primaryEmail'], + labelBySubField: { + primaryEmail: 'Primary Email', + additionalEmails: 'Additional Emails', + }, + exampleValue: { + primaryEmail: 'john@twenty.com', + additionalEmails: [ + 'tim@twenty.com', + 'timapple@twenty.com', + 'johnappletim@twenty.com', + ], + }, + category: 'Basic', + } as const satisfies SettingsCompositeFieldTypeConfig, + [FieldMetadataType.Link]: { + label: 'Link', + Icon: IllustrationIconLink, + exampleValue: { url: 'www.twenty.com', label: '' }, + category: 'Basic', + subFields: ['url', 'label'], + filterableSubFields: ['url', 'label'], + labelBySubField: { + url: 'URL', + label: 'Label', + }, + } as const satisfies SettingsCompositeFieldTypeConfig, + [FieldMetadataType.Links]: { + label: 'Links', + Icon: IllustrationIconLink, + exampleValue: { + primaryLinkUrl: 'twenty.com', + primaryLinkLabel: '', + secondaryLinks: [{ url: 'twenty.com', label: 'Twenty' }], + }, + category: 'Basic', + subFields: ['primaryLinkUrl', 'primaryLinkLabel', 'secondaryLinks'], + filterableSubFields: ['primaryLinkUrl', 'primaryLinkLabel'], + labelBySubField: { + primaryLinkUrl: 'Link URL', + primaryLinkLabel: 'Link Label', + secondaryLinks: 'Secondary Links', + }, + } as const satisfies SettingsCompositeFieldTypeConfig, + [FieldMetadataType.Phones]: { + label: 'Phones', + Icon: IllustrationIconPhone, + exampleValue: { + primaryPhoneNumber: '234-567-890', + primaryPhoneCountryCode: '+1', + additionalPhones: [{ number: '234-567-890', countryCode: '+1' }], + }, + subFields: [ + 'primaryPhoneNumber', + 'primaryPhoneCountryCode', + 'additionalPhones', + ], + filterableSubFields: ['primaryPhoneNumber', 'primaryPhoneCountryCode'], + labelBySubField: { + primaryPhoneNumber: 'Primary Phone Number', + primaryPhoneCountryCode: 'Primary Phone Country Code', + additionalPhones: 'Additional Phones', + }, + category: 'Basic', + } as const satisfies SettingsCompositeFieldTypeConfig, + [FieldMetadataType.FullName]: { + label: 'Full Name', + Icon: IllustrationIconUser, + exampleValue: { firstName: 'John', lastName: 'Doe' }, + category: 'Advanced', + subFields: ['firstName', 'lastName'], + filterableSubFields: ['firstName', 'lastName'], + labelBySubField: { + firstName: 'First Name', + lastName: 'Last Name', + }, + } as const satisfies SettingsCompositeFieldTypeConfig, + [FieldMetadataType.Address]: { + label: 'Address', + Icon: IllustrationIconMap, + subFields: [ + 'addressStreet1', + 'addressStreet2', + 'addressCity', + 'addressState', + 'addressCountry', + 'addressPostcode', + 'addressLat', + 'addressLng', + ], + filterableSubFields: [ + 'addressStreet1', + 'addressStreet2', + 'addressCity', + 'addressState', + 'addressCountry', + 'addressPostcode', + ], + labelBySubField: { + addressStreet1: 'Address 1', + addressStreet2: 'Address 2', + addressCity: 'City', + addressState: 'State', + addressCountry: 'Country', + addressPostcode: 'Post Code', + addressLat: 'Latitude', + addressLng: 'Longitude', + }, + exampleValue: { + addressStreet1: '456 Oak Street', + addressStreet2: 'Unit 3B', + addressCity: 'Springfield', + addressState: 'California', + addressCountry: 'United States', + addressPostcode: '90210', + addressLat: 34.0522, + addressLng: -118.2437, + }, + category: 'Basic', + } as const satisfies SettingsCompositeFieldTypeConfig, + [FieldMetadataType.Actor]: { + label: 'Actor', + Icon: IllustrationIconSetting, + category: 'Basic', + subFields: ['source', 'name', 'workspaceMemberId'], + filterableSubFields: ['source', 'name', 'workspaceMemberId'], + labelBySubField: { + source: 'Source', + name: 'Name', + workspaceMemberId: 'Workspace Member ID', + }, + exampleValue: { source: 'source', name: 'name', workspaceMemberId: 'id' }, + } as const satisfies SettingsCompositeFieldTypeConfig, +} as const satisfies SettingsCompositeFieldTypeConfigArray; diff --git a/packages/twenty-front/src/modules/settings/data-model/constants/SettingsFieldTypeConfigs.ts b/packages/twenty-front/src/modules/settings/data-model/constants/SettingsFieldTypeConfigs.ts index c8cea11fdeb3..1105be7ca947 100644 --- a/packages/twenty-front/src/modules/settings/data-model/constants/SettingsFieldTypeConfigs.ts +++ b/packages/twenty-front/src/modules/settings/data-model/constants/SettingsFieldTypeConfigs.ts @@ -1,196 +1,7 @@ -import { - IconComponent, - IllustrationIconArray, - IllustrationIconCalendarEvent, - IllustrationIconCalendarTime, - IllustrationIconCurrency, - IllustrationIconJson, - IllustrationIconLink, - IllustrationIconMail, - IllustrationIconMap, - IllustrationIconNumbers, - IllustrationIconOneToMany, - IllustrationIconPhone, - IllustrationIconSetting, - IllustrationIconStar, - IllustrationIconTag, - IllustrationIconTags, - IllustrationIconText, - IllustrationIconToggle, - IllustrationIconUid, - IllustrationIconUser, -} from 'twenty-ui'; - -import { CurrencyCode } from '@/object-record/record-field/types/CurrencyCode'; -import { DEFAULT_DATE_VALUE } from '@/settings/data-model/constants/DefaultDateValue'; -import { SettingsFieldTypeCategoryType } from '@/settings/data-model/types/SettingsFieldTypeCategoryType'; -import { SettingsSupportedFieldType } from '@/settings/data-model/types/SettingsSupportedFieldType'; -import { FieldMetadataType } from '~/generated-metadata/graphql'; - -DEFAULT_DATE_VALUE.setFullYear(DEFAULT_DATE_VALUE.getFullYear() + 2); - -export type SettingsFieldTypeConfig = { - label: string; - Icon: IconComponent; - exampleValue?: unknown; - category: SettingsFieldTypeCategoryType; -}; +import { SETTINGS_COMPOSITE_FIELD_TYPE_CONFIGS } from '@/settings/data-model/constants/SettingsCompositeFieldTypeConfigs'; +import { SETTINGS_NON_COMPOSITE_FIELD_TYPE_CONFIGS } from '@/settings/data-model/constants/SettingsNonCompositeFieldTypeConfigs'; export const SETTINGS_FIELD_TYPE_CONFIGS = { - [FieldMetadataType.Uuid]: { - label: 'Unique ID', - Icon: IllustrationIconUid, - exampleValue: '00000000-0000-0000-0000-000000000000', - category: 'Advanced', - }, - [FieldMetadataType.Text]: { - label: 'Text', - Icon: IllustrationIconText, - exampleValue: - 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum magna enim, dapibus non enim in, lacinia faucibus nunc. Sed interdum ante sed felis facilisis, eget ultricies neque molestie. Mauris auctor, justo eu volutpat cursus, libero erat tempus nulla, non sodales lorem lacus a est.', - category: 'Basic', - }, - [FieldMetadataType.Numeric]: { - label: 'Numeric', - Icon: IllustrationIconNumbers, - exampleValue: 2000, - category: 'Basic', - }, - [FieldMetadataType.Number]: { - label: 'Number', - Icon: IllustrationIconNumbers, - exampleValue: 2000, - category: 'Basic', - }, - [FieldMetadataType.Link]: { - label: 'Link', - Icon: IllustrationIconLink, - exampleValue: { url: 'www.twenty.com', label: '' }, - category: 'Basic', - }, - [FieldMetadataType.Links]: { - label: 'Links', - Icon: IllustrationIconLink, - exampleValue: { primaryLinkUrl: 'twenty.com', primaryLinkLabel: '' }, - category: 'Basic', - }, - [FieldMetadataType.Boolean]: { - label: 'True/False', - Icon: IllustrationIconToggle, - exampleValue: true, - category: 'Basic', - }, - [FieldMetadataType.DateTime]: { - label: 'Date and Time', - Icon: IllustrationIconCalendarTime, - exampleValue: DEFAULT_DATE_VALUE.toISOString(), - category: 'Basic', - }, - [FieldMetadataType.Date]: { - label: 'Date', - Icon: IllustrationIconCalendarEvent, - exampleValue: DEFAULT_DATE_VALUE.toISOString(), - category: 'Basic', - }, - [FieldMetadataType.Select]: { - label: 'Select', - Icon: IllustrationIconTag, - category: 'Basic', - }, - [FieldMetadataType.MultiSelect]: { - label: 'Multi-select', - Icon: IllustrationIconTags, - category: 'Basic', - }, - [FieldMetadataType.Currency]: { - label: 'Currency', - Icon: IllustrationIconCurrency, - exampleValue: { amountMicros: 2000000000, currencyCode: CurrencyCode.USD }, - category: 'Basic', - }, - [FieldMetadataType.Relation]: { - label: 'Relation', - Icon: IllustrationIconOneToMany, - category: 'Relation', - }, - [FieldMetadataType.Email]: { - label: 'Email', - Icon: IllustrationIconMail, - category: 'Basic', - }, - [FieldMetadataType.Emails]: { - label: 'Emails', - Icon: IllustrationIconMail, - exampleValue: { primaryEmail: 'john@twenty.com' }, - category: 'Basic', - }, - [FieldMetadataType.Phone]: { - label: 'Phone', - Icon: IllustrationIconPhone, - exampleValue: '+1234-567-890', - category: 'Basic', - }, - [FieldMetadataType.Phones]: { - label: 'Phones', - Icon: IllustrationIconPhone, - exampleValue: { - primaryPhoneNumber: '234-567-890', - primaryPhoneCountryCode: '+1', - }, - category: 'Basic', - }, - [FieldMetadataType.Rating]: { - label: 'Rating', - Icon: IllustrationIconStar, - exampleValue: '3', - category: 'Basic', - }, - [FieldMetadataType.FullName]: { - label: 'Full Name', - Icon: IllustrationIconUser, - exampleValue: { firstName: 'John', lastName: 'Doe' }, - category: 'Advanced', - }, - [FieldMetadataType.Address]: { - label: 'Address', - Icon: IllustrationIconMap, - exampleValue: { - addressStreet1: '456 Oak Street', - addressStreet2: 'Unit 3B', - addressCity: 'Springfield', - addressState: 'California', - addressCountry: 'United States', - addressPostcode: '90210', - addressLat: 34.0522, - addressLng: -118.2437, - }, - category: 'Basic', - }, - [FieldMetadataType.RawJson]: { - label: 'JSON', - Icon: IllustrationIconJson, - exampleValue: { key: 'value' }, - - category: 'Basic', - }, - [FieldMetadataType.RichText]: { - label: 'System', - Icon: IllustrationIconSetting, - exampleValue: { key: 'value' }, - category: 'Basic', - }, - [FieldMetadataType.Actor]: { - label: 'System', - Icon: IllustrationIconSetting, - category: 'Basic', - }, - [FieldMetadataType.Array]: { - label: 'Array', - Icon: IllustrationIconArray, - category: 'Basic', - exampleValue: ['value1', 'value2'], - }, -} as const satisfies Record< - SettingsSupportedFieldType, - SettingsFieldTypeConfig ->; + ...SETTINGS_COMPOSITE_FIELD_TYPE_CONFIGS, + ...SETTINGS_NON_COMPOSITE_FIELD_TYPE_CONFIGS, +}; diff --git a/packages/twenty-front/src/modules/settings/data-model/constants/SettingsNonCompositeFieldTypeConfigs.ts b/packages/twenty-front/src/modules/settings/data-model/constants/SettingsNonCompositeFieldTypeConfigs.ts new file mode 100644 index 000000000000..42f291b60eff --- /dev/null +++ b/packages/twenty-front/src/modules/settings/data-model/constants/SettingsNonCompositeFieldTypeConfigs.ts @@ -0,0 +1,152 @@ +import { + IconComponent, + IllustrationIconArray, + IllustrationIconCalendarEvent, + IllustrationIconCalendarTime, + IllustrationIconJson, + IllustrationIconMail, + IllustrationIconNumbers, + IllustrationIconOneToMany, + IllustrationIconPhone, + IllustrationIconSetting, + IllustrationIconStar, + IllustrationIconTag, + IllustrationIconTags, + IllustrationIconText, + IllustrationIconToggle, + IllustrationIconUid, +} from 'twenty-ui'; + +import { + FieldArrayValue, + FieldBooleanValue, + FieldDateTimeValue, + FieldDateValue, + FieldEmailValue, + FieldJsonValue, + FieldMultiSelectValue, + FieldNumberValue, + FieldPhoneValue, + FieldRatingValue, + FieldRelationValue, + FieldRichTextValue, + FieldSelectValue, + FieldTextValue, + FieldUUidValue, +} from '@/object-record/record-field/types/FieldMetadata'; +import { DEFAULT_DATE_VALUE } from '@/settings/data-model/constants/DefaultDateValue'; +import { SettingsFieldTypeCategoryType } from '@/settings/data-model/types/SettingsFieldTypeCategoryType'; +import { SettingsNonCompositeFieldType } from '@/settings/data-model/types/SettingsNonCompositeFieldType'; +import { FieldMetadataType } from '~/generated-metadata/graphql'; + +DEFAULT_DATE_VALUE.setFullYear(DEFAULT_DATE_VALUE.getFullYear() + 2); + +export type SettingsFieldTypeConfig = { + label: string; + Icon: IconComponent; + exampleValue?: T; + category: SettingsFieldTypeCategoryType; +}; + +type SettingsNonCompositeFieldTypeConfigArray = Record< + SettingsNonCompositeFieldType, + SettingsFieldTypeConfig +>; + +// TODO: can we derive this from backend definitions ? +export const SETTINGS_NON_COMPOSITE_FIELD_TYPE_CONFIGS: SettingsNonCompositeFieldTypeConfigArray = + { + [FieldMetadataType.Uuid]: { + label: 'Unique ID', + Icon: IllustrationIconUid, + exampleValue: '00000000-0000-0000-0000-000000000000', + category: 'Advanced', + } as const satisfies SettingsFieldTypeConfig, + [FieldMetadataType.Text]: { + label: 'Text', + Icon: IllustrationIconText, + exampleValue: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum magna enim, dapibus non enim in, lacinia faucibus nunc. Sed interdum ante sed felis facilisis, eget ultricies neque molestie. Mauris auctor, justo eu volutpat cursus, libero erat tempus nulla, non sodales lorem lacus a est.', + category: 'Basic', + } as const satisfies SettingsFieldTypeConfig, + [FieldMetadataType.Numeric]: { + label: 'Numeric', + Icon: IllustrationIconNumbers, + exampleValue: 2000, + category: 'Basic', + } as const satisfies SettingsFieldTypeConfig, + [FieldMetadataType.Number]: { + label: 'Number', + Icon: IllustrationIconNumbers, + exampleValue: 2000, + category: 'Basic', + } as const satisfies SettingsFieldTypeConfig, + [FieldMetadataType.Boolean]: { + label: 'True/False', + Icon: IllustrationIconToggle, + exampleValue: true, + category: 'Basic', + } as const satisfies SettingsFieldTypeConfig, + [FieldMetadataType.DateTime]: { + label: 'Date and Time', + Icon: IllustrationIconCalendarTime, + exampleValue: DEFAULT_DATE_VALUE.toISOString(), + category: 'Basic', + } as const satisfies SettingsFieldTypeConfig, + [FieldMetadataType.Date]: { + label: 'Date', + Icon: IllustrationIconCalendarEvent, + exampleValue: DEFAULT_DATE_VALUE.toISOString(), + category: 'Basic', + } as const satisfies SettingsFieldTypeConfig, + [FieldMetadataType.Select]: { + label: 'Select', + Icon: IllustrationIconTag, + category: 'Basic', + } as const satisfies SettingsFieldTypeConfig, + [FieldMetadataType.MultiSelect]: { + label: 'Multi-select', + Icon: IllustrationIconTags, + category: 'Basic', + } as const satisfies SettingsFieldTypeConfig, + [FieldMetadataType.Relation]: { + label: 'Relation', + Icon: IllustrationIconOneToMany, + category: 'Relation', + } as const satisfies SettingsFieldTypeConfig>, + [FieldMetadataType.Email]: { + label: 'Email', + Icon: IllustrationIconMail, + category: 'Basic', + } as const satisfies SettingsFieldTypeConfig, + [FieldMetadataType.Phone]: { + label: 'Phone', + Icon: IllustrationIconPhone, + exampleValue: '+1234-567-890', + category: 'Basic', + } as const satisfies SettingsFieldTypeConfig, + [FieldMetadataType.Rating]: { + label: 'Rating', + Icon: IllustrationIconStar, + exampleValue: 'RATING_3', + category: 'Basic', + } as const satisfies SettingsFieldTypeConfig, + [FieldMetadataType.RawJson]: { + label: 'JSON', + Icon: IllustrationIconJson, + exampleValue: { key: 'value' }, + category: 'Basic', + } as const satisfies SettingsFieldTypeConfig, + [FieldMetadataType.RichText]: { + label: 'Rich Text', + Icon: IllustrationIconSetting, + exampleValue: { key: 'value' }, + category: 'Basic', + } as const satisfies SettingsFieldTypeConfig, + [FieldMetadataType.Array]: { + label: 'Array', + Icon: IllustrationIconArray, + category: 'Basic', + exampleValue: ['value1', 'value2'], + } as const satisfies SettingsFieldTypeConfig, + }; diff --git a/packages/twenty-front/src/modules/settings/data-model/fields/forms/components/SettingsDataModelFieldTypeSelect.tsx b/packages/twenty-front/src/modules/settings/data-model/fields/forms/components/SettingsDataModelFieldTypeSelect.tsx index 14e68598e33d..b75d880d5578 100644 --- a/packages/twenty-front/src/modules/settings/data-model/fields/forms/components/SettingsDataModelFieldTypeSelect.tsx +++ b/packages/twenty-front/src/modules/settings/data-model/fields/forms/components/SettingsDataModelFieldTypeSelect.tsx @@ -2,14 +2,13 @@ import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem'; import { SettingsCard } from '@/settings/components/SettingsCard'; import { SETTINGS_FIELD_TYPE_CATEGORIES } from '@/settings/data-model/constants/SettingsFieldTypeCategories'; import { SETTINGS_FIELD_TYPE_CATEGORY_DESCRIPTIONS } from '@/settings/data-model/constants/SettingsFieldTypeCategoryDescriptions'; -import { - SETTINGS_FIELD_TYPE_CONFIGS, - SettingsFieldTypeConfig, -} from '@/settings/data-model/constants/SettingsFieldTypeConfigs'; +import { SETTINGS_FIELD_TYPE_CONFIGS } from '@/settings/data-model/constants/SettingsFieldTypeConfigs'; +import { SettingsFieldTypeConfig } from '@/settings/data-model/constants/SettingsNonCompositeFieldTypeConfigs'; + import { useBooleanSettingsFormInitialValues } from '@/settings/data-model/fields/forms/boolean/hooks/useBooleanSettingsFormInitialValues'; import { useCurrencySettingsFormInitialValues } from '@/settings/data-model/fields/forms/currency/hooks/useCurrencySettingsFormInitialValues'; import { useSelectSettingsFormInitialValues } from '@/settings/data-model/fields/forms/select/hooks/useSelectSettingsFormInitialValues'; -import { SettingsSupportedFieldType } from '@/settings/data-model/types/SettingsSupportedFieldType'; +import { SettingsFieldType } from '@/settings/data-model/types/SettingsFieldType'; import { TextInput } from '@/ui/input/components/TextInput'; import { useTheme } from '@emotion/react'; import styled from '@emotion/styled'; @@ -23,8 +22,8 @@ import { FieldMetadataType } from '~/generated-metadata/graphql'; export const settingsDataModelFieldTypeFormSchema = z.object({ type: z.enum( Object.keys(SETTINGS_FIELD_TYPE_CONFIGS) as [ - SettingsSupportedFieldType, - ...SettingsSupportedFieldType[], + SettingsFieldType, + ...SettingsFieldType[], ], ), }); @@ -35,7 +34,7 @@ export type SettingsDataModelFieldTypeFormValues = z.infer< type SettingsDataModelFieldTypeSelectProps = { className?: string; - excludedFieldTypes?: SettingsSupportedFieldType[]; + excludedFieldTypes?: SettingsFieldType[]; fieldMetadataItem?: Pick< FieldMetadataItem, 'defaultValue' | 'options' | 'type' @@ -78,11 +77,11 @@ export const SettingsDataModelFieldTypeSelect = ({ const theme = useTheme(); const { control } = useFormContext(); const [searchQuery, setSearchQuery] = useState(''); - const fieldTypeConfigs = Object.entries( + const fieldTypeConfigs = Object.entries>( SETTINGS_FIELD_TYPE_CONFIGS, ).filter( ([key, config]) => - !excludedFieldTypes.includes(key as SettingsSupportedFieldType) && + !excludedFieldTypes.includes(key as SettingsFieldType) && config.label.toLowerCase().includes(searchQuery.toLowerCase()), ); @@ -95,7 +94,7 @@ export const SettingsDataModelFieldTypeSelect = ({ const { resetDefaultValueField: resetSelectDefaultValueField } = useSelectSettingsFormInitialValues({ fieldMetadataItem }); - const resetDefaultValueField = (nextValue: SettingsSupportedFieldType) => { + const resetDefaultValueField = (nextValue: SettingsFieldType) => { switch (nextValue) { case FieldMetadataType.Boolean: resetBooleanDefaultValueField(); @@ -118,7 +117,7 @@ export const SettingsDataModelFieldTypeSelect = ({ control={control} defaultValue={ fieldMetadataItem && fieldMetadataItem.type in fieldTypeConfigs - ? (fieldMetadataItem.type as SettingsSupportedFieldType) + ? (fieldMetadataItem.type as SettingsFieldType) : FieldMetadataType.Text } render={({ field: { onChange } }) => ( @@ -147,10 +146,8 @@ export const SettingsDataModelFieldTypeSelect = ({ { - onChange(key as SettingsSupportedFieldType); - resetDefaultValueField( - key as SettingsSupportedFieldType, - ); + onChange(key as SettingsFieldType); + resetDefaultValueField(key as SettingsFieldType); onFieldTypeSelect(); }} Icon={ diff --git a/packages/twenty-front/src/modules/settings/data-model/fields/preview/utils/getCurrencyFieldPreviewValue.ts b/packages/twenty-front/src/modules/settings/data-model/fields/preview/utils/getCurrencyFieldPreviewValue.ts index fc139304bd81..2fd5b32eae40 100644 --- a/packages/twenty-front/src/modules/settings/data-model/fields/preview/utils/getCurrencyFieldPreviewValue.ts +++ b/packages/twenty-front/src/modules/settings/data-model/fields/preview/utils/getCurrencyFieldPreviewValue.ts @@ -16,9 +16,11 @@ export const getCurrencyFieldPreviewValue = ({ }): FieldCurrencyValue | null => { if (fieldMetadataItem.type !== FieldMetadataType.Currency) return null; - const placeholderDefaultValue = getSettingsFieldTypeConfig( + const currencyFieldTypeConfig = getSettingsFieldTypeConfig( FieldMetadataType.Currency, - ).exampleValue; + ); + + const placeholderDefaultValue = currencyFieldTypeConfig.exampleValue; return currencyFieldDefaultValueSchema .transform((value) => ({ diff --git a/packages/twenty-front/src/modules/settings/data-model/object-details/components/SettingsObjectFieldDataType.tsx b/packages/twenty-front/src/modules/settings/data-model/object-details/components/SettingsObjectFieldDataType.tsx index 4fe7cccf71ff..188e5b97211c 100644 --- a/packages/twenty-front/src/modules/settings/data-model/object-details/components/SettingsObjectFieldDataType.tsx +++ b/packages/twenty-front/src/modules/settings/data-model/object-details/components/SettingsObjectFieldDataType.tsx @@ -3,7 +3,7 @@ import styled from '@emotion/styled'; import { Link } from 'react-router-dom'; import { IconComponent, IconTwentyStar } from 'twenty-ui'; -import { SettingsSupportedFieldType } from '@/settings/data-model/types/SettingsSupportedFieldType'; +import { SettingsFieldType } from '@/settings/data-model/types/SettingsFieldType'; import { getSettingsFieldTypeConfig } from '@/settings/data-model/utils/getSettingsFieldTypeConfig'; import { FieldMetadataType } from '~/generated-metadata/graphql'; @@ -11,11 +11,11 @@ type SettingsObjectFieldDataTypeProps = { to?: string; Icon?: IconComponent; label?: string; - value: SettingsSupportedFieldType; + value: SettingsFieldType; }; const StyledDataType = styled.div<{ - value: SettingsSupportedFieldType; + value: SettingsFieldType; to?: string; }>` align-items: center; diff --git a/packages/twenty-front/src/modules/settings/data-model/types/CompositeFieldType.ts b/packages/twenty-front/src/modules/settings/data-model/types/CompositeFieldType.ts new file mode 100644 index 000000000000..f1186c6d1047 --- /dev/null +++ b/packages/twenty-front/src/modules/settings/data-model/types/CompositeFieldType.ts @@ -0,0 +1,21 @@ +import { FieldType } from '@/settings/data-model/types/FieldType'; +import { PickLiteral } from '~/types/PickLiteral'; + +// TODO: add to future fullstack shared package +export const COMPOSITE_FIELD_TYPES = [ + 'CURRENCY', + 'EMAILS', + 'LINK', + 'LINKS', + 'ADDRESS', + 'PHONES', + 'FULL_NAME', + 'ACTOR', +] as const; + +type CompositeFieldTypeBaseLiteral = (typeof COMPOSITE_FIELD_TYPES)[number]; + +export type CompositeFieldType = PickLiteral< + FieldType, + CompositeFieldTypeBaseLiteral +>; diff --git a/packages/twenty-front/src/modules/settings/data-model/types/FieldType.ts b/packages/twenty-front/src/modules/settings/data-model/types/FieldType.ts new file mode 100644 index 000000000000..66a579162c3c --- /dev/null +++ b/packages/twenty-front/src/modules/settings/data-model/types/FieldType.ts @@ -0,0 +1,3 @@ +import { FieldMetadataType } from '~/generated-metadata/graphql'; + +export type FieldType = `${FieldMetadataType}`; diff --git a/packages/twenty-front/src/modules/settings/data-model/types/NonCompositeFieldType.ts b/packages/twenty-front/src/modules/settings/data-model/types/NonCompositeFieldType.ts new file mode 100644 index 000000000000..fdf439ed0e90 --- /dev/null +++ b/packages/twenty-front/src/modules/settings/data-model/types/NonCompositeFieldType.ts @@ -0,0 +1,8 @@ +import { CompositeFieldType } from '@/settings/data-model/types/CompositeFieldType'; +import { FieldType } from '@/settings/data-model/types/FieldType'; +import { ExcludeLiteral } from '~/types/ExcludeLiteral'; + +export type NonCompositeFieldType = ExcludeLiteral< + FieldType, + CompositeFieldType +>; diff --git a/packages/twenty-front/src/modules/settings/data-model/types/SettingsCompositeFieldType.ts b/packages/twenty-front/src/modules/settings/data-model/types/SettingsCompositeFieldType.ts new file mode 100644 index 000000000000..87b96acaaba0 --- /dev/null +++ b/packages/twenty-front/src/modules/settings/data-model/types/SettingsCompositeFieldType.ts @@ -0,0 +1,8 @@ +import { CompositeFieldType } from '@/settings/data-model/types/CompositeFieldType'; +import { SettingsFieldType } from '@/settings/data-model/types/SettingsFieldType'; +import { PickLiteral } from '~/types/PickLiteral'; + +export type SettingsCompositeFieldType = PickLiteral< + SettingsFieldType, + CompositeFieldType +>; diff --git a/packages/twenty-front/src/modules/settings/data-model/types/SettingsExcludedFieldType.ts b/packages/twenty-front/src/modules/settings/data-model/types/SettingsExcludedFieldType.ts new file mode 100644 index 000000000000..3c7041e9f233 --- /dev/null +++ b/packages/twenty-front/src/modules/settings/data-model/types/SettingsExcludedFieldType.ts @@ -0,0 +1,7 @@ +import { FieldType } from '@/settings/data-model/types/FieldType'; +import { PickLiteral } from '~/types/PickLiteral'; + +export type SettingsExcludedFieldType = PickLiteral< + FieldType, + 'POSITION' | 'TS_VECTOR' +>; diff --git a/packages/twenty-front/src/modules/settings/data-model/types/SettingsFieldType.ts b/packages/twenty-front/src/modules/settings/data-model/types/SettingsFieldType.ts new file mode 100644 index 000000000000..98f2a491a6b5 --- /dev/null +++ b/packages/twenty-front/src/modules/settings/data-model/types/SettingsFieldType.ts @@ -0,0 +1,8 @@ +import { FieldType } from '@/settings/data-model/types/FieldType'; +import { SettingsExcludedFieldType } from '@/settings/data-model/types/SettingsExcludedFieldType'; +import { ExcludeLiteral } from '~/types/ExcludeLiteral'; + +export type SettingsFieldType = ExcludeLiteral< + FieldType, + SettingsExcludedFieldType +>; diff --git a/packages/twenty-front/src/modules/settings/data-model/types/SettingsNonCompositeFieldType.ts b/packages/twenty-front/src/modules/settings/data-model/types/SettingsNonCompositeFieldType.ts new file mode 100644 index 000000000000..73aabf77df52 --- /dev/null +++ b/packages/twenty-front/src/modules/settings/data-model/types/SettingsNonCompositeFieldType.ts @@ -0,0 +1,8 @@ +import { NonCompositeFieldType } from '@/settings/data-model/types/NonCompositeFieldType'; +import { SettingsExcludedFieldType } from '@/settings/data-model/types/SettingsExcludedFieldType'; +import { ExcludeLiteral } from '~/types/ExcludeLiteral'; + +export type SettingsNonCompositeFieldType = ExcludeLiteral< + NonCompositeFieldType, + SettingsExcludedFieldType +>; diff --git a/packages/twenty-front/src/modules/settings/data-model/types/SettingsSupportedFieldType.ts b/packages/twenty-front/src/modules/settings/data-model/types/SettingsSupportedFieldType.ts deleted file mode 100644 index 215e96ff114d..000000000000 --- a/packages/twenty-front/src/modules/settings/data-model/types/SettingsSupportedFieldType.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { FieldMetadataType } from '~/generated-metadata/graphql'; - -export type SettingsSupportedFieldType = Exclude< - FieldMetadataType, - FieldMetadataType.Position | FieldMetadataType.TsVector ->; diff --git a/packages/twenty-front/src/modules/settings/data-model/utils/getSettingsFieldTypeConfig.ts b/packages/twenty-front/src/modules/settings/data-model/utils/getSettingsFieldTypeConfig.ts index 3278a1dee42a..307ff6a3f6f6 100644 --- a/packages/twenty-front/src/modules/settings/data-model/utils/getSettingsFieldTypeConfig.ts +++ b/packages/twenty-front/src/modules/settings/data-model/utils/getSettingsFieldTypeConfig.ts @@ -1,13 +1,6 @@ import { SETTINGS_FIELD_TYPE_CONFIGS } from '@/settings/data-model/constants/SettingsFieldTypeConfigs'; -import { SettingsSupportedFieldType } from '@/settings/data-model/types/SettingsSupportedFieldType'; -import { isFieldTypeSupportedInSettings } from '@/settings/data-model/utils/isFieldTypeSupportedInSettings'; -import { FieldMetadataType } from '~/generated-metadata/graphql'; +import { SettingsFieldType } from '@/settings/data-model/types/SettingsFieldType'; -export const getSettingsFieldTypeConfig = ( - fieldType: T, -) => - (isFieldTypeSupportedInSettings(fieldType) - ? SETTINGS_FIELD_TYPE_CONFIGS[fieldType] - : undefined) as T extends SettingsSupportedFieldType - ? (typeof SETTINGS_FIELD_TYPE_CONFIGS)[T] - : undefined; +export const getSettingsFieldTypeConfig = (fieldType: SettingsFieldType) => { + return SETTINGS_FIELD_TYPE_CONFIGS[fieldType as SettingsFieldType]; +}; diff --git a/packages/twenty-front/src/modules/settings/data-model/utils/isFieldTypeSupportedInSettings.ts b/packages/twenty-front/src/modules/settings/data-model/utils/isFieldTypeSupportedInSettings.ts index 4d9a377b704a..52171d87e40a 100644 --- a/packages/twenty-front/src/modules/settings/data-model/utils/isFieldTypeSupportedInSettings.ts +++ b/packages/twenty-front/src/modules/settings/data-model/utils/isFieldTypeSupportedInSettings.ts @@ -1,8 +1,7 @@ import { SETTINGS_FIELD_TYPE_CONFIGS } from '@/settings/data-model/constants/SettingsFieldTypeConfigs'; -import { SettingsSupportedFieldType } from '@/settings/data-model/types/SettingsSupportedFieldType'; -import { FieldMetadataType } from '~/generated-metadata/graphql'; +import { FieldType } from '@/settings/data-model/types/FieldType'; +import { SettingsFieldType } from '@/settings/data-model/types/SettingsFieldType'; export const isFieldTypeSupportedInSettings = ( - fieldType: FieldMetadataType, -): fieldType is SettingsSupportedFieldType => - fieldType in SETTINGS_FIELD_TYPE_CONFIGS; + fieldType: FieldType, +): fieldType is SettingsFieldType => fieldType in SETTINGS_FIELD_TYPE_CONFIGS; diff --git a/packages/twenty-front/src/modules/views/hooks/useUpsertCombinedViewFilters.ts b/packages/twenty-front/src/modules/views/hooks/useUpsertCombinedViewFilters.ts index fd33eb009583..7c5e2d99b956 100644 --- a/packages/twenty-front/src/modules/views/hooks/useUpsertCombinedViewFilters.ts +++ b/packages/twenty-front/src/modules/views/hooks/useUpsertCombinedViewFilters.ts @@ -106,15 +106,18 @@ export const useUpsertCombinedViewFilters = (viewBarComponentId?: string) => { return; } + const newValue = [ + ...unsavedToUpsertViewFilters, + { + ...upsertedFilter, + id: upsertedFilter.id, + __typename: 'ViewFilter', + } satisfies ViewFilter, + ] satisfies ViewFilter[]; + set( unsavedToUpsertViewFiltersCallbackState({ viewId: currentViewId }), - [ - ...unsavedToUpsertViewFilters, - { - ...upsertedFilter, - __typename: 'ViewFilter', - } satisfies ViewFilter, - ], + newValue, ); }, [ diff --git a/packages/twenty-front/src/modules/views/utils/__tests__/viewMapFunctions.test.ts b/packages/twenty-front/src/modules/views/utils/__tests__/viewMapFunctions.test.ts index 68acdb054655..c191b799d550 100644 --- a/packages/twenty-front/src/modules/views/utils/__tests__/viewMapFunctions.test.ts +++ b/packages/twenty-front/src/modules/views/utils/__tests__/viewMapFunctions.test.ts @@ -16,6 +16,7 @@ const baseDefinition = { fieldMetadataId: '05731f68-6e7a-4903-8374-c0b6a9063482', label: 'label', iconName: 'iconName', + fieldName: 'fieldName', }; describe('mapViewSortsToSorts', () => { diff --git a/packages/twenty-front/src/modules/views/utils/getFilterDefinitionForViewFilter.ts b/packages/twenty-front/src/modules/views/utils/getFilterDefinitionForViewFilter.ts deleted file mode 100644 index d66b6f26b6fd..000000000000 --- a/packages/twenty-front/src/modules/views/utils/getFilterDefinitionForViewFilter.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition'; -import { hasSubMenuFilter } from '@/object-record/object-filter-dropdown/utils/hasSubMenuFilter'; -import { ViewFilter } from '../types/ViewFilter'; - -export const getFilterDefinitionForViewFilter = ( - viewFilter: ViewFilter, - availableFilterDefinition: FilterDefinition, -): FilterDefinition => { - return { - ...availableFilterDefinition, - subFieldType: - hasSubMenuFilter(availableFilterDefinition.type) && - viewFilter.definition?.type !== availableFilterDefinition.type - ? viewFilter.definition?.type - : undefined, - }; -}; diff --git a/packages/twenty-front/src/modules/views/utils/mapViewFiltersToFilters.ts b/packages/twenty-front/src/modules/views/utils/mapViewFiltersToFilters.ts index f3a4fcd223ab..773815c7ca58 100644 --- a/packages/twenty-front/src/modules/views/utils/mapViewFiltersToFilters.ts +++ b/packages/twenty-front/src/modules/views/utils/mapViewFiltersToFilters.ts @@ -2,7 +2,6 @@ import { Filter } from '@/object-record/object-filter-dropdown/types/Filter'; import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition'; import { isDefined } from '~/utils/isDefined'; -import { getFilterDefinitionForViewFilter } from '@/views/utils/getFilterDefinitionForViewFilter'; import { ViewFilter } from '../types/ViewFilter'; export const mapViewFiltersToFilters = ( @@ -24,10 +23,7 @@ export const mapViewFiltersToFilters = ( value: viewFilter.value, displayValue: viewFilter.displayValue, operand: viewFilter.operand, - definition: getFilterDefinitionForViewFilter( - viewFilter, - availableFilterDefinition, - ), + definition: viewFilter.definition ?? availableFilterDefinition, }; }) .filter(isDefined); diff --git a/packages/twenty-front/src/modules/views/utils/view-filter-value/resolveFilterValue.ts b/packages/twenty-front/src/modules/views/utils/view-filter-value/resolveFilterValue.ts index 310666488f1b..34afbb46ad1a 100644 --- a/packages/twenty-front/src/modules/views/utils/view-filter-value/resolveFilterValue.ts +++ b/packages/twenty-front/src/modules/views/utils/view-filter-value/resolveFilterValue.ts @@ -1,5 +1,5 @@ import { Filter } from '@/object-record/object-filter-dropdown/types/Filter'; -import { FilterType } from '@/object-record/object-filter-dropdown/types/FilterType'; +import { FilterableFieldType } from '@/object-record/object-filter-dropdown/types/FilterableFieldType'; import { ViewFilterOperand } from '@/views/types/ViewFilterOperand'; import { resolveNumberViewFilterValue } from '@/views/utils/view-filter-value/resolveNumberViewFilterValue'; import { @@ -8,7 +8,7 @@ import { } from './resolveDateViewFilterValue'; type ResolvedFilterValue< - T extends FilterType, + T extends FilterableFieldType, O extends ViewFilterOperand, > = T extends 'DATE' | 'DATE_TIME' ? ResolvedDateViewFilterValue @@ -16,16 +16,16 @@ type ResolvedFilterValue< ? ReturnType : string; -type PartialFilter = Pick< - Filter, - 'value' -> & { +type PartialFilter< + T extends FilterableFieldType, + O extends ViewFilterOperand, +> = Pick & { definition: { type: T }; operand: O; }; export const resolveFilterValue = < - T extends FilterType, + T extends FilterableFieldType, O extends ViewFilterOperand, >( filter: PartialFilter, diff --git a/packages/twenty-front/src/pages/settings/data-model/SettingsObjectFieldEdit.tsx b/packages/twenty-front/src/pages/settings/data-model/SettingsObjectFieldEdit.tsx index dd11d6dbb845..1cb99f8451f8 100644 --- a/packages/twenty-front/src/pages/settings/data-model/SettingsObjectFieldEdit.tsx +++ b/packages/twenty-front/src/pages/settings/data-model/SettingsObjectFieldEdit.tsx @@ -30,7 +30,7 @@ import { SettingsDataModelFieldDescriptionForm } from '@/settings/data-model/fie import { SettingsDataModelFieldIconLabelForm } from '@/settings/data-model/fields/forms/components/SettingsDataModelFieldIconLabelForm'; import { SettingsDataModelFieldSettingsFormCard } from '@/settings/data-model/fields/forms/components/SettingsDataModelFieldSettingsFormCard'; import { settingsFieldFormSchema } from '@/settings/data-model/fields/forms/validation-schemas/settingsFieldFormSchema'; -import { SettingsSupportedFieldType } from '@/settings/data-model/types/SettingsSupportedFieldType'; +import { SettingsFieldType } from '@/settings/data-model/types/SettingsFieldType'; import { getSettingsPagePath } from '@/settings/utils/getSettingsPagePath'; import { AppPath } from '@/types/AppPath'; import { SettingsPath } from '@/types/SettingsPath'; @@ -42,9 +42,11 @@ import { Section } from '@/ui/layout/section/components/Section'; import { FieldMetadataType } from '~/generated-metadata/graphql'; import { isDefined } from '~/utils/isDefined'; +//TODO: fix this type type SettingsDataModelFieldEditFormValues = z.infer< ReturnType ->; +> & + any; const canPersistFieldMetadataItemUpdate = ( fieldMetadataItem: FieldMetadataItem, @@ -94,7 +96,7 @@ export const SettingsObjectFieldEdit = () => { resolver: zodResolver(settingsFieldFormSchema()), values: { icon: fieldMetadataItem?.icon ?? 'Icon', - type: fieldMetadataItem?.type as SettingsSupportedFieldType, + type: fieldMetadataItem?.type as SettingsFieldType, label: fieldMetadataItem?.label ?? '', description: fieldMetadataItem?.description, }, diff --git a/packages/twenty-front/src/pages/settings/data-model/SettingsObjectNewField/SettingsObjectNewFieldStep2.tsx b/packages/twenty-front/src/pages/settings/data-model/SettingsObjectNewField/SettingsObjectNewFieldStep2.tsx index 90a1e4d1020e..1fd3ca72b390 100644 --- a/packages/twenty-front/src/pages/settings/data-model/SettingsObjectNewField/SettingsObjectNewFieldStep2.tsx +++ b/packages/twenty-front/src/pages/settings/data-model/SettingsObjectNewField/SettingsObjectNewFieldStep2.tsx @@ -13,7 +13,7 @@ import { SettingsDataModelFieldIconLabelForm } from '@/settings/data-model/field import { SettingsDataModelFieldSettingsFormCard } from '@/settings/data-model/fields/forms/components/SettingsDataModelFieldSettingsFormCard'; import { SettingsDataModelFieldTypeSelect } from '@/settings/data-model/fields/forms/components/SettingsDataModelFieldTypeSelect'; import { settingsFieldFormSchema } from '@/settings/data-model/fields/forms/validation-schemas/settingsFieldFormSchema'; -import { SettingsSupportedFieldType } from '@/settings/data-model/types/SettingsSupportedFieldType'; +import { SettingsFieldType } from '@/settings/data-model/types/SettingsFieldType'; import { AppPath } from '@/types/AppPath'; import { SnackBarVariant } from '@/ui/feedback/snack-bar-manager/components/SnackBar'; import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar'; @@ -34,9 +34,11 @@ import { FieldMetadataType } from '~/generated-metadata/graphql'; import { isDefined } from '~/utils/isDefined'; import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; +// TODO: fix this type type SettingsDataModelNewFieldFormValues = z.infer< ReturnType ->; +> & + any; const StyledH1Title = styled(H1Title)` margin-bottom: 0; @@ -46,7 +48,7 @@ export const SettingsObjectNewFieldStep2 = () => { const navigate = useNavigate(); const { objectSlug = '' } = useParams(); const [searchParams] = useSearchParams(); - const fieldType = searchParams.get('fieldType') as SettingsSupportedFieldType; + const fieldType = searchParams.get('fieldType') as SettingsFieldType; const { enqueueSnackBar } = useSnackBar(); const [isConfigureStep, setIsConfigureStep] = useState(false); @@ -159,7 +161,7 @@ export const SettingsObjectNewFieldStep2 = () => { } }; - const excludedFieldTypes: SettingsSupportedFieldType[] = ( + const excludedFieldTypes: SettingsFieldType[] = ( [ FieldMetadataType.Link, FieldMetadataType.Numeric, @@ -226,7 +228,7 @@ export const SettingsObjectNewFieldStep2 = () => { setIsConfigureStep(true)} /> diff --git a/packages/twenty-front/src/pages/settings/data-model/hooks/useMapFieldMetadataItemToSettingsObjectDetailTableItem.ts b/packages/twenty-front/src/pages/settings/data-model/hooks/useMapFieldMetadataItemToSettingsObjectDetailTableItem.ts index 2a965c0195b5..d221be0b6ccc 100644 --- a/packages/twenty-front/src/pages/settings/data-model/hooks/useMapFieldMetadataItemToSettingsObjectDetailTableItem.ts +++ b/packages/twenty-front/src/pages/settings/data-model/hooks/useMapFieldMetadataItemToSettingsObjectDetailTableItem.ts @@ -1,8 +1,11 @@ import { useGetRelationMetadata } from '@/object-metadata/hooks/useGetRelationMetadata'; import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem'; import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; +import { FieldType } from '@/settings/data-model/types/FieldType'; +import { SettingsFieldType } from '@/settings/data-model/types/SettingsFieldType'; import { getFieldIdentifierType } from '@/settings/data-model/utils/getFieldIdentifierType'; import { getSettingsFieldTypeConfig } from '@/settings/data-model/utils/getSettingsFieldTypeConfig'; +import { isFieldTypeSupportedInSettings } from '@/settings/data-model/utils/isFieldTypeSupportedInSettings'; import { SettingsObjectDetailTableItem } from '~/pages/settings/data-model/types/SettingsObjectDetailTableItem'; import { getSettingsObjectFieldType } from '~/pages/settings/data-model/utils/getSettingsObjectFieldType'; @@ -29,13 +32,17 @@ export const useMapFieldMetadataItemToSettingsObjectDetailTableItem = ( objectMetadataItem, ); + const fieldMetadataType = fieldMetadataItem.type as FieldType; + return { fieldMetadataItem, fieldType: fieldType ?? '', dataType: - relationObjectMetadataItem?.labelPlural ?? - getSettingsFieldTypeConfig(fieldMetadataItem.type)?.label ?? - '', + (relationObjectMetadataItem?.labelPlural ?? + isFieldTypeSupportedInSettings(fieldMetadataType)) + ? getSettingsFieldTypeConfig(fieldMetadataType as SettingsFieldType) + ?.label + : '', label: fieldMetadataItem.label, identifierType: identifierType, objectMetadataItem, diff --git a/packages/twenty-front/src/types/ExcludeLiteral.ts b/packages/twenty-front/src/types/ExcludeLiteral.ts new file mode 100644 index 000000000000..897d995b7a91 --- /dev/null +++ b/packages/twenty-front/src/types/ExcludeLiteral.ts @@ -0,0 +1 @@ +export type ExcludeLiteral = T extends U ? never : T; diff --git a/packages/twenty-front/src/types/PickLiteral.ts b/packages/twenty-front/src/types/PickLiteral.ts new file mode 100644 index 000000000000..545378336485 --- /dev/null +++ b/packages/twenty-front/src/types/PickLiteral.ts @@ -0,0 +1 @@ +export type PickLiteral = U; diff --git a/packages/twenty-server/src/engine/metadata-modules/workspace-migration/factories/composite-column-action.factory.ts b/packages/twenty-server/src/engine/metadata-modules/workspace-migration/factories/composite-column-action.factory.ts index 9af3e89d4b04..41c133621e7e 100644 --- a/packages/twenty-server/src/engine/metadata-modules/workspace-migration/factories/composite-column-action.factory.ts +++ b/packages/twenty-server/src/engine/metadata-modules/workspace-migration/factories/composite-column-action.factory.ts @@ -18,6 +18,7 @@ import { WorkspaceMigrationExceptionCode, } from 'src/engine/metadata-modules/workspace-migration/workspace-migration.exception'; +// TODO: could we export this to GraphQL ? export type CompositeFieldMetadataType = | FieldMetadataType.ADDRESS | FieldMetadataType.CURRENCY From 33d5a57ea2283adbf8ea459bc14258c39ecef0b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Bosi?= <71827178+bosiraphael@users.noreply.github.com> Date: Tue, 8 Oct 2024 13:31:44 +0200 Subject: [PATCH 28/30] 6694 remove raw queries from connected account (#7101) Closes #6694 --------- Co-authored-by: Charles Bochet --- .../engine/core-modules/auth/auth.module.ts | 5 - .../auth/services/google-apis.service.ts | 34 +-- .../metadata-to-repository.mapping.ts | 2 - .../calendar-event-import-manager.module.ts | 2 - .../jobs/calendar-event-list-fetch.job.ts | 16 +- .../can-access-calendar-event.service.ts | 26 +- .../query-hooks/calendar-query-hook.module.ts | 6 +- .../email-alias-manager.module.ts | 9 +- .../services/email-alias-manager.service.ts | 21 +- .../google-api-refresh-access-token.module.ts | 9 +- .../services/refresh-access-token.service.ts | 20 +- .../connected-account.repository.ts | 240 ------------------ .../can-access-message-thread.service.ts | 27 +- .../messaging-query-hook.module.ts | 6 +- .../gmail/messaging-gmail-driver.module.ts | 8 +- .../jobs/messaging-message-list-fetch.job.ts | 32 +-- .../jobs/messaging-messages-import.job.ts | 16 +- .../messaging-messages-import.service.ts | 1 - ...eate-company-and-contact-after-sync.job.ts | 18 +- 19 files changed, 95 insertions(+), 403 deletions(-) delete mode 100644 packages/twenty-server/src/modules/connected-account/repositories/connected-account.repository.ts diff --git a/packages/twenty-server/src/engine/core-modules/auth/auth.module.ts b/packages/twenty-server/src/engine/core-modules/auth/auth.module.ts index 1560c7f97ced..d88f37a1446b 100644 --- a/packages/twenty-server/src/engine/core-modules/auth/auth.module.ts +++ b/packages/twenty-server/src/engine/core-modules/auth/auth.module.ts @@ -24,11 +24,9 @@ import { UserModule } from 'src/engine/core-modules/user/user.module'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { WorkspaceModule } from 'src/engine/core-modules/workspace/workspace.module'; import { DataSourceModule } from 'src/engine/metadata-modules/data-source/data-source.module'; -import { ObjectMetadataRepositoryModule } from 'src/engine/object-metadata-repository/object-metadata-repository.module'; import { WorkspaceDataSourceModule } from 'src/engine/workspace-datasource/workspace-datasource.module'; import { WorkspaceManagerModule } from 'src/engine/workspace-manager/workspace-manager.module'; import { ConnectedAccountModule } from 'src/modules/connected-account/connected-account.module'; -import { ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity'; import { AuthResolver } from './auth.resolver'; @@ -47,9 +45,6 @@ import { JwtAuthStrategy } from './strategies/jwt.auth.strategy'; [Workspace, User, AppToken, FeatureFlagEntity], 'core', ), - ObjectMetadataRepositoryModule.forFeature([ - ConnectedAccountWorkspaceEntity, - ]), HttpModule, TokenModule, UserWorkspaceModule, diff --git a/packages/twenty-server/src/engine/core-modules/auth/services/google-apis.service.ts b/packages/twenty-server/src/engine/core-modules/auth/services/google-apis.service.ts index b20072ed54f1..e140ecedd80d 100644 --- a/packages/twenty-server/src/engine/core-modules/auth/services/google-apis.service.ts +++ b/packages/twenty-server/src/engine/core-modules/auth/services/google-apis.service.ts @@ -7,7 +7,6 @@ import { EnvironmentService } from 'src/engine/core-modules/environment/environm import { InjectMessageQueue } from 'src/engine/core-modules/message-queue/decorators/message-queue.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; import { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service'; -import { InjectObjectMetadataRepository } from 'src/engine/object-metadata-repository/object-metadata-repository.decorator'; import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager'; import { CalendarEventListFetchJob, @@ -17,7 +16,6 @@ import { CalendarChannelVisibility, CalendarChannelWorkspaceEntity, } from 'src/modules/calendar/common/standard-objects/calendar-channel.workspace-entity'; -import { ConnectedAccountRepository } from 'src/modules/connected-account/repositories/connected-account.repository'; import { AccountsToReconnectService } from 'src/modules/connected-account/services/accounts-to-reconnect.service'; import { ConnectedAccountProvider, @@ -45,8 +43,6 @@ export class GoogleAPIsService { @InjectMessageQueue(MessageQueue.calendarQueue) private readonly calendarQueueService: MessageQueueService, private readonly environmentService: EnvironmentService, - @InjectObjectMetadataRepository(ConnectedAccountWorkspaceEntity) - private readonly connectedAccountRepository: ConnectedAccountRepository, private readonly accountsToReconnectService: AccountsToReconnectService, ) {} @@ -71,14 +67,17 @@ export class GoogleAPIsService { 'CALENDAR_PROVIDER_GOOGLE_ENABLED', ); - const connectedAccounts = - await this.connectedAccountRepository.getAllByHandleAndWorkspaceMemberId( - handle, - workspaceMemberId, + const connectedAccountRepository = + await this.twentyORMGlobalManager.getRepositoryForWorkspace( workspaceId, + 'connectedAccount', ); - const existingAccountId = connectedAccounts?.[0]?.id; + const connectedAccount = await connectedAccountRepository.findOne({ + where: { handle, accountOwnerId: workspaceMemberId }, + }); + + const existingAccountId = connectedAccount?.id; const newOrExistingConnectedAccountId = existingAccountId ?? v4(); const calendarChannelRepository = @@ -98,7 +97,7 @@ export class GoogleAPIsService { await workspaceDataSource.transaction(async (manager: EntityManager) => { if (!existingAccountId) { - await this.connectedAccountRepository.create( + await connectedAccountRepository.save( { id: newOrExistingConnectedAccountId, handle, @@ -107,7 +106,7 @@ export class GoogleAPIsService { refreshToken: input.refreshToken, accountOwnerId: workspaceMemberId, }, - workspaceId, + {}, manager, ); @@ -140,11 +139,14 @@ export class GoogleAPIsService { ); } } else { - await this.connectedAccountRepository.updateAccessTokenAndRefreshToken( - input.accessToken, - input.refreshToken, - newOrExistingConnectedAccountId, - workspaceId, + await connectedAccountRepository.update( + { + id: newOrExistingConnectedAccountId, + }, + { + accessToken: input.accessToken, + refreshToken: input.refreshToken, + }, manager, ); diff --git a/packages/twenty-server/src/engine/object-metadata-repository/metadata-to-repository.mapping.ts b/packages/twenty-server/src/engine/object-metadata-repository/metadata-to-repository.mapping.ts index b2053e44c814..6f0bc8dffe5e 100644 --- a/packages/twenty-server/src/engine/object-metadata-repository/metadata-to-repository.mapping.ts +++ b/packages/twenty-server/src/engine/object-metadata-repository/metadata-to-repository.mapping.ts @@ -1,5 +1,4 @@ import { BlocklistRepository } from 'src/modules/blocklist/repositories/blocklist.repository'; -import { ConnectedAccountRepository } from 'src/modules/connected-account/repositories/connected-account.repository'; import { AuditLogRepository } from 'src/modules/timeline/repositiories/audit-log.repository'; import { TimelineActivityRepository } from 'src/modules/timeline/repositiories/timeline-activity.repository'; import { WorkspaceMemberRepository } from 'src/modules/workspace-member/repositories/workspace-member.repository'; @@ -7,7 +6,6 @@ import { WorkspaceMemberRepository } from 'src/modules/workspace-member/reposito export const metadataToRepositoryMapping = { AuditLogWorkspaceEntity: AuditLogRepository, BlocklistWorkspaceEntity: BlocklistRepository, - ConnectedAccountWorkspaceEntity: ConnectedAccountRepository, TimelineActivityWorkspaceEntity: TimelineActivityRepository, WorkspaceMemberWorkspaceEntity: WorkspaceMemberRepository, }; diff --git a/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/calendar-event-import-manager.module.ts b/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/calendar-event-import-manager.module.ts index 0e472d465e9c..0385ae884422 100644 --- a/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/calendar-event-import-manager.module.ts +++ b/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/calendar-event-import-manager.module.ts @@ -25,13 +25,11 @@ import { CalendarCommonModule } from 'src/modules/calendar/common/calendar-commo import { CalendarChannelSyncStatusService } from 'src/modules/calendar/common/services/calendar-channel-sync-status.service'; import { ConnectedAccountModule } from 'src/modules/connected-account/connected-account.module'; import { RefreshAccessTokenManagerModule } from 'src/modules/connected-account/refresh-access-token-manager/refresh-access-token-manager.module'; -import { ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity'; import { WorkspaceMemberWorkspaceEntity } from 'src/modules/workspace-member/standard-objects/workspace-member.workspace-entity'; @Module({ imports: [ ObjectMetadataRepositoryModule.forFeature([ - ConnectedAccountWorkspaceEntity, BlocklistWorkspaceEntity, WorkspaceMemberWorkspaceEntity, ]), diff --git a/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/jobs/calendar-event-list-fetch.job.ts b/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/jobs/calendar-event-list-fetch.job.ts index 406e717021ac..1e28927e25b8 100644 --- a/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/jobs/calendar-event-list-fetch.job.ts +++ b/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/jobs/calendar-event-list-fetch.job.ts @@ -3,15 +3,12 @@ import { Scope } from '@nestjs/common'; import { Process } from 'src/engine/core-modules/message-queue/decorators/process.decorator'; import { Processor } from 'src/engine/core-modules/message-queue/decorators/processor.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; -import { InjectObjectMetadataRepository } from 'src/engine/object-metadata-repository/object-metadata-repository.decorator'; import { TwentyORMManager } from 'src/engine/twenty-orm/twenty-orm.manager'; import { CalendarEventsImportService } from 'src/modules/calendar/calendar-event-import-manager/services/calendar-events-import.service'; import { CalendarChannelSyncStage, CalendarChannelWorkspaceEntity, } from 'src/modules/calendar/common/standard-objects/calendar-channel.workspace-entity'; -import { ConnectedAccountRepository } from 'src/modules/connected-account/repositories/connected-account.repository'; -import { ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity'; import { isThrottled } from 'src/modules/connected-account/utils/is-throttled'; export type CalendarEventsImportJobData = { @@ -27,8 +24,6 @@ export class CalendarEventListFetchJob { constructor( private readonly twentyORMManager: TwentyORMManager, private readonly calendarEventsImportService: CalendarEventsImportService, - @InjectObjectMetadataRepository(ConnectedAccountWorkspaceEntity) - private readonly connectedAccountRepository: ConnectedAccountRepository, ) {} @Process(CalendarEventListFetchJob.name) @@ -47,6 +42,7 @@ export class CalendarEventListFetchJob { id: calendarChannelId, isSyncEnabled: true, }, + relations: ['connectedAccount'], }); if (!calendarChannel) { @@ -62,12 +58,6 @@ export class CalendarEventListFetchJob { return; } - const connectedAccount = - await this.connectedAccountRepository.getConnectedAccountOrThrow( - workspaceId, - calendarChannel.connectedAccountId, - ); - switch (calendarChannel.syncStage) { case CalendarChannelSyncStage.FULL_CALENDAR_EVENT_LIST_FETCH_PENDING: await calendarChannelRepository.update(calendarChannelId, { @@ -77,7 +67,7 @@ export class CalendarEventListFetchJob { await this.calendarEventsImportService.processCalendarEventsImport( calendarChannel, - connectedAccount, + calendarChannel.connectedAccount, workspaceId, ); break; @@ -85,7 +75,7 @@ export class CalendarEventListFetchJob { case CalendarChannelSyncStage.PARTIAL_CALENDAR_EVENT_LIST_FETCH_PENDING: await this.calendarEventsImportService.processCalendarEventsImport( calendarChannel, - connectedAccount, + calendarChannel.connectedAccount, workspaceId, ); break; diff --git a/packages/twenty-server/src/modules/calendar/common/query-hooks/calendar-event/services/can-access-calendar-event.service.ts b/packages/twenty-server/src/modules/calendar/common/query-hooks/calendar-event/services/can-access-calendar-event.service.ts index 041c3a648290..2e8810d1f7b1 100644 --- a/packages/twenty-server/src/modules/calendar/common/query-hooks/calendar-event/services/can-access-calendar-event.service.ts +++ b/packages/twenty-server/src/modules/calendar/common/query-hooks/calendar-event/services/can-access-calendar-event.service.ts @@ -1,12 +1,12 @@ import { ForbiddenException, Injectable } from '@nestjs/common'; import groupBy from 'lodash.groupby'; +import { Any } from 'typeorm'; import { InjectObjectMetadataRepository } from 'src/engine/object-metadata-repository/object-metadata-repository.decorator'; import { TwentyORMManager } from 'src/engine/twenty-orm/twenty-orm.manager'; import { CalendarChannelEventAssociationWorkspaceEntity } from 'src/modules/calendar/common/standard-objects/calendar-channel-event-association.workspace-entity'; import { CalendarChannelVisibility } from 'src/modules/calendar/common/standard-objects/calendar-channel.workspace-entity'; -import { ConnectedAccountRepository } from 'src/modules/connected-account/repositories/connected-account.repository'; import { ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity'; import { WorkspaceMemberRepository } from 'src/modules/workspace-member/repositories/workspace-member.repository'; import { WorkspaceMemberWorkspaceEntity } from 'src/modules/workspace-member/standard-objects/workspace-member.workspace-entity'; @@ -15,8 +15,6 @@ import { WorkspaceMemberWorkspaceEntity } from 'src/modules/workspace-member/sta export class CanAccessCalendarEventService { constructor( private readonly twentyORMManager: TwentyORMManager, - @InjectObjectMetadataRepository(ConnectedAccountWorkspaceEntity) - private readonly connectedAccountRepository: ConnectedAccountRepository, @InjectObjectMetadataRepository(WorkspaceMemberWorkspaceEntity) private readonly workspaceMemberService: WorkspaceMemberRepository, ) {} @@ -46,20 +44,20 @@ export class CanAccessCalendarEventService { const currentWorkspaceMember = await this.workspaceMemberService.getByIdOrFail(userId, workspaceId); - const calendarChannelsConnectedAccounts = - await this.connectedAccountRepository.getByIds( - calendarChannels.map((channel) => channel.connectedAccountId), - workspaceId, + const connectedAccountRepository = + await this.twentyORMManager.getRepository( + 'connectedAccount', ); - const calendarChannelsWorkspaceMemberIds = - calendarChannelsConnectedAccounts.map( - (connectedAccount) => connectedAccount.accountOwnerId, - ); + const connectedAccounts = await connectedAccountRepository.find({ + select: ['id'], + where: { + calendarChannels: Any(calendarChannels.map((channel) => channel.id)), + accountOwnerId: currentWorkspaceMember.id, + }, + }); - if ( - calendarChannelsWorkspaceMemberIds.includes(currentWorkspaceMember.id) - ) { + if (connectedAccounts.length > 0) { return; } diff --git a/packages/twenty-server/src/modules/calendar/common/query-hooks/calendar-query-hook.module.ts b/packages/twenty-server/src/modules/calendar/common/query-hooks/calendar-query-hook.module.ts index ff3d178c4a21..2c5a26b18c4f 100644 --- a/packages/twenty-server/src/modules/calendar/common/query-hooks/calendar-query-hook.module.ts +++ b/packages/twenty-server/src/modules/calendar/common/query-hooks/calendar-query-hook.module.ts @@ -4,15 +4,11 @@ import { ObjectMetadataRepositoryModule } from 'src/engine/object-metadata-repos import { CalendarEventFindManyPreQueryHook } from 'src/modules/calendar/common/query-hooks/calendar-event/calendar-event-find-many.pre-query.hook'; import { CalendarEventFindOnePreQueryHook } from 'src/modules/calendar/common/query-hooks/calendar-event/calendar-event-find-one.pre-query-hook'; import { CanAccessCalendarEventService } from 'src/modules/calendar/common/query-hooks/calendar-event/services/can-access-calendar-event.service'; -import { ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity'; import { WorkspaceMemberWorkspaceEntity } from 'src/modules/workspace-member/standard-objects/workspace-member.workspace-entity'; @Module({ imports: [ - ObjectMetadataRepositoryModule.forFeature([ - ConnectedAccountWorkspaceEntity, - WorkspaceMemberWorkspaceEntity, - ]), + ObjectMetadataRepositoryModule.forFeature([WorkspaceMemberWorkspaceEntity]), ], providers: [ CanAccessCalendarEventService, diff --git a/packages/twenty-server/src/modules/connected-account/email-alias-manager/email-alias-manager.module.ts b/packages/twenty-server/src/modules/connected-account/email-alias-manager/email-alias-manager.module.ts index e1678e3d7ab6..a634ff0feb2d 100644 --- a/packages/twenty-server/src/modules/connected-account/email-alias-manager/email-alias-manager.module.ts +++ b/packages/twenty-server/src/modules/connected-account/email-alias-manager/email-alias-manager.module.ts @@ -1,18 +1,11 @@ import { Module } from '@nestjs/common'; -import { ObjectMetadataRepositoryModule } from 'src/engine/object-metadata-repository/object-metadata-repository.module'; import { GoogleEmailAliasManagerService } from 'src/modules/connected-account/email-alias-manager/drivers/google/google-email-alias-manager.service'; import { EmailAliasManagerService } from 'src/modules/connected-account/email-alias-manager/services/email-alias-manager.service'; import { OAuth2ClientManagerModule } from 'src/modules/connected-account/oauth2-client-manager/oauth2-client-manager.module'; -import { ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity'; @Module({ - imports: [ - ObjectMetadataRepositoryModule.forFeature([ - ConnectedAccountWorkspaceEntity, - ]), - OAuth2ClientManagerModule, - ], + imports: [OAuth2ClientManagerModule], providers: [EmailAliasManagerService, GoogleEmailAliasManagerService], exports: [EmailAliasManagerService], }) diff --git a/packages/twenty-server/src/modules/connected-account/email-alias-manager/services/email-alias-manager.service.ts b/packages/twenty-server/src/modules/connected-account/email-alias-manager/services/email-alias-manager.service.ts index 50a855ba31a7..e4ec7e083960 100644 --- a/packages/twenty-server/src/modules/connected-account/email-alias-manager/services/email-alias-manager.service.ts +++ b/packages/twenty-server/src/modules/connected-account/email-alias-manager/services/email-alias-manager.service.ts @@ -1,21 +1,18 @@ import { Injectable } from '@nestjs/common'; -import { InjectObjectMetadataRepository } from 'src/engine/object-metadata-repository/object-metadata-repository.decorator'; +import { TwentyORMManager } from 'src/engine/twenty-orm/twenty-orm.manager'; import { GoogleEmailAliasManagerService } from 'src/modules/connected-account/email-alias-manager/drivers/google/google-email-alias-manager.service'; -import { ConnectedAccountRepository } from 'src/modules/connected-account/repositories/connected-account.repository'; import { ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity'; @Injectable() export class EmailAliasManagerService { constructor( - @InjectObjectMetadataRepository(ConnectedAccountWorkspaceEntity) - private readonly connectedAccountRepository: ConnectedAccountRepository, private readonly googleEmailAliasManagerService: GoogleEmailAliasManagerService, + private readonly twentyORMManager: TwentyORMManager, ) {} public async refreshHandleAliases( connectedAccount: ConnectedAccountWorkspaceEntity, - workspaceId: string, ) { let handleAliases: string[]; @@ -32,10 +29,16 @@ export class EmailAliasManagerService { ); } - await this.connectedAccountRepository.updateHandleAliases( - handleAliases, - connectedAccount.id, - workspaceId, + const connectedAccountRepository = + await this.twentyORMManager.getRepository( + 'connectedAccount', + ); + + await connectedAccountRepository.update( + { id: connectedAccount.id }, + { + handleAliases: handleAliases.join(','), // TODO: modify handleAliases to be of fieldmetadatatype array + }, ); } } diff --git a/packages/twenty-server/src/modules/connected-account/refresh-access-token-manager/drivers/google/google-api-refresh-access-token.module.ts b/packages/twenty-server/src/modules/connected-account/refresh-access-token-manager/drivers/google/google-api-refresh-access-token.module.ts index 14529ba0b745..5c8308ec7053 100644 --- a/packages/twenty-server/src/modules/connected-account/refresh-access-token-manager/drivers/google/google-api-refresh-access-token.module.ts +++ b/packages/twenty-server/src/modules/connected-account/refresh-access-token-manager/drivers/google/google-api-refresh-access-token.module.ts @@ -1,17 +1,10 @@ import { Module } from '@nestjs/common'; -import { ObjectMetadataRepositoryModule } from 'src/engine/object-metadata-repository/object-metadata-repository.module'; import { GoogleAPIRefreshAccessTokenService } from 'src/modules/connected-account/refresh-access-token-manager/drivers/google/services/google-api-refresh-access-token.service'; -import { ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity'; import { MessagingCommonModule } from 'src/modules/messaging/common/messaging-common.module'; @Module({ - imports: [ - ObjectMetadataRepositoryModule.forFeature([ - ConnectedAccountWorkspaceEntity, - ]), - MessagingCommonModule, - ], + imports: [MessagingCommonModule], providers: [GoogleAPIRefreshAccessTokenService], exports: [GoogleAPIRefreshAccessTokenService], }) diff --git a/packages/twenty-server/src/modules/connected-account/refresh-access-token-manager/services/refresh-access-token.service.ts b/packages/twenty-server/src/modules/connected-account/refresh-access-token-manager/services/refresh-access-token.service.ts index 3326cd4ba8a1..853401356842 100644 --- a/packages/twenty-server/src/modules/connected-account/refresh-access-token-manager/services/refresh-access-token.service.ts +++ b/packages/twenty-server/src/modules/connected-account/refresh-access-token-manager/services/refresh-access-token.service.ts @@ -1,20 +1,18 @@ import { Injectable } from '@nestjs/common'; -import { InjectObjectMetadataRepository } from 'src/engine/object-metadata-repository/object-metadata-repository.decorator'; +import { TwentyORMManager } from 'src/engine/twenty-orm/twenty-orm.manager'; import { GoogleAPIRefreshAccessTokenService } from 'src/modules/connected-account/refresh-access-token-manager/drivers/google/services/google-api-refresh-access-token.service'; import { RefreshAccessTokenException, RefreshAccessTokenExceptionCode, } from 'src/modules/connected-account/refresh-access-token-manager/exceptions/refresh-access-token.exception'; -import { ConnectedAccountRepository } from 'src/modules/connected-account/repositories/connected-account.repository'; import { ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity'; @Injectable() export class RefreshAccessTokenService { constructor( private readonly googleAPIRefreshAccessTokenService: GoogleAPIRefreshAccessTokenService, - @InjectObjectMetadataRepository(ConnectedAccountWorkspaceEntity) - private readonly connectedAccountRepository: ConnectedAccountRepository, + private readonly twentyORMManager: TwentyORMManager, ) {} async refreshAndSaveAccessToken( @@ -44,10 +42,16 @@ export class RefreshAccessTokenService { ); } - await this.connectedAccountRepository.updateAccessToken( - accessToken, - connectedAccount.id, - workspaceId, + const connectedAccountRepository = + await this.twentyORMManager.getRepository( + 'connectedAccount', + ); + + await connectedAccountRepository.update( + { id: connectedAccount.id }, + { + accessToken, + }, ); return accessToken; diff --git a/packages/twenty-server/src/modules/connected-account/repositories/connected-account.repository.ts b/packages/twenty-server/src/modules/connected-account/repositories/connected-account.repository.ts deleted file mode 100644 index 7be9d5d654fa..000000000000 --- a/packages/twenty-server/src/modules/connected-account/repositories/connected-account.repository.ts +++ /dev/null @@ -1,240 +0,0 @@ -import { Injectable, NotFoundException } from '@nestjs/common'; - -import { EntityManager } from 'typeorm'; - -import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service'; -import { ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity'; - -@Injectable() -export class ConnectedAccountRepository { - constructor( - private readonly workspaceDataSourceService: WorkspaceDataSourceService, - ) {} - - public async getAll( - workspaceId: string, - transactionManager?: EntityManager, - ): Promise { - const dataSourceSchema = - this.workspaceDataSourceService.getSchemaName(workspaceId); - - return await this.workspaceDataSourceService.executeRawQuery( - `SELECT * FROM ${dataSourceSchema}."connectedAccount" WHERE "provider" = 'google'`, - [], - workspaceId, - transactionManager, - ); - } - - public async getByIds( - connectedAccountIds: string[], - workspaceId: string, - transactionManager?: EntityManager, - ): Promise { - const dataSourceSchema = - this.workspaceDataSourceService.getSchemaName(workspaceId); - - return await this.workspaceDataSourceService.executeRawQuery( - `SELECT * FROM ${dataSourceSchema}."connectedAccount" WHERE "id" = ANY($1)`, - [connectedAccountIds], - workspaceId, - transactionManager, - ); - } - - public async getAllByWorkspaceMemberId( - workspaceMemberId: string, - workspaceId: string, - transactionManager?: EntityManager, - ): Promise { - const dataSourceSchema = - this.workspaceDataSourceService.getSchemaName(workspaceId); - - const connectedAccounts = - await this.workspaceDataSourceService.executeRawQuery( - `SELECT * FROM ${dataSourceSchema}."connectedAccount" WHERE "accountOwnerId" = $1`, - [workspaceMemberId], - workspaceId, - transactionManager, - ); - - return connectedAccounts; - } - - public async getAllByHandleAndWorkspaceMemberId( - handle: string, - workspaceMemberId: string, - workspaceId: string, - transactionManager?: EntityManager, - ): Promise { - const dataSourceSchema = - this.workspaceDataSourceService.getSchemaName(workspaceId); - - const connectedAccounts = - await this.workspaceDataSourceService.executeRawQuery( - `SELECT * FROM ${dataSourceSchema}."connectedAccount" WHERE "handle" = $1 AND "accountOwnerId" = $2 LIMIT 1`, - [handle, workspaceMemberId], - workspaceId, - transactionManager, - ); - - return connectedAccounts; - } - - public async create( - connectedAccount: Pick< - ConnectedAccountWorkspaceEntity, - | 'id' - | 'handle' - | 'provider' - | 'accessToken' - | 'refreshToken' - | 'accountOwnerId' - >, - workspaceId: string, - transactionManager?: EntityManager, - ): Promise { - const dataSourceSchema = - this.workspaceDataSourceService.getSchemaName(workspaceId); - - return await this.workspaceDataSourceService.executeRawQuery( - `INSERT INTO ${dataSourceSchema}."connectedAccount" ("id", "handle", "provider", "accessToken", "refreshToken", "accountOwnerId") VALUES ($1, $2, $3, $4, $5, $6)`, - [ - connectedAccount.id, - connectedAccount.handle, - connectedAccount.provider, - connectedAccount.accessToken, - connectedAccount.refreshToken, - connectedAccount.accountOwnerId, - ], - workspaceId, - transactionManager, - ); - } - - public async updateAccessTokenAndRefreshToken( - accessToken: string, - refreshToken: string, - connectedAccountId: string, - workspaceId: string, - transactionManager?: EntityManager, - ) { - const dataSourceSchema = - this.workspaceDataSourceService.getSchemaName(workspaceId); - - await this.workspaceDataSourceService.executeRawQuery( - `UPDATE ${dataSourceSchema}."connectedAccount" SET "accessToken" = $1, "refreshToken" = $2, "authFailedAt" = NULL WHERE "id" = $3`, - [accessToken, refreshToken, connectedAccountId], - workspaceId, - transactionManager, - ); - } - - public async getById( - connectedAccountId: string, - workspaceId: string, - transactionManager?: EntityManager, - ): Promise { - const dataSourceSchema = - this.workspaceDataSourceService.getSchemaName(workspaceId); - - const connectedAccounts = - await this.workspaceDataSourceService.executeRawQuery( - `SELECT * FROM ${dataSourceSchema}."connectedAccount" WHERE "id" = $1 LIMIT 1`, - [connectedAccountId], - workspaceId, - transactionManager, - ); - - return connectedAccounts[0]; - } - - public async getByIdOrFail( - connectedAccountId: string, - workspaceId: string, - transactionManager?: EntityManager, - ): Promise { - const connectedAccount = await this.getById( - connectedAccountId, - workspaceId, - transactionManager, - ); - - if (!connectedAccount) { - throw new NotFoundException( - `Connected account with id ${connectedAccountId} not found in workspace ${workspaceId}`, - ); - } - - return connectedAccount; - } - - public async updateAccessToken( - accessToken: string, - connectedAccountId: string, - workspaceId: string, - transactionManager?: EntityManager, - ) { - const dataSourceSchema = - this.workspaceDataSourceService.getSchemaName(workspaceId); - - await this.workspaceDataSourceService.executeRawQuery( - `UPDATE ${dataSourceSchema}."connectedAccount" SET "accessToken" = $1, "authFailedAt" = NULL WHERE "id" = $2`, - [accessToken, connectedAccountId], - workspaceId, - transactionManager, - ); - } - - public async updateAuthFailedAt( - connectedAccountId: string, - workspaceId: string, - transactionManager?: EntityManager, - ) { - const dataSourceSchema = - this.workspaceDataSourceService.getSchemaName(workspaceId); - - await this.workspaceDataSourceService.executeRawQuery( - `UPDATE ${dataSourceSchema}."connectedAccount" SET "authFailedAt" = NOW() WHERE "id" = $1`, - [connectedAccountId], - workspaceId, - transactionManager, - ); - } - - public async getConnectedAccountOrThrow( - workspaceId: string, - connectedAccountId: string, - ): Promise { - const connectedAccount = await this.getById( - connectedAccountId, - workspaceId, - ); - - if (!connectedAccount) { - throw new Error( - `Connected account ${connectedAccountId} not found in workspace ${workspaceId}`, - ); - } - - return connectedAccount; - } - - public async updateHandleAliases( - handleAliases: string[], - connectedAccountId: string, - workspaceId: string, - transactionManager?: EntityManager, - ) { - const dataSourceSchema = - this.workspaceDataSourceService.getSchemaName(workspaceId); - - await this.workspaceDataSourceService.executeRawQuery( - `UPDATE ${dataSourceSchema}."connectedAccount" SET "handleAliases" = $1 WHERE "id" = $2`, - // TODO: modify handleAliases to be of fieldmetadatatype array - [handleAliases.join(','), connectedAccountId], - workspaceId, - transactionManager, - ); - } -} diff --git a/packages/twenty-server/src/modules/messaging/common/query-hooks/message/can-access-message-thread.service.ts b/packages/twenty-server/src/modules/messaging/common/query-hooks/message/can-access-message-thread.service.ts index 44141f3dde92..0e30225843ed 100644 --- a/packages/twenty-server/src/modules/messaging/common/query-hooks/message/can-access-message-thread.service.ts +++ b/packages/twenty-server/src/modules/messaging/common/query-hooks/message/can-access-message-thread.service.ts @@ -5,17 +5,13 @@ import { Any } from 'typeorm'; import { InjectObjectMetadataRepository } from 'src/engine/object-metadata-repository/object-metadata-repository.decorator'; import { TwentyORMManager } from 'src/engine/twenty-orm/twenty-orm.manager'; -import { ConnectedAccountRepository } from 'src/modules/connected-account/repositories/connected-account.repository'; import { ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity'; import { MessageChannelWorkspaceEntity } from 'src/modules/messaging/common/standard-objects/message-channel.workspace-entity'; import { WorkspaceMemberRepository } from 'src/modules/workspace-member/repositories/workspace-member.repository'; import { WorkspaceMemberWorkspaceEntity } from 'src/modules/workspace-member/standard-objects/workspace-member.workspace-entity'; -import { isDefined } from 'src/utils/is-defined'; export class CanAccessMessageThreadService { constructor( - @InjectObjectMetadataRepository(ConnectedAccountWorkspaceEntity) - private readonly connectedAccountRepository: ConnectedAccountRepository, @InjectObjectMetadataRepository(WorkspaceMemberWorkspaceEntity) private readonly workspaceMemberRepository: WorkspaceMemberRepository, private readonly twentyORMManager: TwentyORMManager, @@ -31,6 +27,7 @@ export class CanAccessMessageThreadService { 'messageChannel', ); const messageChannels = await messageChannelRepository.find({ + select: ['id', 'visibility'], where: { id: Any( messageChannelMessageAssociations.map( @@ -52,20 +49,20 @@ export class CanAccessMessageThreadService { const currentWorkspaceMember = await this.workspaceMemberRepository.getByIdOrFail(userId, workspaceId); - const messageChannelsConnectedAccounts = - await this.connectedAccountRepository.getByIds( - messageChannels - .map((channel) => channel.connectedAccountId) - .filter(isDefined), - workspaceId, + const connectedAccountRepository = + await this.twentyORMManager.getRepository( + 'connectedAccount', ); - const messageChannelsWorkspaceMemberIds = - messageChannelsConnectedAccounts.map( - (connectedAccount) => connectedAccount.accountOwnerId, - ); + const connectedAccounts = await connectedAccountRepository.find({ + select: ['id'], + where: { + messageChannels: Any(messageChannels.map((channel) => channel.id)), + accountOwnerId: currentWorkspaceMember.id, + }, + }); - if (messageChannelsWorkspaceMemberIds.includes(currentWorkspaceMember.id)) { + if (connectedAccounts.length > 0) { return; } diff --git a/packages/twenty-server/src/modules/messaging/common/query-hooks/messaging-query-hook.module.ts b/packages/twenty-server/src/modules/messaging/common/query-hooks/messaging-query-hook.module.ts index 9c84640768af..1222865f6962 100644 --- a/packages/twenty-server/src/modules/messaging/common/query-hooks/messaging-query-hook.module.ts +++ b/packages/twenty-server/src/modules/messaging/common/query-hooks/messaging-query-hook.module.ts @@ -1,7 +1,6 @@ import { Module } from '@nestjs/common'; import { ObjectMetadataRepositoryModule } from 'src/engine/object-metadata-repository/object-metadata-repository.module'; -import { ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity'; import { CanAccessMessageThreadService } from 'src/modules/messaging/common/query-hooks/message/can-access-message-thread.service'; import { MessageFindManyPreQueryHook } from 'src/modules/messaging/common/query-hooks/message/message-find-many.pre-query.hook'; import { MessageFindOnePreQueryHook } from 'src/modules/messaging/common/query-hooks/message/message-find-one.pre-query-hook'; @@ -9,10 +8,7 @@ import { WorkspaceMemberWorkspaceEntity } from 'src/modules/workspace-member/sta @Module({ imports: [ - ObjectMetadataRepositoryModule.forFeature([ - ConnectedAccountWorkspaceEntity, - WorkspaceMemberWorkspaceEntity, - ]), + ObjectMetadataRepositoryModule.forFeature([WorkspaceMemberWorkspaceEntity]), ], providers: [ CanAccessMessageThreadService, diff --git a/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/gmail/messaging-gmail-driver.module.ts b/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/gmail/messaging-gmail-driver.module.ts index 3fc555a87c96..fec4a7693ff4 100644 --- a/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/gmail/messaging-gmail-driver.module.ts +++ b/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/gmail/messaging-gmail-driver.module.ts @@ -2,15 +2,14 @@ import { HttpModule } from '@nestjs/axios'; import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; +import { EnvironmentModule } from 'src/engine/core-modules/environment/environment.module'; import { FeatureFlagEntity } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; import { FeatureFlagModule } from 'src/engine/core-modules/feature-flag/feature-flag.module'; -import { EnvironmentModule } from 'src/engine/core-modules/environment/environment.module'; import { ObjectMetadataRepositoryModule } from 'src/engine/object-metadata-repository/object-metadata-repository.module'; import { WorkspaceDataSourceModule } from 'src/engine/workspace-datasource/workspace-datasource.module'; import { BlocklistWorkspaceEntity } from 'src/modules/blocklist/standard-objects/blocklist.workspace-entity'; import { EmailAliasManagerModule } from 'src/modules/connected-account/email-alias-manager/email-alias-manager.module'; import { OAuth2ClientManagerModule } from 'src/modules/connected-account/oauth2-client-manager/oauth2-client-manager.module'; -import { ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity'; import { MessagingCommonModule } from 'src/modules/messaging/common/messaging-common.module'; import { GmailClientProvider } from 'src/modules/messaging/message-import-manager/drivers/gmail/providers/gmail-client.provider'; import { GmailFetchByBatchService } from 'src/modules/messaging/message-import-manager/drivers/gmail/services/gmail-fetch-by-batch.service'; @@ -26,10 +25,7 @@ import { MessageParticipantManagerModule } from 'src/modules/messaging/message-p baseURL: 'https://www.googleapis.com/batch/gmail/v1', }), EnvironmentModule, - ObjectMetadataRepositoryModule.forFeature([ - ConnectedAccountWorkspaceEntity, - BlocklistWorkspaceEntity, - ]), + ObjectMetadataRepositoryModule.forFeature([BlocklistWorkspaceEntity]), MessagingCommonModule, TypeOrmModule.forFeature([FeatureFlagEntity], 'core'), OAuth2ClientManagerModule, diff --git a/packages/twenty-server/src/modules/messaging/message-import-manager/jobs/messaging-message-list-fetch.job.ts b/packages/twenty-server/src/modules/messaging/message-import-manager/jobs/messaging-message-list-fetch.job.ts index cc66a1ff5dbc..67761ec5d780 100644 --- a/packages/twenty-server/src/modules/messaging/message-import-manager/jobs/messaging-message-list-fetch.job.ts +++ b/packages/twenty-server/src/modules/messaging/message-import-manager/jobs/messaging-message-list-fetch.job.ts @@ -3,16 +3,12 @@ import { Logger, Scope } from '@nestjs/common'; import { Process } from 'src/engine/core-modules/message-queue/decorators/process.decorator'; import { Processor } from 'src/engine/core-modules/message-queue/decorators/processor.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; -import { InjectObjectMetadataRepository } from 'src/engine/object-metadata-repository/object-metadata-repository.decorator'; import { TwentyORMManager } from 'src/engine/twenty-orm/twenty-orm.manager'; -import { ConnectedAccountRepository } from 'src/modules/connected-account/repositories/connected-account.repository'; -import { ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity'; import { isThrottled } from 'src/modules/connected-account/utils/is-throttled'; import { MessageChannelSyncStage, MessageChannelWorkspaceEntity, } from 'src/modules/messaging/common/standard-objects/message-channel.workspace-entity'; -import { MessageImportExceptionHandlerService } from 'src/modules/messaging/message-import-manager/services/message-import-exception-handler.service'; import { MessagingFullMessageListFetchService } from 'src/modules/messaging/message-import-manager/services/messaging-full-message-list-fetch.service'; import { MessagingPartialMessageListFetchService } from 'src/modules/messaging/message-import-manager/services/messaging-partial-message-list-fetch.service'; import { MessagingTelemetryService } from 'src/modules/messaging/monitoring/services/messaging-telemetry.service'; @@ -32,11 +28,8 @@ export class MessagingMessageListFetchJob { constructor( private readonly messagingFullMessageListFetchService: MessagingFullMessageListFetchService, private readonly messagingPartialMessageListFetchService: MessagingPartialMessageListFetchService, - @InjectObjectMetadataRepository(ConnectedAccountWorkspaceEntity) - private readonly connectedAccountRepository: ConnectedAccountRepository, private readonly messagingTelemetryService: MessagingTelemetryService, private readonly twentyORMManager: TwentyORMManager, - private readonly messageImportErrorHandlerService: MessageImportExceptionHandlerService, ) {} @Process(MessagingMessageListFetchJob.name) @@ -60,6 +53,7 @@ export class MessagingMessageListFetchJob { where: { id: messageChannelId, }, + relations: ['connectedAccount'], }); if (!messageChannel) { @@ -72,16 +66,6 @@ export class MessagingMessageListFetchJob { return; } - const connectedAccount = - await this.connectedAccountRepository.getByIdOrFail( - messageChannel.connectedAccountId, - workspaceId, - ); - - if (!messageChannel?.isSyncEnabled) { - return; - } - if ( isThrottled( messageChannel.syncStageStartedAt, @@ -100,20 +84,20 @@ export class MessagingMessageListFetchJob { await this.messagingTelemetryService.track({ eventName: 'partial_message_list_fetch.started', workspaceId, - connectedAccountId: connectedAccount.id, + connectedAccountId: messageChannel.connectedAccount.id, messageChannelId: messageChannel.id, }); await this.messagingPartialMessageListFetchService.processMessageListFetch( messageChannel, - connectedAccount, + messageChannel.connectedAccount, workspaceId, ); await this.messagingTelemetryService.track({ eventName: 'partial_message_list_fetch.completed', workspaceId, - connectedAccountId: connectedAccount.id, + connectedAccountId: messageChannel.connectedAccount.id, messageChannelId: messageChannel.id, }); @@ -121,26 +105,26 @@ export class MessagingMessageListFetchJob { case MessageChannelSyncStage.FULL_MESSAGE_LIST_FETCH_PENDING: this.logger.log( - `Fetching full message list for workspace ${workspaceId} and account ${connectedAccount.id}`, + `Fetching full message list for workspace ${workspaceId} and account ${messageChannel.connectedAccount.id}`, ); await this.messagingTelemetryService.track({ eventName: 'full_message_list_fetch.started', workspaceId, - connectedAccountId: connectedAccount.id, + connectedAccountId: messageChannel.connectedAccount.id, messageChannelId: messageChannel.id, }); await this.messagingFullMessageListFetchService.processMessageListFetch( messageChannel, - connectedAccount, + messageChannel.connectedAccount, workspaceId, ); await this.messagingTelemetryService.track({ eventName: 'full_message_list_fetch.completed', workspaceId, - connectedAccountId: connectedAccount.id, + connectedAccountId: messageChannel.connectedAccount.id, messageChannelId: messageChannel.id, }); diff --git a/packages/twenty-server/src/modules/messaging/message-import-manager/jobs/messaging-messages-import.job.ts b/packages/twenty-server/src/modules/messaging/message-import-manager/jobs/messaging-messages-import.job.ts index a22e1b26a769..f062400d19bb 100644 --- a/packages/twenty-server/src/modules/messaging/message-import-manager/jobs/messaging-messages-import.job.ts +++ b/packages/twenty-server/src/modules/messaging/message-import-manager/jobs/messaging-messages-import.job.ts @@ -3,16 +3,12 @@ import { Scope } from '@nestjs/common'; import { Process } from 'src/engine/core-modules/message-queue/decorators/process.decorator'; import { Processor } from 'src/engine/core-modules/message-queue/decorators/processor.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; -import { InjectObjectMetadataRepository } from 'src/engine/object-metadata-repository/object-metadata-repository.decorator'; import { TwentyORMManager } from 'src/engine/twenty-orm/twenty-orm.manager'; -import { ConnectedAccountRepository } from 'src/modules/connected-account/repositories/connected-account.repository'; -import { ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity'; import { isThrottled } from 'src/modules/connected-account/utils/is-throttled'; import { MessageChannelSyncStage, MessageChannelWorkspaceEntity, } from 'src/modules/messaging/common/standard-objects/message-channel.workspace-entity'; -import { MessageImportExceptionHandlerService } from 'src/modules/messaging/message-import-manager/services/message-import-exception-handler.service'; import { MessagingMessagesImportService } from 'src/modules/messaging/message-import-manager/services/messaging-messages-import.service'; import { MessagingTelemetryService } from 'src/modules/messaging/monitoring/services/messaging-telemetry.service'; @@ -27,12 +23,9 @@ export type MessagingMessagesImportJobData = { }) export class MessagingMessagesImportJob { constructor( - @InjectObjectMetadataRepository(ConnectedAccountWorkspaceEntity) - private readonly connectedAccountRepository: ConnectedAccountRepository, private readonly messagingMessagesImportService: MessagingMessagesImportService, private readonly messagingTelemetryService: MessagingTelemetryService, private readonly twentyORMManager: TwentyORMManager, - private readonly messageImportErrorHandlerService: MessageImportExceptionHandlerService, ) {} @Process(MessagingMessagesImportJob.name) @@ -56,6 +49,7 @@ export class MessagingMessagesImportJob { where: { id: messageChannelId, }, + relations: ['connectedAccount'], }); if (!messageChannel) { @@ -68,12 +62,6 @@ export class MessagingMessagesImportJob { return; } - const connectedAccount = - await this.connectedAccountRepository.getConnectedAccountOrThrow( - workspaceId, - messageChannel.connectedAccountId, - ); - if (!messageChannel?.isSyncEnabled) { return; } @@ -96,7 +84,7 @@ export class MessagingMessagesImportJob { await this.messagingMessagesImportService.processMessageBatchImport( messageChannel, - connectedAccount, + messageChannel.connectedAccount, workspaceId, ); diff --git a/packages/twenty-server/src/modules/messaging/message-import-manager/services/messaging-messages-import.service.ts b/packages/twenty-server/src/modules/messaging/message-import-manager/services/messaging-messages-import.service.ts index 6017441003ae..09c59c55758b 100644 --- a/packages/twenty-server/src/modules/messaging/message-import-manager/services/messaging-messages-import.service.ts +++ b/packages/twenty-server/src/modules/messaging/message-import-manager/services/messaging-messages-import.service.ts @@ -110,7 +110,6 @@ export class MessagingMessagesImportService { await this.emailAliasManagerService.refreshHandleAliases( connectedAccount, - workspaceId, ); messageIdsToFetch = await this.cacheStorage.setPop( diff --git a/packages/twenty-server/src/modules/messaging/message-participant-manager/jobs/messaging-create-company-and-contact-after-sync.job.ts b/packages/twenty-server/src/modules/messaging/message-participant-manager/jobs/messaging-create-company-and-contact-after-sync.job.ts index 8529ebaef6f4..ee556d672d96 100644 --- a/packages/twenty-server/src/modules/messaging/message-participant-manager/jobs/messaging-create-company-and-contact-after-sync.job.ts +++ b/packages/twenty-server/src/modules/messaging/message-participant-manager/jobs/messaging-create-company-and-contact-after-sync.job.ts @@ -6,9 +6,7 @@ import { Process } from 'src/engine/core-modules/message-queue/decorators/proces import { Processor } from 'src/engine/core-modules/message-queue/decorators/processor.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; import { FieldActorSource } from 'src/engine/metadata-modules/field-metadata/composite-types/actor.composite-type'; -import { InjectObjectMetadataRepository } from 'src/engine/object-metadata-repository/object-metadata-repository.decorator'; import { TwentyORMManager } from 'src/engine/twenty-orm/twenty-orm.manager'; -import { ConnectedAccountRepository } from 'src/modules/connected-account/repositories/connected-account.repository'; import { ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity'; import { CreateCompanyAndContactService } from 'src/modules/contact-creation-manager/services/create-company-and-contact.service'; import { MessageDirection } from 'src/modules/messaging/common/enums/message-direction.enum'; @@ -30,8 +28,6 @@ export class MessagingCreateCompanyAndContactAfterSyncJob { ); constructor( private readonly createCompanyAndContactService: CreateCompanyAndContactService, - @InjectObjectMetadataRepository(ConnectedAccountWorkspaceEntity) - private readonly connectedAccountRepository: ConnectedAccountRepository, private readonly twentyORMManager: TwentyORMManager, ) {} @@ -63,10 +59,16 @@ export class MessagingCreateCompanyAndContactAfterSyncJob { return; } - const connectedAccount = await this.connectedAccountRepository.getById( - connectedAccountId, - workspaceId, - ); + const connectedAccountRepository = + await this.twentyORMManager.getRepository( + 'connectedAccount', + ); + + const connectedAccount = await connectedAccountRepository.findOne({ + where: { + id: connectedAccountId, + }, + }); if (!connectedAccount) { throw new Error( From 66ec70f776017f81fcabb7fd13c2dd31e78a11c9 Mon Sep 17 00:00:00 2001 From: Thomas Trompette Date: Tue, 8 Oct 2024 13:36:20 +0200 Subject: [PATCH 29/30] Fix hover advanced settings (#7488) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Capture d’écran 2024-10-08 à 12 12 59 --- .../navigation-drawer/components/NavigationDrawerSection.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/twenty-front/src/modules/ui/navigation/navigation-drawer/components/NavigationDrawerSection.tsx b/packages/twenty-front/src/modules/ui/navigation/navigation-drawer/components/NavigationDrawerSection.tsx index bea1d0f8e46a..c1fd938476a8 100644 --- a/packages/twenty-front/src/modules/ui/navigation/navigation-drawer/components/NavigationDrawerSection.tsx +++ b/packages/twenty-front/src/modules/ui/navigation/navigation-drawer/components/NavigationDrawerSection.tsx @@ -4,6 +4,7 @@ const StyledSection = styled.div` display: flex; flex-direction: column; gap: ${({ theme }) => theme.betweenSiblingsGap}; + width: 100%; `; export { StyledSection as NavigationDrawerSection }; From e042711f34de599a4696dbd60747ef419cc8c27e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Bosi?= <71827178+bosiraphael@users.noreply.github.com> Date: Tue, 8 Oct 2024 13:44:16 +0200 Subject: [PATCH 30/30] Fixes on messaging and calendar (#7485) Fix syncedAt no longer been set on message sync. Fix calendar data model: - Add `syncedAt` to `CalendarChannelWorkspaceEntity` - Move `recurringEventExternalId` from `CalendarEventWorkspaceEntity` to `CalendarChannelEventAssociationWorkspaceEntity` since the id is relative to one channel Fix save queries on calendar sync after regression. --- .../generated/mock-metadata-query-result.ts | 22 -------- .../calendar-channel-event-association.ts | 2 + .../workspace/calendar-events.ts | 2 - .../constants/standard-field-ids.ts | 3 +- .../services/calendar-save-events.service.ts | 55 ++++++++++++++++--- .../calendar-channel-sync-status.service.ts | 1 + ...nnel-event-association.workspace-entity.ts | 24 +++++--- .../calendar-channel.workspace-entity.ts | 10 ++++ .../calendar-event.workspace-entity.ts | 9 --- .../calendar/common/types/calendar-event.ts | 2 + .../message-channel-sync-status.service.ts | 1 + 11 files changed, 82 insertions(+), 49 deletions(-) diff --git a/packages/twenty-front/src/testing/mock-data/generated/mock-metadata-query-result.ts b/packages/twenty-front/src/testing/mock-data/generated/mock-metadata-query-result.ts index 6832293415c8..86428fa72919 100644 --- a/packages/twenty-front/src/testing/mock-data/generated/mock-metadata-query-result.ts +++ b/packages/twenty-front/src/testing/mock-data/generated/mock-metadata-query-result.ts @@ -9080,28 +9080,6 @@ export const mockedStandardObjectMetadataQueryResult: ObjectMetadataItemsQuery = relationDefinition: null, }, }, - { - __typename: 'fieldEdge', - node: { - __typename: 'field', - settings: {}, - id: '567c7852-6dc5-4c6e-826d-e4b253614e60', - type: 'TEXT', - name: 'recurringEventExternalId', - label: 'Recurring Event ID', - description: 'Recurring Event ID', - icon: 'IconHistory', - isCustom: false, - isActive: true, - isSystem: false, - isNullable: false, - createdAt: '2024-09-25T13:45:32.757Z', - updatedAt: '2024-09-25T13:45:32.757Z', - defaultValue: "''", - options: null, - relationDefinition: null, - }, - }, { __typename: 'fieldEdge', node: { diff --git a/packages/twenty-server/src/database/typeorm-seeds/workspace/calendar-channel-event-association.ts b/packages/twenty-server/src/database/typeorm-seeds/workspace/calendar-channel-event-association.ts index 59530a45edd3..7e20a6ab5a33 100644 --- a/packages/twenty-server/src/database/typeorm-seeds/workspace/calendar-channel-event-association.ts +++ b/packages/twenty-server/src/database/typeorm-seeds/workspace/calendar-channel-event-association.ts @@ -14,6 +14,7 @@ export const seedCalendarChannelEventAssociations = async ( 'calendarChannelId', 'calendarEventId', 'eventExternalId', + 'recurringEventExternalId', ]) .orIgnore() .values([ @@ -22,6 +23,7 @@ export const seedCalendarChannelEventAssociations = async ( calendarChannelId: '59efdefe-a40f-4faf-bb9f-c6f9945b8203', calendarEventId: '86083141-1c0e-494c-a1b6-85b1c6fefaa5', eventExternalId: 'exampleExternalId', + recurringEventExternalId: 'exampleRecurringExternalId', }, ]) .execute(); diff --git a/packages/twenty-server/src/database/typeorm-seeds/workspace/calendar-events.ts b/packages/twenty-server/src/database/typeorm-seeds/workspace/calendar-events.ts index 7624c290cb7d..6969213f7689 100644 --- a/packages/twenty-server/src/database/typeorm-seeds/workspace/calendar-events.ts +++ b/packages/twenty-server/src/database/typeorm-seeds/workspace/calendar-events.ts @@ -24,7 +24,6 @@ export const seedCalendarEvents = async ( 'conferenceSolution', 'conferenceLinkPrimaryLinkLabel', 'conferenceLinkPrimaryLinkUrl', - 'recurringEventExternalId', ]) .orIgnore() .values([ @@ -43,7 +42,6 @@ export const seedCalendarEvents = async ( conferenceSolution: 'Zoom', conferenceLinkPrimaryLinkLabel: 'https://zoom.us/j/1234567890', conferenceLinkPrimaryLinkUrl: 'https://zoom.us/j/1234567890', - recurringEventExternalId: 'recurring1', }, ]) .execute(); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids.ts index 6243016b8f73..b2f3e87ae6d7 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids.ts @@ -63,6 +63,7 @@ export const CALENDAR_CHANNEL_EVENT_ASSOCIATION_STANDARD_FIELD_IDS = { calendarChannel: '20202020-93ee-4da4-8d58-0282c4a9cb7d', calendarEvent: '20202020-5aa5-437e-bb86-f42d457783e3', eventExternalId: '20202020-9ec8-48bb-b279-21d0734a75a1', + recurringEventExternalId: '20202020-c58f-4c69-9bf8-9518fa31aa50', }; export const CALENDAR_CHANNEL_STANDARD_FIELD_IDS = { @@ -78,6 +79,7 @@ export const CALENDAR_CHANNEL_STANDARD_FIELD_IDS = { syncStatus: '20202020-7116-41da-8b4b-035975c4eb6a', syncStage: '20202020-6246-42e6-b5cd-003bd921782c', syncStageStartedAt: '20202020-a934-46f1-a8e7-9568b1e3a53e', + syncedAt: '20202020-2ff5-4f70-953a-3d0d36357576', }; export const CALENDAR_EVENT_PARTICIPANT_STANDARD_FIELD_IDS = { @@ -103,7 +105,6 @@ export const CALENDAR_EVENT_STANDARD_FIELD_IDS = { iCalUID: '20202020-f24b-45f4-b6a3-d2f9fcb98714', conferenceSolution: '20202020-1c3f-4b5a-b526-5411a82179eb', conferenceLink: '20202020-35da-43ef-9ca0-e936e9dc237b', - recurringEventExternalId: '20202020-4b96-43d0-8156-4c7a9717635c', calendarChannelEventAssociations: '20202020-bdf8-4572-a2cc-ecbb6bcc3a02', calendarEventParticipants: '20202020-e07e-4ccb-88f5-6f3d00458eec', }; diff --git a/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/services/calendar-save-events.service.ts b/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/services/calendar-save-events.service.ts index 8c71c73f1fc8..7552722e02cc 100644 --- a/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/services/calendar-save-events.service.ts +++ b/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/services/calendar-save-events.service.ts @@ -7,12 +7,10 @@ import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queu import { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service'; import { FieldActorSource } from 'src/engine/metadata-modules/field-metadata/composite-types/actor.composite-type'; import { TwentyORMManager } from 'src/engine/twenty-orm/twenty-orm.manager'; -import { WorkspaceEventEmitter } from 'src/engine/workspace-event-emitter/workspace-event-emitter'; import { injectIdsInCalendarEvents } from 'src/modules/calendar/calendar-event-import-manager/utils/inject-ids-in-calendar-events.util'; import { CalendarEventParticipantService } from 'src/modules/calendar/calendar-event-participant-manager/services/calendar-event-participant.service'; import { CalendarChannelEventAssociationWorkspaceEntity } from 'src/modules/calendar/common/standard-objects/calendar-channel-event-association.workspace-entity'; import { CalendarChannelWorkspaceEntity } from 'src/modules/calendar/common/standard-objects/calendar-channel.workspace-entity'; -import { CalendarEventParticipantWorkspaceEntity } from 'src/modules/calendar/common/standard-objects/calendar-event-participant.workspace-entity'; import { CalendarEventWorkspaceEntity } from 'src/modules/calendar/common/standard-objects/calendar-event.workspace-entity'; import { CalendarEventWithParticipants } from 'src/modules/calendar/common/types/calendar-event'; import { ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity'; @@ -28,7 +26,6 @@ export class CalendarSaveEventsService { private readonly calendarEventParticipantService: CalendarEventParticipantService, @InjectMessageQueue(MessageQueue.contactCreationQueue) private readonly messageQueueService: MessageQueueService, - private readonly workspaceEventEmitter: WorkspaceEventEmitter, ) {} public async saveCalendarEventsAndEnqueueContactCreationJob( @@ -103,6 +100,7 @@ export class CalendarSaveEventsService { calendarEventId: calendarEvent.id, eventExternalId: calendarEvent.externalId, calendarChannelId: calendarChannel.id, + recurringEventExternalId: calendarEvent.recurringEventExternalId, })); const participantsToSave = eventsToSave.flatMap( @@ -113,16 +111,57 @@ export class CalendarSaveEventsService { (event) => event.participants, ); - const savedCalendarEventParticipantsToEmit: CalendarEventParticipantWorkspaceEntity[] = - []; - const workspaceDataSource = await this.twentyORMManager.getDatasource(); await workspaceDataSource?.transaction(async (transactionManager) => { - await calendarEventRepository.save(eventsToSave, {}, transactionManager); + await calendarEventRepository.save( + eventsToSave.map( + (calendarEvent) => + ({ + id: calendarEvent.id, + iCalUID: calendarEvent.iCalUID, + title: calendarEvent.title, + description: calendarEvent.description, + startsAt: calendarEvent.startsAt, + endsAt: calendarEvent.endsAt, + location: calendarEvent.location, + isFullDay: calendarEvent.isFullDay, + isCanceled: calendarEvent.isCanceled, + conferenceSolution: calendarEvent.conferenceSolution, + conferenceLink: { + primaryLinkLabel: calendarEvent.conferenceLinkLabel, + primaryLinkUrl: calendarEvent.conferenceLinkUrl, + }, + externalCreatedAt: calendarEvent.externalCreatedAt, + externalUpdatedAt: calendarEvent.externalUpdatedAt, + }) satisfies DeepPartial, + ), + {}, + transactionManager, + ); await calendarEventRepository.save( - eventsToUpdate, + eventsToUpdate.map( + (calendarEvent) => + ({ + id: calendarEvent.id, + iCalUID: calendarEvent.iCalUID, + title: calendarEvent.title, + description: calendarEvent.description, + startsAt: calendarEvent.startsAt, + endsAt: calendarEvent.endsAt, + location: calendarEvent.location, + isFullDay: calendarEvent.isFullDay, + isCanceled: calendarEvent.isCanceled, + conferenceSolution: calendarEvent.conferenceSolution, + conferenceLink: { + primaryLinkLabel: calendarEvent.conferenceLinkLabel, + primaryLinkUrl: calendarEvent.conferenceLinkUrl, + }, + externalCreatedAt: calendarEvent.externalCreatedAt, + externalUpdatedAt: calendarEvent.externalUpdatedAt, + }) satisfies DeepPartial, + ), {}, transactionManager, ); diff --git a/packages/twenty-server/src/modules/calendar/common/services/calendar-channel-sync-status.service.ts b/packages/twenty-server/src/modules/calendar/common/services/calendar-channel-sync-status.service.ts index 4940c1db01eb..c0fe5278f898 100644 --- a/packages/twenty-server/src/modules/calendar/common/services/calendar-channel-sync-status.service.ts +++ b/packages/twenty-server/src/modules/calendar/common/services/calendar-channel-sync-status.service.ts @@ -171,6 +171,7 @@ export class CalendarChannelSyncStatusService { syncStatus: CalendarChannelSyncStatus.ACTIVE, throttleFailureCount: 0, syncStageStartedAt: null, + syncedAt: new Date().toISOString(), }); await this.schedulePartialCalendarEventListFetch(calendarChannelIds); diff --git a/packages/twenty-server/src/modules/calendar/common/standard-objects/calendar-channel-event-association.workspace-entity.ts b/packages/twenty-server/src/modules/calendar/common/standard-objects/calendar-channel-event-association.workspace-entity.ts index f1475da3b012..ee74a697eed8 100644 --- a/packages/twenty-server/src/modules/calendar/common/standard-objects/calendar-channel-event-association.workspace-entity.ts +++ b/packages/twenty-server/src/modules/calendar/common/standard-objects/calendar-channel-event-association.workspace-entity.ts @@ -1,16 +1,16 @@ import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; -import { CALENDAR_CHANNEL_EVENT_ASSOCIATION_STANDARD_FIELD_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids'; -import { STANDARD_OBJECT_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids'; -import { WorkspaceEntity } from 'src/engine/twenty-orm/decorators/workspace-entity.decorator'; -import { WorkspaceIsSystem } from 'src/engine/twenty-orm/decorators/workspace-is-system.decorator'; -import { WorkspaceIsNotAuditLogged } from 'src/engine/twenty-orm/decorators/workspace-is-not-audit-logged.decorator'; -import { WorkspaceRelation } from 'src/engine/twenty-orm/decorators/workspace-relation.decorator'; import { RelationMetadataType } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.entity'; -import { WorkspaceField } from 'src/engine/twenty-orm/decorators/workspace-field.decorator'; import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity'; +import { WorkspaceEntity } from 'src/engine/twenty-orm/decorators/workspace-entity.decorator'; +import { WorkspaceField } from 'src/engine/twenty-orm/decorators/workspace-field.decorator'; +import { WorkspaceIsNotAuditLogged } from 'src/engine/twenty-orm/decorators/workspace-is-not-audit-logged.decorator'; +import { WorkspaceIsSystem } from 'src/engine/twenty-orm/decorators/workspace-is-system.decorator'; import { WorkspaceJoinColumn } from 'src/engine/twenty-orm/decorators/workspace-join-column.decorator'; +import { WorkspaceRelation } from 'src/engine/twenty-orm/decorators/workspace-relation.decorator'; +import { CALENDAR_CHANNEL_EVENT_ASSOCIATION_STANDARD_FIELD_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids'; +import { STANDARD_OBJECT_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids'; import { CalendarChannelWorkspaceEntity } from 'src/modules/calendar/common/standard-objects/calendar-channel.workspace-entity'; import { CalendarEventWorkspaceEntity } from 'src/modules/calendar/common/standard-objects/calendar-event.workspace-entity'; @@ -35,6 +35,16 @@ export class CalendarChannelEventAssociationWorkspaceEntity extends BaseWorkspac }) eventExternalId: string; + @WorkspaceField({ + standardId: + CALENDAR_CHANNEL_EVENT_ASSOCIATION_STANDARD_FIELD_IDS.recurringEventExternalId, + type: FieldMetadataType.TEXT, + label: 'Recurring Event ID', + description: 'Recurring Event ID', + icon: 'IconHistory', + }) + recurringEventExternalId: string; + @WorkspaceRelation({ standardId: CALENDAR_CHANNEL_EVENT_ASSOCIATION_STANDARD_FIELD_IDS.calendarChannel, diff --git a/packages/twenty-server/src/modules/calendar/common/standard-objects/calendar-channel.workspace-entity.ts b/packages/twenty-server/src/modules/calendar/common/standard-objects/calendar-channel.workspace-entity.ts index b6bb2b803af7..fca6a0b01369 100644 --- a/packages/twenty-server/src/modules/calendar/common/standard-objects/calendar-channel.workspace-entity.ts +++ b/packages/twenty-server/src/modules/calendar/common/standard-objects/calendar-channel.workspace-entity.ts @@ -270,6 +270,16 @@ export class CalendarChannelWorkspaceEntity extends BaseWorkspaceEntity { }) syncCursor: string; + @WorkspaceField({ + standardId: CALENDAR_CHANNEL_STANDARD_FIELD_IDS.syncedAt, + type: FieldMetadataType.DATE_TIME, + label: 'Last sync date', + description: 'Last sync date', + icon: 'IconHistory', + }) + @WorkspaceIsNullable() + syncedAt: string | null; + @WorkspaceField({ standardId: CALENDAR_CHANNEL_STANDARD_FIELD_IDS.syncStageStartedAt, type: FieldMetadataType.DATE_TIME, diff --git a/packages/twenty-server/src/modules/calendar/common/standard-objects/calendar-event.workspace-entity.ts b/packages/twenty-server/src/modules/calendar/common/standard-objects/calendar-event.workspace-entity.ts index 55ede657ae96..4e4bbbf8615b 100644 --- a/packages/twenty-server/src/modules/calendar/common/standard-objects/calendar-event.workspace-entity.ts +++ b/packages/twenty-server/src/modules/calendar/common/standard-objects/calendar-event.workspace-entity.ts @@ -145,15 +145,6 @@ export class CalendarEventWorkspaceEntity extends BaseWorkspaceEntity { @WorkspaceIsNullable() conferenceLink: LinksMetadata; - @WorkspaceField({ - standardId: CALENDAR_EVENT_STANDARD_FIELD_IDS.recurringEventExternalId, - type: FieldMetadataType.TEXT, - label: 'Recurring Event ID', - description: 'Recurring Event ID', - icon: 'IconHistory', - }) - recurringEventExternalId: string; - @WorkspaceRelation({ standardId: CALENDAR_EVENT_STANDARD_FIELD_IDS.calendarChannelEventAssociations, diff --git a/packages/twenty-server/src/modules/calendar/common/types/calendar-event.ts b/packages/twenty-server/src/modules/calendar/common/types/calendar-event.ts index ae817cc3fae7..50517314f4c3 100644 --- a/packages/twenty-server/src/modules/calendar/common/types/calendar-event.ts +++ b/packages/twenty-server/src/modules/calendar/common/types/calendar-event.ts @@ -36,6 +36,7 @@ export type CalendarEventParticipantWithCalendarEventId = export type CalendarEventWithParticipants = CalendarEvent & { externalId: string; + recurringEventExternalId?: string; participants: CalendarEventParticipant[]; status: string; }; @@ -43,6 +44,7 @@ export type CalendarEventWithParticipants = CalendarEvent & { export type CalendarEventWithParticipantsAndCalendarEventId = CalendarEvent & { id: string; externalId: string; + recurringEventExternalId?: string; participants: CalendarEventParticipantWithCalendarEventId[]; status: string; }; diff --git a/packages/twenty-server/src/modules/messaging/common/services/message-channel-sync-status.service.ts b/packages/twenty-server/src/modules/messaging/common/services/message-channel-sync-status.service.ts index 35affc12d9a7..970290c35841 100644 --- a/packages/twenty-server/src/modules/messaging/common/services/message-channel-sync-status.service.ts +++ b/packages/twenty-server/src/modules/messaging/common/services/message-channel-sync-status.service.ts @@ -146,6 +146,7 @@ export class MessageChannelSyncStatusService { syncStage: MessageChannelSyncStage.PARTIAL_MESSAGE_LIST_FETCH_PENDING, throttleFailureCount: 0, syncStageStartedAt: null, + syncedAt: new Date().toISOString(), }); }